
一、安裝
??下載安裝包,解壓
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