文章目录
redis群集简述
redis3.0版本以上开始支持cluster,采用的是hash slot
(hash槽),可以将多个redis实例整合在一起,形成一个群集,也就是将数据分散到几群的多台机器上。
redis cluster原理
Redis Cluster是一个无中心
的结构,每个节点都保存数据和整个集群的 状态,每个节点都会保存其他节点的信息,知道其他节点所负责的槽,并且会与其他节点定时发送心跳信息,能够及时感知群集中的异常的节点
集群角色分为master和slave,master之间分配 slots。一共16384
个slot,slave向他指定的master同步数据,实现备份,当其中的一个master宕机时,该master的slave将提升为master,以保证集群的slot的完整,当其中某一个master和slave都宕机了,该集群的slot不完整,此时,集群失效。
如果手动搭建集群,每个master所分配的slot我们可以自定义分配多少;如果是使用redis-cli --cluster
命令自动搭建集群,则master的slot也是自动分配
redis cluster解决了什么问题
当遇到宕机、内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡目的。
redis cluster的数据分布
分布式数据库首先要解决把整个数据库集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上;
每个节点负责整体数据的一个子集,需要关注的是数据分片规则
,Redis Cluster采用哈希分片规则(即上面提到的分配slot)。
redis cluster 的通讯流程
在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障灯状态信息,redis 集群采用Gossip(流言)协议
(类似网络里面的ospf协议),Gossip 协议工作原理就是节点彼此不断交换信息,一段时间后所有的节点都会知道集群完整信息,这种方式类似流言传播。
通信过程:
1)集群中的每一个节点都会单独开辟一个 Tcp 通道,用于节点之间彼此通信,防火墙放行(端口号+10000
,因为做好集群后会开启新的端口,就是10000+端口号,例如下面的16380,16381)
2)每个节点在固定周期内通过特定规则选择结构节点发送ping 消息
3)接收到 ping 消息的节点用 pong消息
作为响应。集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以正常通信,最终他们会打成一致的状态,当节点出现故障,新节点加入,主从角色变化等,它能够给不断的ping/pong消息,从而达到同步目的。
常见 Gossip 消息分为:ping、 pong、 meet、 fail 等
meet 消息:用于通知新节点加入,消息发送者通知接受者加入到当前集群,meet 消息通信正常完成后,接收节点会加入到集群中并进行ping、 pong 消息交换
ping 消息:集群内交换最频繁的消息,集群内每个节点每秒想多个其他节点发送 ping 消息,用于检测节点是否在线和交换彼此信息。
Pong 消息:当接收到 ping,meet 消息时,作为相应消息回复给发送方确认消息正常通信,节点也可以向集群内广播自身的 pong 消息来通知整个集群对自身状态进行更新。
fail 消息:当节点判定集群内另一个节点下线时,回向集群内广播一个fail 消息,其他节点收到 fail 消息之后把对应节点更新为下线状态。
redis集群的部署
所需环境:3主3从
主机 | 系统 | 描述 |
---|---|---|
192.168.10.3 | Centos7.4 | redis1:开启2个redis进程,一个做master,一个做slave |
192.168.10.4 | Centos7.4 | redis2:开启2个redis进程,一个做master,一个做slave |
192.168.10.8 | Centos7.4 | redis3:开启2个redis进程,一个做master,一个做slave |
准备基础环境
redis1:
创建集群的安装目录和数据的存放目录
[root@redis1 ~]# mkdir -p /opt/redis_cluster/redis_{6380,6381}/{conf,logs,pid}
[root@redis1 ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}
下载解压并安装redis源码包
wget http://download.redis.io/releases/redis-5.0.6.tar.gz
tar zxf redis-5.0.6.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-5.0.6 /opt/redis_cluster/redis #做好软连接,方便自己管理
cd redis
make && make install
准备配置文件,添加以下内容,
添加并开启集群功能后,会在/data/redis_cluster
目录生成对应的新集群文件
cat > /opt/redis_cluster/redis_6380/conf/redis_6380.conf <<EOF
bind 192.168.10.3
port 6380
daemonize yes
pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_cluster/redis_6380/" # 开启redis后,生成所有的配置文件存放位置
cluster-enabled yes # 开启集群功能
cluster-config-file clusters_6380.conf # 集群文件
cluster-node-timeout 15000 # 集群超时时间
EOF
复制redis_6380的配置文件给redis_6381
cp /opt/redis_cluster/redis_6380/conf/redis_6380.conf /opt/redis_cluster/redis_6381/conf/redis_6381.conf
复制完,修改一下地方
sed -i 's:6380:6381:g' /opt/redis_cluster/redis_6381/conf/redis_6381.conf
开启两个redis服务
[root@redis1 redis]# redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
[root@redis1 redis]# redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
[root@redis1 redis]# netstat -anpt | grep redis
tcp 0 0 192.168.10.3:6380 0.0.0.0:* LISTEN 41834/redis-server
tcp 0 0 192.168.10.3:6381 0.0.0.0:* LISTEN 41845/redis-server
tcp 0 0 192.168.10.3:16380 0.0.0.0:* LISTEN 41834/redis-server
tcp 0 0 192.168.10.3:16381 0.0.0.0:* LISTEN 41845/redis-server
[root@redis1 redis]#
redis2 和 redis3:
1.复制redis1的安装和数据目录到redis2、redis3
并且创建集群配置配置文件存放的目录
[root@redis1 ~]# scp -rp /opt/redis_cluster/ [email protected]:/opt
[root@redis1 ~]# scp -rp /opt/redis_cluster/ [email protected]:/opt
[root@redis2 ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}
[root@redis3 ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}
2.在/opt/redis_cluster/red