初步搭建Redis集群

克隆已经安装Redis的虚拟机,我们使用这两个虚拟机中的Redis来搭建集群。

  1. master192.168.2.129 端口:7001
  2.  
  3. slave192.168.2.132 端口:7002
  4.  
  5. sentinel192.168.2.129 端口:26379

来说一下这个sentinel,sentinel是一个管理redis实例的工具,它可以实现对redis的监控、通知、自动故障转移。sentinel不断的检测redis实例是否可以正常工作,通过API向其他程序报告redis的状态,如果redis master不能工作,则会自动启动故障转移进程,将其中的一个slave提升为master,其他的slave重新设置新的master服务器。

来配置一下sentinel.conf,内容如下:

  1. port 26379
  2. daemonize yes
  3. logfile "/var/log/redis/sentinel.log"
  4. sentinel monitor master1 192.168.1.129 7001 1
  5. sentinel down-after-milliseconds master1 1000
  6. sentinel failover-timeout master1 5000

做为master的redis不需要修改redis.conf配置,但需要修改一下slave的redis配置,将端口修改为7002,并且添加如下的配置:

  1. slaveof 192.168.1.129 7001
 
配完了master, slave和sentinel后,必须按照如下顺序来启动redis集群:
 
master->slave->sentinel

执行如下的命令所在的目录为:redis-stable/src

  1. ./redis-server ../redis.conf // 启动master与slave
  2.  
  3. ./redis-sentinel ../sentinel.conf // 启动sentinel

使用客户端来查看:

  1. ./redis-cli -p 26379 -h 192.168.2.129

内容如下图:

2、Spring Session Date Redis访问Redis Sentinel

使用上次新建的模块mazhi-redis进行测试。pom.xml文件不需要改变。但是redis.properties的配置需要改变,如下:

  1. spring.redis.database=0
  2. spring.redis.host=192.168.2.129
  3. # Login password of the redis server.
  4. spring.redis.password=
  5. spring.redis.pool.max-active=8
  6. spring.redis.pool.max-idle=8
  7. spring.redis.pool.max-wait=-1
  8. spring.redis.pool.min-idle=0
  9. spring.redis.port=7001
  10. # Name of Redis server.
  11. spring.redis.sentinel.master=master1
  12. # Comma-separated list of host:port pairs.
  13. spring.redis.sentinel.nodes=192.168.2.129:26379
  14. spring.redis.timeout=0

注意必须是redis.properties这个名称,而且必须要放到src/main/resources目录下,这是一种约定。

spring.redis.sentinel.master必须与sentinel.conf文件中指定的值一致,如下:

  1. sentinel monitor master1 192.168.1.129 7001 1

spring.redis.sentinel.nodes值为sentinel的ip:端口,可以有多个。

在org.mazhi.redis.config目录下新建RedisSentinalConfig.java文件,内容如下:

  1. @Configuration
  2. @PropertySource(value = "classpath:/redis.properties")
  3. @EnableCaching
  4. public class RedisSentinalConfig extends CachingConfigurerSupport{
  5.  
  6. @Bean
  7. public KeyGenerator wiselyKeyGenerator(){ // 配置key的生成规则
  8. return new KeyGenerator() {
  9. public Object generate(Object target, Method method, Object... params) {
  10. StringBuilder sb = new StringBuilder();
  11. sb.append(target.getClass().getName());
  12. sb.append(method.getName());
  13. for (Object obj : params) {
  14. sb.append(obj.toString());
  15. }
  16. return sb.toString();
  17. }
  18. };
  19.  
  20. }
  21.  
  22. @Bean
  23. public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
  24. return new RedisCacheManager(redisTemplate);
  25. }
  26.  
  27. @Bean
  28. public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
  29. StringRedisTemplate template = new StringRedisTemplate(factory);
  30. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  31. ObjectMapper om = new ObjectMapper();
  32. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  33. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  34. jackson2JsonRedisSerializer.setObjectMapper(om);
  35. template.setValueSerializer(jackson2JsonRedisSerializer);
  36. template.afterPropertiesSet();
  37. return template;
  38. }
  39. }

新建一个User的实体对象,如下:

  1. package org.mazhi.redis.bean;
  2.  
  3. public class User {
  4. private Long id;
  5. private String name;
  6. private String address;
  7.  
  8. public User(Long id,String name, String address) {
  9. this.id = id ;
  10. this.name = name;
  11. this.address = address;
  12. }
  13.  
  14. public User() {
  15. }
  16. ...
  17.  
  18. }

在org.mazhi.redis.service目录下新建DemoService.java文件,内容如下:

  1. @Service
  2. public class DemoService {
  3. @Cacheable(value = "usercache",keyGenerator = "wiselyKeyGenerator")
  4. public User findUser(Long id,String firstName,String lastName){
  5. System.out.println("======当Redis中不存在这条数据时会执行这里=========");
  6. return new User(id,firstName,lastName);
  7. }
  8. }

在org.mazhi.redis.web目录下新建RedisSentinelController.java文件,内容如下:

  1. @Autowired
  2. DemoService demoService;
  3.  
  4. @RequestMapping("/addToRedis")
  5. @ResponseBody
  6. public void putCache() {
  7. demoService.findUser(1l, "mazhi", "ordos");
  8. System.out.println("添加成功!");
  9. }
  10.  
  11. @RequestMapping("/findFromRedis")
  12. @ResponseBody
  13. public void testCache() {
  14. User user = demoService.findUser(1l, "mazhi", "ordos");
  15. System.out.println("user:" + "/" + user.getName() + "/" + user.getAddress());
  16. }
  17. }

启动Spring Boot后,在浏览器中输入如下地址:

  1. http://localhost:8081/redis-sentinel/addToRedis

Eclipse的控制台打印如下信息:

  1. ======当Redis中不存在这条数据时会执行这里=========
  2. 添加成功!
  3. 添加成功!

接着输入如下地址进行访问:

  1. http://localhost:8081/redis-sentinel/getFromRedis

打印结果如下:

  1. user:/mazhi/ordos
  2. user:/mazhi/ordos

来看一下Redis的数据库,如下图所示。

看Key的生成形式,这就是调用我们在RedisSentinalConfig.java文件中指定的方法wiselyKeyGenerator()生成的。

看一下192.168.2.132上的redis,可以看到两个Redis的信息是同步的。

使用如下的命令来封闭192.168.2.129上的7001端口到达任何地方的路由,即人为造成了一次master服务的“宕机”。

  1. /sbin/iptables -I INPUT -p tcp --dport 7001 -j DROP

Eclipse的控制台输出如下信息:

  1. 2016-04-01 09:02:35.188 INFO 6980 --- [ Thread-2] redis.clients.jedis.JedisSentinelPool : Created JedisPool to master at 192.168.2.132:7002

master变为了192.168.2.132机器。或者我们可以在sentinel客户端查看,如下:

address已经变成了192.168.2.132了。

恢复192.168.2.129上的7001端口,输入如下的命令:

  1. /sbin/iptables -I INPUT -p tcp --dport 7001 -j ACCEPT

在192.168.2.129上输入如下命令查看:

  1. ./redis-cli -h 192.168.2.129 -p 7001

可以看到如下信息:

角色由以前的master变为slave了,而现在的master是192.168.2.132主机。

剑指架构师系列-Redis集群部署的更多相关文章

  1. 剑指架构师系列-Redis安装与使用

    1.安装Redis 我们在VMware中安装CentOS 64位系统后,在用户目录下下载安装Redis. 下载redis目前最稳定版本也是功能最完善,集群支持最好并加入了sentinel(哨兵-高可用 ...

  2. 剑指架构师系列-Hibernate需要掌握的Annotation

    1.一对多的关系配置 @Entity @Table(name = "t_order") public class Order { @Id @GeneratedValue priva ...

  3. 剑指架构师系列-MySQL调优

    介绍MySQL的调优手段,主要包括慢日志查询分析与Explain查询分析SQL执行计划 1.MySQL优化 1.慢日志查询分析 首先需要对慢日志进行一些设置,如下: SHOW VARIABLES LI ...

  4. 剑指架构师系列-Logstash分布式系统的日志监控

    Logstash主要做由三部署组成: Collect:数据输入 Enrich:数据加工,如过滤,改写等 Transport:数据输出 下面来安装一下: wget https://download.el ...

  5. 剑指架构师系列-spring boot的logback日志记录

    Spring Boot集成了Logback日志系统. Logback的核心对象主要有3个:Logger.Appender.Layout 1.Logback Logger:日志的记录器 主要用于存放日志 ...

  6. 剑指架构师系列-持续集成之Maven+Nexus+Jenkins+git+Spring boot

    1.Nexus与Maven 先说一下这个Maven是什么呢?大家都知道,Java社区发展的非常强大,封装各种功能的Jar包满天飞,那么如何才能方便的引入我们项目,为我所用呢?答案就是Maven,只需要 ...

  7. 剑指架构师系列-tomcat6通过IO复用实现connector

    由于tomcat6的配置文件如下: <Connector port="80" protocol="org.apache.coyote.http11.Http11Ni ...

  8. 剑指架构师系列-Struts2构造函数的循环依赖注入

    Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } pub ...

  9. 剑指架构师系列-tomcat6通过伪异步实现connector

    首先在StandardService中start接收请求的线程,如下: synchronized (connectors) { for (int i = 0; i < connectors.le ...

随机推荐

  1. Opencv出现“_pFirstBlock == pHead”错误的解决方法

    先说结论: opencv链接库使用错误. 1,确认VS工程属性中,opencv的链接库路径和版本正确. VS2013应该使用vc12目录,VS2012对应vc11目录.debug版和release版要 ...

  2. POJ-2570 Fiber Network---Floyd+二进制表示集合

    题目链接: https://vjudge.net/problem/POJ-2570 题目大意: 一些公司决定搭建一个更快的网络,称为"光纤网".他们已经在全世界建立了许多站点,这 ...

  3. POJ-1700 Crossing River---过河问题(贪心)

    题目链接: https://vjudge.net/problem/POJ-1700 题目大意: 有N个人要渡河,但是只有一艘船,船上每次最多只能载两个人,渡河的速度由两个人中较慢的那个决定,小船来回载 ...

  4. if__name__ == '__main__'

    # a.py import b def x(): print('x') b.y #b.py import a def y(): print('y') a.x() #执行b.py引发异常 首先,执行b. ...

  5. IOS 中openGL使用教程4(openGL ES 入门篇 | 离屏渲染)

    通常情况下,我们使用openGL将渲染好的图片绘制到屏幕上,但有时候我们不想显示处理结果,这时候就需要使用离屏渲染了. 正常情况下,我们将屏幕,也就是一个CAEAGLLayer对象作为渲染目标,离屏渲 ...

  6. 如何在Shell读取文件并赋值

    sys_info=$(cat /usr/local/sysconfig.txt)var=`echo   $sys_info   |   awk   -F ', '   '{print   $0} '  ...

  7. OpenGL中glUniform1i使用

    在OpenGL中使用glGetUniformLocation和glUniformxxx等函数时,要在之前启用对应的着色器程序,即调用glUseProgram.

  8. Java 内部类示例

    在下面的示例中,创建了一个数组,使用升序的整数初始化它,并打印索引为偶数的数组值. public class DataStructure { // 创建一个数组 private final stati ...

  9. linux下使用crontab定时执行脚本

    使用crontab定时执行脚本 cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务: crontab –e : 修改 crontab 文件,如果文件不存在会自 ...

  10. [LeetCode] Max Stack 最大栈

    Design a max stack that supports push, pop, top, peekMax and popMax. push(x) -- Push element x onto ...