Redis?Cluster部署實(shí)踐
一、我們要做什么?
在一臺(tái)機(jī)器上(192.168.166.9)跑 6 個(gè) Redis 實(shí)例:
- 3 個(gè) Master(主節(jié)點(diǎn)):6379、6381、6383
- 3 個(gè) Slave(從節(jié)點(diǎn)):6380、6382、6384
最終形成一個(gè) 3 主 3 從 的 Redis 集群。
二、準(zhǔn)備工作(傻瓜式操作)
1. 先搞一個(gè)模板配置文件
- 把原來(lái)的
/etc/redis.conf復(fù)制到/etc/redis/6379.conf - 這個(gè)文件里配置了端口、日志、數(shù)據(jù)目錄等基本參數(shù)
2. 一鍵生成 6 個(gè)配置文件
for i in {6380..6384}; do cp 6379.conf $i.conf; done3. 批量改配置(用循環(huán)搞定)
| 配置項(xiàng) | 改成什么 |
|---|---|
| 端口 | 6379 → 6380、6381… |
| 數(shù)據(jù)目錄 | /var/lib/redis/6379 → 各自端口 |
| 日志文件 | /var/log/redis/6379.log → 各自端口 |
| PID 文件 | /var/run/redis/6379.pid → 各自端口 |
| 保護(hù)模式 | yes → no |
| 后臺(tái)運(yùn)行 | no → yes |
| 監(jiān)聽(tīng)地址 | 127.0.0.1 → 192.168.166.9 |
4. 加上集群配置(每個(gè)配置文件末尾追加)
cluster-enabled yes cluster-config-file nodes-端口.conf cluster-node-timeout 15000
這三行意思是:開(kāi)啟集群模式、保存集群狀態(tài)的文件、節(jié)點(diǎn)超時(shí)時(shí)間 15 秒。
三、啟動(dòng)所有實(shí)例
for i in {6379..6384}; do redis-server /etc/redis/$i.conf; done一條命令把 6 個(gè) Redis 都跑起來(lái)。
四、組成集群(手動(dòng)搓)
1. 讓所有節(jié)點(diǎn)互相認(rèn)識(shí)
for i in {6380..6384}; do redis-cli -h 192.168.166.9 -p 6379 cluster meet 192.168.166.9 $i; done相當(dāng)于:6379 這個(gè)老大哥,去跟其他 5 個(gè)兄弟打個(gè)招呼,大家以后是一家人。
2. 分配槽位(16384 個(gè)槽,平均分給 3 個(gè) Master)
| 節(jié)點(diǎn) | 槽位范圍 | 槽數(shù)量 |
|---|---|---|
| 6379 | 0 ~ 5461 | 5462 |
| 6381 | 5462 ~ 10922 | 5461 |
| 6383 | 10923 ~ 16383 | 5461 |
redis-cli -h 192.168.166.9 -p 6379 cluster addslots {0..5461}
redis-cli -h 192.168.166.9 -p 6381 cluster addslots {5462..10922}
redis-cli -h 192.168.166.9 -p 6383 cluster addslots {10923..16383}槽 = 貨架編號(hào),每個(gè) Master 管自己的一排貨架。
3. 建立主從關(guān)系(誰(shuí)是誰(shuí)的備胎)
先查 Master 的 ID:
redis-cli -h 192.168.166.9 -p 6379 cluster nodes
然后把 Slave 掛到對(duì)應(yīng)的 Master 上:
# 6380 給 6379 當(dāng)備胎 redis-cli -h 192.168.166.9 -p 6380 cluster replicate <6379的ID> # 6382 給 6381 當(dāng)備胎 redis-cli -h 192.168.166.9 -p 6382 cluster replicate <6381的ID> # 6384 給 6383 當(dāng)備胎 redis-cli -h 192.168.166.9 -p 6384 cluster replicate <6383的ID>
五、驗(yàn)證集群
redis-cli -h 192.168.166.9 -p 6379 cluster nodes redis-cli -h 192.168.166.9 -p 6379 cluster info
能看到每個(gè)節(jié)點(diǎn)的角色(master/slave)和負(fù)責(zé)的槽位范圍,就說(shuō)明成功了。
六、故障恢復(fù)(自動(dòng)的)
模擬故障
kill -9 <某個(gè)master的進(jìn)程ID>
自動(dòng)發(fā)生的事
- 集群檢測(cè)到該 Master 掛了
- 它的 Slave 自動(dòng)升級(jí)成新 Master
- 集群繼續(xù)正常工作
恢復(fù)后
- 原來(lái)的 Master 重啟后,會(huì)自動(dòng)變成新 Master 的 Slave(備胎)
- 不需要手動(dòng)干預(yù)
七、常用命令速查表(大白話(huà)版)
| 命令 | 大白話(huà)解釋 |
|---|---|
| cluster meet IP 端口 | 把某個(gè)節(jié)點(diǎn)拉進(jìn)群 |
| cluster nodes | 看看群里都有誰(shuí),誰(shuí)是什么角色 |
| cluster addslots 槽位 | 把一批槽分給當(dāng)前節(jié)點(diǎn) |
| cluster replicate 節(jié)點(diǎn)ID | 讓當(dāng)前節(jié)點(diǎn)給指定節(jié)點(diǎn)當(dāng)備胎 |
| cluster info | 看看集群整體狀態(tài)好不好 |
| cluster failover | 手動(dòng)讓備胎上位(強(qiáng)制切換) |
| cluster keyslot key | 看這個(gè) key 屬于哪個(gè)槽 |
| cluster forget 節(jié)點(diǎn)ID | 把某個(gè)節(jié)點(diǎn)踢出群 |
八、核心注意點(diǎn)(避坑指南)
| 坑 | 解決辦法 |
|---|---|
| 啟動(dòng) Redis 不用絕對(duì)路徑 | 必須用絕對(duì)路徑,否則 nodes.conf 會(huì)亂 |
| 保護(hù)模式?jīng)]關(guān) | 必須設(shè)置 protected-mode no |
| 監(jiān)聽(tīng) 127.0.0.1 | 改成真實(shí) IP,否則其他節(jié)點(diǎn)連不上 |
| 槽位沒(méi)分完 | 16384 個(gè)槽必須全部分配,集群才能用 |
| 主節(jié)點(diǎn)沒(méi)有從節(jié)點(diǎn) | 每個(gè) Master 最好配一個(gè) Slave,否則掛了就丟數(shù)據(jù) |
九、總結(jié)一句話(huà)
手動(dòng)搭 Redis Cluster = 配 6 個(gè)配置文件 → 啟動(dòng) → 互相認(rèn)識(shí) → 分槽位 → 定主從,最后得到一個(gè)能自動(dòng)故障轉(zhuǎn)移的 3 主 3 從集群。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis數(shù)據(jù)結(jié)構(gòu)之鏈表與字典的使用
這篇文章主要介紹了Redis數(shù)據(jù)結(jié)構(gòu)之鏈表與字典的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Redis之SDS數(shù)據(jù)結(jié)構(gòu)的使用
本文主要介紹了Redis之SDS數(shù)據(jù)結(jié)構(gòu)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Redis中緩存和數(shù)據(jù)庫(kù)雙寫(xiě)數(shù)據(jù)不一致的原因及解決方案
這篇文章主要介紹了Redis中緩存和數(shù)據(jù)庫(kù)雙寫(xiě)數(shù)據(jù)不一致的原因及解決方案,文中通過(guò)圖文結(jié)合的方式講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03
Redis通用命令介紹以及key的層級(jí)結(jié)構(gòu)講解
這篇文章主要介紹了Redis通用命令以及key的層級(jí)結(jié)構(gòu),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-12-12
Redis異步隊(duì)列的實(shí)現(xiàn)及應(yīng)用場(chǎng)景
異步隊(duì)列是一種底層基于異步 I/O 模型的消息隊(duì)列,用于在分布式系統(tǒng)中進(jìn)行同步和異步的通訊和協(xié)作,本文主要介紹了Redis異步隊(duì)列的實(shí)現(xiàn)及應(yīng)用場(chǎng)景,感興趣的可以了解一下2023-12-12
Redis緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性的問(wèn)題解決
隨業(yè)務(wù)增長(zhǎng),直接操作數(shù)據(jù)庫(kù)性能下降,引入緩存提高讀性能常見(jiàn),但緩存和數(shù)據(jù)庫(kù)的雙寫(xiě)操作會(huì)引發(fā)數(shù)據(jù)不一致問(wèn)題,本文討論幾種常用同步策略,感興趣的可以了解一下2024-09-09
Java Socket實(shí)現(xiàn)Redis客戶(hù)端的詳細(xì)說(shuō)明
socket編程是一門(mén)技術(shù),它主要是在網(wǎng)絡(luò)通信中經(jīng)常用到.這篇文章主要介紹了如何用Java Socket實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Redis客戶(hù)端,需要的朋友可以參考下2021-05-05

