Redis Cluster是Redis的自带的官方分布式解决方案,提供数据分片、高可用功能,在3.0版本正式推出。
使用Redis Cluster能解决负载均衡的问题,内部采用哈希分片规则:
基础架构图如下所示:
图中最大的虚线部分为一个Cluster集群,由6个Redis实例组成。
集群分片 整个Cluster集群中有16384个槽位,必须要将这些槽位分别规划在3台Master中。
如果有任意1个槽位没有被分配,则集群创建不成功。
当集群中任意一个Master尝试进行写入操作后,会通过Hash算法计算出该条数据应该落在哪一个Master节点上。
如下图所示:
情况1:如果你未指定任何参数就进行写入,如在Master1上写入数据,经过内部计算发现该数据应该在Master2上写入时,会提示你应该进入Master2写入该条数据,执行并不会成功
情况2:如果你指定了一个特定参数进行写入,如在Master1上写入数据,经过内部计算发现该数据应该在Master2上写入时,会自动将写入环境重定向至Master2,执行成功
同理,读取数据也是这样,这个过程叫做MOVED重定向,如果你是情况1进行操作则必须手动进行重定向,情况2则会自动进行重定向。
集群通信 集群中各个节点的信息是互通的,这种现象由Gossip(流言)协议产生。
Gossip协议规定每个集群节点之间互相交换信息,使其能够彼此知道对方的状态。
在通信建立时,集群中的每一个节点都会单独的开辟一个TCP通道,用于与其他节点进行通信,这个通信端口会在基础端口上+10000。
通信建立成功后,每个节点在固定周期内通过特定规则选择节点来发送ping消息(心跳机制)。
当收到ping消息的节点则会使用pong消息作为回应,也就是说,当有一个新节点加入后,一瞬间集群中所有的其他节点也能够获取到该信息。
Gossip协议的主要职责就是进行集群中节点的信息交换,常见的Gossip协议消息有以下几点区分:
meet:用于通知新节点加入,消息发送者通知接受者加入到当前集群
ping:集群内每个节点与其他节点进行心跳检测的命令,用于检测其他节点是否在线,除此之外还能交换其他额外信息
pong:用于回复meet以及ping信息,表示已收到,能够正常通行。此外还能进行群发更新节点状态
fail:当其他节点收到fail消息后立马把对应节点更新为下线状态,此时集群开始进行故障转移
初步搭建 地址规划 3台服务器,每台服务器开启2台实例构建基础主从。
服务器采用centos7.3,Redis版本为6.2.1
地址规划与结构图如下:
在每个节点hosts文件中加入以下内容;
$ vim /etc/hosts 192.168.0.120 node1 192.168.0.130 node2 192.168.0.140 node3
集群准备 为所有节点下载Redis:
$ cd ~ $ wget https://download.redis.io/releases/redis-6.2.1.tar.gz 为所有节点配置目录:
$ mkdir -p /usr/local/redis_cluster/redis_63{79,80}/{conf,pid,logs} 所有节点进行解压:
$ tar -zxvf redis-6.2.1.tar.gz -C /usr/local/redis_cluster/ 所有节点进行编译安装Redis:
$ cd /usr/local/redis_cluster/redis-6.2.1/ $ make && make install 书写集群配置文件,注意!Redis普通服务会有2套配置文件,一套为普通服务配置文件,一套为集群服务配置文件,我们这里是做的集群,所以书写的集群配置文件,共6份:
$ vim /usr/local/redis_cluster/redis_6379/conf/redis.cnf # 快速修改::%s/6379/6380/g # 守护进行模式启动 daemonize yes # 设置数据库数量,默认数据库为0 databases 16 # 绑定地址,需要修改 bind 192.168.0.120 # 绑定端口,需要修改 port 6379 # pid文件存储位置,文件名需要修改 pidfile /usr/local/redis_cluster/redis_6379/pid/redis_6379.pid # log文件存储位置,文件名需要修改 logfile /usr/local/redis_cluster/redis_6379/logs/redis_6379.log # RDB快照备份文件名,文件名需要修改 dbfilename redis_6379.rdb # 本地数据库存储目录,需要修改 dir /usr/local/redis_cluster/redis_6379 # 集群相关配置 # 是否以集群模式启动 cluster-enabled yes # 集群节点回应最长时间,超过该时间被认为下线 cluster-node-timeout 15000 # 生成的集群节点配置文件名,文件名需要修改 cluster-config-file nodes_6379.conf 启动集群 启动集群 在启动集群时,会按照Redis服务配置文件的配置项判断是否启动集群模式,如图所示: