保障服务的持续高可用、高性能及负载均衡 项目主页
高可用: 服务多副本 高性能: 超时限制 负载均衡: 环形队列 已经实现的功能: 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", " "); 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(); } }
目录结构
相关推荐
随着你的网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,你们又是创业型互联公司...我们利用LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。
Nginx入门到精通搭建高可用集群负载均衡,Nginx+Lvs+keepAlived构建高可用集群环境
Keepalived+Nginx实现高可用Web负载均衡
调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改...
MySQL高可用负载均衡集群部署
1、部署环境架构设计2、安装与配置说明2.1 Apache与PHP-FPM2.2 Varnish与Apache2.3 Nginx反向代理2.4 LVS负载均衡3、环境测试3.1 Apache与PHP-FPM3.2 Varnish与Apache3.3 Nginx3.4 LVS负载均衡
利用LVS+Keepalived 实现高性能高可用负载均衡服务器
负载均衡F5_HA高可用理论知识手册
Keepalived + Nginx 实现高可用 Web 负载均衡配置文件,具体详情参见博文:http://blog.csdn.net/l1028386804/article/details/72801492
本文使用haproxy和keepalived搭建mysql集群:负载均衡、高可用、负载均衡+高可用,并验证测试成功
高可用性、负载均衡的mysql集群解决方案
本文档详细介绍了如何利用keepalived实现Nginx的高可用和负载均衡的步骤,且已经在生产环境中部署验证通过
负载均衡SLB高可用架构介绍.docx
负载均衡技术介绍 什么是负载均衡? 负载均衡算法原理 负载均衡应用模式 高可用的系统设计 什么是系统高可用性? 高可用的模式 系统高可用设计 高可用设计案例 高可用方案及实践 Apache+Tomcat 高可用WEB...
搭建MySQL高可用负载均衡集群 需要的可以下载看看,走过路过,不要错过,买不了吃亏,买不了上当,真实可信。
企业级keepalived高可用实战与Nginx负载均衡视频教程.zip
本文档主要介绍MyCat高可用负载均衡集群实现(HAProxy+Keepalived+MyCat)
开箱即用,简单粗暴Elasticsearch天然支持分布式和集群,开箱即用,零配置,零改动。自动分片一个index默认5个primaryshard,那么我们创建一个document,他给我们分配到哪个shard...shard负载均衡假设我们有1个index,
ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试
当日常工作业务量较大、网络负荷过重时,我们就需要将业务进行负载,来保障服务器的高可用性,高稳定性。负载均衡可以对服务器的运行状况进行监控,及时发现运行异常的服务器,并将访问请求转移到其它可以正常工作的...