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

一:介紹html

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

二: 搭建單臺redis服務算法

不管是從那種框架,都須要先搭建redis單臺服務,並在此基礎上進行擴展數據庫

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

tar -zxvf redis-4.0.9.tar.gz

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

執行 服務器

若是出現錯誤,能夠先安裝 gcc ,apt-get install gccapp

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

其餘的詳細安裝過程,網上博客比較多,就很少說測試

三:主從服務搭建

搭建主從以前,須要先看一下 http://www.javashuo.com/article/p-mguerusx-ee.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();
    }

參考博客:

http://www.javashuo.com/article/p-mguerusx-ee.html

http://www.javashuo.com/article/p-ankiaagj-gv.html

http://www.javashuo.com/article/p-udkxqvam-cb.html

相關文章
相關標籤/搜索