1. 程式人生 > >redis之redis-cluster(集群)(七)

redis之redis-cluster(集群)(七)

服務 導致 info -i 刷新 客戶端連接 clu == tsl

redis的主流高可用集群模式為redis-cluster.從redis3.0+版本後開始支持,自帶集群管理工具redis-trib.rb。

安裝redis

  • 參考:https://www.cnblogs.com/cwp-bg/p/8094914.html

安裝ruby支持

  • redis-trib.rb工具需要ruby環境的支持。
apt -y install ruby # 安裝ruby
gem install redis # 加入redis

啟用redis-cluster集群模式

  • 修改redis.conf文件
# 啟用集群參數
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
  • 相關的配置參數詳解
cluster-enabled <yes/no>:如果想在特定的Redis實例中啟用Redis群集支持就設置為yes。 否則,實例通常作為獨立實例啟動。

cluster-config-file <filename>:請註意,盡管有此選項的名稱,但這不是用戶可編輯的配置文件,而是Redis群集節點每次發生更改時自動保留群集配置(基本上為狀態)的文件,以便能夠 在啟動時重新讀取它。 該文件列出了群集中其他節點,它們的狀態,持久變量等等。 由於某些消息的接收,通常會將此文件重寫並刷新到磁盤上。

cluster-node-timeout <milliseconds>:Redis群集節點可以不可用的最長時間,而不會將其視為失敗。 如果主節點超過指定的時間不可達,它將由其從屬設備進行故障切換。 此參數控制Redis群集中的其他重要事項。 值得註意的是,每個無法在指定時間內到達大多數主節點的節點將停止接受查詢。

cluster-slave-validity-factor <factor>:如果設置為0,無論主設備和從設備之間的鏈路保持斷開連接的時間長短,從設備都將嘗試故障切換主設備。 如果該值為正值,則計算最大斷開時間作為節點超時值乘以此選項提供的系數,如果該節點是從節點,則在主鏈路斷開連接的時間超過指定的超時值時,它不會嘗試啟動故障切換。 例如,如果節點超時設置為5秒,並且有效因子設置為10,則與主設備斷開連接超過50秒的從設備將不會嘗試對其主設備進行故障切換。 請註意,如果沒有從服務器節點能夠對其進行故障轉移,則任何非零值都可能導致Redis群集在主服務器出現故障後不可用。 在這種情況下,只有原始主節點重新加入集群時,集群才會返回可用。

cluster-migration-barrier <count>:主設備將保持連接的最小從設備數量,以便另一個從設備遷移到不受任何從設備覆蓋的主設備。有關更多信息,請參閱本教程中有關副本遷移的相應部分。

cluster-require-full-coverage <yes / no>:如果將其設置為yes,則默認情況下,如果key的空間的某個百分比未被任何節點覆蓋,則集群停止接受寫入。 如果該選項設置為no,則即使只處理關於keys子集的請求,群集仍將提供查詢。
  • 註意:
  1. 啟用redis-cluster集群模式後,所有的數據只能使用db0,其他的數據庫是不可用的。

  2. slaveof簡單的主從復制模型不可用。

  3. redis-cluster集群使用16384個散列槽存取數據,因此需要為新增的主節點分配散列槽,沒有的話無法存取數據,從節點不需要分配散列槽。

redis-trib.rb工具命令

# 添加主節點
redis-trib.rb add-node 新節點ip和port 舊的任意主節點
# 添加從節點
redis-trib.rb add-node --slave --master-id 主節點id 新節點ip和port 舊的任意主節點   

# 查看所有的節點信息
redis-trib.rb info 節點ip和port

# 移除一個節點的散列槽
redis-trib.rb reshard ip:port

redis-cluster命令

//集群(cluster)  
CLUSTER INFO 打印集群的信息  
CLUSTER NODES 列出集群當前已知的所有節點(node),以及這些節點的相關信息。   
  
//節點(node)  
CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點添加到集群當中,讓它成為集群的一份子。  
CLUSTER FORGET <node_id> 從集群中移除 node_id 指定的節點。  
CLUSTER REPLICATE <node_id> 將當前節點設置為 node_id 指定的節點的從節點。  
CLUSTER SAVECONFIG 將節點的配置文件保存到硬盤裏面。   
  
//槽(slot)  
CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。  
CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。  
CLUSTER FLUSHSLOTS 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。  
CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麽先讓另一個節點刪除該槽>,然後再進行指派。  
CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。  
CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中導入槽 slot 到本節點。  
CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的導入(import)或者遷移(migrate)。   
  
//鍵 (key)  
CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。  
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。  
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。

客戶端連接redis-cluster集群

# 帶上一個-c參數
redis-cli -h ip -c -p port

127.0.0.1:6380> set name caiwp
-> Redirected to slot [5798] located at 172.17.0.3:6380
OK
# 鍵值被重定向
  • 註意:集群後如果單獨連接redis實例,無法重定向,可能無法獲取相關的鍵值。

python連接redis-cluster集群

  • 安裝
pip install redis-py-cluster
  • 創建連接
import rediscluster

def redis_cluster():
    # 所有的節點列表
    redis_nodes =  [{‘host‘: ‘192.168.1.21‘,‘port‘:6380,},
                    {‘host‘: ‘192.168.1.21‘, ‘port‘: 6381,},
                    {‘host‘: ‘192.168.1.21‘, ‘port‘: 6382,},
                    {‘host‘: ‘192.168.1.21‘,‘port‘:6383,},
                    {‘host‘: ‘192.168.1.21‘, ‘port‘: 6384,},
                    {‘host‘: ‘192.168.1.21‘, ‘port‘: 6385,},
                   ]
    try:
        redisconn = rediscluster.StrictRedisCluster(startup_nodes=redis_nodes)
    except Exception as e:
        print(e)

    else:
        print(redisconn.get("name"))

if __name__ == "__main__":
    redis_cluster()

redis之redis-cluster(集群)(七)