redis集羣搭建

Redis集羣實現

查看linux中搭建redis、redis分片、redis哨兵node

1.1Redis集羣

1.1.1爲何要搭建集羣
一般,爲了提升網站響應速度,老是把熱點數據保存在內存中而不是直接從後端數據庫中讀取。
Redis是一個很好的Cache工具。大型網站應用,熱點數據量每每巨大,幾十G上百G是很正常的事兒。
因爲內存大小的限制,使用一臺 Redis 實例顯然沒法知足需求,這時就須要使用多臺 Redis做爲緩存數據庫。可是如何保證數據存儲的一致性呢,這時就須要搭建redis集羣.採用合理的機制,保證用戶的正常的訪問需求.
採用redis集羣,能夠保證數據分散存儲,同時保證數據存儲的一致性.而且在內部實現高可用的機制.實現了服務故障的自動遷移.linux

1.1.2集羣搭建計劃
主從劃分:
3臺主機 3臺從機共6臺 端口劃分7000-7005面試

1.2集羣搭建

1.2.1準備集羣文件夾
1.準備集羣文件夾redis

cd /usr/local/src/redis

mkdir cluster

2.在cluster文件夾中分別建立7000-7005文件夾算法

cd cluster
mkdir 7000 7001 7002 7003 7004 7005

1.2.2複製配置文件
說明:
將redis根目錄中的redis.conf文件複製到cluster/7000/ 並以原名保存數據庫

cd /usr/local/src/redis
cp redis.conf cluster/7000/

1.2.3編輯配置文件
1.註釋本地綁定IP地址
image.png
2.關閉保護模式
image.png
3.修改端口號
image.png
4.啓動後臺啓動
image.png
5.修改pid文件
image.png
6.修改持久化文件路徑
image.png
7.設定內存優化策略
image.png
8.關閉AOF模式
image.png
9.開啓集羣配置
image.png
10.開啓集羣配置文件
image.png
11.修改集羣超時時間
image.png
1.2.4複製修改後的配置文件
說明:將7000文件夾下的redis.conf文件分別複製到7001-7005中vim

cp 7000/redis.conf  7001/
cp 7000/redis.conf  7002/
cp 7000/redis.conf  7003/
cp 7000/redis.conf  7004/
cp 7000/redis.conf  7005/

1.2.5批量修改
說明:分別將7001-7005文件中的7000改成對應的端口號的名稱,
修改時注意方向鍵的使用segmentfault

vim 7000/redis.conf

:%s/7000/7001/g

表示把7000替換爲7001
g:表示所有替換

image.png
1.2.6經過腳本編輯啓動/關閉指令(cd /usr/local/src/redis/cluster )後端

1.建立啓動腳本 vim start.sh
image.png緩存

#!/bin/sh
redis-server 7000/redis.conf &
redis-server 7001/redis.conf &
redis-server 7002/redis.conf &
redis-server 7003/redis.conf &
redis-server 7004/redis.conf &
redis-server 7005/redis.conf &

2.編輯關閉的腳本 vim shutdown.sh
image.png

#!/bin/sh
redis-cli -p 7000 shutdown &
redis-cli -p 7001 shutdown &
redis-cli -p 7002 shutdown &
redis-cli -p 7003 shutdown &
redis-cli -p 7004 shutdown &
redis-cli -p 7005 shutdown &

3.啓動redis節點
sh start.sh
4.檢查redis節點啓動是否正常
image.png
1.2.7建立redis集羣
注意:這裏的1表示每臺主機後面都只有一臺從機
任意目錄下執行以下命令:

#5.0版本執行 使用C語言內部管理集羣
redis-cli --cluster create --cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005

image.png
image.png

關於Redis集羣失敗說明
若是redis集羣搭建失敗,則按照以下的步驟完成配置, 前提條件: 搭建集羣節點必須爲null
1).關閉全部的redis節點
2).刪除多餘的配置文件 dump.rdb/nodes.conf
image.png
3).檢查redis.conf配置文件 參考文檔…
4).重啓redis節點
5).執行搭建命令

1.2.8Redis集羣高可用測試
1.關閉redis主機.檢查是否自動實現故障遷移.
2.再次啓動關閉的主機.檢查是否可以實現自動的掛載.
通常狀況下 可以實現主從掛載
個別狀況: 宕機後的節點重啓,可能掛載到其餘主節點中(7001-7002) 正確的

操做API:

#配置redis集羣
redis.nodes=192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005

    //從配置文件中,拿到redis節點信息
    @Value("${redis.nodes}")
    private String nodes;   //node,node,node.....
    
    @Bean
    public JedisCluster jedisCluster(){
        Set<HostAndPort> nodeSet = new HashSet<>();
        String[] nodeArray = nodes.split(",");
        for (String node : nodeArray){
            String host = node.split(":")[0];
            int port = Integer.parseInt(node.split(":")[1]);
            HostAndPort hostAndPort = new HostAndPort(host, port);
            nodeSet.add(hostAndPort);
        }
        return new JedisCluster(nodeSet);
    }

image.png

集羣中數據如何存取

1.3.3Redis hash槽存儲數據原理
hash槽算法 分區算法
說明: RedisCluster採用此分區,全部的鍵根據哈希函數(CRC16[key]%16384)映射到0-16383槽內,共16384個槽位,每一個節點維護部分槽及槽所映射的鍵值數據.根據主節點的個數,均衡劃分區間.
 算法:哈希函數: Hash()=CRC16[key]%16384
 image.png
當向redis集羣中插入數據時,首先將key進行計算.以後將計算結果匹配到具體的某一個槽的區間內,以後再將數據set到管理該槽的節點中.
image.png

面試題

1).Redis集羣中因爲有16384個槽位,全部redis集羣中只能存儲16384個key? 錯誤
結論: 分區只是分片了數據歸誰管理 到底能存儲多少由內存大小決定.
hash(key1)%16384 = 2000
hash(key2)%16384 = 2000

2).經過redis-cli -p 7000-7005 連接任意的節點均可以執行set操做 錯誤 從庫不能寫
3).經過redis-cli -p 7000-7005 連接任意的主機均可以執行set操做 錯誤 數據存儲嚴格按照分區算法完成.
4).redis集羣中最多可以支持多少臺主機? 16384臺
5).redis集羣一旦搭建,若是redis節點所有關機再次重啓時,須要從新搭建集羣? 錯誤 集羣的狀態都已經寫入nodes.conf文件中.因此重啓以後集羣恢復.

知識點: Redis集羣崩潰的條件是主機缺失集羣崩潰
6).若是有1主1從共3組組成了redis集羣. 問題: redis節點至少宕機幾臺.集羣崩潰?? 2臺…
7).若是有1主2從共3組組成了redis集羣. 問題: redis節點至少宕機幾臺.集羣崩潰?? 5臺
8).若是有1主1從共3組組成了redis集羣. 問題: redis節點最多宕機幾臺.集羣崩潰?? 4臺…

Redis集羣原理

Redis集羣高可用推選原理
image.png
Redis的全部節點都會保存當前redis集羣中的所有主從狀態信息.而且每一個節點都可以相互通訊.當一個節點發生宕機現象.則集羣中的其餘節點經過PING-PONG檢測機制檢查Redis節點是否宕機.當有半數以上的節點認爲宕機.則認爲主節點宕機.同時由Redis剩餘的主節點進入選舉機制.投票選舉連接宕機的主節點的從機.實現故障遷移.

Redis集羣宕機條件

特色:集羣中若是主機宕機,那麼從機能夠繼續提供服務,
當主機中沒有從機時,則向其它主機借用多餘的從機.繼續提供服務.若是主機宕機時沒有從機可用,則集羣崩潰.
答案:9個redis節點,節點宕機5-7次時集羣才崩潰.
image.png

相關文章
相關標籤/搜索