high-availability

服务持续高性能运行均衡工具
授权协议 Apache
开发语言 Java
所属分类 服务器软件、 服务发现/注册和协调
软件类型 开源软件
地区 国产
投 递 者 澹台锐
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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

高可用: 服务多副本 

高性能: 超时限制 

负载均衡: 环形队列 

已经实现的功能: 

  • 1. HTTP调用方式的搜索服务 

  • 2. REDIS访问 

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

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

在WEB项目中的使用方法

1. 编译依赖:    

git clone http://git.oschina.net/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 http://git.oschina.net/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();
        }
}
  • 微服务治理 高可用 HA (High Availability) 的一些理解 1、简介 一般来说,公司要保证4个9的高可用目标,99.99%,意味着一年的停机时间是 0.876 小时 高可用的目的是通过设计减少系统的不可用时间 目前解决高可用的两个核心要点就是冗余和故障转移 高可用的核心是冗余,也就是备份,挂了之后,backup 可以立马顶上 另外,人工干预会导致故障恢复时间变成,因此系统的高可用

  • 转自: 1.http://baike.baidu.com/view/2850255.htm 2.https://en.wikipedia.org/wiki/High_availability 1. “高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。 计算机的高可用性 计算机系统的 可靠性用平均无故障时间(MTTF)来度量

  • 一、准备工作: 1、准备Centos7.9的环境,ISO可以到一下链接下载: http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Everything-2009.iso 2、配置桥接网卡,使得虚拟机可以连接互联网 [root@node65 ~]# cat /etc/redhat-release CentOS L

  • 序 本文主要研究一下flink JobManager的High Availability 配置 flink-conf.yaml high-availability: zookeeper high-availability.zookeeper.quorum: zookeeper:2181 high-availability.zookeeper.path.root: /flink high-avail

 相关资料
  • 高可用性 (HA)可以在Verticles deployed时启动,当vert.x 的实例突然死了,从集群重新部署另外的vert.x 实例。 若要启用高可用性运行verticle,只是追加-ha开关: vertx run my-verticle.js -ha 当启用高可用性,无需添加-cluster。 有关高可用性功能和配置的高可用性和故障转移(High Availability and Fail

  • 互联网企业应用核心系统的高可用性保护了关键数据的完整性 并维持了应用连续运行 ,关键数据的丢失或运行的中断有时是灾难性的。目前已知的企业高可用性方案特点:1)高可用方案与其业务逻辑紧密相连,复杂且可读性差,代码的可移植性, 复用性不高2)实现的思路多种多样3)基于一个思路的技术实现多种多样 High Availability Toolkit提供了若干种当前业界主流方案,每种方案不掺杂业务逻辑,纯粹

  • MySQL High Availability clustering 包含一些脚本和程序用来提供高可用性的MySQL数据库集群,它采用MySQL复制的方式,对客户端程序来说是透明的,通过一个共享的浮动IP来提供对数据库集群的访问。

  • imi v1.0.13 版本新增了一个 Swoole\Coroutine\Http\Server 实现的协程服务器。需要 Swoole 4.4+ 才可使用该特性。 该特性是可选的,不影响以前使用的服务器模式。 使用协程服务器特性,依靠 Linux 系统的端口重用机制,系统级的负载均衡,可以让你的多进程 Http 服务处理请求的能力得到提升。 使用 ab,本机->虚拟机(双核+2进程)压测Hello

  • 用于设置容器内pod的访问方式。 服务 服务定义了访问后端Pod的访问方式。 路由 路由是允许访问集群内路由的规则集合。

  • 负载均衡即服务(Load Balance as a Service,LBaaS)是一项网络高级服务。 顾名思义,它允许租户动态的在自己的网络创建一个负载均衡设备。 负载均衡,可以说是分布式系统中比较基础的组件,它接收前端过来的请求,然后将请求按照某种均衡的策略转发给后端资源池中的某个处理单元,以完成处理。进而可以实现高可用性和横向的扩展性。 OpenStack Neutron 通过高级服务扩展的形