欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1.Redis分片集群

1.1.搭建分片集群

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

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

使用分片集群可以解決上述問(wèn)題,如圖:

分片集群特征:

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

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

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

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.準(zhǔn)備實(shí)例和配置

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

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

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

port 6379
# 開啟集群功能
cluster-enabled yes
# 集群的配置文件名稱,不需要我們創(chuàng)建,由redis自己維護(hù)
cluster-config-file /tmp/6379/nodes.conf
# 節(jié)點(diǎn)心跳失敗的超時(shí)時(shí)間
cluster-node-timeout 5000
# 持久化文件存放目錄
dir /tmp/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ù)庫(kù)數(shù)量
databases 1
# 日志
logfile /tmp/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

通過(guò)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ú)立的,沒(méi)有任何關(guān)聯(lián)。

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

1)Redis5.0之前

Redis5.0之前集群命令都是用redis安裝包下的src/redis-trib.rb來(lái)實(shí)現(xiàn)的。因?yàn)閞edis-trib.rb是由ruby語(yǔ)言編寫的所以需要安裝ruby環(huán)境。

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

然后通過(guò)命令來(lái)管理集群:

# 進(jìn)入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

命令說(shuō)明:

  • 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)建:

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

redis-cli -p 7001 cluster nodes

1.5.測(cè)試

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

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

結(jié)果悲劇了:

這是因?yàn)閍鍵在別的節(jié)點(diǎn)set過(guò)了

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

redis-cli -c -p 7001

這次可以了:

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ì)算,如果是{zqd}num,則根據(jù)zqd計(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ǔ)到103節(jié)點(diǎn)。

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

2.2.小結(jié)

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提供了很多操作集群的命令,可以通過(guò)下面方式查看:

比如,添加節(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)的語(yǔ)法如下:

執(zhí)行命令:

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

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

redis-cli -p 7001 cluster nodes

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

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

3.4.轉(zhuǎn)移插槽

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

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

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

具體命令如下:

建立連接:

得到下面的反饋:

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

新的問(wèn)題來(lái)了:

那個(gè)node來(lái)接收這些插槽??

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

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

這里詢問(wèn),你的插槽是從哪里移動(dòng)過(guò)來(lái)的?

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

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

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

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

然后,通過(guò)命令查看結(jié)果:

可以看到:

目的達(dá)成。

4.故障轉(zhuǎn)移

集群初識(shí)狀態(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

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

2)然后是疑似宕機(jī):

3)最后是確定下線,自動(dòng)提升一個(gè)slave為新的master:

4)當(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)無(wú)感知的數(shù)據(jù)遷移。其流程如下:

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

  • 缺?。耗J(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地位

步驟如下:

1)利用redis-cli連接7002這個(gè)節(jié)點(diǎn)

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

如圖:

效果:

5.RedisTemplate訪問(wèn)分片集群

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

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

到此這篇關(guān)于淺談Redis分片集群搭建及其原理的文章就介紹到這了,更多相關(guān)Redis分片集群搭建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Redis實(shí)現(xiàn)附近商鋪查詢功能

    基于Redis實(shí)現(xiàn)附近商鋪查詢功能

    這篇文章主要介紹了基于Redis實(shí)現(xiàn)-附近商鋪查詢功能,這個(gè)功能將使用到Redis中的GEO這種數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2025-05-05
  • Redis報(bào)錯(cuò):無(wú)法連接Redis服務(wù)的解決方法

    Redis報(bào)錯(cuò):無(wú)法連接Redis服務(wù)的解決方法

    在Linux系統(tǒng)上運(yùn)行Redis服務(wù)時(shí),有時(shí)會(huì)遇到“無(wú)法連接Redis服務(wù)”的報(bào)錯(cuò),本文就詳細(xì)的介紹一下解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Redis實(shí)現(xiàn)每日簽到功能(大數(shù)據(jù)量)

    Redis實(shí)現(xiàn)每日簽到功能(大數(shù)據(jù)量)

    在面對(duì)百萬(wàn)級(jí)用戶簽到情況下,傳統(tǒng)數(shù)據(jù)庫(kù)存儲(chǔ)和判斷會(huì)遇到瓶頸,使用Redis的二進(jìn)制數(shù)據(jù)類型可實(shí)現(xiàn)高效的簽到功能,示例代碼展示了如何調(diào)用這些功能,包括當(dāng)天簽到、補(bǔ)簽以及查詢簽到記錄,PHP結(jié)合Redis二進(jìn)制數(shù)據(jù)類型可有效處理大數(shù)據(jù)量下的簽到問(wèn)題
    2024-10-10
  • Redis實(shí)現(xiàn)附近商鋪的項(xiàng)目實(shí)戰(zhàn)

    Redis實(shí)現(xiàn)附近商鋪的項(xiàng)目實(shí)戰(zhàn)

    本文主要介紹了Redis實(shí)現(xiàn)附近商鋪的項(xiàng)目實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Spring Boot 項(xiàng)目集成Redis的方式詳解

    Spring Boot 項(xiàng)目集成Redis的方式詳解

    這篇文章主要介紹了Spring Boot 項(xiàng)目集成Redis的方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧,需要的朋友可以參考下
    2021-08-08
  • Redis中事件驅(qū)動(dòng)模型示例詳解

    Redis中事件驅(qū)動(dòng)模型示例詳解

    Redis這個(gè)數(shù)據(jù)庫(kù)相信不用過(guò)多介紹了,大家應(yīng)該都知道,下面這篇文章主要給大家介紹了關(guān)于Redis中事件驅(qū)動(dòng)模型的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Spring?Boot實(shí)戰(zhàn)解決高并發(fā)數(shù)據(jù)入庫(kù)之?Redis?緩存+MySQL?批量入庫(kù)問(wèn)題

    Spring?Boot實(shí)戰(zhàn)解決高并發(fā)數(shù)據(jù)入庫(kù)之?Redis?緩存+MySQL?批量入庫(kù)問(wèn)題

    這篇文章主要介紹了Spring?Boot實(shí)戰(zhàn)解決高并發(fā)數(shù)據(jù)入庫(kù)之?Redis?緩存+MySQL?批量入庫(kù)問(wèn)題,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Windows環(huán)境下打開Redis閃退的解決方案

    Windows環(huán)境下打開Redis閃退的解決方案

    每次使用完Redis后,我們習(xí)慣性的動(dòng)作是直接叉掉doc頁(yè)面,這樣導(dǎo)致的結(jié)果是Redis在后臺(tái)繼續(xù)運(yùn)行,沒(méi)有關(guān)閉,所以當(dāng)再次打開的時(shí)候直接閃退,文中有詳細(xì)的解決方案,需要的朋友可以參考下
    2024-03-03
  • Redis中的3種特殊數(shù)據(jù)結(jié)構(gòu)詳解

    Redis中的3種特殊數(shù)據(jù)結(jié)構(gòu)詳解

    在本文中,我們對(duì)三種特殊的數(shù)據(jù)類型進(jìn)行了介紹,它們分別是geospatial(地理空間數(shù)據(jù)類型)、HyperLogLogs和Bitmaps(位圖),這些數(shù)據(jù)類型在不同的領(lǐng)域和應(yīng)用中發(fā)揮著重要作用,并且具有各自獨(dú)特的特性和用途,對(duì)Redis特殊數(shù)據(jù)結(jié)構(gòu)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2024-02-02
  • 使用Redis實(shí)現(xiàn)API網(wǎng)關(guān)或單個(gè)服務(wù)的請(qǐng)求限流的具體代碼

    使用Redis實(shí)現(xiàn)API網(wǎng)關(guān)或單個(gè)服務(wù)的請(qǐng)求限流的具體代碼

    在微服務(wù)架構(gòu)中,對(duì) API 網(wǎng)關(guān)或單個(gè)服務(wù)的請(qǐng)求進(jìn)行速率限制至關(guān)重要,以防止惡意攻擊、資源濫用并確保系統(tǒng)的穩(wěn)定性和可用性,本文將詳細(xì)探討如何利用 Redis 實(shí)現(xiàn) API 網(wǎng)關(guān)或單個(gè)服務(wù)的請(qǐng)求限流,深入分析各種主流算法,需要的朋友可以參考下
    2025-07-07

最新評(píng)論