1. 程式人生 > >Centos 7 兩臺機器搭建三主三從的redis叢集

Centos 7 兩臺機器搭建三主三從的redis叢集

忠告在學習搭建redis叢集之前,先學會搭建單個的redis。上一篇我們就介紹了單個的redis搭建,有興趣的朋友可以參照一下。

兩臺伺服器,個啟動三個例項,形成三主三從。

ip:    192.9.200.159   192.9.200.160

1、使用yum安裝所需環境和工具。

    yum -y install wget vim tcl gcc make

2、下載redis並解壓。

    cd /usr/local/        (本人用的是local目錄,當然其他目錄也是可以。)

    wget http://download.redis.io/releases/redis-3.2.x.tar.gz

    tar -zxf redis-3.2.x.tar.gz

    (也可以在網站上下載下來,然後上傳解壓,付網址:http://download.redis.io/releases/redis-3.2.5.tar.gz)

3、編譯安裝redis原始檔

    cd /redis

    make    (若安裝報錯,可以改為這一句:make MALLOC=libc)

    make install

        (如果 /usr/local/bin/ 資料夾內沒有 redis-server 那幾個檔案,就從 /usr/local/redis-3.2.8/src/ 中拷貝過去,命令:cp         redis-server redis-cli redis-sentinel redis-benchmark redis-check-aof redis-check-rdb /usr/local/bin/)

4、配置核心引數(可以省略)

    --配置 vm.overcommit_memory 為1,這可以避免資料被截斷

        systcl -w vm.overcommit_memory=1

5、建立多例項的資料夾

    cd /usr/local/

    mkdir cluster

    cd cluster

    mkdir 7000 7001 7002

6、修改配置檔案

    vim /usr/local/redis/redis.conf

    bind 192.9.200.159 (需要不同的伺服器進行節點的聯通,就不能設為127.0.0.1)

    protected-mode no (需要不同的伺服器進行節點的聯通,就不能設為yes)

    daemonize yes (設定後臺執行redis)

    cluster-enabled yes(開啟叢集,把#去掉)

    cluster-node-timeout 15000 (設定請求超時時間,預設為15秒,可以自行修改)

    appendonly yes (aop日誌開啟,會每次進行寫操作都記錄一條日誌)

    --根據不同的埠需要設定的地方

        port 7000

        pidfile /var/run/redis_7000.pid

        logfile /var/log/redis/redis_7000.log

        dbfilename dump_7000.rdb

        applendfilename "applendonly_7000.aof"

        cluster-config-file nodes_7000.conf

7、複製配置檔案到各個例項資料夾,並且對相應的埠號和引數進行配置。

    cp -f /usr/local/redis/redis.conf   /usr/local/cluster/7000/

    cp -f /usr/local/redis/redis.conf   /usr/local/cluster/7001/

    cp -f /usr/local/redis/redis.conf   /usr/local/cluster/7002/

8、啟動各個節點

    redis-server /usr/local/cluster/7000/redis.conf

    redis-server /usr/local/cluster/7001/redis.conf

    redis-server /usr/local/cluster/7002/redis.conf

    --使用ps -ef|grep redis | grep cluster檢視是否都啟動成功,ip和埠號是否都正確。

9、防火牆開通策略 (防火牆未開就不用配置)

    firewall-cmd --zone=public --add-port=7000-7002/tcp --permanent

    firewall-cmd --zone=public --add-port=17000-17002/tcp --permanent (必須開叢集匯流排埠,叢集匯流排埠=埠號 +10000,例:7000的叢集匯流排埠是17000。這個叢集匯流排埠不開放,叢集的時候外部伺服器的節點新增不進來)

===============================一條華麗的分割線=================================

        以上1-9的步驟在另一臺伺服器上也需要配置,另一臺伺服器埠可以設為7003,7004,7005,或者跟上面一樣也可以

===============================一條華麗的分割線=================================

10、測試兩臺伺服器是否都能 telnet 得通另一臺的 7000~7002 和 17000~17002

    telnet -tlnp | grep redis 

    

11、安裝ruby環境

    yum -y install ruby rubygems

12、跟新gem源

    gem sources -a http://ruby.taobao.org/

13、使用gem安裝redis和ruby介面

    gem install redis (或者gem install redis --version3.2.x)

14、建立叢集

    cd /usr/local/redis/src/

    (redis官方提供了redis-trib.rb 這個工具,就這解壓目錄src目錄中,第3步中已將它複製到/usr/local/bin目錄中,可以直接在命令列中使用。)

    redis-trib.rb create --replicas 1 192.9.200.159:7000 192.9.200.159:7001 192.9.200.159:7002 192.9.200.160:7000 192.9.200.160:7001 192.9.200.160:7002

    留意一下螢幕,會有一句(type 'yes' or accept),輸入yes,回車。(意思是:接受自主分配三主三從)

    如果最後出現

       

        說明搭建成功。

    如果出現

        

        一直出現'...',說明另一臺伺服器的埠策略沒通,一直在等那邊的節點加入叢集,O(∩_∩)O哈哈哈~~那麼恭喜你,悲劇發生咯!!

15、驗證叢集

    在第一臺伺服器上連線叢集的某一埠(7000)節點,在另一臺伺服器上連線某一埠(7002)節點,連線方式為:redis-cli -h 192.9.200.159 -c -p 7000 (加引數 -c 可以連線到叢集,因為redis.conf將bind改為了ip地址,所以 -h 不可以省略)

    在7000節點上執行命令  set hello world

        

    在另一臺伺服器上7002節點執行命令檢視kay為‘hello’的內容 get hello

        

       說明叢集執行正常。

16、總結

    redis cluster在設計的時候,就考慮到了去中心化,去中介軟體,也就是說,叢集中的每個節點都是平等的關係,每個節點都儲存著各自的資料和整個叢集的狀態。每個節點都和其他所有節點連線,而且這些節點保持著活躍,這樣就保證了我們只需要連線叢集中的任意一個節點,就可以獲取到其他節點的資料。

    redis叢集並沒有使用傳統的一致性hash來分配資料,而是採用另外一種叫做hash槽(hash slot)的方式來進行分配。redis cluster預設分配了16384個槽,當我們set一個key時,會用CRC16演算法來取模得到所屬的slot,然後將這個key分配到hash slot區間的節點上,具體的演算法就是:CRC16(key) %16384。

    redis叢集會把資料存在一個master節點,然後在這個master和其對應的salve之間進行資料同步。當讀取資料時,也根據一致性hash演算法到對應的master節點獲取資料。只有當一個master掛掉之後,才會啟動一個對應的salve節點,充當master。

    值得注意的是:必須要3個以及以上的主節點,否則會建立叢集不成功,並且當存活的主節點樹小於總結點數一半的時候,整個叢集就 無法提供服務了。