天天看点

安全稳定实现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、集群

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

2、节点

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

3、键

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

环境准备 

1、程序下载地址:

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

2、系统依赖环境:

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

命令使用方法:

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

机器环境准备  

安装部署:

ip地址:

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

1、下载安装redis在此不做介绍

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

2、两台机器分别创建7000-7002端口并启动redis

ip地址及端口如下:至于主从怎么安排自己定义(但在生产环境建议主从分开部署在不同机器)

主要文件配置

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

迁移工具对集群进行测试  

1、在218上启动各个redis后 ,查看当前集群信息

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

2、利用初始化槽位slot,将所有槽位分给此节点

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

集群状态

查看日志显示如下:说明槽位已经ok,状态正常

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

2.1 查看集群信息已经分配

再次显示集群状态:

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

2.2 在205 上启动所有节点

执行如下命令,我是将不同端口使用不通配置文件,可自行安排

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

2.3  在218 上添加新节点

添加新节点

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

2.4 查看集群状态

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

2.5 对新加的节点进行分配slot

2.5.1 自动分配slot给205:7000和218:7000 节点

#注:根据本机多个master 进行自动分配。

#对cluster setslot <slot> node <node_id> 此命令进行的循环封装。会默认把0-16383个槽位均分到当前master节点

#分配方法:16383/当前master节点总数 然后进行节点循环设置槽位

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

#注意红色ip部分,显示对81槽位进行广播,在205 和218 上都进行广播,将81给node节点2404b44e4937c65c73cbccb778776e392619c776 ,节点是自行判断无需指定

2.5.2 查看集群信息:

#发现已经平均分配

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

2.5.3 插入数据测试:

#先手动进行插入数据测试集群是否正常

#自动set数据测试脚本如下

#-c 参数为支持集群模式

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

3、手动迁移数据

3.1 先手动进行模拟测试:

#为了测试工具的可用性及对比,先进行手动测试,看是否迁移数据成功

显示集群信息

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

3.2 将9842 槽位从172.16.10.218:7000节点导入172.16.10.205:7000节点

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

3.3 将9842 槽位从172.16.10.218:7000节点迁出172.16.10.205:7000节点

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

3.4 计算218 节点9842 槽位的key

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

3.5 列出key值

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

3.6 迁移key

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

3.7 获取143511 key的值

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

3.8 再次获取集群信息:

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

4、自动迁移

4.1 218:7000 迁移槽位及数据到 205:7000

#上面手动演示了数据迁移正常流程

#此时是封装了上面手动数据迁移的命令,将8193-8999槽位 迁走

集群信息如下

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

4.2 在查看集群信息

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

4.3 随机找个key值计算槽位:

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

4.4 get key值测试:

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

4.5 再到205:7000 节点读取

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

4.6 设置密码:

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

5、添加减节点测试

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

5.1 添加节点

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

5.2 添加从节点

将205每个端口都作为218对应端口的从(可根据自己进行定义)

#对cluster replicate命令的封装

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

获取集群信息

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

5.3 删除从节点

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

5.4 修改从节点

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

5.5 提升slave为master

将218:7003端口从节点提升为master

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

获取集群状态

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

测试集群故障  

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

1、自动分片

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

2、关闭其中一个主

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

3、查看集群状态

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

作者介绍  庞阔

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

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

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

<b></b>

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