单机瓶颈
1 虽然Redis可以实现单机的数据持久化,但是无论是RDB还是AOF,都解决不了单点宕机问题。
2 即一台单机Redis服务器本身出现系统故障,硬件故障等问题后,就会直接造成数据的丢失,
3 此外,单机的性能也是有极限的,因此需要使用另外的技术来解决单点故障和性能扩展的问题
主从复制原理
1 salve 向master发送sync命令
2 master启动后台存盘进程,并手机所有修改数据命令
3 master完成存盘后,传送整个数据文件到slave
4 slave接受数据文件,加载到内存中完成首次完全同步
5 后续有新数据产生时,master继续将新的数据命令传递给slave完成同步
主从复制架构特点
三种结构模式:
一主一从
一主多从
主从从
一个master可以有多个slave
一个slave只能有一个master
数据流向是单向的,master到slave
主从复制实现
一旦某个slave成为一个master的slave,redis slave服务会清空当前的redis服务器上的所有数据并将master的数据导入到自己的内存,但是如果只是断开同步关系后,则不会删除当前已经同步过的数据
redis slave 也要开始持久化并设置和master同样的连接密码,因为后期slave会有提升为master的可能,slave切换为master同步后会丢失之前的所有数据,而通过持久化可以恢复数据
当配置redis复制功能时,强烈建议打开主服务器的持久化功能,否则的话,由于延迟等问题,部署的服务应该要避免自动启动
参考案例:
导致主从服务器数据全部丢失
1.假设节点a为主服务器,并且关闭了持久化。并且节点b和节点c都从a节点复制数据
2.节点a崩溃,然后由自动拉起服务重启了节点a,由于节点a的持久化被关闭了,所以重启之后没有任何数据
3.节点b和节点c 将从a节点复制数据,但是a的数据是空的,于是就把自身保存的数据副本删除
在关闭主服务器的持久化,并且同时开启自动拉起进程的情况下,即使使用sentinel来实现redis高可用,也是非常危险的。因为主服务器可能拉起的非常快,以至于sentinel在配置心跳时间间隔内没有检测主服务器已被重启,然后还是会执行上面的数据丢失流程无论何时,数据安全都是极其重要的,所以应该禁止主服务器关闭持久化的同时自动启动
redis主从其中服务器不需要设置密码并且要关闭防火墙 /etc/selinux/conf要设置到disabled模式
在第一台服务器上第一步:在/etc/redis.conf中修改protected-mode no 以及bind 0.0.0.0
第二步:重启服务service redis restart
第三步:[root@localhost ~]# redis-cli
127.0.0.1:6379> slaveof 192.168.0.121 6379
OK
127.0.0.1:6379> keys *
(empty list or set)查看是否有数据
在第二台服务器上:
[root@localhost redis]# redis-cli -h 127.0.0.1 -p 6379 -a 1234
127.0.0.1:6379> keys *
1) "1"
复制第一台服务器检测端口telnet 192.168.0.121
netstat -tnlp查看端口
在第一台服务器上slaveof 192.168.0.121 6379
注意关闭自动拉起服务和持久化
一主两从在第三台服务器的/etc/redis.cong中搜索slaveof添加
slaveof 192.168.0.121 6379 修改bind 0.0.0.0
级联复制:在第三台服务器/etc/redis.conf中搜索120修改IP为第一台服务器的IP 在第一台服务器上关闭防火墙systemctl stop firewalld在第三台服务器上重启redis 登录redis 查看keys*
slaveof no one 切断主从 检测是否切断主从info replication