一、Redis的主从复制
1.1 Redis主从复制定义
主从复制是redis实现高可用的基础,哨兵模式和集群都是在主从复制的基础之上实现高可用;
主从复制实现数据的多级备份,以及读写分离(主服务器负责写,从服务器只能读)
1.2 主从复制流程
(主从复制推荐使用AOF)
1)若启动一个slave机器进程,则它会向Master机器发送一个sync command命令,请求同步连接。
2)无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行bgsave操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。
3)后台进程完成缓存操作之后,Master机器就会向slave机器发送数据文件,slave端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给slave端机器。若slave出现故障导致宕机,则恢复正常后会自动重新连接。
4)Master机器收到slave端机器的连接后,将其完整的数据文件发送给slave端机器,如果Master同时收到多个slave发来的同步请求,则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的slave端机器,确保所有的slave端机器都正常。
1.3 主从复制实操(一主二从)
主从复制架构
20.0.0.91:MASTER
20.0.0.92:SLAVE1
20.0.0.93:SLAVE2
关闭防火墙
systemctl stop firewalld
setenforce 0
修改master配置文件
vim /etc/redis/6379.conf
--70--
bind 0.0.0.0
#修改监听地址为0.0.0.0,允许所有网段访问
--137--
daemonize yes
#开启守护进程,后台启动
--172--
logfile /var/log/redis_6379.log
#指定日志文件存放目录
--264--
dir /var/lib/redis/6379
#指定工作目录
--700--
appendonly yes
#开启AOF持久化功能
/etc/init.d/redis_6379 restart
修改slave配置文件
#salve1、slave2相同操作
vim /etc/redis/6379.conf
--70--
bind 0.0.0.0
#修改监听地址为0.0.0.0,允许所有网段访问
--137--
daemonize yes
#开启守护进程,后台启动
--172--
logfile /var/log/redis_6379.log
#指定日志文件存放目录
--264--
dir /var/lib/redis/6379
#指定工作目录
--288--
replicaof 20.0.0.91 6379
#指定要同步的Master节点的IP和端口
--700--
appendonly yes
#开启AOF持久化功能
/etc/init.d/redis_6379 restart #重启redis
ss -natp | grep redis #查看主从服务器是否已建立连接
测试
测试主从复制以及读写分离
测试slave断开时,master写入数据,slave恢复正常后能否复制
二、Rdis的哨兵模式
在主从复制的基础上,哨兵引入了主节点的自动故障转移。
2.1 哨兵模式的组成
哨兵节点: 哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。
数据节点: 主节点和从节点都是数据节点。
2.2 哨兵模式的原理
哨兵是一个分布式系统,部署在每一个redis的节点之上,用于在主从结构之间,对每一台redis的服务进行监控。
1).监控: 哨兵会不断地检查主节点和从节点是否运作正常。
每个哨兵节点每隔一秒,通过ping命令方式,检测主从之间的心跳线。
主节点在一定时间内没有回复或者回复了错误的消息,此时哨兵就会主观地认为主节点下线,
超过半数的哨兵节点认为主节点下线时,才会将主节点认为客观下线。
2).自动故障转移: 当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。
主节点的选举原则:
已经下线的从节点不会被选为主节点;
选择配置文件当中优先级最高的从节点作为主节点(replica-priority 100);
选择一个复制数据最完整的从节点作为主节点。
(如何实现切换:主节点出现故障时,从节点通过投票的方式选择一个新的master )
3).通知(提醒): 哨兵可以将故障转移的结果发送给客户端。
2.3 哨兵模式实操
修改哨兵节点配置文件
#所有节点相同操作
vim /opt/redis-5.0.7/sentinel.conf
--17--
protected-mode no
#取消注释,关闭保护模式
--21--
port 26379
#Redis哨兵默认的监听端口
--26--
daemonize yes
#指定sentinel为后台启动
--36--
logfile "/var/log/sentinel.log"
#指定日志文件存放路径
--65--
dir "/var/lib/redis/6379"
#指定数据库存放路径
--84--
sentinel monitor mymaster 20.0.0.91 6379 2
#指定该哨兵节点监控20.0.0.91:6379这个主节点,该主节点的名称是mymaster。
#最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
--113--
sentinel down-after-milliseconds mymaster 30000
#判定服务器down掉的时间周期,默认30000毫秒(30秒)
--146--
sentinel failover-timeout mymaster 180000
#同一个sentinel对同一个master两次failover之间的间隔时间(180秒)
启动哨兵模式并查看哨兵状态
#启动三台节点上的哨兵模式
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &
#在哨兵节点查看监控状态
[root@localhost ~]# redis-cli -p 26379 info Sentinel
模拟故障测试
#Master
ps -elf | grep redis
kill -9 pid号 #Master节点上redis-server的进程号
netstat -natp | grep redis