Redis主从集群的Sentinel配置

http://www.cnblogs.com/LiZhiW/p/4851631.html

 

1.集群环境

1.Linux服务器列表

使用4台CentOS Linux服务器搭建环境,其IP地址如下:

  1. 192.168.110.100
  2. 192.168.110.101
  3. 192.168.110.102
  4. 192.168.110.103

2.Redis服务部署环境

192.168.110.100

启动多个Redis sentinel服务,构成Redis sentinel集群

192.168.110.101

启动Redis服务,设置成主节点

192.168.110.102

启动Redis服务,设置成192.168.110.101的从节点

192.168.110.103

启动Redis服务,设置成192.168.110.101的从节点

回到顶部

2.配置并启动Redis主从集群

1.修改redis.conf配置文件

主节点的redis配置文件使用默认的配置文件就可以了,从节点的redis配置文件修改如下:

  1. # Master-Slave replication. Use slaveof to make a Redis instance a copy of
  2. # another Redis server. A few things to understand ASAP about Redis replication.
  3. #
  4. # 1) Redis replication is asynchronous, but you can configure a master to
  5. # stop accepting writes if it appears to be not connected with at least
  6. # a given number of slaves.
  7. # 2) Redis slaves are able to perform a partial resynchronization with the
  8. # master if the replication link is lost for a relatively small amount of
  9. # time. You may want to configure the replication backlog size (see the next
  10. # sections of this file) with a sensible value depending on your needs.
  11. # 3) Replication is automatic and does not need user intervention. After a
  12. # network partition slaves automatically try to reconnect to masters
  13. # and resynchronize with them.
  14. #
  15. # 主从同步。通过 slaveof 配置来实现Redis实例的备份。
  16. # 注意,这里是本地从远端复制数据。也就是说,本地可以有不同的数据库文件、绑定不同的IP、监听不同的端口。
  17. #
  18. # slaveof <masterip> <masterport>
  19. slaveof 192.168.110.1016379

注意:两台从节点都要改。

2.启动Redis主从集群

先启动192.168.110.101主节点,使用默认配置,脚本:

  1. [wch@localhost bin]$ ./redis-server

再启动192.168.110.102和192.168.110.103从节点,使用刚才的配置,脚本:

  1. ./redis-server redis.conf

3.查看集群

192.168.110.101主节点Replication信息

  1. [wch@localhost bin]$ ./redis-cli -h 192.168.110.101 info Replication
  2. # Replication
  3. role:master
  4. connected_slaves:2
  5. slave0:ip=192.168.110.102,port=6379,state=online,offset=659,lag=1
  6. slave1:ip=192.168.110.103,port=6379,state=online,offset=659,lag=0
  7. master_repl_offset:659
  8. repl_backlog_active:1
  9. repl_backlog_size:1048576
  10. repl_backlog_first_byte_offset:2
  11. repl_backlog_histlen:658

192.168.110.102从节点Replication信息

  1. [wch@localhost bin]$ ./redis-cli -h 192.168.110.102 info Replication
  2. # Replication
  3. role:slave
  4. master_host:192.168.110.101
  5. master_port:6379
  6. master_link_status:up
  7. master_last_io_seconds_ago:3
  8. master_sync_in_progress:0
  9. slave_repl_offset:701
  10. slave_priority:100
  11. slave_read_only:1
  12. connected_slaves:0
  13. master_repl_offset:0
  14. repl_backlog_active:0
  15. repl_backlog_size:1048576
  16. repl_backlog_first_byte_offset:0
  17. repl_backlog_histlen:0

192.168.110.103从节点Replication信息

  1. [wch@localhost bin]$ ./redis-cli -h 192.168.110.103 info Replication
  2. # Replication
  3. role:slave
  4. master_host:192.168.110.101
  5. master_port:6379
  6. master_link_status:up
  7. master_last_io_seconds_ago:9
  8. master_sync_in_progress:0
  9. slave_repl_offset:715
  10. slave_priority:100
  11. slave_read_only:1
  12. connected_slaves:0
  13. master_repl_offset:0
  14. repl_backlog_active:0
  15. repl_backlog_size:1048576
  16. repl_backlog_first_byte_offset:0
  17. repl_backlog_histlen:0

此时,存储到192.168.110.101主节点的数据,在从节点中都可以查询到。从节点会备份主节点的数据。

回到顶部

3.配置sentinel集群并启动

1.创建sentinel.conf配置文件

#--后台运行
#daemonize yes

  1. port 26379
  2. # sentinel announce-ip <ip>
  3. # sentinel announce-port <port>
  4. dir /tmp
  5.  
  6. ################################# master001 #################################
  7. sentinel monitor master001 192.168.110.10163792
  8. # sentinel auth-pass <master-name> <password>
  9. sentinel down-after-milliseconds master001 30000
  10. sentinel parallel-syncs master001 1
  11. sentinel failover-timeout master001 180000
  12. # sentinel notification-script <master-name> <script-path>
  13. # sentinel client-reconfig-script <master-name> <script-path>
  14.  
  15. # 可以配置多个master节点
  16. ################################# master002 #################################

 

 

 

另一个配置标例


# Example sentinel.conf
#--后台运行
#daemonize yes
# port <sentinel-port>
# The port that this sentinel instance will run on
port 26305
dir "/tmp"
sentinel monitor master05 192.168.25.110 16306 1
sentinel down-after-milliseconds master05 5000
sentinel failover-timeout master05 5000
sentinel parallel-syncs master05 2
# Generated by CONFIG REWRITE
#sentinel config-epoch master05 0
#sentinel leader-epoch master05 0
#sentinel known-slave master05 192.168.25.110 16307
#sentinel known-slave master05 192.168.25.110 16306
#sentinel known-sentinel master05 192.168.25.110 26308 6d6b069753b48875861aa8f11f1971c131e743ba
#sentinel current-epoch 0
sentinel config-epoch master05 12
sentinel leader-epoch master05 12
sentinel known-slave master05 192.168.25.110 16307
sentinel known-slave master05 192.168.25.110 16305
sentinel known-sentinel master05 192.168.25.110 26308 e032e2baa1bb1d8699f3323f2affe9a734e1ecea
sentinel current-epoch 12

 

配置文件说明:

1. port :当前Sentinel服务运行的端口

 

2. dir : Sentinel服务运行时使用的临时文件夹

 

3.sentinel monitor master001 192.168.110.10163792:Sentinel去监视一个名为master001的主redis实例,这个主实例的IP地址为本机地址192.168.110.101,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行

 

4.sentinel down-after-milliseconds master001 30000:指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行

 

5.sentinel parallel-syncs master001 1:指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长

 

6.sentinel failover-timeout master001 180000:如果在该时间(ms)内未能完成failover操作,则认为该failover失败

 

7.sentinel notification-script <master-name> <script-path>:指定sentinel检测到该监控的redis实例指向的实例异常时,调用的报警脚本。该配置项可选,但是很常用

2.启动sentinel集群

创建3个sentinel.conf配置文件:sentinel001.conf、sentinel002.conf、sentinel003.conf并修改端口号分别为:26379、36379、46379,并启动服务:

  1. ./redis-sentinel sentinel001.conf
  2. ./redis-sentinel sentinel002.conf
  3. ./redis-sentinel sentinel003.conf

启动三个sentinel服务后会在其控制台看到如下信息:

./redis-sentinel sentinel001.conf,端口:26379

  1. [7743]01Oct06:20:38.162# Sentinel runid is ba6c42e1accc31290e11d5876275e1562564295d
  2. [7743]01Oct06:20:38.162# +monitor master master001 192.168.110.101 6379 quorum 2
  3. [7743]01Oct06:20:39.110*+slave slave 192.168.110.102:6379192.168.110.1026379@ master001 192.168.110.1016379
  4. [7743]01Oct06:20:39.111*+slave slave 192.168.110.103:6379192.168.110.1036379@ master001 192.168.110.1016379
  5. [7743]01Oct06:25:07.595*+sentinel sentinel 192.168.110.100:36379192.168.110.10036379@ master001 192.168.110.1016379
  6. [7743]01Oct06:26:11.170*+sentinel sentinel 192.168.110.100:46379192.168.110.10046379@ master001 192.168.110.1016379

./redis-sentinel sentinel002.conf,端口:36379

  1. [7795]01Oct06:25:05.538# Sentinel runid is 52c14768b15837fb601b26328acf150c6bd30682
  2. [7795]01Oct06:25:05.538# +monitor master master001 192.168.110.101 6379 quorum 2
  3. [7795]01Oct06:25:06.505*+slave slave 192.168.110.102:6379192.168.110.1026379@ master001 192.168.110.1016379
  4. [7795]01Oct06:25:06.515*+slave slave 192.168.110.103:6379192.168.110.1036379@ master001 192.168.110.1016379
  5. [7795]01Oct06:25:07.557*+sentinel sentinel 192.168.110.100:26379192.168.110.10026379@ master001 192.168.110.1016379
  6. [7795]01Oct06:26:11.168*+sentinel sentinel 192.168.110.100:46379192.168.110.10046379@ master001 192.168.110.1016379

./redis-sentinel sentinel003.conf,端口:46379

  1. [7828]01Oct06:26:09.076# Sentinel runid is c8509594be4a36660b2122b3b81f4f74060c9b04
  2. [7828]01Oct06:26:09.076# +monitor master master001 192.168.110.101 6379 quorum 2
  3. [7828]01Oct06:26:10.063*+slave slave 192.168.110.102:6379192.168.110.1026379@ master001 192.168.110.1016379
  4. [7828]01Oct06:26:10.071*+slave slave 192.168.110.103:6379192.168.110.1036379@ master001 192.168.110.1016379
  5. [7828]01Oct06:26:11.516*+sentinel sentinel 192.168.110.100:26379192.168.110.10026379@ master001 192.168.110.1016379
  6. [7828]01Oct06:26:11.674*+sentinel sentinel 192.168.110.100:36379192.168.110.10036379@ master001 192.168.110.1016379

每个sentinel服务能知道其他所有的服务!

回到顶部

4.测试sentinel集群

1.停止192.168.110.101主节点

停止192.168.110.101Redis主节点后,在查看Replication信息如下:

  1. [wch@localhost bin]$ ./redis-cli -h 192.168.110.101 info Replication
  2. Could not connect to Redis at 192.168.110.101:6379:Connection refused
  3.  
  4. [wch@localhost bin]$ ./redis-cli -h 192.168.110.102 info Replication
  5. # Replication
  6. role:slave
  7. master_host:192.168.110.103
  8. master_port:6379
  9. master_link_status:up
  10. master_last_io_seconds_ago:1
  11. master_sync_in_progress:0
  12. slave_repl_offset:29128
  13. slave_priority:100
  14. slave_read_only:1
  15. connected_slaves:0
  16. master_repl_offset:0
  17. repl_backlog_active:0
  18. repl_backlog_size:1048576
  19. repl_backlog_first_byte_offset:0
  20. repl_backlog_histlen:0
  21.  
  22. [wch@localhost bin]$ ./redis-cli -h 192.168.110.103 info Replication
  23. # Replication
  24. role:master
  25. connected_slaves:1
  26. slave0:ip=192.168.110.102,port=6379,state=online,offset=30456,lag=1
  27. master_repl_offset:30456
  28. repl_backlog_active:1
  29. repl_backlog_size:1048576
  30. repl_backlog_first_byte_offset:2
  31. repl_backlog_histlen:30455
  32. [wch@localhost bin]$

发现192.168.110.101Redis主节点已经不能连接,192.168.110.103成了主节点!

2.再启动192.168.110.101主节点

再启动192.168.110.101Redis主节点后,在查看Replication信息如下:

  1. ### 启动脚本,仍然使用默认配置
  2. [wch@localhost bin]$ ./redis-server
  3.  
  4. [wch@localhost bin]$ ./redis-cli -h 192.168.110.101 info Replication
  5. # Replication
  6. role:slave
  7. master_host:192.168.110.103
  8. master_port:6379
  9. master_link_status:up
  10. master_last_io_seconds_ago:1
  11. master_sync_in_progress:0
  12. slave_repl_offset:57657
  13. slave_priority:100
  14. slave_read_only:1
  15. connected_slaves:0
  16. master_repl_offset:0
  17. repl_backlog_active:0
  18. repl_backlog_size:1048576
  19. repl_backlog_first_byte_offset:0
  20. repl_backlog_histlen:0
  21.  
  22. [wch@localhost bin]$ ./redis-cli -h 192.168.110.102 info Replication
  23. # Replication
  24. role:slave
  25. master_host:192.168.110.103
  26. master_port:6379
  27. master_link_status:up
  28. master_last_io_seconds_ago:0
  29. master_sync_in_progress:0
  30. slave_repl_offset:60751
  31. slave_priority:100
  32. slave_read_only:1
  33. connected_slaves:0
  34. master_repl_offset:0
  35. repl_backlog_active:0
  36. repl_backlog_size:1048576
  37. repl_backlog_first_byte_offset:0
  38. repl_backlog_histlen:0
  39.  
  40. [wch@localhost bin]$ ./redis-cli -h 192.168.110.103 info Replication
  41. # Replication
  42. role:master
  43. connected_slaves:2
  44. slave0:ip=192.168.110.102,port=6379,state=online,offset=63247,lag=1
  45. slave1:ip=192.168.110.101,port=6379,state=online,offset=63247,lag=1
  46. master_repl_offset:63393
  47. repl_backlog_active:1
  48. repl_backlog_size:1048576
  49. repl_backlog_first_byte_offset:2
  50. repl_backlog_histlen:63392
  51. [wch@localhost bin]$

发现192.168.110.101节点启动后还再集群中,只不过成了从节点,192.168.110.103仍然是主节点,但是现在又有两个从节点了!

3.只留下一个sentinel服务,再停止192.168.110.103主节点,查看Redis集群是否出现新的主节点

停止sentinel服务,只留下一个sentinel服务,再停止Redis主节点,查看Replication信息如下:

  1. [wch@localhost bin]$ ./redis-cli -h 192.168.110.101 info Replication
  2. # Replication
  3. role:slave
  4. master_host:192.168.110.103
  5. master_port:6379
  6. master_link_status:down
  7. master_last_io_seconds_ago:-1
  8. master_sync_in_progress:0
  9. slave_repl_offset:184231
  10. master_link_down_since_seconds:43
  11. slave_priority:100
  12. slave_read_only:1
  13. connected_slaves:0
  14. master_repl_offset:0
  15. repl_backlog_active:0
  16. repl_backlog_size:1048576
  17. repl_backlog_first_byte_offset:0
  18. repl_backlog_histlen:0
  19.  
  20. [wch@localhost bin]$ ./redis-cli -h 192.168.110.102 info Replication
  21. # Replication
  22. role:slave
  23. master_host:192.168.110.103
  24. master_port:6379
  25. master_link_status:down
  26. master_last_io_seconds_ago:-1
  27. master_sync_in_progress:0
  28. slave_repl_offset:184231
  29. master_link_down_since_seconds:52
  30. slave_priority:100
  31. slave_read_only:1
  32. connected_slaves:0
  33. master_repl_offset:0
  34. repl_backlog_active:0
  35. repl_backlog_size:1048576
  36. repl_backlog_first_byte_offset:0
  37. repl_backlog_histlen:0
  38.  
  39. [wch@localhost bin]$ ./redis-cli -h 192.168.110.103 info Replication
  40. Could not connect to Redis at 192.168.110.103:6379:Connection refused

发现192.168.110.103主节点已经不能连接了,也不存在Redis主节点,集群中无主节点了!!!分析原因是:sentinel.conf配置的sentinel monitor master001 192.168.110.10163792最后一个参数是2导致,若是但节点此配置的最后一个参数要使用是1。(此原因我已证实)

注意:在生产环境下建议sentinel节点的数量能在3个以上,并且最好不要在同一台机器上(使用同一网卡)。

-------------------------------------------------------------------------------------------------------------------------------

转载于:https://my.oschina.net/u/1045177/blog/1540645

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Spring Boot集成Redis主从集群的配置方法: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2.在application.properties文件中添加以下配置: ```properties # Redis主节点配置 spring.redis.master.host=127.0.0.1 spring.redis.master.port=6379 spring.redis.master.password=123456 # Redis从节点配置 spring.redis.slave.nodes=127.0.0.1:6380,127.0.0.1:6381 spring.redis.slave.password=123456 ``` 3.创建RedisConfig类,配置RedisTemplate和JedisConnectionFactory: ```java @Configuration public class RedisConfig { @Value("${spring.redis.master.host}") private String masterHost; @Value("${spring.redis.master.port}") private int masterPort; @Value("${spring.redis.master.password}") private String masterPassword; @Value("${spring.redis.slave.nodes}") private String slaveNodes; @Value("${spring.redis.slave.password}") private String slavePassword; @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } @Bean public JedisConnectionFactory jedisConnectionFactory() { RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration() .master("mymaster") .sentinel("127.0.0.1", 26379) .sentinel("127.0.0.1", 26380) .sentinel("127.0.0.1", 26381) .setPassword(masterPassword); JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(sentinelConfig); jedisConnectionFactory.setUsePool(true); jedisConnectionFactory.setPoolConfig(jedisPoolConfig()); return jedisConnectionFactory; } @Bean public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(100); jedisPoolConfig.setMaxIdle(50); jedisPoolConfig.setMinIdle(20); jedisPoolConfig.setMaxWaitMillis(3000); return jedisPoolConfig; } } ``` 4.在需要使用Redis的类中注入RedisTemplate即可使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值