<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Redis 集群操作實戰(zhàn)

          共 10829字,需瀏覽 22分鐘

           ·

          2021-03-21 17:08

          0x01:Redis 集群簡介

                 Redis 是一個開源的 key-value 存儲系統(tǒng),由于出眾的性能,大部分互聯(lián)網(wǎng)企業(yè)都用來做服務器端緩存。Redis 在 3.0 版本前只支持單實例模式,雖然支持主從模式、哨兵模式部署來解決單點故障,但是互聯(lián)網(wǎng)企業(yè)動輒大幾百G的數(shù)據(jù),可這些模式?jīng)]法滿足業(yè)務的需求,所以 Redis 在 3.0 版本以后就推出了集群模式。

                Redis 集群采用了 P2P 的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 個哈希槽(slot),每個 Redis 實例負責其中一部分 slot 。集群中的所有信息(節(jié)點、端口、slot等),都通過節(jié)點之間定期的數(shù)據(jù)交換而更新。

          Redis 客戶端可以在任意一個 Redis 實例發(fā)出請求,如果所需數(shù)據(jù)不在該實例中,通過重定向命令引導客戶端訪問所需的實例。

          集群要點:

          • Redis 是一個開源的 key-value 存儲系統(tǒng),受到了廣大互聯(lián)網(wǎng)公司的青睞。Redis 3.0 版本之前只支持單例模式,在 3.0 版本及以后才支持集群;

          • Redis 集群采用 P2P 模式,是完全去中心化的,不存在中心節(jié)點或者代理節(jié)點;

          • Redis 集群是沒有統(tǒng)一的入口的,客戶端(client)連接集群的時候連接集群中的任意節(jié)點(node)即可,集群內部的節(jié)點是相互通信的(PING-PONG 機制),每個節(jié)點都是一個 Redis 實例;

          • 為了實現(xiàn)集群的高可用,即判斷節(jié)點是否健康(能否正常使用),redis-cluster 有這么一個投票容錯機制:如果集群中超過半數(shù)的節(jié)點投票認為某個節(jié)點掛了,那么這個節(jié)點就掛了(fail)。這是判斷節(jié)點是否掛了的算法;

          • 如何判斷集群是否掛了呢?

                如果集群中任意一個節(jié)點掛了,而且該節(jié)點沒有從節(jié)點(備份節(jié)點),那么這個集群就掛了。這是判斷集群是否掛了的算法;

          • 那么為什么任意一個節(jié)點掛了(沒有從節(jié)點)這個集群就掛了呢?

               因為集群內置了 16384 個 slot(哈希槽),并且把所有的物理節(jié)點映射到了這16384 [ 0-16383 ]個 slot 上,或者說把這些 slot 平均的分配給了各個節(jié)點。當需要在 Redi s集群存放一個數(shù)據(jù)(key-value)時,Redis 會先對這個 key 進行 crc16 算法,然后得到一個結果。再把這個結果對 16384 進行求余,這個余數(shù)會對應[ 0-16383 ]其中一個槽,進而決定 key-value 存儲到哪個節(jié)點中。所以一旦某個節(jié)點掛了,該節(jié)點對應的 slot 就無法使用,那么就會導致集群無法正常工作。


          0x02:環(huán)境說明

          • Redis 集群至少需要 3 個節(jié)點,因為投票容錯機制要求超過半數(shù)節(jié)點認為某個節(jié)點掛了該節(jié)點才是掛了,所以 2 個節(jié)點無法構成集群。

          • 要保證集群的高可用,需要每個節(jié)點都有從節(jié)點,也就是備份節(jié)點,所以 Redis 集群至少需要 6 臺服務器。因為沒有那么多服務器,也無法在一臺 widows 啟動不了那么多虛擬機,所在這里搭建的是偽分布式集群,即一臺服務器虛擬運行 6個 Redis 實例,修改端口號為(7001-7006),當然實際生產環(huán)境的Redis集群搭建和這里也是大同小異的。

          • 安裝 Ruby 環(huán)境


          0x03:集群搭建

          在搭建集群前,先了解單機的安裝:Redis系列:Linux下部署Redis 6.x 版本

          • 在 /usr/local 目錄下新建 redis-cluster 目錄,用于存放集群節(jié)點的所有Redis 實例

          mkdir /usr/local/redis-cluster
          • 單機版安裝的好的redis拷貝到 /usr/local/redis-cluster 目錄

          cp -r /usr/local/redis /usr/local/redis-cluster/

          目錄結構如下

          • 基于該 Redis 復制出 6 個節(jié)點

          • 修改配置文件,主要配置點如下

          bind 127.0.0.1 #綁定當前機器 IP
          port 6379 #每個節(jié)點的端口號
          daemonize no #是否后臺啟動
          dir ./ #數(shù)據(jù)文件存放位置
          dbfilename dump.rdb
          pidfile /var/run/redis_6379.pid # pid 6379和port要對應
          cluster-enabled yes #啟動集群模式
          cluster-config-file nodes-6379.conf # 6379和port要對應
          cluster-node-timeout 15000 #集群節(jié)點超時時間
          appendonly yes #是否啟動 aof 模式

          比如 7001 節(jié)點配置,主要是標識的地方有所不一致(其他節(jié)點請按照端口修改即可

          集群配置參數(shù)主要有:

          cluster-enabled <yes/no>
          cluster-config-file <filename>
          cluster-node-timeout <milliseconds>
          cluster-slave-validity-factor <factor>
          cluster-migration-barrier <count>
          cluster-require-full-coverage <yes/no>

          詳細解釋如下:

          1. cluster-enabled <yes/no>:  該項如果設置成yes,該實例支持redis集群;否則該實例會像往常一樣以獨立模式啟動。

          2. cluster-config-file <filename>: 必須注意到盡管該項是可選的,這并不是一個用戶可以編輯的配置文件,這是redis集群節(jié)點自動生成的配置文件,每次一旦配置有修改它都通過該配置文件來持久化配置(基本上都是狀態(tài)),這樣在下次啟動的時候可以重新讀取這些配置。該文件中列出了該集群中的其他節(jié)點的狀態(tài),持久化變量等信息。當節(jié)點收到一些信息的時候該文件就會被沖重寫。

          3. cluster-node-timeout <milliseconds>: redis集群節(jié)點的最大超時時間。響應超過這個時間的話該節(jié)點會被認為是掛掉了。如果一個master節(jié)點超過一定的時候無法訪問,它會被它的slave取代。該參數(shù)在redis集群配置中很重要。很明顯,當節(jié)點無法訪問大部分master節(jié)點超過一定時間后,它會停止接受查詢請求。

          4. cluster-slave-validity-factor <factor>:如果將該項設置為0,不管slave節(jié)點和master節(jié)點間失聯(lián)多久都會一直嘗試failover(設為正數(shù),失聯(lián)大于一定時間(factor*節(jié)點TimeOut),不再進行FailOver)。比如,如果節(jié)點的timeout設置為5秒,該項設置為10,如果master跟slave之間失聯(lián)超過50秒,slave不會去failover它的master(意思是不會去把master設置為掛起狀態(tài),并取代它)。注意:任意非0數(shù)值都有可能導致當master掛掉又沒有slave去failover它,這樣redis集群不可用。在這種情況下只有原來那個master重新回到集群中才能讓集群恢復工作。

          5. cluster-migration-barrier <count>: 一個master可以擁有的最小slave數(shù)量。該項的作用是,當一個master沒有任何slave的時候,某些有富余slave的master節(jié)點,可以自動的分一個slave給它。具體參見手冊中的replica migration章節(jié)

          6. cluster-require-full-coverage <yes/no>: 如果該項設置為yes(默認就是yes) 當一定比例的鍵空間沒有被覆蓋到(就是某一部分的哈希槽沒了,有可能是暫時掛了)集群就停止處理任何查詢炒作。如果該項設置為no,那么就算請求中只有一部分的鍵可以被查到,一樣可以查詢(但是有可能會查不全)

          • 啟動所有節(jié)點

          /usr/local/redis-cluster/redis-7001/bin/redis-server /usr/local/redis-cluster/redis-7001/etc/redis.conf 
          /usr/local/redis-cluster/redis-7002/bin/redis-server /usr/local/redis-cluster/redis-7002/etc/redis.conf 
          /usr/local/redis-cluster/redis-7003/bin/redis-server /usr/local/redis-cluster/redis-7003/etc/redis.conf 
          /usr/local/redis-cluster/redis-7004/bin/redis-server /usr/local/redis-cluster/redis-7004/etc/redis.conf 
          /usr/local/redis-cluster/redis-7005/bin/redis-server /usr/local/redis-cluster/redis-7005/etc/redis.conf 
          /usr/local/redis-cluster/redis-7006/bin/redis-server /usr/local/redis-cluster/redis-7006/etc/redis.conf 

          啟動結果如下

          可以創(chuàng)建一個啟動所有節(jié)點的 Shell 腳本 start-all.sh,然后授權 chmod +x start-all.sh,腳本的內容如下

          /usr/local/redis-cluster/redis-7001/bin/redis-server /usr/local/redis-cluster/redis-7001/etc/redis.conf 
          /usr/local/redis-cluster/redis-7002/bin/redis-server /usr/local/redis-cluster/redis-7002/etc/redis.conf 
          /usr/local/redis-cluster/redis-7003/bin/redis-server /usr/local/redis-cluster/redis-7003/etc/redis.conf 
          /usr/local/redis-cluster/redis-7004/bin/redis-server /usr/local/redis-cluster/redis-7004/etc/redis.conf 
          /usr/local/redis-cluster/redis-7005/bin/redis-server /usr/local/redis-cluster/redis-7005/etc/redis.conf 
          /usr/local/redis-cluster/redis-7006/bin/redis-server /usr/local/redis-cluster/redis-7006/etc/redis.conf 
          • 測試

          隨便找一個接口測試一下,發(fā)現(xiàn)如下錯誤

          雖然是連接成功了,但設置值時報錯了???

          (error) CLUSTERDOWN Hash slot not served(不提供集群的散列槽),這是什么鬼?這是因為雖然配置并啟動了 Redis 集群服務,但是他們暫時還并不在一個集群中,互相直接發(fā)現(xiàn)不了,而且還沒有可存儲的位置,就是所謂的 slot(槽)。


          0x04:安裝集群所需軟件

          由于 Redis 集群需要使用 Ruby 命令,所以需要安裝 Ruby 和相關軟件包。

          yum install ruby
          yum install rubygems
          gem install redis 

          因為 CentOS 系統(tǒng)自帶的 ruby 版本為 2.0.0,所以執(zhí)行最后一條命令出現(xiàn)以下錯誤:

          [root@localhost bin]# gem install redis
          Fetching: redis-4.2.5.gem (100%)
          ERROR:  Error installing redis:
              redis requires Ruby version >= 2.3.0.

          卸載系統(tǒng)自帶 Ruby,安裝 ruby 2.3.0版本 

          # yum remove ruby
          # yum install centos-release-scl-rh //會在/etc/yum.repos.d/目錄下多出一個CentOS-SCLo-scl-rh.repo源
          # yum install rh-ruby23  -y //直接yum安裝即可
          # scl  enable  rh-ruby23 bash //必要一步
          # ruby -v

          安裝完 ruby 2.3.0 版本后在執(zhí)行如下命令

          yum install rubygems
          gem install redis 


          0x05:創(chuàng)建集群

          在單機版的安裝目錄的 bin 目錄下找到 redis-trib.rb 可執(zhí)行命令。

          /usr/local/redis-cluster/redis-7001/bin/redis-trib.rb create --replicas 1  \
          127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

          執(zhí)行該命令發(fā)現(xiàn)出現(xiàn)如下錯誤

           提示執(zhí)行如下命令,說明 redis-trib.rb 命令已經(jīng)至少6.0后版本被廢棄了(具體哪個版本開始使用 redis-cli  可以去官網(wǎng)尋找下答案),可以推斷 Ruby 環(huán)境的搭建有點多余了

           /usr/local/redis-cluster/redis-7001/bin/redis-cli --cluster create  \
          127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

          執(zhí)行命令后輸入如下信息

          [root@localhost redis-cluster]#  /usr/local/redis-cluster/redis-7001/bin/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
          >>> Performing hash slots allocation on 6 nodes...
          Master[0] -> Slots 0 - 5460
          Master[1] -> Slots 5461 - 10922
          Master[2] -> Slots 10923 - 16383
          Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
          Adding replica 127.0.0.1:7006 to 127.0.0.1:7002
          Adding replica 127.0.0.1:7004 to 127.0.0.1:7003
          >>> Trying to optimize slaves allocation for anti-affinity
          [WARNING] Some slaves are in the same host as their master
          M: 35059b475861367c728e38cb6219285c8ee690ce 127.0.0.1:7001
             slots:[0-5460] (5461 slots) master
          M: bd8901584958443a44e97455bf2a0e6be6d9cd2a 127.0.0.1:7002
             slots:[5461-10922] (5462 slots) master
          M: 4d9bf1375da15ba3a42ec36da38d7d4d4efc99a8 127.0.0.1:7003
             slots:[10923-16383] (5461 slots) master
          S: f7df7df06237243c6604db6ba91f18bc0d1e8960 127.0.0.1:7004
             replicates 4d9bf1375da15ba3a42ec36da38d7d4d4efc99a8
          S: cdac10f680eb00164360f0a9dbe38263db089fe7 127.0.0.1:7005
             replicates 35059b475861367c728e38cb6219285c8ee690ce
          S: b2f8a3586e5ffa2d9037cc0b1226b5b0a003ec62 127.0.0.1:7006
             replicates bd8901584958443a44e97455bf2a0e6be6d9cd2a
          Can I set the above configuration? (type 'yes' to accept): yes
          >>> Nodes configuration updated
          >>> Assign a different config epoch to each node
          >>> Sending CLUSTER MEET messages to join the cluster
          Waiting for the cluster to join

          >>> Performing Cluster Check (using node 127.0.0.1:7001)
          M: 35059b475861367c728e38cb6219285c8ee690ce 127.0.0.1:7001
             slots:[0-5460] (5461 slots) master
             1 additional replica(s)
          S: f7df7df06237243c6604db6ba91f18bc0d1e8960 127.0.0.1:7004
             slots: (0 slots) slave
             replicates 4d9bf1375da15ba3a42ec36da38d7d4d4efc99a8
          M: 4d9bf1375da15ba3a42ec36da38d7d4d4efc99a8 127.0.0.1:7003
             slots:[10923-16383] (5461 slots) master
             1 additional replica(s)
          S: cdac10f680eb00164360f0a9dbe38263db089fe7 127.0.0.1:7005
             slots: (0 slots) slave
             replicates 35059b475861367c728e38cb6219285c8ee690ce
          M: bd8901584958443a44e97455bf2a0e6be6d9cd2a 127.0.0.1:7002
             slots:[5461-10922] (5462 slots) master
             1 additional replica(s)
          S: b2f8a3586e5ffa2d9037cc0b1226b5b0a003ec62 127.0.0.1:7006
             slots: (0 slots) slave
             replicates bd8901584958443a44e97455bf2a0e6be6d9cd2a
          [OK] All nodes agree about slots configuration.
          >>> Check for open slots...
          >>> Check slots coverage...
          [OK] All 16384 slots covered.

          至此,Redi集群搭建成功!大家注意最后一段信息

          顯示了每個節(jié)點所分配的 slots(哈希槽),這里總共6個節(jié)點,其中3個是從節(jié)點,所以3個主節(jié)點分別映射了0-5460、5461-10922、10933-16383 solts。


          0x06:測試驗證

          連接集群節(jié)點,連接任意一個即可

          bin/redis-cli -h 127.0.0.1 -p 7001 -c 

          注意:一定要加上 -c 參數(shù),否則節(jié)點之間是無法自動跳轉。如下圖可以看到,存儲的數(shù)據(jù)(key-value)被均勻分配到不同的節(jié)點。

          另外,如果沒有加上 -c 參數(shù),出現(xiàn)如下錯誤

          喜歡,在看

          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产日产精品一区二区三区 | 国产特级AV | 国产一a毛一a免费观看 | 无码人妻一区二区 | 就操视频 |