编辑
2024-02-20
运维配置
0
请注意,本文编写于 337 天前,最后修改于 196 天前,其中某些信息可能已经过时。

目录

服务器准备
准备集群文件夹
准备镜像
准备docker-compose.yml文件
使用redis-trib.rb创建redis 集群
详解redis-trib.rb 的命令
检查集群状态
redis-cli --cluster命令参数详解
参考的cluster命令
连接redis的某个节点
查看集群信息和节点信息
集群维护
新增节点
启动两个节点
添加一个主节点
查看集群信息
添加从节点到集群
设置主从关系
集群重新分片
节点移除
failover故障转移
auto-failover自动故障转移
manu-failover手动故障转移

服务器准备

ip备注
10.211.55.5

准备集群文件夹

shell
mkdir -p /opt/docker/redis-cluster/conf/{6001,6002,6003,6004,6005,6006}/data

准备镜像

shell
docker pull publicisworldwide/redis-cluster docker pull inem0o/redis-trib

准备docker-compose.yml文件

shell
touch /opt/docker/redis-cluster/docker-compose/docker-compose.yml
yaml
version: '3.5' services: redis1: image: publicisworldwide/redis-cluster network_mode: host restart: always volumes: - /opt/docker/redis-cluster/conf/6001/data:/data environment: - REDIS_PORT=6001 redis2: image: publicisworldwide/redis-cluster network_mode: host restart: always volumes: - /opt/docker/redis-cluster/conf/6002/data:/data environment: - REDIS_PORT=6002 redis3: image: publicisworldwide/redis-cluster network_mode: host restart: always volumes: - /opt/docker/redis-cluster/conf/6003/data:/data environment: - REDIS_PORT=6003 redis4: image: publicisworldwide/redis-cluster network_mode: host restart: always volumes: - /opt/docker/redis-cluster/conf/6004/data:/data environment: - REDIS_PORT=6004 redis5: image: publicisworldwide/redis-cluster network_mode: host restart: always volumes: - /opt/docker/redis-cluster/conf/6005/data:/data environment: - REDIS_PORT=6005 redis6: image: publicisworldwide/redis-cluster network_mode: host restart: always volumes: - /opt/docker/redis-cluster/conf/6006/data:/data environment: - REDIS_PORT=6006
shell
cd /opt/docker/redis-cluster/docker-compose/ docker-compose up -d

使用redis-trib.rb创建redis 集群

​ 使用 redis-trib.rb create 命令完成节点握手和槽分配过程

shell
docker run --rm -it inem0o/redis-trib create --replicas 1 hostip:6001 hostip:6002 hostip:6003 hostip:6004 hostip:6005 hostip:6006 #hostip 换成 主机的ip docker run --rm -it inem0o/redis-trib create --replicas 1 10.211.55.5:6001 10.211.55.5:6002 10.211.55.5:6003 10.211.55.5:6004 10.211.55.5:6005 10.211.55.5:6006 # 结果输入 yes

详解redis-trib.rb 的命令

shell
命令说明: redis-trib.rb help Usage: redis-trib <command> <options> <arguments ...> #创建集群 create host1:port1 ... hostN:portN --replicas <arg> #带上该参数表示是否有从,arg表示从的数量 #检查集群 check host:port #查看集群信息 info host:port #修复集群 fix host:port --timeout <arg> #在线迁移slot reshard host:port #个是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口 --from <arg> #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入 --to <arg> #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入。 --slots <arg> #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。 --yes #设置该参数,可以在打印执行reshard计划的时候,提示用户输入yes确认后再执行reshard --timeout <arg> #设置migrate命令的超时时间。 --pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10。 #平衡集群节点slot数量 rebalance host:port --weight <arg> --auto-weights --use-empty-masters --timeout <arg> --simulate --pipeline <arg> --threshold <arg> #将新节点加入集群 add-node new_host:new_port existing_host:existing_port --slave --master-id <arg> #从集群中删除节点 del-node host:port node_id #设置集群节点间心跳连接的超时时间 set-timeout host:port milliseconds #在集群全部节点上执行命令 call host:port command arg arg .. arg #将外部redis数据导入集群 import host:port --from <arg> --copy --replace

检查集群状态

shell
docker exec -it docker-compose-redis1-1 redis-cli --cluster check 10.211.55.5:6001

redis-cli --cluster命令参数详解

shell
redis-cli --cluster help Cluster Manager Commands: create host1:port1 ... hostN:portN #创建集群 --cluster-replicas <arg> #从节点个数 check host:port #检查集群 --cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点 info host:port #查看集群状态 fix host:port #修复集群 --cluster-search-multiple-owners #修复槽的重复分配问题 reshard host:port #指定集群的任意一节点进行迁移slot,重新分slots --cluster-from <arg> #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入 --cluster-to <arg> #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入 --cluster-slots <arg> #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。 --cluster-yes #指定迁移时的确认输入 --cluster-timeout <arg> #设置migrate命令的超时时间 --cluster-pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10 --cluster-replace #是否直接replace到目标节点 rebalance host:port #指定集群的任意一节点进行平衡集群节点slot数量 --cluster-weight <node1=w1...nodeN=wN> #指定集群节点的权重 --cluster-use-empty-masters #设置可以让没有分配slot的主节点参与,默认不允许 --cluster-timeout <arg> #设置migrate命令的超时时间 --cluster-simulate #模拟rebalance操作,不会真正执行迁移操作 --cluster-pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,默认值为10 --cluster-threshold <arg> #迁移的slot阈值超过threshold,执行rebalance操作 --cluster-replace #是否直接replace到目标节点 add-node new_host:new_port existing_host:existing_port #添加节点,把新节点加入到指定的集群,默认添加主节点 --cluster-slave #新节点作为从节点,默认随机一个主节点 --cluster-master-id <arg> #给新节点指定主节点 del-node host:port node_id #删除给定的一个节点,成功后关闭该节点服务 call host:port command arg arg .. arg #在集群的所有节点执行相关命令 set-timeout host:port milliseconds #设置cluster-node-timeout import host:port #将外部redis数据导入集群 --cluster-from <arg> #将指定实例的数据导入到集群 --cluster-copy #migrate时指定copy --cluster-replace #migrate时指定replace help For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

参考的cluster命令

shell
CLUSTER info:打印集群的信息。 CLUSTER nodes:列出集群当前已知的所有节点(node)的相关信息。 CLUSTER meet <ip> <port>:将ip和port所指定的节点添加到集群当中。 CLUSTER addslots <slot> [slot ...]:将一个或多个槽(slot)指派(assign)给当前节点。 CLUSTER delslots <slot> [slot ...]:移除一个或多个槽对当前节点的指派。 CLUSTER slots:列出槽位、节点信息。 CLUSTER slaves <node_id>:列出指定节点下面的从节点信息。 CLUSTER replicate <node_id>:将当前节点设置为指定节点的从节点。 CLUSTER saveconfig:手动执行命令保存保存集群的配置文件,集群默认在配置修改的时候会自动保存配置文件。 CLUSTER keyslot <key>:列出key被放置在哪个槽上。 CLUSTER flushslots:移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 CLUSTER countkeysinslot <slot>:返回槽目前包含的键值对数量。 CLUSTER getkeysinslot <slot> <count>:返回count个槽中的键。 CLUSTER setslot <slot> node <node_id> 将槽指派给指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽,然后再进行指派。 CLUSTER setslot <slot> migrating <node_id> 将本节点的槽迁移到指定的节点中。 CLUSTER setslot <slot> importing <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。 CLUSTER setslot <slot> stable 取消对槽 slot 的导入(import)或者迁移(migrate)。 CLUSTER failover:手动进行故障转移。 CLUSTER forget <node_id>:从集群中移除指定的节点,这样就无法完成握手,过期时为60s,60s后两节点又会继续完成握手。 CLUSTER reset [HARD|SOFT]:重置集群信息,soft是清空其他节点的信息,但不修改自己的id,hard还会修改自己的id,不传该参数则使用soft方式。 CLUSTER count-failure-reports <node_id>:列出某个节点的故障报告的长度。 CLUSTER SET-CONFIG-EPOCH:设置节点epoch,只有在节点加入集群前才能设置。

连接redis的某个节点

​ 成功后可连接redis集群中的某个节点,用以下命令

shell
docker exec -it docker-compose-redis1-1 redis-cli -c -h 10.211.55.5 -p 6001

查看集群信息和节点信息

shell
# 查看集群信息 cluster info # 查看集群结点信息 cluster nodes

集群维护

新增节点

启动两个节点

规划:一个作为主,一个作为从

为新增的节点,创建文件目录结构

shell
mkdir -p /opt/docker/redis-cluster/conf/{6007,6008}/data

准备compose编排文件,并且上传到 /opt/docker/redis-cluster/docker-compose-1/docker-compose.yml 目录

yaml
version: '3.5' services: redis1: image: publicisworldwide/redis-cluster network_mode: host restart: always volumes: - /opt/docker/redis-cluster/conf/6007/data:/data environment: - REDIS_PORT=6007 redis2: image: publicisworldwide/redis-cluster network_mode: host restart: always volumes: - /opt/docker/redis-cluster/conf/6008/data:/data environment: - REDIS_PORT=6008

启动两个节点

shell
docker-compose up -d
添加一个主节点

通过任意容器的shell终端,都可以执行 --cluster add-node 指令,增加一个新的节点,如 6007节点

shell
docker exec -it docker-compose-redis1-1 redis-cli --cluster add-node 10.211.55.5:6007 10.211.55.5:6001 // 第一个参数为新增加的节点的IP和端口,第二个参数为任意一个已经存在的节点的IP和端口。
查看集群信息
shell
docker exec -it docker-compose-1-redis7-1 redis-cli -c -h 10.211.55.5 -p 6007 cluster nodes
添加从节点到集群

跟添加主节点一样添加一个节点6008,然后连接上该节点并执行如下命令。通过任意容器的shell终端,都可以执行 --cluster add-node 指令,增加一个新的节点,如 6007节点

shell
docker exec -it docker-compose-redis1-1 redis-cli --cluster add-node 10.211.55.5:6008 10.211.55.5:6007
设置主从关系

连接6008,成为 6007的从节点

shell
// cluster replicate <nodeId> #进入从节点 docker exec -it docker-compose-1-redis8-1 redis-cli -c -h 10.211.55.5 -p 6008 cluster replicate 0ccbd1485ebee8fe74fd0c1362a65f969d808ec4 // 查看节点信息 cluster nodes

集群重新分片

如果对默认的平均分配不满意,我们可以对集群进行重新分片。执行如下命令,只需要指定集群中的其中一个节点地址即可,它会自动找到集群中的其他节点。重新分片的命令的格式:

shell
redis-cli -a <password> --cluster reshard ip:port

(如果设置了密码则需要加上 -a ,没有密码则不需要)。

shell
docker exec -it docker-compose-1-redis7-1 redis-cli --cluster reshard 10.211.55.5:6001

输入重新分配的槽数

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

输入你想接收这些哈希槽的节点ID

shell
What is the receiving node ID? 6007的id

输入想从哪个节点移动槽点,选择all表示所有其他节点,也可以依次输入节点ID,以done结束。

shell
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. Source node #1: 6001的id

输入yes执行重新分片

节点移除

第一个参数是任意一个节点的地址,第二个参数是你想要移除的节点ID。

shell
docker exec -it docker-compose-1-redis7-1 redis-cli --cluster del-node 10.211.55.5:6007 4656b8b2e26dd290928f45f9e4e001123c7ae36d

failover故障转移

auto-failover自动故障转移

当运行中的master节点挂掉了,集群会在该master节点的slave节点中选出一个作为新的master节点。

容器停止

docker-compose stop 是停止yaml包含的所有容器

停止6007

shell
docker-compose stop redis7

查看集群信息,此时该新节点已经成为集群的一份子

shell
docker exec -it docker-compose-1-redis8-1 redis-cli -c -h 10.211.55.5 -p 6008 cluster nodes

重启6007

shell
docker-compose up -d redis7

查看状态,会变成6008的从节点

manu-failover手动故障转移

​ 通过故障转移将master其转为slave,再进行升级操作来避免对集群的可用性造成很大的影响。Redis集群使用 cluster failover 命令来进行故障转移,不过要在被转移的主节点的slave从节点上执行该命令。也就是说,使用redis-cli连接slave节点并执行 cluster failover命令进行转移。

​ 现在,6007 为从, 6008为主,在6007上进行故障转移,连接6007

shell
docker exec -it docker-compose-1-redis7-1 redis-cli -c -h 10.211.55.5 -p 6007 cluster failover

本文作者:whitebear

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!