梦想不会逃跑,逃跑的永远是自己。勇敢追逐你的梦想,即使路途遥远。
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(一)
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
一、项目需求
开发需要本地调试线上服务,涉及到了使用redis实现幂等,可以避免重复操作导致的数据错误
因为安全考虑,现场用不了KT-connect、Telepresence、OpenVPN等穿透到集群内部代理的工具
二、影响范围
之前redis是使用的集群内网连接,改用node ip方式连接,所有微服务更换redis连接URL,数据使用Redis-Shake工具全量和增量同步
三、环境信息
服务 | 版本 | 部署方式 |
---|---|---|
Kubernetes | 1.29 | 一主一从 |
Redis | 7.0.12 | 集群模式 |
四、前提说明
1、redis部署类型
1)主从复制(Master-Slave Replication):
在这种模式下,一个Redis服务器作为主节点(Master),其他服务器作为从节点(Slave)。主节点负责处理写操作,而从节点则通过异步复制机制来复制主节点的数据。这种方式主要用于提高读取性能和数据冗余。
2)哨兵模式(Sentinel):
哨兵模式是在主从复制的基础上增加了一个或多个哨兵进程来监控主节点和从节点的状态。如果主节点出现故障,哨兵会自动选择一个健康的从节点来晋升为主节点,实现高可用性。
3)集群模式(Cluster):
Redis 集群模式是为了解决单个Redis实例的容量和性能限制而设计的。在集群模式中,数据被分割成多个片段(shards),并分布在多个节点上。每个节点既可以是主节点也可以是从节点,集群内部通过Gossip协议来维护集群状态的一致性。节点之间的相互发现和通信通常依赖于IP地址 和端口号
本文将以redis集群模式(Cluster)介绍如何在Kubernetes集群外部连接
2、redis暴露外网
1、使用ingress暴露,redis官网提供的Kubernetes network方法:https://redis.io/docs/latest/operate/kubernetes/networking/ingress
2、使用redis-cluster-prxoy代理的方式,github:https://github.com/RedisLabs/redis-cluster-proxy
3、使用cluster-announce-ip
和cluster-announce-bus-port
参数暴露ip到外部
在Redis集群中,announce 端口号和 announce-bus 端口号是两个重要的配置选项,它们分别用于不同的目的。理解这两个端口号的区别对于正确配置和管理Redis集群非常重要。
- announce 端口号
announce 端口号用于告诉集群中的其他节点,当前节点的客户端连接端口。这个端口是客户端用来与Redis节点通信的端口。
配置示例:
cluster-announce-ip <your_ip>
cluster-announce-port <your_port>
cluster-announce-ip:指定当前节点的IP地址。
cluster-announce-port:指定当前节点的客户端连接端口。
作用:
客户端连接:当其他节点需要将客户端引导到当前节点时,会使用这个端口。
集群通信:集群中的其他节点会使用这个端口来识别当前节点的客户端连接地址。- announce-bus 端口号
announce-bus 端口号用于告诉集群中的其他节点,当前节点的集群总线(Cluster Bus)端口。集群总线是节点之间进行内部通信的通道,用于传递集群管理信息、心跳检测等。
配置示例:
cluster-announce-bus-port <your_bus_port>
cluster-announce-bus-port:指定当前节点的集群总线端口。
作用:
集群内部通信:节点之间通过这个端口进行集群管理信息的交换,例如心跳检测、故障检测、状态同步等。
Gossip协议:集群总线端口是Gossip协议的主要通信端口,用于节点之间的相互发现和状态同步。
当客户端在登录vpn连接redis集群时,开放cluster-announce-port即可,cluster-announce-bus-port不用开放
本文将以第3种方式介绍如何在Kubernetes集群外部连接
五、部署方案
六、开始安装
1、配置文件
以sts-redis01为例
1)redis-configmap
其中cm-redis-conf-01的配置文件如下,其他redis节点只需要修改cluster-announce-port 30111
和cluster-announce-bus-port 30211
,cm-redis-conf-02的配置改成cluster-announce-port 30112
和cluster-announce-bus-port 30212
,以此类推
bash
data:
redis.conf: |
maxmemory-policy volatile-lru
zset-max-listpack-value 64
#no_loose_disabled-commands ''
maxmemory-eviction-tenacity 10
appendonly yes
active-expire-effort 1
hz 10
lazyfree-lazy-user-flush no
lazyfree-lazy-server-del no
hash-max-listpack-entries 512
zset-max-listpack-entries 128
timeout 0
tracking-table-max-keys 1000000
lazyfree-lazy-expire no
stream-node-max-bytes 4096
set-max-intset-entries 512
lazyfree-lazy-user-del no
#no_loose_sentinel-enabled no
slowlog-log-slower-than 20000
latency-tracking yes
lazyfree-lazy-eviction no
dynamic-hz yes
hash-max-listpack-value 64
notify-keyspace-events ''
stream-node-max-entries 100
list-max-listpack-size -2
client-output-buffer-limit pubsub 33554432 8388608 60
list-compress-depth 0
slowlog-max-len 1024
masterauth woshimima
requirepass woshimima
cluster-enabled yes
cluster-announce-ip 192.168.1.10
cluster-announce-port 30111
cluster-announce-bus-port 30211
kind: ConfigMap
metadata:
name: cm-redis-conf-01
namespace: middlew
2)redis-service
bash
apiVersion: v1
kind: Service
metadata:
name: svc-nodeport-redis01
namespace: middlew
spec:
ports:
- name: redis01
nodePort: 30111
port: 6379
protocol: TCP
targetPort: 6379
- name: redisbus
nodePort: 30211
port: 16379
protocol: TCP
targetPort: 16379
selector:
app: sts-redis-01-0
sessionAffinity: None
type: NodePort
3)redis-satefulset
bash
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: sts-redis-01
name: sts-redis-01
namespace: middlew
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: sts-redis-01
serviceName: sts-redis-01-ops-clusterip
template:
metadata:
labels:
app: sts-redis-01
spec:
containers:
- args:
- /etc/redis/redis.conf
command:
- redis-server
image: swr.cn-north-4.myhuaweicloud.com/asdl-aps/redis:7.0.15
imagePullPolicy: IfNotPresent
name: redis
ports:
- containerPort: 6379
name: redis-6379
protocol: TCP
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/redis
name: redis-conf
- mountPath: /data
name: sts-redis-01-ops-data
- mountPath: /etc/localtime
name: localtime
readOnly: true
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: default-secret
restartPolicy: Always
schedulerName: default-scheduler
terminationGracePeriodSeconds: 30
volumes:
- configMap:
defaultMode: 420
items:
- key: redis.conf
path: redis.conf
name: cm-redis-conf-01
name: redis-conf
- hostPath:
path: /etc/localtime
type: ""
name: localtime
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sts-redis-01-ops-data
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
storageClassName: xxx-nfs-csi #修改storageclass名称
volumeMode: Filesystem
2、安装redis
正常情况下,是有6个statufulset类型的redis实例
登录到任意一个redis实例,执行:
bash
redis-cli -a woshimima --cluster create --cluster-replicas 1 192.168.1.10:30111 192.168.1.10:30112 192.168.1.10:30113 192.168.1.10:30114 192.168.1.10:30115 192.168.1.10:30116
输入yes
,完成自动组成redis集群
现在集群内外的服务都可以使用192.168.1.10:30111连接redis集群了