redis编译安装、主从复制、高可用
server2、server3、server4都先将 mysqld关闭。
systemctl disable --now mysqld
redis编译安装
从官网上下载redis包,稳定版的。
安装gcc与make
查看server2为master
server2上也需要关闭mysqld服务。
在server3上先关闭mysqld服务
在server3上先关闭mysqld服务
将server2上的安装包远程复制到server3
server3安装make,与gcc
server3运行redis
redis实现一主一从复制
通过redis,实现主从复制。
myslq的主从复制是可以针对数据库的,不同数据库库的主从可以是不同的主机。这一个数据库中这个主机是主,可能在另一个数据库中,这个主机就是从了。
而在redis中,如果确定了一个主机是从,那么该主机之前的数据都会给刷掉,flushall。清除以后再载入数据,且一旦变成从服务器,那么该主机对数据就是read only。
server 2 ------172.20.10.6 ---- redis master
server 3 ------ 172.20.10.8 ---- redis slave
redis+sentinel 实现高可用
在redis主从复制的基础上实现高可用。当master故障,salve会自动接管。自动切换。
sentinel使用哨兵模式,自动监视Master节点,当前挂掉后,自动将Slaver节点变为Master节点
Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel哨兵模式已经被集成在redis2.4之后的版本中。
sentinel可以让redis实现主从复制,当一个集群中的master失效之后,sentinel可以选举出一个新的master用于自动接替master的工作,集群中的其他redis服务器自动指向新的master同步数据。一般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换。
注意:
一主两从的情况下,当master与两个slave或因网络关系断掉的情况下,客户端并不知道master失联,会持续写入数据,但此时slave端已经不能复制数据。
如果需要解决此问题,则需要两个slave同时认定不能连接master,或者,超过设定时间不能连接,则此时master端会拒绝客户端继续写入,那么重新接入变成slave时就不会造成数据丢失。
server1----172.20.10.7-----测试用
server2----172.20.10.6-----老master
server3----172.20.10.8-----新master
server4----172.20.10.10----- slave
先给server4上安装redis
直接将server2上的redis源码目录拷贝到server4,server4就不用make了,直接make install
vim /etc/redis/6379.conf
server开启redis服务
server2(master)上查看到集群成员的信息,slave是server3(主机8)和server4(主机10)
server3查看info,master为server2(主机6)
server4查看info,master为server2(主机6)
根据官方文档进行高可用
查看官方文档上对各个字段的解释
+slave为检测到新的slave节点
+sdown为主观下线
-sdown为取消主观下线
使用命令
redis-sentinel /etc/redis/sentinel.conf
运行sentinel
集群成员server2、server3、server4上的sentinel运行结果应该是同步的
server1 ssh 连接server3,查看info
server1 ssh 连接server4,查看info
server1 ssh 连接server2,开启redis服务
min-slaves-to-write
考虑这样的一种情况:哨兵(sentinel)在实时健康检测。正常情况下,客户端在master写,发生数据更改。master会将数据同步到slave1和slave2。如果master和salve的网络断开,master无法和slave连接了。那么两个slave会投票,认为目前的master故障了,那么master会变成客观下线状态。这时,哨兵会从salve中再次选出一个新的master。比如slave2当选新的master,那么slave1就会重新指向新的master。但是老的master不知道哨兵已经选出了新的master,而且客户端也不知道master和slave之间网络故障了而且老的master也没有设置不允许写入,所以还在向老的master中写入数据(老的master和slave都是正常工作的,只是master与slave之间的网络故障了)。当网络恢复之后,老的master就发现集群中有两个master。老的master就只能以slave的身份接入到集群中。(master不能回切)。。根据上面的实验知道,当网络恢复之后,老的master会以slave的身份重新加入集群,并会把原先的数据flushall。这就导致客户端在网络故障之前向老的master写入的数据丢失。
min-slaves-to-write=2 表示master至少有salve时,才能向master写,保持数据一致性。