天天看點

Redis主從配置和哨兵監控配置——伺服器端環境搭建

一:介紹

公司用到的redis架構,主要分為cluster的緩存叢集和sentinel中的哨兵主從。這種的選用方式一般需要更具業務場景來做區分,兩種架構的配置圖為:右圖為哨兵主從架構和cliuster的叢集架構。sentienl的叢集架構,适用于redis的key值都屬于熱點資料,通路量大,并且redis的key值數量不同,這樣在一個key的通路量巨大的時候,可以分流到其他從的機器上。而叢集則适用于key值較多的環境,其政策上,通過對key的一個特定算法,落到某一天固定的機器上,提供了key的查詢速度。類似于資料庫的分庫分表。

Redis主從配置和哨兵監控配置——伺服器端環境搭建

二: 搭建單台redis服務

無論是從那種架構,都需要先搭建redis單台服務,并在此基礎上進行擴充

在redis官網下載下傳 redis-4.0.10.tar.gz 并解壓 指定的目錄,我在解壓之前 先建了一個 redis目錄 将都在這個目錄下操作

tar -zxvf redis-4.0.9.tar.gz
           

進入到 redis/redis-4.0.9 中,對安裝redis

執行 

Redis主從配置和哨兵監控配置——伺服器端環境搭建

如果出現錯誤,可以先安裝 gcc ,apt-get install gcc

等編譯成功後,進入/redis/redis-4.0.9/src/ 執行 ./redis-server 中即可

Redis主從配置和哨兵監控配置——伺服器端環境搭建

其他的詳細安裝過程,網上部落格比較多,就不多說

三:主從服務搭建

搭建主從之前,需要先看一下 https://www.cnblogs.com/leeSmall/p/8398401.html 對了解主從和哨兵有很好對幫助

由于我們隻有單台機器,是以這裡搭建對是僞主從,通過調整修改端口号,來達到啟動不同對redis服務

是以我們隻需要修改vim /redis/redis-4.0.9/redis.conf 即可,但是為了友善起見,我們複制這個檔案,建立三個不同對conf

等conf配置完成,我們隻需要通過 ./redis-server redis-n.conf 就可以啟不同的redis服務

3.1 修改配置

先複制 cp /redis/redis-4.0.9/redis.conf /redis/master-slave/redis-mater-6369.conf  和  redis-slave-6368.conf 、redis-slave-6367.conf,其結構如下所示

Redis主從配置和哨兵監控配置——伺服器端環境搭建

主redis-master-6369.conf的修複:

# 注視掉 這個,就可以通過ip遠端通路

# bind 127.0.0.1 

port 6369

requirepass "123456"  //修改redis的密碼

pidfile "redis/master-slave/redis-pid/redis_6369.pid"

從伺服器 redis-slave-6368.conf

# bind 127.0.0.1 

port 6368

pidfile "redis/master-slave/redis-pid/redis_6368.pid"

requirepass "123456"  //修改redis的密碼

slaveof 127.0.0.1 6369 //主伺服器的位址

masterauth "123456"  //主redis的密碼

從伺服器 redis-slave-6367.conf 和上面的一樣 就不做介紹了

3.2 啟動伺服器

為了友善啟動,通過書寫一個腳本,一鍵啟動,啟動的順序是先啟動主redis 在啟動從redis,并定向輸出日志到log裡面

#!/bin/sh
echo "啟動redis 主從叢集"

redis/redis-4.0.9/src/redis-server redis/master-slave/redis-master-6369.conf >> logs/redis-log/redis-server.log &

redis/redis-4.0.9/src/redis-server redis/master-slave/redis-slave-6368.conf >> logs/redis-log/redis-server.log &

redis/redis-4.0.9/src/redis-server redis/master-slave/redis-slave-6367.conf >> logs/redis-log/redis-server.log &

echo "redis 啟動成功"
           

chmod +x 這個檔案 變成可執行檔案

3.3 檢視啟動狀态

通過 redisl-cli -h 127.0.0.1 -a 1234567 -p 6369 連接配接redis 在通過info檢視,可以看到6369是master 另外兩個是從伺服器,此時主從伺服器搭建完成,

Redis主從配置和哨兵監控配置——伺服器端環境搭建
Redis主從配置和哨兵監控配置——伺服器端環境搭建

出現這種錯誤 

Redis主從配置和哨兵監控配置——伺服器端環境搭建

 是标示你的密碼輸入錯了

搭建好之後 可以通過set get一些key值來檢測狀态

四,哨兵的搭建

哨兵的搭建和步驟三比較類似

在redis/redis-4.0.9 的檔案中 有一個 sentienl.conf  也是隻需要把這個檔案複制成兩份,進行修改即可

修改的内容如下

sentienl-26369.conf 、sentienl-26368.conf 兩個哨兵

port 26369 //修改端口 

protected-mode no //關閉保護預設,可以遠端通路

sentinel monitor mymaster 172.20.139.237 6369 2

//監控主節點的IP位址端口,sentinel監控的master的名字叫做mymaster,2代表,當叢集中有2個sentinel認為master死了時,才能真正認為該master已經不可用了

sentinel auth-pass mymaster 12345678  //哨兵連接配接主redis的密碼

sentinel config-epoch mymaster 2  //故障轉移時最多可以有2從節點同時對新主節點進行資料同步

sentinel leader-epoch mymaster 2

sentinel failover-timeout mymasterA 180000 //故障轉移逾時時間180s,  

五,啟動哨兵

修改剛剛啟動主從的指令,加入啟動哨兵的指令

#!/bin/sh
echo "啟動redis 主從叢集"
/home/luffyu/tools/redis/redis-4.0.9/src/redis-server /home/luffyu/tools/redis/master-slave/redis-master-6369.conf >> /home/luffyu/logs/redis-log/redis-server.log &
/home/luffyu/tools/redis/redis-4.0.9/src/redis-server /home/luffyu/tools/redis/master-slave/redis-slave-6368.conf >> /home/luffyu/logs/redis-log/redis-server.log &
/home/luffyu/tools/redis/redis-4.0.9/src/redis-server /home/luffyu/tools/redis/master-slave/redis-slave-6367.conf >> /home/luffyu/logs/redis-log/redis-server.log &
echo "redis 啟動成功"

echo "啟動哨兵"
redis/redis-4.0.9/src/redis-sentinel redis/redis-sentinel/sentinel_26368.conf >> logs/redis-log/redis-sentinel.log &
redis/redis-4.0.9/src/redis-sentinel redis/redis-sentinel/sentinel_26369.conf >> logs/redis-log/redis-sentinel.log &
echo "哨兵 啟動成功"
           

檢測哨兵是否成功,通過ps -ef | grep "redis" 檢視redis的啟動狀況

Redis主從配置和哨兵監控配置——伺服器端環境搭建

這個時候 強行 kill -9 9146 殺掉之前的主redis 節點,也是就是6369的節點

你會發現,另外的之前的兩個從節點,6367 或者 6368 被選舉成主節點

六:通過 redis 來測試連接配接

public static void main(String[] args) {
        Set<String> sentinels = new HashSet<String>();
        sentinels.add(new HostAndPort("172.20.139.237", 26369).toString());
        sentinels.add(new HostAndPort("172.20.139.237", 26368).toString());
        JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels);
        System.out.println("Current master: " + sentinelPool.getCurrentHostMaster().toString());

        Jedis master = sentinelPool.getResource();
        master.auth("luffyu123");
        master.set("username","cczz");

        Jedis master2 = sentinelPool.getResource();
        master2.auth("luffyu123");

        String value = master2.get("username");
        System.out.println("username: " + value);
        master2.close();
        sentinelPool.close();
        sentinelPool.destroy();
    }
           

參考部落格:

https://www.cnblogs.com/leeSmall/p/8398401.html

https://blog.csdn.net/RobertoHuang/article/details/70766809

https://www.cnblogs.com/qlong8807/p/5893422.html

繼續閱讀