Redis优化基础[021]docker-compose编排redis cluster & 集群伸缩

源码: https://github.com/masterzcw/docker/tree/master/redis-cluster

安装 docker与docker-compose

可能存在docker与docker-compose安装冲突的问题
先安装docker https://www.cnblogs.com/harlanzhang/p/9965534.html 比如指定docker-ce-18版本的就ok了,然后安装docker-compose 不要用pip的方式安装 ,利用官方的方式安装https://github.com/docker/compose/releases
查看版本

# docker-compose -v

一般步骤
1. 定义 Dockerfile, 方便迁移到任何地方;
2. 编写 docker-compose.yml文件;
3. 运行 docker-compose up启动服务

构建镜像

# docker build -t redis-cluster-pro .
# docker-compose up -d

redis配置文件

节点端口
port xxxx
开启集群模式
cluster-enabled yes
节点超时时间,单位毫秒
cluster-node-timeout 15000
集群内部配置文件
cluster-config-file “nodes-6379.conf”

相关命令

自定义网络

# docker network ls
# docker network rm 1f23cfde6fd0

握手和分配槽

进入任意一个主节点容器

# docker exec -it redis-master1

在容器里面

# redis-trib.rb help

握手和分配槽

# redis-trib.rb create --replicas 1 192.168.11.125:6391 192.168.11.125:6392 192.168.11.125:6393 192.168.11.125:6394 192.168.11.125:6395 192.168.11.125:6396

集群扩容操作

迁移槽命令
redis-trib.rb reshard host:port --from --to --slots --yes --timeout --pipeline
参数说明:
·host:port:必传参数,集群内任意节点地址,用来获取整个集群信息。
·–from:指定源节点的 id,如果有多个源节点,使用逗号分隔,如果是all源节点变为集群内所有主节点,在迁移过程中提示用户输入。
·–to:需要迁移的目标节点的id,目标节点只能填写一个,在迁移过程中提示用户输入。
·–slots:需要迁移槽的总数量,在迁移过程中提示用户输入。
·–yes:当打印出 reshard 执行计划时,是否需要用户输入yes确认后再执行 reshard。
·–timeout:控制每次 migrate 操作的超时时间,默认为60000毫秒。
·–pipeline:控制每次批量迁移键的数量,默认为10。

伸缩时的run节点模板

# docker run -itd --name redis-master1 -v /user/docker/redis/config:/config --net redis-cluster_redis-master -e PORT=6351 -p 6351:6351 -p 16351:16351 --ip 172.50.0.5 redis-cluster

** 启动节点 **

# docker run -itd --name redis-master1 -v /user/docker/redis/config:/config --net redis-cluster_redis-master -e PORT=6354 -p 6354:6354 -p 16354:16354 --ip 172.50.0.54 redis-cluster
# docker run -itd --name redis-master1 -v /user/docker/redis/config:/config --net redis-cluster_redis-master -e PORT=6334 -p 6334:6334 -p 16334:16334 --ip 172.50.0.34 redis-cluster

** 加入集群 **

# redis-trib.rb add-node 要加入的节点             原有节点
# redis-trib.rb add-node 192.168.11.125:6354 192.168.11.125:6351
# redis-trib.rb add-node 192.168.11.125:6334 192.168.11.125:6351

** 迁移槽 **

# redis-trib.rb reshard 192.168.11.125:6351
要迁移的槽的数量:
to node:
from nodes: … done

** 配置主从关系 **

# redis-cli -h 192.168.11.125 -p 6334
> cluster nodes
> cluster replicate 751f26b6769aacca2cb2f3475f576352dd47591b

** 平衡节点的槽数量 **
redis-trib.rb rebalance ip:port

# redis-trib.rb rebalance 192.168.11.125:6351

集群收缩操作

** 迁移槽 **

# redis-trib.rb reshard 192.168.11.125:6351

迁移槽, 从将要移除的节点, 平均分配给其他主节点
** 退出集群 **

# redis-trib.rb del-node 192.168.11.125:6354 751f26b6769aacca2cb2f3475f576352dd47591b
# redis-trib.rb del-node 192.168.11.125:6355 fb766d2331eef90e09a025ef572b13275c0e56d5
# redis-trib.rb del-node 192.168.11.125:6334 2fa797c17d1789c021b5b77c2d068386e965ecfa
# redis-trib.rb del-node 192.168.11.125:6335 0846b309ad9eb8008815ccc9d3edff4b2b2bc74c

手动呈现集群握手和操分配

集群信息

127.0.0.1:6379> cluster info

集群节点

127.0.0.1:6379> cluster nodes

握手

127.0.0.1:6379> cluster meet 192.168.11.125 6391

再次查看集群节点

127.0.0.1:6379> cluster nodes
64c8938e7053f09d981bfcaf4f40643086ad8b29 192.168.11.125:6396 master - 0 1565055486656 0 connected
4bbb9cf04fefde49fcd2cced24945053e4bea7aa 192.168.11.125:6392 master - 0 1565055487666 0 connected
408a6c13215d2768ad8c309b3bdfc2e1be50e00d 192.168.11.125:6391 master - 0 1565055483634 0 connected
a928e89940183bd0f9328d1318a53b8e0526cf30 192.168.11.125:6393 master - 0 1565055485650 0 connected
f928a201408b2d08c55b582630ebb20404679534 192.168.11.125:6395 master - 0 1565055484641 0 connected
280bf3a90c258ee5968b3b8ed3ee3071568a49d1 :6379 myself,master - 0 0 1 connected

该命令输出的内容与一下文件相同

/var/lib/redis/nodes-6379.conf

该文件的路径和文件名在配置文件中的体现如下

dir "/var/lib/redis"
cluster-config-file nodes-6379.conf

设置从节点, 6394作为6391的从节点

# redis-cli -h 192.168.11.125 -p 6394

在6394中replicate 6391的ID

192.168.11.125:6394>cluster replicate 408a6c13215d2768ad8c309b3bdfc2e1be50e00d

再次查看集群节点, 已经呈现出主从关系

192.168.11.125:6394> cluster nodes


408a6c13215d2768ad8c309b3bdfc2e1be50e00d 192.168.11.125:6391 master - 0 1565056262646 0 connected
280bf3a90c258ee5968b3b8ed3ee3071568a49d1 :6379 myself,slave 408a6c13215d2768ad8c309b3bdfc2e1be50e00d 0 0 1 connected

要完成握手是要每个节点meet所有的其他节点, 并完成每个主从的绑定
分配槽, 利用bash特性批量设置槽

# redis-cli -h 192.168.11.125 -p 6391 cluster addslots {0..5461}
# redis-cli -h 192.168.11.125 -p 6392 cluster addslots {5462..10922}
# redis-cli -h 192.168.11.125 -p 6393 cluster addslots {10923..16383}

集群模式进入客户端, 可以操作整个集群 而不是只有当前节点(与分布式算法相关)

# redis-cli -c -h 192.168.11.125 -p 6391 get peter

redis-trib.rb 搭建集群

redis-trib.rb 是采用 Ruby 实现的 Redis 集群管理工具。内部通过 Cluster 相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装 Ruby 依赖环境。下面介绍搭建集群的详细步骤。
内部通过 Cluster 相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装 Ruby 依赖环境,相关扩展这个我在dockerfile文件当中已经写了指令,查看下理解意思就可以了。
启动好6个节点之后,使用 redis-trib.rb create 命令完成节点握手和槽分配过程

redis-trib.rb create --replicas 1 <ip>:<port> ... <ip>:<port>

–replicas 参数指定集群中每个主节点配备几个从节点,这里设置为1,redis-trib.rb 会尽可能保证主从节点不分配在同一机器下,因此会重新排序节点列表顺序。节点列表顺序用于确定主从角色,先主节点之后是从节点。创建过程中首先会给出主从节点角色分配的计划,并且会生成报告

命令说明:

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 
    n 是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口
    --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
–copy
–replace

客户端集群命令

CLUSTER info: 打印集群的信息.
CLUSTER nodes: 列出集群当前已知的所有节点(node)的相关信息.
CLUSTER meet : 将ip和port所指定的节点添加到集群当中.
CLUSTER addslots [slot …]: 将一个或多个槽(slot)指派(assign)给当前节点.
CLUSTER delslots [slot …]: 移除一个或多个槽对当前节点的指派.
CLUSTER slots: 列出槽位、节点信息.
CLUSTER slaves <node_id>: 列出指定节点下面的从节点信息.
CLUSTER replicate <node_id>: 将当前节点设置为指定节点的从节点.
CLUSTER saveconfig: 手动执行命令保存保存集群的配置文件,集群默认在配置修改的时候会自动保存配置文件.
CLUSTER keyslot : 列出key被放置在哪个槽上.
CLUSTER flushslots: 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点.
CLUSTER countkeysinslot : 返回槽目前包含的键值对数量.
CLUSTER getkeysinslot : 返回count个槽中的键.
CLUSTER setslot node <node_id> 将槽指派给指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽,然后再进行指派.
CLUSTER setslot migrating <node_id> 将本节点的槽迁移到指定的节点中.
CLUSTER setslot importing <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点.
CLUSTER setslot 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,只有在节点加入集群前才能设置.

<<深入分布式缓存-从原理到实践>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值