好不容易调休一天,全花在Redis集群实战和研究原理上了

☆樱花仙子☆ 提交于 2020-11-06 14:04:36

Redis集群搭建实战:3主 3从 模式 

0、准备工作 A、在虚拟机上准备三台CentOS 7系统,IP分别为172.22.13.77,172.22.13.78,172.22.13.79(不清楚的,可以参考另外一个博文 “搭建VMware和CentOS”) B、下载、安装redis5.x版本

1、创建目录(以172.22.13.77这台服务器为例)

在/usr/local下创建redis/redis-cluster两个目录,并在redis-cluster目录下建两个以端口命名的目录8001和8004

2、拷贝配置文件

将安装redis时最原始的配置文件redis.conf分别拷贝到8001和8004两个目录下

3、修改配置文件

8001和8004两个目录下的配置文件修改如下配置

(1)daemonize yes (在后台运行redis)

(2)port 8001(分别对每个机器的端口号进行设置)

(3)dir /usr/local/redis-cluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据),这个目录必须要先建好

(4)cluster-enabled yes(启动集群模式)

(5)cluster-config-file nodes-8001.conf(集群节点信息文件,这里800x最好和port对应上)

(6)cluster-node-timeout 5000

(7) bind 127.0.0.1 -->改为连接的主机IP bind 172.22.13.77

(8) protected-mode no (关闭保护模式)

(9) appendonly yes

(10) pidfile "/var/run/redis_8001.pid" (redis_800*,改为对应的端口)

(11) 注释掉 replicaof 主从复制相关的信息 生产环境需要加密码

(12) requirepass zhuge (设置redis访问密码)

(13) masterauth zhuge (设置集群节点间访问密码,跟上面一致)

4、关闭防火墙

systemctl stop firewalld # 临时关闭防火墙

systemctl disable firewalld # 禁止开机启动

5、启动redis服务

/usr/local/software/redis-5.0.3/src/redis-server /usr/local/redis/redis-cluster/8001/redis.conf

6、验证服务是否以集群模式启动成功

ps -ef |grep redis

成功图示

redis启动成功图示

7、分配主从关系

-a 后面跟的是设置的访问密码

--cluster-replicas 后面跟的 1,表示一个主节点下面分配一个从节点,如果不加 --cluster-replicas 1这个命令,执行完,6台实例都是主节点

/usr/local/software/redis-5.0.3/src/redis-cli -a zhuge --cluster create --cluster-replicas 1 172.22.13.77:8001 172.22.13.78:8002 172.22.13.79:8003 172.22.13.77:8004 172.22.13.78:8005 172.22.13.79:8006

8、验证集群

在任意一个服务器上用客户端命令连接

连接 : /usr/local/software/redis‐5.0.3/src/redis‐cli ‐a zhuge ‐c ‐h 172.22.13.78 ‐p 8002

验证 : cluster info(查看集群信息)、cluster nodes(查看节点列表) redis不分配从节点图示

redis分配从节点图示

至此,集群3主3从模式搭建成功!

集群相关原理总结

一、集群原理

Redis Cluster 将所有数据划分为 16384 个 slots(槽位),每个节点负责其中一部分槽位。槽位的信息存储于每个节点中。 当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个 key 时,可以直接定位到目标节点。同时因为槽位的信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的校验调整。

槽位定位算法

Cluster 默认会对 key 值使用 crc16 算法进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。 HASH_SLOT = CRC16(key) mod 16384

二、集群选举原理

当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的master可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:

1.slave发现自己的master变为FAIL

2.将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST 信息

3.其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack

4.尝试failover的slave收集master返回的FAILOVER_AUTH_ACK

5.slave收到超过半数master的ack后变成新Master(这里解释了集群为什么至少需要三个主节点,如果只有两个,当其中一个挂了,只剩一个主节点是不能选举成功的)

6.slave广播Pong消息通知其他集群节点。 从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票

•延迟计算公式: DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms •SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave将会首先发起选举(理论上)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!