软件简介

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();
        }
}
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
暂无内容
2020/02/21 23:49

CM6.3 High Availability

HDFS High Availability YARN High Availability HBase High Availability Most aspects of HBase are highly available in a standard configuration. A cluster typically consists of one Master and three or more RegionServers, with data stored in HDFS. To ensure that every component is highly available, configure one or more backup Masters. The backup Masters run on other hosts than the active Master. E...

0
0
发表了博客
2013/04/24 22:14

Cloudifying High Availability

Posted By: Ali Hodroj on March 4, 2013 The following is Part 1 of 2 on architecting highly available cloud applications using Cloudify. The first part introduces the concepts, challenges, and solutions to achieve highest levels of availability and disaster recovery in the cloud. The second part revisits the concept to provide a solution architecture and demo source code showing a real-world sce...

0
0
2020/02/22 12:54

CM6.3 High Availability

## HDFS High Availability ![](https://oscimg.oschina.net/oscnet/up-ae1c4e3db628c5f101991fb1eaeab23f252.png) ![](https://oscimg.oschina.net/oscnet/up-d52e5e960e86fbdabef231d48267946bbe7.png) ![](https://oscimg.oschina.net/oscnet/up-c70d8f76ea41815e6197737bd2128878e56.png) ![](https://oscimg.oschina.net/oscnet/up-c1a14f0779b53cab23c9f6a88778aeb81b5.png) ![](https://oscimg.oschina.net/oscnet/up-8d...

0
0
发表于AI & 大数据专区
2018/10/06 18:33

High Availability With QJM

节点及实例规划: High Availability With QJM 部署要点及注意事项请参考 https://my.oschina.net/u/3862440/blog/2208568 HA 部署小节。 编辑"hdfs-site.xml" dfs.nameservices --配置命名服务,一个集群一个服务名,服务名下面包含多个服务和几点,对外统一提供服务。 <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> dfs.ha.namenodes.[nameservice ID] --配置所有的NN的s...

0
0
发表了博客
2019/05/04 15:40

HDFS High Availability

1. 背景 在Hadoop 2.0.0 之前,namenode 一直是单节点运行,存在单点故障。若是在namenode 节点出现问题,则会导致整个hdfs 集群均不可用。直到namenode进程恢复,或是在另一备用节点上启动namenode进程。 HDFS 的高可用(high availability)提供了配置一主(active)一备(standby)namenode 的功能,用于在主节点故障(或是手动维护时),快速的进行failover,将业务切换到standby namenode。 2. 架构 在一个典型的HA集群中,...

0
0
发表于开发技能专区
2014/10/08 19:06

Memcached Server High availability

Memcached is a high performance centralized cache system that stores data as key/value pair. It is usually used as L2 cache that serves as a database front. However, memcached lack of features that typical no-sql store has: Data is stored in memory only,there is no disk persistence etc, so data is lost on server failure Memcached itself does not provide cluster support such as data partition an...

0
0
发表了博客
2018/07/13 20:46

Hadoop High Availability高可用

HDFS HA Namenode HA 详解     hadoop2.x 之后,Clouera 提出了 QJM/Qurom Journal Manager,这是一个基于 Paxos 算法(分布式一致性算法)实现的 HDFS HA 方案,它给出了一种较好的解决思路和方案,QJM 主要优势如下:   不需要配置额外的高共享存储,降低了复杂度和维护成本。   消除 spof(单点故障)。   系统鲁棒性(Robust)的程度可配置、可扩展。   基本原理就是用 2N+1 台 JournalNode 存储 EditLog,每次写数据...

0
0
发表于服务端专区
2016/04/19 13:17

组件的高可用性 High Availability

High Availability 高可用性 Verticles can be deployed with High Availability (HA) enabled. In that context, when a verticle is verticle可以发布为“高可用性”的,这样的话当一个verticle被发布到一个实例上突然死掉了, deployed on a vert.x instance that dies abruptly, the verticle is redeployed on another vert.x instance from the cluster. 这个verticle会被重新发布到集群的另外一个vert.x的实例上。 To r...

0
0
发表于开发技能专区
2019/12/27 09:39

Demystifying High Availability in Kubernetes Using Kubeadm

Sign in Get started CLOUD COMPUTING MACHINE LEARNING DEVOPS SOFTWARE Demystifying High Availability in Kubernetes Using Kubeadm Velotio Technologies Follow Jan 17 · 6 min read Introduction The rise of containers has reshaped the way we develop, deploy and maintain the software. Containers allow us to package the different services that constitute an application into separate containers, and t...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
8 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部