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


一:介紹

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

二: 搭建單台redis服務

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

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

tar -zxvf redis-4.0.9.tar.gz

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

執行 

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

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

其他的詳細安裝過程,網上博客比較多,就不多說

三:主從服務搭建

搭建主從之前,需要先看一下 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-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 另外兩個是從服務器,此時主從服務器搭建完成,

出現這種錯誤 ​ 是標示你的密碼輸入錯了

搭建好之后 可以通過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的啟動狀況

這個時候 強行 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


免責聲明!

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



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