2、Redis Cluster

226 阅读4分钟

1、Redis集群简介

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。(官网详解

Redis集群的架构图:

Redis-Cluster-架构

在这个图中,每一个蓝色的圈都代表着一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。

插槽(slot) 可以理解为是一个可以存储两个数值的一个变量这个变量的取值范围是:0-16383。当存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

1、集群是如何判断是否有某个节点挂掉

首先要说的是,每一个节点都存有这个集群所有主节点以及从节点的信息。它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。

2、集群进入fail状态的必要条件

  • 某个主节点和所有从节点全部挂掉,我们集群就进入faill状态
  • 如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态
  • 如果集群任意master挂掉,且当前master没有slave集群进入fail状态

Redis的投票机制,具体原理如下:

投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉。

选举slave的依据依次是:网络连接正常->5秒内回复过INFO命令->10*down-after-milliseconds内与主连接过的->从服务器优先级->复制偏移量->运行id较小的。选出之后通过slaveif no ont将该从服务器升为新主服务器。

通过slaveof ip port命令让其他从服务器复制该信主服务器。最后当旧主重新连接后将其变为新主的从服务器。注意如果客户端与旧主服务器分隔在一起,写入的数据在恢复后由于旧主会复制新主的数据会造成数据丢失。

2、Redis集群部署

两台服务器的节点端口分配: 10.224.192.194:7001、7002、7003,10.224.192.206:7004、7005、7006

配置文件redis.conf:

 port 7001                               # 修改端口号,从7001到7006
 daemonize yes                           # 后台启动
 pidfile /home/redis/redis-cluster/data1/redis-7001.pid    # 集成PID文件存放
 loglevel notice                         # 日志等级
 logfile "/home/redis/redis-cluster/data1/redis.log"     # 日志文件
 appendonly yes                          # 持久化方式
 cluster-enabled yes                     # 开启cluster,去掉注释
 cluster-config-file nodes-7001.conf     # 自动生成
 cluster-node-timeout 15000              # 节点通信时间

启动每个redis节点:

 [root@app1 src]# ./redis-server /home/redis/redis-cluster/data1/redis.conf

启动redis节点后:

 [root@app1 src]# netstat -tlnp |grep redis
 tcp        0      0 0.0.0.0:17001               0.0.0.0:*                   LISTEN      7191/./redis-server
 tcp        0      0 0.0.0.0:17002               0.0.0.0:*                   LISTEN      7196/./redis-server
 tcp        0      0 0.0.0.0:17003               0.0.0.0:*                   LISTEN      7201/./redis-server
 tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      7191/./redis-server
 tcp        0      0 0.0.0.0:7002                0.0.0.0:*                   LISTEN      7196/./redis-server
 tcp        0      0 0.0.0.0:7003                0.0.0.0:*                   LISTEN      7201/./redis-server
 ​
 [root@app2 src]# netstat -tulnp |grep redis
 tcp        0      0 0.0.0.0:17004               0.0.0.0:*                   LISTEN      16099/./redis-serve
 tcp        0      0 0.0.0.0:17005               0.0.0.0:*                   LISTEN      16104/./redis-serve
 tcp        0      0 0.0.0.0:17006               0.0.0.0:*                   LISTEN      16145/./redis-serve
 tcp        0      0 0.0.0.0:7004                0.0.0.0:*                   LISTEN      16099/./redis-serve
 tcp        0      0 0.0.0.0:7005                0.0.0.0:*                   LISTEN      16104/./redis-serve
 tcp        0      0 0.0.0.0:7006                0.0.0.0:*                   LISTEN      16145/./redis-serve

将节点加入redis-cluster:

 [root@app1 src]# ./redis-cli --cluster create 10.224.192.194:7001 10.224.192.194:7002 10.224.192.194:7003 10.224.192.206:7004 10.224.192.206:7005 10.224.192.206:7006 --cluster-replicas 1

或者采用其它的方式:

 # 创建redis集群(只有三个master节点)
 [root@app1 src]# ./redis-cli --cluster create 10.224.192.194:7001 10.224.192.194:7002 10.224.192.194:7003
 ​
 # 将10.224.192.194:7004节点加入到10.224.192.194:7001集群中,作为此master id(dc2af674448729219678cd0a97f07441178958a2)节点的从节点,如果不加master id,则随机分配。
 [root@app1 src]# ./redis-cli --cluster add-node 10.224.192.194:7004 10.224.192.194:7001 --cluster-slave --cluster-master-id dc2af674448729219678cd0a97f07441178958a2

连接到app1的7001节点:

 [root@app1 src]# ./redis-cli -h 10.224.192.194 -p 7001 -a qwer
 10.224.192.194:7001> INFO [section]