您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“redis分片集群如何搭建與使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“redis分片集群如何搭建與使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
redis可以說在實際項目開發中使用的非常頻繁,在redis常用集群中,我們聊到了redis常用的幾種集群方案,不同的集群對應著不同的場景,并且詳細說明了各種集群的優劣,本篇將以redis 分片集群為切入點,從redis 分片集群的搭建開始,詳細說說redis 分片集群相關的技術點;
單點故障;
單機寫(高并發寫)瓶頸;
單機存儲數據容量限制;
集群自動伸縮;
集群自動故障下線與轉移;
1、準備一臺(或6臺服務器,條件允許的情況下)虛擬機或服務器;
本例為演示效果準備了一臺內存8G的服務器,將通過端口進行master和slave的劃分
2、提前下載好redis安裝包;
1、創建6個目錄文件,分別用于保存各個redis示例的數據
mkdir 7001 7002 7003 8001 8002 8003
2、在當前目錄下創建一個redis.conf文件,內容如下
port 6379 # 開啟集群功能 cluster-enabled yes # 集群的配置文件名稱,不需要我們創建,由redis自己維護 cluster-config-file /usr/local/soft/redis/6379/nodes.conf # 節點心跳失敗的超時時間 cluster-node-timeout 5000 # 持久化文件存放目錄 dir /usr/local/soft/redis/6379 # 綁定地址 bind 0.0.0.0 # 讓redis后臺運行 daemonize yes # 注冊的實例ip replica-announce-ip 本機公網IP # 保護模式 protected-mode no # 數據庫數量 databases 1 # 日志 logfile /usr/local/soft/redis/6379/run.log
3、批量將該配置文件拷貝到各個目錄下
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
4、修改每個目錄下redis.conf,將其中的6379修改為與所在目錄一致
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
隨機打開某個redis.conf看看是否修改成功
4、使用下面的命令進行啟動
/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7001/redis.conf /usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7002/redis.conf /usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7003/redis.conf /usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/8001/redis.conf /usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/8002/redis.conf /usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/8003/redis.conf
執行完成后,可以看到6個redis實例已經開啟
通過以上的步驟,就開啟了6個redis的實例,但是這些實例之間并沒有形成一個集群,接下來就需要執行相關的命令將它們構成一個集群
1、使用如下命令構建集群(5.0之后的版本的命令)
redis-cli --cluster create --cluster-replicas 1 IP地址:7001 IP地址:7002 IP地址:7003 IP地址:8001 IP地址:8002 IP地址:8003
關于上面命令的說明
redis-cli --cluster 或者 ./redis-trib.rb:代表集群操作命令;
create:代表是創建集群;
–replicas 1或者–cluster-replicas 1 :指定集群中每個master的副本個數為1,此時節點總數 ÷ (replicas + 1)得到的就是master的數量。因此節點列表中的前n個就是master,其它節點都是slave節點,隨機分配到不同master ;
也可以通過 redis-cli --cluster help 命令進行集群命令的查看;
執行命令后,控制臺提示將會使用哪個示例作為master,哪個作為slave;
繼續輸入yes之后,將會按照上面的策略創建一個集群出來
通過這個輸出的日志大概可以得出如下信息:
端口號依次為7001,7002和7003的為master節點;
端口號依次為8001,8002和8003的為slave節點;
端口號依次為7001,7002和7003的master節點,各自分配了一定區間的槽位數,分別是:[0-5460],[5461-10922],[10923-16383],即總共分配16384個槽位;
2、查看集群狀態
redis-cli -p 7001 cluster nodes
通過這個命令,可以清楚的看到集群中各個實例節點的主從狀態,實例ID(唯一身份標識),槽位區間等信息
其實對redis分片集群稍有了解的同學應該知道,redis分片集群在邏輯上將集群中的所有節點構成了一塊完整的內存空間,數據寫入進來后,具體存放到哪個節點呢?所以集群引入了一個邏輯尚的插槽概念,即將集群劃分為16384個槽位,集群中的每個節點占據一部分槽位數(這個日志中可以看出來);
那么當某個具體的key寫入的時候,集群將會通過一定的算法,將要寫入的數據路由到指定的插槽上去;
這里有個點需要注意,數據key不是與節點綁定,而是與插槽綁定。
redis集群會根據key的有效部分計算插槽值,分兩種情況:
key中包含"{}",且“{}”中至少包含1個字符,“{}”中的部分是有效部分;
key中不包含“{}”,整個key都是有效部分;
舉例來說:key是num,那么就根據num計算,如果是{應用名稱}num,則根據“應用名稱”計算。計算方式是利用CRC16算法得到一個hash值,然后對16384取余,得到的結果就是slot值
下面不妨看下效果
通過上面的演示可以發現,經過集群計算的key將會分配到不同的插槽上,也就是說,key是與插槽綁定,而不是與某個節點綁定,想想為什么會這樣呢?
思考下面這個需求
如何將同一類數據固定的保存在同一個Redis實例?
簡單來說,如果key的分配完全沒有規則的話,當涉及到某個業務類的數據對應的key隨機分配到不同的節點上面時,取值的時候就會出現像上面的重定向跨節點的問題,一定程度上提升性能;
解決辦法
這一類數據使用相同的有效部分,例如key都以{業務ID}為前綴
reids的cluster模式下,有一個比較強的功能就是集群的伸縮能力,即在現有的集群基礎上,可以根據實際的業務需求,進行集群的伸縮,下面來演示下給上面的集群添加一個新節點的步驟;
1、在當前目錄下拷貝一個目錄
2、修改配置文件的端口
sed -i s/6379/7004/g 7004/redis.conf
3、啟動這個實例
/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7004/redis.conf
4、使用下面的命令將7004實例假如集群
redis-cli --cluster add-node IP:7004 IP:7001
5、再次查看集群狀態
redis-cli -p 7001 cluster nodes
通過上面的狀態信息發現,7004這個節點雖然加入了集群,并成了master,但是集群并沒有給它分配任何的插槽
6、分配插槽
分配插槽的基本思路是,從現有的某個節點上遷移部分插槽到新的節點即可,執行下面的命令進行插槽分配
redis-cli --cluster reshard 101.34.23.80:7001
執行命令后將出現下面的提示,這里輸入你要轉移的插槽數量
將7004對應的實例ID輸入即可
輸入yes后開始移動插槽
移動完成后,再次查看集群狀態,這時候7004對應的節點就分配到了從0 ~ 500的數量的插槽
redis的cluster模式的集群,還具備一定的故障轉移能力,比如在上面的架構模式下,當集群中的某個master節點宕機之后,會出現什么情況呢?下面我們來模擬下這個過程,看看效果如何
1、使用watch命令監控下集群的狀態
通過這個命令可以實時查看集群的動態日志變化
watch redis-cli -p 7001 cluster nodes
2、手動將7002實例的master宕機
redis-cli -p 7002 shutdown
從上面的監控日志不難發現,當7002掛掉后,過了一會兒與集群以及它的從節點8003失去了聯系,然后8003這個節點升級為master節點;
3、手動將7002實例啟動起來
/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7002/redis.conf
再次分析日志,可以看到這時候7002只能以slave的身份加入了集群,事實上在某些情況下,我們仍然希望這個宕機的節點恢復后依然是主節點,這該怎么辦呢?這就涉及到了手動故障轉移,主要操作步驟如下:
使用redis-cli連接7002節點;
執行cluster failover命令;
在上面執行之后的情況下,7002是一個slave節點
執行 CLUSTER FAILOVER 命令,觀察日志動態變化,通過日志變化,可以看到,命令執行完畢后,7002很快就變成了master,而8003成了slave;
通過以上步驟就完成了redis的cluster模式下的故障轉移的過程
1、引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2、將配置文件中的集群地址修改成下面這樣即可
spring: redis: cluster: nodes: - 集群IP:7001 - 集群IP:7002 - 集群IP:7003 - 集群IP:7004 - 集群IP:8001 - 集群IP:8002 - 集群IP:8003
至于具體的代碼部分,可以參考下面的這個測試案例
@Autowired private RedisTemplate<String,String> redisTemplate; //localhost:8083/set?key=b&value=123 @GetMapping("/set") public void set(@RequestParam String key,@RequestParam String value){ redisTemplate.opsForValue().set(key,value); } //localhost:8083/get?key=b @GetMapping("/get") public String get(@RequestParam String key){ return redisTemplate.opsForValue().get(key); }
讀到這里,這篇“redis分片集群如何搭建與使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。