UDN-企业互联网技术人气社区

板块导航

浏览  : 1328
回复  : 0

[教程技巧] 如何使用Docker实现Redis 3.0集群的一键部署交付?

[复制链接]
小辫儿的头像 楼主
发表于 2016-6-24 15:06:44 | 显示全部楼层 |阅读模式
  开篇:

  Redis在3.0之后开始支持sharding集群。Redis集群可以让数据自动在多个节点上分布。如何使用Docker实现Redis集群的一键部署交付,是一个有趣的并且有价值的话题。

  本文将给大家介绍基于进程的容器技术实现Redis sharding集群的一键部署,充分展现了容器的强大威力。

  什么是Redis sharding集群

  Redis(redis.io)作为最流行的KV数据库,很长一段时间都是单机运行,关于如何实现Redis的数据在多个节点上的分布,在Redis3.0出来之前,有很多第三方的方案。建议大家参考这个链接:

  http://redis.io/topics/partitioning

  Client hash

  这是最简单的实现,通过在客户端利用一致性hash算法,将数据分布到不同节点。这种方法的缺点非常明显,缺少故障自动failover能力,并且在扩容时数据分布的搬迁,也比较费劲。

  代理模式

  一个是Redis官方推荐的Twemproxy,是由twitter公司开发;

  另一个是国内豌豆荚开源的codis;

  代理模式最大的好处是仍然使用redis单机的sdk进行开发,维护简单。

  Redis Cluster

  redis3.0继2.8推出sentinel主从自动failover功能后,推出了sharding集群,这就是Redis Cluster。

  本次分享主要是介绍如何将Redis集群实现一键的部署,参考文档:

  http://redis.io/topics/cluster-tutorial

  1、准备redis镜像

  Redis官方已经提供了Redis 3.2和3.3的镜像,都可以用来作为Redis集群的镜像,3.2是稳定版本。

  目前官方推出了alpine版本的Redis镜像,alpine镜像的优势是体积小。此次分享是采用官方的redis:3.2-alpine的镜像来做集群。

  2、准备初始化脚本的执行环境

  redis官方提供了一个ruby的脚本redis-trib.rb,这个脚本可以用来初始化集群、resharding集群、rebalance集群等。

  我们使用官方的脚本来初始化集群。该脚本的运行需要ruby环境,我们来构建一个redis-trib镜像,以下是构建redis-trib镜像的Dockerfile内容:

  cat Dockerfile
  1. FROM ruby:2.3.1-alpine

  2. ADD https://raw.githubusercontent.com/antirez/redis/3.2.0/src/redis-trib.rb /usr/local/bin/redis-trib.rb

  3. RUN gem install redis && chmod 755 /usr/local/bin/redis-trib.rb && \
  4.   sed -i '/yes_or_die.msg/a return if ENV["QUIET_MODE"] == "1"' /usr/local/bin/redis-trib.rb

  5. ADD entrypoint.sh /entrypoint.sh

  6. ENTRYPOINT [“/entrypoint.sh"]
复制代码

  脚本文件
  1. cat entrypoint.sh

  2. #!/bin/sh

  3. if [ "$CLUSTER_CMD" = create ]; then
  4.   if [ -f /usr/local/etc/redis-trib.conf ] ; then
  5.     . /usr/local/etc/redis-trib.conf
  6.     QUIET_MODE=1 redis-trib.rb create --replicas $REPLICAS $NODES
  7.   fi
  8. fi
复制代码

  上面两个文件用来构建redis-trib镜像,Dockerfile中的逻辑比较简单,将github中的redis-trib.rb文件添加到镜像中,并让脚本执行支持非交互模式(QUIET_MODE)。

  镜像启动时,将执行集群初始化命令。

  3、准备redis集群配置文件
  1. port 6379
  2. cluster-enabled yes
  3. cluster-config-file nodes.conf
  4. cluster-node-timeout 5000
  5. appendonly yes
复制代码

  redis集群的配置文件我们一般放到数据目录/data下,redis进程对/data目录拥有可读写的权限。

  4、准备redis-trib脚本配置文件,用于集群初始化参数获取

  entrypoint.sh文件中,最主要的是读取redis-trib.conf配置文件,配置文件的格式非常简单
  1. REPLICAS={{.REPLICAS_NUM}}
  2. {{ $rs := service "redis" }}
  3. NODES="{{range $i,$rc := $rs.Containers}} {{$rc.IPAddr}}:6379{{end}}"
复制代码

  REPLICAS的意思是每个分片有几个slave,一般配置1个slave ,即REPLICAS=1NODES的意思是集群的每个节点,包括master和slave。

  所以如果有10个节点,REPLICAS=1的话,那么将有5个分片(slices)。

  编排集群

  准备好上述镜像和配置文件后,我们开始编排集群

  第一步:创建模版
2.png

  第二步:选择镜像,添加redis服务
2.png

  第三步:设置容器参数
2.png

  第四步:设置健康检查策略
2.png

  第五步:设置redis容器部署策略
2.png

  添加redis集群初始化服务redis-trib

  第一步:选择镜像
2.png

  第二步:设置容器参数
2.png

  第三步:设置redis-trib容器部署策略

  redis-trib要在redis容器启动完成后再启动,所以启动优先级要比redis低。
2.png

  通过以上步骤,编排好了Redis-sharding应用模版。

  基于Redis-sharding应用模板,一键部署Redis Cluster

  以下是部署后的效果图:
2.png

 查看redis-trib集群初始化后的结果,看到集群的初始化过程没有问题;
2.png

  验证:登录到任意一台redis节点执行redis-cli info:
2.png

  以上内容分享了基于进程的容器技术,实现了Redis sharding的一键交付。
2.png

  你会部署了吗?

  so easy

  分享后讨论更是激烈:

  Q1: 如果我想在一个机器上部署多个redis实例可以吗?

  A1: 可以

  Q2: 问下你们ui编排工具是自主研发还是基于什么开源工具?内部逻辑是什么.?

  A2: 自主研发的。

  通过易用的界面对Docker容器运行参数进行设置和保存。

  每个容器运行参数和优先级以及部署策略构成一个个服务,多个服务组合成一个可以一键部署的应用模版。

  Q3:redis集群的Docker我看ip都是同网段的。这个是单独的Docker管理工具处理的?如果只单纯搭建redis集群,而无Docker集群管理。这个多个redis node如何管理?

  A3:csphere平台内部支持网络管理功能,并在背后拥有自动的可编程的服务发现能力,使得自动化部署集群成为可能。

  如果脱离Docker手工部署,按照官方文档一步步操作即可

  Q4: 请问这里的模板数据是何时传入进去的?

  A4: 模板数据分两种:

  配置文件模板里定义的模板变量,这类数据是在创建应用实例时用户通过cSphere管理平台填写的;

  集群服务相关的元数据,如每个容器的IP地址、容器所在的主机参数等,这类数据是cSphere应用编排引擎在创建应用实例时,自动从集群各节点收集并注册到配置模板解析引擎的配置文件模板经解析生成最终配置文件,然后装载到每一个容器里

  Q5:请问redis-cluster的扩容、缩容,resharding如何处理的呢?

  A5: 扩容增加节点的话,触发trib脚本重新resharding,减少节点的话,则需要在前面先执行,trib脚本里面有添加删除节点的命令

  Q6: 这是你们的商业平台?还是openstack集成Docker的结果?

  A6:我们的商业平台,为企业提供整体的PaaS解决方案。希云cSphere平台底层是Docker,希云cSphere平台可以部署在OpenStack平台之上。

  Q7: redis3.0目前自己出的这个Q5集群方案稳定吗?有没有经过大量的数据测试!效率如何?因为我不是专业做运维的,我是做开发的对运维的知识比较感兴趣但是不专业,希望能得到一个经过数据支撑的答案

  A7: redis当前的集群稳定性是比较好的,国内外有大量互联网企业大规模的使用,据我所知,唯品会的redis集群规模在500台以上

  Q8: 你们的pass平台在部署容器时还能指让用户自主定制部署策略?这样做的目的是什么?

  A8:不同类型的应用有不同的资源偏好,比如CPU密集型的,磁盘IO密集型的,通过调度策略的选择,用户可以更深度的控制容器在主机集群上的分布,使应用获得更好的运行效果。

  Q9: redis用Docker做集群,在内存方面有什么需要额外注意的地方吗?

  A9:内存方面注意设置内核vm相关参数,另外配置文件里可以加入内存最大大小的设置等,如果要自动化,可以自动获取容器的内存配额或主机节点的内存size自动计算

原文作者: 张春源 来源:高效运维

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部