在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。所以现在一般公司都会采用Redis集群方式来提升redis的高可用问题。
集群搭建步骤
第一步:需要6台虚拟机。至少需要6个redis实例。
第二步:修改每个实例的端口7001~7006。需要修改redis.conf文件的port的端口号。
第三步:安装ruby环境
安装ruby
yum install ruby
yum install rubygems
安装ruby和redis的接口程序
拷贝redis-3.0.0.gem至/usr/local下
执行:
gem install /usr/local/redis-3.0.0.gem
第四步:在/root/redis-3.0.0/src目录下有一个redis-trib.rb文件就是一个ruby的脚本文件,是用来创建redis集群的脚本文件。把此文件复制到新建的/usr/local/redis-cluster目录下。
第五步:修改每个实例的redis.conf文件。
第六步:启动每个实例。
创建一键启动脚本
vim startall.sh
文件中内容
cd redis01
./redis-server redis.conf
cd …
cd redis02
./redis-server redis.conf
cd …
cd redis03
./redis-server redis.conf
cd …
cd redis04
./redis-server redis.conf
cd …
cd redis05
./redis-server redis.conf
cd …
cd redis06
./redis-server redis.conf
cd …
启动脚本
chmod +x startall.sh 设置脚本为启动文件
./startall.sh 启动集群
第七步:使用redis-trib.rb脚本创建集群。
./redis-trib.rb create --replicas 1 192.168.25.147:7001 192.168.25.147:7002 192.168.25.147:7003 192.168.25.147:7004 192.168.25.147:7005 192.168.25.147:7006
使用redis-cli连接集群
redis01/redis-cli -p 7005 -c
连接集群必须添加-c参数。
集群架构图
redis集群是由多个 主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,根据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的性能和高可用性均优于之前版本。
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点(保证key基本是平均分放在不同的服务器上)
Redis集群节点间的通信机制
redis cluster节点间采取gossip协议进行通信
维护集群的元数据有两种方式:集中式和gossip
**集中式:**优点在于元数据的更新和读取,时效性非常好,一旦元数据出现变更立即就会更新到集中式的存储中,其他节点读取的时候立即就可以感知到;不足在于所有的元数据的更新压力全部集中在一个地方,可能导致元数据的存储压力。
gossip协议包含多种消息,包括ping,pong,meet,fail等等。
**ping:**每个节点都会频繁给其他节点发送ping,其中包含自己的状态还有自己维护的集群元数据,互相通过ping交换元数据;
pong: 返回ping和meet,包含自己的状态和其他信息,也可以用于信息广播和更新;
fail: 某个节点判断另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了。
**meet:**某个节点发送meet给新加入的节点,让新节点加入集群中,然后新节点就会开始与其他节点进行通信,不需要发送形成网络的所需的所有CLUSTER MEET命令。发送CLUSTER MEET消息以便每个节点能够达到其他每个节点只需通过一条已知的节点链就够了。由于在心跳包中会交换gossip信息,将会创建节点间缺失的链接。