动手部署属于自己的高可用的分布式redis集群吧——开源了!!!支持redis节点高可用的twemproxy

阿凡达2018-07-10 13:17

继上篇《支持redis节点高可用的twemproxy》一文描述,我们有计划对二次开发的twemproxy进行开源,好消息是,我们已经完成修改并验证测试通过,现第一时间分享给大家,源码地址:https://github.com/helifu/twemproxy-163

配置
一如之前博文的约定,我们删除了manager交互模块,把groups列表和sentinels列表的配置改为来自静态配置文件, twemproxy的配置文件
alpha:
listen: 0.0.0.0:6379
hash: murmur
hash_tag: "{}"
distribution: ketama
timeout: 400
redis_auth: 123456
groups:
- groups_helf_0
- groups_helf_1
- groups_helf_2
- groups_helf_3
sentinel_heartbeat: 2000
sentinels:
- 10.164.97.188:26379 sentinel0
- 10.164.97.189:26379 sentinel1
- 10.164.97.190:26379 sentinel2
其中[groups]段表示分布式实例包含的主从redis组,twemproxy将以组名进行一致性哈希;[sentinels]段表示redis-sentinel集群,用于主从节点failover。这里只写了一个pool,实际上和原生一样是支持多个pool的。
控制流
因为删除了manager模块,所以控制流上稍微有一点变化:


  • 箭头1:sentinel get-master-addr-by-name req;
  • 箭头2:sentinel get-master-addr-by-name rsp;
  • 箭头3:redis auth & role req;
  • 箭头4:redis auth & role rsp;
  • 箭头5:sentinel psubscribe +switch-master req;
  • 箭头6:sentinel psubscribe +switch-master rsp;
  • 箭头7:sentinel pmessage;
  • 5/6是twemproxy与sentinel的心跳消息,7是主从切换通知消息;
部署
编译过程这里不描述,下面介绍分布式实例部署过程:
  1. 确定redis主从分组数量及组名:即分片数量,举例(以下均以此为例):比如3组,组名分别为group_test_1、group_test_2、group_test_3;
  2. 启动6个redis节点:2个为一组,redis1/redis2归属group_test_1,redis3/redis4归属group_test_2,redis5/redis6归属group_test_3;使redis2为redis1的从节点,命令:slaveof redis1_ip redis1_port,config set masterauth password(所有节点密码一样),其他2组类似;
  3. 启动3个redis-sentinel节点(奇数个):监控这3组,命令:sentinel monitor group_test_1 redis1_ip redis1_port 2,sentinel set group_test_1 auth-pass password,sentinel set group_test_1 down-after-millseconds 5,每个redis-sentinel都需要设置一遍;
  4. 启动twemproxy:把groups列表和sentinel列表写入配置文件,启动命令:nutcracker -d -v 5 -o nutcracker.log -c nutcracker.yml -i 10000 -p nutcracker.pid
自此部署完成,可以使用客户端工具比如redis-cli连接twemproxy进行测试,看数据是否分片,主从节点上是否一致等;
测试
业务流层面的测试验证,这里不描述,我们主要关注以下2点:
  1. redis主节点异常;
  2. redis-sentinel节点异常;
针对第1点:直接kill选定组的redis主节点,比如group_test_1的为redis1,因为前面设置了down-after-millseconds为5,即5秒钟后发生主从切换,5秒钟后自动切换到redis2上,可以在redis2上用info命令检查,再检查twemproxy与redis2的连接是否正常;
针对第2点:直接kill当前连接着的redis-sentinel节点,1秒钟后,twemproxy会自动切换到下一个redis-sentinel上;

全文结束,各位看官可以动手部署属于自己的高可用的分布式redis集群了,

本文来自网易实践者社区,经作者何李夫授权发布。