天天看点

Redis高可用集群之水平扩展

作者:强函数

Redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片等特性,集群模式没有中心节点,可水平扩展,根据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点),但是水平扩展相对比较麻烦,接下来带大家看看如何做Redis高可用集群水平扩展。

原集群由6个Redis节点组成,分布在三台机器上,采用三主(master)三从(slave)的模式:

IP为192.168.1.6的机器Redis实例分别为,master:6380;slave:6379。

IP为192.168.1.7的机器Redis实例分别为,master:6381;master:6382。

IP为192.168.1.8的机器Redis实例分别为,master:6383;slave:6384。

接下来做Redis高可用集群水平扩展,在IP为192.168.1.6的机器上创建两个Redis实例,水平扩展之后变成四主(master)四从(slave)的集群模式,如下图:

Redis高可用集群之水平扩展

1.通过客户端连接Redis实例

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6379

2.查看集群状态

192.168.1.6:6379>cluster nodes
Redis高可用集群之水平扩展

从集群结果中可以看出整个redis集群运行正常,三个master主节点和三个slave从节点,主节点master分配了存储数据的hash槽位, 而slave节点是每个主节点的备份从节点,不显示存储槽位。

3.水平扩展集群操作

3.1 创建一主(master)一从(slave)Redis实例

cd /usr/local/redis/etc

#复制配置文件

cp redis-6380.conf redis-6385.conf

cp redis-6380.conf redis-6386.conf

#修改配置文件

vim redis-6385.conf

#端口号

port 6385

#pidfile的路径

pidfile /usr/local/redis/logs/redis-6385.pid

#日志文件的路径

logfile /usr/local/redis/logs/redis-6385.log

#持久化数据存放的目录

dir /usr/local/redis/data/6385/

#集群节点信息文件,最好与port端口对应

cluster‐config‐file nodes‐6385.conf

配置文件redis-6386.conf和Redis实例6385修改方法一样。

3.2 启动新增的两个Redis实例并查看

cd /usr/local/redis/bin

#启动Redis实例

./redis-server /usr/local/redis/etc/redis-6385.conf

./redis-server /usr/local/redis/etc/redis-6386.conf

#查看服务状态

ps -ef|grep redis

Redis高可用集群之水平扩展

3.3 查看Redis集群命令帮助

/usr/local/redis/bin/redis-cli --cluster help
Redis高可用集群之水平扩展

帮助说明如下:

create:创建一个集群环境host1:port1 ... hostN:portN。

check:检查集群状态。

reshard:集群环境重新分片。

rebalance:平衡集群节点slot数量。

add-node:将一个节点添加到集群里,参数:new_host:new_port existing_host:existing_port,第一个参数为新节点(new_host)的ip:port,第二个参数为集群中任意一个已经存在的节点(existing_host)的ip:port。

del-node:移除一个节点。

call:可以执行redis命令。

3.4 配置Redis实例6385为集群主节点

#使用命令add-node新增一个主节点6385。

/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.6:6385 192.168.1.6:6380

Redis高可用集群之水平扩展

#查看集群状态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6379

192.168.1.6:6379>cluster nodes

Redis高可用集群之水平扩展

当新节点加入集群后,节点没有任何数据,因为它还没有分配存储hash槽位(slot),需要手工为新节点分配hash槽位。

#使用命令reshard重新为节点分配槽位

/usr/local/redis/bin/redis‐cli ‐a 123456 ‐‐cluster reshard 192.168.1.6:6380

Redis高可用集群之水平扩展

3.5 配置Redis实例6386为主节点6386的从节点

#将redis实例6386节点添加到集群中

/usr/local/redis/bin/redis-cli -a 123456 --cluster add-node 192.168.1.6:6386 192.168.1.6:6380

Redis高可用集群之水平扩展

#查看集群状态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

Redis高可用集群之水平扩展

已经成功将redis实例6386添加到集群,并且还是master,还没有分配hash槽位。

#通过执行replicate命令来指定当前从节点的主节点为哪个,首先需要连接新加的6386节点的客户端,然后使用集群命令进行操作,把当前的6386(master)节点指定到一个主节点6385(master)下成为从节点。

#连接客户端

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6386

#执行replicate命令来指定

192.168.1.6:6386> cluster replicate 6a14670fcf844b7ea35177a40b49ea50e36286fe

Redis高可用集群之水平扩展

至此Redis高可用集群水平扩展完成。

4.水平扩展集群删除操作

4.1.先删除从节点

#通过命令del-node先删除从节点6386,指定删除节点ip和端口,以及节点id

/usr/local/redis/bin/redis-cli -a 123456 --cluster del-node 192.168.1.6:6386 58ddf8c9ff21225dea479f3cc1b158ed78b00829

Redis高可用集群之水平扩展

#查看集群状态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

Redis高可用集群之水平扩展

redis从节点6385已经移除,并且该节点的redis服务已经停止服务。

4.2.最后删除主节点

#删除主节点相对麻烦,因为主节点里分配了hash槽位,先要把主节点里的hash槽位移除到其他可用的主节点中去,然后再进行移除节点,不然会出现数据丢失问题

/usr/local/redis/bin/redis-cli -a 123456 --cluster reshard 192.168.1.6:6385

操作如下:

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

#迁移量

How many slots do you want to move (from 1 to 16384)? 900

#需要把数据迁移到那个可用的主节点id(6380)

What is the receiving node ID? 5d25be4b68237e66b78b50f712a9bb410a3dde60

Please enter all the source node IDs.

Type 'all' to use all the nodes as source nodes for the hash slots.

Type 'done' once you entered all the source nodes IDs.

#数据源节点ID(6385)

Source node #1: 6a14670fcf844b7ea35177a40b49ea50e36286fe

Source node #2: done

Do you want to proceed with the proposed reshard plan (yes/no)? yes

#查看集群状态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

Redis高可用集群之水平扩展

通过上图可以看出已经成功的把主节点6385的数据迁移到6380上去了,6385节点已经没有任何hash槽了,证明迁移成功!

#通过命令del-node删除6385主节点

/usr/local/redis/bin/redis-cli -a 123456 --cluster del-node 192.168.1.6:6385 6a14670fcf844b7ea35177a40b49ea50e36286fe

Redis高可用集群之水平扩展

#查看集群状态

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.6 -p 6380

192.168.1.6:6380>cluster nodes

Redis高可用集群之水平扩展

#平衡集群节点slot数量

/usr/local/redis/bin/redis-cli -a 123456 --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 192.168.1.6:6380

Redis高可用集群之水平扩展

话说一招回到解放前,但是Redis高可用集群水平扩展比较麻烦,删除水平扩展的节点同样比较麻烦,因为存在节点数据迁移,不然会存在数据丢失问题。

继续阅读