redis哨兵

1哨兵的作用

哨兵是redis集群架构中非常重要的一个组件,主要功能如下:
1. 集群监控:负责监控redis master和slave进程是否正常工作
2. 消息通知:如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
3. 故障转移:如果master node挂掉了,会自动转移到slave node上
4. 配置中心:如果故障转移发生了,通知client客户端新的master地址

原文链接:https://blog.csdn.net/wang258533488/article/details/79352378

 

23台服务器部署及规划

主节点服务器:10.0.0.101

从节点服务器1:10.0.0.102

从节点服务器2:10.0.0.103

节点规划:

哨兵节点:26379

redis节点:6379

10.0.0.101:

cat /opt/redis_6379/conf/redis_6379.conf
daemonize yes
bind 127.0.0.1 10.0.0.101
port 6379
pidfile /opt/redis_6379/pid/redis_6379.pid
logfile /opt/redis_6379/logs/redis_6379.log
save 900 1
save 300 10
save 60 10000
dbfilename redis.rdb
dir /data/redis_6379/
appendonly yes
appendfilename "redis.aof"
appendfsync everysec

 

10.0.0.102:

ssh-keygen

ssh-copy-id 10.0.0.101

pkill redis

rm -rf /opt/redis*

rsync -avz 10.0.0.101:/usr/local/bin/redis-* /usr/local/bin

rsync -avz 10.0.0.101:/usr/lib/systemd/system/redis.service /usr/lib/systemd/system/

mkdir /opt/redis_6379/{conf,logs,pid} -p

mkdir /data/redis_6379 -p

cat >/opt/redis_6379/conf/redis_6379.conf <<EOF

daemonize yes

bind 127.0.0.1 $(ifconfig eth0|awk 'NR==2{print $2}')

port 6379

pidfile "/opt/redis_6379/pid/redis_6379.pid"

logfile "/opt/redis_6379/logs/redis_6379.log"

dbfilename "redis.rdb"

dir "/data/redis_6379"

appendonly yes

appendfilename "redis.aof"

appendfsync everysec

EOF

useradd redis -M -s /sbin/nologin

chown -R redis:redis /opt/redis*

chown -R redis:redis /data/redis*

systemctl daemon-reload

systemctl start redis

redis-cli

 

10.0.0.103:

ssh-keygen

ssh-copy-id 10.0.0.101

pkill redis

rm -rf /opt/redis*

rsync -avz 10.0.0.101:/usr/local/bin/redis-* /usr/local/bin

rsync -avz 10.0.0.101:/usr/lib/systemd/system/redis.service /usr/lib/systemd/system/

mkdir /opt/redis_6379/{conf,logs,pid} -p

mkdir /data/redis_6379 -p

cat >/opt/redis_6379/conf/redis_6379.conf <<EOF

daemonize yes

bind 127.0.0.1 $(ifconfig eth0|awk 'NR==2{print $2}')

port 6379

pidfile "/opt/redis_6379/pid/redis_6379.pid"

logfile "/opt/redis_6379/logs/redis_6379.log"

dbfilename "redis.rdb"

dir "/data/redis_6379"

appendonly yes

appendfilename "redis.aof"

appendfsync everysec

EOF

useradd redis -M -s /sbin/nologin

chown -R redis:redis /opt/redis*

chown -R redis:redis /data/redis*

systemctl daemon-reload

systemctl start redis

redis-cli

 

3配置主从复制(命令在任何一个节点服务器上操作都可以)

redis-cli -h 10.0.0.102 slaveof 10.0.0.101 6379

redis-cli -h 10.0.0.103 slaveof 10.0.0.101 6379

redis-cli -h 10.0.0.101 info replication

 

4哨兵部署(3台服务器同样配置)

mkdir -p /data/redis_26379

mkdir -p /opt/redis_26379/{conf,pid,logs}

cat >/opt/redis_26379/conf/redis_26379.conf << EOF

bind $(ifconfig eth0|awk 'NR==2{print $2}')

port 26379

daemonize yes

logfile /opt/redis_26379/logs/redis_26379.log

dir /data/redis_26379

sentinel monitor myredis 10.0.0.101 6379 2

sentinel down-after-milliseconds myredis 3000

sentinel parallel-syncs myredis 1

sentinel failover-timeout myredis 18000

EOF

chown -R redis:redis /data/redis*

chown -R redis:redis /opt/redis*

cat >/usr/lib/systemd/system/redis-sentinel.service<<EOF

[Unit]

Description=Redis persistent key-value database

After=network.target

After=network-online.target

Wants=network-online.target

[Service]

ExecStart=/usr/local/bin/redis-sentinel /opt/redis_26379/conf/redis_26379.conf --supervised systemd

ExecStop=/usr/local/bin/redis-cli -h $(ifconfig eth0|awk 'NR==2{print $2}') -p 26379 shutdown

Type=notify

User=redis

Group=redis

RuntimeDirectory=redis

RuntimeDirectoryMode=0755

[Install]

WantedBy=multi-user.target

EOF

systemctl daemon-reload

systemctl start redis-sentinel

redis-cli -h $(ifconfig eth0|awk 'NR==2{print $2}') -p 26379

 

关键配置解释:

sentinel monitor myredis 10.0.0.101 6379 2

# myredis主节点别名 主节点IP 端口 需要2个哨兵节点同意

sentinel down-after-milliseconds myredis 3000

# 认定服务器已经断线所需要的毫秒数

sentinel parallel-syncs myredis 1

# 向主节点发送复制操作的从节点个数,1表示轮训发起复制

sentinel failover-timeout myredis 18000

# 故障转移超时时间

参考文档:https://www.cnblogs.com/heroinss/p/10340925.html

 

5注意事项

1.哨兵发起故障转移的条件是master节点失去联系,从节点挂掉不会发起故障转移

2.哨兵会自己维护配置文件,不需要手动修改

3.如果主从的结构发生变化,哨兵之间会自动同步最新的消息并且自动更新配置文件

4.哨兵启动完成之后,以后不要再自己去设置主从关系

 

6验证主机点

[root@oldboyedu ~]# redis-cli -h 10.0.0.101 -p 26379 sentinel get-master-addr-by-name myredis
1) "10.0.0.101"
2) "6379"

7哨兵常用命令

#获取当前master地址

redis-cli -h 10.0.0.101 -p 26379 SENTINEL get-master-addr-by-name myredis

#查看master状态

 

redis-cli -h 10.0.0.101 -p 26379 SENTINEL master myredis

 

redis-cli -h 10.0.0.101 -p 26379 SENTINEL slaves myredis

 

redis-cli -h 10.0.0.101 -p 26379 SENTINEL ckquorum myredis

 

8redis加权选举

#查看权重

redis-cli -h 10.0.0.101 -p 6379 CONFIG GET slave-priority

redis-cli -h 10.0.0.102 -p 6379 CONFIG GET slave-priority

redis-cli -h 10.0.0.103 -p 6379 CONFIG GET slave-priority

方法1:通过更改权重来选取master

设置10.0.0.103为mater

[root@oldboyedu ~]# redis-cli -h 10.0.0.101 -p 6379 config set slave-priority 0
OK
[root@oldboyedu ~]# redis-cli -h 10.0.0.102 -p 6379 config set slave-priority 0
OK

检查:

[root@oldboyedu ~]# redis-cli -h 10.0.0.103 -p 6379 config get slave-priority
1) "slave-priority"
2) "100"
[root@oldboyedu ~]# redis-cli -h 10.0.0.102 -p 6379 config get slave-priority
1) "slave-priority"
2) "0"
[root@oldboyedu ~]# redis-cli -h 10.0.0.101 -p 6379 config get slave-priority
1) "slave-priority"
2) "0"

[root@oldboyedu ~]# redis-cli -h 10.0.0.103 -p 26379 sentinel failover myredis
OK
[root@oldboyedu ~]# redis-cli -h 10.0.0.103 -p 26379 sentinel get-master-addr-by-name myredis
1) "10.0.0.103"
2) "6379"

 

方法2:主动发生选举(三台服务器的优先级都一样)

[root@oldboyedu ~]# redis-cli -h 10.0.0.102 -p 26379 sentinel failover myredis
OK
[root@oldboyedu ~]# redis-cli -h 10.0.0.102 -p 26379 SENTINEL get-master-addr-by-name myredis
1) "10.0.0.102"
2) "6379"

 

9哨兵故障转移流程简述

redis-sentinel故障转移的流程:
1.当多个sentinel发现并确认了master有问题。
2.接着会选举出一个sentinel作为领导。
3.再选举出一个slave作为master。
4.通知其余的slave,新的master是谁。
5.通知客户端一个主从的变化。
6.最后,sentinel会等待旧的master复活,然后将新master成为slave。

 

 

posted on 2021-07-08 18:38  弓长三寿  阅读(445)  评论(0编辑  收藏  举报