1. 程式人生 > >Linux資料庫管理——day12——Redis資料庫叢集、Ruby軟體簡析

Linux資料庫管理——day12——Redis資料庫叢集、Ruby軟體簡析

部署redis叢集

   1. 將redis部署進入叢集       1.1 修改主配置檔案/etc/redis/6379.conf

sed -i 's/# cluster-enabled/cluster-enabled/' /etc/redis/6379.conf
sed -i '/cluster-node-timeout/ccluster-node-timeout 5000' /etc/redis/6379.conf
sed -i 's/# cluster-config-file/cluster-config-file/' /etc/redis/6379.conf

      1.2 重新啟動資料庫,檢查埠,會出現兩個埠:           一個是自己設定的,用於給客戶端訪問;           一個是自動建立的,這個埠是叢集間進行連線的埠,

/etc/init.d/redis_6379  restart
netstat -ntlup | grep redis
tcp        0      0 172.25.10.110:6379       0.0.0.0:*               LISTEN      2901/redis-server 1 
tcp        0      0 172.25.10.110:16379      0.0.0.0:*               LISTEN      2901/redis-server 1 

   2. 選擇一個伺服器作為管理伺服器,安裝管理叢集軟體Ruby

yum -y install ruby rubygems
rpm -ivh ruby-devel-2.0.0.648-30.el7.x86_64.rpm 
gem install redis-3.2.1.gem

   3. 建立叢集         先檢查一下命令,如果能檢視到幫助資訊,就說明redis命令正常

redis原始碼包解壓目錄/src/redis-trib.rb help
redis-trib.rb create --replicas 從庫個數 叢集中的資料庫IP:埠(所有的都寫上,空格隔開)
# 然後如果執行成功,回答yes即可
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
# 這裡出現的就是主庫資訊

Adding replica 從庫IP:埠號 to 對應主庫IP:埠號
# 這會按照配置的要求出現主從關係

Can I set the above configuration? (type 'yes' to accept): yes

# 這裡會再次出現叢集資訊

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
# 顯示建立成功

   3. 檢查叢集

redis-cli -h 資料庫IP -p 埠號 -a 密碼 cluster info
# 檢視簡介,主要檢視狀態,以及叢集中各個節點個數
cluster_state:ok
cluster_known_nodes:個數

redis-cli -h 資料庫IP -p 埠號 -a 密碼 cluster nodes
# 檢視裡面的節點詳細資訊

redis原始碼包解壓目錄/src/redis-trib.rb check 管理伺服器IP:埠號
# 顯示主從關係
>>> Performing Cluster Check (using node 192.168.4.51:6351)

M: 469b44972ac8d1cd5e121a8d5d3291478741b57d 172.25.10.110:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
# 這裡第一行由三個組成,(M代表主庫  S代表從庫), 然後一長段字串就是ID號 最後是IP和埠號
# 第二行括號中就是雜湊編號的個數,可以理解為儲存的變數個數
# 第三行指代的是

S: eb67516a15b2d2fd806592d5d47f5a15f861b942 172.25.10.112:6381
   slots: (0 slots) slave
   replicates 528332b300ffd84456188c0562954d19cfe5ec49
# 這裡第三行指代的就是該從庫的主庫的ID號

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

   注意:       1. 叢集中必須有3個主庫 而選項 replicas 則是指定一個主庫有幾個從庫,也就是說至少有 3*(1+replicas引數) 個redis資料庫才能建立叢集       2. 如果想把一個或多個節點,建立或者加入到叢集中,必須確保新加入叢集的資料庫中沒有任何資料,如果想保留,可以先拷貝出來,再刪除、重啟動服務,這樣才能加入叢集       3. 所有操作,必須用-c進去叢集,不寫就是單獨進入某個資料庫,但是因為叢集配置還在,導致資料儲存讀取還是會根據雜湊演算法來,這樣就有可能存失敗或者讀失敗       4. 生成叢集的時候,會有著一句話 All 16384 slots covered 返回出來,這代表建立量多少個編號,編號範圍0-16383,學名hash slot,它會根據主庫個數,平均非配給每個主庫,然後在儲存資料的時候,變數名根據雜湊演算法計算得到一個0-16383的編號,然後根據這個編號,找尋存放的位置,查詢的時候也是根據變數名進行雜湊運算,得到一個編號,因為演算法相同,所以這個編號和存的時候會一模一樣,到時候就可以根據編號找到存的資料庫的位置,從而實現查詢。          舉例解釋: 加入現在有預設的3個主庫資訊,那麼第一個主庫記憶體的編號範圍是0-5461,第二個是 5462-10922 ,第三個是 10923-16383 ,然後存了一個變數,這時候會根據crc16演算法計算得到一個數和16384取餘,得到的值假如為6666,我們發現這個編號在第二個主庫的編號範圍內,就會把資料存到第二個主庫中,查詢的時候,根據變兩名,演算法計算得到的編號還會是6666,這樣就可以瞭解到,資料存在第二個主庫中,這樣就可以前往第二個主庫查資料。

   負載均衡測試       客戶端訪問(注意要加上 -c 選項,不然是訪問的獨立的資料庫伺服器,加上 -c 才是訪問叢集)

redis-cli -c -h 叢集中任意一個伺服器IP -p 埠號(不能是資料庫叢集間使用的埠)

172.25.10.110:6379> set test good
-> Redirected to slot [7785] located at 172.25.10.111:6380
OK
172.25.10.111:6380> set test2 good2
-> Redirected to slot [7785] located at 172.25.10.110:6379
OK
172.25.10.110:6379> get test
-> Redirected to slot [11786] located at 172.25.10.111:6380
"good"

      測試後我們會發現,儲存的時候,是根據雜湊演算法計算後按照一定規律存在某個主庫內,然後自動同步到對應從庫;而讀取的時候,會再次根據雜湊演算法計算確認存放在哪個資料庫,如果查詢的變數不在當前庫中,會自動切換到指定庫,並返回值       這樣就實現了資料讀寫負載均衡,每個伺服器都負責了一部分的資料儲存

    高可用        建立中,我們每個主庫都配置了一個從庫,目的就是資料備份,而且Ruby會在主庫down機後,自動讓其從庫成為主庫,繼續提供服務,不會因為任何一個單點故障而致使叢集崩潰,而且那個down機的主庫恢復後,會自動加入叢集,並且自動同步新主庫中的資料,併成為其從庫        舉例解釋: 假設叢集中資料庫A是主庫,資料庫B是其從庫,當A出問題,服務停止後,Ruby會自動讓資料庫B成為主庫,並把A中所有的雜湊編號轉移到B中,從而繼續提供讀寫服務,當A恢復後,會自動加入叢集並同步B中的資料,成為B的從庫。        但是,如果一個有雜湊編號的主庫,沒有從庫,那麼當其down機,叢集會即刻崩潰,所以一般一個主庫後面會有2個主庫,當工程師發現,一個有問題的時候,高可用依然存在,非常安全,只需要迅速恢復,叢集即可恢復如初

管理叢集    使用的命令是 redis原始碼包解壓目錄/src/redis-trib.rb       命令格式基本都是:  redis-trib.rb 選項 叢集中任意一個主機IP:埠

    0. 檢視當前叢集結構

redis-trib.rb check 叢集中任意一個主機IP:埠

    1. 如何新增一個主庫節點       1.0 停止預備加入叢集的redis服務,然後刪除/var/lib/redis/6379/下的檔案,然後重新啟動服務       1.1 新增新的節點(這時候節點內沒有一個雜湊編號,也就是說,可以連線,但是不能存任意資料)

redis-trib.rb add-node 準備新增到主庫中的伺服器IP:埠  叢集中任意一個主機IP:埠

      1.2 重新分配hash編號(這樣新加入的主庫才能存資料)

redis-trib.rb reshard 叢集中任意一個主機IP:埠
>>> Performing Cluster Check (using node 172.25.10.110:6379)

# 這裡會顯示所有庫的資訊

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 預計分配給新加入的庫的hash編號數(可以拿16384/當前庫個數得到一個平均值)
What is the receiving node ID? 新新增的庫的ID號,前面顯示那裡找到
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.

# 如果想雜湊編號從所有主庫裡面等分出來,這裡填寫all
Source node #1:all

# 如果只想從某個或者某幾個庫裡面抽取部分雜湊編號,就填寫主庫ID號
Source node #1:選擇抽取的主庫ID號
Source node #2:選擇抽取的主庫ID2號
Source node #3:done   (如果只想從這幾個庫裡面抽取,就寫done結束)

# 然後會列出所有將被轉移的雜湊編號,在這之後回答yes開始轉移

Do you want to proceed with the proposed reshard plan (yes/no)? yes

    2. 如何新增一個從庫節點       2.0 停止預備加入叢集的redis服務,然後刪除/var/lib/redis/6379/下的檔案,然後重新啟動服務       2.1 加入節點即可

redis-trib.rb add-node  --slave --master-id 主庫ID值(注意不是IP) 新新增的IP:埠號 叢集中任意一個主機IP:埠
# 可以不寫 --master-id 指定主庫,這樣預設是給從庫數量最少的那個庫

    3. 如何刪除一個從庫節點        3.1 先用管理伺服器,把該從庫節點刪除叢集

redis-trib.rb del-node 叢集中任意一個主機IP:埠 被刪除庫的ID號

       3.2 前往被移除的從庫伺服器,刪除從庫中的節點配置檔案/var/lib/redis/6379/nodes-6379.conf,但是最好不要刪除/var/lib/redis/6379/dump.rdb,這裡面儲存的就是資料資訊

       3.3 修改主配置檔案 /etc/redis/6379.conf 將叢集相關配置註釋掉

sed -i 's/^cluster/# cluster/' /etc/redis/6379.conf

     4. 如何刪除主庫節點         4.1 移除預備刪除的主庫的雜湊編號

redis-trib.rb reshard 叢集中任意一個主機IP:埠

>>> Performing Cluster Check (using node 192.168.4.51:6351)

# 這裡會顯示所有庫的資訊

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 這裡寫預備刪除的庫的雜湊編號個數
What is the receiving node ID? 必須選擇一個庫接受這些雜湊編號,這裡寫這個庫的ID
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:預備刪除的主庫的ID號
Source node #2:done

        4.2 刪除節點(下面就和刪除從庫操作相同)

redis-trib.rb del-node  叢集中任意一個主機IP:埠 被刪除庫的ID號

     5. 將已經被退出叢集的資料庫,重新添加回去         起始和新增沒有什麼區別,不過因為要把資料庫中原來寫的叢集配置刪除,而保留資料資訊,所以有點不同         5.1 刪除記錄在資料庫中的叢集配置檔案,然後重啟服務

rm -f /var/lib/redis/6379/nodes-6379.conf 
redis-cli  -h 192.168.4.57 -p 6357 cluster reset

        5.2 加入叢集

總結

    1. 資料庫Ruby叢集結構,共設定量16384個雜湊編號,每個主庫都有屬於自己的雜湊編號,變數儲存讀取都會進行雜湊運算得到雜湊編號從而瞭解自己應該存在哪裡,或者去哪裡讀取資料。並且會自動處理負載均衡和高可用。

    2. 叢集工作過程:        存: 將變數名根據雜湊演算法計算得到一個雜湊編號,然後檢視這個雜湊編號編號歸屬於哪個資料庫中,然後就把資料存到該庫下        讀: 將變數名根據雜湊演算法計算得到一個雜湊編號,然後檢視這個雜湊編號編號歸屬於哪個資料庫中,然後到該庫下查詢資料

    3. 新增新的庫資訊:         3.1. 刪除/var/lib/redis/6379/nodes-6379.conf(名字可能不一樣,具體看自己的配置檔案)         3.2. 用命令將資料庫加入到叢集中         3.3. 如果是主庫調整一下雜湊編號

    4. 移除一個庫:         4.1 如果是主庫就移除所有雜湊編號         4.2 用命令從叢集中移除資料庫         4.3 刪除/var/lib/redis/6379/nodes-6379.conf 並修改 /etc/redis/6379.conf 中的配置

詳細解析:     1. 如果主庫有雜湊編號,那麼其及其從庫能否正常工作就關係到叢集架構;相反,如果主庫沒有雜湊編號,那麼其及其從庫down機就不會影響叢集,也就是說叢集能否正常工作取決於是不是所有的雜湊編號都能被檢視到

    2. 如果一個主庫的雜湊編號全部給了另外一個主庫,那麼該主庫的從庫也會成為另外一個主庫的從庫,而且還有一個特殊情況:        假設主庫A其雜湊編號從0-100,其從庫為B;主庫C雜湊列表為200-300,其從庫為D;這時候加入把C的雜湊編號全部給A,這時候B、D都將成為A的從庫,然後我們把A中0-100的雜湊編號轉給C,神奇的事情就會發生,A的從庫成為D,而C的從庫就變成了D。

    3. 如果主庫中雜湊編號被全部移走會失去從庫,但只要從獲取它雜湊資料的主庫中獲取一個雜湊編號,從庫就會回來。        舉個例子:初始情況和上面一樣,如果A的雜湊編號被B取走,這時候A會失去自己的從庫,這時候如果A獲取B的0-100內的一個雜湊編號,那麼C就會成為A的從庫,如果A獲取200-300中的一個雜湊編號,那麼D就會成為A的從庫

報錯資訊分析     可能叢集出現故障,資料無法讀取 , 可能伺服器不在叢集中 (error) CLUSTERDOWN The cluster is down

    選擇加入叢集的庫中/var/lib/redis/6379/存在nodes-6379.conf配置,所以要刪除該檔案重啟服務 [ERR] Node 172.25.10.110:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.    

    當建立叢集的時候,資料庫伺服器不夠必須的個數,就會報錯 *** ERROR: Invalid configuration for cluster creation. *** Redis Cluster requires at least 3 master nodes. *** This is not possible with 1 nodes and 1 replicas per node. *** At least 6 nodes are required.