安全稳定实现redis cluster自动化迁移
背景
目前redis集群最火的是codis和redis cluster(官方),但官方自带工具并没有支持密码操作。那么需要密码认证使用redis cluster集群的同学要仔细看了哦。
相信大家很多人已经使用了redis cluster,而且也肯定会用到核心应用,你是否考虑过如下问题?
-
redis cluster无密码,被改数据
-
redis cluster无密码,被flushall (你是否有要哭的冲动哈哈)
-
redis cluster无密码,数据在光天化日(你对用户不负责)
-
redis cluster无密码,你要担心各种被黑(日志好苦)
此时你是否需要密码认证?(我猜你想立刻马上),哈哈问题来了,你在创建集群和管理时是否遇到如下麻烦?
-
redis cluster 官方redis-trib.rb 不支持密码,你要手工用命令一个一个加入集群
-
添加减节点不方便
-
更重要的是你的分片工具不能用,你要抓狂么?
-
管理需要手工
-
你要疯掉
有没有办法解决呢?有,我相信很多公司已经会用认证方式来管理,只是目前我是没搜到相关资料。怎么办?
我有办法!
-
原封不动的封装了redis cluster 集群添加减节点功能,并支持密码认证
-
针对对同台机器多master挂掉后集群不可用时,自动快速迁移槽位进行修复,保证程序可用
-
自动对新加节点迁移槽位
-
自动迁移槽位和数据给指定节点
-
自动根据当前结点master进行自动分片
你是不是已经心动了呢?那么接下来让你更想行动!
Redis cluster 集群介绍
-
多个Redis间节点间共享数据的程序集
-
通过分区(partition)来提供一定程度的可用性
-
使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现包含 16384 个哈希槽,也就是可以扩展16384实例
-
节点自动发现,从节点自动升级为主节点无需人工操作
-
slave->master 选举,自动集群容错
-
无中心化
-
gossip 协议来发布广播消息,基于P2P协议,无代理
-
水平扩展
-
在Cluster推出之前,可用性要靠Sentinel保证。有了集群之后也自动具有了Sentinel的监控和自动Failover能力。
-
具体参考:官方文档:http://www.redis.cn/topics/cluster-tutorial.html
-
官方使用自带的ruby工具(redis-trib.rb)不支持密码
集群相关命令介绍
1、集群
2、节点
3、键
环境准备
1、程序下载地址:
2、系统依赖环境:
命令使用方法:
机器环境准备
安装部署:
ip地址:
1、下载安装redis在此不做介绍
2、两台机器分别创建7000-7002端口并启动redis
ip地址及端口如下:至于主从怎么安排自己定义(但在生产环境建议主从分开部署在不同机器)
主要文件配置
迁移工具对集群进行测试
1、在218上启动各个redis后 ,查看当前集群信息
2、利用初始化槽位slot,将所有槽位分给此节点
集群状态
查看日志显示如下:说明槽位已经ok,状态正常
2.1 查看集群信息已经分配
再次显示集群状态:
2.2 在205 上启动所有节点
执行如下命令,我是将不同端口使用不通配置文件,可自行安排
2.3 在218 上添加新节点
添加新节点
2.4 查看集群状态
2.5 对新加的节点进行分配slot
2.5.1 自动分配slot给205:7000和218:7000 节点
#注:根据本机多个master 进行自动分配。
#对CLUSTER SETSLOT <slot> NODE <node_id> 此命令进行的循环封装。会默认把0-16383个槽位均分到当前master节点
#分配方法:16383/当前master节点总数 然后进行节点循环设置槽位
#注意红色ip部分,显示对81槽位进行广播,在205 和218 上都进行广播,将81给node节点2404b44e4937c65c73cbccb778776e392619c776 ,节点是自行判断无需指定
2.5.2 查看集群信息:
#发现已经平均分配
2.5.3 插入数据测试:
#先手动进行插入数据测试集群是否正常
#自动set数据测试脚本如下
#-c 参数为支持集群模式
3、手动迁移数据
3.1 先手动进行模拟测试:
#为了测试工具的可用性及对比,先进行手动测试,看是否迁移数据成功
显示集群信息
3.2 将9842 槽位从172.16.10.218:7000节点导入172.16.10.205:7000节点
3.3 将9842 槽位从172.16.10.218:7000节点迁出172.16.10.205:7000节点
3.4 计算218 节点9842 槽位的key
3.5 列出key值
3.6 迁移key
3.7 获取143511 key的值
3.8 再次获取集群信息:
4、自动迁移
4.1 218:7000 迁移槽位及数据到 205:7000
#上面手动演示了数据迁移正常流程
#此时是封装了上面手动数据迁移的命令,将8193-8999槽位 迁走
集群信息如下
4.2 在查看集群信息
4.3 随机找个key值计算槽位:
4.4 get key值测试:
4.5 再到205:7000 节点读取
4.6 设置密码:
5、添加减节点测试
5.1 添加节点
5.2 添加从节点
将205每个端口都作为218对应端口的从(可根据自己进行定义)
#对cluster replicate命令的封装
获取集群信息
5.3 删除从节点
5.4 修改从节点
5.5 提升slave为master
将218:7003端口从节点提升为master
获取集群信息
获取集群状态
测试集群故障
1、自动分片
2、关闭其中一个主
3、查看集群状态