搭建Redis高可用群集

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值