高性能 key-value 內(nèi)存數(shù)據(jù)庫(kù) —— Redis

一、安裝

??下載安裝包,解壓

tar -zxvf redis-3.0.5.tar.gz

??進(jìn)入解壓目錄,編譯,安裝

cd redis-3.0.5
# 編譯
make
# 安裝(指定安裝目錄)
make PREFIX=/root/training/redis install

??安裝目錄下的命令腳本如下

??其作用如下:

指令 作用
redis-benchmark 壓力測(cè)試工具
redis-check-aof 檢查AOF文件
redis-check-dump 檢查RDB文件
redis-cli 客戶端
redis-sentinel -> redis-server 哨兵,實(shí)現(xiàn)了HA的功能
redis-server 啟動(dòng)Redis服務(wù)器

??修改配置文件(默認(rèn)不存在,從編譯目錄中拷貝)

mkdir -p /root/training/redis/conf
cp redis-3.0.5/redis.conf /root/training/redis

??進(jìn)入 redis.conf,編輯修改

...
# redis是否在后臺(tái)啟動(dòng),默認(rèn)為no
daemonize yes
...

??啟動(dòng) redis

bin/redis-server

??看到 redis logo 啟動(dòng)成功,默認(rèn)端口為 6379,如下圖所示:




二、數(shù)據(jù)類型

三、事務(wù)與消息機(jī)制

1、基本概念

??Redis 對(duì)事務(wù)的支持目前還比較簡(jiǎn)單。

??Redis 只能保證一個(gè) client 發(fā)起的事務(wù)中的命令可以連續(xù)地執(zhí)行,而中間不會(huì)插入其他 client 的命令。由于 redis 是單線程來(lái)處理 client 的請(qǐng)求的所以做到這點(diǎn)是很容易的。一般情況下 redis 在接收到一個(gè) client 發(fā)來(lái)的命令后會(huì)立即處理并返回處理結(jié)果,但是當(dāng)一個(gè) client 在一個(gè)連接中發(fā)出 multi 命令時(shí),這個(gè)連接會(huì)進(jìn)入一個(gè)事務(wù)上下文,該連接后續(xù)的命令并不是立即執(zhí)行,而是先放到一個(gè)隊(duì)列中。當(dāng)此連接接收到 exec 命令后,redis 會(huì)順序地執(zhí)行隊(duì)列中的所有命令,并將所有命令的運(yùn)行結(jié)果打包到一起返回給 client,然后連接就結(jié)束事務(wù)上下文。


2、特性和對(duì)比

redis 事務(wù)和數(shù)據(jù)庫(kù)事務(wù)的區(qū)別

操作 redis mysql/oracle
開啟事務(wù) multi 自動(dòng)開啟事務(wù)(事務(wù)中的第一條DML)
執(zhí)行操作 指令 DML語(yǔ)句
提交事務(wù) exec commit
回滾事務(wù) discard rollback
事務(wù)本質(zhì) 將操作放入隊(duì)列,執(zhí)行批處理 將操作寫入日志

??Redis 不滿足數(shù)據(jù)庫(kù)的 ACID 特性:

  • 原子性:原子性要求事務(wù)中的多條指令或操作要么全部執(zhí)行成功,要么全部不執(zhí)行(回滾),而 redis 事務(wù)中某條指令的執(zhí)行失敗不會(huì)影響其他指令的執(zhí)行(PS.語(yǔ)法錯(cuò)誤除外),因此可能出現(xiàn)部分指令成功部分指令失敗的情況,不滿足原子性要求。
  • 隔離性:redis 處理指令和事務(wù)時(shí)是單線程處理的,事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行。事務(wù)在執(zhí)行的過(guò)程中,不會(huì)被其他客戶端發(fā)送來(lái)的命令請(qǐng)求所打斷;隊(duì)列中的命令沒(méi)有提交之前都不會(huì)實(shí)際的被執(zhí)行,因?yàn)槭聞?wù)提交前任何指令都不會(huì)被實(shí)際執(zhí)行,沒(méi)有數(shù)據(jù)庫(kù)隔離級(jí)別的概念,因此也不需要考慮 “事務(wù)內(nèi)的查詢要看到事務(wù)里的更新,在事務(wù)外查詢不能看到” 這種問(wèn)題。
  • 一致性:原子性和一致性往往是孿生的,多個(gè)指令不能原子地被執(zhí)行,自然不能滿足一致性。
  • 持久性:Redis 是一個(gè)基于內(nèi)存的鍵值對(duì) NOSQL 數(shù)據(jù)庫(kù),雖然有數(shù)據(jù)持久化的特性(AOF、RDB),但是跟事務(wù)的執(zhí)行沒(méi)有關(guān)系,是分離割裂開的,事務(wù)執(zhí)行成功時(shí),數(shù)據(jù)可能依然還在內(nèi)存中,有丟失的風(fēng)險(xiǎn)。

演示:

??tom 轉(zhuǎn)賬給 mike





四、鎖機(jī)制

??redis 事務(wù)不具備完善的 ACID 特性,除了說(shuō)可能部分成功部分失敗導(dǎo)致不滿足原子性和一致性外,還因?yàn)闆](méi)有完善的隔離性可能會(huì)導(dǎo)致一些問(wèn)題。

??現(xiàn)在有一個(gè)買票的事務(wù)場(chǎng)景,買票事務(wù)中,有兩個(gè)指令,一個(gè)是扣錢,一個(gè)是票數(shù)減一,用 redis 事務(wù)來(lái)表達(dá)如下:

# 初始化數(shù)據(jù)
set ticket 1
set tom 100

# 開啟事務(wù)
multi
decr tocket
decrby tom 100
exec

??事務(wù)執(zhí)行成功后,應(yīng)該是票數(shù)減1,錢減100,但是如果在事務(wù)執(zhí)行之前,有另一個(gè)指令線程提前執(zhí)行了買票的操作,則當(dāng)事務(wù)執(zhí)行時(shí),票數(shù)已為 0,這時(shí)候再執(zhí)行事務(wù)買票票數(shù)會(huì)變成 -1,很明顯的非法和異常數(shù)據(jù)。

??在數(shù)據(jù)庫(kù)中也存在這種并發(fā)時(shí)序的問(wèn)題,它是通過(guò)隔離級(jí)別來(lái)實(shí)現(xiàn)不同事務(wù)之間不互相干擾的,如果涉及到對(duì)數(shù)據(jù)的修改,則會(huì)對(duì)修改的數(shù)據(jù)行加上一個(gè)行鎖,這是個(gè)悲觀鎖,在加鎖的事務(wù)釋放鎖之前,其他搶鎖的事務(wù)會(huì)被阻塞。

??而在 redis 中,通過(guò) watch 命令實(shí)現(xiàn)的加鎖機(jī)制是樂(lè)觀鎖,即不會(huì)加鎖事務(wù)并不會(huì)鎖死數(shù)據(jù),但是如果其他事務(wù)在本事務(wù)執(zhí)行之前提前修改了被加鎖的數(shù)據(jù),則加鎖事務(wù)會(huì)回滾執(zhí)行失敗,這樣就保證了數(shù)據(jù)的一致性。

??改進(jìn)一下上面的事務(wù)





五、消息機(jī)制

消息系統(tǒng)的類型

??同步消息:需要等待對(duì)方的回答,eg:ATM
??異步消息:不需要等待對(duì)方的聊天,eg:聊天室


消息傳播的類型

Queue:隊(duì)列,點(diǎn)對(duì)點(diǎn)
Topic:主題,廣播

常見(jiàn)的消息系統(tǒng)

Redis:只支持 Topic
Kafka:只支持 Topic
JMS:Java Message Service 是 J2EE 中的一個(gè)標(biāo)準(zhǔn)(Queue、Topic 都支持),產(chǎn)品:weblogic


命令

publish:發(fā)布消息(指定頻道)
subscribe:訂閱消息(指定頻道)
psubscribe:訂閱消息(使用通配符指定頻道)


??常規(guī)消息發(fā)布訂閱

??使用通配符訂閱

??Redis 的消息機(jī)制存在一個(gè)嚴(yán)重的缺陷,假如消息發(fā)布者發(fā)布時(shí)沒(méi)有訂閱者或者訂閱者發(fā)生故障,那么這條消息就永遠(yuǎn)丟失了,即使訂閱者后面上線或者恢復(fù)正常。




六、持久化

??redis 跟 memcache 相比的優(yōu)點(diǎn)之一就是具有持久化特性,這使得它更有資格被稱為一個(gè) NOSQL 數(shù)據(jù)庫(kù),而 memcache 更多只能叫一個(gè)鍵值對(duì)緩存。

??redis 提供了兩種數(shù)據(jù)持久化機(jī)制:RDB、AOF。

1、RDB 持久化

??RDB 持久化可以在指定 的時(shí)間間隔內(nèi)生成數(shù)據(jù)集的時(shí)間快照點(diǎn)(point-in-time-snapshot)。

工作原理

??每隔一段時(shí)間給內(nèi)存照一個(gè)快照,將內(nèi)存中的數(shù)據(jù)寫入文件(rdb文件)。

配置(默認(rèn))

# save <seconds> <changes>
# 在多少秒內(nèi)發(fā)生了多少次寫操作,則執(zhí)行一次RDB   
save 900 1
save 300 10
save 60 10000

# 后臺(tái)保存RDB報(bào)錯(cuò)時(shí)是否停止處理客戶端的寫請(qǐng)求
stop-writes-on-bgsave-error yes

# 保存數(shù)據(jù)到RDB文件時(shí)是否壓縮數(shù)據(jù)
# 不建議開啟壓縮,會(huì)影響性能特別是數(shù)據(jù)恢復(fù)時(shí)
rdbcompression yes

# RDB文件名
dbfilename dump.rdb

# RDB文件所在目錄
dir ./


優(yōu)缺點(diǎn)

??RDB 的優(yōu)點(diǎn)是數(shù)據(jù)恢復(fù)快,缺點(diǎn)是在兩次生成兩次 RDB 快照之間,假如發(fā)生斷電等故障,可能造成數(shù)據(jù)的丟失,所以要根據(jù)讀寫并發(fā)度和能夠容忍的丟失數(shù)據(jù)對(duì)配置進(jìn)行調(diào)整。


2、AOF 持久化

??AOF(Append Only File)持久化記錄服務(wù)器執(zhí)行的所有寫操作命令,并在服務(wù)器啟動(dòng)時(shí),通過(guò)重新執(zhí)行這些命令來(lái)還原數(shù)據(jù)集。AOF 文件中的命令全部以 Redis 協(xié)議的格式來(lái)保存,新命令會(huì)被追加到文件的末尾。Redis 還可以在后臺(tái)對(duì) AOF 文件進(jìn)行重寫(rewrite),使得 AOF 文件的體積不會(huì)超出保存數(shù)據(jù)集狀態(tài)所需的實(shí)際大小。

工作原理

??記錄操作的命令

相關(guān)配置(redis.conf)

# 是否啟用 AOF
appendonly no

# AOF文件名
appendfilename "appendonly.aof"

# AOF同步頻率
# (1)每條操作都寫入日志
# appendfsync always
# (2)每秒寫入一次
appendfsync everysec
# (3)由操作系統(tǒng)決定什么時(shí)候?qū)懭肴罩?# appendfsync no

# AOF重寫時(shí),是否不寫入AOF
no-appendfsync-on-rewrite no

# 當(dāng)AOF文件超過(guò)上次重寫大小多大比例時(shí),自動(dòng)觸發(fā)AOF重寫
auto-aof-rewrite-percentage 100
# 當(dāng)AOF文件超過(guò)多大時(shí),觸發(fā)AOF重寫
auto-aof-rewrite-min-size 64mb

??默認(rèn)情況下,AOF是不開啟的,將 appendonly 參數(shù)設(shè)置為 yes,重啟 redis 服務(wù)即可,啟動(dòng)后就會(huì)在 redis 目錄下生成 appendonly.aof 文件。

??如果啟用了 AOF,則 redis 啟動(dòng)時(shí)會(huì)優(yōu)先讀取 aof 文件。對(duì)于 redis 4.0 之前的版本來(lái)說(shuō),aof 必須是全量版本,因?yàn)閱?dòng)時(shí)不會(huì)讀取 rdb 文件的內(nèi)容;對(duì)于 redis 4.0+ 版本,會(huì)結(jié)合兩者的優(yōu)勢(shì),利用 rdb 加載快的特點(diǎn)并周期性地進(jìn)行更新數(shù)據(jù)快照,并且在兩次 rdb 之間用 aof 來(lái)保存操作命令,這樣最大程度地減少數(shù)據(jù)丟失的可能性。

??aof 文件剛生成時(shí)大小為0,執(zhí)行寫操作指令后大小發(fā)生變化。

??對(duì)于同步的頻率,如果想獲得最強(qiáng)的安全性,可以設(shè)置 appendfsync 參數(shù)為 always,表示每次發(fā)生寫操作時(shí)都馬上同步到 aof 文件中,但性能最低,一般不會(huì)設(shè)置為該值;設(shè)置為 no,表示寫操作命令會(huì)放入緩沖區(qū)中,并由操作系統(tǒng)決定什么時(shí)候持久化到磁盤,這樣可以讓操作系統(tǒng)在相對(duì)空閑時(shí)才做該操作,但是不可預(yù)估,一旦服務(wù)器發(fā)生故障,很難預(yù)估丟失的數(shù)據(jù)規(guī)模和影響范圍;默認(rèn)且一般情況下,參數(shù)設(shè)置為 second,表示每秒同步一次,這樣即使服務(wù)器發(fā)生故障,最多丟失一秒的數(shù)據(jù)。

重寫

??由于 AOF 會(huì)將所有的寫操作命令寫入到文件中,因此文件大小會(huì)膨脹得很快,重寫(rewrite)可以有效壓縮 AOF 文件大小,其原理就是對(duì)同個(gè) key 的多次寫操作,可以在 AOF 文件中被壓縮為一條指令,比如:

set key v1
set key v2
...
set key v100

??可以被壓縮為 set key v100,這樣就減小了 AOF 文件大小。

??使用 redis 自帶的壓力測(cè)試工具來(lái)模擬演示 AOF 重寫導(dǎo)致的文件大小的變化

# 表示執(zhí)行10w個(gè)操作
bin/redis-benchmark -n 100000

??文件大小膨脹到50多M,如果上述的 auto-aof-rewrite-min-size 參數(shù)是有效的,則再做10w筆壓力測(cè)試將看到文件大小達(dá)到64M之后會(huì)被壓縮。



優(yōu)缺點(diǎn)

??保證數(shù)據(jù)安全,但是恢復(fù)慢。




七、集群

1、主從復(fù)制

??Redis 提供了復(fù)制功能來(lái)自動(dòng)實(shí)現(xiàn)多臺(tái) redis 服務(wù)器的數(shù)據(jù)同步。

??可以通過(guò)部署多臺(tái) redis,并在配置文件中指定這幾臺(tái) redis 之間的主從關(guān)系,主負(fù)責(zé)寫入數(shù)據(jù),同時(shí)把寫入的數(shù)據(jù)實(shí)時(shí)同步到從機(jī)器,這種模式叫主從復(fù)制,即 master/slave,并且 redis 默認(rèn) master 用于寫,slave 用于讀,向 slave 寫數(shù)據(jù)會(huì)導(dǎo)致錯(cuò)誤。

??Redis 主從復(fù)制的架構(gòu)有星型、線型兩種。

??兩種架構(gòu)各有優(yōu)缺點(diǎn)。對(duì)于星型來(lái)說(shuō),由于每個(gè) salve 到 master 的距離是相等的,所以數(shù)據(jù)同步的效率較高,但是當(dāng) master 故障時(shí),選擇哪個(gè)從節(jié)點(diǎn)稱為新的主節(jié)點(diǎn)比較麻煩,因?yàn)椴恢滥膫€(gè) salve 中的數(shù)據(jù)滯后更??;對(duì)于線型來(lái)說(shuō),越往后的 salve 數(shù)據(jù)同步越滯后,數(shù)據(jù)同步效率低,但是 master 故障時(shí)只需要選最近的 slave 稱為新的主節(jié)點(diǎn)即可。在實(shí)際應(yīng)用中,星型架構(gòu)更加普遍。

??下面使用 192.168.190.111 機(jī)器,在上面啟動(dòng)三個(gè) redis 服務(wù)端進(jìn)程組成偽分布集群,模擬星型主從復(fù)制架構(gòu)。使用不同端口號(hào)區(qū)分,master 使用 6379,兩個(gè) salve 使用 6380、6381。

??master 負(fù)責(zé)寫入數(shù)據(jù)和同步數(shù)據(jù)到 salve,并且不負(fù)責(zé)數(shù)據(jù)的持久化,因此持久化比較消耗性能;salve 負(fù)責(zé)從 master 同步數(shù)據(jù),處理客戶端的讀請(qǐng)求,并且進(jìn)行數(shù)據(jù)的持久化。

??master 的配置 redis6379.conf 如下:

...
# 端口
port 6379

# 關(guān)閉RDB功能
#save 900 1
#save 300 10
#save 60 10000

# 關(guān)閉AOF功能
appendonly no
...

??salve 1 的配置 redis6380.conf 如下:

...
# 端口
port 6380

dbfilename dump6380.rdb

appendfilename "appendonly6380.aof"

slaveof 192.168.190.111 6379
...

??salve 2 的配置 redis6381.conf 如下:

...
# 端口
port 6381

dbfilename dump6381.rdb

appendfilename "appendonly6381.aof"

slaveof 192.168.190.111 6379
...

??分別啟動(dòng)三個(gè) redis 節(jié)點(diǎn)

[root@bigdata111 redis]# bin/redis-server conf/redis6379.conf 
[root@bigdata111 redis]# bin/redis-server conf/redis6380.conf 
[root@bigdata111 redis]# bin/redis-server conf/redis6381.conf 

??測(cè)試 master 寫入的數(shù)據(jù)是否同步到 salve

??嘗試往從節(jié)點(diǎn)中寫入數(shù)據(jù)會(huì)報(bào)錯(cuò)

??在集群內(nèi)部,主從節(jié)點(diǎn)通信的過(guò)程如下



2、分片

??對(duì) Redis 集群,客戶端讀請(qǐng)求會(huì)主要交給從節(jié)點(diǎn)處理,從節(jié)點(diǎn)有多個(gè),客戶端發(fā)起讀請(qǐng)求時(shí),直接與從節(jié)點(diǎn)通信不方便,所以中間還應(yīng)該有個(gè)代理服務(wù)器來(lái)轉(zhuǎn)發(fā)請(qǐng)求。

??TwemProxy 就是一種 Redis 代理分片機(jī)制,由 Twitter 開源。Twemproxy 作為一種代理,可接受來(lái)自多個(gè)程序的訪問(wèn),按照路由規(guī)則,轉(zhuǎn)發(fā)給后臺(tái)的各個(gè) Redis 服務(wù)器,再原路返回,該方案很好地解決了單個(gè) Redis 實(shí)例承載能力的問(wèn)題。

??下面演示 Twemproxy 的使用。

??解壓安裝包

tar -zxvf nutcracker-0.3.0.tar.gz

??編譯安裝

cd nutcracker-0.3.0
./configure --prefix=/root/training/proxy
make
make install

??配置,在安裝目錄下創(chuàng)建配置目錄,并從解壓目錄下拷貝配置文件

cd /root/training/proxy
mkdir conf
cp /root/tools/nutcracker-0.3.0/conf/nutcracker.yml conf/nutcracker.yml

??修改配置文件

alpha:
  listen: 127.0.0.1:22121
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 192.168.190.111:6380:1
   - 192.168.190.111:6381:1
   
beta:
  listen: 192.168.190.111:22121
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 192.168.190.111:6380:1
   - 192.168.190.111:6381:1   

??檢測(cè)配置文件格式是否有誤

sbin/nutcracker -t conf/nutcracker.yml

??啟動(dòng) Twemproxy 服務(wù)

sbin/nutcracker -d -c conf/nutcracker.yml

??啟動(dòng)客戶端向22121端口發(fā)起請(qǐng)求




3、HA哨兵

??Redis 從 2.4+ 版本開始就自帶了一個(gè)實(shí)現(xiàn) HA 的 sentinel,可以將 sentinel 看成是 redis 專用的 zookeeper。

??哨兵的職責(zé)主要有:

  • 監(jiān)聽(tīng)所有 redis 節(jié)點(diǎn)的健康狀況,所有 redis 節(jié)點(diǎn)會(huì)定時(shí)發(fā)送心跳給哨兵
  • 監(jiān)聽(tīng) Master 的心跳,如果 Master 掛掉了,則負(fù)責(zé)切換,從所有從節(jié)點(diǎn)中選舉出一個(gè)最合適的 Slave 稱為新的 Master,并對(duì)集群發(fā)布廣播,讓剩下的 Slave 都成為新的 Master 的從節(jié)點(diǎn)

??下面演示如何配置和使用哨兵:

??將安裝包解壓目錄下的 sentinel.conf 復(fù)制到安裝配置目錄下

cp sentinel.conf ~/training/redis/conf/

??修改配置文件

...
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
#
# 最后一個(gè)參數(shù)表示,只要有指定數(shù)量的哨兵沒(méi)有收到心跳,就認(rèn)為該redis節(jié)點(diǎn)已經(jīng)死掉了
#
# sentinel monitor mymaster 127.0.0.1 6379 2
sentinel monitor mymaster 127.0.0.1 6379 1
...

??啟動(dòng)哨兵

bin/redis-sentinel conf/sentinel.conf

??現(xiàn)在通過(guò)殺死主節(jié)點(diǎn)進(jìn)程的方式模擬主節(jié)點(diǎn)故障,觸發(fā)哨兵選舉新主節(jié)點(diǎn)的過(guò)程。默認(rèn)情況下,需要 30s 的超時(shí)時(shí)間哨兵才會(huì)正式認(rèn)定主節(jié)點(diǎn)故障,

??可以看到哨兵認(rèn)定主節(jié)點(diǎn)故障后,觸發(fā)了選舉,最終選舉 6381 的從節(jié)點(diǎn)為新的節(jié)點(diǎn),并且讓 6280 從節(jié)點(diǎn)認(rèn)定其為新的主節(jié)點(diǎn)。

【相關(guān)參數(shù)】

# 哨兵監(jiān)聽(tīng)器:主節(jié)點(diǎn)IP、端口、節(jié)點(diǎn)失效法定哨兵數(shù)
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 192.168.190.111 6379 1

# 設(shè)置連接 master 和 slave 時(shí)的密碼
# sentinel auth-pass <master-name> <password>

# 主節(jié)點(diǎn)失效時(shí)間
# sentinel down-after-milliseconds <master-name> <milliseconds>

# 指定在發(fā)生 failover 主備切換時(shí)最多可以有多少個(gè) salve 同時(shí)對(duì) master 進(jìn)行
# sentinel parallel-syncs <master-name> <numslaves>



4、RedisCluster

??Redis Cluster 是 redis 的分布式解決方案,在 Redis 3.0 版本時(shí)推出,有效解決了 Redis 分布式方面的需求,當(dāng)遇到單機(jī)內(nèi)存、并發(fā)、流量等瓶頸時(shí),可以使用 Cluster 架構(gòu)達(dá)到負(fù)載均衡的目的。

為什么需要 Redis Cluster?

  • 高可用
  • 性能容量
  • 并發(fā)性能問(wèn)題:redis 單實(shí)例10w并發(fā)有上限

Redis Cluster 優(yōu)勢(shì)

  • 官方推薦
  • 去中心化,集群最大可增加1000個(gè)節(jié)點(diǎn),性能隨節(jié)點(diǎn)增加而線性擴(kuò)展
  • 管理方便,后續(xù)可自行增加或摘除節(jié)點(diǎn),移動(dòng)分槽等等
  • 簡(jiǎn)單易上手

Redis Cluster 架構(gòu)

分布式數(shù)據(jù)庫(kù)首要解決把整個(gè)數(shù)據(jù)集按照分區(qū)規(guī)則映射到多個(gè)節(jié)點(diǎn)的問(wèn)題,即把數(shù)據(jù)集劃分到多個(gè)節(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)的一個(gè)子集。常用的分區(qū)規(guī)則有哈希分區(qū)和順序分區(qū)。

Redis Cluster 采用哈希分區(qū)規(guī)則,采用虛擬槽分區(qū),所有的鍵根據(jù)哈希函數(shù)映射到0~16383,計(jì)算公式:slot = CRC16(key) & 16383。每個(gè)節(jié)點(diǎn)負(fù)責(zé)維護(hù)一部分槽以及槽所映射的鍵值數(shù)據(jù)。


部署 Redis Cluster

??這里使用6個(gè)節(jié)點(diǎn)來(lái)構(gòu)建集群,由于使用同一臺(tái)服務(wù)器,所以使用不同端口,架構(gòu)圖如下:

(1)手動(dòng)創(chuàng)建

① 安裝Ruby環(huán)境和Ruby Redis接口**

??由于創(chuàng)建和管理需要使用到redis-trib 工具,該工具位于 Redis 源碼的 src 文件夾中, 它是一個(gè) Ruby 程序, 這個(gè)程序通過(guò)向?qū)嵗l(fā)送特殊命令來(lái)完成創(chuàng)建新集群,檢查集群,或者對(duì)集群進(jìn)行重新分片(reshared)等工作,所以需要安裝Ruby環(huán)境和相應(yīng)的Redis接口?。

??安裝 ruby 環(huán)境

yum -y install ruby

??安裝 Redis ruby 接口

gem install redis-3.0.5.gem

② 節(jié)點(diǎn)配置啟動(dòng)

??創(chuàng)建6個(gè)配置文件,以 redis-cluster-6379.conf 為例,將相關(guān)配置項(xiàng)修改如下:

...
# 端口
port 6379

# 啟用集群
cluster-enabled ye
# 在redis安裝根目錄下創(chuàng)建nodes目錄
cluster-config-file nodes/nodes-6379.conf

# RDB
dbfilename dump6379.rdb

# AOF
appendfilename "appendonly6379.aof"

??啟動(dòng) Redis 實(shí)例

bin/redis-server conf/redis-cluster-6379.conf
bin/redis-server conf/redis-cluster-6380.conf
bin/redis-server conf/redis-cluster-6381.conf
bin/redis-server conf/redis-cluster-6382.conf
bin/redis-server conf/redis-cluster-6383.conf
bin/redis-server conf/redis-cluster-6384.conf

③ 創(chuàng)建集群主從節(jié)點(diǎn)

??將 redis-trib 工具復(fù)制到安裝目錄中

cp redis-3.0.5/src/redis-trib.rb ~/training/redis/bin

??設(shè)置主節(jié)點(diǎn)從節(jié)點(diǎn)數(shù)為1,為主節(jié)點(diǎn)設(shè)置從節(jié)點(diǎn)

bin/redis-trib.rb create --replicas 1 192.168.190.111:6379 192.168.190.111:6380 192.168.190.111:6381 192.168.190.111:6382 192.168.190.111:6383 192.168.190.111:6384

④ 測(cè)試集群

??由于 key "Tom" 計(jì)算出來(lái)的槽為8919,屬于6380的主節(jié)點(diǎn)處理,所以請(qǐng)求被重定向到6380



(2)自動(dòng)創(chuàng)建

??使用的腳本位于安裝包解壓目錄中

cp redis-3.0.5/utils/create-cluster/create-cluster ~/training/redis/bin

??修改 create-cluster 腳本的路徑

??配置文件最前面的設(shè)置如下

# Settings
# 節(jié)點(diǎn)端口從30000開始
PORT=30000
TIMEOUT=2000
# 集群節(jié)點(diǎn)數(shù)為6個(gè)
NODES=6
# 6個(gè)節(jié)點(diǎn)中,3個(gè)是主節(jié)點(diǎn),3個(gè)是從節(jié)點(diǎn)
REPLICAS=1

??啟動(dòng)和創(chuàng)建redis集群

bin/create-cluster start
bin/create-cluster create
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容