redis?分片集群搭建與使用教程
redis可以說在實(shí)際項(xiàng)目開發(fā)中使用的非常頻繁,在redis常用集群中,我們聊到了redis常用的幾種集群方案,不同的集群對(duì)應(yīng)著不同的場(chǎng)景,并且詳細(xì)說明了各種集群的優(yōu)劣,本篇將以redis 分片集群為切入點(diǎn),從redis 分片集群的搭建開始,詳細(xì)說說redis 分片集群相關(guān)的技術(shù)點(diǎn);
- 單點(diǎn)故障;
- 單機(jī)寫(高并發(fā)寫)瓶頸;
- 單機(jī)存儲(chǔ)數(shù)據(jù)容量限制;
- 集群自動(dòng)伸縮;
- 集群自動(dòng)故障下線與轉(zhuǎn)移;
搭建集群架構(gòu)圖
前置準(zhǔn)備
1、準(zhǔn)備一臺(tái)(或6臺(tái)服務(wù)器,條件允許的情況下)虛擬機(jī)或服務(wù)器;
本例為演示效果準(zhǔn)備了一臺(tái)內(nèi)存8G的服務(wù)器,將通過端口進(jìn)行master和slave的劃分
2、提前下載好redis安裝包;
搭建步驟
1、創(chuàng)建6個(gè)目錄文件,分別用于保存各個(gè)redis示例的數(shù)據(jù)
mkdir 7001 7002 7003 8001 8002 8003
2、在當(dāng)前目錄下創(chuàng)建一個(gè)redis.conf文件,內(nèi)容如下
port 6379 # 開啟集群功能 cluster-enabled yes # 集群的配置文件名稱,不需要我們創(chuàng)建,由redis自己維護(hù) cluster-config-file /usr/local/soft/redis/6379/nodes.conf # 節(jié)點(diǎn)心跳失敗的超時(shí)時(shí)間 cluster-node-timeout 5000 # 持久化文件存放目錄 dir /usr/local/soft/redis/6379 # 綁定地址 bind 0.0.0.0 # 讓redis后臺(tái)運(yùn)行 daemonize yes # 注冊(cè)的實(shí)例ip replica-announce-ip 本機(jī)公網(wǎng)IP # 保護(hù)模式 protected-mode no # 數(shù)據(jù)庫(kù)數(shù)量 databases 1 # 日志 logfile /usr/local/soft/redis/6379/run.log
3、批量將該配置文件拷貝到各個(gè)目錄下
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
4、修改每個(gè)目錄下redis.conf,將其中的6379修改為與所在目錄一致
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
隨機(jī)打開某個(gè)redis.conf看看是否修改成功
4、使用下面的命令進(jìn)行啟動(dòng)
/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
執(zhí)行完成后,可以看到6個(gè)redis實(shí)例已經(jīng)開啟
創(chuàng)建集群
通過以上的步驟,就開啟了6個(gè)redis的實(shí)例,但是這些實(shí)例之間并沒有形成一個(gè)集群,接下來就需要執(zhí)行相關(guān)的命令將它們構(gòu)成一個(gè)集群
1、使用如下命令構(gòu)建集群(5.0之后的版本的命令)
redis-cli --cluster create --cluster-replicas 1 IP地址:7001 IP地址:7002 IP地址:7003 IP地址:8001 IP地址:8002 IP地址:8003
關(guān)于上面命令的說明
- redis-cli --cluster 或者 ./redis-trib.rb:代表集群操作命令;
- create:代表是創(chuàng)建集群;
- –replicas 1或者–cluster-replicas 1 :指定集群中每個(gè)master的副本個(gè)數(shù)為1,此時(shí)節(jié)點(diǎn)總數(shù) ÷ (replicas + 1)得到的就是master的數(shù)量。因此節(jié)點(diǎn)列表中的前n個(gè)就是master,其它節(jié)點(diǎn)都是slave節(jié)點(diǎn),隨機(jī)分配到不同master ;
也可以通過 redis-cli --cluster help 命令進(jìn)行集群命令的查看;
執(zhí)行命令后,控制臺(tái)提示將會(huì)使用哪個(gè)示例作為master,哪個(gè)作為slave;
繼續(xù)輸入yes之后,將會(huì)按照上面的策略創(chuàng)建一個(gè)集群出來
通過這個(gè)輸出的日志大概可以得出如下信息:
- 端口號(hào)依次為7001,7002和7003的為master節(jié)點(diǎn);
- 端口號(hào)依次為8001,8002和8003的為slave節(jié)點(diǎn);
- 端口號(hào)依次為7001,7002和7003的master節(jié)點(diǎn),各自分配了一定區(qū)間的槽位數(shù),分別是:[0-5460],[5461-10922],[10923-16383],即總共分配16384個(gè)槽位;
2、查看集群狀態(tài)
redis-cli -p 7001 cluster nodes
通過這個(gè)命令,可以清楚的看到集群中各個(gè)實(shí)例節(jié)點(diǎn)的主從狀態(tài),實(shí)例ID(唯一身份標(biāo)識(shí)),槽位區(qū)間等信息
Redis散列插槽說明
其實(shí)對(duì)redis分片集群稍有了解的同學(xué)應(yīng)該知道,redis分片集群在邏輯上將集群中的所有節(jié)點(diǎn)構(gòu)成了一塊完整的內(nèi)存空間,數(shù)據(jù)寫入進(jìn)來后,具體存放到哪個(gè)節(jié)點(diǎn)呢?所以集群引入了一個(gè)邏輯尚的插槽概念,即將集群劃分為16384個(gè)槽位,集群中的每個(gè)節(jié)點(diǎn)占據(jù)一部分槽位數(shù)(這個(gè)日志中可以看出來);
那么當(dāng)某個(gè)具體的key寫入的時(shí)候,集群將會(huì)通過一定的算法,將要寫入的數(shù)據(jù)路由到指定的插槽上去;
這里有個(gè)點(diǎn)需要注意,數(shù)據(jù)key不是與節(jié)點(diǎn)綁定,而是與插槽綁定。
redis集群會(huì)根據(jù)key的有效部分計(jì)算插槽值,分兩種情況:
- key中包含"{}",且“{}”中至少包含1個(gè)字符,“{}”中的部分是有效部分;
- key中不包含“{}”,整個(gè)key都是有效部分;
舉例來說:key是num,那么就根據(jù)num計(jì)算,如果是{應(yīng)用名稱}num,則根據(jù)“應(yīng)用名稱”計(jì)算。計(jì)算方式是利用CRC16算法得到一個(gè)hash值,然后對(duì)16384取余,得到的結(jié)果就是slot值
下面不妨看下效果
通過上面的演示可以發(fā)現(xiàn),經(jīng)過集群計(jì)算的key將會(huì)分配到不同的插槽上,也就是說,key是與插槽綁定,而不是與某個(gè)節(jié)點(diǎn)綁定,想想為什么會(huì)這樣呢?
思考下面這個(gè)需求
如何將同一類數(shù)據(jù)固定的保存在同一個(gè)Redis實(shí)例?
簡(jiǎn)單來說,如果key的分配完全沒有規(guī)則的話,當(dāng)涉及到某個(gè)業(yè)務(wù)類的數(shù)據(jù)對(duì)應(yīng)的key隨機(jī)分配到不同的節(jié)點(diǎn)上面時(shí),取值的時(shí)候就會(huì)出現(xiàn)像上面的重定向跨節(jié)點(diǎn)的問題,一定程度上提升性能;
解決辦法
這一類數(shù)據(jù)使用相同的有效部分,例如key都以{業(yè)務(wù)ID}為前綴
集群伸縮(添加節(jié)點(diǎn))
reids的cluster模式下,有一個(gè)比較強(qiáng)的功能就是集群的伸縮能力,即在現(xiàn)有的集群基礎(chǔ)上,可以根據(jù)實(shí)際的業(yè)務(wù)需求,進(jìn)行集群的伸縮,下面來演示下給上面的集群添加一個(gè)新節(jié)點(diǎn)的步驟;
1、在當(dāng)前目錄下拷貝一個(gè)目錄
2、修改配置文件的端口
sed -i s/6379/7004/g 7004/redis.conf
3、啟動(dòng)這個(gè)實(shí)例
/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7004/redis.conf
4、使用下面的命令將7004實(shí)例假如集群
redis-cli --cluster add-node IP:7004 IP:7001
5、再次查看集群狀態(tài)
redis-cli -p 7001 cluster nodes
通過上面的狀態(tài)信息發(fā)現(xiàn),7004這個(gè)節(jié)點(diǎn)雖然加入了集群,并成了master,但是集群并沒有給它分配任何的插槽
6、分配插槽
分配插槽的基本思路是,從現(xiàn)有的某個(gè)節(jié)點(diǎn)上遷移部分插槽到新的節(jié)點(diǎn)即可,執(zhí)行下面的命令進(jìn)行插槽分配
redis-cli --cluster reshard 101.34.23.80:7001
執(zhí)行命令后將出現(xiàn)下面的提示,這里輸入你要轉(zhuǎn)移的插槽數(shù)量
將7004對(duì)應(yīng)的實(shí)例ID輸入即可
輸入yes后開始移動(dòng)插槽
移動(dòng)完成后,再次查看集群狀態(tài),這時(shí)候7004對(duì)應(yīng)的節(jié)點(diǎn)就分配到了從0 ~ 500的數(shù)量的插槽
故障轉(zhuǎn)移
redis的cluster模式的集群,還具備一定的故障轉(zhuǎn)移能力,比如在上面的架構(gòu)模式下,當(dāng)集群中的某個(gè)master節(jié)點(diǎn)宕機(jī)之后,會(huì)出現(xiàn)什么情況呢?下面我們來模擬下這個(gè)過程,看看效果如何
1、使用watch命令監(jiān)控下集群的狀態(tài)
通過這個(gè)命令可以實(shí)時(shí)查看集群的動(dòng)態(tài)日志變化
watch redis-cli -p 7001 cluster nodes
2、手動(dòng)將7002實(shí)例的master宕機(jī)
redis-cli -p 7002 shutdown
從上面的監(jiān)控日志不難發(fā)現(xiàn),當(dāng)7002掛掉后,過了一會(huì)兒與集群以及它的從節(jié)點(diǎn)8003失去了聯(lián)系,然后8003這個(gè)節(jié)點(diǎn)升級(jí)為master節(jié)點(diǎn);
3、手動(dòng)將7002實(shí)例啟動(dòng)起來
/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7002/redis.conf
再次分析日志,可以看到這時(shí)候7002只能以slave的身份加入了集群,事實(shí)上在某些情況下,我們?nèi)匀幌M@個(gè)宕機(jī)的節(jié)點(diǎn)恢復(fù)后依然是主節(jié)點(diǎn),這該怎么辦呢?這就涉及到了手動(dòng)故障轉(zhuǎn)移,主要操作步驟如下:
- 使用redis-cli連接7002節(jié)點(diǎn);
- 執(zhí)行cluster failover命令;
在上面執(zhí)行之后的情況下,7002是一個(gè)slave節(jié)點(diǎn)
執(zhí)行 CLUSTER FAILOVER 命令,觀察日志動(dòng)態(tài)變化,通過日志變化,可以看到,命令執(zhí)行完畢后,7002很快就變成了master,而8003成了slave;
通過以上步驟就完成了redis的cluster模式下的故障轉(zhuǎn)移的過程
使用redistemplate訪問分片集群
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
至于具體的代碼部分,可以參考下面的這個(gè)測(cè)試案例
@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); }
到此這篇關(guān)于redis分片集群搭建與使用的文章就介紹到這了,更多相關(guān)redis分片集群內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。