作者:余生大大,大数据开发工程师,云原生爱好者,KubeSphere 社区用户。
前言
Redis
是在开发过程中常常用到的 缓存中间件 ,在生产环境中为了思考 稳定性 和高可用 个别为集群模式的部署。
惯例部署在虚拟机上的形式配置繁琐并且须要手动重启节点,而应用 K8s
进行 Redis
集群的部署有以下长处:
- 装置便捷:应用镜像或者
yaml
配置文件即可一件装置 - 主动调度:容器挂掉后会主动调度重启和资源分配
- 缩扩容不便 :在
扩容
、缩容
方面的长处无需多说,一键伸缩 - 稳固高效:
K8s
在整个集群上进行调度,只有整个集群不挂掉总会调度到适合节点重启容器服务
装置 Redis 集群
我这里新建了一个 test-project
的我的项目空间来做 Redis
集群所有装置资源的搁置,后续在 DNS
上会用到我的项目空间名称,会标注这一部分,须要留神用本人的我的项目空间名。
装置集群大略分为以下几步:
- 配置
redis.conf
字典; - 创立
redis
服务; - 容器组配置;
- 存储设置;
- 高级设置。
当初从第一步开始。
1.1 配置 redis.conf 字典
在我的项目空间的 配置
→ 配置字典
→ 创立
进行配置字典的创立。
名称就叫 redis-conf
而后下一步 增加键值对数据。
key
值的内容为 redis.conf
,value
值为:
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-require-full-coverage no
cluster-migration-barrier 1
appendonly yes
创立 Redis 服务
在我的项目空间的 利用负载
→ 服务
→ 创立
进行 Redis 服务的创立。
抉择 有状态服务
,须要数据存储的服务根本都是有状态的服务。
根本设置里名称就叫 redis-cluster
而后进行重头戏,下一步的 容器组配置
。
容器组配置
这一步的外围就是配置 Redis 的容器,集群数量就抉择惯例的三主三从,那容器的正本数量就是 6 个。
容器组正本数量调到 6 个,点击增加容器。
镜像抉择 docker hub
中 redis
的 6.2.3
版本,并抉择应用默认端口,CPU 和内存能够选择性预留,如果不预留就是调度公共资源。
抉择 应用默认端口
的话上面的端口设置就是如上图一样都会应用 6379
,还有就是配置启动命令。
如上图配置:
- 命令:
redis-server
- 参数:
/etc/redis/redis.conf
参数指向的就是之前字典配置的内容,然而须要下一步 存储设置
里进行配置字典能力应用。
其余内容没有什么须要配置的,抉择对勾实现容器配置。
更新策略就是举荐的 滚动更新
,其余也没什么须要批改的,点击下一步配置 存储设置
。
存储设置
在这一步有两个操作
增加长久卷申明模板
挂载配置字典
增加长久卷申明模板
PVC 名称前缀:redis-pvc
容量:10G
挂载门路:
- 权限:读写
-
地址:/data
次要是挂载门路选好,配置好后点击对勾实现配置
挂载配置字典
这一步是挂载咱们之前配置的字典 redis-conf
,也是咱们 redis
启动命令的参数内容。
抉择 redis
的配置字典。
挂载权限为:只读
,地址为:/etc/redis
;跟下面的命令参数的配置绝对应。
特定键抉择 redis.conf
前面同名 redis.conf
,实现后点击对勾回到存储设置。
配置好后就入上图,点击下一步进入最初的高级设置。
高级设置
里是一些额定配置,能够依据本人场景抉择调整配置,调成实现后点击 创立
进行 Redis 集群容器的创立。
初始化 Redis 集群
创立完 Redis 服务 后点击 redis
的服务名称进入 redis
服务详情,详情如下图:
6 个 redis
的容器组都启动胜利了,接下来就是初始化集群;因为咱们配置的 redis
的服务是 有状态服务 (Headless)
所以拜访模式能够通过外部 DNS,拜访格局是:(容器名称).(容器 DNS).svc.cluster.local。
按上图示例 比方拜访 集群 1 节点 拜访地址就是 redis-cluster-v1-1
加 DNS
地址 redis-cluster.test-project
加 svc.cluster.local
,残缺地址如下:
redis-cluster-v1-1.redis-cluster.test-project.svc.cluster.local
在 redis 集群的非第一节点的其余节点终端内通过这个地址进行拜访验证他们是否互通,进入 3 节点的终端,如下图:
进入终端,执行命令:
redis-cli -h redis-cluster-v1-1.redis-cluster.test-project.svc.clusterredis.local
如果能如下图一样跳转到 v1-1
的节点上就代表这两个节点互通。
执行命令:cluster info
查看节点的集群状况。
次要看上图的这两个参数,nodes
为 1
表明以后节点只有 1
个,cluster_size
表明以后没有 master
节点,所以目前还不是集群构造,info
属性的详解在此列出:
cluster_state
:ok 状态示意集群能够失常承受查问申请。fail 状态示意,至多有一个哈希槽没有被绑定(阐明有哈希槽没有被绑定到任意一个节点),或者在谬误的状态(节点能够提供服务然而带有 FAIL 标记),或者该节点无奈分割到少数 master 节点。cluster_slots_assigned
:已调配到集群节点的哈希槽数量(不是没有被绑定的数量)。16384 个哈希槽全副被调配到集群节点是集群失常运行的必要条件。cluster_slots_ok
:哈希槽状态不是 FAIL 和 PFAIL 的数量。cluster_slots_pfail
:哈希槽状态是 PFAIL 的数量。只有哈希槽状态没有被降级到 FAIL 状态,这些哈希槽依然能够被失常解决。PFAIL 状态示意咱们以后不能和节点进行交互,但这种状态只是长期的谬误状态。cluster_slots_fail
:哈希槽状态是 FAIL 的数量。如果值不是 0,那么集群节点将无奈提供查问服务,除非 cluster-require-full-coverage 被设置为 no。cluster_known_nodes
:集群中节点数量,包含处于握手状态还没有成为集群正式成员的节点。cluster_size
:至多蕴含一个哈希槽且可能提供服务的 master 节点数量。cluster_current_epoch
:集群本地 Current Epoch 变量的值。这个值在节点故障转移过程时有用,它总是递增和惟一的。cluster_my_epoch
:以后正在应用的节点的 Config Epoch 值。这个是关联在本节点的版本值。cluster_stats_messages_sent
:通过 node-to-node 二进制总线发送的音讯数量。cluster_stats_messages_received
:通过 node-to-node 二进制总线接管的音讯数量。
IP 地址初始化集群
先尝试应用 ip + port
的形式初始化集群,然而在 K8s
中启动服务 ip
都会变动,所以最终的后果还是要用 DNS
形式进行集群初始化。
执行本步后再想批改为 DNS 地址初始化须要素来一遍,如果不想麻烦的同学能够间接跳过。
记录 redis
集群的所有 ip+port
,初始化命令如下:
redis-cli --cluster create 10.233.70.30:6379 10.233.70.32:6379 10.233.90.41:6379 10.233.90.43:6379 10.233.96.47:6379 10.233.96.50:6379 --cluster-replicas 1
进入 redis
集群随便一个节点的 终端
执行下面的命令。
如上图集群初始化就实现了,再输出命令 redis-cli
进入命令端,再执行 cluster info
查看集群信息。
当初咱们的集群节点有了 6
个,master
节点也有了三个,集群建设实现,前面的操作抉择 master
节点进行操作。
在对集群节点进行验证的时候如果遇到上图的谬误 (error) MOVED 2589 10.233.70.30:6379
是因为 redis-cli
没有开启集群模式,将命令批改为 redis-cli -c
就切换为集群模式了。
应用外部 DNS 初始化
应用 ip
地址的形式在每次 K8s
调度 redis
后 ip
都会发生变化,所以在 K8s
集群中应用 ip
形式初始化集群并不太适合,然而如果应用外部 DNS
间接跟下面一样初始化集群会呈现谬误,因为 redis
对域名的反对并不太好,所以这时候能够用 Redis-tribe
。
创立 Redis-tribe 服务
创立自定义服务,抉择 编辑 YAML
。
参数 namespace
就写项目名称:
具体 YAML
内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: test-project
labels:
app: redis-cluster-tools
name: redis-cluster-tools
spec:
replicas: 1
selector:
matchLabels:
app: redis-cluster-tools
template:
metadata:
labels:
app: redis-cluster-tools
name: pos-redis
spec:
containers:
- name: pos-redis
image: sunnywang/redis-tools-ubuntu:v0.5.1
imagePullPolicy: IfNotPresent
args:
- /bin/bash
- -c
- sleep 3600
创立好后在容器组内找到 redis-cluster-tools
。
初始化集群
点击容器名称进入容器详情再进入到终端里。
先执行以下命令初始化 master
节点,这时候之前的外部 DNS
的域名就有用了。
redis-trib.py create `dig +short redis-cluster-v1-0.redis-cluster.test-project.svc.cluster.local`:6379 `dig +short redis-cluster-v1-1.redis-cluster.test-project.svc.cluster.local`:6379 `dig +short redis-cluster-v1-2.redis-cluster.test-project.svc.cluster.local`:6379
执行后果如下图:
接下来给每个 master
节点绑定对应的正本节点,总共三个:
0 节点 ->3 节点
redis-trib.py replicate --master-addr `dig +short redis-cluster-v1-0.redis-cluster.test-project.svc.cluster.local`:6379 --slave-addr `dig +short redis-cluster-v1-3.redis-cluster.test-project.svc.cluster.local`:6379
1 节点 ->4 节点
redis-trib.py replicate --master-addr `dig +short redis-cluster-v1-1.redis-cluster.test-project.svc.cluster.local`:6379 --slave-addr `dig +short redis-cluster-v1-4.redis-cluster.test-project.svc.cluster.local`:6379
2 节点 ->5 节点
redis-trib.py replicate --master-addr `dig +short redis-cluster-v1-2.redis-cluster.test-project.svc.cluster.local`:6379 --slave-addr `dig +short redis-cluster-v1-5.redis-cluster.test-project.svc.cluster.local`:6379
执行后果如下:
验证
轻易进入一个集群节点的终端,还是执行 cluster info
命令,查看集群信息。
应用根底命令进行验证,验证集群模式的 redis-cli
须要加-c
。
验证集群模式能够失常应用。
本文由博客一文多发平台 OpenWrite 公布!