目录
(1)实验环境:redis一主两从(节点一般是奇数,方便投票)
一、redis主从复制集群
(1)redis主从复制说明
首先,经过auth认证的slave端发送同步请求sync给master,master端接收到请求后会把数据进行备份,生成快照rdb,发送给slave段。
此时的数据同步分为两种情况。一种叫做同步复制(save),他是master端停下手头工作,开始生成rdb快照发给slave端,这时就会造成堵塞,因为其他的业务就无法办理,异步模式(bgsave)是开启一个新的线程负责备份和发送给slave端,这样原有的线程不受影响。
在slave端接收到数据包之前,会通过flushall命令刷新自己原有的数据库(和格式化差不多),然后将rdb导入到自己的数据库中。
同时master端在经过备份后的所有新操作会形成cache,cache以命令的形式,通过replicationfeedslave()函数发送给slave,从而保持数据的同步。这个过程的同步速度比mysql快很多。
(2)min-slaves-to-write=2的参数说明
sebtinel是哨兵,负责redis的健康检测
假设masters和slave端全都挂掉了,哨兵就会阻止客户端继续往数据库写入数据
假设master断出现了故障,slave之间就会通过投票机制,最后投出新的master。用户写入的数据就会存入到新的master。此时数据库主从关系会发生变化,原有的master消失。
假如原来的master恢复了,那么此时的数据库主从关系已经发生变化了,旧master只能以slave角色进入到主从复制中,此时master必须要经过一个flash all来格式化,这么一来,旧master中原有的数据也会消失。
因此设置一个最小slave数,防止出现这种问题。
CONFIG SET min-slaves-to-write 2 设置参数
CONFIG GET min-slaves-to-write 查询
CONFIG GET min-replicas-max-lag 这个参数用来设置最大时延
二、redis高可用集群搭建(主从切换)
(1)实验环境:redis一主两从(节点一般是奇数,方便投票)
实验环境这里要是有问题,直接看前边的redis安装部署
server1上 scp -r redis-6.2.4 root@server3:~
server3: make USE_SYSTEMD=yes
make install
cd utils/ 里边有一个启动脚本 install_server.sh,./install_server.sh 执行
配置文件修改 /etc/redis/6379.conf
(1) 76 bind 0.0.0.0
(2) replicaof 172.25.73.1 6379
/etc/init.d/redis_6379 restart
server1查看redis集群部署情况
[root@server1 ~]# redis-cli
127.0.0.1:6379> info
(2)主从集群搭建
拷贝配置文件 sentinel.conf 并编辑
cp sentinel.conf /etc/redis/
配置文件参数解释如下,在这里只修改两处
84 sentinel monitor mymaster 172.25.73.1 6379 2
125 sentinel down-after-milliseconds mymaster 10000
26 daemonize no 是否打入后台,no就是不打入
84 sentinel monitor mymaster 172.25.73.1 6379 2 这里的ip是master的ip,端口6379,得到两个投票则判定master端出了问题
125 sentinel down-after-milliseconds mymaster 10000 master端时延超过10秒,就算有问题
0 sentinel parallel-syncs mymaster 1 可以同时同步数据的slave数量,slave同步数据时不让别人访问,这个数设置的越大,主从切换时不能访问的slave就越多。
这里要注意,配置文件修改好立刻复制到其他节点 ,等到master启动后,哨兵会往配置文件中加入新内容,此时再拷贝就会出错。
scp sentinel.conf root@server2:/etc/redis/
scp sentinel.conf root@server3:/etc/redis/
启动redis,先在server1上启动一下
redis-sentinel /etc/redis/sentinel.conf
server2\3也开启, cd /etc/redis/
redis-sentinel /etc/redis/sentinel.conf
(3)效果测试
重新开一个窗口连上server1并进入redis, SHUTDOWN 停掉server1的redis服务
ps ax查看进程,只剩下哨兵进程
此时在三个节点都能看到,master改为server2了
重新启动server1的redis : /etc/init.d/redis_6379 start
此时sever1就变成了slave
三、redis自带集群
(1)自带集群部署
redis本身就具有一下子开启多个实例,并组成一个集群的功能。接下来我们首先要找到这个能够建立redis实例集群的脚本
/etc/init.d/redis_6379 stop 首先停掉前边实验的redis
在这里为了方便演示,我们只用server1操作,以下的操作除了特殊说明,均再server1。
/root/redis-6.2.4/utils/create-cluster中,有create-cluster脚本,就是本实验要用的脚本
./create-cluster start 启动脚本
可以看到生成了六个实例,但此时这六个实例并未形成集群关系,因此用
./create-cluster create 来创造集群,输入yes
检查集群的部署情况, redis-cli --cluster check 127.0.0.1:30001
可以看到3个master和3个slave
如果想单独看某个集群 的情况,用
redis-cli -c(选择集群模式) -p 30001(要查看的实例号)
这里的redis集群属于无中心集群,如下图在节点一上设置的名字,它会存到节点二的哈希槽中。哈希槽一共有16383个,少了一个,整个集群都会崩溃。
(2)自带集群的主从切换测试
127.0.0.1:30002> SHUTDOWN 停掉节点2
redis-cli --cluster check 127.0.0.1:30001 查看集群情况,发现master从1、2、3变成1、3、5
节点5本来是节点2的从节点,2出错后5直接变为master
重启脚本 ./create-cluster start
ps ax查看后台进程,可以看到节点2启动了
redis-cli --cluster check 127.0.0.1:30001
可以看到节点2变成节点5的slave
(3)集群节点的增删
加入6个结点不够,我们想让节点增加为8个
vim create-cluster 在脚本文件中修改以下参数
8 NODES=8
./create-cluster start
redis-cli --cluster check 127.0.0.1:30001 此时并未出现八个节点,这是因为我们没有添加
此时我们分别把节点7和8作为master和slave来添加到集群
redis-cli --cluster add-node 127.0.0.1:30007 127.0.0.1:30001 这是添加master的命令
redis-cli --cluster check 127.0.0.1:30001 检查添加情况,发现节点7已经成为新的master
接下来我们把节点8添加为节点7的slave
redis-cli --cluster add-node 127.0.0.1:30008 127.0.0.1:30001 --cluster-slave --cluster-master-id 192cec14615140c2977897a3e8fd8d1846945332(节点7的id)
redis-cli --cluster check 127.0.0.1:30001 检查添加情况,发现节点8成为节点7的slave
如果想给新的节点分配哈希槽,
redis-cli --cluster reshard 127.0.0.1:30001
输入3000、节点的id和all,最后是yes,这样每个结点都分出一些哈希曹给节点七redis-cli --cluster check 127.0.0.1:30001查看是否成功
(4)redis自带集群的删除
./create-cluster stop
./create-cluster clean
再次查看该目录下,啥也没有,就是成功了