Redis
集群是一個(gè)提供在
多個(gè)Redis
間節(jié)點(diǎn)間共享數(shù)據(jù)
的程序集,本文和大家分享的主要是redis
集群搭建相關(guān)內(nèi)容,一起來(lái)看看吧,希望對(duì)大家
學(xué)習(xí)redis有所幫助
。
Redis
集群并不支持處理多個(gè)
keys
的命令
,
因?yàn)檫@需要在不同的節(jié)點(diǎn)間移動(dòng)數(shù)據(jù)
,
從而達(dá)不到像
Redis
那樣的性能
,
在高負(fù)載的情況下可能會(huì)導(dǎo)致不可預(yù)料的錯(cuò)誤。
Redis
集群通過(guò)分區(qū)來(lái)提供
一定程度的可用性 ,
在實(shí)際環(huán)境中當(dāng)某個(gè)節(jié)點(diǎn)宕機(jī)或者不可達(dá)的情況下繼續(xù)處理命令
. Redis
集群的優(yōu)勢(shì)
:
·
自動(dòng)分割數(shù)據(jù)到不同的節(jié)點(diǎn)上。
·
整個(gè)集群的部分節(jié)點(diǎn)失敗或者不可達(dá)的情況下能夠繼續(xù)處理命令。
Redis 集群的主從復(fù)制模型
為了使在部分節(jié)點(diǎn)失敗或者大部分節(jié)點(diǎn)無(wú)法通信的情況下集群仍然可用,所以集群使用了主從復(fù)制模型,
每個(gè)節(jié)點(diǎn)都會(huì)有
N-1
個(gè)復(fù)制品
.
在我們例子中具有A
,
B
,
C
三個(gè)節(jié)點(diǎn)的集群
,
在沒(méi)有復(fù)制模型的情況下
,
如果節(jié)點(diǎn)
B
失敗了,那么整個(gè)集群就會(huì)以為缺少
5501-11000
這個(gè)范圍的槽而不可用
.
然而如果在集群創(chuàng)建的時(shí)候(或者過(guò)一段時(shí)間)我們?yōu)槊總€(gè)節(jié)點(diǎn)添加一個(gè)從節(jié)點(diǎn)A1
,
B1
,
C1,
那么整個(gè)集群便有三個(gè)
master
節(jié)點(diǎn)和三個(gè)
slave
節(jié)點(diǎn)組成,這樣在節(jié)點(diǎn)
B
失敗后,集群便會(huì)選舉
B1
為新的主節(jié)點(diǎn)繼續(xù)服務(wù),整個(gè)集群便不會(huì)因?yàn)椴壅也坏蕉豢捎昧?/span>
不過(guò)當(dāng)B
和
B1
都失敗后,集群是不可用的
.
搭建并使用Redis集群
搭建集群的第一件事情我們需要一些運(yùn)行在
集群模式的Redis
實(shí)例
.
這意味這集群并不是由一些普通的
Redis
實(shí)例組成的,集群模式需要通過(guò)配置啟用,開(kāi)啟集群模式后的
Redis
實(shí)例便可以使用集群特有的命令和特性了
.
下面是一個(gè)最少選項(xiàng)的集群的配置文件:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
文件中的 cluster-enabled
選項(xiàng)用于開(kāi)實(shí)例的集群模式, 而
cluster-conf-file
選項(xiàng)則設(shè)定了保存節(jié)點(diǎn)配置文件的路徑, 默認(rèn)值為
nodes.conf.
節(jié)點(diǎn)配置文件無(wú)須人為修改, 它由
Redis
集群在啟動(dòng)時(shí)創(chuàng)建, 并在有需要時(shí)自動(dòng)進(jìn)行更新。
要讓集群正常運(yùn)作至少需要三個(gè)主節(jié)點(diǎn),不過(guò)在剛開(kāi)始試用集群功能時(shí),
強(qiáng)烈建議使用六個(gè)節(jié)點(diǎn):
其中三個(gè)為主節(jié)點(diǎn),
而其余三個(gè)則是各個(gè)主節(jié)點(diǎn)的從節(jié)點(diǎn)。
首先,
讓我們進(jìn)入一個(gè)新目錄,
并創(chuàng)建六個(gè)以端口號(hào)為名字的子目錄,
稍后我們?cè)趯⒚總€(gè)目錄中運(yùn)行一個(gè) Redis
實(shí)例: 命令如下
:
mkdir cluster-test
cd cluster-testmkdir 7000 7001 7002 7003 7004 7005
在文件夾 7000
至
7005
中, 各創(chuàng)建一個(gè)
redis.conf
文件, 文件的內(nèi)容可以使用上面的示例配置文件, 但記得將配置中的端口號(hào)從
7000
改為與文件夾名字相同的號(hào)碼。
從 Redis Github
頁(yè)面 的
unstable
分支中取出最新的
Redis
源碼, 編譯出可執(zhí)行文件
redis-server
, 并將文件復(fù)制到
cluster-test
文件夾, 然后使用類(lèi)似以下命令, 在每個(gè)標(biāo)簽頁(yè)中打開(kāi)一個(gè)實(shí)例:
cd 7000
../redis-server ./redis.
conf
實(shí)例打印的日志顯示,
因?yàn)?/span> nodes.conf
文件不存在, 所以每個(gè)節(jié)點(diǎn)都為它自身指定了一個(gè)新的
ID
:
[
82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1
實(shí)例會(huì)一直使用同一個(gè) ID
, 從而在集群中保持一個(gè)獨(dú)一無(wú)二(
unique
)的名字。
搭建集群
現(xiàn)在我們已經(jīng)有了六個(gè)正在運(yùn)行中的 Redis
實(shí)例, 接下來(lái)我們需要使用這些實(shí)例來(lái)創(chuàng)建集群, 并為每個(gè)節(jié)點(diǎn)編寫(xiě)配置文件。
通過(guò)使用 Redis
集群命令行工具
redis-trib
, 編寫(xiě)節(jié)點(diǎn)配置文件的工作可以非常容易地完成:
redis-trib
位于
Redis
源碼的
src
文件夾中, 它是一個(gè)
Ruby
程序, 這個(gè)程序通過(guò)向?qū)嵗l(fā)送特殊命令來(lái)完成創(chuàng)建新集群, 檢查集群, 或者對(duì)集群進(jìn)行重新分片(
reshared
)等工作。
./
redis-trib.rb
create
--replicas
1
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
127.0.0.1:7004
127.0.0.1:7005
這個(gè)命令在這里用于創(chuàng)建一個(gè)新的集群,
選項(xiàng)
–replicas 1
表示我們希望為集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建一個(gè)從節(jié)點(diǎn)。
之后跟著的其他參數(shù)則是這個(gè)集群實(shí)例的地址列表,3
個(gè)
master3
個(gè)
slave redis-trib
會(huì)打印出一份預(yù)想中的配置給你看, 如果你覺(jué)得沒(méi)問(wèn)題的話, 就可以輸入
yes
,
redis-trib
就會(huì)將這份配置應(yīng)用到集群當(dāng)中
,
讓各個(gè)節(jié)點(diǎn)開(kāi)始互相通訊
,
最后可以得到如下信息:
[OK]
All
16384
slots
covered
這表示集群中的 16384
個(gè)槽都有至少一個(gè)主節(jié)點(diǎn)在處理, 集群運(yùn)作正常。
集群
cluster info
:打印集群的信息
cluster nodes
:列出集群當(dāng)前已知的所有節(jié)點(diǎn)(
node
),以及這些節(jié)點(diǎn)的相關(guān)信息。
節(jié)點(diǎn)
cluster meet <
ip> <
port>
:將
ip
和
port
所指定的節(jié)點(diǎn)添加到集群當(dāng)中,讓它成為集群的一份子。
cluster forget <
node_id>
:從集群中移除
node_id
指定的節(jié)點(diǎn)。
cluster replicate <
node_id>
:將當(dāng)前節(jié)點(diǎn)設(shè)置為
node_id
指定的節(jié)點(diǎn)的從節(jié)點(diǎn)。
cluster saveconfig
:將節(jié)點(diǎn)的配置文件保存到硬盤(pán)里面。
槽(slot)
cluster addslots <
slot> [slot ...]
:將一個(gè)或多個(gè)槽(
slot
)指派(
assign
)給當(dāng)前節(jié)點(diǎn)。
cluster delslots <
slot> [slot ...]
:移除一個(gè)或多個(gè)槽對(duì)當(dāng)前節(jié)點(diǎn)的指派。
cluster flushslots
:移除指派給當(dāng)前節(jié)點(diǎn)的所有槽,讓當(dāng)前節(jié)點(diǎn)變成一個(gè)沒(méi)有指派任何槽的節(jié)點(diǎn)。
cluster setslot <
slot> node <
node_id>
:將槽
slot
指派給
node_id
指定的節(jié)點(diǎn),如果槽已經(jīng)指派給另一個(gè)節(jié)點(diǎn),那么先讓另一個(gè)節(jié)點(diǎn)刪除該槽
>
,然后再進(jìn)行指派。
cluster setslot <
slot> migrating <
node_id>
:將本節(jié)點(diǎn)的槽
slot
遷移到
node_id
指定的節(jié)點(diǎn)中。
cluster setslot <
slot> importing <
node_id>
:從
node_id
指定的節(jié)點(diǎn)中導(dǎo)入槽
slot
到本節(jié)點(diǎn)。
cluster setslot <
slot> stable
:取消對(duì)槽
slot
的導(dǎo)入(
import
)或者遷移(
migrate
)。
鍵
cluster keyslot
:計(jì)算鍵
key
應(yīng)該被放置在哪個(gè)槽上。
cluster countkeysinslot
:返回槽
slot
目前包含的鍵值對(duì)數(shù)量。
cluster getkeysinslot
:返回
count
個(gè)
slot
槽中的鍵
使用集群
測(cè)試 Redis
集群比較簡(jiǎn)單的辦法就是使用
redis-rb-cluster
或者
redis-cli
, 接下來(lái)我們將使用
redis-cli
為例來(lái)進(jìn)行演示:
$ redis-cli -c -p 7000
redis 127.0.0.1:7000>
set foo bar
-> Redirected
to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002>
set hello world
-> Redirected
to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000>
get foo
-> Redirected
to slot [12182] located at 127.0.0.1:7002"bar"
redis 127.0.0.1:7000>
get hello
-> Redirected
to slot [866] located at 127.0.0.1:7000"world"
添加一個(gè)從節(jié)點(diǎn)
有兩種方法添加從節(jié)點(diǎn),可以像添加主節(jié)點(diǎn)一樣使用redis-trib
命令,也可以像下面的例子一樣使用
–slave
選項(xiàng)
:
./
redis-trib.rb
add-node
--slave
127.0.0.1:7006
127.0.0.1:7000
此處的命令和添加一個(gè)主節(jié)點(diǎn)命令類(lèi)似,此處并沒(méi)有指定添加的這個(gè)從節(jié)點(diǎn)的主節(jié)點(diǎn),這種情況下系統(tǒng)會(huì)在其他的復(fù)制集中的主節(jié)點(diǎn)中隨機(jī)選取一個(gè)作為這個(gè)從節(jié)點(diǎn)的主節(jié)點(diǎn)。
你可以通過(guò)下面的命令指定主節(jié)點(diǎn):
./
redis-trib.rb
add-node
--slave
--master-id
3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
127.0.0.1:7006
127.0.0.1:7000
也可以使用CLUSTER REPLICATE
命令添加
.
這個(gè)命令也可以改變一個(gè)從節(jié)點(diǎn)的主節(jié)點(diǎn)。
例如,要給主節(jié)點(diǎn) 127.0.0.1:7005
添加一個(gè)從節(jié)點(diǎn),該節(jié)點(diǎn)哈希槽的范圍
1423-16383,
節(jié)點(diǎn)
ID 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,
我們需要鏈接新的節(jié)點(diǎn)(已經(jīng)是空的主節(jié)點(diǎn))并執(zhí)行命令
:
redis 127.0.0.1:7006>
cluster
replicate 3
c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
我們新的從節(jié)點(diǎn)有了一些哈希槽,其他的節(jié)點(diǎn)也知道(過(guò)幾秒后會(huì)更新他們自己的配置),可以使用如下命令確認(rèn):
$ redis-cli -p 7000 cluster nodes | grep slave | grep 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
f093c80dde814da99c5cf72a7dd01590792b783b 127.0.0.1:7006 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617702 3 connected2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617198 3 connected
節(jié)點(diǎn) 3c3a0c…
有兩個(gè)從節(jié)點(diǎn),
7002 (
已經(jīng)存在的
)
和
7006 (
新添加的
).
移除一個(gè)節(jié)點(diǎn)
只要使用
del-node
命令即可:
./redis-trib del-node 127.0.0.1:7000 ``
第一個(gè)參數(shù)是任意一個(gè)節(jié)點(diǎn)的地址,
第二個(gè)節(jié)點(diǎn)是你想要移除的節(jié)點(diǎn)地址。
使用同樣的方法移除主節(jié)點(diǎn),
不過(guò)在移除主節(jié)點(diǎn)前,需要
確保這個(gè)主節(jié)點(diǎn)是空的 .
如果不是空的
,
需要將這個(gè)節(jié)點(diǎn)的數(shù)據(jù)重新分片到其他主節(jié)點(diǎn)上
.
替代移除主節(jié)點(diǎn)的方法是手動(dòng)執(zhí)行故障恢復(fù),被移除的主節(jié)點(diǎn)會(huì)作為一個(gè)從節(jié)點(diǎn)存在,不過(guò)這種情況下不會(huì)減少集群節(jié)點(diǎn)的數(shù)量,也需要重新分片數(shù)據(jù)。
來(lái)源: Linux
公社