如何利用容器实现生产级别的 Redis sharding 集群的一键交付

作者介绍:

张春源

希云cSphere 合伙人,国内早期的容器布道者,对企业应用容器化有丰富的实践经验,擅长利用容器践行 Devops 文化。国内第一套容器系列实战视频课程讲师,视频播放量累计10万+。

开篇:

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

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

什么是Redis sharding集群

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

Partitioning: how to split data among multiple Redis instances.

Client hash

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

代理模式

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

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

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

Redis Cluster

redis 3.0 继 2.8 推出 sentinel 主从自动 failover 功能后,推出了 sharding 集群,这就是 Redis Cluster。本次分享主要是介绍如何将 Redis 集群实现一键的部署。

参考文档:

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

首先准备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-alpineADD https://raw.githubusercontent. ... ib.rb /usr/local/bin/redis-trib.rbRUN 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.rbADD entrypoint.sh /entrypoint.shENTRYPOINT [“/entrypoint.sh"]

脚本文件

cat entrypoint.sh

!/bin/shif [ "$CLUSTER_CMD" = create ]; thenif [ -f /usr/local/etc/redis-trib.conf ] ; then. /usr/local/etc/redis-trib.confQUIET_MODE=1 redis-trib.rb create --replicas $REPLICAS $NODESfifi

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

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

准备redis集群配置文件

port 6379 cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes

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

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

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 )。

编排集群

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

第一步:创建模版

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

第三步:设置容器参数

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

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

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

第一步:选择镜像

第二步:设置容器参数

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

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

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

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

以下是部署后的效果图:

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

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

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

你会部署了吗?

so easy !

Q & A

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

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

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

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

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

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

你可能感兴趣的:(如何利用容器实现生产级别的 Redis sharding 集群的一键交付)