redis的主从复制实现和哨兵实现高可用。

redis的主从复制很简单,构建只需要1条命令就可以。
slaveof ip:port

基本原理

  1. 副本库通过slaveof 10.0.0.51 6379命令,连接主库,并发送SYNC给主库
  2. 主库收到SYNC,会立即触发BGSAVE,后台保存RDB,发送给副本库
  3. 副本库接收后会应用RDB快照
  4. 主库会把中间产生的新的操作,保存并发送给副本库
  5. 之后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库.
  6. 如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库
  7. 主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复主从的目的

注意:主从复制中,主库如不开启持久化,有可能主库重启,会造成所有主从数据丢失。

主从搭建

单机多实例测试

配置

[root@node1 redis]# mkdir /opt/modules/redis/conf/638{0..2}
[root@node1 redis]# cat >> /opt/modules/redis/conf/6380/redis.conf <<EOF
port 6380
daemonize yes
pidfile /opt/modules/redis/conf/6380/redis.pid
loglevel notice
logfile "/opt/modules/redis/conf/6380/redis.log"
dbfilename dump.rdb
dir /opt/modules/redis/conf/6380/
requirepass 123456
masterauth 123456
EOF

# 实例2
[root@node1 redis]# cat >> /opt/modules/redis/conf/6381/redis.conf <<EOF
port 6381
daemonize yes
pidfile /opt/modules/redis/conf/6381/redis.pid
loglevel notice
logfile "/opt/modules/redis/conf/6381/redis.log"
dbfilename dump.rdb
dir /opt/modules/redis/conf/6381
requirepass 123456
masterauth 123456
EOF

# 实例3
[root@node1 redis]# cat >> /opt/modules/redis/conf/6382/redis.conf <<EOF
port 6382
daemonize yes
pidfile /opt/modules/redis/conf/6382/redis.pid
loglevel notice
logfile "/opt/modules/redis/conf/6382/redis.log"
dbfilename dump.rdb
dir /opt/modules/redis/conf/6382
requirepass 123456
masterauth 123456
EOF

启动

[root@node1 redis]# for((i=6380;i<=6382;i++));do redis-server /opt/modules/redis/conf/$i/redis.conf;done

# 主节点:6380 从:6381,6382

[root@node1 redis]# redis-cli -p 6381 -a 123456 SLAVEOF 127.0.0.1 6380
[root@node1 redis]# redis-cli -p 6382 -a 123456 SLAVEOF 127.0.0.1 6380


# 批量停止
[root@node1 redis]# for ((i=6380;i<=6382;i++));do redis-cli -p $i -a 123456 shutdown;done;

查询状态

redis-cli -p 6380 -a 123456 info replication
redis-cli -p 6381 -a 123456 info replication
redis-cli -p 6382 -a 123456 info replication

min-slaves-to-write 1 min-slaves-max-lag 3

如果不开有可能,主库重启操作,造成所有主从数据丢失!

哨兵

sentinel可以一次性管理多套集群,主要负责监控,自动选主和切换,特点是对应用透明,可以自动处理节点故障。

配置

首先sentinel也是在主从环境上,redis主从配置

# 哨兵配置
[root@node1 redis]# mkdir /opt/modules/redis/conf/26380
[root@node1 redis]# cd /data/26380
[root@node1 redis]# cat >> /opt/modules/redis/conf/26380/sentinel.conf <<EOF
port 26380
dir "/opt/modules/redis/conf/26380"
sentinel monitor pay(名称可以自己自定义) 127.0.0.1 6380 1
sentinel down-after-milliseconds pay 5000 (主库宕机多少秒进行切换)
sentinel auth-pass pay 123456 
EOF

前面主从已经启动,然后启动哨兵

[root@node1 redis]# redis-sentinel /opt/modules/redis/conf/26380/sentinel.conf  &>/tmp/sentinel.log &

测试

[root@node1 redis]# redis-cli -a 123456 -p 6380 shutdown
[root@node1 redis]# redis-cli -a 123456 -p 6381 info replication
[root@node1 26380]# redis-cli -a 123456 -p 6382 info replication
Warning: Using a password with '-a' option on the command line interface may not be safe.
# Replication
role:master
省略其他
# 可以看到6781升级为了主库