Redis 哨兵模式安装部署
什么是哨兵?
Sentinel 其实也是一个 redis 的服务端程序,它也会定时执行 serverCron 函数,只是里面其他的程序用不到,用到的是对普通 redis 节点的监控以及故障转移模块。
Sentinel 初始化的时候会清空原来的命令表,写入自己独有的命令进去,所以普通 redis 节点支持的数据读写命令,对 Sentinel 来说都是找不到命令,因为它根本就没有初始化这些命令的执行器。
Sentinel 会定时的对自己监控的 master 执行 info 命令,获取最新的主从关系,还会定时的给所有的 redis 节点发送 ping 心跳检测命令,如果检测到某个 master 无法响应了,就会在给其他 Sentinel 发送消息,主观认为该 master 宕机,如果 Sentinel 集群认同该 master 下线的人数达到一个值,那么大家统一意见,下线该 master。
下线之前需要做的是找 Sentinel 集群中的某一个来执行下线操作,这个步骤叫领导者选举,选出来以后会从该 master 所有的 slave 节点中挑一个合适的作为新的 master,并让其他 slave 重新同步新的 master。
其实以上我们就简单的介绍了 Sentinel 是什么,本质上做了哪些事情,等下我们会结合源码细说其中的细节实现。这里我们再看下,如何配置并启动一个 Sentinel 监控。(生产环境建议配置大于三个
哨兵模式配置
- 准备三台机器或者三个redis实例
hadoop001 hadoop002 hadoop3 分别安装 redis
hadoop001:192.168.52.50
hadoop002:192.168.52.52
hadoop003:192.168.52.53
设定hadoop001 为master 节点,hadoop002 位slave节点,hadoop003 为sentinel节点
- master节点编辑配置文件:cp redis.conf master.conf
daemonize yes #设置redis在后台启动
bind 0.0.0.0 # 注释掉bind 127.0.0.1
port 16379
slave-read-only no
protected-mode no
# 如果AOF开启,那么在启动时Redis将加载AOF文件,它更能保证数据的可靠性。
appendonly no
- slave节点编辑配置文件:cp redis.conf slave.conf
daemonize yes # 设置redis在后台启动)
bind 0.0.0.0 # 注释掉bind 127.0.0.1
port 26379
slaveof 192.168.52.50 16379
slave-read-only no
protected-mode no
slave 与master 的不同点在于:
# pid file
pidfile /usr/local/redis-4.0.8/redis_slave/redis_slave.pid
# 监听端口
port 7002
# 指明日志文件名
logfile "./redis7002.log"
# 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof 127.0.0.1 7001
# 当master服务设置了密码保护时,slav服务连接master的密码
masterauth testmaster123
#(默认情况下redis数据库充当slave角色时是只读的不能进行写操作 可以在配置文件中开启非只读:slave-read-only no)
- sentinel节点编辑配置文件:sentinel.conf
protected-mode no
daemonize yes # 设置redis在后台启动)
port 26380
logfile "./sentinel1.log"
dir ./
sentinel monitor master 10.17.12.46 26379 1
sentinel known-replica master 127.0.0.1 16379
sentinel current-epoch 11101
sentinel down-after-milliseconds master1 5000
sentinel failover-timeout master1 900000
sentinel parallel-syncs master1 2
# 设置master和slaves验证密码
# sentinel auth-pass TestMaster testmaster123
# 除了当前哨兵, 还有哪些在监控这个master的哨兵
# sentinel known-sentinel TestMaster 127.0.0.1 8002 0aca3a57038e2907c8a07be2b3c0d15171e44da5
# sentinel known-sentinel TestMaster 127.0.0.1 8003 ac1ef015411583d4b9f3d81cee830060b2f29862
- 其他的配置项信息可自行修改也可用默认
protected-mode no (关闭保护模式)
port 6379
daemonize yes (设置redis在后台启动)
pidfile /var/run/redis_6379.pid
logfile "/opt/module/redis/6379/logs/redis_6379.log" (设置日志文件的存放位置)
dbfilename dump_6379.rdb (设置dump文件名)
dir "/opt/module/redis/6379" (设置dump文件和nodes文件的存放位置)
masterauth bigdata (设置集群节点间访问密码,跟上面一致)
requirepass bigdata (设置redis访问密码)
启动redis服务
- 启动Master
redis-server master.conf
- 启动Slave
redis-server slave.conf
- 启动Sentineld
redis-sentinel sentinel.conf
4.连接redis客户端查看配置信息
redis-cli -p 16379
[root@redis01 src]# redis-cli -p 16379
127.0.0.1:16379> INFO replication
# Replication
role:master ---------------------> 角色为master
connected_slaves:1 ---------------------> slave 连接数为1
slave0:ip=172.31.17.229,port=26379,state=online,offset=183125,lag=0
master_replid:a7e8d31a7cca92f659dc1af9d6556e2d039588b8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:183125
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:183125
[root@redis02 redis-sentinel]# redis-cli -p 26379
127.0.0.1:26379> INFO replication
# Replication
role:slave ---------------------> 角色为slave
master_host:172.31.31.130
master_port:16379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:185981
slave_priority:100
slave_read_only:0
connected_slaves:0
master_replid:a7e8d31a7cca92f659dc1af9d6556e2d039588b8
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:185981
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:71
repl_backlog_histlen:185911
测试Redis可用
在master节点设置值,然后在slave节点查看是否能够同步
127.0.0.1:16379[1]> set test6 666
127.0.0.1:16379[1]> keys *
1) "test6"
2) "test5"
3) "test1"
4) "test3"
127.0.0.1:26379[1]> keys *
1) "test1"
2) "test5"
3) "test3"
4) "test6"
127.0.0.1:26379[1]> get test6
"666"