Linux:K8S--StatefulSet搭建redis主从复制集群

2023-10-14 20:08

本文主要是介绍Linux:K8S--StatefulSet搭建redis主从复制集群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

K8S–StatefulSet搭建redis主从复制集群

主要思路:redis主从之间是有差异的,数据也需要持久化,不再是无状态的应用,所以使用Deployment控制器无法实现。使用StatefulSet控制器加上PV、PVC、NFS就可以实现集群的状态保存。直接拉取dockerhub最新的redis镜像,部署三个节点,一主二从,使用NFS结合PV、PVC挂载配置文件,同时实现数据持久化。(实现方法是非常直接简单的,并不是最好的方法。)

实验环境:
192.168.186.10 master (同时也在这台机器部署NFS)
192.168.186.11 node-1
192.168.186.12 node-2
192.168.186.13 node-3

1 准备三份redis的配置文件
可以yum安装一个redis,或者tar包安装一个,再拷贝配置文件进行修改
(注意yum方式安装的配置文件和tar包安装的配置文件是不同的,需要做不同的修改,本文是用tar包安装获取配置文件,可以直接拷贝使用)

bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
#以上是master配置文件的内容,slave的内容也一样,但是要添加以下一行
slaveof redisab-0.redis-service 6379
#redisab-0.redis-service这可以被dns解析为后面跑着master的pod的IP,将master的配置文件给第一个跑起来的pod,后面会有办法确保第一个跑起来的肯定会是master,所以这里可以直接写死

2 搭建NFS
192.168.186.10

[root@master ~]# yum -y install nfs-utils
[root@master ~]# vim /etc/exports
/redis_share/redis1 192.168.186.0/24(rw,no_root_squash)
/redis_share/redis2 192.168.186.0/24(rw,no_root_squash)
/redis_share/redis3 192.168.186.0/24(rw,no_root_squash)
[root@master ~]# mkdir -p /redis_share/redis{1..3}
[root@master ~]# systemctl start nfs
[root@master ~]# exportfs -v
/redis_share/redis1192.168.186.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/redis_share/redis2192.168.186.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/redis_share/redis3192.168.186.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
#将配置文件分别放进对应的目录,位置如下:
[root@master ~]# tree /redis_share/
/redis_share/
├── redis1
│   └── redis.conf   #放的是master的配置文件
├── redis2
│   └── redis.conf   #放的是slave的配置文件
└── redis3└── redis.conf   #放的是slave的配置文件#在其他所有节点都安装nfs,并启动服务
[root@node1 ~]# yum -y install nfs-utils && systemctl start nfs
[root@node2 ~]# yum -y install nfs-utils && systemctl start nfs
[root@node3 ~]# yum -y install nfs-utils && systemctl start nfs
#在其中一节点检查是否成功
[root@node-2 ~]# showmount -e 192.168.186.10
Export list for 192.168.186.10:
/redis_share/redis3 192.168.186.0/24
/redis_share/redis2 192.168.186.0/24
/redis_share/redis1 192.168.186.0/24

3 准备PV
这里分两个文件准备PV,分别做给maste用的PV和slave的PV,随后在启动PV的时候,也要分别启动,才能保证master节点找到正确的配置文件。

[root@master redis]# vim pv-redis-master.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:name: redis01
spec:storageClassName: rediscapacity:storage: 1GiaccessModes:- ReadWriteOncenfs:path: /redis_share/redis1server: 192.168.186.10
[root@master redis]# vim pv-redis-slave.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:name: redis02
spec:storageClassName: rediscapacity:storage: 1GiaccessModes:- ReadWriteOncenfs:path: /redis_share/redis2server: 192.168.186.10
---
apiVersion: v1
kind: PersistentVolume
metadata:name: redis03
spec:storageClassName: rediscapacity:storage: 1GiaccessModes:- ReadWriteOncenfs:path: /redis_share/redis3server: 192.168.186.10

4 准备StatefulSet的yaml文件

[root@master redis]# vim redisAB.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: redisab
spec:serviceName: redis-servicereplicas: 3selector:matchLabels:name: redistemplate:metadata:labels:name: redisspec:containers:- name: redis-latestimage: rediscommand: ["redis-server","/data/redis.conf"]ports:- containerPort: 6379name: redisportvolumeMounts:- name: redis-pvcmountPath: /datavolumeClaimTemplates:- metadata:name: redis-pvcspec:storageClassName: redisaccessModes:- ReadWriteOnceresources:requests:storage: 1Gi---
apiVersion: v1
kind: Service
metadata:name: redis-servicelabels:name: redis
spec:ports:- port: 6379name: redisclusterIP: Noneselector:name: redis

5 启动StatefulSet

[root@master redis]# kubectl apply -f redisAB.yaml
statefulset.apps/redisab created
service/redis-service created
[root@master redis]# kubectl get po
NAME        READY   STATUS    RESTARTS   AGE
redisab-0   0/1     Pending   0          15s
[root@master redis]# kubectl get pvc
NAME                  STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
redis-pvc-redisab-0   Pending                                      redis          20s
#可以看到pod和pvc都处于pending状态,等待pv就可以启动了

6 启动master的PV

[root@master redis]# kubectl apply -f pv-redis-master.yaml
persistentvolume/redis01 created
[root@master redis]# kubectl get po
NAME        READY   STATUS    RESTARTS   AGE
redisab-0   1/1     Running   0          3m5s
redisab-1   0/1     Pending   0          17s
[root@master redis]# kubectl get pvc
NAME                  STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
redis-pvc-redisab-0   Bound     redis01   1Gi        RWO            redis          3m10s
redis-pvc-redisab-1   Pending     
#可以看到启动master的PV后马上就能绑定,随后pod也跑起来了,这时就保证了第一个成功启动的pod一定时master

7 启动slave的PV

[root@master redis]# kubectl apply -f pv-redis-slave.yaml
persistentvolume/redis02 created
persistentvolume/redis03 created
[root@master redis]# kubectl get po
NAME        READY   STATUS              RESTARTS   AGE
redisab-0   1/1     Running             0          5m20s
redisab-1   0/1     ContainerCreating   0          2m32s
[root@master redis]# kubectl get po
NAME        READY   STATUS              RESTARTS   AGE
redisab-0   1/1     Running             0          5m25s
redisab-1   1/1     Running             0          2m37s
redisab-2   0/1     ContainerCreating   0          3s
[root@master redis]# kubectl get po
NAME        READY   STATUS    RESTARTS   AGE
redisab-0   1/1     Running   0          5m36s
redisab-1   1/1     Running   0          2m48s
redisab-2   1/1     Running   0          14s
[root@master redis]# kubectl get pvc
NAME                  STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
redis-pvc-redisab-0   Bound    redis01   1Gi        RWO            redis          5m39s
redis-pvc-redisab-1   Bound    redis02   1Gi        RWO            redis          2m51s
redis-pvc-redisab-2   Bound    redis03   1Gi        RWO            redis          17s
#可以看到两个slave也成功启动了

8 检查是否成功

[root@master redis]# kubectl exec -it redisab-0 bash
root@redisab-0:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.244.3.130,port=6379,state=online,offset=182,lag=0
slave1:ip=10.244.1.100,port=6379,state=online,offset=182,lag=1
master_replid:5f7da3253fc6285799ea10075f16b2c1f68d736a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:182
#进入master查看,可以看出,集群的状态时正常的
127.0.0.1:6379> set test successfully
OK
127.0.0.1:6379> get test
"successfully"
#写入测试数据
127.0.0.1:6379> exit
root@redisab-0:/data# exit
exit
#删除所有pod,并再次重建,检查集群状态和数据是否持久
[root@master redis]# kubectl delete -f redisAB.yaml
statefulset.apps "redisab" deleted
service "redis-service" deleted
[root@master redis]# kubectl get po
No resources found in default namespace.
[root@master redis]# kubectl apply -f redisAB.yaml
statefulset.apps/redisab created
service/redis-service created
[root@master redis]# kubectl get po
NAME        READY   STATUS    RESTARTS   AGE
redisab-0   1/1     Running   0          89s
redisab-1   1/1     Running   0          71s
redisab-2   1/1     Running   0          53s
[root@master redis]# kubectl exec -it redisab-0 bash
root@redisab-0:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.244.3.131,port=6379,state=online,offset=140,lag=0
slave1:ip=10.244.1.101,port=6379,state=online,offset=140,lag=0
master_replid:7247c75a18b6cd9976b82e21cf138565ff36dfce
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140
127.0.0.1:6379> get test
"successfully"
#集群状态正常,数据也还能看到,实验成功!

上述的方法其实不是特别完美的方法,不够灵活,还可以继续改进。

这篇关于Linux:K8S--StatefulSet搭建redis主从复制集群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/212832

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

mac安装redis全过程

《mac安装redis全过程》文章内容主要介绍了如何从官网下载指定版本的Redis,以及如何在自定义目录下安装和启动Redis,还提到了如何修改Redis的密码和配置文件,以及使用RedisInsig... 目录MAC安装Redis安装启动redis 配置redis 常用命令总结mac安装redis官网下

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Mycat搭建分库分表方式

《Mycat搭建分库分表方式》文章介绍了如何使用分库分表架构来解决单表数据量过大带来的性能和存储容量限制的问题,通过在一对主从复制节点上配置数据源,并使用分片算法将数据分配到不同的数据库表中,可以有效... 目录分库分表解决的问题分库分表架构添加数据验证结果 总结分库分表解决的问题单表数据量过大带来的性能

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实