redis 集群模式安裝


 

概念

Redis集群提供一種方式自動將數據分布在多個Redis節點上。

每個Redis集群中的節點都需要打開兩個TCP連接。一個連接用於正常的給Client提供服務,比如6379,還有一個額外的端口(通過在這個端口號上加10000)作為數據端口,比如16379。第二個端口(本例中就是16379)用於集群總線,這是一個用二進制協議的點對點通信信道。這個集群總線(Cluster bus)用於節點的失敗偵測、配置更新、故障轉移授權,等等。客戶端從來都不應該嘗試和這些集群總線端口通信,它們只應該和正常的Redis命令端口進行通信。注意,確保在你的防火牆中開放着兩個端口,否則,Redis集群節點之間將無法通信。

命令端口和集群總線端口的偏移量總是10000。

注意,如果想要集群按照你想的那樣工作,那么集群中的每個節點應該:

  1. 正常的客戶端通信端口(通常是6379)用於和所有可到達集群的所有客戶端通信
  2. 集群總線端口(the client port + 10000)必須對所有的其它節點是可到達的

也就是,要想集群正常工作,集群中的每個節點需要做到以下兩點:

  1. 正常的客戶端通信端口(通常是6379)必須對所有的客戶端都開放,換言之,所有的客戶端都可以訪問
  2. 集群總線端口(客戶端通信端口 + 10000)必須對集群中的其它節點開放,換言之,其它任意節點都可以訪問

如果你沒有開放TCP端口,你的集群可能不會像你期望的那樣工作。集群總線用一個不同的二進制協議通信,用於節點之間的數據交換

 

redis cluster在設計的時候,就考慮到了去中心化,去中間件,也就是說,集群中的每個節點都是平等的關系,都是對等的,每個節點都保存各自的數據和整個集群的狀態。每個節點都和其他所有節點連接,而且這些連接保持活躍,這樣就保證了我們只需要連接集群中的任意一個節點,就可以獲取到其他節點的數據。

Redis 集群沒有並使用傳統的一致性哈希來分配數據,而是采用另外一種叫做哈希槽 (hash slot)的方式來分配的。redis cluster 默認分配了 16384 個slot,當我們set一個key 時,會用CRC16算法來取模得到所屬的slot,然后將這個key 分到哈希槽區間的節點上,具體算法就是:CRC16(key) % 16384。所以我們在測試的時候看到set 和 get 的時候,直接跳轉到了7000端口的節點。

Redis 集群會把數據存在一個 master 節點,然后在這個 master 和其對應的salve 之間進行數據同步。當讀取數據時,也根據一致性哈希算法到對應的 master 節點獲取數據。只有當一個master 掛掉之后,才會啟動一個對應的 salve 節點,充當 master 。

需要注意的是:必須要3個或以上的主節點,否則在創建集群時會失敗,並且當存活的主節點數小於總節點數的一半時,整個集群就無法提供服務了。

 

安裝步驟

最小的集群至少需要3個master節點

這里,我們為了測試,用三主三從。

1.首先需要安裝好redis。

2.創建目錄

在 redis 目錄下 創建目錄 redis_cluster 目錄。

mkdir redis_cluster

在該目錄下 創建目錄 7000 7001 7002 7003 7004 7005 

將 redis.conf 分別拷貝到這些目錄中。

3.編輯 redis.conf 文件

編輯這個文件

port  7000                                       //端口7000,7002,7003        
bind 127.0.0.1 192.168.31.100                    //默認ip為127.0.0.1 需要改為其他節點機器可訪問的ip 否則創建集群時無法訪問對應的端口,無法創建集群
daemonize    yes                                       //redis后台運行
pidfile  /var/run/redis_7000.pid                          //pidfile文件對應7000,7001,7002,7003,7004,7005
cluster-enabled  yes                                   //開啟集群  把注釋#去掉
cluster-config-file  nodes_7000.conf                           //集群的配置  配置文件首次啟動自動生成 7000,7001,7002,7003,7004,7005
cluster-node-timeout  15000                                //請求超時  默認15秒,可自行設置
appendonly  yes    

每個文件改對應的端口。

4.依次啟動這些實例

./bin/redis-server redis_cluster/7000/redis.conf

./bin/redis-server redis_cluster/7001/redis.conf

./bin/redis-server redis_cluster/7002/redis.conf

./bin/redis-server redis_cluster/7003/redis.conf

./bin/redis-server redis_cluster/7004/redis.conf

./bin/redis-server redis_cluster/7005/redis.conf

檢查啟動情況

執行命令 

ps -ef | grep redis

netstat -tnlp | grep redis

 

5.創建集群

./bin/redis-cli --cluster create 192.168.31.100:7000 192.168.31.100:7001 192.168.31.100:7002 192.168.31.100:7003 192.168.31.100:7004 192.168.31.100:7005 --cluster-replicas 1

前三個為主實例,后三個為從實例

這里有個警告應為主從都在同一台機器。 

紅框提示后,輸入yes。

6.驗證集群

執行命令

redis-cli  -c -p 7002 

連接到 7002 端口。

查看鍵,沒有鍵值。

set sex man ,發現數據被設置到 7000。

重新登錄7002 輸入keys * ,這台機器仍然為空。

輸入 get sex 

redis 自動路由到 7000端口。

7.集群信息查看

輸入命令 cluster info

 查看節點信息

cluster nodes

 

出錯處理

redis集群報錯Node is not empty

出錯的原因是服務器的IP變更了

需要刪除

appendonly.aof

dump.rdb

nodes.conf

刪除后重建集群就可以了。

 

在創建集群時,一直等待節點加入,而且並不報錯。

修改 redis 配置文件 redis.conf

bind 127.0.0.1 本機IP

修改成 bind 本機IP去掉 127.0.0.1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM