作者:余生大大,大数据开发工程师,云原生爱好者,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 发布!