安全稳定实现redis cluster自动化迁移

    xiaoxiao2026-04-08  4

    背景  

     

    目前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、查看集群状态

     

     

    作者介绍  庞阔

    优朋普乐高级数据库工程师。

    做过运维,熟练使用常见web应用,目前主要负责公司MySQL数据库、memcache、redis cluster的管理维护,及数据库平台的研发,擅长利用perl、shell、php编写管理工具。

    参与公司各项目数据库设计和架构评审。

    本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-04-14

    最新回复(0)