更多Redis入门系列文章,参见Redis入门-大纲
搭建集群至少需要3主3从6台服务器或进程,否则你会遇到这错误
1)将redis安装目录下的redis.conf文件复制六份,分别取名为:cluster-6379.conf、cluster-6380.conf、cluster-6381.conf、cluster-6382.conf、cluster-6383.conf、cluster-6384.conf。对于一个高可用的集群方案,集群每个节点都将为其分配一个从节点,以防止数据节点因为故障下线,这里使用六份配置文件定义六个redis实例,其中三个作为主节点,剩余三个分别作为其从节点。对于这六份配置文件,以其中一份为例,以下是其需要修改的参数:
2)启动所有redis实例
3)仔细阅读上述配置文件可发现,当前配置和启动过程中并没有指定这六个实例的主从关系,也没有对16384个槽位进行分配。因而我们还需要进行进一步的配置,槽位的分配和主从关系的设定有两种方式进行,一种是使用redis-cli连接到集群节点上后使用cluster meet命令连接其他的节点,如我们首先执行如下命令连接到6379端口的节点:sudo redis-cli -p 6379
连接上后使用cluster meet命令分别连接其余节点:
连接好后可以使用cluster nodes命令查看当前集群状态:
4)可以看到配置的六个节点都已经加入到了集群中,但是其现在还不能使用,因为还没有将16384个槽分配到集群节点中。虚拟槽的分配可以使用redis-cli分别连接到6379,6380和6381端口的节点中,然后分别执行如下命令:
添加完槽位后可使用cluster info命令查看当前集群状态:
5)这里我们将16384个虚拟槽位分配给了三个节点,而剩余的三个节点我们通过如下命令将其配置为这三个节点的从节点,从而达到高可用的目的:
如此,所有的集群节点都配置完毕,并且处于可用状态。这里可以使用cluster nodes命令查看当前节点的状态:
6)我们使用redis-cli使用如下命令连接集群:
sudo redis-cli -c -p 6380
注意连接集群模式的redis实例时需要加上参数-c,表示连接的是集群模式的实例
测试:
7) 集群中添加移除节点
添加主节点
redis-trib.rb add-node ip:port(新增节点) ip:port(集群任一老节点)
添加从节点
redis-trib.rb add-node –slave –master-id 2b7bb3be16460f2e0848c69cef3acc68f655a041 ip:port(从节点) ip:port(主节点)
–slave,添加从节点
–master-id,主节点id
给新的主节点重新分配slots
默认刚刚新增的主节点是没有slots的,这样在存取数据的时候不会被选择
redis-trib.rb reshard ip:port
How many slots do you want to move (from 1 to 16384)? 2000 //给该节点分配多少槽位
What is the receiving node ID? 2b7bb3be16460f2e0848c69cef3acc68f655a041 //新主节点id
Source node #1:all //all表示从所有主节点中转移2000个哈希槽
Do you want to proceed with the proposed reshard plan (yes/no)? yes //确认分配
将node移除集群之前,首先将其上的slots迁移到其他nodes上(reshard),然后关闭它。不过这似乎还并未结束,因为其他nodes仍然记住了它的ID,仍然不会尝试与它建立连接。因此,当我们确定将节点移除集群时,可以使用“CLUSTER FORGET”指令:
a.将此node从nodes映射表中移除。
b.然后设定一个60秒的隔离时间,阻止持有相同ID的node再次加入集群。
之所以有b规则,因为FORGET指令将会通过gossip协议传播给其他nodes,集群中所有的节点都收到消息是需要一定的时间延迟。