Redis主从复制
主从复制,是指将一台redis服务器的数据,复制到其他的redis服务器。前者称为主节点 master,后者为从节点slave;数据的复制是单向的,只能有主节点到从节点
作用
数据冗余
主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
故障恢复
当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余
负载均衡
在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高redis服务器的并发量
高可用基石
除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是redis高可用的基础
搭建
修改master 中redis配置文件
[root@master utils]# vim /etc/redis/6379.conf
70 bind 0.0.0.0 /修改bind项,使之监听所有网段
137 daemonize yes /开启守护进程
172 logfile /var/log/redis_6379.log /指定日志文件目录
264 dir /var/lib/redis/6379 /指定工作目录
700 appendonly yes /开启AOF持久化功能
[root@master utils]# /etc/init.d/redis_6379 restart /重启redis
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
修改slave中 redis配置
[root@slave1 utils]# vim /etc/redis/6379.conf
70 bind 0.0.0.0 /修改bind项,使之监听所有网段
137 daemonize yes /开启守护进程
172 logfile /var/log/redis_6379.log /指定日志文件目录
264 dir /var/lib/redis/6379 /指定工作目录
288 replicaof 192.168.159.247 6379 /指定同步的master节点和端口
700 appendonly yes /开启AOF持久化功能
[root@slave1 utils]# /etc/init.d/redis_6379 restart /修改完成配置文件重启服务
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
master 验证从节点
哨兵模式
作用
监控
哨兵会不断地检查主节点和从节点是否运转正常
自动故障转移
当主节点不能正常工作时,哨兵会自动开始故障转移操作
通知
将故障转移的结果发给客户端
原理
他是一个分布式系统,用于对主从结构中的每台服务器进行监控,它会将失效节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点
搭建
环境
master 192.168.30.7
slave1 192.168.30.8
slave2 192.168.30.9
修改配置文件
[root@master utils]# vim /opt/redis-5.0.9/sentinel.conf
17 protected-mode no //关闭保护模式
21 port 26379 //默认端口
26 daemonize yes //开启守护进程
36 logfile "/var/log/sentinel.log" //指定日志位置
65 dir /var/lib/redis/6379 //指定工作目录
84 sentinel monitor mymaster 192.168.30.7 6379 2 //至少两个哨兵同意才能进行故障转移
113 sentinel down-after-milliseconds mymaster 30000 //判断节点down掉的时间周期,默认30s
146 sentinel failover-timeout mymaster 180000 //最大超时时间,默认180s
启动
[root@master redis-5.0.9]# redis-sentinel sentinel.conf //启动哨兵模式,先主后从
[root@master redis-5.0.9]# netstat -antp | grep 26379
tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 26978/redis-sentine
tcp 0 0 192.168.30.7:26379 192.168.30.9:41478 ESTABLISHED 26978/redis-sentine
tcp 0 0 192.168.30.7:26379 192.168.30.8:59552 ESTABLISHED 26978/redis-sentine
tcp 0 0 192.168.30.7:43886 192.168.30.8:26379 ESTABLISHED 26978/redis-sentine
tcp 0 0 192.168.30.7:41942 192.168.30.9:26379 ESTABLISHED 26978/redis-sentine
tcp6 0 0 :::26379 :::* LISTEN 26978/redis-sentine
[root@master redis-5.0.9]#
模拟故障
杀死进程号
查看日志
集群
创建6节点目录
[root@localhost redis]# cd redis-cluster/
[root@localhost redis-cluster]# ls
redis6001 redis6002 redis6003 redis6004 redis6005 redis6006
[root@localhost redis-cluster]#
拷贝配置文件
修改配置文件
[root@localhost redis6001]# vim redis.conf
69 bind 127.0.0.1 //监听IP
92 port 6001 //监听PORT
699 appendonly yes //开启AOF
832 cluster-enabled yes
840 cluster-config-file nodes-6001.conf //集群名称文件
846 cluster-node-timeout 15000 //集群超时时间
启动节点
root@localhost redis6001]# redis-server redis.conf
29027:C 07 Aug 2021 14:58:31.123 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29027:C 07 Aug 2021 14:58:31.123 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=29027, just started
29027:C 07 Aug 2021 14:58:31.123 # Configuration loaded
启动集群
测试集群
[root@localhost redis6001]# redis-cli -p 6001 -c
127.0.0.1:6001> cluster slots
1) 1) (integer) 0
2) (integer) 5460
3) 1) "127.0.0.1"
2) (integer) 6001
3) "370c0e26c898d9fa13b4c471b0e6259dfadec731"
4) 1) "127.0.0.1"
2) (integer) 6006 //从节点IP和端口号
3) "822219d31b1248348f223406da72ef69537f4cc4"
2) 1) (integer) 5461
2) (integer) 10922
3) 1) "127.0.0.1"
2) (integer) 6002
3) "dbd8e38b6c8d48f25cc8331624627e7411a43d15"
4) 1) "127.0.0.1"
2) (integer) 6004
3) "2b1a0dd61a2e2a275429b2ec818e95654c29acd8"
3) 1) (integer) 10923
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 6003
3) "331ee4d7369d949fdef5970be4f0233fa0313efe"
4) 1) "127.0.0.1"
2) (integer) 6005
3) "dd86a642078a74f5ebb7f0bb452455e418c5b160"
127.0.0.1:6001>
结果