k8s部署redis cluster集群的实现


Posted in Redis onJune 24, 2021

Redis 介绍

  • Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理。它可以存储和操作高级数据类型,例如列表,地图,集合和排序集合。
  • 由于Redis接受多种格式的密钥,因此可以在服务器上执行操作,从而减少了客户端的工作量。
  • 它仅将磁盘用于持久性,而将数据完全保存在内存中。
  • Redis是一种流行的数据存储解决方案,并被GitHub,Pinterest,Snapchat,Twitter,StackOverflow,Flickr等技术巨头所使用。

为什么要用Redis

  • 它的速度非常快。它是用ANSI C编写的,并且可以在POSIX系统上运行,例如Linux,Mac OS X和Solaris。
  • Redis通常被排名为最流行的键/值数据库和最流行的与容器一起使用的NoSQL数据库。
  • 其缓存解决方案减少了对云数据库后端的调用次数。
  • 应用程序可以通过其客户端API库对其进行访问。
  • 所有流行的编程语言都支持Redis。
  • 它是开源且稳定的。

什么是Redis Cluster集群

  • Redis Cluster是一组Redis实例,旨在通过对数据库进行分区来扩展数据库,从而使其更具弹性。
  • 群集中的每个成员(无论是主副本还是辅助副本)都管理哈希槽的子集。如果主机无法访问,则其从机将升级为主机。在由三个主节点组成的最小Redis群集中,每个主节点都有一个从节点(以实现最小的故障转移),每个主节点都分配有一个介于0到16,383之间的哈希槽范围。节点A包含从0到5000的哈希槽,节点B从5001到10000,节点C从10001到16383。
  • 群集内部的通信是通过内部总线进行的,使用协议传播有关群集的信息或发现新节点。

k8s以StatefulSet方式部署redis cluster集群:

1. 部署nfs

2. 创建pv

3. 部署redis

4. 初始化redis集群

主机说明:

 

系统 ip 角色 cpu 内存 hostname
CentOS 7.8 192.168.30.128 master >=2 >=2G master1
CentOS 7.8 192.168.30.129 master >=2 >=2G master2
CentOS 7.8 192.168.30.130 node >=2 >=2G node1
CentOS 7.8 192.168.30.131 node >=2 >=2G node2
CentOS 7.8 192.168.30.132 node >=2 >=2G node3
kubectl get node

NAME      STATUS   ROLES    AGE   VERSION
master1   Ready    master   33d   v1.14.0
master2   Ready    master   33d   v1.14.0
node1     Ready    <none>   33d   v1.14.0
node2     Ready    <none>   33d   v1.14.0
node3     Ready    <none>   33d   v1.14.0

部署nfs

在master2节点上做nfs共享,

yum -y install nfs-utils rpcbind
mkdir -p /data/redis/{cluster0,cluster1,cluster2,cluster3,cluster4,cluster5}
vim /etc/exports
/data/redis/cluster0 192.168.30.0/24(rw,sync,no_root_squash)
/data/redis/cluster1 192.168.30.0/24(rw,sync,no_root_squash)
/data/redis/cluster2 192.168.30.0/24(rw,sync,no_root_squash)
/data/redis/cluster3 192.168.30.0/24(rw,sync,no_root_squash)
/data/redis/cluster4 192.168.30.0/24(rw,sync,no_root_squash)
/data/redis/cluster5 192.168.30.0/24(rw,sync,no_root_squash)
chmod -R 755 /data/redis
exportfs -arv
systemctl enable rpcbind && systemctl start rpcbind
systemctl enable nfs && systemctl start nfs

nfs部署完毕。对于需要使用nfs的node节点,都要安装nfs:

yum -y install nfs-utils

创建pv

创建pv:

mkdir -p /home/k8s/redis  && cd /home/k8s/redis
vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv0
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.30.129
    path: /data/redis/cluster0

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv1
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.30.129
    path: /data/redis/cluster1

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv2
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.30.129
    path: /data/redis/cluster2

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv3
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.30.129
    path: /data/redis/cluster3

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv4
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.30.129
    path: /data/redis/cluster4

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv5
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.30.129
    path: /data/redis/cluster5
kubectl apply -f pv.yaml

kubectl get pv

NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv0   1Gi        RWX            Retain           Available                                   3s
nfs-pv1   1Gi        RWX            Retain           Available                                   3s
nfs-pv2   1Gi        RWX            Retain           Available                                   3s
nfs-pv3   1Gi        RWX            Retain           Available                                   3s
nfs-pv4   1Gi        RWX            Retain           Available                                   3s
nfs-pv5   1Gi        RWX            Retain           Available                                   3s

pv创建完毕。

部署redis

vim namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: public-service
vim redis.conf

appendonly yes
cluster-enabled yes
cluster-config-file /var/lib/redis/nodes.conf
cluster-node-timeout 5000
dir /var/lib/redis
port 6379
vim redis.yaml

apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: public-service
  labels:
    app: redis
spec:
  selector:
    app: redis
    appCluster: redis-cluster
  ports:
  - name: redis
    port: 6379
  clusterIP: None
  
---
apiVersion: v1
kind: Service
metadata:
  name: redis-access
  namespace: public-service
  labels:
    app: redis
spec:
  selector:
    app: redis
    appCluster: redis-cluster
  ports:
  - name: redis-access
    protocol: TCP
    port: 6379
    targetPort: 6379

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
  namespace: public-service
spec:
  serviceName: redis
  replicas: 6
  selector:
    matchLabels:
      app: redis
      appCluster: redis-cluster
  template:
    metadata:
      labels:
        app: redis
        appCluster: redis-cluster
    spec:
      terminationGracePeriodSeconds: 20
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - redis
              topologyKey: kubernetes.io/hostname
      containers:
      - name: redis
        image: redis:latest
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
          - "--protected-mode"
          - "no"
        resources:
          requests:
            cpu: "500m"
            memory: "500Mi"
        ports:
        - containerPort: 6379
          name: redis
          protocol: TCP
        - containerPort: 16379
          name: cluster
          protocol: TCP
        volumeMounts:
        - name: conf
          mountPath: /etc/redis
        - name: data
          mountPath: /var/lib/redis
      volumes:
      - name: conf
        configMap:
          name: redis-conf
          items:
          - key: redis.conf
            path: redis.conf
  volumeClaimTemplates:
  - metadata:
      name: data
      namespace: public-service
    spec:
      accessModes: [ "ReadWriteMany" ]
      resources:
        requests:
          storage: 1Gi
kubectl apply -f namespace.yaml

kubectl create configmap redis-conf --from-file=redis.conf -n public-service

kubectl apply -f redis.yaml

kubectl get svc -n public-service

NAME           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
redis          ClusterIP   None          <none>        6379/TCP   20s
redis-access   ClusterIP   10.96.2.100   <none>        6379/TCP   20s

kubectl get pod -n public-service

NAME      READY   STATUS    RESTARTS   AGE
redis-0   1/1     Running   0          2m43s
redis-1   1/1     Running   0          2m18s
redis-2   1/1     Running   0          108s
redis-3   1/1     Running   0          80s
redis-4   1/1     Running   0          48s
redis-5   1/1     Running   0          30s

kubectl get pvc -n public-service

NAME           STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-redis-0   Bound    nfs-pv4   1Gi        RWX                           3m4s
data-redis-1   Bound    nfs-pv0   1Gi        RWX                           2m39s
data-redis-2   Bound    nfs-pv1   1Gi        RWX                           2m9s
data-redis-3   Bound    nfs-pv2   1Gi        RWX                           101s
data-redis-4   Bound    nfs-pv3   1Gi        RWX                           69s
data-redis-5   Bound    nfs-pv5   1Gi        RWX                           51s

redis-access这个service方便集群内访问redis集群,redis部署完毕。

初始化redis集群

使用Redis-tribe工具进行集群的初始化。

下载redis-tribe:

kubectl run -it ubuntu --image=ubuntu --restart=Never -n public-service bash

root@ubuntu:/# cat > /etc/apt/sources.list << EOF
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse
EOF
root@ubuntu:/# apt-get update

root@ubuntu:/# apt-get install -y libncursesw5 libreadline6 libtinfo5 --allow-remove-essential

root@ubuntu:/# apt-get install -y libpython2.7-stdlib python2.7 python-pip redis-tools dnsutils

root@ubuntu:/# pip install --upgrade pip

root@ubuntu:/# pip install redis-trib==0.5.1

初始化集群:

root@ubuntu:/# redis-trib.py create \
  `dig +short redis-0.redis.public-service.svc.cluster.local`:6379 \
  `dig +short redis-1.redis.public-service.svc.cluster.local`:6379 \
  `dig +short redis-2.redis.public-service.svc.cluster.local`:6379
  
root@ubuntu:/# redis-trib.py replicate \
  --master-addr `dig +short redis-0.redis.public-service.svc.cluster.local`:6379 \
  --slave-addr `dig +short redis-3.redis.public-service.svc.cluster.local`:6379

root@ubuntu:/# redis-trib.py replicate \
  --master-addr `dig +short redis-1.redis.public-service.svc.cluster.local`:6379 \
  --slave-addr `dig +short redis-4.redis.public-service.svc.cluster.local`:6379

root@ubuntu:/# redis-trib.py replicate \
  --master-addr `dig +short redis-2.redis.public-service.svc.cluster.local`:6379 \
  --slave-addr `dig +short redis-5.redis.public-service.svc.cluster.local`:6379
  
root@ubuntu:/# exit

查看集群:

kubectl exec -it -n public-service redis-0 bash

root@redis-0:/data# redis-cli -c

127.0.0.1:6379> CLUSTER NODES               #列出节点信息

aac2b3d320da67eedf3512ed0e38a1cdce5bc8fe 172.10.2.55:6379@16379 slave 7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 0 1592276224727 3 connected
2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 172.10.2.54:6379@16379 master - 0 1592276224224 1 connected 0-5461
524f03526a4b683d7d4de19296431810bfdc22cf 172.10.3.60:6379@16379 slave df5bc3c2e2851d63cdb9f762efde6e1b0d38efed 0 1592276223117 5 connected
7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 172.10.4.77:6379@16379 myself,master - 0 1592276224000 2 connected 5462-10922
df5bc3c2e2851d63cdb9f762efde6e1b0d38efed 172.10.3.59:6379@16379 master - 0 1592276223217 0 connected 10923-16383
c1dbaaef4a583e372c43eed52c22cd9ad7184d18 172.10.4.78:6379@16379 slave 2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 0 1592276223719 4 connected

127.0.0.1:6379> CLUSTER INFO                #集群状态

cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:2
cluster_stats_messages_ping_sent:514
cluster_stats_messages_pong_sent:491
cluster_stats_messages_meet_sent:2
cluster_stats_messages_sent:1007
cluster_stats_messages_ping_received:491
cluster_stats_messages_pong_received:516
cluster_stats_messages_received:1007

redis集群初始化完成,已经形成3主3从的cluster集群。

写入数据:

127.0.0.1:6379> SET key1 aaa
OK

127.0.0.1:6379> SET key2 bbb
-> Redirected to slot [4998] located at 172.10.2.54:6379
OK

172.10.2.54:6379> SET key3 ccc
OK
kubectl exec -it -n public-service redis-4 bash

root@redis-4:/data# redis-cli -c

127.0.0.1:6379> GET key1
-> Redirected to slot [9189] located at 172.10.4.77:6379
"aaa"

172.10.4.77:6379> GET key2
-> Redirected to slot [4998] located at 172.10.2.54:6379
"bbb"

172.10.2.54:6379> GET key3
"ccc"

可以看出redis cluster集群是去中心化的,每个节点都是平等的,连接哪个节点都可以获取和设置数据。

主从切换:

选择redis-2模拟宕掉,测试主从切换,

kubectl get pod -n public-service -o wide

NAME      READY   STATUS      RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
redis-0   1/1     Running     0          62m   172.10.4.77   node1   <none>           <none>
redis-1   1/1     Running     0          62m   172.10.2.54   node2   <none>           <none>
redis-2   1/1     Running     0          61m   172.10.3.59   node3   <none>           <none>
redis-3   1/1     Running     0          61m   172.10.2.55   node2   <none>           <none>
redis-4   1/1     Running     0          61m   172.10.4.78   node1   <none>           <none>
redis-5   1/1     Running     0          61m   172.10.3.60   node3   <none>           <none>
ubuntu    0/1     Completed   0          57m   172.10.2.56   node2   <none>           <none>

kubectl exec -it -n public-service redis-2 bash

root@redis-2:/data# redis-cli -c

127.0.0.1:6379> ROLE

1) "master"
2) (integer) 2898
3) 1) 1) "172.10.3.60"
      2) "6379"
      3) "2898"

可以看到,redis-2是master,它的slave是172.10.3.60,即redis-5。

kubectl delete pod -n public-service redis-2                #模拟节点宕掉

kubectl get pod -n public-service redis-2 -o wide

NAME      READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
redis-2   1/1     Running   0          38s   172.10.3.61   node3   <none>           <none>

kubectl exec -it -n public-service redis-2 bash

root@redis-2:/data# redis-cli -c

127.0.0.1:6379> ROLE

1) "slave"
2) "172.10.3.60"
3) (integer) 6379
4) "connected"
5) (integer) 3430
kubectl exec -it -n public-service redis-5 bash

root@redis-5:/data# redis-cli -c

127.0.0.1:6379> ROLE

1) "master"
2) (integer) 3584
3) 1) 1) "172.10.3.61"
      2) "6379"
      3) "3570"
      
127.0.0.1:6379> CLUSTER NODES

aac2b3d320da67eedf3512ed0e38a1cdce5bc8fe 172.10.2.55:6379@16379 slave 7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 0 1592278859530 2 connected
2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 172.10.2.54:6379@16379 master - 0 1592278859000 1 connected 0-5461
c1dbaaef4a583e372c43eed52c22cd9ad7184d18 172.10.4.78:6379@16379 slave 2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 0 1592278859000 1 connected
524f03526a4b683d7d4de19296431810bfdc22cf 172.10.3.60:6379@16379 myself,master - 0 1592278857000 6 connected 10923-16383
7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 172.10.4.77:6379@16379 master - 0 1592278858021 2 connected 5462-10922
df5bc3c2e2851d63cdb9f762efde6e1b0d38efed 172.10.3.61:6379@16379 slave 524f03526a4b683d7d4de19296431810bfdc22cf 0 1592278859000 6 connected

可以看到,redis-2在重启之后变为slave,而它之前的slave——redis-5变为master,而且是新redis-2的master。

集群的主从切换没有问题。k8s部署redis cluster集群完成。

到此这篇关于k8s部署redis cluster集群的实现的文章就介绍到这了,更多相关k8s部署redis cluster内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
redis 限制内存使用大小的实现
May 08 Redis
Redis数据结构之链表与字典的使用
May 11 Redis
你真的了解redis为什么要提供pipeline功能
Jun 22 Redis
Redis做数据持久化的解决方案及底层原理
Jul 15 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
Redis Cluster 集群搭建你会吗
Aug 04 Redis
关于redisson缓存序列化几枚大坑说明
Aug 04 Redis
Redis模仿手机验证码发送的实现示例
Nov 02 Redis
关于SpringBoot 使用 Redis 分布式锁解决并发问题
Nov 17 Redis
解决Redis启动警告问题
Feb 24 Redis
浅析Redis Sentinel 与 Redis Cluster
redis cluster支持pipeline的实现思路
了解Redis常见应用场景
Jun 23 #Redis
压缩Redis里的字符串大对象操作
你真的了解redis为什么要提供pipeline功能
Redis缓存-序列化对象存储乱码问题的解决
比较几种Redis集群方案
You might like
php中定时计划任务的实现原理
2013/01/08 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
javascript parseInt与Number函数的区别
2010/01/21 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
Python中pygame安装方法图文详解
2015/11/11 Python
Python程序控制语句用法实例分析
2020/01/14 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
英国领先的电视购物零售商:Ideal World
2019/03/18 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
《忆江南》教学反思
2014/04/07 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
家长对孩子的寄语
2015/02/26 职场文书
教师思想工作总结2015
2015/05/13 职场文书
大学生十八大感想
2015/08/11 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
React Native项目框架搭建的一些心得体会
2021/05/28 Javascript
javascript对象3个属性特征
2021/11/17 Javascript
索尼ICF-5900W收音机测评
2022/04/24 无线电