소스 검색

redis cluster

Dotbalo 6 년 전
부모
커밋
6682827ee2

+ 81 - 0
redis/redis-cluster/README.md

@@ -0,0 +1,81 @@
+此yaml为Redis Cluster模式,用于简单部署持久化Redis Cluster,Redis版本为4.0.8
+
+1. 创建namespace
+
+    ````
+        kubectl create namespace public-service
+    ````
+    
+    其他namespace需要替换当前文件
+    
+    sed -i "s#public-service#YOUR_NAMESPACE#g" *
+
+2. 首先创建pv所用目录
+
+    ````
+        NFS服务器:
+        /k8s/redis-cluster/1 *(rw,sync,no_subtree_check,no_root_squash)
+        /k8s/redis-cluster/2 *(rw,sync,no_subtree_check,no_root_squash)
+        /k8s/redis-cluster/3 *(rw,sync,no_subtree_check,no_root_squash)
+        /k8s/redis-cluster/4 *(rw,sync,no_subtree_check,no_root_squash)
+        /k8s/redis-cluster/5 *(rw,sync,no_subtree_check,no_root_squash)
+        /k8s/redis-cluster/6 *(rw,sync,no_subtree_check,no_root_squash)
+    ````
+    
+3. 创建集群
+
+    ````
+        [root@k8s-master01 redis-cluster]# ls
+        failover.py  redis-cluster-configmap.yaml  redis-cluster-rbac.yaml     redis-cluster-ss.yaml
+        README.md    redis-cluster-pv.yaml         redis-cluster-service.yaml
+        [root@k8s-master01 redis-cluster]# kubectl apply -f .
+    ````
+    
+4. 创建slot
+
+    ````
+	# 等待所有pod启动完毕后,直接执行以下命令。
+
+        v=""
+        
+        for i in `kubectl get po -n public-service -o wide | awk  '{print $6}' | grep -v IP`; do v="$v $i:6379";done
+
+        kubectl exec -ti redis-cluster-ss-5 -n public-service -- redis-trib.rb create --replicas 1 $v
+    ````
+
+5. 查看状态
+
+    ````
+        [root@k8s-master01 ~]# kubectl exec -ti redis-cluster-ss-0 -n public-service -- redis-cli cluster nodesf9527e2ced3c472caabe3f815d87531e82e75049 172.168.5.174:6379@16379 master - 0 1541693210490 2 connected 5461-10922
+        a47ef989862a2ddbf83c70d8191ff17c8b37a6fc 172.168.2.68:6379@16379 master - 0 1541693213497 3 connected 10923-16383
+        b4c3d1ffe5ed70d2d40467d228004f4e0fb5fa25 172.168.5.175:6379@16379 slave f9527e2ced3c472caabe3f815d87531e82e75049 0 1541693216510 6 connected
+        2aa4d2e5de3aca325bff95325102da72334a5164 172.168.1.76:6379@16379 master - 0 1541693214503 7 connected 0-5460
+        74c6e2356e41c6842e05b043c48ce20b7f1ad3ae 172.168.0.95:6379@16379 slave a47ef989862a2ddbf83c70d8191ff17c8b37a6fc 0 1541693215504 4 connected
+        2d5389ff7ff6b6dcc5cff83654a6e15c9c4a7750 172.168.6.170:6379@16379 myself,slave 2aa4d2e5de3aca325bff95325102da72334a5164 0 1541692127160 1 connected
+        [root@k8s-master01 ~]# kubectl exec -ti redis-cluster-ss-0 -n public-service -- redis-cli 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:7
+        cluster_my_epoch:7
+        cluster_stats_messages_ping_sent:1158
+        cluster_stats_messages_pong_sent:1203
+        cluster_stats_messages_sent:2361
+        cluster_stats_messages_ping_received:1203
+        cluster_stats_messages_pong_received:1142
+        cluster_stats_messages_received:2345
+    ````
+    
+6. 其他说明
+
+    ````
+        创建Redis Cluster集群不一定非要用sts,用dc也一样。
+        终止某一个pod虽然IP会变,但是不会影响集群完整性,会自我恢复。
+        测试过终止所有Redis Cluster POD,此时集群无法正常恢复,使用failover.py(由于时间匆忙,随便写的)会恢复集群,
+        并且不会丢失已保存的数据。
+    ````
+

+ 32 - 0
redis/redis-cluster/failover.py

@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+
+
+import os,sys
+
+def change_ip():
+  id_data = {}
+  new_data = {}
+  for i in range(0,6):
+    po_name = "redis-cluster-ss-%s" %i
+    ID = os.popen("kubectl exec -ti %s -n public-service -- grep 'myself' /data/nodes.conf | awk -F':' '{print $1}' | awk '{print $1}'" %po_name).read().split('\n')[0:-1][0]
+    new_ip = os.popen("kubectl get pods %s -n public-service -o wide | awk '{print $6}'| grep -v IP"%po_name).read().split('\n')[0:-1][0]
+    id_data[po_name] = ID
+    new_data[po_name] = new_ip
+  
+  for pod_name in id_data.keys():
+      for pn in id_data.keys():
+        print "%s -------------> %s"%(id_data[pn],new_data[pn])
+        os.system("kubectl exec -ti {po_name} -n public-service -- sed -i 's#{ID} \(.*\):6379#{ID} {new_ip}:6379#g' /data/nodes.conf".format(ID=id_data[pn], new_ip=new_data[pn], po_name=pod_name))
+        print "replacing {ip} to {new_ip} in the nodes.conf of {po_name}".format(ip=id_data[pn], new_ip=new_data[pn], po_name=pod_name)
+      
+      print "restart redis..."
+      os.system("kubectl exec -ti %s -n public-service -- killall redis-server"%pod_name)
+
+if __name__ == '__main__':
+  run_number = os.popen("kubectl get po -n public-service -o wide | grep -v READY | wc -l").read().split('\n')[0:-1][0]
+  print "pod of running currently is %s" %run_number
+  if run_number < 6:
+    sys.exit("please wait for pod to start...")
+  else:
+    print "failover..."
+  change_ip()

+ 17 - 0
redis/redis-cluster/redis-cluster-configmap.yaml

@@ -0,0 +1,17 @@
+kind: ConfigMap
+apiVersion: v1
+metadata:
+  name: redis-cluster-config
+  namespace: public-service
+  labels:
+    addonmanager.kubernetes.io/mode: Reconcile
+data:
+    redis-cluster.conf: |
+      # 节点端口
+      port 6379
+      # #  开启集群模式
+      cluster-enabled yes
+      # #  节点超时时间,单位毫秒
+      cluster-node-timeout 15000
+      # #  集群内部配置文件
+      cluster-config-file "nodes.conf"

+ 119 - 0
redis/redis-cluster/redis-cluster-pv.yaml

@@ -0,0 +1,119 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+  name: pv-redis-cluster-1
+  namespace: public-service
+spec:
+  capacity:
+    storage: 1Gi
+  accessModes:
+    - ReadWriteOnce
+  volumeMode: Filesystem
+  persistentVolumeReclaimPolicy: Recycle
+  storageClassName: "redis-cluster-storage-class"
+  nfs:
+    # real share directory
+    path: /k8s/redis-cluster/1
+    # nfs real ip
+    server: 192.168.2.2
+
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+  name: pv-redis-cluster-2
+  namespace: public-service
+spec:
+  capacity:
+    storage: 1Gi
+  accessModes:
+    - ReadWriteOnce
+  volumeMode: Filesystem
+  persistentVolumeReclaimPolicy: Recycle
+  storageClassName: "redis-cluster-storage-class"
+  nfs:
+    # real share directory
+    path: /k8s/redis-cluster/2
+    # nfs real ip
+    server: 192.168.2.2
+
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+  name: pv-redis-cluster-3
+  namespace: public-service
+spec:
+  capacity:
+    storage: 1Gi
+  accessModes:
+    - ReadWriteOnce
+  volumeMode: Filesystem
+  persistentVolumeReclaimPolicy: Recycle
+  storageClassName: "redis-cluster-storage-class"
+  nfs:
+    # real share directory
+    path: /k8s/redis-cluster/3
+    # nfs real ip
+    server: 192.168.2.2
+
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+  name: pv-redis-cluster-4
+  namespace: public-service
+spec:
+  capacity:
+    storage: 1Gi
+  accessModes:
+    - ReadWriteOnce
+  volumeMode: Filesystem
+  persistentVolumeReclaimPolicy: Recycle
+  storageClassName: "redis-cluster-storage-class"
+  nfs:
+    # real share directory
+    path: /k8s/redis-cluster/4
+    # nfs real ip
+    server: 192.168.2.2
+
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+  name: pv-redis-cluster-5
+  namespace: public-service
+spec:
+  capacity:
+    storage: 1Gi
+  accessModes:
+    - ReadWriteOnce
+  volumeMode: Filesystem
+  persistentVolumeReclaimPolicy: Recycle
+  storageClassName: "redis-cluster-storage-class"
+  nfs:
+    # real share directory
+    path: /k8s/redis-cluster/5
+    # nfs real ip
+    server: 192.168.2.2
+
+---
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+  name: pv-redis-cluster-6
+  namespace: public-service
+spec:
+  capacity:
+    storage: 1Gi
+  accessModes:
+    - ReadWriteOnce
+  volumeMode: Filesystem
+  persistentVolumeReclaimPolicy: Recycle
+  storageClassName: "redis-cluster-storage-class"
+  nfs:
+    # real share directory
+    path: /k8s/redis-cluster/6
+    # nfs real ip
+    server: 192.168.2.2
+

+ 32 - 0
redis/redis-cluster/redis-cluster-rbac.yaml

@@ -0,0 +1,32 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: redis-cluster
+  namespace: public-service
+---
+kind: Role
+apiVersion: rbac.authorization.k8s.io/v1beta1
+metadata:
+  name: redis-cluster
+  namespace: public-service
+rules:
+  - apiGroups:
+      - ""
+    resources:
+      - endpoints
+    verbs:
+      - get
+---
+kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1beta1
+metadata:
+  name: redis-cluster
+  namespace: public-service
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: Role
+  name: redis-cluster
+subjects:
+- kind: ServiceAccount
+  name: redis-cluster
+  namespace: public-service

+ 15 - 0
redis/redis-cluster/redis-cluster-service.yaml

@@ -0,0 +1,15 @@
+kind: Service
+apiVersion: v1
+metadata:
+  labels:
+    app: redis-cluster-ss
+  name: redis-cluster-ss
+  namespace: public-service
+spec:
+  clusterIP: None
+  ports:
+  - name: redis
+    port: 6379
+    targetPort: 6379
+  selector:
+    app: redis-cluster-ss

+ 57 - 0
redis/redis-cluster/redis-cluster-ss.yaml

@@ -0,0 +1,57 @@
+kind: StatefulSet
+apiVersion: apps/v1beta1
+metadata:
+  labels:
+    app: redis-cluster-ss
+  name: redis-cluster-ss
+  namespace: public-service
+spec:
+  replicas: 6
+  selector:
+    matchLabels:
+      app: redis-cluster-ss
+  serviceName: redis-cluster-ss
+  template:
+    metadata:
+      labels:
+        app: redis-cluster-ss
+    spec:
+      containers:
+      - args:
+        - -c
+        - cp /mnt/redis-cluster.conf /data ; redis-server /data/redis-cluster.conf
+        command:
+        - sh
+        image: dotbalo/redis-trib:4.0.10
+        imagePullPolicy: IfNotPresent
+        name: redis-cluster
+        ports:
+        - containerPort: 6379
+          name: masterport
+          protocol: TCP
+        volumeMounts:
+        - mountPath: /mnt/
+          name: config-volume
+          readOnly: false
+        - mountPath: /data/
+          name: redis-cluster-storage
+          readOnly: false
+      serviceAccountName: redis-cluster
+      terminationGracePeriodSeconds: 30
+      volumes:
+      - configMap:
+          items:
+          - key: redis-cluster.conf
+            path: redis-cluster.conf
+          name: redis-cluster-config 
+        name: config-volume
+  volumeClaimTemplates:
+  - metadata:
+      name: redis-cluster-storage
+    spec:
+      accessModes:
+      - ReadWriteOnce
+      storageClassName: "redis-cluster-storage-class"
+      resources:
+        requests:
+          storage: 1Gi