哨兵模式
docker-compose搭建哨兵模式 由于服务器不太行,搭建的是一主二从一哨兵
目前的状态,一主二从 参考我之前的帖子大家一主二从的环境
参考bolg
https://blog.csdn.net/qq_33067315/article/details/114995533
https://www.jianshu.com/p/871463e2705e
-
创建如下配置文件目录
sentinel-1/ ├── conf │ ├── redis.conf #这个没必要。可以不用 │ └── sentinel.conf #哨兵配置文件 ├── data ├── docker-compose.yml #docker-compose启动配置文件 └── logs └── sentinel1.log #日志文件
-
==添加主机和从机==的配置(从机中的redis.conf),第一次尝试时没有添加,造成选举不成功
#设置访问密码,主机和从机必须设置,当主机宕机重启后已经变为从机了,需要填写从机的密码(主机和从机密码都设置为一样)。 masterauth "password" #slave向master通告自己的固定ip slave-announce-ip 114.55.6.45 #slave向master通告自己的固定端口 slave-announce-port 6381
-
配置哨兵配置文件sentinel.conf
# bind 127.0.0.1 logfile "/usr/local/redis/logs/sentinel.log" port 26379 dir "/data" # 设定密码认证 requirepass Sun-Tree # 配置哨兵的监控参数 # 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum> # master-name是为这个被监控的master起的名字 # ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名 # redis-port是被监控节点所监听的端口号 # quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了 sentinel monitor sentinel-master 114.55.6.45 6380 1 # sentinel monitor sentinel-slave-1 114.55.6.45 6381 1 # sentinel monitor sentinel-slave-2 114.55.6.45 6382 1 # 连接主节点的密码 # 格式:sentinel auth-pass <master-name> <password> sentinel auth-pass sentinel-master Sun-Tree # sentinel auth-pass sentinel-slave-1 Sun-Tree # sentinel auth-pass sentinel-slave-2 Sun-Tree # master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒 # sentinel down-after-milliseconds local-master 30000 #docker无权限手动配置 报告自己的ip, 之前没加,选举不成功 sentinel announce-ip 114.55.6.45 sentinel announce-port 26379 #后台执行 daemonize no
后面的这个数字1,代表主机挂了,slave投票看让谁接替成为主机,票数最多的,就会成为主机!
-
修改docker-compose.yml 文件
version: '3' services: redis: image: "redis:6.2.3" container_name: "redis-sentinel-1" #修改容器名,不能和已有的重复 #network_mode: "host" restart: always volumes: - ./data:/data - ./conf/redis.conf:/usr/local/etc/redis/redis.conf #这个配置没用可以删 - ./conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf #映射哨兵配置 - ./logs:/usr/local/redis/logs #后面的内部log日志目录和配置文件中的一致 command: # 以配置文件的方式启动 sentinel.conf 哨兵模式 redis-sentinel /usr/local/etc/redis/sentinel.conf ports: - 26379:26379 #修改映射端口,前面的宿主机端口不能重复。后面的内部端口和配置文件中的一致
-
启动哨兵
docker-compose up -d
测试
关闭当前主机,查看哨兵会不会自动选举主机
-
关闭主机
docker-redis-master:0>shutdown
-
查看从机
#从机1 docker-redis-slave-1:0>info replication "# Replication role:slave master_host:114.55.6.45 master_port:6380 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_repl_offset:108553 master_link_down_since_seconds:43 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:ab3b9c946f3d56785cc6e9a7e28de7156d5a3016 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:108553 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:843 repl_backlog_histlen:107711 " #从机2 docker-redis-slave-2:0>info replication "# Replication role:slave master_host:114.55.6.45 master_port:6380 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_repl_offset:108553 master_link_down_since_seconds:34 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:ab3b9c946f3d56785cc6e9a7e28de7156d5a3016 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:108553 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:108553 "
发现关闭主机后,从机1和从机2仍然是从机,并且都检测到了主机down掉了。
哨兵需要一段时间选举出新的主机。
-
查看哨兵日志
1:X 18 May 2021 02:45:25.886 # +sdown master sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:25.886 # +odown master sentinel-master 114.55.6.45 6380 #quorum 1/1 1:X 18 May 2021 02:45:25.886 # +new-epoch 1 1:X 18 May 2021 02:45:25.886 # +try-failover master sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:25.890 # Could not rename tmp config file (Device or resource busy) 1:X 18 May 2021 02:45:25.890 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy 1:X 18 May 2021 02:45:25.890 # +vote-for-leader 46f3b559e2ad0133b7e7c467b82e31d702633f37 1 1:X 18 May 2021 02:45:25.890 # +elected-leader master sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:25.890 # +failover-state-select-slave master sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:25.948 # +selected-slave slave 114.55.6.45:6382 114.55.6.45 6382 @ sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:25.948 * +failover-state-send-slaveof-noone slave 114.55.6.45:6382 114.55.6.45 6382 @ sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:26.001 * +failover-state-wait-promotion slave 114.55.6.45:6382 114.55.6.45 6382 @ sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:26.710 # Could not rename tmp config file (Device or resource busy) 1:X 18 May 2021 02:45:26.710 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy 1:X 18 May 2021 02:45:26.710 # +promoted-slave slave 114.55.6.45:6382 114.55.6.45 6382 @ sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:26.711 # +failover-state-reconf-slaves master sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:26.782 * +slave-reconf-sent slave 114.55.6.45:6381 114.55.6.45 6381 @ sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:27.743 * +slave-reconf-inprog slave 114.55.6.45:6381 114.55.6.45 6381 @ sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:27.743 * +slave-reconf-done slave 114.55.6.45:6381 114.55.6.45 6381 @ sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:27.808 # +failover-end master sentinel-master 114.55.6.45 6380 1:X 18 May 2021 02:45:27.808 # +switch-master sentinel-master 114.55.6.45 6380 114.55.6.45 6382 1:X 18 May 2021 02:45:27.808 * +slave slave 114.55.6.45:6381 114.55.6.45 6381 @ sentinel-master 114.55.6.45 6382 1:X 18 May 2021 02:45:27.809 * +slave slave 114.55.6.45:6380 114.55.6.45 6380 @ sentinel-master 114.55.6.45 6382 1:X 18 May 2021 02:45:27.813 # Could not rename tmp config file (Device or resource busy) 1:X 18 May 2021 02:45:27.813 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy 1:X 18 May 2021 02:45:57.830 # +sdown slave 114.55.6.45:6380 114.55.6.45 6380 @ sentinel-master 114.55.6.45 6382
可以看到哨兵的选举log
-
查看从机信息
#从机1 docker-redis-slave-1:0>info replication "# Replication role:slave master_host:114.55.6.45 master_port:6382 master_link_status:up master_last_io_seconds_ago:2 master_sync_in_progress:0 slave_repl_offset:35769 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:a9f3af4c77d2b93f07fda187e0d6998fb8ce1c7f master_replid2:de977041667a7854434a7f359d16127124918e4f master_repl_offset:35769 second_repl_offset:26205 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:35769 " #从机2 "# Replication role:master #变为主机了 connected_slaves:1 slave0:ip=114.55.6.45,port=6381,state=online,offset=38115,lag=1 master_failover_state:no-failover master_replid:a9f3af4c77d2b93f07fda187e0d6998fb8ce1c7f master_replid2:de977041667a7854434a7f359d16127124918e4f master_repl_offset:38259 second_repl_offset:26205 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:16532 repl_backlog_histlen:21728 "
发现哨兵选举从机2变为主机了
-
重新启动原来的主机
查看哨兵打印
1:X 18 May 2021 09:03:19.485 * +slave slave 114.55.6.45:6380 114.55.6.45 6380 @ sentinel-master 114.55.6.45 6382 1:X 18 May 2021 09:03:19.488 # Could not rename tmp config file (Device or resource busy) 1:X 18 May 2021 09:03:19.489 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy 1:X 18 May 2021 09:03:49.518 # +sdown slave 114.55.6.45:6380 114.55.6.45 6380 @ sentinel-master 114.55.6.45 6382 1:X 18 May 2021 09:04:06.481 # -sdown slave 114.55.6.45:6380 114.55.6.45 6380 @ sentinel-master 114.55.6.45 6382 1:X 18 May 2021 09:04:16.474 * +convert-to-slave slave 114.55.6.45:6380 114.55.6.45 6380 @ sentinel-master 114.55.6.45 6382
发现启动主机,只能归并到现在的主机下,成为从机。所以原来的主机只能当做从机2的从机了。
优缺点
优点:
- 哨兵集群,基于主从复制模式,所有的主从撇值优点都有
- 主从可以切换,故障可以转移,系统的可用性就会更好
- 哨兵模式就是主从模式的升级,手动到自动。
缺点:
- Redis不好在线扩容,集群容量一旦达到上限,在线扩容就十分麻烦
- 实现哨兵模式的配置是很麻烦的,里面有很多选择
哨兵的全部配置
# Example sentinel. conf
#哨兵 sentinel1实例运行的端口默认26379
port 26379
#哨兵 sentinel的工作目录
dir /tmp
#哨兵 sentinel监控的 redis主节点的 ip port
#master-name可以自己命名的主节点名字只能由字母A-z、数字0-9、这三个字符",-_"组成。
#quorum配置多少个sentinel哨兵统一认为 master主节点失联那么这时客观上认为主节点失联了
#sentinel monitor <master-name> <ip><redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
#当在 Redis实例中开启了 requirepass foobared 授权密码 这样所有连接 Redis实例的客户端都要提供密码
#设置哨兵 sentinel连接主从的密码注意必须为主从设置一样的验证密码
sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster Mysuper--secret-0123passw0rd
#指定多少毫秒之后主节点没有应答哨兵 sentinel此时哨兵主观上认为主节点下线默认30秒
sentinel down-after-mil1iseconds <master-name> <milliseconds>
sentinel down-after-mil1iseconds mymaster 30000
#这个配置项指定了在发生fai1over主备切换时最多可以有多少个s1ave同时对新的 master进行同步,
#这个数字越小,完成 Failover所需的时间就越长,
#但是如果这个数字越大,就意味着越多的s1ave因为rep1 cation而不可用。 可以通过将这个值设为1来保证每次只有一个s1ave处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
#并故障转移的超时时间fai1over- timeout可以用在以下这些方面:
#1.同一个 sentinel对同一个 master两次fai1over之间的间隔时间。
#2.当一个save从一个错误的 master那里同步数据开始计算时间。直到s1ave被纠正为向正确的 master那里同步数据时。
#3.当想要取消一个正在进行的fai1over所需要的时间。
#4.当进行 failover时,配置所有s1aves指向新的 master所需的最大时间。不过,即使过了这个超时,s1aves依然会被正确配置为指向 master,但是就不按 parallel-syncs所配置的规则来了
#默认三分钟
#sentinel failover-timeout <master-name><milliseconds>
sentinel fai lover-timeout mymaster 180000
#SCRIPTS EXECUTION
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。 对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKエLL信号终止,之后重新执行
#通知型脚本:当 sentinel有任何警告级别的事件发生时(比如说 redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个
#脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,
#个是事件的描述。如果 sen tne1.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则 sentinel1无法正常启动成功。
#通知脚本
#sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/notify. sh
#客户端重新配置主节点参数脚本
#当一个 master由于 fail over而发生改变时,这个脚本将会被调用,通知相关的客户端关于 master地址已经发生改变的信息.。
#以下参数将会在调用脚本时传给脚本:
#<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
#目前<state>总是" failover
#<ro1e>是“leader'或者“ observer"中的一个。
#参数from-ip,from-port,to-ip,to-port是用来和旧的 master和新的 master(即旧的save)通信的
#这个脚本应该是通用的,能被多次调用,不是针对性的。
#sentinel ctlent-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh