最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis 分片集群搭建與故障轉(zhuǎn)移實(shí)戰(zhàn)指南(推薦)

 更新時(shí)間:2025年12月23日 11:03:00   作者:horizon7274  
本文介紹了如何搭建一個(gè)最小的Redis分片集群,并詳細(xì)描述了集群的啟動(dòng)、創(chuàng)建、測(cè)試、伸縮和故障轉(zhuǎn)移過程,同時(shí),還介紹了如何使用RedisTemplate訪問分片集群,感興趣的朋友跟隨小編一起看看吧

1 搭建分片集群

主從和哨兵可以解決高可用、高并發(fā)讀的問題。但是依然有兩個(gè)問題沒有解決:

  • 海量數(shù)據(jù)存儲(chǔ)問題
  • 高并發(fā)寫的問題

使用分片集群可以解決上述問題,如圖:

分片集群特征:

  • 集群中有多個(gè) master,每個(gè) master 保存不同數(shù)據(jù)
  • 每個(gè) master 都可以有多個(gè) slave 節(jié)點(diǎn)
  • master 之間通過 ping 監(jiān)測(cè)彼此健康狀態(tài)
  • 客戶端請(qǐng)求可以訪問集群任意節(jié)點(diǎn),最終都會(huì)被轉(zhuǎn)發(fā)到正確節(jié)點(diǎn)

1.1 集群結(jié)構(gòu)

分片集群需要的節(jié)點(diǎn)數(shù)量較多,這里我們搭建一個(gè)最小的分片集群,包含 3 個(gè) master 節(jié)點(diǎn),每個(gè) master 包含一個(gè) slave 節(jié)點(diǎn)。

這里我們會(huì)在同一臺(tái)虛擬機(jī)中開啟 6 個(gè) redis 實(shí)例,模擬分片集群,信息如下:

IPPORT角色
172.31.76.1347001master
172.31.76.1347002master
172.31.76.1347003master
172.31.76.1348001slave
172.31.76.1348002slave
172.31.76.1348003slave

1.2 準(zhǔn)備實(shí)例和配置

這里不在 /tmp 目錄下也可以,建議在 home/用戶名/ 目錄下創(chuàng)建一個(gè)新的目錄代替 /tmp ,例如我是在 home/horizon/ 目錄下新建了 redis-cluster-test 目錄,所以我接下來的操作都是在 home/horizon/redis-cluster-test 中進(jìn)行的,在下面涉及到 /tmp 的配置或操作都需要先修改為 /redis-cluster-test 再操作。

刪除之前的 7001、7002、7003 這幾個(gè)目錄,重新創(chuàng)建出 7001、7002、7003、8001、8002、8003 目錄:

# 進(jìn)入/redis-cluster-test目錄
cd /redis-cluster-test
# 刪除舊的,避免配置干擾
rm -rf 7001 7002 7003
# 創(chuàng)建目錄
mkdir 7001 7002 7003 8001 8002 8003

在 /redis-cluster-test 下準(zhǔn)備一個(gè)新的 redis.conf 文件,內(nèi)容如下:

port 6379
# 開啟集群功能
cluster-enabled yes
# 集群的配置文件名稱,不需要我們創(chuàng)建,由redis自己維護(hù)
cluster-config-file /redis-cluster-test/6379/nodes.conf
# 節(jié)點(diǎn)心跳失敗的超時(shí)時(shí)間
cluster-node-timeout 5000
# 持久化文件存放目錄
dir /redis-cluster-test/6379
# 綁定地址
bind 0.0.0.0
# 讓redis后臺(tái)運(yùn)行
daemonize yes
# 注冊(cè)的實(shí)例ip
replica-announce-ip 192.168.150.101
# 保護(hù)模式
protected-mode no
# 數(shù)據(jù)庫數(shù)量
databases 1
# 日志
logfile /redis-cluster-test/6379/run.log

將這個(gè)文件拷貝到每個(gè)目錄下:

# 進(jìn)入/tmp目錄
cd /tmp
# 執(zhí)行拷貝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

修改每個(gè)目錄下的 redis.conf,將其中的 6379 修改為與所在目錄一致:

# 進(jìn)入/tmp目錄
cd /tmp
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

1.3 啟動(dòng)

因?yàn)橐呀?jīng)配置了后臺(tái)啟動(dòng)模式,所以可以直接啟動(dòng)服務(wù):

# 進(jìn)入/tmp目錄
cd /tmp
# 一鍵啟動(dòng)所有服務(wù)
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

通過 ps 查看狀態(tài):

ps -ef | grep redis

發(fā)現(xiàn)服務(wù)都已經(jīng)正常啟動(dòng):

如果要關(guān)閉所有進(jìn)程,可以執(zhí)行命令:

ps -ef | grep redis | awk '{print $2}' | xargs kill

或者(推薦這種方式):

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown

1.4 創(chuàng)建集群

雖然服務(wù)啟動(dòng)了,但是目前每個(gè)服務(wù)之間都是獨(dú)立的,沒有任何關(guān)聯(lián)。

我們需要執(zhí)行命令來創(chuàng)建集群,在 Redis5.0 之前創(chuàng)建集群比較麻煩,5.0 之后集群管理命令都集成到了 redis-cli 中。

我們使用的是 5.0 之后的版本,集群管理以及集成到了 redis-cli 中,格式如下:

redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

命令說明:

  • 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

運(yùn)行后的樣子:

這里輸入 yes,則集群開始創(chuàng)建:

通過命令可以查看集群狀態(tài):

redis-cli -p 7001 cluster nodes

1.5 測(cè)試

嘗試連接 7001 節(jié)點(diǎn),存儲(chǔ)一個(gè)數(shù)據(jù):

# 連接
redis-cli -c -p 7001
# 存儲(chǔ)數(shù)據(jù)
set num 123
# 讀取數(shù)據(jù)
get num
# 再次存儲(chǔ)
set a 1

2 散列插槽

2.1 插槽原理

Redis 會(huì)把每一個(gè) master 節(jié)點(diǎn)映射到 0~16383 共 16384 個(gè)插槽(hash slot)上,查看集群信息時(shí)就能看到:

數(shù)據(jù) key 不是與節(jié)點(diǎn)綁定,而是與插槽綁定。redis 會(huì)根據(jù) key 的有效部分計(jì)算插槽值,分兩種情況:

  • key 中包含“{}”,且“{}”中至少包含 1 個(gè)字符,“{}” 中的部分是有效部分
  • key 中不包含“{}”,整個(gè) key 都是有效部分

例如:key 是 num,那么就根據(jù) num 計(jì)算,如果 key 是 {itcast}num,則根據(jù) itcast 計(jì)算。計(jì)算方式是利用 CRC16 算法得到一個(gè) hash 值,然后對(duì) 16384 取余,得到的結(jié)果就是 slot 值。

如圖,在 7001 這個(gè)節(jié)點(diǎn)執(zhí)行 set a 1 時(shí),對(duì) a 做 hash 運(yùn)算,對(duì) 16384 取余,得到的結(jié)果是 15495,因此要存儲(chǔ)到 7003 節(jié)點(diǎn)。

到了 7003 后,執(zhí)行 get num 時(shí),對(duì) num 做 hash 運(yùn)算,對(duì) 16384 取余,得到的結(jié)果是 2765,因此需要切換到 7001 節(jié)點(diǎn)。

Redis 如何判斷某個(gè) key 應(yīng)該在哪個(gè)實(shí)例?

  • 將 16384 個(gè)插槽分配到不同的實(shí)例
  • 根據(jù) key 的有效部分計(jì)算哈希值,對(duì) 16384 取余
  • 余數(shù)作為插槽,尋找插槽所在實(shí)例即可

如何將同一類數(shù)據(jù)固定的保存在同一個(gè) Redis 實(shí)例?

  • 這一類數(shù)據(jù)使用相同的有效部分,例如 key 都以 {typeId} 為前綴

3 集群伸縮

redis-cli --cluster 提供了很多操作集群的命令,可以通過下面方式查看:

比如,添加節(jié)點(diǎn)的命令:

3.1 需求分析

需求:向集群中添加一個(gè)新的 master 節(jié)點(diǎn),并向其中存儲(chǔ) num = 10

  • 啟動(dòng)一個(gè)新的 redis 實(shí)例,端口為 7004
  • 添加 7004 到之前的集群,并作為一個(gè) master 節(jié)點(diǎn)
  • 給 7004 節(jié)點(diǎn)分配插槽,使得 num 這個(gè) key 可以存儲(chǔ)到 7004 實(shí)例

這里需要兩個(gè)新的功能:

  • 添加一個(gè)節(jié)點(diǎn)到集群中
  • 將部分插槽分配到新插槽

3.2 創(chuàng)建新的 redis 實(shí)例

創(chuàng)建一個(gè)文件夾:

mkdir 7004

拷貝配置文件:

cp redis.conf /7004

修改配置文件:

sed /s/6379/7004/g 7004/redis.conf

啟動(dòng):

redis-server 7004/redis.conf

3.3 添加新節(jié)點(diǎn)到 redis

添加節(jié)點(diǎn)的語法如下:

執(zhí)行命令:

redis-cli --cluster add-node 172.31.76.134:7004 172.31.76.134:7001

通過命令查看集群狀態(tài):

redis-cli -p 7001 cluster nodes

如圖,7004 加入了集群,并且默認(rèn)是一個(gè) master 節(jié)點(diǎn):

但是,可以看到 7004 節(jié)點(diǎn)的插槽數(shù)量為 0,因此沒有任何數(shù)據(jù)可以存儲(chǔ)到 7004 上。

3.4 轉(zhuǎn)移插槽

我們要將 num 存儲(chǔ)到 7004 節(jié)點(diǎn),因此需要先看看 num 的插槽是多少:

如上圖所示,num 的插槽為 2765。

我們可以將 0~3000 的插槽從 7001 轉(zhuǎn)移到 7004,具體命令如下:

建立連接:

redis-cli --cluster reshard 172.31.76.134:7001

得到下面的反饋:

詢問要移動(dòng)多少個(gè)插槽,我們計(jì)劃是3000個(gè):

新的問題來了:

哪個(gè) node 來接收這些插槽??

顯然是 7004,那么 7004 節(jié)點(diǎn)的 id 是多少呢?

復(fù)制這個(gè) id,然后拷貝到剛才的控制臺(tái)后:

這里詢問,你的插槽是從哪里移動(dòng)過來的?

  • all:代表全部,也就是三個(gè)節(jié)點(diǎn)各轉(zhuǎn)移一部分
  • 具體的 id:目標(biāo)節(jié)點(diǎn)的 id
  • done:沒有了

這里我們要從 7001 獲取,因此填寫 7001 的 id。

填完后,點(diǎn)擊done,這樣插槽轉(zhuǎn)移就準(zhǔn)備好了。

確認(rèn)要轉(zhuǎn)移嗎?輸入 yes。

然后,通過命令查看結(jié)果,可以看到: 

目的達(dá)成。

4 故障轉(zhuǎn)移

集群初始狀態(tài)是這樣的:

其中 7001、7002、7003 都是 master,我們計(jì)劃讓 7002 宕機(jī)。

4.1 自動(dòng)故障轉(zhuǎn)移

當(dāng)集群中有一個(gè) master 宕機(jī)會(huì)發(fā)生什么呢?

直接停止一個(gè) redis 實(shí)例,例如 7002:

redis-cli -p 7002 shutdown
  • 首先是該實(shí)例與其它實(shí)例失去連接
  • 然后是疑似宕機(jī)
  • 最后是確定下線,自動(dòng)提升一個(gè) slave 為新的 master
  • 當(dāng) 7002 再次啟動(dòng),就會(huì)變?yōu)橐粋€(gè) slave 節(jié)點(diǎn)了

4.2 手動(dòng)故障轉(zhuǎn)移

利用 cluster failover 命令可以手動(dòng)讓集群中的某個(gè) master 宕機(jī),切換到執(zhí)行 cluster failover 命令的這個(gè) slave 節(jié)點(diǎn),實(shí)現(xiàn)無感知的數(shù)據(jù)遷移。其流程如下:

這種 failover 命令可以指定三種模式:

  • 缺省:默認(rèn)的流程,如圖 1~6 步
  • force:省略了對(duì) offset 的一致性校驗(yàn)
  • takeover:直接執(zhí)行第 5 步,忽略數(shù)據(jù)一致性、忽略 master 狀態(tài)和其它 master 的意見

案例需求:

在 7002 這個(gè) slave 節(jié)點(diǎn)執(zhí)行手動(dòng)故障轉(zhuǎn)移,重新奪回 master 地位

步驟如下:

  • 利用 redis-cli 連接 7002 這個(gè)節(jié)點(diǎn)
  • 執(zhí)行 cluster failover 命令

如圖:

效果:

5 RedisTemplate訪問分片集群

RedisTemplate 底層同樣基于 lettuce 實(shí)現(xiàn)了分片集群的支持,而使用的步驟與哨兵模式基本一致:

  • 引入 redis 的 starter 依賴
  • 配置分片集群地址
  • 配置讀寫分離

與哨兵模式相比,其中只有分片集群的配置方式略有差異,如下:

spring:
  redis:
    cluster:
      nodes:
        - 172.31.76.134:7001
        - 172.31.76.134:7002
        - 172.31.76.134:7003
        - 172.31.76.134:8001
        - 172.31.76.134:8002
        - 172.31.76.134:8003

到此這篇關(guān)于Redis 分片集群搭建與故障轉(zhuǎn)移實(shí)戰(zhàn)指南(推薦)的文章就介紹到這了,更多相關(guān)Redis 分片集群搭建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • RedisDesktopManager無法遠(yuǎn)程連接Redis的完美解決方法

    RedisDesktopManager無法遠(yuǎn)程連接Redis的完美解決方法

    下載RedisDesktopManager客戶端,輸入服務(wù)器IP地址,端口(缺省值:6379);點(diǎn)擊Test Connection按鈕測(cè)試連接,連接失敗,怎么回事呢?下面小編給大家?guī)砹薘edisDesktopManager無法遠(yuǎn)程連接Redis的完美解決方法,一起看看吧
    2018-03-03
  • 淺談Redis內(nèi)存回收策略

    淺談Redis內(nèi)存回收策略

    本文主要介紹了淺談Redis內(nèi)存回收策略,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Linux下安裝Redis 6.0.5的實(shí)現(xiàn)

    Linux下安裝Redis 6.0.5的實(shí)現(xiàn)

    本文詳細(xì)介紹了在Linux系統(tǒng)下安裝Redis 6.0.5的步驟,包括安裝準(zhǔn)備、編譯安裝、啟動(dòng)服務(wù)、設(shè)置密碼和配置文件修改等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • 淺談Redis緩存雪崩解決方案

    淺談Redis緩存雪崩解決方案

    本文主要介紹了Redis緩存雪崩解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Redis Cluster添加、刪除的完整操作步驟

    Redis Cluster添加、刪除的完整操作步驟

    這篇文章主要給大家介紹了關(guān)于Redis Cluster添加、刪除的完整操作步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-09-09
  • Redis配置外網(wǎng)可訪問(redis遠(yuǎn)程連接不上)的方法

    Redis配置外網(wǎng)可訪問(redis遠(yuǎn)程連接不上)的方法

    默認(rèn)情況下,當(dāng)我們?cè)诓渴鹆藃edis服務(wù)之后,redis本身默認(rèn)只允許本地訪問。Redis服務(wù)端只允許它所在服務(wù)器上的客戶端訪問,如果Redis服務(wù)端和Redis客戶端不在同一個(gè)機(jī)器上,就要進(jìn)行配置。
    2022-12-12
  • Redis 的 GeoHash詳解

    Redis 的 GeoHash詳解

    這篇文章主要介紹了Redis 的 GeoHash詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • redis實(shí)現(xiàn)sentinel哨兵架構(gòu)的方法

    redis實(shí)現(xiàn)sentinel哨兵架構(gòu)的方法

    哨兵是一個(gè)分布式系統(tǒng),可以在一個(gè)架構(gòu)中運(yùn)行多個(gè)哨兵(sentinel) 進(jìn)程,這些進(jìn)程使用流言協(xié)議(gossip protocols)來接收關(guān)于Master主服務(wù)器是否下線的信息,這篇文章主要介紹了redis實(shí)現(xiàn)sentinel哨兵架構(gòu),需要的朋友可以參考下
    2022-11-11
  • Linux下Redis安裝配置教程

    Linux下Redis安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了Linux下Redis安裝配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Redis的字符串是如何實(shí)現(xiàn)的

    Redis的字符串是如何實(shí)現(xiàn)的

    本文主要介紹了Redis的字符串是如何實(shí)現(xiàn)的,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論

久治县| 庆云县| 九龙城区| 外汇| 芜湖县| 萍乡市| 屯留县| 曲周县| 饶河县| 新竹县| 武陟县| 林口县| 临沧市| 左权县| 枣阳市| 旬阳县| 古丈县| 留坝县| 沭阳县| 大连市| 禄劝| 阿拉善盟| 秦安县| 吉安市| 阳泉市| 北辰区| 晋州市| 湾仔区| 牙克石市| 迭部县| 山西省| 安达市| 突泉县| 西贡区| 凤冈县| 桐庐县| 渭南市| 鄱阳县| 银川市| 崇明县| 民丰县|