1. 程式人生 > >快速搭建redis5.0叢集

快速搭建redis5.0叢集

redis主從叢集搭建

在這裡插入圖片描述

redis簡單主從結構如上圖所示,主從結構的redis由主節點負責讀寫操作,從節點負責讀操作,這裡做搭建介紹,具體工作原理不分析。

  1. 下載安裝redis壓縮包

  2. 解壓壓縮包,進入redis-5.0資料夾,執行命令./make install安裝redis

  3. 安裝完成進入redis-5.0/src資料夾,執行./redis-server 指定配置檔案 即可啟動redis

  4. redis-cli 預設連線本機6379redis伺服器

主從叢集的搭建非常簡單,要做的有一下的步驟:

  • 註釋掉redis-conf配置檔案的以下配置,並且在redis-5.0/目錄下建立一個資料夾6379-6380

    # bind 127.0.0.1
    
    #如果想要redis後臺執行澤東配置為yes
    daemonize yes
    
  • 根據redis.conf配置檔案,複製兩份配置檔案到資料夾資料夾6379-6380,模擬在同一臺機器上啟動兩個redis例項。複製檔名為master.conf和slave.conf

  • 修改slave.conf配置檔案埠為6380,增加配置slaveof 127.0.0.1 6379

    port 6380
    #主節點的主機地址和埠號,這裡是本機
    slaveof 127.0.0.1 6379
    
  • 在src下執行redis-server命令,分別指定配置檔案為剛才配置master和slave配置檔案。連線6379的redis伺服器,執行info replication,顯示如下所示。

    # Replication
    role:master
    connected_slaves:1
    slave0:ip=127.0.0.1,port=6380,state=online,offset=224,lag=0
    master_replid:201640b5a63c036087b7a459245a6f6a699b8a36
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:224
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:224
    

​ 如果執行redis-cli -h 127.0.0.1 -p 6380則是指定連線從節點,執行info replication顯示如下

# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:462
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:201640b5a63c036087b7a459245a6f6a699b8a36
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:462
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:462

以上搭建起一個簡單的主從叢集

哨兵主從叢集搭建

簡單的主從叢集有個問題,就是主節點掛了之後,無法從新選舉新的節點作為主節點進行寫操作,導致服務不可用

。當主節點掛了,嘗試執行set命令,報如下錯誤。

(error) READONLY You can't write against a read only replica.

因此,需要一種機制對主節點掛了的叢集進行監控,並且重新選舉主節點,這就是哨兵的作用。

在這裡插入圖片描述

搭建哨兵主從叢集,需要做以下幾個步驟:

  1. 主從叢集搭建步驟跟上面一樣

  2. 哨兵建立,需要配置哨兵配置檔案,複製一份sentinel.conf到6379-6380資料夾下面,編輯如下配置

    #配置監視的進群的主節點ip和埠 1表示至少需要幾個哨兵統一認定才可以做出判斷
    sentinel monitor mymaster 127.0.0.1 6380 1
    #表示如果5s內mymaster沒響應,就認為SDOWN 
    sentinel down-after-milliseconds mymaster 5000 
    #表示如果15秒後,mysater仍沒活過來,則啟動failover,從剩下從節點序曲新的主節點
    sentinel failover-timeout mymaster 15000 
    
  3. 然後,就可以執行src目錄下的redis-sentinel 指定配置檔案 命令,來啟動一個哨兵。連線6379埠的主節點,執行shutdown關閉主節點,連線從節點查詢狀態,過一陣子後,執行info replication,顯示如下,程式設計了主節點

    role:master
    connected_slaves:0
    master_replid:7c049957e22948d8c346154422498159fcd371b6
    master_replid2:cb6c2d58d978e917cc75ae6b2b278a3ced21fae8
    master_repl_offset:2482
    second_repl_offset:1130
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:2482
    
    
  4. 哨兵也可以進行叢集,只需要修改配置檔案的埠,監聽的還是同一個主節點,即可實現哨兵叢集。哨兵叢集保證哨兵的可用性從而保證redis叢集選舉的可用性。同時多個哨兵監聽還涉及到前面說的哨兵投票機制,需要幾個哨兵才能判定主節點下線。

redis-cluster搭建

儘管可以使用哨兵主從叢集實現可用性保證,但是這種實現方式每個節點的資料都是全量複製,資料存放量存在著侷限性,受限於記憶體最小的節點,因此考慮採用資料分片的方式,來實現儲存,這個就是redis-cluster。

在這裡插入圖片描述

  • 基於原來的主從配置,繼續下去,首先主從模式的slaveof host port配置會與cluster配置衝突
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 94
>>> 'slaveof 127.0.0.1 6381'
replicaof directive not allowed in cluster mode

因此配置檔案需要做以下改造

# slaveof 127.0.0.1 6379

同時,需要開啟redis-cluster配置,配置做以下改造

#配置yes開啟redis-cluster
cluster-enabled yes
#配置節點之間超時時間
cluster-node-timeout 15000
#這個配置很重要,cluster開啟必須重新命名指定cluster-config-file,不能與別的節點相同,否則會啟動失敗,最好按主機+埠命名
cluster-config-file nodes-6379.conf

cluster-config-file相同時,啟動失敗,報以下錯誤

Sorry, the cluster configuration file nodes.conf is already used bySorry, the cluster configuration file nodes.conf is already used by
  • 完成以上配置之後,可以使用src下的redis-server命令,逐個啟動redis例項。因為redis-cluster需要使用到ruby,所以需要安裝ruby,ubuntu下,apt-get install ruby.

  • 最後是執行建立叢集,這裡使用的是5.0版本的redis,建立叢集命令都從./redis-trib.rb 遷移到redis-cli,可以使用redis-cli --cluster help來檢視命令幫助;

    執行以下命令,建立叢集。

    redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
    

很不幸,報錯如下,提示我們redis服務例項上的資料不為空,因此逐個例項連線,執行flushdb,清空資料。

[ERR] Node 127.0.0.1:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

再次執行命令,成功建立cluster,顯示如下,雖然成功建立,但是有個error。提示我們不是所有的slot都被節點覆蓋到,官方的建議是使用fix修復

[ERR] Not all 16384 slots are covered by nodes.

執行redis-cli --cluster fix,顯示了修正結果,槽位重新分配。
在這裡插入圖片描述

可以執行redis-cli --cluster check host:port檢查叢集狀態slots詳細分配。

執行redis-cli --cluster info 127.0.0.1:6382檢查叢集狀態,列印如下,發現redis-cluster自動給節點分配了主從屬性,但是6個節點卻有四個主節點,導致兩個主節點沒slave.這樣的叢集其實是建立失敗的,需要刪除叢集重新建立。

127.0.0.1:6383 (494559b1...) -> 0 keys | 883 slots | 0 slaves.
127.0.0.1:6384 (18b32c4d...) -> 0 keys | 917 slots | 1 slaves.
127.0.0.1:6381 (f2fbb2e0...) -> 0 keys | 6364 slots | 0 slaves.
127.0.0.1:6379 (0c7dd21b...) -> 0 keys | 6401 slots | 1 slaves.
  1. 關閉所有服務例項

  2. 找到對應的nodes-port.conf檔案,刪除

  3. 重新執行redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

    最後正確建立的話會列印如下資訊:

    creating cluster......
    >>> 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:6382 to 127.0.0.1:6379
    Adding replica 127.0.0.1:6383 to 127.0.0.1:6380
    Adding replica 127.0.0.1:6384 to 127.0.0.1:6381
    >>> Trying to optimize slaves allocation for anti-affinity
    [WARNING] Some slaves are in the same host as their master
    M: e13808e5d468b3e91cf6ef7f06a56a4ab662bde3 127.0.0.1:6379
       slots:[0-5460] (5461 slots) master
    M: 2a79a606f0b378f765ce5b04fb15e16c540d4021 127.0.0.1:6380
       slots:[5461-10922] (5462 slots) master
    M: 1ad280f911c1661f223526cb93b13c8e6dab7a88 127.0.0.1:6381
       slots:[10923-16383] (5461 slots) master
    S: 0b01253b7d5f2927d303545cdd3dd4b774f82e83 127.0.0.1:6382
       replicates 1ad280f911c1661f223526cb93b13c8e6dab7a88
    S: e07329aea1976dad6d40b936efab920788029252 127.0.0.1:6383
       replicates e13808e5d468b3e91cf6ef7f06a56a4ab662bde3
    S: 568ac0049c41d93489a1b27aa922215aeb894221 127.0.0.1:6384
       replicates 2a79a606f0b378f765ce5b04fb15e16c540d4021
    Can I set the above configuration? (type 'yes' to accept): 
    
    

    上面可以清楚看到叢集的slot分配資訊以及主從節點資訊

如果需要動態新增或者刪除叢集中的節點怎麼辦?

執行redis-cli --cluster help,顯示如下資訊:

Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
  info           host:port
  fix            host:port
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>
  del-node       host:port node_id
  call           host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace
  help           

add-node方法可以新增節點,還可以指定是主節點還是從節點。del-node是刪除指定節點。還有其它的fix修復命令,reshard重新分配slot等等。