张春源
希云cSphere合伙人,国内早期的Docker布道者,对企业应用Docker化有丰富的实践经验,擅长利用Docker践行Devops文化。国内第一套Docker系列实战视频课程讲师,视频播放量累计10万+node
Redis在3.0以后开始支持sharding集群。Redis集群可让数据自动在多个节点上分布。如何使用Docker实现Redis集群的一键部署交付,是一个有趣的而且有价值的话题。git
本文将给你们介绍基于进程的容器技术实现Redis sharding集群的一键部署,充分展示了容器的强大威力。github
Redis(redis.io)做为最流行的KV数据库,很长一段时间都是单机运行,关于如何实现Redis的数据在多个节点上的分布,在Redis3.0出来以前,有不少第三方的方案。建议你们参考这个连接:redis
这是最简单的实现,经过在客户端利用一致性hash算法,将数据分布到不一样节点。这种方法的缺点很是明显,缺乏故障自动failover能力,而且在扩容时数据分布的搬迁,也比较费劲。docker
一个是Redis官方推荐的Twemproxy,是由twitter公司开发;数据库
另外一个是国内豌豆荚开源的codis;编程
代理模式最大的好处是仍然使用redis单机的sdk进行开发,维护简单。ruby
redis3.0继2.8推出sentinel主从自动failover功能后,推出了sharding集群,这就是Redis Cluster。本次分享主要是介绍如何将Redis集群实现一键的部署。网络
参考文档:
Redis官方已经提供了Redis 3.2和3.3的镜像,均可以用来做为Redis集群的镜像,3.2是稳定版本。
目前官方推出了alpine版本的Redis镜像,alpine镜像的优点是体积小。这次分享是采用官方的redis:3.2-alpine的镜像来作集群。
redis官方提供了一个ruby的脚本redis-trib.rb,这个脚本能够用来初始化集群、resharding集群、rebalance集群等。
咱们使用官方的脚原本初始化集群。该脚本的运行须要ruby环境,咱们来构建一个redis-trib镜像,如下是构建redis-trib镜像的Dockerfile内容:
cat Dockerfile
FROM ruby:2.3.1-alpine ADD https://raw.githubusercontent.com/antirez/redis/3.2.0/src/redis-trib.rb /usr/local/bin/redis-trib.rb RUN gem install redis && chmod 755 /usr/local/bin/redis-trib.rb && \ sed -i '/yes_or_die.msg/a return if ENV["QUIET_MODE"] == "1"' /usr/local/bin/redis-trib.rb ADD entrypoint.sh /entrypoint.sh ENTRYPOINT [“/entrypoint.sh"]
脚本文件
cat entrypoint.sh
#!/bin/sh if [ "$CLUSTER_CMD" = create ]; then if [ -f /usr/local/etc/redis-trib.conf ] ; then . /usr/local/etc/redis-trib.conf QUIET_MODE=1 redis-trib.rb create --replicas $REPLICAS $NODES fi fi
上面两个文件用来构建redis-trib镜像,Dockerfile中的逻辑比较简单,将github中的redis-trib.rb文件添加到镜像中,并让脚本执行支持非交互模式(QUIET_MODE)。
镜像启动时,将执行集群初始化命令。
port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
redis集群的配置文件咱们通常放到数据目录/data下,redis进程对/data目录拥有可读写的权限。
entrypoint.sh文件中,最主要的是读取redis-trib.conf配置文件,配置文件的格式很是简单
REPLICAS={{.REPLICAS_NUM}} {{ $rs := service "redis" }} NODES="{{range $i,$rc := $rs.Containers}} {{$rc.IPAddr}}:6379{{end}}"
REPLICAS的意思是每一个分片有几个slave,通常配置1个slave ,即REPLICAS=1NODES的意思是集群的每一个节点,包括master和slave。
因此若是有10个节点,REPLICAS=1的话,那么将有5个分片(slices)。
准备好上述镜像和配置文件后,咱们开始编排集群
![![容器参数-1]
redis-trib要在redis容器启动完成后再启动,因此启动优先级要比redis低。
经过以上步骤,编排好了Redis-sharding应用模版。
如下是部署后的效果图:
以上内容分享了基于进程的容器技术,实现了Redis sharding的一键交付。
你会部署了吗?
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自动计算
下次咱们相约在6月21日周二晚20:00,将由给Docker官方源码全球排名前50名的魏世江(希云CTO)给咱们来分享更深层次的容器技术,欢迎你们继续关注!