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

news/2024/7/9 22:32:28 标签: 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容器部署策略

图片描述

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

第一步:选择镜像

图片描述

第二步:设置容器参数

图片描述
第三步:设置redis-trib容器部署策略

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

图片描述

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

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

以下是部署后的效果图:

图片描述

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

图片描述

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

图片描述

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

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


OpenStack Days China将于7月14-15日在北京国家会议中心举办,届时包括OpenStack基金会的Jonathan Bryce、Mark Collier、Alan Clark等大牛都将来到大会现场和2000名参会者一起坐而论道,共话OpenStack大势,现在报名票价优惠,欲报从速。


http://www.niftyadmin.cn/n/1839862.html

相关文章

为什么我的WIN XP系统中的文件(夹)没有“安全”选项卡设置?

http://topic.csdn.net/t/20031020/20/2376414.html 问: 我先安装了WIN2000专业版再安装XP,我发觉除C盘外都不能访问!于是我右击其他盘—》属性,但找不到安全选项卡,我查了一下帮助,上面说是有安全选项的。…

DCOS 应用仓库之Universe

2016年4月,Mesosphere开源了他们开发的DC/OS(数据中心操作系统),作为一个数据中心操作系统而言,基于其之上的各种各样的应用是不可或缺的。在DC/OS系统中,Cosmos扮演了App Store的作用,Cosmos提…

android getresourceasstream url,资源文件的获取方法getResourceAsStream

Java中的getResourceAsStream有以下几种:Class.getResourceAsStream(String path) : path 不以’/开头时默认是从此类所在的包下取资源,以’/开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由 ClassLoade…

vb发送邮件接收邮件vba邮箱操作方法

vb发送邮件接收邮件vba邮箱操作方法一般可以用jmail的DLL进行收发邮件,适合服务器,单机使用。也可以用cdo组件发送邮件,或者用OUTLOOK等客户端配套使用。也可用WINSOCK控件直接连接SMTP端口,POP端口进行读取邮件.http://baike.bai…

Canvas系列之一——滤镜效果

Canvas 真的是一个神奇的东西,不仅能够绘制各种图形、文本和位图,还能够对位图进行复杂的像素运算和处理。因此像滤镜这些东西,其实 Canvas 也可以来实现。接下来,是见证奇迹的时刻。 首先,我们需要有一个 Canvas 容器…

android xutils json请求,Android中的xutils框架在访问服务器时如何携带json数据

xutils框架的httputils在访问服务器时如何像HttpURLConnection一样携带json数据HttpURLConnection携带数据的案例,使用put请求:URL url;HttpURLConnection connection null;int flag 0;try {String userIpAddress "http://" "124.207.158.74" ":…

中间件和微服务,Docker以及原生云架构的关系

IT世界的技术更新非常迅速。一年前我曾写过一篇关于:微服务是否是企业服务总线和其他中间件的死亡魔法。本文章是之前文章的后续以及关于微服务、容器和原生云架构的中间件关系讨论的更新。各种规模的企业正在以令人不可思议的速度快速向这些技术靠拢! 在…

骁龙660鸿蒙系统,高通骁龙670和660区别大吗?骁龙670有哪些升级?

骁龙660是高通去年推出的一款中高端经典神U,由OPPO R11首发,而高通即将于今年发布升级版的骁龙670。那么,高通骁龙670和660区别大吗?相比前代产品,骁龙670有哪些升级?根据目前大量曝光的相关消息&#xff0…