Redis主从集群的Sentinel配置

转载自: https://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配置文件使用默认的配置文件就可以了,

###设置主节点绑定ip地址
bind 192.168.110.101
###关闭保护模式
protected-mode no
##设置端口号
port 6379
###设置以后台方式启动
daemonize yes
###指定pid文件保存位置
pidfile /home/zh/redis/redis.pid
##指定日志文件位置
logfile /home/zh/redis/redis.log
##指定redis数据文件dump.rdb文件保存位置
dir /home/zh/redis
##指定redis服务密码
masterauth redis
从节点的redis配置文件在主节点配置的基础上增加如下配置:
##修改为从节点ip
bind 192.168.110.102
##修改为从节点端口号
prot 6379
###设置从节点访问主节点密码
requirepass redis
  1. #
  2. # 主从同步。通过 slaveof 配置来实现Redis实例的备份。
  3. # 注意,这里是本地从远端复制数据。也就是说,本地可以有不同的数据库文件、绑定不同的IP、监听不同的端口。
  4. #
  5. # slaveof <masterip> <masterport>
  6. slaveof 192.168.110.101  6379
注意:两台从节点都要改。
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 -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 -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 -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配置文件
  1. ###改为sentinel服务ip地址
  2. bind 192.168.110.100
  3. port 26379
  4. protected-mode no
  5. dir /tmp
  6. ################################# master001 #################################
  7. ##设置redis服务主节点地址
  8. sentinel monitor master001 192.168.110.101 6379 2
  9. ###设置redis服务密码
  10. sentinel auth-pass master001 redis
  11. sentinel down-after-milliseconds master001 30000
  12. sentinel parallel-syncs master001 1
  13. sentinel failover-timeout master001 180000
  14. # sentinel notification-script <master-name> <script-path>
  15. # sentinel client-reconfig-script <master-name> <script-path>
  16. # 可以配置多个master节点
  17. ################################# master002 #################################
配置文件说明:
1. port :当前 Sentinel服务运行的端口
 
2. dir :  Sentinel服务运行时使用的临时文件夹
 
3.sentinel monitor master001192.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 -192.168.110.101 info Replication
  2. Could not connect to Redis at 192.168.110.101:6379:Connection refused
  3. [wch@localhost bin]./redis-cli -192.168.110.102 info Replication
  4. # Replication
  5. role:slave
  6. master_host:192.168.110.103
  7. master_port:6379
  8. master_link_status:up
  9. master_last_io_seconds_ago:1
  10. master_sync_in_progress:0
  11. slave_repl_offset:29128
  12. slave_priority:100
  13. slave_read_only:1
  14. connected_slaves:0
  15. master_repl_offset:0
  16. repl_backlog_active:0
  17. repl_backlog_size:1048576
  18. repl_backlog_first_byte_offset:0
  19. repl_backlog_histlen:0
  20. [wch@localhost bin]./redis-cli -192.168.110.103 info Replication
  21. # Replication
  22. role:master
  23. connected_slaves:1
  24. slave0:ip=192.168.110.102,port=6379,state=online,offset=30456,lag=1
  25. master_repl_offset:30456
  26. repl_backlog_active:1
  27. repl_backlog_size:1048576
  28. repl_backlog_first_byte_offset:2
  29. repl_backlog_histlen:30455
  30. [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. [wch@localhost bin]./redis-cli -192.168.110.101 info Replication
  4. # Replication
  5. role:slave
  6. master_host:192.168.110.103
  7. master_port:6379
  8. master_link_status:up
  9. master_last_io_seconds_ago:1
  10. master_sync_in_progress:0
  11. slave_repl_offset:57657
  12. slave_priority:100
  13. slave_read_only:1
  14. connected_slaves:0
  15. master_repl_offset:0
  16. repl_backlog_active:0
  17. repl_backlog_size:1048576
  18. repl_backlog_first_byte_offset:0
  19. repl_backlog_histlen:0
  20.  
  21. [wch@localhost bin]./redis-cli -192.168.110.102 info Replication
  22. # Replication
  23. role:slave
  24. master_host:192.168.110.103
  25. master_port:6379
  26. master_link_status:up
  27. master_last_io_seconds_ago:0
  28. master_sync_in_progress:0
  29. slave_repl_offset:60751
  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 -192.168.110.103 info Replication
  40. # Replication
  41. role:master
  42. connected_slaves:2
  43. slave0:ip=192.168.110.102,port=6379,state=online,offset=63247,lag=1
  44. slave1:ip=192.168.110.101,port=6379,state=online,offset=63247,lag=1
  45. master_repl_offset:63393
  46. repl_backlog_active:1
  47. repl_backlog_size:1048576
  48. repl_backlog_first_byte_offset:2
  49. repl_backlog_histlen:63392
  50. [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 -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. [wch@localhost bin]./redis-cli -192.168.110.102 info Replication
  20. # Replication
  21. role:slave
  22. master_host:192.168.110.103
  23. master_port:6379
  24. master_link_status:down
  25. master_last_io_seconds_ago:-1
  26. master_sync_in_progress:0
  27. slave_repl_offset:184231
  28. master_link_down_since_seconds:52
  29. slave_priority:100
  30. slave_read_only:1
  31. connected_slaves:0
  32. master_repl_offset:0
  33. repl_backlog_active:0
  34. repl_backlog_size:1048576
  35. repl_backlog_first_byte_offset:0
  36. repl_backlog_histlen:0
  37. [wch@localhost bin]./redis-cli -192.168.110.103 info Replication
  38. 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.101 6379 2 最后一个参数是2导致,若是但节点此配置的最后一个参数要使用是1。(此原因我已证实)
注意: 在生产环境下建议 sentinel节点的数量能在3个以上,并且最好不要在同一台机器上(使用同一网卡)。

猜你喜欢

转载自blog.csdn.net/guying4875/article/details/79127965