`

保障服务的持续高可用、高性能及负载均衡

阅读更多

保障服务的持续高可用、高性能及负载均衡 项目主页

 

高可用: 服务多副本
高性能: 超时限制
负载均衡: 环形队列

已经实现的功能:
1. HTTP调用方式的搜索服务
2. REDIS访问

一句话说明白这个项目的原理:

后端有多个一模一样的搜索,还有多个一模一样的REDIS,中间层的业务逻辑不直接调用搜索和REDIS,而是通过这个组件来调用

 

 

在WEB项目中的使用方法

 

1. 编译依赖:

    git clone https://github.com/ysc/high-availability.git
    cd high-availability
    mvn install

2. 在 pom.xml 中指定以下依赖:

    <dependency>
        <groupId>org.apdplat.service</groupId>
        <artifactId>high-availability</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

3. 在 src/main/resources 目录下新建目录 conf, 然后在 conf 目录下新建文件 conf.txt, 加入如下配置项:

    #search api depends on these servers
    search.api.server.urls=http://192.168.0.100:8080/search.jsp, http://192.168.0.101:8080/search.jsp
    #timeout config to guarantee response time
    search.api.timeout.seconds=1
    #whether output status to log in every unavailable urls valid process
    status.log.enabled=true
    #unavailable schedule initial delay seconds
    unavailable.schedule.initial.delay.seconds=60
    #unavailable schedule period seconds
    unavailable.schedule.period.seconds=60
    #redis servers
    redis.servers=192.168.0.102:6379:b01cbe1209a545a7cdb, 192.168.0.103:6379:b01cbe1209a545a7cdb

    redis.pool.blockWhenExhausted=false
    redis.pool.jmxEnabled=false
    redis.pool.lifo=true
    redis.pool.maxIdle=500
    redis.pool.maxTotal=500
    redis.pool.maxWaitMillis=500
    redis.pool.minEvictableIdleTimeMillis=1800000
    redis.pool.minIdle=0
    redis.pool.numTestsPerEvictionRun=3
    redis.pool.softMinEvictableIdleTimeMillis=1800000
    redis.pool.testOnBorrow=true
    redis.pool.testWhileIdle=true
    redis.pool.timeBetweenEvictionRunsMillis=-1
    redis.pool.readTimeoutMillis=2000

4. 在 web.xml 中配置一个监听器:

    <listener>
        <listener-class>org.apdplat.data.visualization.container.HighAvailabilityListener</listener-class>
    </listener>

5. 监听器 HighAvailabilityListener.java 类的代码如下:

    public class HighAvailabilityListener  implements ServletContextListener {
        private static final Logger LOGGER = LoggerFactory.getLogger(HighAvailabilityListener.class);

        @Override
        public void contextInitialized(ServletContextEvent sce) {
            String conf = sce.getServletContext().getRealPath("/WEB-INF/classes/conf/");
            LOGGER.info("启动搜索服务, 监控配置目录: {}", conf);
            ConfWatcher.startWatch(conf);
            sce.getServletContext().setAttribute("SearchAPI", new SearchAPIImpl());
        }

        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            LOGGER.info("停止搜索服务");
            SearchAPI searchAPI = (SearchAPI)sce.getServletContext().getAttribute("SearchAPI");
            if(searchAPI != null){
                searchAPI.close();
            }
            LOGGER.info("停止监控配置目录");
            ConfWatcher.stopWatch();
        }
    }

6. 在 jsp 中调用搜索服务:

    SearchAPI searchAPI = (SearchAPI) application.getAttribute("SearchAPI");
    if(searchAPI == null) {
        out.println("搜索服务未启动");
        return;
    }
    String keyword = request.getParameter("kw") == null ? "CCTV-1" : request.getParameter("kw");
    int topN = 5;
    try{
        topN = Integer.parseInt(request.getParameter("topN"));
    }catch (Exception e){
        //
    }
    String result = null;
    long start = System.currentTimeMillis();
    result = searchAPI.search(keyword, topN);
    String cost = Utils.getTimeDes(System.currentTimeMillis()-start);
    // 如果想知道搜索服务的状态
    String status = searchAPI.getStatus().replace("\n", "<br/>").replace("\t", "&nbsp; &nbsp; &nbsp; &nbsp; ");

7. 获取REDIS连接:

    String DETECT_KEY = "redis_ha_detector";

    Jedis jedis = null;
    try{
        jedis = JedisAPI.getInstance().getJedis();
        // 如果所有REDIS服务都不可用, 则返回null
        if(jedis != null) {
            jedis.set(DETECT_KEY, String.valueOf(System.currentTimeMillis()));
            System.out.println(jedis.get(DETECT_KEY));
            System.out.println("REDIS服务状态:\n" + JedisAPI.getInstance().getStatus());
        }
    }finally {
        if(jedis != null){
            // 返回连接用完后必须要关闭, 调用close方法
            jedis.close();
        }
    }    

 

 

在非WEB项目中的使用方法

 

1. 编译依赖:

    git clone https://github.com/ysc/high-availability.git
    cd high-availability
    mvn install

2. 在 pom.xml 中指定以下依赖:

    <dependency>
        <groupId>org.apdplat.service</groupId>
        <artifactId>high-availability</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

3. 新建目录 conf, 然后在 conf 目录下新建文件 conf.txt, 加入如下配置项:

    #search api depends on these servers
    search.api.server.urls=http://192.168.0.100:8080/search.jsp, http://192.168.0.101:8080/search.jsp
    #timeout config to guarantee response time
    search.api.timeout.seconds=1
    #whether output status to log in every unavailable urls valid process
    status.log.enabled=true
    #unavailable schedule initial delay seconds
    unavailable.schedule.initial.delay.seconds=60
    #unavailable schedule period seconds
    unavailable.schedule.period.seconds=60
    #redis servers
    redis.servers=192.168.0.102:6379:b01cbe1209a545a7cdb, 192.168.0.103:6379:b01cbe1209a545a7cdb

    redis.pool.blockWhenExhausted=false
    redis.pool.jmxEnabled=false
    redis.pool.lifo=true
    redis.pool.maxIdle=500
    redis.pool.maxTotal=500
    redis.pool.maxWaitMillis=500
    redis.pool.minEvictableIdleTimeMillis=1800000
    redis.pool.minIdle=0
    redis.pool.numTestsPerEvictionRun=3
    redis.pool.softMinEvictableIdleTimeMillis=1800000
    redis.pool.testOnBorrow=true
    redis.pool.testWhileIdle=true
    redis.pool.timeBetweenEvictionRunsMillis=-1
    redis.pool.readTimeoutMillis=2000

4. 将conf目录加入classpath:

    java -cp conf:xxx-1.0-SNAPSHOT-jar-with-dependencies.jar 

5. 启动搜索服务并监控配置目录的代码如下:

    Path conf = Paths.get(ConfWatcher.class.getResource("/conf/").getPath());
    LOGGER.info("启动搜索服务, 监控配置目录: {}", conf);
    ConfWatcher.startWatch(conf);
    SearchAPI searchAPI = new SearchAPIImpl();

6. 调用搜索服务:

    String keyword = "CCTV-1";
    int topN = 5;

    String result = null;
    long start = System.currentTimeMillis();
    result = searchAPI.search(keyword, topN);
    String cost = Utils.getTimeDes(System.currentTimeMillis()-start);

    // 如果想知道搜索服务的状态
    String status = searchAPI.getStatus();

7. 获取REDIS连接:

    String DETECT_KEY = "redis_ha_detector";

    Jedis jedis = null;
    try{
        jedis = JedisAPI.getInstance().getJedis();
        // 如果所有REDIS服务都不可用, 则返回null
        if(jedis != null) {
            jedis.set(DETECT_KEY, String.valueOf(System.currentTimeMillis()));
            System.out.println(jedis.get(DETECT_KEY));
            System.out.println("REDIS服务状态:\n" + JedisAPI.getInstance().getStatus());
        }
    }finally {
        if(jedis != null){
            // 返回连接用完后必须要关闭, 调用close方法
            jedis.close();
        }
    }

 

 

目录结构

 

.
├── README.md
├── pom.xml
└── src
    └── main
        ├── java
        │   └── org
        │       └── apdplat
        │           └── service
        │               ├── api
        │               │   ├── JedisAPI.java
        │               │   └── SearchAPI.java
        │               ├── configration
        │               │   ├── ConfManager.java
        │               │   ├── ConfTools.java
        │               │   └── ConfWatcher.java
        │               ├── impl
        │               │   └── SearchAPIImpl.java
        │               └── utils
        │                   └── TimeUtils.java
        └── resources
            └── conf
                ├── conf.production.txt
                └── conf.txt

12 directories, 11 files

 

 

 

 

1
3
分享到:
评论
2 楼 yangshangchuan 2017-01-27  
herman_liu76 写道
核心的东西没有呀?
集群选择策略,环型队列的结构与算法,为何不用一致性HASH?


这里的场景不需要使用Consistent hashing.
1 楼 herman_liu76 2017-01-25  
核心的东西没有呀?
集群选择策略,环型队列的结构与算法,为何不用一致性HASH?

相关推荐

    打造高性能负载均衡方案.docx

    综上,阿里云的高性能负载均衡方案通过LVS和Tengine的组合,实现了高可用、可扩展的流量分发,满足了大规模分布式系统的负载均衡需求,并通过持续优化克服了早期模式的局限性,提升了整体系统的性能和可靠性。

    高可用之ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试-java源码.zip

    8. **最佳实践**:在实施高可用性和负载均衡时,应遵循一些最佳实践,例如定期备份数据,监控系统性能,合理规划硬件资源,以及使用适当的网络拓扑结构。 9. **安全性**:在配置ActiveMQ集群时,安全措施也非常重要...

    实用负载均衡技术:网站性能优化攻略

    5. 使用负载均衡器:利用负载均衡设备或服务可以智能地管理请求流量,自动处理故障转移,并提供监控和管理功能,便于维护和扩展网站服务。 在进行网站性能优化时,还需要注意以下几个方面: 1. 性能测试:在实际...

    导致内部负载均衡器间歇性丢包或负载不均衡的常见因素-Bing1

    在IT领域,尤其是在云服务和网络架构中,负载均衡器是一个关键组件,它负责分散流入的网络流量到多个后端服务器,以确保高可用性和性能。然而,有时可能会遇到内部负载均衡器出现间歇性丢包或负载不均衡的问题。以下...

    HP服务器负载均衡,实现多网卡均衡负载

    HP服务器负载均衡技术,尤其是针对多网卡的均衡负载,是一项关键的IT基础设施优化策略,旨在提高网络性能、增强容错能力和确保数据流的高效分配。以下是对HP服务器双网卡绑定过程及其重要性的深入解析。 ### HP...

    深信服应用交付AD 服务器负载均衡 解决方案.pdf

    在IT领域,服务器负载均衡是确保高可用性和性能的关键技术,尤其在大型企业或高流量网站中。深信服科技的应用交付AD(Application Delivery)解决方案旨在通过智能分配网络流量,提高服务器效率,降低单一服务器过载...

    L4+L7 负载均衡 Keepalived+LVS+nginx搭建nginx高可用集群

    本文将详细介绍如何利用Keepalived、LVS与nginx这三种工具来构建一个高性能的负载均衡系统。 #### 二、关键技术点 1. **Nginx**: - **简介**: Nginx是一款广泛使用的开源反向代理服务器及HTTP服务器,以其高稳定...

    Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    总的来说,Nginx的反向代理和负载均衡、Redis的session共享以及Keepalived的高可用性方案,共同构成了一个强大且可靠的Web服务架构,为企业提供了稳定的服务保障。对于开发者和运维人员来说,理解和掌握这些技术对于...

    Linux服务器下多网卡负载均衡的研究 (1)

    负载均衡技术是现代网络环境中提高服务质量和可用性的重要手段,尤其对于依赖服务器的企业来说至关重要。在Linux操作系统中,一种实现负载均衡的技术是bonding,它允许多块网卡绑定成一个逻辑接口,共同分担网络流量...

    负载均衡软件LVS手册

    ### 负载均衡软件LVS手册:构建高性能网络服务 #### 一、引言 在当前信息时代背景下,随着互联网技术的飞速发展以及网络服务需求的不断增长,企业和组织面临着巨大的挑战:如何构建一个既能够高效处理大量数据流量...

    深信服上网行为及负载均衡技术方案 (2).docx

    2. 高可用性:通过负载均衡,确保即使单个服务器出现故障,服务仍能持续,提高系统的整体可用性。 3. 性能优化:通过负载均衡,可以分散请求,减少单个服务器的压力,提升响应速度。 4. 安全增强:可以将安全检查和...

    服务器负载均衡解决方案.doc

    - 同时支持多种应用的负载均衡,确保所有服务的高性能。 - 动态监控各服务器健康状况,保障服务的连续性。 - 支持在线维护操作,提升服务的灵活性和可扩展性。 - 加强安全性措施,保护服务免受攻击。 **解决...

    F5负载均衡实施方案.rar

    在IT行业中,F5负载均衡器是一款广泛应用的网络设备,用于优化网络性能、提高可用性和扩展服务容量。本文将深入探讨F5负载均衡的实施方案,包括其原理、配置步骤、优势以及常见应用场景。 F5负载均衡是通过智能分配...

    服务器负载均衡解决方案[参照].pdf

    2. 应用级别的负载均衡:针对运行不同应用的服务器,负载均衡可以确保每种服务的服务器负载均匀分布,提升整体性能。即使某服务的服务器出现故障,负载均衡器会自动将请求转发至其他健康的服务器,保证服务的连续性...

    负载均衡器简介

    总的来说,负载均衡器是网络基础设施的关键组件,它们通过智能流量管理和故障恢复机制,确保了网络服务的高可用性、高性能和用户满意度。随着技术的进步,负载均衡器的功能将更加完善,更好地适应不断变化的网络环境...

    高可用架构 第1卷高可用架构 第1卷-高可用架构社区

    2. **负载均衡**:负载均衡器是实现高可用的重要工具,它可以将请求分发到多个服务器,避免单一节点过载,同时也能在服务器故障时快速切换,保证服务不间断。 3. **分布式系统**:高可用架构常常采用分布式系统设计...

Global site tag (gtag.js) - Google Analytics