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

作者介绍:

张春源

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

开篇:

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的一键交付。

你会部署了吗?

so easy

分享后讨论更是激烈:

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

A1: 可以

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

A2: 自主研发的。

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

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

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

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

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

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

A4: 模板数据分两种:

  1. 配置文件模板里定义的模板变量,这类数据是在创建应用实例时用户通过cSphere管理平台填写的;
  2. 集群服务相关的元数据,如每个容器的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自动计算

时间: 2024-10-03 20:57:43

如何利用容器实现生产级别的redis sharding集群的一键交付的相关文章

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

作者介绍 魏世江 希云联合创始人.CTO,负责基于Docker的自动化服务管理平台的后端研发工作.擅长Docker相关技术.PasS平台架构及企业自动化运维系统的设计及开发.创业之前在新浪SAE平台任技术经理,从09年SAE立项至13年下半年的四年多时间里,一直负责SAEPasS平台各种基于Web的服务管理系统的设计及开发,在DevOps方面积累了丰富的经验.Docker引擎代码贡献者,在Docker开源项目中代码贡献量全球排名50名左右. 开篇 Mongo在很早就支持了replication

Redis 学习(三)redis服务器集群、客户端分片

下面是来自知乎大神的一段说明,个人觉得非常清晰,就收藏了. 为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在这种情况下,如何正确架构Redis呢? 首先,无论我们是使用自己的物理主机,还是使用云服务主机,内存资源往往是有限制的,scale up不是一个好办法,我们需要scale out横向可伸缩扩展,这需要由多台主机协同提供服务,即分布式多个Re

Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis

Redis真是好,其中的键值用起来真心强大啊有木有, 之前的文章讲过搭建了redis集群 那么咋们该如何调用单机版的redis以及集群版的redis来使用缓存服务呢? 先讲讲单机版的,单机版redis安装非常简单,不多说了,直接使用命令: 1 [[email protected] bin]# ./redis-server redis.conf 启动就行 在sprig文件中配置如下 1 <!-- 2 TODO: 3 开发环境使用单机版 4 生产环境务必切换成集群 5 --> 6 <!--

redis cluster 集群畅谈(三) 之 水平扩容、slave自动化迁移

上一篇http://www.cnblogs.com/qinyujie/p/9029522.html, 主要讲解 实验多master写入.读写分离.实验自动故障切换(高可用性),那么本篇我们就来聊了聊redis cluster 水平扩容以及自动化 slave 迁移. redis repliction 主从架构,一主多从更多的是为了提高 读QPS .而 redis cluster 集群中不建议或者没有说做物理的读写分离了,redis cluster 集群更强调的是通过master的水平扩容,来横向扩

Kubernetes 通过statefulset部署redis cluster集群

Kubernetes 通过statefulset部署redis cluster集群 作者: 张首富 时间: 2019-02-19 个人博客地址: https://www.zhangshoufu.com QQ群: 895291458 需要有redis基础 Redis集群架构图 每个Mater 都可以拥有多个slave.当Master掉线后,redis cluster集群会从多个Slave中选举出来一个新的Matser作为代替,而旧的Master重新上线后变成 Master 的Slave. 部署re

redis 哨兵集群原理及部署

复制粘贴自: https://www.cnblogs.com/kevingrace/p/9004460.html 请点击此链接查看原文. 仅供本人学习参考, 如有侵权, 请联系删除, 多谢! Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel

java:redis(redis的集群配置)

服务器集群作用: 服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就象是只有一个服务器 集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行.一旦在服务器上安装并运行了群集服务,该服务器即可加入群集.群集化操作可以减少单点故障数量,并且实现了群集化资源的高可用性. redis的集群配置: (.编辑network文件 HOSTNAME=redis(自己定义的hostname) vi /etc/sysc

Redis缓存集群方案

由于单台Redis服务器的内存管理能力有限,使用过大内存的Redis又会使得服务器的性能急剧下降,一旦服务器发生故障将会影响更大范围业务,而Redis 3.0 beta1支持的集群功能还不适合生产环境的使用.于是为了获取更好的Redis缓存性能及可用性,很多公司都研发了Redis缓存集群方案.现对NetFlix.Twitter.国内的豌豆荚在缓存集群方面的解决方案进行一个汇总,以供读者参考,具体内容如下: 1.NetFlix对Dynamo的开源通用实现Dynomite Dynomite是NetF

Redis的集群安装以及rehash重新迁移教程指南

1. Redis的cluster集群 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 可用性:在Cluster推出之前,可用性要靠Sentinel保证.有了集群之后也自动具有了Sentinel的监控和自动Failover能力. 水平扩展:集群的