激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

香港云服务器
服務器之家 - 數據庫 - Redis - 在K8s上部署Redis集群的方法步驟

在K8s上部署Redis集群的方法步驟

2021-08-01 16:41朱溪江 Redis

這篇文章主要介紹了在K8s上部署Redis集群的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、前言

架構原理:每個master都可以擁有多個slave。當master下線后,redis集群會從多個slave中選舉出一個新的master作為替代,而舊master重新上線后變成新master的slave。

二、準備操作

 

本次部署主要基于該項目:https://github.com/zuxqoj/kubernetes-redis-cluster

其包含了兩種部署redis集群的方式:

  • statefulset
  • service&deployment

兩種方式各有優劣,對于像redis、mongodb、zookeeper等有狀態的服務,使用statefulset是首選方式。本文將主要介紹如何使用statefulset進行redis集群的部署。

三、statefulset簡介

 

rc、deployment、daemonset都是面向無狀態的服務,它們所管理的pod的ip、名字,啟停順序等都是隨機的,而statefulset是什么?顧名思義,有狀態的集合,管理所有有狀態的服務,比如mysql、mongodb集群等。
statefulset本質上是deployment的一種變體,在v1.9版本中已成為ga版本,它為了解決有狀態服務的問題,它所管理的pod擁有固定的pod名稱,啟停順序,在statefulset中,pod名字稱為網絡標識(hostname),還必須要用到共享存儲。
在deployment中,與之對應的服務是service,而在statefulset中與之對應的headless service,headless service,即無頭服務,與service的區別就是它沒有cluster ip,解析它的名稱時將返回該headless service對應的全部pod的endpoint列表。
除此之外,statefulset在headless service的基礎上又為statefulset控制的每個pod副本創建了一個dns域名,這個域名的格式為:

?
1
2
$(podname).(headless server name)  
fqdn: $(podname).(headless server name).namespace.svc.cluster.local

也即是說,對于有狀態服務,我們最好使用固定的網絡標識(如域名信息)來標記節點,當然這也需要應用程序的支持(如zookeeper就支持在配置文件中寫入主機域名)。
statefulset基于headless service(即沒有cluster ip的service)為pod實現了穩定的網絡標志(包括pod的hostname和dns records),在pod重新調度后也保持不變。同時,結合pv/pvc,statefulset可以實現穩定的持久化存儲,就算pod重新調度后,還是能訪問到原先的持久化數據。
以下為使用statefulset部署redis的架構,無論是master還是slave,都作為statefulset的一個副本,并且數據通過pv進行持久化,對外暴露為一個service,接受客戶端請求。

四、部署過程

 

本文參考項目的readme中,簡要介紹了基于statefulset的redis創建步驟:

1.創建nfs存儲
2.創建pv
3.創建pvc
4.創建configmap
5.創建headless服務
6.創建redis statefulset
7.初始化redis集群

這里,我將參考如上步驟,實踐操作并詳細介紹redis集群的部署過程。文中會涉及到很多k8s的概念,希望大家能提前了解學習

1.創建nfs存儲

創建nfs存儲主要是為了給redis提供穩定的后端存儲,當redis的pod重啟或遷移后,依然能獲得原先的數據。這里,我們先要創建nfs,然后通過使用pv為redis掛載一個遠程的nfs路徑。

安裝nfs

?
1
2
yum -y install nfs-utils(主包提供文件系統)
yum -y install rpcbind(提供rpc協議)

然后,新增/etc/exports文件,用于設置需要共享的路徑:

?
1
2
3
4
5
6
7
[root@ftp pv3]# cat /etc/exports
/usr/local/k8s/redis/pv1 192.168.0.0/24(rw,sync,no_root_squash)
/usr/local/k8s/redis/pv2 192.168.0.0/24(rw,sync,no_root_squash)
/usr/local/k8s/redis/pv3 192.168.0.0/24(rw,sync,no_root_squash)
/usr/local/k8s/redis/pv4 192.168.0.0/24(rw,sync,no_root_squash)
/usr/local/k8s/redis/pv5 192.168.0.0/24(rw,sync,no_root_squash)
/usr/local/k8s/redis/pv6 192.168.0.0/24(rw,sync,no_root_squash)

在K8s上部署Redis集群的方法步驟

創建相應目錄

?
1
[root@ftp quizii]# mkdir -p /usr/local/k8s/redis/pv{1..6}

接著,啟動nfs和rpcbind服務:

?
1
2
3
systemctl restart rpcbind
systemctl restart nfs
systemctl enable nfs
?
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ftp pv3]# exportfs -v
/usr/local/k8s/redis/pv1
        192.168.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/usr/local/k8s/redis/pv2
        192.168.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/usr/local/k8s/redis/pv3
        192.168.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/usr/local/k8s/redis/pv4
        192.168.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/usr/local/k8s/redis/pv5
        192.168.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/usr/local/k8s/redis/pv6
        192.168.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

客戶端

?
1
yum -y install nfs-utils

查看存儲端共享

?
1
2
3
4
5
6
7
8
[root@node2 ~]# showmount -e 192.168.0.222
export list for 192.168.0.222:
/usr/local/k8s/redis/pv6 192.168.0.0/24
/usr/local/k8s/redis/pv5 192.168.0.0/24
/usr/local/k8s/redis/pv4 192.168.0.0/24
/usr/local/k8s/redis/pv3 192.168.0.0/24
/usr/local/k8s/redis/pv2 192.168.0.0/24
/usr/local/k8s/redis/pv1 192.168.0.0/24

創建pv
每一個redis pod都需要一個獨立的pv來存儲自己的數據,因此可以創建一個pv.yaml文件,包含6個pv:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
[root@master redis]# cat pv.yaml
apiversion: v1
kind: persistentvolume
metadata:
  name: nfs-pv1
spec:
  capacity:
    storage: 200m
  accessmodes:
    - readwritemany
  nfs:
    server: 192.168.0.222
    path: "/usr/local/k8s/redis/pv1"
 
---
apiversion: v1
kind: persistentvolume
metadata:
  name: nfs-vp2
spec:
  capacity:
    storage: 200m
  accessmodes:
    - readwritemany
  nfs:
    server: 192.168.0.222
    path: "/usr/local/k8s/redis/pv2"
 
---
apiversion: v1
kind: persistentvolume
metadata:
  name: nfs-pv3
spec:
  capacity:
    storage: 200m
  accessmodes:
    - readwritemany
  nfs:
    server: 192.168.0.222
    path: "/usr/local/k8s/redis/pv3"
 
---
apiversion: v1
kind: persistentvolume
metadata:
  name: nfs-pv4
spec:
  capacity:
    storage: 200m
  accessmodes:
    - readwritemany
  nfs:
    server: 192.168.0.222
    path: "/usr/local/k8s/redis/pv4"
 
---
apiversion: v1
kind: persistentvolume
metadata:
  name: nfs-pv5
spec:
  capacity:
    storage: 200m
  accessmodes:
    - readwritemany
  nfs:
    server: 192.168.0.222
    path: "/usr/local/k8s/redis/pv5"
 
---
apiversion: v1
kind: persistentvolume
metadata:
  name: nfs-pv6
spec:
  capacity:
    storage: 200m
  accessmodes:
    - readwritemany
  nfs:
    server: 192.168.0.222
    path: "/usr/local/k8s/redis/pv6"

如上,可以看到所有pv除了名稱和掛載的路徑外都基本一致。執行創建即可:

?
1
2
3
4
5
6
7
[root@master redis]#kubectl create -f pv.yaml
persistentvolume "nfs-pv1" created
persistentvolume "nfs-pv2" created
persistentvolume "nfs-pv3" created
persistentvolume "nfs-pv4" created
persistentvolume "nfs-pv5" created
persistentvolume "nfs-pv6" created

2.創建configmap

這里,我們可以直接將redis的配置文件轉化為configmap,這是一種更方便的配置讀取方式。配置文件redis.conf如下

?
1
2
3
4
5
6
7
[root@master redis]# cat 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

創建名為redis-conf的configmap:

?
1
kubectl create configmap redis-conf --from-file=redis.conf

查看創建的configmap:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@master redis]# kubectl describe cm redis-conf
name:         redis-conf
namespace:    default
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.conf中的所有配置項都保存到redis-conf這個configmap中。

3.創建headless service

headless service是statefulset實現穩定網絡標識的基礎,我們需要提前創建。準備文件headless-service.yml如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@master redis]# cat headless-service.yaml
apiversion: v1
kind: service
metadata:
  name: redis-service
  labels:
    app: redis
spec:
  ports:
  - name: redis-port
    port: 6379
  clusterip: none
  selector:
    app: redis
    appcluster: redis-cluster

創建:

?
1
kubectl create -f headless-service.yml

查看:

在K8s上部署Redis集群的方法步驟

可以看到,服務名稱為redis-service,其cluster-ip為none,表示這是一個“無頭”服務。

4.創建redis 集群節點

創建好headless service后,就可以利用statefulset創建redis 集群節點,這也是本文的核心內容。我們先創建redis.yml文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
[root@master redis]# cat redis.yaml
apiversion: apps/v1beta1
kind: statefulset
metadata:
  name: redis-app
spec:
  servicename: "redis-service"
  replicas: 6
  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
        command:
          - "redis-server"
        args:
          - "/etc/redis/redis.conf"
          - "--protected-mode"
          - "no"
        resources:
          requests:
            cpu: "100m"
            memory: "100mi"
        ports:
            - name: redis
              containerport: 6379
              protocol: "tcp"
            - name: cluster
              containerport: 16379
              protocol: "tcp"
        volumemounts:
          - name: "redis-conf"
            mountpath: "/etc/redis"
          - name: "redis-data"
            mountpath: "/var/lib/redis"
      volumes:
      - name: "redis-conf"
        configmap:
          name: "redis-conf"
          items:
            - key: "redis.conf"
              path: "redis.conf"
  volumeclaimtemplates:
  - metadata:
      name: redis-data
    spec:
      accessmodes: [ "readwritemany" ]
      resources:
        requests:
          storage: 200m

如上,總共創建了6個redis節點(pod),其中3個將用于master,另外3個分別作為master的slave;redis的配置通過volume將之前生成的redis-conf這個configmap,掛載到了容器的/etc/redis/redis.conf;redis的數據存儲路徑使用volumeclaimtemplates聲明(也就是pvc),其會綁定到我們先前創建的pv上。

這里有一個關鍵概念——affinity,請參考官方文檔詳細了解。其中,podantiaffinity表示反親和性,其決定了某個pod不可以和哪些pod部署在同一拓撲域,可以用于將一個服務的pod分散在不同的主機或者拓撲域中,提高服務本身的穩定性。
而preferredduringschedulingignoredduringexecution 則表示,在調度期間盡量滿足親和性或者反親和性規則,如果不能滿足規則,pod也有可能被調度到對應的主機上。在之后的運行過程中,系統不會再檢查這些規則是否滿足。

在這里,matchexpressions規定了redis pod要盡量不要調度到包含app為redis的node上,也即是說已經存在redis的node上盡量不要再分配redis pod了。但是,由于我們只有三個node,而副本有6個,因此根據

preferredduringschedulingignoredduringexecution,這些豌豆不得不得擠一擠,擠擠更健康~

另外,根據statefulset的規則,我們生成的redis的6個pod的hostname會被依次命名為 $(statefulset名稱)-$(序號) 如下圖所示:

?
1
2
3
4
5
6
7
8
[root@master redis]# kubectl get pods -o wide
name                                            ready     status      restarts   age       ip             node            nominated node
redis-app-0                                     1/1       running     0          2h        172.17.24.3    192.168.0.144   <none>
redis-app-1                                     1/1       running     0          2h        172.17.63.8    192.168.0.148   <none>
redis-app-2                                     1/1       running     0          2h        172.17.24.8    192.168.0.144   <none>
redis-app-3                                     1/1       running     0          2h        172.17.63.9    192.168.0.148   <none>
redis-app-4                                     1/1       running     0          2h        172.17.24.9    192.168.0.144   <none>
redis-app-5                                     1/1       running     0          2h        172.17.63.10   192.168.0.148   <none>

如上,可以看到這些pods在部署時是以{0…n-1}的順序依次創建的。注意,直到redis-app-0狀態啟動后達到running狀態之后,redis-app-1 才開始啟動。
同時,每個pod都會得到集群內的一個dns域名,格式為$(podname).$(service name).$(namespace).svc.cluster.local ,也即是:

?
1
2
3
redis-app-0.redis-service.default.svc.cluster.local
redis-app-1.redis-service.default.svc.cluster.local
...以此類推...

在k8s集群內部,這些pod就可以利用該域名互相通信。我們可以使用busybox鏡像的nslookup檢驗這些域名:

?
1
2
3
4
5
6
[root@master redis]# kubectl exec -ti busybox -- nslookup redis-app-0.redis-service
server:    10.0.0.2
address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
 
name:      redis-app-0.redis-service
address 1: 172.17.24.3

可以看到, redis-app-0的ip為172.17.24.3。當然,若redis pod遷移或是重啟(我們可以手動刪除掉一個redis pod來測試),ip是會改變的,但是pod的域名、srv records、a record都不會改變。

另外可以發現,我們之前創建的pv都被成功綁定了:

?
1
2
3
4
5
6
7
8
[root@master redis]# kubectl get pv
name      capacity   access modes   reclaim policy   status    claim                            storageclass   reason    age
nfs-pv1   200m       rwx            retain           bound     default/redis-data-redis-app-2                            3h
nfs-pv3   200m       rwx            retain           bound     default/redis-data-redis-app-4                            3h
nfs-pv4   200m       rwx            retain           bound     default/redis-data-redis-app-5                            3h
nfs-pv5   200m       rwx            retain           bound     default/redis-data-redis-app-1                            3h
nfs-pv6   200m       rwx            retain           bound     default/redis-data-redis-app-0                            3h
nfs-vp2   200m       rwx            retain           bound     default/redis-data-redis-app-3                            3h

5.初始化redis集群

創建好6個redis pod后,我們還需要利用常用的redis-tribe工具進行集群的初始化

創建ubuntu容器
由于redis集群必須在所有節點啟動后才能進行初始化,而如果將初始化邏輯寫入statefulset中,則是一件非常復雜而且低效的行為。這里,本人不得不稱贊一下原項目作者的思路,值得學習。也就是說,我們可以在k8s上創建一個額外的容器,專門用于進行k8s集群內部某些服務的管理控制。
這里,我們專門啟動一個ubuntu的容器,可以在該容器中安裝redis-tribe,進而初始化redis集群,執行:

?
1
kubectl run -it ubuntu --image=ubuntu --restart=never /bin/bash

我們使用阿里云的ubuntu源,執行:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

成功后,原項目要求執行如下命令安裝基本的軟件環境:

?
1
2
apt-get update
apt-get install -y vim wget python2.7 python-pip redis-tools dnsutils

初始化集群
首先,我們需要安裝redis-trib

?
1
pip install redis-trib==0.5.1

然后,創建只有master節點的集群:

?
1
2
3
4
redis-trib.py create \
  `dig +short redis-app-0.redis-service.default.svc.cluster.local`:6379 \
  `dig +short redis-app-1.redis-service.default.svc.cluster.local`:6379 \
  `dig +short redis-app-2.redis-service.default.svc.cluster.local`:6379

其次,為每個master添加slave

?
1
2
3
4
5
6
7
8
9
10
11
redis-trib.py replicate \
  --master-addr `dig +short redis-app-0.redis-service.default.svc.cluster.local`:6379 \
  --slave-addr `dig +short redis-app-3.redis-service.default.svc.cluster.local`:6379
 
redis-trib.py replicate \
  --master-addr `dig +short redis-app-1.redis-service.default.svc.cluster.local`:6379 \
  --slave-addr `dig +short redis-app-4.redis-service.default.svc.cluster.local`:6379
 
redis-trib.py replicate \
  --master-addr `dig +short redis-app-2.redis-service.default.svc.cluster.local`:6379 \
  --slave-addr `dig +short redis-app-5.redis-service.default.svc.cluster.local`:6379

至此,我們的redis集群就真正創建完畢了,連到任意一個redis pod中檢驗一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@master redis]# kubectl exec -it redis-app-2 /bin/bash
root@redis-app-2:/data# /usr/local/bin/redis-cli -c
127.0.0.1:6379> cluster nodes
5d3e77f6131c6f272576530b23d1cd7592942eec 172.17.24.3:6379@16379 master - 0 1559628533000 1 connected 0-5461
a4b529c40a920da314c6c93d17dc603625d6412c 172.17.63.10:6379@16379 master - 0 1559628531670 6 connected 10923-16383
368971dc8916611a86577a8726e4f1f3a69c5eb7 172.17.24.9:6379@16379 slave 0025e6140f85cb243c60c214467b7e77bf819ae3 0 1559628533672 4 connected
0025e6140f85cb243c60c214467b7e77bf819ae3 172.17.63.8:6379@16379 master - 0 1559628533000 2 connected 5462-10922
6d5ee94b78b279e7d3c77a55437695662e8c039e 172.17.24.8:6379@16379 myself,slave a4b529c40a920da314c6c93d17dc603625d6412c 0 1559628532000 5 connected
2eb3e06ce914e0e285d6284c4df32573e318bc01 172.17.63.9:6379@16379 slave 5d3e77f6131c6f272576530b23d1cd7592942eec 0 1559628533000 3 connected
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:6
cluster_my_epoch:6
cluster_stats_messages_ping_sent:14910
cluster_stats_messages_pong_sent:15139
cluster_stats_messages_sent:30049
cluster_stats_messages_ping_received:15139
cluster_stats_messages_pong_received:14910
cluster_stats_messages_received:30049
127.0.0.1:6379>

另外,還可以在nfs上查看redis掛載的數據:

?
1
2
3
4
5
[root@ftp pv3]# ll /usr/local/k8s/redis/pv3
total 12
-rw-r--r-- 1 root root  92 jun  4 11:36 appendonly.aof
-rw-r--r-- 1 root root 175 jun  4 11:36 dump.rdb
-rw-r--r-- 1 root root 794 jun  4 11:49 nodes.conf

6.創建用于訪問service

前面我們創建了用于實現statefulset的headless service,但該service沒有cluster ip,因此不能用于外界訪問。所以,我們還需要創建一個service,專用于為redis集群提供訪問和負載均衡:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@master redis]# cat redis-access-service.yaml
apiversion: v1
kind: service
metadata:
  name: redis-access-service
  labels:
    app: redis
spec:
  ports:
  - name: redis-port
    protocol: "tcp"
    port: 6379
    targetport: 6379
  selector:
    app: redis
    appcluster: redis-cluster

如上,該service名稱為 redis-access-service,在k8s集群中暴露6379端口,并且會對labels nameapp: redisappcluster: redis-cluster的pod進行負載均衡。

創建后查看:

?
1
2
3
[root@master redis]#  kubectl get svc redis-access-service -o wide
name                   type        cluster-ip   external-ip   port(s)    age       selector
redis-access-service   clusterip   10.0.0.64    <none>        6379/tcp   2h        app=redis,appcluster=redis-cluster

如上,在k8s集群中,所有應用都可以通過10.0.0.64 :6379來訪問redis集群。當然,為了方便測試,我們也可以為service添加一個nodeport映射到物理機上,這里不再詳細介紹。

五、測試主從切換

 

在k8s上搭建完好redis集群后,我們最關心的就是其原有的高可用機制是否正常。這里,我們可以任意挑選一個master的pod來測試集群的主從切換機制,如redis-app-0

?
1
2
3
[root@master redis]# kubectl get pods redis-app-0 -o wide
name          ready     status    restarts   age       ip            node            nominated node
redis-app-1   1/1       running   0          3h        172.17.24.3   192.168.0.144   <none>

進入redis-app-0查看:

?
1
2
3
4
5
6
7
8
9
[root@master redis]# kubectl exec -it redis-app-0 /bin/bash
root@redis-app-0:/data# /usr/local/bin/redis-cli -c
127.0.0.1:6379> role
1) "master"
2) (integer) 13370
3) 1) 1) "172.17.63.9"
      2) "6379"
      3) "13370"
127.0.0.1:6379>

如上可以看到,app-0為master,slave為172.17.63.9redis-app-3。

接著,我們手動刪除redis-app-0

?
1
2
3
4
5
[root@master redis]# kubectl delete pod redis-app-0
pod "redis-app-0" deleted
[root@master redis]#  kubectl get pod redis-app-0 -o wide
name          ready     status    restarts   age       ip            node            nominated node
redis-app-0   1/1       running   0          4m        172.17.24.3   192.168.0.144   <none>

我們再進入redis-app-0內部查看:

?
1
2
3
4
5
6
7
8
[root@master redis]# kubectl exec -it redis-app-0 /bin/bash
root@redis-app-0:/data# /usr/local/bin/redis-cli -c
127.0.0.1:6379> role
1) "slave"
2) "172.17.63.9"
3) (integer) 6379
4) "connected"
5) (integer) 13958

如上,redis-app-0變成了slave,從屬于它之前的從節點172.17.63.9redis-app-3。

六、疑問

 

至此,大家可能會疑惑,那為什么沒有使用穩定的標志,redis pod也能正常進行故障轉移呢?這涉及了redis本身的機制。因為,redis集群中每個節點都有自己的nodeid(保存在自動生成的nodes.conf中),并且該nodeid不會隨著ip的變化和變化,這其實也是一種固定的網絡標志。也就是說,就算某個redis pod重啟了,該pod依然會加載保存的nodeid來維持自己的身份。我們可以在nfs上查看redis-app-1的nodes.conf文件:

?
1
2
3
[root@k8s-node2 ~]# cat /usr/local/k8s/redis/pv1/nodes.conf 96689f2018089173e528d3a71c4ef10af68ee462 192.168.169.209:6379@16379 slave d884c4971de9748f99b10d14678d864187a9e5d3 0 1526460952651 4 connected237d46046d9b75a6822f02523ab894928e2300e6 192.168.169.200:6379@16379 slave c15f378a604ee5b200f06cc23e9371cbc04f4559 0 1526460952651 1 connected
c15f378a604ee5b200f06cc23e9371cbc04f4559 192.168.169.197:6379@16379 master - 0 1526460952651 1 connected 10923-16383d884c4971de9748f99b10d14678d864187a9e5d3 192.168.169.205:6379@16379 master - 0 1526460952651 4 connected 5462-10922c3b4ae23c80ffe31b7b34ef29dd6f8d73beaf85f 192.168.169.198:6379@16379 myself,slave c8a8f70b4c29333de6039c47b2f3453ed11fb5c2 0 1526460952565 3 connected
c8a8f70b4c29333de6039c47b2f3453ed11fb5c2 192.168.169.201:6379@16379 master - 0 1526460952651 6 connected 0-5461vars currentepoch 6 lastvoteepoch 4

如上,第一列為nodeid,穩定不變;第二列為ip和端口信息,可能會改變。

這里,我們介紹nodeid的兩種使用場景:

當某個slave pod斷線重連后ip改變,但是master發現其nodeid依舊, 就認為該slave還是之前的slave。

當某個master pod下線后,集群在其slave中選舉重新的master。待舊master上線后,集群發現其nodeid依舊,會讓舊master變成新master的slave。

對于這兩種場景,大家有興趣的話還可以自行測試,注意要觀察redis的日志。

到此這篇關于在k8s上部署redis集群的方法步驟的文章就介紹到這了,更多相關k8s部署redis集群內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

延伸 · 閱讀

精彩推薦
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
1061
主站蜘蛛池模板: 日韩视频高清 | 精国产品一区二区三区 | 一级片国产片 | 好吊色37pao在线观看 | 福利免费在线 | 毛片一区二区三区 | 国产91小视频在线观看 | 欧美一级特级 | 国产伦精品一区二区三区 | www.xxx视频| 欧美巨乳在线观看 | 19禁国产精品福利视频 | 视频一区二区久久 | 国产黄色免费网站 | h视频在线免费观看 | 人人舔人人射 | 精品欧美一区二区精品久久久 | a在线视频 | 深夜免费观看视频 | 成人免费视频视频在线观看 免费 | 久久久久久久久久亚洲精品 | 羞羞的视频在线观看 | 中国videos露脸hd| 欧洲色阁中文字幕 | 久久精品中文字幕一区 | 九色在线78m | 国产又粗又爽又深的免费视频 | 欧美精品色精品一区二区三区 | 国产1区在线观看 | 欧美wwwwww | 91免费高清视频 | 99最新地址 | 久久久久国 | 久久国产秒 | 中文字幕一区二区三区四区 | 欧美毛片在线观看 | 欧美一级黄色片在线观看 | 成人在线免费小视频 | 久久精品伊人网 | 欧美一级做一a做片性视频 日韩黄色片免费看 | 日韩精品中文字幕一区二区 |