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

Posted CSDN大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用容器实现生产级Redis sharding集群一键交付相关的知识,希望对你有一定的参考价值。

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


首先准备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)。


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


准备redis集群配置文件


port 6379

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly 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=1**NODES**的意思是集群的每个节点,包括master和slave。


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


编排集群


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


第一步:创建模版



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


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


第三步:设置容器参数


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


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


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


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


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


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


第一步:选择镜像


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


第二步:设置容器参数


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


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


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


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


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


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


以下是部署后的效果图:

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


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



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



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


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

以上是关于如何用容器实现生产级Redis sharding集群一键交付的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

如何用java实现缓存

如何用 Redis 实现分布式锁的?

如何用 Redis 实现分布式锁的?