知识点

相关文章

更多

最近更新

更多

redis sentinel(哨兵) 配置详解-redis集群管理

2019-03-19 22:00|来源: 网路

1. redis sentinel(哨兵)
redis sentinel(哨兵)是对Redis系统的运行情况的监控,它是一个独立进程。它的功能有2个:
a、 监控主数据库和从数据库是否运行正常;
b、 主数据出现故障后自动将从数据库转化为主数据库;


2. 原理

单个redis sentinel(哨兵)架构:


多个redis sentinel(哨兵)架构:


多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控。


3. 配置redis sentinel(哨兵)前的主从环境

当前处于一主多从的环境中:
[root@master redis-master-slave]# ps -ef | grep redis
root      2027     1  0 07:30 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:6380                              
root      2031     1  0 07:31 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:6381                              
root      2036     1  0 07:31 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:6382


127.0.0.1:6380> info replication

# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=113,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=113,lag=1
master_repl_offset:113
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:112


4. 配置哨兵

把源码中的sentinel.conf配置文件拷贝到指定目录,我这里是拷贝到/opt/redis/redis-master-slave
[root@master redis-master-slave]# cp /opt/redis/redis-3.2.1/sentinel.conf /opt/redis/redis-master-slave/


修改sentinel.conf:

sentinel monitor mymaster 127.0.0.1 6379 2
改为
sentinel monitor mymaster 127.0.0.1 6380 1


启动哨兵进程:

[root@master redis-master-slave]# /usr/local/bin/redis-sentinel /opt/redis/redis-master-slave/sentinel.conf

由上图可以看到:

1、 哨兵已经启动,它的id为236f14b361fc5a0dc0621cf88823ed6e6252b2f3
2、 为master数据库添加了一个监控
3、 发现了2个slave(由此可以看出,哨兵无需配置slave,只需要指定master,哨兵会自动发现slave)


5. 从Redis宕机测试

把其中一个从redis 的进程6382 kill掉,
[root@master hadoop]# ps -ef | grep redis
root      2027     1  0 07:30 ?        00:00:02 /usr/local/bin/redis-server 127.0.0.1:6380                              
root      2031     1  0 07:31 ?        00:00:02 /usr/local/bin/redis-server 127.0.0.1:6381                              
root      2036     1  0 07:31 ?        00:00:02 /usr/local/bin/redis-server 127.0.0.1:6382                              
root      2043  1937  0 07:32 pts/1    00:00:00 /usr/local/bin/redis-cli -p 6380
root      2044  1950  0 07:32 pts/2    00:00:00 /usr/local/bin/redis-cli -p 6381
root      2045  1965  0 07:32 pts/3    00:00:00 /usr/local/bin/redis-cli -p 6382
root      2461  1817  0 08:14 pts/0    00:00:00 /usr/local/bin/redis-sentinel *:26379 [sentinel]                        
root      2471  2179  0 08:18 pts/4    00:00:00 grep redis
[root@master hadoop]# kill -9 2036


30秒后哨兵的控制台输出:

2461:X 18 Jul 08:19:49.922 # +sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
说明已经监控到刚才我人kill掉的slave宕机了


启动刚才kill掉的6382

[root@master redis-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-master-slave/6382/redis.conf


观察sentinel控制台输出:

2461:X 18 Jul 08:24:27.580 * +reboot slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:24:27.631 # -sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380


可以看出,slave重新加入到了主从复制中。-sdown:说明是恢复服务。

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=67317,lag=0
slave1:ip=127.0.0.1,port=6382,state=online,offset=67184,lag=0
master_repl_offset:67317
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:67316


6. 主Redis宕机测试

把主redis的进程kill掉,观察sentinel控制台输出信息:
2461:X 18 Jul 08:29:19.276 #   +sdown master mymaster 127.0.0.1 6380【 master服务已经宕机
2461:X 18 Jul 08:29:19.276 # +odown master mymaster 127.0.0.1 6380 #quorum 1/1
2461:X 18 Jul 08:29:19.276 # +new-epoch 1
2461:X 18 Jul 08:29:19.276 #   +try-failover master mymaster 127.0.0.1 6380【尝试恢复master】
2461:X 18 Jul 08:29:19.282 # +vote-for-leader 236f14b361fc5a0dc0621cf88823ed6e6252b2f3 1 投票选举哨兵leader,现在就一个哨兵所以leader就自己
2461:X 18 Jul 08:29:19.282 # +elected-leader master mymaster 127.0.0.1 6380 【选出leader】
2461:X 18 Jul 08:29:19.282 # +failover-state-select-slave master mymaster 127.0.0.1 6380 【选中其中的一个slave当做master】
2461:X 18 Jul 08:29:19.345 #   +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380【选中6381当master】
2461:X 18 Jul 08:29:19.345 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【发送slaveof no one命令】
2461:X 18 Jul 08:29:19.401 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【等待升级master】
2461:X 18 Jul 08:29:20.291 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【升级6381为master】
2461:X 18 Jul 08:29:20.291 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:20.361 * +slave-reconf-sent slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:20.666 * +slave-reconf-inprog slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:21.694 * +slave-reconf-done slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:21.770 #   +failover-end master mymaster 127.0.0.1 6380【 故障恢复完成
2461:X 18 Jul 08:29:21.770 #   +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6381【master 从6380切换到6381】
2461:X 18 Jul 08:29:21.771 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381 【添加6382为6381的从库】
2461:X 18 Jul 08:29:21.771 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 【添加6380为6381的从库】
2461:X 18 Jul 08:29:51.828 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 发现6380已经宕机,等待6380的恢复


查看主从复制信息可以看出,现在6381为master,有一个从库

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6382,state=online,offset=35213,lag=1
master_repl_offset:35346
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:35345


把6380恢复

[root@master redis-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-master-slave/6380/redis.conf
观察sentinel控制台输出信息:
2461:X 18 Jul 08:42:35.202 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2461:X 18 Jul 08:42:45.207 * +convert-to-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381


查看主从复制信息:

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6382,state=online,offset=56432,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=56432,lag=0
master_repl_offset:56432
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:56431


7. 配置多个哨兵

编辑sentinel.conf,设置两个监听
sentinel monitor mymaster2 127.0.0.1 6381 2
sentinel monitor mymaster 127.0.0.1 6381 1


启动sentinel服务

[root@master redis-master-slave]# /usr/local/bin/redis-sentinel /opt/redis/redis-master-slave/sentinel.conf


[root@master redis-master-slave]# ps -ef | grep redis

root      2031     1  0 07:31 ?        00:00:05 /usr/local/bin/redis-server 127.0.0.1:6381  
root      2486     1  0 08:24 ?        00:00:02 /usr/local/bin/redis-server 127.0.0.1:6382  
root      2536     1  0 08:42 ?        00:00:01 /usr/local/bin/redis-server 127.0.0.1:6380                              
root      2579  1817  0 08:58 pts/0    00:00:00 /usr/local/bin/redis-sentinel *:26379 [sentinel]                        
root      2603  2179  0 09:01 pts/4    00:00:00 grep redis


kill掉一个从redis 6382,观察sentinel控制台输出信息  

2579:X 18 Jul 09:01:56.999 # +sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster2 127.0.0.1 6381
2579:X 18 Jul 09:01:56.999 # +sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
恢复6382
2579:X 18 Jul 09:10:40.223 * +reboot slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster2 127.0.0.1 6381
2579:X 18 Jul 09:10:40.275 # -sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster2 127.0.0.1 6381
2579:X 18 Jul 09:10:40.478 * +reboot slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:10:40.561 # -sdown slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381


停止主redis

2579:X 18 Jul 09:12:29.324 # +sdown master mymaster2 127.0.0.1 6381
2579:X 18 Jul 09:12:29.324 # +sdown master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.324 # +odown master mymaster 127.0.0.1 6381 #quorum 1/1
2579:X 18 Jul 09:12:29.324 # +new-epoch 2
2579:X 18 Jul 09:12:29.324 # +try-failover master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.329 # +vote-for-leader 236f14b361fc5a0dc0621cf88823ed6e6252b2f3 2
2579:X 18 Jul 09:12:29.329 # +elected-leader master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.329 # +failover-state-select-slave master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.382 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.382 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:29.459 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:30.113 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:30.113 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:30.162 * +slave-reconf-sent slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:30.338 * +slave-reconf-inprog slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:31.343 * +slave-reconf-done slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:31.410 # +failover-end master mymaster 127.0.0.1 6381
2579:X 18 Jul 09:12:31.410 # +switch-master mymaster 127.0.0.1 6381 127.0.0.1 6380
2579:X 18 Jul 09:12:31.411 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2579:X 18 Jul 09:12:31.411 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380


查看主从复制信息

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6382,state=online,offset=3671,lag=1
master_repl_offset:3671
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:3670


书生整理于网络


redis知识点

redis快速入门

reids常用命令

redis数据结构

java_API_客户端

Jedis

Tlcache

redis_持久化

AOF

RDB

发布订阅(pub/sub)

redis_事件

redis事务

redis通讯协议

RESP(Redis Serialization Protocol)

redis高可用

redis哨兵

监控(Monitoring) 提醒(Notification) 自动故障迁移(Automatic failover)

redis主从复制

  • 复制模式

    1. 主从复制
    2. 从从复制
  • 复制过程

    • slave向master发送sync命令;
    • master开启子进程执行bgsave写入rdb文件;
    • master发送缓存和RDB文件给slave;
    • master发送数据发送给slave完成复制;

redis集群(Redis_Cluster)

相关问答

更多
  • 1):Master状态检测 2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave 3):Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换 !
  • 先停止sentinel,然后在修改配置,完成后再启动sentinel 如果没有停止,修改好了,停止的时候sentinel会自动把内存的值同步到配置文档中
  • 先停止sentinel,然后在修改配置,完成后再启动sentinel 如果没有停止,修改好了,停止的时候sentinel会自动把内存的值同步到配置文档中
  • 首先,让谈话哨兵。 Sentinel管理故障转移,它不配置Redis for HA。 这是一个重要的区别。 其次,您发布的图实际上是一个不好的设置 - 您不想在与其正在管理的Redis节点相同的节点上运行Sentinel。 当你失去主机时,你会失去两者。 至于“浪费资源吗?” 这取决于你的用例。 在该设置中,您不需要三个Redis节点,您只需要两个。 三个增加您的冗余,但不是必需的。 如果您需要添加冗余,那么它不会浪费资源。 如果您不需要冗余,那么您只需运行一个Redis实例,并将其称之为良好,因为运行更多 ...
  • 在配置标记时,我配置了一次sentinel,然后将该配置文件复制到其他所有标记上。 在复制配置之前,我必须启动sentinel并重新编写配置文件,其ID如下: sentinel myid c766a0df56e72eda48cea984 当我将文件复制到其他标记时,它会使每个文件具有相同的ID,这反过来又导致它们忽略来自具有相同id的自动发现的任何消息。 从每个配置文件中删除myid行并重新启动每个sentinel进程修复了该问题。 In configuring the sentinels, I conf ...
  • 没有直接命令从主/从节点获取标记列表。 要获得哨兵列表,您需要订阅任何节点的pub / sub(主或从无关紧要)“__sentinel __:hello”频道并等待消息。 通过该hello通道的消息来自正在侦听该群集的标记。 如果你解析那些,你会得到哨兵的地址。 消息的格式为:“sentinel_ip,sentinel_port,sentinel_runid,sentinel_current_epoch,master_name,master_ip,master_port,master_config_epoc ...
  • 查看您发布的配置文件似乎设置错误,您的群集名称有变化mymaster和redis2尝试以下操作 # Process Info port 26379 daemonize yes pidfile "/var/run/redis/sentinel.pid" # Log files loglevel notice logfile "/var/log/redis/sentinel.log" # Master setup sentinel monitor redis2 10.0.2.94 6379 2 sentin ...
  • 我可能错过了它,但我不知道你可以配置它从奴隶读取? 但是,这是我的主+ 2从属配置: config.cache_store = :redis_store, { url: 'redis://prestwick/1', sentinels: [{host: 'prestwick.i', port: 26379}, {host: 'carnoustie.i', port: 26379}, {host: 'birkdale.i', port: 26379}], role: 'master', ...
  • 我可以自己回答。 问题是在sentinel conf中出现的第一个IP是localhost ip。 它需要是绑定IP。 以防它为任何人服务。 I can answer myself. The problem was that the first IP that appeared in the sentinel conf was the localhost ip. It needs to be the binding IP. Just in case it serves anyone.
  • 使用Redis群集时不需要Sentinel。 如果任何主实例发生任何问题,Redis群集将执行自动故障转移。 来自Redis Essentials的书: Redis Sentinel和Redis Cluster具有很多特性,但每个都有自己的目标。 Sentinel的目标是在主/从拓扑中提供可靠的自动故障转移,而无需分片数据。 Cluster的目标是在不同的Redis实例之间分发数据,并在任何主实例发生任何问题时执行自动故障转移。 You don't need Sentinel when using Redi ...