{"id":201393,"date":"2025-05-10T09:35:36","date_gmt":"2025-05-10T01:35:36","guid":{"rendered":"https:\/\/server.hk\/cnblog\/201393\/"},"modified":"2025-05-10T09:35:36","modified_gmt":"2025-05-10T01:35:36","slug":"k8s%e9%83%a8%e7%bd%b2redis-cluster%e9%9b%86%e7%be%a4%e7%9a%84%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/201393\/","title":{"rendered":"k8s\u90e8\u7f72redis cluster\u96c6\u7fa4\u7684\u5b9e\u73b0"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>k8s\u90e8\u7f72redis cluster\u96c6\u7fa4\u7684\u5b9e\u73b0<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span> <\/p>\n<p>\u4eb2\u7231\u7684\u7f16\u7a0b\u5b66\u4e60\u7231\u597d\u8005\uff0c\u5982\u679c\u4f60\u70b9\u5f00\u4e86\u8fd9\u7bc7\u6587\u7ae0\uff0c\u8bf4\u660e\u4f60\u5bf9\u300ak8s\u90e8\u7f72redis cluster\u96c6\u7fa4\u7684\u5b9e\u73b0\u300b\u5f88\u611f\u5174\u8da3\u3002\u672c\u7bc7\u6587\u7ae0\u5c31\u6765\u7ed9\u5927\u5bb6\u8be6\u7ec6\u89e3\u6790\u4e00\u4e0b\uff0c\u4e3b\u8981\u4ecb\u7ecd\u4e00\u4e0bRedis\u3001K8s\u90e8\u7f72\u3001cluster\uff0c\u5e0c\u671b\u6240\u6709\u8ba4\u771f\u8bfb\u5b8c\u7684\u7ae5\u978b\u4eec\uff0c\u90fd\u6709\u5b9e\u8d28\u6027\u7684\u63d0\u9ad8\u3002<\/p>\n<h2>Redis \u4ecb\u7ecd<\/h2>\n<ul>\n<li>Redis\u4ee3\u8868REmote DIctionary Server\u662f\u4e00\u79cd\u5f00\u6e90\u7684\u5185\u5b58\u4e2d\u6570\u636e\u5b58\u50a8\uff0c\u901a\u5e38\u7528\u4f5c\u6570\u636e\u5e93\uff0c\u7f13\u5b58\u6216\u6d88\u606f\u4ee3\u7406\u3002\u5b83\u53ef\u4ee5\u5b58\u50a8\u548c\u64cd\u4f5c\u9ad8\u7ea7\u6570\u636e\u7c7b\u578b\uff0c\u4f8b\u5982\u5217\u8868\uff0c\u5730\u56fe\uff0c\u96c6\u5408\u548c\u6392\u5e8f\u96c6\u5408\u3002<\/li>\n<li>\u7531\u4e8eRedis\u63a5\u53d7\u591a\u79cd\u683c\u5f0f\u7684\u5bc6\u94a5\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728\u670d\u52a1\u5668\u4e0a\u6267\u884c\u64cd\u4f5c\uff0c\u4ece\u800c\u51cf\u5c11\u4e86\u5ba2\u6237\u7aef\u7684\u5de5\u4f5c\u91cf\u3002<\/li>\n<li>\u5b83\u4ec5\u5c06\u78c1\u76d8\u7528\u4e8e\u6301\u4e45\u6027\uff0c\u800c\u5c06\u6570\u636e\u5b8c\u5168\u4fdd\u5b58\u5728\u5185\u5b58\u4e2d\u3002<\/li>\n<li>Redis\u662f\u4e00\u79cd\u6d41\u884c\u7684\u6570\u636e\u5b58\u50a8\u89e3\u51b3\u65b9\u6848\uff0c\u5e76\u88abGitHub\uff0cPinterest\uff0cSnapchat\uff0cTwitter\uff0cStackOverflow\uff0cFlickr\u7b49\u6280\u672f\u5de8\u5934\u6240\u4f7f\u7528\u3002<\/li>\n<\/ul>\n<h2>\u4e3a\u4ec0\u4e48\u8981\u7528Redis<\/h2>\n<ul>\n<li>\u5b83\u7684\u901f\u5ea6\u975e\u5e38\u5feb\u3002\u5b83\u662f\u7528ANSI C\u7f16\u5199\u7684\uff0c\u5e76\u4e14\u53ef\u4ee5\u5728POSIX\u7cfb\u7edf\u4e0a\u8fd0\u884c\uff0c\u4f8b\u5982Linux\uff0cMac OS X\u548cSolaris\u3002<\/li>\n<li>Redis\u901a\u5e38\u88ab\u6392\u540d\u4e3a\u6700\u6d41\u884c\u7684\u952e\/\u503c\u6570\u636e\u5e93\u548c\u6700\u6d41\u884c\u7684\u4e0e\u5bb9\u5668\u4e00\u8d77\u4f7f\u7528\u7684NoSQL\u6570\u636e\u5e93\u3002<\/li>\n<li>\u5176\u7f13\u5b58\u89e3\u51b3\u65b9\u6848\u51cf\u5c11\u4e86\u5bf9\u4e91\u6570\u636e\u5e93\u540e\u7aef\u7684\u8c03\u7528\u6b21\u6570\u3002<\/li>\n<li>\u5e94\u7528\u7a0b\u5e8f\u53ef\u4ee5\u901a\u8fc7\u5176\u5ba2\u6237\u7aefAPI\u5e93\u5bf9\u5176\u8fdb\u884c\u8bbf\u95ee\u3002<\/li>\n<li>\u6240\u6709\u6d41\u884c\u7684\u7f16\u7a0b\u8bed\u8a00\u90fd\u652f\u6301Redis\u3002<\/li>\n<li>\u5b83\u662f\u5f00\u6e90\u4e14\u7a33\u5b9a\u7684\u3002<\/li>\n<\/ul>\n<h2>\u4ec0\u4e48\u662fRedis Cluster\u96c6\u7fa4<\/h2>\n<ul>\n<li>Redis Cluster\u662f\u4e00\u7ec4Redis\u5b9e\u4f8b\uff0c\u65e8\u5728\u901a\u8fc7\u5bf9\u6570\u636e\u5e93\u8fdb\u884c\u5206\u533a\u6765\u6269\u5c55\u6570\u636e\u5e93\uff0c\u4ece\u800c\u4f7f\u5176\u66f4\u5177\u5f39\u6027\u3002<\/li>\n<li>\u7fa4\u96c6\u4e2d\u7684\u6bcf\u4e2a\u6210\u5458\uff08\u65e0\u8bba\u662f\u4e3b\u526f\u672c\u8fd8\u662f\u8f85\u52a9\u526f\u672c\uff09\u90fd\u7ba1\u7406\u54c8\u5e0c\u69fd\u7684\u5b50\u96c6\u3002\u5982\u679c\u4e3b\u673a\u65e0\u6cd5\u8bbf\u95ee\uff0c\u5219\u5176\u4ece\u673a\u5c06\u5347\u7ea7\u4e3a\u4e3b\u673a\u3002\u5728\u7531\u4e09\u4e2a\u4e3b\u8282\u70b9\u7ec4\u6210\u7684\u6700\u5c0fRedis\u7fa4\u96c6\u4e2d\uff0c\u6bcf\u4e2a\u4e3b\u8282\u70b9\u90fd\u6709\u4e00\u4e2a\u4ece\u8282\u70b9\uff08\u4ee5\u5b9e\u73b0\u6700\u5c0f\u7684\u6545\u969c\u8f6c\u79fb\uff09\uff0c\u6bcf\u4e2a\u4e3b\u8282\u70b9\u90fd\u5206\u914d\u6709\u4e00\u4e2a\u4ecb\u4e8e0\u523016,383\u4e4b\u95f4\u7684\u54c8\u5e0c\u69fd\u8303\u56f4\u3002\u8282\u70b9A\u5305\u542b\u4ece0\u52305000\u7684\u54c8\u5e0c\u69fd\uff0c\u8282\u70b9B\u4ece5001\u523010000\uff0c\u8282\u70b9C\u4ece10001\u523016383\u3002<\/li>\n<li>\u7fa4\u96c6\u5185\u90e8\u7684\u901a\u4fe1\u662f\u901a\u8fc7\u5185\u90e8\u603b\u7ebf\u8fdb\u884c\u7684\uff0c\u4f7f\u7528\u534f\u8bae\u4f20\u64ad\u6709\u5173\u7fa4\u96c6\u7684\u4fe1\u606f\u6216\u53d1\u73b0\u65b0\u8282\u70b9\u3002<\/li>\n<\/ul>\n<h2>k8s\u4ee5StatefulSet\u65b9\u5f0f\u90e8\u7f72redis cluster\u96c6\u7fa4\uff1a<\/h2>\n<p>1. \u90e8\u7f72nfs<\/p>\n<p>2. \u521b\u5efapv<\/p>\n<p>3. \u90e8\u7f72redis<\/p>\n<p>4. \u521d\u59cb\u5316redis\u96c6\u7fa4<\/p>\n<p>\u4e3b\u673a\u8bf4\u660e\uff1a<\/p>\n<\/p>\n<table>\n<thead>\n<tr>\n<th>\u7cfb\u7edf<\/th>\n<th>ip<\/th>\n<th>\u89d2\u8272<\/th>\n<th>cpu<\/th>\n<th>\u5185\u5b58<\/th>\n<th>hostname<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>CentOS 7.8<\/td>\n<td>192.168.30.128<\/td>\n<td>master<\/td>\n<td>&gt;=2<\/td>\n<td>&gt;=2G<\/td>\n<td>master1<\/td>\n<\/tr>\n<tr>\n<td>CentOS 7.8<\/td>\n<td>192.168.30.129<\/td>\n<td>master<\/td>\n<td>&gt;=2<\/td>\n<td>&gt;=2G<\/td>\n<td>master2<\/td>\n<\/tr>\n<tr>\n<td>CentOS 7.8<\/td>\n<td>192.168.30.130<\/td>\n<td>node<\/td>\n<td>&gt;=2<\/td>\n<td>&gt;=2G<\/td>\n<td>node1<\/td>\n<\/tr>\n<tr>\n<td>CentOS 7.8<\/td>\n<td>192.168.30.131<\/td>\n<td>node<\/td>\n<td>&gt;=2<\/td>\n<td>&gt;=2G<\/td>\n<td>node2<\/td>\n<\/tr>\n<tr>\n<td>CentOS 7.8<\/td>\n<td>192.168.30.132<\/td>\n<td>node<\/td>\n<td>&gt;=2<\/td>\n<td>&gt;=2G<\/td>\n<td>node3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre>\nkubectl get node\n\nNAME      STATUS   ROLES    AGE   VERSION\nmaster1   Ready    master   33d   v1.14.0\nmaster2   Ready    master   33d   v1.14.0\nnode1     Ready    \n   \n       33d   v1.14.0\nnode2     Ready    \n    \n      33d v1.14.0 node3 Ready \n     \n       33d v1.14.0\n     \n    \n   <\/pre>\n<h2>\u90e8\u7f72nfs<br \/><\/h2>\n<p>\u5728master2\u8282\u70b9\u4e0a\u505anfs\u5171\u4eab\uff0c<\/p>\n<pre>\nyum -y install nfs-utils rpcbind\nmkdir -p \/data\/redis\/{cluster0,cluster1,cluster2,cluster3,cluster4,cluster5}\nvim \/etc\/exports<\/pre>\n<pre>\n\/data\/redis\/cluster0 192.168.30.0\/24(rw,sync,no_root_squash)\n\/data\/redis\/cluster1 192.168.30.0\/24(rw,sync,no_root_squash)\n\/data\/redis\/cluster2 192.168.30.0\/24(rw,sync,no_root_squash)\n\/data\/redis\/cluster3 192.168.30.0\/24(rw,sync,no_root_squash)\n\/data\/redis\/cluster4 192.168.30.0\/24(rw,sync,no_root_squash)\n\/data\/redis\/cluster5 192.168.30.0\/24(rw,sync,no_root_squash)<\/pre>\n<pre>\nchmod -R 755 \/data\/redis\nexportfs -arv\nsystemctl enable rpcbind &amp;&amp; systemctl start rpcbind\nsystemctl enable nfs &amp;&amp; systemctl start nfs<\/pre>\n<p>nfs\u90e8\u7f72\u5b8c\u6bd5\u3002\u5bf9\u4e8e\u9700\u8981\u4f7f\u7528nfs\u7684node\u8282\u70b9\uff0c\u90fd\u8981\u5b89\u88c5nfs\uff1a<\/p>\n<pre>\nyum -y install nfs-utils<\/pre>\n<h2>\u521b\u5efapv<br \/><\/h2>\n<p>\u521b\u5efapv\uff1a<\/p>\n<pre>\nmkdir -p \/home\/k8s\/redis  &amp;&amp; cd \/home\/k8s\/redis\nvim pv.yaml<\/pre>\n<pre>\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: nfs-pv0\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteMany\n  nfs:\n    server: 192.168.30.129\n    path: \/data\/redis\/cluster0\n\n---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: nfs-pv1\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteMany\n  nfs:\n    server: 192.168.30.129\n    path: \/data\/redis\/cluster1\n\n---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: nfs-pv2\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteMany\n  nfs:\n    server: 192.168.30.129\n    path: \/data\/redis\/cluster2\n\n---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: nfs-pv3\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteMany\n  nfs:\n    server: 192.168.30.129\n    path: \/data\/redis\/cluster3\n\n---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: nfs-pv4\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteMany\n  nfs:\n    server: 192.168.30.129\n    path: \/data\/redis\/cluster4\n\n---\napiVersion: v1\nkind: PersistentVolume\nmetadata:\n  name: nfs-pv5\nspec:\n  capacity:\n    storage: 1Gi\n  accessModes:\n    - ReadWriteMany\n  nfs:\n    server: 192.168.30.129\n    path: \/data\/redis\/cluster5<\/pre>\n<pre>\nkubectl apply -f pv.yaml\n\nkubectl get pv\n\nNAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE\nnfs-pv0   1Gi        RWX            Retain           Available                                   3s\nnfs-pv1   1Gi        RWX            Retain           Available                                   3s\nnfs-pv2   1Gi        RWX            Retain           Available                                   3s\nnfs-pv3   1Gi        RWX            Retain           Available                                   3s\nnfs-pv4   1Gi        RWX            Retain           Available                                   3s\nnfs-pv5   1Gi        RWX            Retain           Available                                   3s<\/pre>\n<p>pv\u521b\u5efa\u5b8c\u6bd5\u3002<\/p>\n<h2>\u90e8\u7f72redis<br \/><\/h2>\n<pre>\nvim namespace.yaml\n\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: public-service\n<\/pre>\n<pre>\nvim redis.conf\n\nappendonly yes\ncluster-enabled yes\ncluster-config-file \/var\/lib\/redis\/nodes.conf\ncluster-node-timeout 5000\ndir \/var\/lib\/redis\nport 6379\n<\/pre>\n<pre>\nvim redis.yaml\n\napiVersion: v1\nkind: Service\nmetadata:\n  name: redis\n  namespace: public-service\n  labels:\n    app: redis\nspec:\n  selector:\n    app: redis\n    appCluster: redis-cluster\n  ports:\n  - name: redis\n    port: 6379\n  clusterIP: None\n  \n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: redis-access\n  namespace: public-service\n  labels:\n    app: redis\nspec:\n  selector:\n    app: redis\n    appCluster: redis-cluster\n  ports:\n  - name: redis-access\n    protocol: TCP\n    port: 6379\n    targetPort: 6379\n\n---\napiVersion: apps\/v1\nkind: StatefulSet\nmetadata:\n  name: redis\n  namespace: public-service\nspec:\n  serviceName: redis\n  replicas: 6\n  selector:\n    matchLabels:\n      app: redis\n      appCluster: redis-cluster\n  template:\n    metadata:\n      labels:\n        app: redis\n        appCluster: redis-cluster\n    spec:\n      terminationGracePeriodSeconds: 20\n      affinity:\n        podAntiAffinity:\n          preferredDuringSchedulingIgnoredDuringExecution:\n          - weight: 100\n            podAffinityTerm:\n              labelSelector:\n                matchExpressions:\n                - key: app\n                  operator: In\n                  values:\n                  - redis\n              topologyKey: kubernetes.io\/hostname\n      containers:\n      - name: redis\n        image: redis:latest\n        command:\n          - \"redis-server\"\n        args:\n          - \"\/etc\/redis\/redis.conf\"\n          - \"--protected-mode\"\n          - \"no\"\n        resources:\n          requests:\n            cpu: \"500m\"\n            memory: \"500Mi\"\n        ports:\n        - containerPort: 6379\n          name: redis\n          protocol: TCP\n        - containerPort: 16379\n          name: cluster\n          protocol: TCP\n        volumeMounts:\n        - name: conf\n          mountPath: \/etc\/redis\n        - name: data\n          mountPath: \/var\/lib\/redis\n      volumes:\n      - name: conf\n        configMap:\n          name: redis-conf\n          items:\n          - key: redis.conf\n            path: redis.conf\n  volumeClaimTemplates:\n  - metadata:\n      name: data\n      namespace: public-service\n    spec:\n      accessModes: [ \"ReadWriteMany\" ]\n      resources:\n        requests:\n          storage: 1Gi<\/pre>\n<pre>\nkubectl apply -f namespace.yaml\n\nkubectl create configmap redis-conf --from-file=redis.conf -n public-service\n\nkubectl apply -f redis.yaml\n\nkubectl get svc -n public-service\n\nNAME           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE\nredis          ClusterIP   None          \n   \n            6379\/TCP   20s\nredis-access   ClusterIP   10.96.2.100   \n    \n      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\n    \n   <\/pre>\n<p>redis-access\u8fd9\u4e2aservice\u65b9\u4fbf\u96c6\u7fa4\u5185\u8bbf\u95eeredis\u96c6\u7fa4\uff0credis\u90e8\u7f72\u5b8c\u6bd5\u3002<\/p>\n<h2>\u521d\u59cb\u5316redis\u96c6\u7fa4<br \/><\/h2>\n<p>\u4f7f\u7528Redis-tribe\u5de5\u5177\u8fdb\u884c\u96c6\u7fa4\u7684\u521d\u59cb\u5316\u3002<\/p>\n<p>\u4e0b\u8f7dredis-tribe\uff1a<\/p>\n<pre>\nkubectl run -it ubuntu --image=ubuntu --restart=Never -n public-service bash\n\nroot@ubuntu:\/# cat &gt; \/etc\/apt\/sources.list \n\n\n<pre>\nroot@ubuntu:\/# apt-get update\n\nroot@ubuntu:\/# apt-get install -y libncursesw5 libreadline6 libtinfo5 --allow-remove-essential\n\nroot@ubuntu:\/# apt-get install -y libpython2.7-stdlib python2.7 python-pip redis-tools dnsutils\n\nroot@ubuntu:\/# pip install --upgrade pip\n\nroot@ubuntu:\/# pip install redis-trib==0.5.1\n\n<\/pre>\n<p>\u521d\u59cb\u5316\u96c6\u7fa4\uff1a<\/p>\n<pre>\nroot@ubuntu:\/# redis-trib.py create \\\n  `dig +short redis-0.redis.public-service.svc.cluster.local`:6379 \\\n  `dig +short redis-1.redis.public-service.svc.cluster.local`:6379 \\\n  `dig +short redis-2.redis.public-service.svc.cluster.local`:6379\n  \nroot@ubuntu:\/# redis-trib.py replicate \\\n  --master-addr `dig +short redis-0.redis.public-service.svc.cluster.local`:6379 \\\n  --slave-addr `dig +short redis-3.redis.public-service.svc.cluster.local`:6379\n\nroot@ubuntu:\/# redis-trib.py replicate \\\n  --master-addr `dig +short redis-1.redis.public-service.svc.cluster.local`:6379 \\\n  --slave-addr `dig +short redis-4.redis.public-service.svc.cluster.local`:6379\n\nroot@ubuntu:\/# redis-trib.py replicate \\\n  --master-addr `dig +short redis-2.redis.public-service.svc.cluster.local`:6379 \\\n  --slave-addr `dig +short redis-5.redis.public-service.svc.cluster.local`:6379\n  \nroot@ubuntu:\/# exit<\/pre>\n<p>\u67e5\u770b\u96c6\u7fa4\uff1a<\/p>\n<pre>\nkubectl exec -it -n public-service redis-0 bash\n\nroot@redis-0:\/data# redis-cli -c\n\n127.0.0.1:6379&gt; CLUSTER NODES               #\u5217\u51fa\u8282\u70b9\u4fe1\u606f\n\naac2b3d320da67eedf3512ed0e38a1cdce5bc8fe 172.10.2.55:6379@16379 slave 7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 0 1592276224727 3 connected\n2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 172.10.2.54:6379@16379 master - 0 1592276224224 1 connected 0-5461\n524f03526a4b683d7d4de19296431810bfdc22cf 172.10.3.60:6379@16379 slave df5bc3c2e2851d63cdb9f762efde6e1b0d38efed 0 1592276223117 5 connected\n7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 172.10.4.77:6379@16379 myself,master - 0 1592276224000 2 connected 5462-10922\ndf5bc3c2e2851d63cdb9f762efde6e1b0d38efed 172.10.3.59:6379@16379 master - 0 1592276223217 0 connected 10923-16383\nc1dbaaef4a583e372c43eed52c22cd9ad7184d18 172.10.4.78:6379@16379 slave 2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 0 1592276223719 4 connected\n\n127.0.0.1:6379&gt; CLUSTER INFO                #\u96c6\u7fa4\u72b6\u6001\n\ncluster_state:ok\ncluster_slots_assigned:16384\ncluster_slots_ok:16384\ncluster_slots_pfail:0\ncluster_slots_fail:0\ncluster_known_nodes:6\ncluster_size:3\ncluster_current_epoch:5\ncluster_my_epoch:2\ncluster_stats_messages_ping_sent:514\ncluster_stats_messages_pong_sent:491\ncluster_stats_messages_meet_sent:2\ncluster_stats_messages_sent:1007\ncluster_stats_messages_ping_received:491\ncluster_stats_messages_pong_received:516\ncluster_stats_messages_received:1007<\/pre>\n<p>redis\u96c6\u7fa4\u521d\u59cb\u5316\u5b8c\u6210\uff0c\u5df2\u7ecf\u5f62\u62103\u4e3b3\u4ece\u7684cluster\u96c6\u7fa4\u3002<\/p>\n<p>\u5199\u5165\u6570\u636e\uff1a<\/p>\n<pre>\n127.0.0.1:6379&gt; SET key1 aaa\nOK\n\n127.0.0.1:6379&gt; SET key2 bbb\n-&gt; Redirected to slot [4998] located at 172.10.2.54:6379\nOK\n\n172.10.2.54:6379&gt; SET key3 ccc\nOK\n\n<\/pre>\n<pre>\nkubectl exec -it -n public-service redis-4 bash\n\nroot@redis-4:\/data# redis-cli -c\n\n127.0.0.1:6379&gt; GET key1\n-&gt; Redirected to slot [9189] located at 172.10.4.77:6379\n\"aaa\"\n\n172.10.4.77:6379&gt; GET key2\n-&gt; Redirected to slot [4998] located at 172.10.2.54:6379\n\"bbb\"\n\n172.10.2.54:6379&gt; GET key3\n\"ccc\"<\/pre>\n<p>\u53ef\u4ee5\u770b\u51faredis cluster\u96c6\u7fa4\u662f\u53bb\u4e2d\u5fc3\u5316\u7684\uff0c\u6bcf\u4e2a\u8282\u70b9\u90fd\u662f\u5e73\u7b49\u7684\uff0c\u8fde\u63a5\u54ea\u4e2a\u8282\u70b9\u90fd\u53ef\u4ee5\u83b7\u53d6\u548c\u8bbe\u7f6e\u6570\u636e\u3002<\/p>\n<p>\u4e3b\u4ece\u5207\u6362\uff1a<\/p>\n<p>\u9009\u62e9redis-2\u6a21\u62df\u5b95\u6389\uff0c\u6d4b\u8bd5\u4e3b\u4ece\u5207\u6362\uff0c<\/p>\n<pre>\nkubectl get pod -n public-service -o wide\n\nNAME      READY   STATUS      RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES\nredis-0   1\/1     Running     0          62m   172.10.4.77   node1   \n    \n     \n       redis-1 1\/1 Running 0 62m 172.10.2.54 node2 \n      \n       \n         redis-2 1\/1 Running 0 61m 172.10.3.59 node3 \n        \n         \n           redis-3 1\/1 Running 0 61m 172.10.2.55 node2 \n          \n           \n             redis-4 1\/1 Running 0 61m 172.10.4.78 node1 \n            \n             \n               redis-5 1\/1 Running 0 61m 172.10.3.60 node3 \n              \n               \n                 ubuntu 0\/1 Completed 0 57m 172.10.2.56 node2 \n                \n                 \n                   kubectl exec -it -n public-service redis-2 bash root@redis-2:\/data# redis-cli -c 127.0.0.1:6379&gt; ROLE 1) \"master\" 2) (integer) 2898 3) 1) 1) \"172.10.3.60\" 2) \"6379\" 3) \"2898\" \n                 \n                \n               \n              \n             \n            \n           \n          \n         \n        \n       \n      \n     \n    <\/pre>\n<p>\u53ef\u4ee5\u770b\u5230\uff0credis-2\u662fmaster\uff0c\u5b83\u7684slave\u662f172.10.3.60\uff0c\u5373redis-5\u3002<\/p>\n<pre>\nkubectl delete pod -n public-service redis-2                #\u6a21\u62df\u8282\u70b9\u5b95\u6389\n\nkubectl get pod -n public-service redis-2 -o wide\n\nNAME      READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES\nredis-2   1\/1     Running   0          38s   172.10.3.61   node3   \n    \n     \n       kubectl exec -it -n public-service redis-2 bash root@redis-2:\/data# redis-cli -c 127.0.0.1:6379&gt; ROLE 1) \"slave\" 2) \"172.10.3.60\" 3) (integer) 6379 4) \"connected\" 5) (integer) 3430\n     \n    <\/pre>\n<pre>\nkubectl exec -it -n public-service redis-5 bash\n\nroot@redis-5:\/data# redis-cli -c\n\n127.0.0.1:6379&gt; ROLE\n\n1) \"master\"\n2) (integer) 3584\n3) 1) 1) \"172.10.3.61\"\n      2) \"6379\"\n      3) \"3570\"\n      \n127.0.0.1:6379&gt; CLUSTER NODES\n\naac2b3d320da67eedf3512ed0e38a1cdce5bc8fe 172.10.2.55:6379@16379 slave 7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 0 1592278859530 2 connected\n2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 172.10.2.54:6379@16379 master - 0 1592278859000 1 connected 0-5461\nc1dbaaef4a583e372c43eed52c22cd9ad7184d18 172.10.4.78:6379@16379 slave 2efad514b2f3c7fe4530dd6dc63c0df8ffdb793d 0 1592278859000 1 connected\n524f03526a4b683d7d4de19296431810bfdc22cf 172.10.3.60:6379@16379 myself,master - 0 1592278857000 6 connected 10923-16383\n7c4d60cf32685484ea6c5cb4493a937dfbf6b8a5 172.10.4.77:6379@16379 master - 0 1592278858021 2 connected 5462-10922\ndf5bc3c2e2851d63cdb9f762efde6e1b0d38efed 172.10.3.61:6379@16379 slave 524f03526a4b683d7d4de19296431810bfdc22cf 0 1592278859000 6 connected\n\n<\/pre>\n<p>\u53ef\u4ee5\u770b\u5230\uff0credis-2\u5728\u91cd\u542f\u4e4b\u540e\u53d8\u4e3aslave\uff0c\u800c\u5b83\u4e4b\u524d\u7684slave\u2014\u2014redis-5\u53d8\u4e3amaster\uff0c\u800c\u4e14\u662f\u65b0redis-2\u7684master\u3002<\/p>\n<p>\u96c6\u7fa4\u7684\u4e3b\u4ece\u5207\u6362\u6ca1\u6709\u95ee\u9898\u3002k8s\u90e8\u7f72redis cluster\u96c6\u7fa4\u5b8c\u6210\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>k8s\u90e8\u7f72redis clust&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[101],"tags":[],"class_list":["post-201393","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/comments?post=201393"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201393\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=201393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=201393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=201393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}