vlambda博客
学习文章列表

中间件容器化系列——Redis实践

作者:孙超|编辑:徐广欣


中间件容器化系列——Redis实践
中间件容器化系列——Redis实践
中间件容器化系列——Redis实践

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。很多的应用都会使用 Redis 作为缓存服务。






使用容器来部署Redis,首先要获取官方的Redis镜像,可以从 h tt p://hub.docker.com 中得 到,在容器平台中已经导入了这些镜像,现在有4.0.14 和 5.0.6两个版本可以直接使用。
有了Redis镜像,我们先列一下通过镜像安装部署Redis时需要知道的一些信息
  • 数据存储目录,默认在 /data;
  • 配置目录,默认在 /etc/redis;
  • 启动端口,默认是6379;
  • 数据持久化方式,默认是RDB(指定的时间间隔内保存数据快照)。如果要使用AOF(先把命令追加到操作日志的尾部,保存所有的历史操作)的方式,需要指定启动参数 redis-server --appendonly yes理解了这些信息后,开始我们的部署,这里介绍两个场景(单实例Redis 和 Redis Cluster)的部署过程。

1

 单实例 Redis


  • 创建Redis服务,服务类型选择 statefulSet,填写服务名称,选择镜像和版本;

中间件容器化系列——Redis实践

  • 设置Redis的容器数量、运行时的CPU、内存和对外提供服务的映射端口;
中间件容器化系列——Redis实践
  • (可选)持久化数据,只将Redis 作为一个缓存服务,不存储数据的话,该步骤不用操作,上一步做完后直接确认就可以了;
  • 持久化数据:将Redis的数据目录 /data 使用持久化卷进行存储,这样容器重启缓存数据也不会丢失;
  • AOF的持久化方式:设置启动命令为 redis-server --appendonly yes;
中间件容器化系列——Redis实践
  • 点击确认,一个完整的单节点Redis服务就创建好了,验证,通过容器实例控制台,进入终端。


中间件容器化系列——Redis实践


2

 Redis 集群模式


创建Redis Cluster模式的的集群,6个Redis节点,3个master,3个slave,当Master掉线后,redis cluster集群会从多个Slave中选举出来一个新的Matser作为代替,而旧的Master重新上线后变成 Master 的Slave。
每一个Redis节点的存储都是独立的,不能共享存储,通过配置管理来存放 redis 的配置文件,必须叫 redis.conf。

## 配置信息appendonly yes # 开启Redis的AOF持久化cluster-enabled yes # 开启集群模式cluster-config-file /var/lib/redis/nodes.conf # 保存节点配置文件的路径cluster-node-timeout 20000 # 集群节点的超时时限dir /var/lib/redis # AOF持久化文件存在的目录port 6379 # 开启的端口安装过程
创建配置信息 —> 创建Redis服务(6个Redis实例)—> 使用 redis-trib工具创建集群。
  • 创建redis配置文件,配置文件必须叫 redis.conf;
中间件容器化系列——Redis实践
  • 创建服务,6个redis实例;
中间件容器化系列——Redis实践
  • 这里注意,容器数是6,容器启动策略可以是顺序启动,也可以是并行启动;

  • 顺序启动:6个Redis实例依次启动,redis-0启动运行后,redis-1开始启动,直到redis-6启动完成;

  • 并行启动:6个Redis实例没有顺序关系,同时开始启动。

中间件容器化系列——Redis实践
  • 持久化数据、配置信息、启动命令
  • 持久化数据:添加本地存储,存储路径是 /var/lib/redis;
  • 配置信息:关联之前创建的 redis.conf 配置文件,挂载路径是 /etc/redis;
  • 启动命令:redis-server /etc/redis/redis.conf --protected-mode no。
中间件容器化系列——Redis实践

中间件容器化系列——Redis实践

完成上面的操作后,我们已经创建好了redis服务,有6个容器实例,这6个redis容器实例并没有形成一个集群,接下来我们通过 redis-trib 来将搭建集群。
需要了解的知识:
  • 每个容器实例在容器集群中都有一个DNS域名,格式;
  • $(podname).$(service-name).$(namespace).svc.cluster.local;
  • redis-trib不支持域名来创建集群,所以需要将容器实例的域名转换为 IP,可以通过 dig 命令来进行转化;
  • 了解 redis-trib 命令。
说完了创建集群的前提知识点,我们来用redis-trib创建集群:
  • 启动一个 redis-trib 的服务;
中间件容器化系列——Redis实践
  • 进入redis-trib服务的容器控制台,在控制台中输入下面的命令;
  • redis-app-0 ... 5,格式:redis服务的名称-序号,即podname;
  • redis-app-headless,格式:redis服务的名称-headless,即service-name;
  • group1-dev-az1 是你的项目空间的名称,即namespace;
  • --replicas 1 创建的集群中每个主节点分配一个从节点,达到3主3从;
redis-trib create --replicas 1 \`dig +short redis-app-0.redis-app-headless.group1-dev-az1.svc.cluster.local`:6379 \`dig +short redis-app-1.redis-app-headless.group1-dev-az1.svc.cluster.local`:6379 \`dig +short redis-app-2.redis-app-headless.group1-dev-az1.svc.cluster.local`:6379 \`dig +short redis-app-3.redis-app-headless.group1-dev-az1.svc.cluster.local`:6379 \`dig +short redis-app-4.redis-app-headless.group1-dev-az1.svc.cluster.local`:6379 \`dig +short redis-app-5.redis-app-headless.group1-dev-az1.svc.cluster.local`:6379
中间件容器化系列——Redis实践
中间件容器化系列——Redis实践
中间件容器化系列——Redis实践
  • 验证集群,先进入redis-app-0,设置一个key,set name redis,再到redis-app-4中,获取这个key,get name,如果在redis-app-4中能够得到 name的值 redis,就说明redis 集群搭建成功。
中间件容器化系列——Redis实践
  • redis-app-0 中设置key name;


中间件容器化系列——Redis实践
  • redis-app-4 中获取key name。


中间件容器化系列——Redis实践


注意: 应用程序要连接redis集群,应用程序也要部署在容器环境。因为redis集群把数据分别存到16384个slot里,数据存储的slot是根据数据的key决定的,每个master 负责存储一定数量的slot,所有master存储的slot覆盖16384个slot。如果客户端连接了集群中的一 个节点并进行了一个操作,假设该操作为我使用的set foo bar,根据foo生成的hash值为12182,如果客户端连到的是一个slave或者不负责存储12182这个slot的master,那么该节点会像客户端发送 redirected 负责该slot的redis服务器 的ip的和端口。这里返回的应该是容器内部IP+6379端口,容器外的应用客户端不能识别容器内部的IP,所以会报 many to much redirection 的错误。
中间件容器化系列——Redis实践


今日推荐






                                     

扫描二维码

获取更多精彩

金科优源汇

中间件容器化系列——Redis实践