该系列博文之上一篇:传送门 走你
上篇文章说了怎么样来手动搭建Redis集群,由此可见步骤繁琐且麻烦,而且 生产环境中是不会来这样手动搭建集群的。本篇文章我们使用redis-trib.rb工具来自动搭建Redis集群。
一、redis-trib.rb工具的简单介绍
redis-trib.rb 是采用 Ruby 实现的 Redis 集群管理工具。内部通过 Cluster 相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装 Ruby 依赖环境。redis-trib.rb工具是redis源码中自带的一个工具,redis-trib.rb工具在上篇博文中的素材当中我已经提供了,相关扩展我在Dockerfile(上篇博文中提供的素材中的Dockerfile文件)文件当中已经写了指令,查看下理解意思就可以了。
启动好6个或者N个节点之后,使用 redis-trib.rb create 命令完成节点握手和槽分配过程。
redis-trib.rb create --replicas 1 119.3.220.26:6391 119.3.220.26:6392 119.3.220.26:6393 119.3.220.26:6394 119.3.220.26:6395 119.3.220.26:6396
--replicas 参数指定集群中每个主节点配备几个从节点,这里设置为1,redis-trib.rb 会尽可能保证主从节点不分配在同一机器下,因此会重新排序节点列表顺序。节点列表顺序用于确定主从角色,先是主节点然后是从节点。创建过程中首先会给出主从节点角色分配的计划,并且会生成报告。
注意:redis-trib.rb最好是下载对应版本的。
二、使用redis-trib.rb工具搭建redis集群
2.1、承接上篇博文,先强制删除上篇博文中生成的redis集群容器,然后重新搭建。如果自己的环境没有这一步可自行忽略该步骤。
docker rm -f $(docker ps -aq)
2.2、使用docker-compose重新编排redis节点容器
cd /usr/docker/redis/ #进入编排文件所在的目录,根据自身情况修改 docker-compose -p redis-cluster up -d #使用编排文件创建6个redis节点容器
2.3、随便进入刚刚创建好的6个redis节点中的任意一台(这里进入redis-master1这台redis节点容器里面)
docker exec -it redis-master1 bash #进入redis-master1这个节点容器里面 由于上篇的疏忽,忘了给redis-trib.rb文件赋予执行权限,这里给赋予执行权限 chmod +x /usr/bin/redis-trib.rb
2.4、使用redis-trib.rb create命令创建redis集群
redis-trib.rb create --replicas 1 119.3.220.26:6391 119.3.220.26:6392 119.3.220.26:6393 119.3.220.26:6394 119.3.220.26:6395 119.3.220.26:6396
注意:记得把ip换成自己的
然后会看到如下截图的信息:
由上图可以看到端口号为:6391、6392、6393的是主节点 6394、6395、6396是从节点。而上面的M代表主节点,也就是Master,而S代表从节点也就是Slave。
而类似于4a7c8b623e3a7bb34835380b3149a9b69e28c8b1之类的一大长串的字符串是每一台redis节点的node_id。
而且由上图也可以看出,我们这里是6台redis节点,redis-trib.rb工具会自动给我们按照顺序将前三台(6391、6392、6393)作为主节点,后三台(6394、6395、6396)作为从节点。并且会自动将6394作为6391的从节点,6395做为6392的从节点,6396做为6393的从节点,也就是说会自动把主从关系给配置好。
再次声明:搭建Redis Cluster集群至少需要6台节点,也就是6台服务器。
2.5、输入yes等待配置完成
截图如下:
2.6、验证主从是否自动搭建成功
进入6个Redis节点容器中的任意一台,比如说进入一台redis从节点,我这里进入redis-slave3这台从节点里面
docker exec -it redis-slave3 bash #进入redis-slave3这台从redis节点容器里面 redis-cli -p 6396 #打开redis客户端 cluster nodes #查看节点信息
示例截图如下:
由上图可见,我们的redis集群已经自动搭建成功啦。。
对比上篇博文的手动搭建redis集群,这里自动搭建就省事很多了。。就是一条命令的事。。
2.7、模拟说明一下redis cluster自动故障转移处理(这里就不对应一一截图了,用文字描述了)
①、停止3台master节点的redis容器中的任意一台容器,这里我选择停止redis-master1这台主redis节点容器(这里只能选择停止master节点,因为只有挂掉master节点的redis cluster才会做自动故障转移处理,反之 从节点不会,但是一个master节点可以挂多个slave节点)
docker stop redis-master1 #让redis-master1这台主redis节点容器停止掉
②、进入剩余5台redis节点容器中的任意一台,这里我选择进入redis-slave1这台从redis节点容器
docker exec -it redis-slave1 bash #进入redis-slave1这台从redis节点容器里面 redis-cli -p 6394 cluster nodes #查看redis集群节点信息,会发现redis-master1这台节点已经显示挂掉了,而其余的5台redis节点以及角色都发生了变化,有可能6394这台从redis节点已经被自动变成了主redis节点,这就是redis cluster集群的自动故障转移处理机制
③、再次重新启动redis-master1这台redis节点容器
docker start redis-master1 #启动redis-master1这台redis节点容器 #然后再次在6394这台redis节点中再次使用 cluster nodes 命令查看redis集群节点信息,会发现之前redis-master1这台redis节点容器的角色是master,此时已经变成了slave,至于变成了那个master下的slave,可以根据cluster nodes显示的节点信息来查看
搭建集群的注意事项:保证节点的数量
三、redis-trib.rb工具的其它常用命令
使用 redis-trib.rb help 命令查看redis-trib.rb工具的使用帮助说明
#创建集群
create host1:port1 ... hostN:portN
--replicas <arg> #带上该参数表示是否有从,arg表示从的数量
#检查集群的一些状态
check host:port
#查看集群信息
info host:port
#修复集群
fix host:port
--timeout <arg>
#在线迁移slot(迁移数据或数据槽)
reshardhost: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
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。
精彩评论