Redis数据持久化
提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF.
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。你甚至可以关闭持久化功能,让数据只在服务器运行时存在。
Redis Dockerfile
#Redis Image
FROM harbor.intra.com/baseimages/centos-base:7.9.2009
ADD redis-4.0.14.tar.gz /usr/local/src
RUN ln -sv /usr/local/src/redis-4.0.14 /usr/local/redis && cd /usr/local/redis && make && cp src/redis-cli /usr/sbin/ && cp src/redis-server /usr/sbin/ && mkdir -pv /data/redis-data
ADD redis.conf /usr/local/redis/redis.conf
ADD run_redis.sh /usr/local/redis/run_redis.sh
EXPOSE 6379
CMD ["/usr/local/redis/run_redis.sh"]
build-command.sh
#!/bin/bash
TAG=$1
docker build -t harbor.intra.com/wework/redis:${TAG} .
sleep 3
docker push harbor.intra.com/wework/redis:${TAG}
redis.conf
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 5 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis-data
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
requirepass 123456
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
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
run_redis.sh
#!/bin/bash
/usr/sbin/redis-server /usr/local/redis/redis.conf
tail -f /etc/hosts
构建Redis镜像
root@k8s-master-01:/opt/k8s-data/dockerfile/web/wework/redis# ./build-command.sh v4.0.14
Successfully built f13c1ccdf5d6
Successfully tagged harbor.intra.com/wework/redis:v4.0.14
The push refers to repository [harbor.intra.com/wework/redis]
e045520d5142: Pushed
f7c5723d3227: Pushed
bf4069c34244: Pushed
d383bf570da4: Pushed
6f2f514dbcfd: Pushed
42a5df432d46: Pushed
7a6c7dc8d8df: Pushed
c91e83206e44: Pushed
bf0b39b2f6ed: Pushed
174f56854903: Mounted from wework/tomcat-app1
v4.0.14: digest: sha256:22882e70d65d693933f5cb61b2b449a4cef62ee65c28530030ff94b06a7eee1b size: 2416
root@k8s-master-01:/opt/k8s-data/dockerfile/web/wework/redis# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
harbor.intra.com/wework/redis v4.0.14 f13c1ccdf5d6 12 minutes ago 3.28GB
测试下镜像能不能起来
root@k8s-master-01:/opt/k8s-data/dockerfile/web/wework/redis# docker run -it --rm harbor.intra.com/wework/redis:v4.0.14
7:C 10 Aug 12:48:10.607 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7:C 10 Aug 12:48:10.609 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=7, just started
7:C 10 Aug 12:48:10.609 # Configuration loaded
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 a9b6b1d26209
Nfs服务器上
mkdir -p /data/k8s/wework/redis-datadir-1
PV的yaml
redis-persistentvolume.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-datadir-pv-1
namespace: wework
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
nfs:
path: /data/k8s/wework/redis-datadir-1
server: 192.168.31.109
PVC的yaml
redis-persistentvolumeclaim.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-datadir-pvc-1
namespace: wework
spec:
volumeName: redis-datadir-pv-1
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
创建pv
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis/pv# kubectl apply -f redis-persistentvolume.yaml
persistentvolume/redis-datadir-pv-1 created
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis/pv# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
redis-datadir-pv-1 10Gi RWO Retain Available 6s
test 1Gi RWX Retain Available nfs 57d
zookeeper-datadir-pv-1 20Gi RWO Retain Bound wework/zookeeper-datadir-pvc-1 15h
zookeeper-datadir-pv-2 20Gi RWO Retain Bound wework/zookeeper-datadir-pvc-2 15h
zookeeper-datadir-pv-3 20Gi RWO Retain Bound wework/zookeeper-datadir-pvc-3 15h
创建pvc
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis/pv# kubectl apply -f redis-persistentvolumeclaim.yaml
persistentvolumeclaim/redis-datadir-pvc-1 created
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis/pv# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
redis-datadir-pv-1 10Gi RWO Retain Bound wework/redis-datadir-pvc-1 2m15s
test 1Gi RWX Retain Available nfs 57d
zookeeper-datadir-pv-1 20Gi RWO Retain Bound wework/zookeeper-datadir-pvc-1 15h
zookeeper-datadir-pv-2 20Gi RWO Retain Bound wework/zookeeper-datadir-pvc-2 15h
zookeeper-datadir-pv-3 20Gi RWO Retain Bound wework/zookeeper-datadir-pvc-3 15h
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis/pv# kubectl get pvc -n wework
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
redis-datadir-pvc-1 Pending redis-datadir-pv-1 0 10s
zookeeper-datadir-pvc-1 Bound zookeeper-datadir-pv-1 20Gi RWO 15h
zookeeper-datadir-pvc-2 Bound zookeeper-datadir-pv-2 20Gi RWO 15h
zookeeper-datadir-pvc-3 Bound zookeeper-datadir-pv-3 20Gi RWO 15h
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis/pv# kubectl get pvc -n wework
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
redis-datadir-pvc-1 Bound redis-datadir-pv-1 10Gi RWO 14s
zookeeper-datadir-pvc-1 Bound zookeeper-datadir-pv-1 20Gi RWO 15h
zookeeper-datadir-pvc-2 Bound zookeeper-datadir-pv-2 20Gi RWO 15h
zookeeper-datadir-pvc-3 Bound zookeeper-datadir-pv-3 20Gi RWO 15h
Redis deployment的yaml
redis.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: devops-redis
name: deploy-devops-redis
namespace: wework
spec:
replicas: 1
selector:
matchLabels:
app: devops-redis
template:
metadata:
labels:
app: devops-redis
spec:
containers:
- name: redis-container
image: harbor.intra.com/wework/redis:v4.0.14
imagePullPolicy: Always
volumeMounts:
- mountPath: "/data/redis-data/"
name: redis-datadir
volumes:
- name: redis-datadir
persistentVolumeClaim:
claimName: redis-datadir-pvc-1
---
kind: Service
apiVersion: v1
metadata:
labels:
app: devops-redis
name: srv-devops-redis
namespace: wework
spec:
type: NodePort
ports:
- name: http
port: 6379
targetPort: 6379
nodePort: 36379
selector:
app: devops-redis
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
创建Redis Deployment
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis# kubectl apply -f redis.yaml
deployment.apps/deploy-devops-redis created
service/srv-devops-redis created
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis# kubectl get pods -n wework
NAME READY STATUS RESTARTS AGE
deploy-devops-redis-7864f5d7dc-v9tq8 1/1 Running 0 8m34s
wework-nginx-deployment-cdbb4945f-7xgx5 1/1 Running 0 4h19m
wework-tomcat-app1-deployment-65d8d46957-s4666 1/1 Running 0 4h19m
zookeeper1-699d46468c-8jq4x 1/1 Running 0 167m
zookeeper2-7cc484778-gj45x 1/1 Running 0 167m
zookeeper3-cdf484f7c-jh6hz 1/1 Running 0 167m
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis# kubectl get svc -n wework
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
srv-devops-redis NodePort 10.200.67.224 <none> 6379:36379/TCP 9m7s
wework-nginx-service NodePort 10.200.89.252 <none> 80:30090/TCP,443:30091/TCP 47h
wework-tomcat-app1-service ClusterIP 10.200.21.158 <none> 80/TCP 28h
zookeeper ClusterIP 10.200.117.19 <none> 2181/TCP 167m
zookeeper1 NodePort 10.200.167.230 <none> 2181:32181/TCP,2888:31774/TCP,3888:56670/TCP 167m
zookeeper2 NodePort 10.200.36.129 <none> 2181:32182/TCP,2888:46321/TCP,3888:30984/TCP 167m
zookeeper3 NodePort 10.200.190.129 <none> 2181:32183/TCP,2888:61447/TCP,3888:51393/TCP 167m
测试写入数据后删除redis,数据是否丢失
[root@deploy-devops-redis-7864f5d7dc-v9tq8 /]# redis-cli
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379>
在nfs服务器上确认数据是否产生
root@haproxy-1:~# ll /data/k8s/wework/redis-datadir-1
total 12
drwxr-xr-x 2 root root 4096 Aug 10 13:14 ./
drwxr-xr-x 7 root root 4096 Aug 10 12:54 ../
-rw-r--r-- 1 root root 111 Aug 10 13:14 dump.rdb
测试删除Pod
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis# kubectl get pods -n wework
NAME READY STATUS RESTARTS AGE
deploy-devops-redis-7864f5d7dc-v9tq8 1/1 Running 0 15m
wework-nginx-deployment-cdbb4945f-7xgx5 1/1 Running 0 4h26m
wework-tomcat-app1-deployment-65d8d46957-s4666 1/1 Running 0 4h26m
zookeeper1-699d46468c-8jq4x 1/1 Running 0 173m
zookeeper2-7cc484778-gj45x 1/1 Running 0 173m
zookeeper3-cdf484f7c-jh6hz 1/1 Running 0 173m
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis# kubectl delete pods deploy-devops-redis-7864f5d7dc-v9tq8 -n wework
pod "deploy-devops-redis-7864f5d7dc-v9tq8" deleted
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis# kubectl get pods -n wework
NAME READY STATUS RESTARTS AGE
deploy-devops-redis-7864f5d7dc-lgx48 1/1 Running 0 35s
wework-nginx-deployment-cdbb4945f-7xgx5 1/1 Running 0 4h27m
wework-tomcat-app1-deployment-65d8d46957-s4666 1/1 Running 0 4h27m
zookeeper1-699d46468c-8jq4x 1/1 Running 0 174m
zookeeper2-7cc484778-gj45x 1/1 Running 0 174m
zookeeper3-cdf484f7c-jh6hz 1/1 Running 0 174m
确认数据还在
[root@deploy-devops-redis-7864f5d7dc-lgx48 /]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379>
通过python批量写入数据到Redis
import redis
import time
pool = redis.ConnectionPool(host="192.168.31.113",port="36379",password="123456",decode_responses=True)
r = redis.Redis(connection_pool=pool)
for i in range(100):
r.set("key-m49_%s" % i,"value-m49_%s" % i)
data=r.get("key-m49_%s" % i)
print(data)
再到Redis查询
82) "key-m49_36"
83) "key-m49_10"
84) "key-m49_15"
85) "key-m49_21"
86) "key-m49_74"
87) "key-m49_50"
88) "key-m49_42"
89) "key-m49_31"
90) "key-m49_79"
91) "key-m49_90"
92) "key-m49_16"
93) "key-m49_49"
94) "key-m49_81"
95) "key-m49_12"
96) "key-m49_59"
97) "key-m49_66"
98) "key-m49_65"
99) "key-m49_54"
100) "key-m49_96"
101) "key-m49_34"
127.0.0.1:6379> get "key-m49_96"
"value-m49_96"
127.0.0.1:6379>
Nfs服务器上创建目录
mkdir /data/k8s/wework/redis{0..5}
Pv的yaml文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv0
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.31.109
path: /data/k8s/wework/redis0
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv1
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.31.109
path: /data/k8s/wework/redis1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv2
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.31.109
path: /data/k8s/wework/redis2
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv3
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.31.109
path: /data/k8s/wework/redis3
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv4
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.31.109
path: /data/k8s/wework/redis4
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis-cluster-pv5
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.31.109
path: /data/k8s/wework/redis5
创建pv
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis-cluster/pv# kubectl apply -f redis-cluster-pv.yaml
persistentvolume/redis-cluster-pv0 created
persistentvolume/redis-cluster-pv1 created
persistentvolume/redis-cluster-pv2 created
persistentvolume/redis-cluster-pv3 created
persistentvolume/redis-cluster-pv4 created
persistentvolume/redis-cluster-pv5 created
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis-cluster/pv# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
redis-cluster-pv0 5Gi RWO Retain Available 3s
redis-cluster-pv1 5Gi RWO Retain Available 3s
redis-cluster-pv2 5Gi RWO Retain Available 3s
redis-cluster-pv3 5Gi RWO Retain Available 3s
redis-cluster-pv4 5Gi RWO Retain Available 3s
redis-cluster-pv5 5Gi RWO Retain Available 3s
redis-datadir-pv-1 10Gi RWO Retain Bound wework/redis-datadir-pvc-1 49m
test 1Gi RWX Retain Available nfs 57d
zookeeper-datadir-pv-1 20Gi RWO Retain Bound wework/zookeeper-datadir-pvc-1 16h
zookeeper-datadir-pv-2 20Gi RWO Retain Bound wework/zookeeper-datadir-pvc-2 16h
zookeeper-datadir-pv-3 20Gi RWO Retain Bound wework/zookeeper-datadir-pvc-3 16h
配置文件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
创建configMap
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis-cluster# kubectl create configmap redis-conf --from-file=redis.conf -n wework
configmap/redis-conf created
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis-cluster# kubectl get configmaps -n wework
NAME DATA AGE
kube-root-ca.crt 1 2d
redis-conf 1 32s
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis-cluster# kubectl describe configmaps redis-conf -n wework
Name: redis-conf
Namespace: wework
Labels: <none>
Annotations: <none>
Data
====
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
Events: <none>
Redis Statefulset yaml
redis.yaml
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: wework
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: wework
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: wework
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:4.0.14
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: wework
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 5Gi
创建Redis StatefulSet
Statefulset会一台台创建,前面的成功了再创建后面的
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis-cluster# kubectl apply -f redis.yaml
service/redis created
service/redis-access created
statefulset.apps/redis created
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis-cluster# kubectl get pods -n wework
NAME READY STATUS RESTARTS AGE
deploy-devops-redis-7864f5d7dc-lgx48 1/1 Running 0 46m
redis-0 0/1 ContainerCreating 0 44s
wework-nginx-deployment-cdbb4945f-7xgx5 1/1 Running 0 5h12m
wework-tomcat-app1-deployment-65d8d46957-s4666 1/1 Running 0 5h12m
zookeeper1-699d46468c-8jq4x 1/1 Running 0 3h40m
zookeeper2-7cc484778-gj45x 1/1 Running 0 3h40m
zookeeper3-cdf484f7c-jh6hz 1/1 Running 0 3h40m
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis-cluster# kubectl get pods -n wework
NAME READY STATUS RESTARTS AGE
deploy-devops-redis-7864f5d7dc-lgx48 1/1 Running 0 47m
redis-0 1/1 Running 0 98s
redis-1 0/1 ContainerCreating 0 24s
wework-nginx-deployment-cdbb4945f-7xgx5 1/1 Running 0 5h13m
wework-tomcat-app1-deployment-65d8d46957-s4666 1/1 Running 0 5h13m
zookeeper1-699d46468c-8jq4x 1/1 Running 0 3h41m
zookeeper2-7cc484778-gj45x 1/1 Running 0 3h41m
zookeeper3-cdf484f7c-jh6hz 1/1 Running 0 3h41m
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis-cluster# kubectl get pods -n wework
NAME READY STATUS RESTARTS AGE
deploy-devops-redis-7864f5d7dc-lgx48 1/1 Running 0 48m
redis-0 1/1 Running 0 3m36s
redis-1 1/1 Running 0 2m22s
redis-2 0/1 ContainerCreating 0 61s
wework-nginx-deployment-cdbb4945f-7xgx5 1/1 Running 0 5h15m
wework-tomcat-app1-deployment-65d8d46957-s4666 1/1 Running 0 5h15m
zookeeper1-699d46468c-8jq4x 1/1 Running 0 3h43m
zookeeper2-7cc484778-gj45x 1/1 Running 0 3h43m
zookeeper3-cdf484f7c-jh6hz 1/1 Running 0 3h43m
root@k8s-master-01:/opt/k8s-data/yaml/wework/redis-cluster# kubectl get pods -n wework
NAME READY STATUS RESTARTS AGE
deploy-devops-redis-7864f5d7dc-lgx48 1/1 Running 0 49m
redis-0 1/1 Running 0 4m18s
redis-1 1/1 Running 0 3m4s
redis-2 1/1 Running 0 103s
redis-3 1/1 Running 0 22s
redis-4 1/1 Running 0 18s
redis-5 1/1 Running 0 14s
wework-nginx-deployment-cdbb4945f-7xgx5 1/1 Running 0 5h16m
wework-tomcat-app1-deployment-65d8d46957-s4666 1/1 Running 0 5h16m
zookeeper1-699d46468c-8jq4x 1/1 Running 0 3h43m
zookeeper2-7cc484778-gj45x 1/1 Running 0 3h43m
zookeeper3-cdf484f7c-jh6hz 1/1 Running 0 3h43m
临时启动一个pod用来初始化Redis集群
root@k8s-master-01:~# kubectl run -it ubuntu1804 --image=ubuntu:18.04 --restart=Never -n wework bash
## 替换apt仓库
root@ubuntu:/# cat > /etc/apt/sources.list << EOF
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
EOF
root@ubuntu:/# apt update
root@ubuntu:/# apt install python2.7 python-pip redis-tools dnsutils iputils-ping net-tools -y
root@ubuntu1804:/# pip install --upgrade pip
Collecting pip
Downloading https://files.pythonhosted.org/packages/27/79/8a850fe3496446ff0d584327ae44e7500daf6764ca1a382d2d02789accf7/pip-20.3.4-py2.py3-none-any.whl (1.5MB)
100% |################################| 1.5MB 788kB/s
Installing collected packages: pip
Found existing installation: pip 9.0.1
Not uninstalling pip at /usr/lib/python2.7/dist-packages, outside environment /usr
Successfully installed pip-20.3.4
root@ubuntu1804:/# pip install redis-trib==0.5.1
Collecting redis-trib==0.5.1
Downloading redis-trib-0.5.1.tar.gz (10 kB)
Collecting Werkzeug
Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
|################################| 298 kB 1.1 MB/s
Collecting click
Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)
|################################| 82 kB 2.2 MB/s
Collecting hiredis
Downloading hiredis-1.1.0-cp27-cp27mu-manylinux2010_x86_64.whl (58 kB)
|################################| 58 kB 14.5 MB/s
Collecting retrying
Downloading retrying-1.3.3.tar.gz (10 kB)
Requirement already satisfied: six>=1.7.0 in /usr/lib/python2.7/dist-packages (from retrying->redis-trib==0.5.1) (1.11.0)
Building wheels for collected packages: redis-trib, retrying
Building wheel for redis-trib (setup.py) ... done
Created wheel for redis-trib: filename=redis_trib-0.5.1-py2-none-any.whl size=11341 sha256=6f2df4b780df481dabf61d859abb65f7ae73b1a517faa79c093fbf05633733c2
Stored in directory: /root/.cache/pip/wheels/fe/52/82/cf08baa7853197e3f591a295185666ec90f1e44b609d4456d4
Building wheel for retrying (setup.py) ... done
Created wheel for retrying: filename=retrying-1.3.3-py2-none-any.whl size=9532 sha256=86dcf1e1445fc7b140c402342d735ad7d7b172e73b8db141dbdd2d9b7eeee510
Stored in directory: /root/.cache/pip/wheels/fa/24/c3/9912f4c9363033bbd0eafbec1b27c65b04d7ea6acd312876b0
Successfully built redis-trib retrying
Installing collected packages: Werkzeug, click, hiredis, retrying, redis-trib
Successfully installed Werkzeug-1.0.1 click-7.1.2 hiredis-1.1.0 redis-trib-0.5.1 retrying-1.3.3
创建Redis集群
redis槽位从0-16383,共16384个
redis-trib.py create `dig +short redis-0.redis.wework.svc.magedu.local`:6379 \
`dig +short redis-1.redis.wework.svc.magedu.local`:6379 \
`dig +short redis-2.redis.wework.svc.magedu.local`:6379
Redis-trib 0.5.1 Copyright (c) HunanTV Platform developers
INFO:root:Instance at 172.100.140.82:6379 checked
INFO:root:Instance at 172.100.109.88:6379 checked
INFO:root:Instance at 172.100.76.159:6379 checked
INFO:root:Add 5462 slots to 172.100.140.82:6379
INFO:root:Add 5461 slots to 172.100.109.88:6379
INFO:root:Add 5461 slots to 172.100.76.159:6379
# 将redis-3加入redis-0
root@ubuntu1804:/# redis-trib.py replicate --master-addr `dig +short redis-0.redis.wework.svc.magedu.local`:6379 \
--slave-addr `dig +short redis-3.redis.wework.svc.magedu.local`:6379
Redis-trib 0.5.1 Copyright (c) HunanTV Platform developers
INFO:root:Instance at 172.100.140.83:6379 has joined 172.100.140.82:6379; now set replica
INFO:root:Instance at 172.100.140.83:6379 set as replica to bbe92769df4e5164ec73542064220006d96bdc40
# redis-4和redis-1绑定
root@ubuntu1804:/# redis-trib.py replicate --master-addr `dig +short redis-1.redis.wework.svc.magedu.local`:6379 --slave-addr `dig +short redis-4.redis.wework.svc.magedu.local`:6379
Redis-trib 0.5.1 Copyright (c) HunanTV Platform developers
INFO:root:Instance at 172.100.76.160:6379 has joined 172.100.76.159:6379; now set replica
INFO:root:Instance at 172.100.76.160:6379 set as replica to 0c3ff3127c1cfcff63b96c51b727977cf619c9b3
# redis-5和redis-2绑定
root@ubuntu1804:/# redis-trib.py replicate --master-addr `dig +short redis-2.redis.wework.svc.magedu.local`:6379 --slave-addr `dig +short redis-5.redis.wework.svc.magedu.local`:6379
Redis-trib 0.5.1 Copyright (c) HunanTV Platform developers
INFO:root:Instance at 172.100.109.89:6379 has joined 172.100.109.88:6379; now set replica
INFO:root:Instance at 172.100.109.89:6379 set as replica to 98b86162f083a3f6269ed5abdfac9f3535729f90
连接到Redis集群任意一个pod
root@redis-5:/data# redis-cli
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:1
cluster_stats_messages_ping_sent:483
cluster_stats_messages_pong_sent:483
cluster_stats_messages_sent:966
cluster_stats_messages_ping_received:478
cluster_stats_messages_pong_received:483
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:966
127.0.0.1:6379> CLUSTER NODES
93fb7651914a1dad36190f55df96e167b92bc36b 172.100.76.160:6379@16379 slave 0c3ff3127c1cfcff63b96c51b727977cf619c9b3 0 1660118751907 2 connected
0c3ff3127c1cfcff63b96c51b727977cf619c9b3 172.100.76.159:6379@16379 master - 0 1660118751000 2 connected 10923-16383
bbe92769df4e5164ec73542064220006d96bdc40 172.100.140.82:6379@16379 master - 0 1660118750000 0 connected 0-5461
b22c872939d02f9b890f996d353b83ef7776644c 172.100.140.83:6379@16379 slave bbe92769df4e5164ec73542064220006d96bdc40 0 1660118750000 0 connected
143e2c972b90ba375269b8fafa64422e8b9635b0 172.100.109.89:6379@16379 myself,slave 98b86162f083a3f6269ed5abdfac9f3535729f90 0 1660118751000 5 connected
98b86162f083a3f6269ed5abdfac9f3535729f90 172.100.109.88:6379@16379 master - 0 1660118751000 1 connected 5462-10922
127.0.0.1:6379>
尝试在不同节点写入数据
root@redis-0:/data# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set key1 val1
(error) MOVED 9189 172.100.109.88:6379
127.0.0.1:6379>
root@redis-0:/data# redis-cli
127.0.0.1:6379> set key2 val2
OK
127.0.0.1:6379> set key3 val3
OK
127.0.0.1:6379> set key4 val4
(error) MOVED 13120 172.100.76.159:6379
127.0.0.1:6379> keys *
1) "key3"
2) "key2"
root@redis-1:/data# redis-cli
127.0.0.1:6379> set key1 val1
(error) MOVED 9189 172.100.109.88:6379
127.0.0.1:6379> set key4 val4
OK
127.0.0.1:6379> keys *
1) "key4"
root@redis-2:/data# redis-cli
127.0.0.1:6379> set key1 val1
OK
127.0.0.1:6379>
至此Redis-cluster Statefulset 配置完成