查看linux中搭建redis、redis分片、redis哨兵node
1.1.1爲何要搭建集羣
一般,爲了提升網站響應速度,老是把熱點數據保存在內存中而不是直接從後端數據庫中讀取。
Redis是一個很好的Cache工具。大型網站應用,熱點數據量每每巨大,幾十G上百G是很正常的事兒。
因爲內存大小的限制,使用一臺 Redis 實例顯然沒法知足需求,這時就須要使用多臺 Redis做爲緩存數據庫。可是如何保證數據存儲的一致性呢,這時就須要搭建redis集羣.採用合理的機制,保證用戶的正常的訪問需求.
採用redis集羣,能夠保證數據分散存儲,同時保證數據存儲的一致性.而且在內部實現高可用的機制.實現了服務故障的自動遷移.linux
1.1.2集羣搭建計劃
主從劃分:
3臺主機 3臺從機共6臺 端口劃分7000-7005面試
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地址
2.關閉保護模式
3.修改端口號
4.啓動後臺啓動
5.修改pid文件
6.修改持久化文件路徑
7.設定內存優化策略
8.關閉AOF模式
9.開啓集羣配置
10.開啓集羣配置文件
11.修改集羣超時時間
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:表示所有替換
1.2.6經過腳本編輯啓動/關閉指令(cd /usr/local/src/redis/cluster )後端
1.建立啓動腳本 vim start.sh
緩存
#!/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
#!/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節點啓動是否正常
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
關於Redis集羣失敗說明
若是redis集羣搭建失敗,則按照以下的步驟完成配置, 前提條件: 搭建集羣節點必須爲null
1).關閉全部的redis節點
2).刪除多餘的配置文件 dump.rdb/nodes.conf
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); }
1.3.3Redis hash槽存儲數據原理
hash槽算法 分區算法
說明: RedisCluster採用此分區,全部的鍵根據哈希函數(CRC16[key]%16384)映射到0-16383槽內,共16384個槽位,每一個節點維護部分槽及槽所映射的鍵值數據.根據主節點的個數,均衡劃分區間.
算法:哈希函數: Hash()=CRC16[key]%16384
當向redis集羣中插入數據時,首先將key進行計算.以後將計算結果匹配到具體的某一個槽的區間內,以後再將數據set到管理該槽的節點中.
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的全部節點都會保存當前redis集羣中的所有主從狀態信息.而且每一個節點都可以相互通訊.當一個節點發生宕機現象.則集羣中的其餘節點經過PING-PONG檢測機制檢查Redis節點是否宕機.當有半數以上的節點認爲宕機.則認爲主節點宕機.同時由Redis剩餘的主節點進入選舉機制.投票選舉連接宕機的主節點的從機.實現故障遷移.
特色:集羣中若是主機宕機,那麼從機能夠繼續提供服務,
當主機中沒有從機時,則向其它主機借用多餘的從機.繼續提供服務.若是主機宕機時沒有從機可用,則集羣崩潰.
答案:9個redis節點,節點宕機5-7次時集羣才崩潰.