Redis主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower) ; 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。
默认情况下,每台Redis服务器都是主节点 ;
且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
redis主从复制流程:
- 从库发起同步请求
- 主库收到请求后执行bgsave保存当前内存里的数据到磁盘
- 主库将持久化的数据发送给从库的数据目录
- 从库收到主库的持久化数据之后,先清空自己当前内存中的所有数据
- 从库将主库发过来的持久化数据文件加载到自己内存
准备2台机器,配置可以参考:https://blog.csdn.net/weixin_43719988/article/details/120696830?spm=1001.2014.3001.5501
#进行配置redis2 [root@redis2 redis]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf ###以守护进程模式启动 daemonize yes ###绑定的主机地址 bind 10.0.0.32 ###监控端口 port 6379 ###pid文件和log文件的保存地址 pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log ###设置数据库的数量,默认数据库为0 databases 16 ###制定本地持久化文件的文件名,默认是dump.rdb dbfilename redis_6379.rdb ###触发条件 save 900 1 save 300 10 save 60 10000 ###本地数据库的目录 dir /data/redis_cluster/redis_6379 appendonly yes #每1个命令,都立即同步到aof appendfsync always ##每秒写1次 appendfsync everysec #写入工作交给操作系统,由操作系统判断缓冲区的大小,统一写入aof appendfsync no appendfilename "appendonly.aof" #进行启动 [root@redis2 redis]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf #配置主从,进行连接 [root@redis2 redis]# redis-cli -h 10.0.0.32 10.0.0.32:6379> SLAVEOF 10.0.0.31 6379 OK #断开连接 10.0.0.32:6379> SLAVEOF no one OK #先连接回来 10.0.0.32:6379> SLAVEOF 10.0.0.31 6379 OK #进行验证 #主库写 [root@redis1 conf]# redis-cli -h 10.0.0.31 10.0.0.31:6379> set k13 v33 OK #从库读 10.0.0.32:6379> get k13 "v33"Redis哨兵模式
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
哨兵主要功能
Redis的Sentinel系统用于管理多个Redis服务器。该系统执行以下三个任务:
- 监控:Sentinel会不断地定期检查你的主服务器和从服务器是否工作正常
- 提醒:当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知
- 自动故障迁移:当一个服务器不能正常工作的时候,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的服务器,当客户端试图连接失效服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器
安装环境:
| 主机名 | 角色 | IP | 端口 |
|---|---|---|---|
| redis1 | master | 10.0.0.31 | 6379 |
| redis1 | Sentinel01 | 10.0.0.31 | 26379 |
| redis2 | master | 10.0.0.32 | 6379 |
| redis1 | Sentinel02 | 10.0.0.32 | 26379 |
| redis3 | master | 10.0.0.33 | 6379 |
| redis1 | Sentinel03 | 10.0.0.33 | 26379 |
3台机器都做同样操作,修改redis_26379.conf就把ip换成各自的ip
[root@redis1 ~]# mkdir -p /data/redis_cluster/redis_26379
[root@redis1 ~]# mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
#把ip换成3台机器的ip
[root@redis1 ~]# vim /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 10.0.0.31
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379
#mymaster主节点别名 主节点ip 和端口,判断主节点失败,2个sentinel节点同意
sentinel monitor mymaster 10.0.0.31 6379 2
###选项指定了Sentinel认定服务器已经断线所需的毫秒数
sentinel down-after-milliseconds mymaster 3000
###向新的主节点发起复制的从节点个数,1轮询发起复制
sentinel parallel-syncs mymaster 1
###故障转移超时时间
sentinel failover-timeout mymaster 18000
#进行启动服务
[root@redis1 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@redis2 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@redis3 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
配置主从关系
redis2和redis3配置主从关系
[root@redis2 redis]# redis-cli -h 10.0.0.32 slaveof 10.0.0.31 6379 OK [root@redis3 redis]# redis-cli -h 10.0.0.33 slaveof 10.0.0.31 6379 OK
3台机器都启动哨兵命令
[root@redis1 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf [root@redis2 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf [root@redis3 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
Sentinel命令使用
[root@redis1 ~]# redis-cli -h 10.0.0.31 -p 26379
#Sentinel信息
10.0.0.31:26379> INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.31:6379,slaves=2,sentinels=3
#主节点信息
10.0.0.31:26379> Sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "10.0.0.31"
5) "port"
6) "6379"
7) "runid"
8) "b19b909a6b5d45a683797ad92eab356921ad3b59"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "8"
19) "last-ping-reply"
20) "8"
21) "down-after-milliseconds"
22) "3000"
23) "info-refresh"
24) "3669"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "264695"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "18000"
39) "parallel-syncs"
40) "1"
#整个组的信息
10.0.0.31:26379> Sentinel master mymaster
1) "name"
2) "mymaster"
3) "ip"
4) "10.0.0.31"
5) "port"
6) "6379"
7) "runid"
8) "b19b909a6b5d45a683797ad92eab356921ad3b59"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "209"
19) "last-ping-reply"
20) "209"
21) "down-after-milliseconds"
22) "3000"
23) "info-refresh"
24) "6495"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "367884"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "18000"
39) "parallel-syncs"
40) "1"
#查看从节点信息
10.0.0.31:26379> Sentinel slaves mymaster
1) 1) "name"
2) "10.0.0.33:6379"
3) "ip"
4) "10.0.0.33"
5) "port"
6) "6379"
7) "runid"
8) "ab69c7b2a9397f0ced1814b80bb19ea18f93e798"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "233"
19) "last-ping-reply"
20) "233"
21) "down-after-milliseconds"
22) "3000"
23) "info-refresh"
24) "4858"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "456489"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "10.0.0.31"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "35630"
2) 1) "name"
2) "10.0.0.32:6379"
3) "ip"
4) "10.0.0.32"
5) "port"
6) "6379"
7) "runid"
8) "cb8939628719123b6769440be045742016e71945"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "233"
19) "last-ping-reply"
20) "233"
21) "down-after-milliseconds"
22) "3000"
23) "info-refresh"
24) "4858"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "456490"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "10.0.0.31"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "35630"
#获取当前主节点信息
10.0.0.31:26379> Sentinel get-master-addr-by-name mymaster
1) "10.0.0.31"
2) "6379"
故障测试
#把redis1停了 [root@redis1 ~]# pkill redis [root@redis1 ~]# ps -ef |grep redis root 73291 32916 0 16:21 pts/0 00:00:00 grep --color=auto redis #发生了主库转移 [root@redis2 ~]# redis-cli -h 10.0.0.32 -p 26379 10.0.0.32:26379> Sentinel get-master-addr-by-name mymaster 1) "10.0.0.32" 2) "6379" #重新吧redis1开起来,发现redis变成从库 [root@redis1 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf [root@redis1 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
Redis Sentinel 存在多个从节点时,如果想要将指定的节点变为主节点,可以将其它节点的slaveprority配置为0,但是需要注意failover后,将slave-priority调回原值
1.查询命令:ConFIG GET slave-priority
2. 设置命令:ConFIG SET slave-priority 0
3. 主从切换:sentinel failover mymaster
#查询权重 [root@redis1 ~]# redis-cli -h 10.0.0.31 10.0.0.31:6379> ConFIG GET slave-priority 1) "slave-priority" 2) "100" #redis2和redis3进行设置slave-priority为0 [root@redis2 ~]# redis-cli -h 10.0.0.32 10.0.0.32:6379> ConFIG SET slave-priority 0 OK [root@redis3 ~]# redis-cli -h 10.0.0.33 10.0.0.33:6379> ConFIG SET slave-priority 0 OK #进行重新选举 [root@redis1 ~]# redis-cli -h 10.0.0.31 -p 26379 10.0.0.31:26379> sentinel failover mymaster OK #主节点切换成最高那个权重的了 10.0.0.31:26379> Sentinel get-master-addr-by-name mymaster 1) "10.0.0.31" 2) "6379"



