14.Redis之集群搭建

Redis之集群搭建

集群原理

redis集群架构如下图:

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会根据节点数量大致均等的将哈希槽映射到不同的节点。

怎么样投票

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

怎么判定节点不可用

  1. 如果集群任意master挂掉,且当前master没有slave,集群进入fail状态,也可以理解成集群的slot映射【0-16383】不完整时进入fail状态。
  2. 如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态,当集群不可用时,所有对集群的操作都不可用,收到((error) CLUSTERDOWN the cluster is down) 错误。

集群搭建

首先我们对集群做一个简单的规划,假设我的集群中一共有三个节点,每一个节点一个主机一个从机,那么我就需要6个redis实例。首先创建redis-cluster文件夹,在该文件下分别创建7001,7002,7003,7004,7005,7006文件夹。用来存放我的Redis配置文件,如下:

1
2
[root@localhost redis-cluster]# ls
7001 7002 7003 7004 7005 7006 redis-5.0.7 redis-5.0.7.tar.gz

将Redis也在redis-cluster 目录下安装一份,然后将redis.conf文件向7001-7006这六个文件夹中分别拷贝一份,拷贝完成后,分别修改如下配置信息:

1
2
3
4
5
6
port 7001
bind 0.0.0.0
cluster-enable yes
cluster-config-file nodes7001.conf
protected-mode no
daemonize yes

这是Redis7001目录下的配置,其他的文件夹中只需要将7001改为对应的数字即可。修改完成之后,进入到redis安装目录中,分别启动各个redis,使用刚刚修该过的配置文件,如下:

通过上图可以看出,各个节点都已经成功启动了。接下来我们就可以进行集群的配置。

执行下列命令:

1
redis-cli --cluster  create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

注意:replicas 后面的 1 表示每个主机都带有1个从机,执行过程如下:

从创建过程的日志中可以看出,每个redis都获取了一个编号,同时日志也说明了哪些实例是做主机,哪些实例是做从机的。每个从机的主机是谁,每个主机所分配到的hash槽范围等等。

查询集群信息

集群创建成功后,我们可以登录到redis控制台查看集群信息,注意登录时要添加-c 参数,表示以集群方式连接,如下:

添加主节点

首先我们准备一个端口为7007的主节点并启动,准备方式和前面步骤一样,启动成功后,通过如下命令添加主机节点:

1
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001

主节点添加之后,我们可以通过 cluster nodes 命令查看主节点是否添加成功,此时我们发现新的节点没有分配到slot,如下:

没有分配到slot将不能存储数据,此时我们需要手动分配slot,分配命令如下:

1
redis-cli --cluster reshard 127.0.0.1:7001

后面的地址为任意一个节点地址,在分配的过程中,我们一共要输入如下几个参数:

  1. 一共要划分多少个hash槽出来?就是我们总共要给新添加的节点分多少hash槽,这个参数依实际情况而定,如下:

  2. 这些划分出来的槽要给谁,这里输入7007节点的编号,如下:

  3. 要从哪里拿出hash槽来呢?因为hash槽目前已经全部分配好了,要重新从已经分配好的节点中拿出一部分分给7007节点,必须要让另外三个节点释放一点出来,这里我们可以输入多个节点的编号,每次输入完一个回车,输入完所有后,输入done表示输入完成,这样就让这几个节点让出部分slot,如果要让所有具有slot的节点都参与到此处slot重新分配的活动中,那就直接输入all即可。如下:

这几个参数设置完之后,就进行到了slot重新分配的环节,分配完成后,通过cluster nodes命令,我们可以发现7007已经具有slot了,如下:

我们计算一下:2666 + 2667 + 2666 = 8000.

OK,我们把主节点已经设置好了,我们也可以添加从节点,比如要把7008设置为7007的从节点,添加方式如下:

1
redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id 05675df35a13c4ee6c261377cdb7369218f6fff8

其中05675df35a13c4ee6c261377cdb7369218f6fff8 是 7007 的编号。

删除节点

删除节点也比较简单,如下:

1
redis-cli --cluster del-node 127.0.0.1:7007 05675df35a13c4ee6c261377cdb7369218f6fff8

注意:05675df35a13c4ee6c261377cdb7369218f6fff8 是要删除节点的编号。

再注意:删除已经占用了hash槽的节点会失败,如下:

需要先把该节点占用的hash槽分配出去,(分配方式和上文一致)。

Redis的集群搭建就介绍这么多了。是不是也挺简单的。

部分参考自:http://www.javaboy.org/2019/0615/redis-cluster.html

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×