高性能 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ì)列中的命令沒有提交之前都不會(huì)實(shí)際的被執(zhí)行忍坷,因?yàn)槭聞?wù)提交前任何指令都不會(huì)被實(shí)際執(zhí)行粘舟,沒有數(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í)行沒有關(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)闆]有完善的隔離性可能會(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:主題硫眯,廣播

常見的消息系統(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í)沒有訂閱者或者訂閱者發(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)聽所有 redis 節(jié)點(diǎn)的健康狀況,所有 redis 節(jié)點(diǎn)會(huì)定時(shí)發(fā)送心跳給哨兵
  • 監(jiān)聽 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ù)量的哨兵沒有收到心跳阔拳,就認(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)聽器:主節(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)系作者
  • 序言:七十年代末架专,一起剝皮案震驚了整個(gè)濱河市同窘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌部脚,老刑警劉巖想邦,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異委刘,居然都是意外死亡丧没,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門锡移,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呕童,“玉大人,你說(shuō)我怎么就攤上這事淆珊±郑” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵套蒂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我茫蛹,道長(zhǎng)操刀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任婴洼,我火速辦了婚禮骨坑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柬采。我一直安慰自己欢唾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布粉捻。 她就那樣靜靜地躺著礁遣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肩刃。 梳的紋絲不亂的頭發(fā)上祟霍,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音盈包,去河邊找鬼沸呐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呢燥,可吹牛的內(nèi)容都是我干的崭添。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼叛氨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呼渣!你這毒婦竟也來(lái)了棘伴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤徙邻,失蹤者是張志新(化名)和其女友劉穎排嫌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缰犁,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淳地,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帅容。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颇象。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖并徘,靈堂內(nèi)的尸體忽然破棺而出遣钳,到底是詐尸還是另有隱情,我是刑警寧澤麦乞,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布蕴茴,位于F島的核電站,受9級(jí)特大地震影響姐直,放射性物質(zhì)發(fā)生泄漏倦淀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一声畏、第九天 我趴在偏房一處隱蔽的房頂上張望撞叽。 院中可真熱鬧,春花似錦插龄、人聲如沸愿棋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至料滥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間见秤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工真椿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹃答,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓突硝,卻偏偏與公主長(zhǎng)得像测摔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容