Redis Cluster集群原理+三主三從交叉復制實戰+故障切換(十)(redis的五種數據類型)

      網友投稿 1545 2025-03-31

      Redis Cluster集群原理+實戰+故障切換

      文章目錄

      Redis Cluster集群原理+實戰+故障切換

      1.redis cluster原理概念

      1.1.cluster架構概念

      1.2.redis cluster不合理的架構圖

      1.3.部署一個cluster三主三從集群具體步驟

      1.4.環境準備

      2.部署redis cluster節點

      2.1.redis-1配置

      2.2.redis-2配置

      2.3.redis-3配置

      2.4.查看redis cluster進程

      2.5.查看集群信息文件內容

      3.配置cluster集群互相發現

      3.1.互相發現概念

      3.2.將集群的所有節點進行互相發現

      4.cluster集群分配操作

      4.1.redis cluster通訊流程

      4.2.手動配置集群槽位

      4.3.創建key驗證集群是否可用

      4.4.ASK路由解決key創建提示去別的主機創建

      4.5.驗證hash分配是否均已

      5.配置cluster集群三主三從高可用

      5.1.三主三從架構圖

      5.2.將每一個節點都配置rdb持久化

      5.3.配置三主三從

      5.3.模擬故障轉移

      5.1.模擬壞掉redis-1的主庫并驗證就能是否可用

      5.3.2.redis-1節點的主庫恢復目前的架構圖

      5.3.3.將恢的主庫重新變為主庫

      6.redis cluster需要注意的幾點

      1.redis cluster原理概念

      1.1.cluster架構概念

      redis cluster是redis的分布式解決方案,在3.0版本正式推出,如果公司的redis是2.x版本,就需要升級了

      redis哨兵集群不足之處:

      資源利用率低,只有一臺主庫對外提供服務

      假如哨兵模式有3個節點,只有其中一個節點對外提供服務,其他兩個節點都處于備份狀態,這樣就會造成資源的浪費,redis將數據都寫在內存中,只有主節點工作,那么內存只有主節點上的那點內存,從節點上的內存也就造成了浪費

      主庫壓力比較大,性能有瓶頸

      只有主庫在工作,所有的寫都是主節點完成,這樣就會造成主節點的壓力比較大,從節點幾乎沒有壓力

      哨兵的不足之處就在于集群不是分布式存儲,只是單節點去處理,如果集群時分布式存儲,那么單點和壓力的問題也就解決了

      redis cluster適用場景:

      當redis遇到單機、內存、并發、流量等瓶頸時,可以采用cluster架構方案達到負載均衡的目的

      redis cluster之前的分布式方案:

      客戶端分區方案,優點分區邏輯可控,缺點是需要自己處理數據路由,高可用和故障轉移等。

      代理方案,優點是簡化客戶端分布式邏輯和升級維護便利,缺點加重架構部署和性能消耗。

      redis cluster的數據分布方式: 所有分布式數據庫首先要解決把整個數據庫集安裝分區規則映射到多個節點的問題,也就是把數據集劃分到多個節點上,redis cluster采用哈希分片規則,這樣就能保證每個節點存儲的數據量大致相同

      redis cluster原理:

      redis cluster會將數據自動進行分片,然后通過hash算法均勻的存放在集群中的每個節點,cluster架構在每臺機器上都有一個或多個主節點和從節點,當一個節點上的master掛掉,會自動將這臺機器上的某個slave切換為master

      cluster架構的redis集群,可以橫向擴容,由于cluster是分布式架構,單個機器的內存是32G,那么10個節點就是320G內存的存儲

      cluster架構數據分片是由hash來進行分配的,均勻的分散在各個節點

      cluster架構槽位概念:每個cluster集群都有16384個槽位,這個槽位就是用來存儲hash分配的分片,每一個槽位都需要分配到位,有一個槽位沒有分配,整個集群都將無法使用,每一個槽位都有一個序號,它們不是順序存放的,而是在節點一上比如有10-20序列槽位,節點二上有60-70序列的槽位,這兩個節點都是10個槽位,序號不一定要順序,但是數量一定要差不多,允許2%的誤差

      cluster集群架構圖

      通過hash分配數據分片到不同的redis主機

      在應用端配置redis cluster地址時需要將所有節點的ip和端口都添加上

      使用cluster集群創建的key,在哪個節點上創建的只能是自身節點可以查到數據,其他節點看不到

      1.2.redis cluster不合理的架構圖

      不太合理的架構圖

      cluster集群每個機器上都有多個master和slave,如果master節點的數據備份都在自己主機的slave上,那么當服務器1壞掉后,這個機器上的數據就丟失了,數據丟失整個應用就崩潰了

      合理的架構圖

      每個節點slave都存放在別的主機,即使當前主機掛掉,另一臺直接還原數據即可

      1.3.部署一個cluster三主三從集群具體步驟

      1.在三臺主機上部署redis,分別啟動兩個不同端口的redis,一個主庫一個從庫

      2.配置cluster集群自動發現,使得集群中各個主機都知道其他主機上的redis節點

      3.配置集群hash分配槽位,有了槽位才可以存儲數據

      4.使用cluster replicate使多出來的三個主庫變成從庫,這樣就實現了三主三從

      1.4.環境準備

      2.部署redis cluster節點

      搭建一個三主三從的redis cluster集群

      配置文件中的bind也可以寫成如下樣子,自動識別bind地址

      bind $(ifconfig | awk 'NR==2{print }')

      配置文件含義

      port 6380 //redis端口 daemonize yes //后臺啟動 logfile /data/redis_cluster/redis_6380/logs/redis_6380.log //日志路徑 pidfile /data/redis_cluster/redis_6380/pid/redis_6380.log //pid存放路徑 dbfilename "redis_6380.rdb" //數據文件名稱 dir /data/redis_cluster/redis_6380/data //數據文件存放目錄 cluster-enabled yes //開啟集群模式 cluster-config-file node_6380.conf //集群數據文件路徑,保存集群信息的文件 cluster-node-timeout 15000 //集群故障轉移時間,多長時間無響應就切換

      環境準備

      2.1.redis-1配置

      配置文件自動識別bind地址

      1.創建節點配置文件路徑 [root@redis-1 ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}/{conf,data,logs,pid} 2.準備兩個配置文件一個6380,一個6381 [root@redis-1 ~]# cat > /data/redis_cluster/redis_6380/conf/redis_6380.conf < /data/redis_cluster/redis_6381/conf/redis_6381.conf <

      2.2.redis-2配置

      配置文件自動識別bind地址

      [root@redis-2 ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}/{conf,data,logs,pid} [root@redis-2 ~]# cat > /data/redis_cluster/redis_6380/conf/redis_6380.conf < /data/redis_cluster/redis_6381/conf/redis_6381.conf <

      2.3.redis-3配置

      手動填寫bind ip地址

      [root@redis-3 ~]# mkdir -p /data/redis_cluster/redis_{6380,6381}/{conf,data,logs,pid} [root@redis-3 ~]# cat > /data/redis_cluster/redis_6380/conf/redis_6380.conf < /data/redis_cluster/redis_6381/conf/redis_6381.conf <

      2.4.查看redis cluster進程

      每個節點啟動了cluster后,進程名上會增加cluster

      每個redis節點會開放兩個端口,服務端口6380,集群通信端口16380(在服務端口基礎上增加10000)

      4.查看進程 [root@redis-1 ~]# ps aux | grep redis avahi 6935 0.0 0.1 62272 2296 ? Ss 1月29 0:02 avahi-daemon: running [redis-1.local] root 31846 0.3 0.5 141068 10800 ? Ssl 1月30 10:13 redis-server 192.168.81.210:6379 root 31859 0.3 0.4 136972 7744 ? Ssl 1月30 11:43 redis-sentinel 192.168.81.210:26379 [sentinel] root 78126 0.2 0.4 136972 7584 ? Ssl 14:40 0:00 redis-server 192.168.81.210:6380 [cluster] root 78130 0.4 0.4 136972 7588 ? Ssl 14:40 0:00 redis-server 192.168.81.210:6381 [cluster] root 78136 0.0 0.0 112728 988 pts/2 R+ 14:40 0:00 grep --color=auto redis [root@redis-1 ~]# netstat -lnpt | grep redis tcp 0 0 192.168.81.210:26379 0.0.0.0:* LISTEN 31859/redis-sentine tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 31846/redis-server tcp 0 0 192.168.81.210:6379 0.0.0.0:* LISTEN 31846/redis-server tcp 0 0 192.168.81.210:6380 0.0.0.0:* LISTEN 78126/redis-server tcp 0 0 192.168.81.210:6381 0.0.0.0:* LISTEN 78130/redis-server tcp 0 0 192.168.81.210:16380 0.0.0.0:* LISTEN 78126/redis-server tcp 0 0 192.168.81.210:16381 0.0.0.0:* LISTEN 78130/redis-server

      2.5.查看集群信息文件內容

      集群模式的redis除了原有的配置文件之外又增加了一個集群配置文件,當集群內節點信息發生變化時,如添加節點,節點下線,故障轉移等,節點都會自動保存集群狀態到配置文件,redis自動維護集群配置文件,不需要手動修改防止節點重啟時產生錯亂

      在集群啟動后會生成一個數據文件,這個數據文件其實保存的就是集群的信息,在沒有配置集群互相發現時,單個節點只保存自己的集群信息,文件中有節點id信息,每個節點的id都是唯一的

      當配置了互相發現了配置文件中就會增加所有節點的信息

      [root@redis-1 ~]# cat /data/redis_cluster/redis_6380/data/node_6380.conf b7748aedb5e51921db67c54e0c6263ed28043948 :0 myself,master - 0 0 0 connected vars currentEpoch 0 lastVoteEpoch 0 [root@redis-1 ~]# cat /data/redis_cluster/redis_6381/data/node_6381.conf 1ec79d498ecf9f272373740e402398e4c69cacb2 :0 myself,master - 0 0 0 connected vars currentEpoch 0 lastVoteEpoch 0

      也可以登錄redis進行查看

      [root@redis-1 ~]# for i in {1..3} do for j in {0..1} do echo "192.168.81.2${i}0---638${j}" redis-cli -h 192.168.81.2${i}0 -p 638${j} cluster nodes done done 192.168.81.210---6380 b7748aedb5e51921db67c54e0c6263ed28043948 :6380 myself,master - 0 0 0 connected 192.168.81.210---6381 1ec79d498ecf9f272373740e402398e4c69cacb2 :6381 myself,master - 0 0 0 connected 192.168.81.220---6380 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 :6380 myself,master - 0 0 0 connected 192.168.81.220---6381 bedd9482b08a06b0678fba01bb1c24165e56636c :6381 myself,master - 0 0 0 connected 192.168.81.230---6380 759ad5659d449dc97066480e1b7efbc10b34461d :6380 myself,master - 0 0 0 connected 192.168.81.230---6381 a2c95db5d6f9f288e6768c8d00e90fb7631f3021 :6381 myself,master - 0 0 0 connected

      3.配置cluster集群互相發現

      3.1.互相發現概念

      cluster集群互相發現只需要在一個節點上配置,所有節點都會接收到配置信息并自動加入到配置文件中

      例如在redis-1的6380節點上增加了本機的6381端口和redis-2的6380端口,這時在redis-2上查看6380的配置里面就能看到6380節點和redis-1的6380以及6381節點信息,這時redis-3的兩個節點還有本機的6381則還是一條,因為他們沒有加入

      在哪個節點添加的發現另一個節點的信息,那么當前這個節點就已經加入到了集群中

      其實只要在集群的任意一個節點配置,集群的所有節點都會自動添加配置

      下面演示一個在reids-1上添加幾個節點,在redis-2上看是否自動配置

      1.在redis-1的6380節點上增加本機的6381和redis-2的6380端口 [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 192.168.81.210:6380> CLUSTER MEET 192.168.81.210 6381 OK 192.168.81.210:6380> CLUSTER MEET 192.168.81.220 6380 OK 2.查看redis-2的6380集群配置文件 [root@redis-2 ~]# cat /data/redis_cluster/redis_6380/data/node_6380.conf 1ec79d498ecf9f272373740e402398e4c69cacb2 192.168.81.210:6381 master - 0 1612169525469 1 connected b7748aedb5e51921db67c54e0c6263ed28043948 192.168.81.210:6380 master - 0 1612169525369 0 connected 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 192.168.81.220:6380 myself,master - 0 0 2 connected vars currentEpoch 2 lastVoteEpoch 0 很明顯的看出已經將redis-1的6380和6381以及redis-2本機的6380端口都加到了集群配置文件中 3.查看redis-2的6381節點集群配置文件 [root@redis-2 ~]# cat /data/redis_cluster/redis_6381/data/node_6381.conf bedd9482b08a06b0678fba01bb1c24165e56636c :0 myself,master - 0 0 0 connected vars currentEpoch 0 lastVoteEpoch 0

      3.2.將集群的所有節點進行互相發現

      在集群的任意一個節點配置就可以

      1.配置互相發現 [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 192.168.81.210:6380> CLUSTER MEET 192.168.81.210 6381 OK 192.168.81.210:6380> CLUSTER MEET 192.168.81.220 6380 OK 192.168.81.210:6380> CLUSTER MEET 192.168.81.220 6381 OK 192.168.81.210:6380> CLUSTER MEET 192.168.81.230 6380 OK 192.168.81.210:6380> CLUSTER MEET 192.168.81.230 6381 OK 2.查看配置文件是否增加,所有節點的配置文件都會生成 [root@redis-1 ~]# cat /data/redis_cluster/redis_6381/data/node_6381.conf 759ad5659d449dc97066480e1b7efbc10b34461d 192.168.81.230:6380 master - 0 1612169812886 4 connected 1ec79d498ecf9f272373740e402398e4c69cacb2 192.168.81.210:6381 myself,master - 0 0 1 connected 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 192.168.81.220:6380 master - 0 1612169814797 2 connected bedd9482b08a06b0678fba01bb1c24165e56636c 192.168.81.220:6381 master - 0 1612169815806 0 connected a2c95db5d6f9f288e6768c8d00e90fb7631f3021 192.168.81.230:6381 master - 0 1612169815708 5 connected b7748aedb5e51921db67c54e0c6263ed28043948 192.168.81.210:6380 master - 0 1612169816814 3 connected vars currentEpoch 5 lastVoteEpoch 0

      4.cluster集群分配操作

      4.1.redis cluster通訊流程

      集群內消息傳遞是同步的

      Redis Cluster集群原理+三主三從交叉復制實戰+故障切換(十)(redis的五種數據類型)

      在分布式存儲中需要提供維護節點元數據信息的機制,所謂元數據是指:節點負責哪些數據,是否出現故障燈狀態信息,redis集群采用gossip協議,gossip協議工作原理就是節點彼此不斷交換信息,一段時間后所有的節點偶會指定集群完整信息,這種方式類似于流言傳播,因此只需要在一臺節點配置集群信息所有節點都能收到信息

      通信過程:

      1.集群中的每一個節點都會單獨開辟一個tcp通道用于節點之間彼此通信,通信端口在基礎端口上增加10000

      2.每個節點在固定周期內通過特定規則選擇結構節點發送ping消息

      3.接收到ping消息的節點用pong作為消息響應,集群中每個節點通過一定規則挑選要通信的節點,每個節點可能知道全部節點的信息,也可能知道部分節點信息,只要這些節點彼此可以正常通信,最終他們就會達成一致的狀態,當節點出現故障,新節點加入,主從角色變化等,彼此之間不斷發生ping/pong消息,最終達成同步的模板

      通訊消息類型:gossip,信息交換,常見的消息分為ping、pong、meet、fail

      通訊示意圖

      沒有分配槽位時集群的狀態,所有節點執行cluster info,cluster_state都是fail,fail狀態表示集群不可用,沒有分配槽位,cluster_slots都會顯示0

      4.2.手動配置集群槽位

      每個cluster集群都有16384個槽位,我們有三臺機器,想要手動分配平均就需要使用16384除3

      redis-1 0-5461

      redis-2 5642-10922

      redis-3 10923-16383

      分配槽位語法格式(交互式):CLUSTER ADDSLOTS 0 5461

      分配槽位語法:redis-cli -h 192.168.81.210 -p 6380 cluster addslots {0…5461}

      刪除槽位分配語法格式: redis-cli -h 192.168.81.210 -p 6380 cluster delslots {5463…10921}

      1.配置手動分配槽位 [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster addslots {0..5461} OK [root@redis-1 ~]# redis-cli -h 192.168.81.220 -p 6380 cluster addslots {5462..10922} OK [root@redis-1 ~]# redis-cli -h 192.168.81.230 -p 6380 cluster addslots {10923..16383} OK 2.查看集群狀態,到目前為止集群已經是可用的了 [root@redis-1 ~]# redis-cli -h 192.168.81.220 -p 6380 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:2 cluster_stats_messages_sent:170143 cluster_stats_messages_received:170142 3.查看nodes文件內容 [root@redis-1 ~]# redis-cli -h 192.168.81.220 -p 6380 cluster nodes a2c95db5d6f9f288e6768c8d00e90fb7631f3021 192.168.81.230:6381 master - 0 1612251539412 5 connected bedd9482b08a06b0678fba01bb1c24165e56636c 192.168.81.220:6381 master - 0 1612251538402 0 connected 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 192.168.81.220:6380 myself,master - 0 0 2 connected 5462-10922 b7748aedb5e51921db67c54e0c6263ed28043948 192.168.81.210:6380 master - 0 1612251540418 3 connected 0-5461 1ec79d498ecf9f272373740e402398e4c69cacb2 192.168.81.210:6381 master - 0 1612251537394 1 connected 759ad5659d449dc97066480e1b7efbc10b34461d 192.168.81.230:6380 master - 0 1612251536386 4 connected 10923-16383

      4.3.創建key驗證集群是否可用

      不是所有的key都能插入,有的key插入的時候就提示說你應該去192.168.81.230上插入,這時手動到對應的主機上執行就可以插入,這是由于cluster集群槽位都是分布在不同節點的,每次新建一個key,都會通過hash算法均勻的在不同節點去創建

      不同節點創建的key只由自己節點可以看到自己創建的數據

      [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 192.168.81.210:6380> set k1 v1 (error) MOVED 12706 192.168.81.230:6380 192.168.81.210:6380> set k2 v2 OK 192.168.81.210:6380> set k3 v3 OK 192.168.81.210:6380> set k4 v4 (error) MOVED 8455 192.168.81.220:6380 192.168.81.210:6380> set k5 v5 (error) MOVED 12582 192.168.81.230:6380 192.168.81.210:6380> set k6 v6 OK [root@redis-1 ~]# redis-cli -h 192.168.81.230 -p 6380 192.168.81.230:6380> set k1 v1 OK 192.168.81.230:6380> set k5 v5 OK [root@redis-1 ~]# redis-cli -h 192.168.81.220 -p 6380 192.168.81.220:6380> set k4 v4 OK

      4.4.ASK路由解決key創建提示去別的主機創建

      可以通過ASK路由解決創建key時提示去別的主機進行創建

      ASK路由創建key時,如果可以在本機直接創建就會執行創建key的命令,如果不能再本機執行,他會根據提示的主機去對應主機上創建key

      ASK路徑的特性:每次通過hash在指定主機上創建了key后就會停留在這個主機上

      只需要執行redis-cli時加上-c參數即可

      [root@redis-1 ~]# redis-cli -c -h 192.168.81.210 -p 6380 192.168.81.210:6380> set k8 v8 -> Redirected to slot [8331] located at 192.168.81.220:6380 OK 192.168.81.220:6380> set k9 v9 -> Redirected to slot [12458] located at 192.168.81.230:6380 OK 192.168.81.230:6380> set k10 v10 OK 192.168.81.230:6380> set k11 v11 OK 192.168.81.230:6380> set k12 v12 -> Redirected to slot [2863] located at 192.168.81.210:6380 OK 192.168.81.210:6380> set k13 v13 -> Redirected to slot [6926] located at 192.168.81.220:6380 OK 192.168.81.220:6380> set k14 v14 -> Redirected to slot [11241] located at 192.168.81.230:6380 OK 很清楚的展示了在哪臺主機上創建

      4.5.驗證hash分配是否均已

      cluster架構是分布式的,創建的key會通過hash將數據均已的分布在每臺主機的槽位上

      1.插入一千條數據,查看三個節點是否分配均已 插入的時候使用-c,自動在某個節點上插入數據 [root@redis-1 ~]# for i in {1..1000} do redis-cli -c -h 192.168.81.210 -p 6380 set key_${i} value_${i} done 2.查看每個節點的數據量,可以看到非常均勻,誤差只有一點點 [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 192.168.81.210:6380> DBSIZE (integer) 339 [root@redis-1 ~]# redis-cli -h 192.168.81.220 -p 6380 192.168.81.220:6380> DBSIZE (integer) 339 [root@redis-1 ~]# redis-cli -h 192.168.81.230 -p 6380 192.168.81.230:6380> DBSIZE (integer) 336 192.168.81.230:6380> exit

      5.配置cluster集群三主三從高可用

      實現步驟:

      1.使用cluster replicate將主機的6381redis節點交叉成為別的主機6380節點的從庫

      2.查看集群狀態即可

      5.1.三主三從架構圖

      三主三從是redis cluster最常用的架構,每個從節點復制的都不是本機主庫的數據,而是其他節點主庫的數據,這樣即使某一臺主機壞掉了,從節點備份還是在其他機器上,這樣就做到了高可用,三主三從架構允許最多壞一臺主機

      三主三從我們采用交叉復制架構類型,這樣可以做到最多壞一臺主機集群還是正常可以用的,如果每臺主機的6381節點都是6380節點的備份,那么這臺機器壞了,集群就不可用了,因此想要做到高可用,就采用交叉復制

      交叉復制的架構,當主節點掛掉了,主節點備份的從節點就會自動成為主節點,當主節點上線后

      每個節點的6380端口都是主庫,6381端口都是從庫

      從節點對應的主節點關系:

      redis-1的6381從節點對應的主節點是redis-2的6380主節點

      redis-2的6381從節點對應的主節點是redis-3的6380主節點

      redis-3的6381從節點對應的主節點是redis-1的6380主節點

      5.2.將每一個節點都配置rdb持久化

      在所有節點端口的配置文件中加上rdb持久化配置即可

      vim /data/redis_cluster/redis_6380/conf/redis_6380.conf bind 192.168.81.210 port 6380 daemonize yes logfile /data/redis_cluster/redis_6380/logs/redis_6380.log pidfile /data/redis_cluster/redis_6380/pid/redis_6380.log dbfilename "redis_6380.rdb" dir /data/redis_cluster/redis_6380/data cluster-enabled yes cluster-config-file node_6380.conf cluster-node-timeout 15000 #持久化配置 save 60 10000 save 300 10 save 900 1 重啟redis redis-cli -h 192.168.81.210 -p 6380 shutdown redis-server /data/redis_cluster/redis_6380/conf/redis_6380.conf

      5.3.配置三主三從

      配置三主三從規范操作步驟

      1.將集群信息粘到txt中,只保留下6380端口信息

      2.配置命令在txt中準備好在復制到命令行

      主節點我們已經有了,目前6個節點全是主節點,我們需要把所有主機的6381的主節點配置成從節點

      從節點對應的主節點關系:

      redis-1的6381從節點對應的主節點是redis-2的6380主節點

      redis-2的6381從節點對應的主節點是redis-3的6380主節點

      redis-3的6381從節點對應的主節點是redis-1的6380主節點

      CLUSTER REPLICATE 是配置當前節點成為某個主節點的從節點,replicate命令其實就相當于執行了slaveof,同步了某一個主庫,并且在日志中查看到的就是主從同步的過程

      1.配置從節點連接主節點,交叉式復制 [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6381 CLUSTER REPLICATE 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 OK [root@redis-1 ~]# redis-cli -h 192.168.81.220 -p 6381 CLUSTER REPLICATE 759ad5659d449dc97066480e1b7efbc10b34461d OK [root@redis-1 ~]# redis-cli -h 192.168.81.230 -p 6381 CLUSTER REPLICATE b7748aedb5e51921db67c54e0c6263ed28043948 OK 2.查看集群節點信息,發現已經是三主三從了 [root@redis-1 ~]# redis-cli -h 192.168.81.230 -p 6381 cluster nodes a2c95db5d6f9f288e6768c8d00e90fb7631f3021 192.168.81.230:6381 myself,slave b7748aedb5e51921db67c54e0c6263ed28043948 0 0 5 connected bedd9482b08a06b0678fba01bb1c24165e56636c 192.168.81.220:6381 slave 759ad5659d449dc97066480e1b7efbc10b34461d 0 1612323918342 4 connected b7748aedb5e51921db67c54e0c6263ed28043948 192.168.81.210:6380 master - 0 1612323919350 3 connected 0-5461 1ec79d498ecf9f272373740e402398e4c69cacb2 192.168.81.210:6381 slave 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 0 1612323917331 2 connected 759ad5659d449dc97066480e1b7efbc10b34461d 192.168.81.230:6380 master - 0 1612323916826 4 connected 10923-16383 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 192.168.81.220:6380 master - 0 1612323920357 2 connected 5462-10922

      配置完主從,可以看到集群中已經有slave節點了,并且也是交叉復制的

      打開主庫的日志可以看到哪個從庫同步了主庫的日志,打開從庫的日志可以看到同步了哪個主庫的日志

      5.3.模擬故障轉移

      三主三從架構允許最多壞一臺主機,模擬將redis-1機器的主庫6380掛掉,查看集群間的故障遷移

      思路:

      1.將redis-1的6380主庫關掉,查看集群狀態信息是否將slave自動切換為master

      2.當master上線后會變成一個節點的從庫

      3.將master通過cluster failover重新成為主庫

      1.掛掉redis-1的主庫 [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 shutdown 2.查看日志 先是由于主庫掛了狀態變成fail,當從庫變成主庫后,狀態再次變為ok [root@redis-1 ~]# tail -f /data/redis_cluster/redis_6381/logs/redis_6381.log 124058:S 03 Feb 13:16:00.233 # Cluster state changed: fail 124058:S 03 Feb 13:17:01.857 # Cluster state changed: ok 3.查看集群信息 [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6381 cluster nodes 4.查看集群狀態 [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6381 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:2 cluster_stats_messages_sent:18202 cluster_stats_messages_received:17036 5.驗證集群是否可用 [root@redis-1 ~]# redis-cli -c -h 192.168.81.210 -p 6381 set k1111 v1111 OK

      當主庫掛掉后,查看集群信息時會看到提示主庫已經是fail狀態,此時可用看到192.168.81.230機器的6381端口成為了master,192.168.81.230的6381端口是redis-1的從庫,從庫變為主庫后,集群狀態再次變為ok

      當主庫重新加入集群后,架構圖就變成了如下樣子,主庫的6380就成為了192.168.81.230的從庫,而192.168.81.230的從庫變成了192.168.81.210的主庫

      1.啟動redis-1的6380主庫 [root@redis-1 ~]# redis-server /data/redis_cluster/redis_6380/conf/redis_6380.conf 2.查看集群信息 [root@redis-1 ~]# redis-cli -c -h 192.168.81.210 -p 6380 cluster nodes 1ec79d498ecf9f272373740e402398e4c69cacb2 192.168.81.210:6381 slave 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 0 1612330250901 2 connected b7748aedb5e51921db67c54e0c6263ed28043948 192.168.81.210:6380 myself,slave a2c95db5d6f9f288e6768c8d00e90fb7631f3021 0 0 3 connected 759ad5659d449dc97066480e1b7efbc10b34461d 192.168.81.230:6380 master - 0 1612330255958 4 connected 10923-16383 bedd9482b08a06b0678fba01bb1c24165e56636c 192.168.81.220:6381 slave 759ad5659d449dc97066480e1b7efbc10b34461d 0 1612330252920 4 connected a2c95db5d6f9f288e6768c8d00e90fb7631f3021 192.168.81.230:6381 master - 0 1612330254941 7 connected 0-5461 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 192.168.81.220:6380 master - 0 1612330256960 2 connected 5462-10922

      目前主庫已經重新上線了,且現在是192.168.81.230的從庫,而原來192.168.81.230的從庫變成了現在192.168.81.210的主庫,我們需要把關系切換回來,不能讓一臺機器上同時存在兩臺主庫,每次故障處理后一定要把架構修改會原來的樣子

      從庫切換成主庫也特別簡單,只需要執行一個cluster falover即可變為主庫

      cluster falover確實也類似于關系互換,簡單理解就是原來的從變成了主,現在的主變成了從,這樣一來就可以把故障恢復的主機重新變為主庫

      cluster falover原理:falover原理也就是先執行了slave no one,然后在對應的由主庫變為從庫的機器上執行了slave of

      1.將故障上線的主庫重新成為主庫 [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 192.168.81.210:6380> CLUSTER FAILOVER OK 2.查看集群信息,192.168.81.210的發現6380重新成為了master,192.168.81.230的從庫變成了slave [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6381 cluster nodes 759ad5659d449dc97066480e1b7efbc10b34461d 192.168.81.230:6380 master - 0 1612331847795 12 connected 10923-16383 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 192.168.81.220:6380 master - 0 1612331849307 11 connected 5462-10922 b7748aedb5e51921db67c54e0c6263ed28043948 192.168.81.210:6380 master - 0 1612331848299 10 connected 0-5461 bedd9482b08a06b0678fba01bb1c24165e56636c 192.168.81.220:6381 slave 759ad5659d449dc97066480e1b7efbc10b34461d 0 1612331850317 12 connected a2c95db5d6f9f288e6768c8d00e90fb7631f3021 192.168.81.230:6381 slave b7748aedb5e51921db67c54e0c6263ed28043948 0 1612331851324 10 connected 1ec79d498ecf9f272373740e402398e4c69cacb2 192.168.81.210:6381 myself,slave 87ea6206f3db1dbaa49522bed15aed6f3bf16e22 0 0 8 connected

      查看集群信息,192.168.81.210的發現6380重新成為了master,192.168.81.230的從庫變成了slave

      到此cluster集群故障轉移成功,集群狀態一切正常

      [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 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:16 cluster_my_epoch:16 cluster_stats_messages_sent:18614 cluster_stats_messages_received:3497

      6.redis cluster需要注意的幾點

      生產環境數據量可能非常大,當主庫故障重新上線時,執行CLUSTER FAILOVER會很慢,因為這個就相當于是主從復制切換了,從庫(剛上線的原來主庫)關閉主從復制,主庫(主庫壞掉前的從庫)同步從庫(剛上線的原來主庫)數據,然后從庫(剛上線的原來主庫)重新變為主庫,這個時間一定要等,切記,千萬不要因為慢在主庫上(主庫壞掉前的從庫)同步手動進行了CLUSTER REPLICATE,這樣確實會非常快的將主庫(主庫壞掉前的從庫)重新變為從庫,但也意味著這個節點數據全部丟失,因為clusert replicate相當于slaveof,slaveof會把自己的庫清掉,這時候從庫(剛上線的原來主庫)在執行這CLUSTER FAILOVER同步著主庫(主庫壞掉前的從庫)的數據,主庫那邊執行了replicate去同步從庫(剛上線的原來主庫),從而導致從庫(剛上線的原來主庫)還沒有同步完主庫(主庫壞掉前的從庫的數據),主庫(主庫壞掉前的從庫)數據就丟失,整個集群還是可以用的,只是這個主庫節點和從節點數據全部丟失,其他兩個主庫從庫還能使用。

      切記,當從庫執行CLUSTER FAILOVER變為主庫時,一定不要在主庫上執行CLUSTER REPLICATE變為從庫,雖然CLUSTER REPLICATE變為從庫很快,但是會清空自己的數據去同步主庫,這時主庫還沒有數據,因此就會導致數據全部丟失

      CLUSTER FAILOVER:首先執行slave on one變為一個單獨的節點,然后在要變成從庫的節點上執行slaveof,只要從庫執行完slave of,執行CLUSTER FAILOVER的節點就變成了主庫

      CLUSTER REPLICATE:只是執行了slaveof使自身成為從節點

      當redis cluster主從正在同步時,不要執行cluster replicate,當主從復制完在執行,如何看主從是否復制完就要看節點的rdb文件是否是.tmp結尾的,如果是tmp結尾就說明他們正在同步數據,此時不要對集群做切換操作

      小總結:

      1.3.0版本以后推出集群功能

      2.cluster集群有16384個槽位,誤差在2%之間

      3.槽位與序號順序無關,重點是槽的數量

      4.通過發現集群,與集群之間實現消息傳遞

      5.配置文件無需手動修改,都是自動生成的

      6.分配操作,必須將所有的槽位分配完畢

      7.理清復制關系,畫圖,按照圖形執行復制命令

      8.當集群狀態為ok時,集群才可以正常使用

      9.反復測試,批量插入key,驗證分配是否均勻

      10.測試高可用,關閉任意主節點,集群是否自動轉移

      11.當主節點修復后,執行主從關系切換

      12.做實驗盡量貼合生成環境,盡量使用和生成環境一樣數量的數據

      13.評估和記錄同步數據、故障轉移完成的時間

      14.向領導匯報時要有圖、文檔、實驗環境,隨時都可以演示

      當應用需要連接redis cluster集群時要將所有節點都寫在配置文件中

      Redis 分布式

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:wps怎么刪除圖標?
      下一篇:甘特圖軟件是一種獨特而強大的工具,利用直觀的圖表和時間軸展示
      相關文章
      亚洲国产综合专区电影在线| 亚洲毛片在线观看| 亚洲一级毛片免观看| 久久久久亚洲精品美女| 亚洲色大成网站WWW久久九九| 日韩精品亚洲专区在线观看| 蜜芽亚洲av无码一区二区三区| 亚洲爆乳大丰满无码专区| 亚洲AⅤ男人的天堂在线观看| 亚洲色少妇熟女11p| 亚洲狠狠色丁香婷婷综合| 亚洲乱码日产精品一二三| 亚洲欧美成aⅴ人在线观看| 亚洲乱妇熟女爽到高潮的片 | 亚洲码和欧洲码一码二码三码| 亚洲第一区二区快射影院| 91在线亚洲综合在线| 亚洲欧美日韩综合久久久久| 色五月五月丁香亚洲综合网| 在线观看亚洲精品专区| 亚洲精品和日本精品| 亚洲人JIZZ日本人| 久久精品国产亚洲av麻| 亚洲精品乱码久久久久久下载| 亚洲一区二区三区久久久久| 亚洲精品免费网站| 亚洲成AV人片在WWW| 亚洲人成国产精品无码| 精品亚洲一区二区三区在线观看 | 亚洲av一本岛在线播放| 亚洲欧好州第一的日产suv| 国产午夜亚洲精品不卡电影| 亚洲性在线看高清h片| 亚洲国产精品va在线播放| 亚洲一区二区在线免费观看| 亚洲国产成人精品无码区在线秒播 | 亚洲国产成人久久综合野外| 久久久久一级精品亚洲国产成人综合AV区| 亚洲自偷自偷图片| 亚洲国产精品一区| 国产成人精品亚洲2020|