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

詳解三分鐘快速搭建分布式高可用的Redis集群

 更新時間:2021年02月05日 11:37:27   作者:萬貓學社  
這篇文章主要介紹了詳解三分鐘快速搭建分布式高可用的Redis集群,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

這里的Redis集群指的是Redis Cluster,它是Redis在3.0版本正式推出的專用集群方案,有效地解決了Redis分布式方面的需求。當單機內(nèi)存、并發(fā)、流量等遇到瓶頸的時候,可以采用這種Redis Cluster方案進行解決。

分區(qū)規(guī)則

Redis Cluster采用虛擬槽(slot)進行數(shù)據(jù)分區(qū),即使用分散度良好的哈希函數(shù)把所有鍵映射到一個固定范圍的整數(shù)集合里,這里的整數(shù)就是槽(slot)。Redis Cluster槽的范圍是0~16383,計算公式:slot=CRC16(key) & 16383。

白嫖小貼士:CRC16是一種高質(zhì)量的哈希算法,可以使每個槽所映射的鍵通常比較均勻。

當集群中有3個節(jié)點時,每個節(jié)點平均大概負責5461個槽以及槽所映射的鍵值數(shù)據(jù)。這樣一來,可以解耦數(shù)據(jù)與節(jié)點之間的關(guān)系,簡化節(jié)點擴容和縮容的難度。節(jié)點自身維護槽的映射關(guān)系,不需要客戶端或代理服務(wù)維護分區(qū)信息。

不過,Redis Cluster相對于單機還是存在一些限制的,比如:

  • 批量操作鍵支持有限,僅支持具有相同槽的鍵進行批量操作。
  • 事務(wù)操作鍵支持有限,僅支持在同一個節(jié)點上多個鍵的事務(wù)操作。
  • 不支持多個數(shù)據(jù)空間。單機Redis可以支持16個數(shù)據(jù)庫,而Cluster模式下只能使用一個數(shù)據(jù)庫空間。

扯了這么多Redis Cluster的分區(qū)規(guī)則,下面我們開始步入正題。

手動搭建

把Redis Cluster搭建起來總共幾步?答:三步!第一步把冰箱門打開。第二步把大象關(guān)進去。第三步把冰箱門帶上。不好意思,段子暴露年齡了。集群搭建需要以下三個步驟:

  • 準備節(jié)點。
  • 節(jié)點握手。
  • 分配槽。

Redis Cluster由多個節(jié)點組成,節(jié)點數(shù)量至少有6個才能組成一個完整高可用的集群,其中有3個主節(jié)點和3個從節(jié)點,我們就以此為例搭建一個Redis Cluster。

準備節(jié)點

首先,為6個節(jié)點(同一臺機器上的6380、6381、6382、6383、6384、6385端口)分別創(chuàng)建配置文件,以6380端口的節(jié)點為例:

# 節(jié)點端口
port 6380
#日志文件
logfile "log/redis-6380.log"
# 開啟集群模式
cluster-enabled yes
# 集群配置文件
cluster-config-file "data/nodes-6380.conf"

保持文件名為redis-6380.conf,其他節(jié)點的配置文件替換成各自的端口。準備好配置文件后啟動所有節(jié)點,命令如下:

src/redis-server conf/redis-6380.conf &
src/redis-server conf/redis-6381.conf &
src/redis-server conf/redis-6382.conf &
src/redis-server conf/redis-6383.conf &
src/redis-server conf/redis-6384.conf &
src/redis-server conf/redis-6385.conf &

檢測日志是否正確,以下是6380端口的節(jié)點的日志:

 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=3031, just started
 # Configuration loaded
 * No cluster configuration found, I'm df1ac987f47dea35f1d0a83c3b405f0ef86892ab
 * Running mode=cluster, port=6380.

6380端口的節(jié)點啟動成功,第一次啟動時如果沒有集群配置文件,Redis會自動創(chuàng)建一個。6380端口的節(jié)點創(chuàng)建的集群配置文件如下:

df1ac987f47dea35f1d0a83c3b405f0ef86892ab :0@0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0

集群文件中記錄的集群的狀態(tài),這里最重要的是節(jié)點ID,它是一個40位的16進制字符串,用于唯一標識集群中的這個節(jié)點。同樣,也可以通過cluster nodes命令查看集群節(jié)點狀態(tài)。比如在6380端口的節(jié)點上執(zhí)行命令:

127.0.0.1:6380> cluster nodes
df1ac987f47dea35f1d0a83c3b405f0ef86892ab :6380@16380 myself,master - 0 0 0 connected

目前,我們已經(jīng)成功啟動了6個節(jié)點,但是它們只能識別自己的節(jié)點信息,互相之間并不認識。下面我們通過節(jié)點握手讓這6個節(jié)點互相之間建立聯(lián)系從而組成一個集群。

節(jié)點握手

節(jié)點握手是一些運行在集群模式下的節(jié)點通過Gossip協(xié)議互相通信,達到感知彼此的過程。

白嫖小貼士:Gossip協(xié)議是基于流行病傳播方式的節(jié)點或者進程之間信息交換的協(xié)議,在分布式系統(tǒng)中被廣泛使用。

節(jié)點握手通過客戶端執(zhí)行cluster meet命令實現(xiàn),它是一個異步命令,執(zhí)行之后立刻返回,在Redis內(nèi)部異步發(fā)起與目標節(jié)點的握手通信,該命令的語法如下:

cluster meet 目標節(jié)點IP 目標節(jié)點端口

把6個節(jié)點加到一個集群中:

127.0.0.1:6380> cluster meet 127.0.0.1 6381
OK
127.0.0.1:6380> cluster meet 127.0.0.1 6382
OK
127.0.0.1:6380> cluster meet 127.0.0.1 6383
OK
127.0.0.1:6380> cluster meet 127.0.0.1 6384
OK
127.0.0.1:6380> cluster meet 127.0.0.1 6385
OK

只需要在集群中任意節(jié)點上執(zhí)行cluster meet命令加入新的節(jié)點,握手狀態(tài)會通過消息在集群中傳播,其他節(jié)點也會自動發(fā)現(xiàn)新節(jié)點并與之發(fā)起握手流程。

我們再執(zhí)行一下cluster nodes命令,檢查一下6個節(jié)點是否已經(jīng)組成集群:

127.0.0.1:6380> cluster nodes
1e1f45677d7b9b0130d03193f0bcec34578ac47d 127.0.0.1:6385@16385 master - 0 1586617919021 5 connected
df1ac987f47dea35f1d0a83c3b405f0ef86892ab 127.0.0.1:6380@16380 myself,master - 0 1586617916000 2 connected
5846b66ebe4fb4a5dcfd035652cc471f7e412752 127.0.0.1:6381@16381 master - 0 1586617917005 1 connected
a435cf98c3444b0b110a224401e397a107c453ef 127.0.0.1:6384@16384 master - 0 1586617914988 4 connected
71e0e9e9a6f0c7c85dbe0d396846a9072625c5e8 127.0.0.1:6383@16383 master - 0 1586617918013 3 connected
e25590603c7a254cce43aa8437861c5c425d753d 127.0.0.1:6382@16382 master - 0 1586617916000 0 connected

可以看到,6個節(jié)點都在集群中了。不過,此時因為還沒有為集群中的節(jié)點分配槽,集群還處于下線狀態(tài),所有的數(shù)據(jù)讀寫都是被禁止的。比如:

127.0.0.1:6380> set onemore study
(error) CLUSTERDOWN Hash slot not served

接下來,我們?yōu)榧褐械墓?jié)點分配槽。

分配槽

我們把6380、6382、6384端口的節(jié)點作為主節(jié)點,負責處理槽和相關(guān)數(shù)據(jù);6381、6383、6385端口的節(jié)點分別作為從節(jié)點,負責故障轉(zhuǎn)移。先把16384個槽平均分配給6380、6382、6384端口的節(jié)點,為節(jié)點分配槽是通過cluster addslots命令實現(xiàn):

# ./redis-cli -h 127.0.0.1 -p 6380 cluster addslots {0..5461}
OK
# ./redis-cli -h 127.0.0.1 -p 6382 cluster addslots {5462..10922}
OK
# ./redis-cli -h 127.0.0.1 -p 6384 cluster addslots {10923..16383}
OK

我們再執(zhí)行一下cluster nodes命令,檢查一下槽是否已經(jīng)分配:

127.0.0.1:6380> cluster nodes
1e1f45677d7b9b0130d03193f0bcec34578ac47d 127.0.0.1:6385@16385 master - 0 1586619468000 5 connected
df1ac987f47dea35f1d0a83c3b405f0ef86892ab 127.0.0.1:6380@16380 myself,master - 0 1586619464000 2 connected 0-5461
5846b66ebe4fb4a5dcfd035652cc471f7e412752 127.0.0.1:6381@16381 master - 0 1586619467000 1 connected
a435cf98c3444b0b110a224401e397a107c453ef 127.0.0.1:6384@16384 master - 0 1586619467000 4 connected 10923-16383
71e0e9e9a6f0c7c85dbe0d396846a9072625c5e8 127.0.0.1:6383@16383 master - 0 1586619467348 3 connected
e25590603c7a254cce43aa8437861c5c425d753d 127.0.0.1:6382@16382 master - 0 1586619468355 0 connected 5462-10922

再使用cluster replicate命令把一個節(jié)點變成從節(jié)點.,這個命令必須在從節(jié)點上運行,它的語法是:

cluster replicate 主節(jié)點ID

把6381、6383、6385端口的節(jié)點變成對應(yīng)6380、6382、6384端口的節(jié)點的從節(jié)點:

# ./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> cluster replicate df1ac987f47dea35f1d0a83c3b405f0ef86892ab
OK
127.0.0.1:6381> exit
# ./redis-cli -h 127.0.0.1 -p 6383
127.0.0.1:6383> cluster replicate e25590603c7a254cce43aa8437861c5c425d753d
OK
127.0.0.1:6383> exit
# ./redis-cli -h 127.0.0.1 -p 6385
127.0.0.1:6385> cluster replicate a435cf98c3444b0b110a224401e397a107c453ef
OK
127.0.0.1:6385> exit

我們再執(zhí)行一下cluster nodes命令,檢查一下集群狀態(tài)和主從關(guān)系:

127.0.0.1:6380> cluster nodes
df1ac987f47dea35f1d0a83c3b405f0ef86892ab 127.0.0.1:6380@16380 myself,master - 0 1586620148000 2 connected 0-5461
5846b66ebe4fb4a5dcfd035652cc471f7e412752 127.0.0.1:6381@16381 slave df1ac987f47dea35f1d0a83c3b405f0ef86892ab 0 1586620150000 2 connected
e25590603c7a254cce43aa8437861c5c425d753d 127.0.0.1:6382@16382 master - 0 1586620151000 0 connected 5462-10922
71e0e9e9a6f0c7c85dbe0d396846a9072625c5e8 127.0.0.1:6383@16383 slave e25590603c7a254cce43aa8437861c5c425d753d 0 1586620152220 3 connected
a435cf98c3444b0b110a224401e397a107c453ef 127.0.0.1:6384@16384 master - 0 1586620150000 4 connected 10923-16383
1e1f45677d7b9b0130d03193f0bcec34578ac47d 127.0.0.1:6385@16385 slave a435cf98c3444b0b110a224401e397a107c453ef 0 1586620149000 5 connected

自此,RedisCluster已經(jīng)手動搭建完成。手動搭建可以理解集群建立的流程和細節(jié),不過大家也會發(fā)現(xiàn)手動搭建有很多步驟,當集群的節(jié)點比較多的時候,肯定會讓人頭大。所以Redis官方提供了redis-trib.rb工具,可以讓我們快速地搭建集群。

自動搭建

redis-trib.rb是使用Ruby開發(fā)的Redis Cluster的管理工具,不需要額外下載,默認位于源碼包的src目錄下,但因為該工具是用Ruby開發(fā)的,所以需要準備相關(guān)的依賴環(huán)境。

環(huán)境準備

安裝Ruby:

yum -y install zlib-devel
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.gz
tar xvf ruby-2.5.1.tar.gz
cd ruby-2.5.1/
./configure -prefix=/usr/local/ruby
make
make install
cd /usr/local/ruby/
cp bin/ruby /usr/local/bin
cp bin/gem /usr/local/bin

安裝rubygem redis依賴:

wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l redis-3.3.0.gem

安裝redis-trib.rb:

cp src/redis-trib.rb /usr/local/bin

執(zhí)行redis-trib.rb命令確認一下環(huán)境是否準備正確:

# redis-trib.rb help
Usage: redis-trib <command> <options> <arguments ...>

 create     host1:port1 ... hostN:portN
         --replicas <arg>
 check      host:port
 info      host:port
 fix       host:port
         --timeout <arg>
 reshard     host:port
         --from <arg>
...此處省略一萬個字...

搭建集群

像前面的內(nèi)容講的,準備好節(jié)點配置并啟動:

src/redis-server conf/redis-7380.conf &
src/redis-server conf/redis-7381.conf &
src/redis-server conf/redis-7382.conf &
src/redis-server conf/redis-7383.conf &
src/redis-server conf/redis-7384.conf &
src/redis-server conf/redis-7385.conf &

使用redis-trib.rb create命令完成節(jié)點握手和槽分配的工作,命令如下:

redis-trib.rb create --replicas 1 127.0.0.1:7380 127.0.0.1:7382 127.0.0.1:7384 127.0.0.1:7381 127.0.0.1:7383 127.0.0.1:7385

其中--replicas參數(shù)用來指定集群中每個主節(jié)點有幾個從節(jié)點,這里設(shè)置的是1。命令執(zhí)行后,會首先給出主從節(jié)點的分配計劃:

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7380
127.0.0.1:7382
127.0.0.1:7384
Adding replica 127.0.0.1:7383 to 127.0.0.1:7380
Adding replica 127.0.0.1:7385 to 127.0.0.1:7382
Adding replica 127.0.0.1:7381 to 127.0.0.1:7384
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: c25675d021c377c91f860986025e3779d89ede79 127.0.0.1:7380
  slots:0-5460 (5461 slots) master
M: 58980a81b49de31383802d7d21d6782881678922 127.0.0.1:7382
  slots:5461-10922 (5462 slots) master
M: 3f00a37d2c7a5ea40671c8f2934f66d059157a4a 127.0.0.1:7384
  slots:10923-16383 (5461 slots) master
S: 6f7dd93973a8332305831e6b7b5e2c54c15b3b51 127.0.0.1:7381
  replicates 3f00a37d2c7a5ea40671c8f2934f66d059157a4a
S: 03e01f82a935ed7f977af092e6a9cb71057df68a 127.0.0.1:7383
  replicates c25675d021c377c91f860986025e3779d89ede79
S: 2cf3883e974a709b7070d6c4d7c528d9fa813358 127.0.0.1:7385
  replicates 58980a81b49de31383802d7d21d6782881678922
Can I set the above configuration? (type 'yes' to accept):

如果我們同意這份計劃就輸入yes,之后就會開始執(zhí)行節(jié)點握手和槽分配,輸入如下:

>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 127.0.0.1:7380)
M: c25675d021c377c91f860986025e3779d89ede79 127.0.0.1:7380
  slots:0-5460 (5461 slots) master
  1 additional replica(s)
M: 58980a81b49de31383802d7d21d6782881678922 127.0.0.1:7382
  slots:5461-10922 (5462 slots) master
  1 additional replica(s)
S: 2cf3883e974a709b7070d6c4d7c528d9fa813358 127.0.0.1:7385
  slots: (0 slots) slave
  replicates 58980a81b49de31383802d7d21d6782881678922
S: 03e01f82a935ed7f977af092e6a9cb71057df68a 127.0.0.1:7383
  slots: (0 slots) slave
  replicates c25675d021c377c91f860986025e3779d89ede79
S: 6f7dd93973a8332305831e6b7b5e2c54c15b3b51 127.0.0.1:7381
  slots: (0 slots) slave
  replicates 3f00a37d2c7a5ea40671c8f2934f66d059157a4a
M: 3f00a37d2c7a5ea40671c8f2934f66d059157a4a 127.0.0.1:7384
  slots:10923-16383 (5461 slots) master
  1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

集群創(chuàng)建完成后,還可以使用redis-trib.rb check命令檢查集群是否創(chuàng)建成功,具體命令如下:

# redis-trib.rb check 127.0.0.1:7380
>>> Performing Cluster Check (using node 127.0.0.1:7380)
M: c25675d021c377c91f860986025e3779d89ede79 127.0.0.1:7380
  slots:0-5460 (5461 slots) master
  1 additional replica(s)
M: 58980a81b49de31383802d7d21d6782881678922 127.0.0.1:7382
  slots:5461-10922 (5462 slots) master
  1 additional replica(s)
S: 2cf3883e974a709b7070d6c4d7c528d9fa813358 127.0.0.1:7385
  slots: (0 slots) slave
  replicates 58980a81b49de31383802d7d21d6782881678922
S: 03e01f82a935ed7f977af092e6a9cb71057df68a 127.0.0.1:7383
  slots: (0 slots) slave
  replicates c25675d021c377c91f860986025e3779d89ede79
S: 6f7dd93973a8332305831e6b7b5e2c54c15b3b51 127.0.0.1:7381
  slots: (0 slots) slave
  replicates 3f00a37d2c7a5ea40671c8f2934f66d059157a4a
M: 3f00a37d2c7a5ea40671c8f2934f66d059157a4a 127.0.0.1:7384
  slots:10923-16383 (5461 slots) master
  1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

可以看到,所有的槽都已分配到節(jié)點上,大功告成!

到此這篇關(guān)于詳解三分鐘快速搭建分布式高可用的Redis集群的文章就介紹到這了,更多相關(guān)Redis搭建分布式高可用集群內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis的主從配置方法詳解

    redis的主從配置方法詳解

    今天為大家介紹下linux系統(tǒng)下redis的主從配置方法,Linux系統(tǒng)下的redis的主從配置方法非常簡單下面是具體的操作步驟
    2018-09-09
  • redis通過位圖法記錄在線用戶的狀態(tài)詳解

    redis通過位圖法記錄在線用戶的狀態(tài)詳解

    這篇文章主要給大家介紹了關(guān)于redis如何通過位圖法記錄在線用戶的狀態(tài)的相關(guān)資料,文中先對位圖進行了一個簡單的介紹,而后通過示例代碼將實現(xiàn)的方法介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • redis.conf中使用requirepass不生效的原因及解決方法

    redis.conf中使用requirepass不生效的原因及解決方法

    本文主要介紹了如何啟用requirepass,以及啟用requirepass為什么不會生效,從代碼層面分析了不生效的原因,以及解決方法,需要的朋友可以參考下
    2023-07-07
  • 淺談redis內(nèi)存數(shù)據(jù)的持久化方式

    淺談redis內(nèi)存數(shù)據(jù)的持久化方式

    這篇文章主要介紹了淺談redis內(nèi)存數(shù)據(jù)的持久化方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Redis+Caffeine實現(xiàn)分布式二級緩存組件實戰(zhàn)教程

    Redis+Caffeine實現(xiàn)分布式二級緩存組件實戰(zhàn)教程

    這篇文章主要介紹了Redis+Caffeine實現(xiàn)分布式二級緩存組件實戰(zhàn)教程,介紹了分布式二級緩存的優(yōu)勢,使用組件的方法,通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Redis 緩存雙寫一致性的解決方案

    Redis 緩存雙寫一致性的解決方案

    本文主要介紹了Redis 緩存雙寫一致性的解決方案,包括CacheAsidePattern、ReadThrough/WriteThrough和WriteBehind三種模式,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • python腳本實現(xiàn)Redis未授權(quán)批量提權(quán)

    python腳本實現(xiàn)Redis未授權(quán)批量提權(quán)

    這篇文章主要給大家介紹了關(guān)于利用python腳本實現(xiàn)redis未授權(quán)批量提權(quán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • redis哈希類型_動力節(jié)點Java學院整理

    redis哈希類型_動力節(jié)點Java學院整理

    這篇文章主要介紹了redis哈希類型的常用方法及原理淺析,感興趣的朋友一起看看吧
    2017-08-08
  • Redis中Scan命令的踩坑實錄

    Redis中Scan命令的踩坑實錄

    這篇文章主要給大家介紹了關(guān)于Redis中Scan命令踩坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-07-07
  • Redis教程(十):持久化詳解

    Redis教程(十):持久化詳解

    這篇文章主要介紹了Redis教程(十):持久化詳解,本文講解了Redis提供了哪些持久化機制、RDB機制的優(yōu)勢和劣勢、AOF機制的優(yōu)勢和劣勢、其它等內(nèi)容,需要的朋友可以參考下
    2015-04-04

最新評論

顺昌县| 富源县| 清远市| 西吉县| 闽清县| 北安市| 酉阳| 凉城县| 页游| 通海县| 阳东县| 云和县| 新竹市| 于田县| 凭祥市| 辽源市| 子洲县| 武鸣县| 呼玛县| 洪雅县| 泰来县| 谢通门县| 巴马| 资兴市| 宝坻区| 常德市| 西盟| 资溪县| 通江县| 新余市| 牟定县| 长春市| 随州市| 黔西| 芜湖县| 当阳市| 改则县| 微山县| 贵定县| 青海省| 华容县|