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

淺談Redis分片集群搭建及其原理

 更新時間:2023年06月14日 10:22:45   作者:me_1984  
本文主要介紹了Redis分片集群搭建及其原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1.Redis分片集群

1.1.搭建分片集群

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

  • 海量數據存儲問題
  • 高并發(fā)寫的問題

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

分片集群特征:

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

分片集群需要的節(jié)點數量較多,這里我們搭建一個最小的分片集群,包含3個master節(jié)點,每個master包含一個slave節(jié)點,結構如下:

這里我們會在同一臺虛擬機中開啟6個redis實例,模擬分片集群,信息如下:

IPPORT角色
192.168.150.1017001master
192.168.150.1017002master
192.168.150.1017003master
192.168.150.1018001slave
192.168.150.1018002slave
192.168.150.1018003slave

1.2.準備實例和配置

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

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

在/tmp下準備一個新的redis.conf文件,內容如下:

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

將這個文件拷貝到每個目錄下:

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

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

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

1.3.啟動

因為已經配置了后臺啟動模式,所以可以直接啟動服務:

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

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

ps -ef | grep redis

發(fā)現服務都已經正常啟動:

如果要關閉所有進程,可以執(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)建集群

雖然服務啟動了,但是目前每個服務之間都是獨立的,沒有任何關聯。

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

1)Redis5.0之前

Redis5.0之前集群命令都是用redis安裝包下的src/redis-trib.rb來實現的。因為redis-trib.rb是由ruby語言編寫的所以需要安裝ruby環(huán)境。

# 安裝依賴
yum -y install zlib ruby rubygems
gem install redis

然后通過命令來管理集群:

# 進入redis的src目錄
cd /tmp/redis-6.2.4/src
# 創(chuàng)建集群
./redis-trib.rb create --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

2)Redis5.0以后

我們使用的是Redis6.2.4版本,集群管理以及集成到了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 :指定集群中每個master的副本個數為1,此時節(jié)點總數 ÷ (replicas + 1) 得到的就是master的數量。因此節(jié)點列表中的前n個就是master,其它節(jié)點都是slave節(jié)點,隨機分配到不同master

運行后的樣子:

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

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

redis-cli -p 7001 cluster nodes

1.5.測試

嘗試連接7001節(jié)點,存儲一個數據:

# 連接
redis-cli -p 7001
# 存儲數據
set num 123
# 讀取數據
get num
# 再次存儲
set a 1

結果悲劇了:

這是因為a鍵在別的節(jié)點set過了

集群操作時,需要給redis-cli加上-c參數才可以:

redis-cli -c -p 7001

這次可以了:

2.散列插槽原理

2.1.插槽原理

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

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

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

例如:key是num,那么就根據num計算,如果是{zqd}num,則根據zqd計算。計算方式是利用CRC16算法得到一個hash值,然后對16384取余,得到的結果就是slot值。

如圖,在7001這個節(jié)點執(zhí)行set a 1時,對a做hash運算,對16384取余,得到的結果是15495,因此要存儲到103節(jié)點。

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

2.2.小結

Redis如何判斷某個key應該在哪個實例?

  • 將16384個插槽分配到不同的實例
  • 根據key的有效部分計算哈希值,對16384取余
  • 余數作為插槽,尋找插槽所在實例即可

如何將同一類數據固定的保存在同一個Redis實例?

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

3.集群伸縮

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

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

3.1.需求分析

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

  • 啟動一個新的redis實例,端口為7004
  • 添加7004到之前的集群,并作為一個master節(jié)點
  • 給7004節(jié)點分配插槽,使得num這個key可以存儲到7004實例

這里需要兩個新的功能:

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

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

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

mkdir 7004

拷貝配置文件:

cp redis.conf /7004

修改配置文件:

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

啟動

redis-server 7004/redis.conf

3.3.添加新節(jié)點到redis

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

執(zhí)行命令:

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

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

redis-cli -p 7001 cluster nodes

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

但是,可以看到7004節(jié)點的插槽數量為0,因此沒有任何數據可以存儲到7004上

3.4.轉移插槽

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

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

我們可以將0~3000的插槽從7001轉移到7004,命令格式如下:

具體命令如下:

建立連接:

得到下面的反饋:

詢問要移動多少個插槽,我們計劃是3000個:

新的問題來了:

那個node來接收這些插槽??

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

復制這個id,然后拷貝到剛才的控制臺后:

這里詢問,你的插槽是從哪里移動過來的?

  • all:代表全部,也就是三個節(jié)點各轉移一部分
  • 具體的id:目標節(jié)點的id
  • done:沒有了

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

填完后,點擊done,這樣插槽轉移就準備好了:

確認要轉移嗎?輸入yes:

然后,通過命令查看結果:

可以看到:

目的達成。

4.故障轉移

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

其中7001、7002、7003都是master,我們計劃讓7002宕機。

4.1.自動故障轉移

當集群中有一個master宕機會發(fā)生什么呢?

直接停止一個redis實例,例如7002:

redis-cli -p 7002 shutdown

1)首先是該實例與其它實例失去連接

2)然后是疑似宕機:

3)最后是確定下線,自動提升一個slave為新的master:

4)當7002再次啟動,就會變?yōu)橐粋€slave節(jié)點了:

4.2.手動故障轉移

利用cluster failover命令可以手動讓集群中的某個master宕機,切換到執(zhí)行cluster failover命令的這個slave節(jié)點,實現無感知的數據遷移。其流程如下:

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

  • 缺?。耗J的流程,如圖1~6歩
  • force:省略了對offset的一致性校驗
  • takeover:直接執(zhí)行第5歩,忽略數據一致性、忽略master狀態(tài)和其它master的意見

案例需求:在7002這個slave節(jié)點執(zhí)行手動故障轉移,重新奪回master地位

步驟如下:

1)利用redis-cli連接7002這個節(jié)點

2)執(zhí)行cluster failover命令

如圖:

效果:

5.RedisTemplate訪問分片集群

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

1)引入redis的starter依賴

2)配置分片集群地址

3)配置讀寫分離

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

spring:
  redis:
    cluster:
      nodes:
        - 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分片集群搭建及其原理的文章就介紹到這了,更多相關Redis分片集群搭建內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Redis 內存碎片原因及清理

    Redis 內存碎片原因及清理

    內存碎片是指在內存分配的時候,產生的不能重復利用的空間,本文主要介紹了Redis 內存碎片原因及清理,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • redis分布式鎖的問題與解決方法

    redis分布式鎖的問題與解決方法

    這篇文章主要給大家介紹了關于redis分布式鎖的問題與解決方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • Windows環(huán)境下安裝Redis并設置Redis開機自啟實踐

    Windows環(huán)境下安裝Redis并設置Redis開機自啟實踐

    文章介紹了如何在Windows系統(tǒng)上安裝和配置Redis,包括下載Windows版本的Redis、設置連接密碼、啟動Redis、設置開機自啟等步驟
    2025-12-12
  • Redis?的?SUBSCRIBE命令詳解

    Redis?的?SUBSCRIBE命令詳解

    Redis的SUBSCRIBE命令用于訂閱一個或多個頻道,以便接收發(fā)送到這些頻道的消息,本文給大家介紹Redis的SUBSCRIBE命令,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • 使用redis實現高效分頁的項目實踐

    使用redis實現高效分頁的項目實踐

    在很多場景下,我們需要對大量的數據進行分頁展示,本文主要介紹了使用redis實現高效分頁的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Windows安裝Redis的幾種方式與測試流程總結

    Windows安裝Redis的幾種方式與測試流程總結

    本文系統(tǒng)梳理了在 Windows 系統(tǒng)上安裝和使用 Redis 的多種方式,涵蓋通過端口號識別運行中的 Redis 實例、進程定位方法,并提供了 Java 環(huán)境下的連接與測試示例,同時還介紹了常見的圖形化管理工具,便于可視化管理與調試,需要的朋友可以參考下
    2025-05-05
  • Redis緩存使用的BigKey問題解決

    Redis緩存使用的BigKey問題解決

    BigKey在Redis中存儲的單個Key對應的Value過大,本文主要介紹了Redis緩存使用的BigKey問題解決,具有一定的參考價值,感興趣的可以了解一下
    2025-05-05
  • Redis實現限量優(yōu)惠券的秒殺功能

    Redis實現限量優(yōu)惠券的秒殺功能

    文章詳細分析了避免超賣問題的方法,包括確保一人一單的業(yè)務邏輯,并提供了代碼實現步驟和代碼示例,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 詳解redis-cli?命令

    詳解redis-cli?命令

    這篇文章主要介紹了redis-cli?命令詳解,主要包括命令使用及使用info命令獲取服務器的信息,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • Redis主從復制的實現示例

    Redis主從復制的實現示例

    Redis主從復制實現多機備份,本文就來介紹一下Redis主從復制的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11

最新評論

峨山| 永修县| 克山县| 友谊县| 叙永县| 天津市| 崇礼县| 科尔| 神木县| 泾川县| 阳山县| 奉化市| 常德市| 孝义市| 凤冈县| 贺州市| 文水县| 东源县| 高尔夫| 德兴市| 靖远县| 海盐县| 无棣县| 思南县| 桂阳县| 荆门市| 儋州市| 定日县| 临桂县| 临朐县| 高密市| 明光市| 峡江县| 土默特左旗| 天门市| 白沙| 玉溪市| 定南县| 马鞍山市| 文成县| 义乌市|