redis主从、哨兵、集群概念
關(guān)于redis主從、哨兵、集群的介紹網(wǎng)上很多,這里就不贅述了。
一、主從
通過持久化功能,Redis保證了即使在服務(wù)器重啟的情況下也不會損失(或少量損失)數(shù)據(jù),因?yàn)槌志没瘯褍?nèi)存中數(shù)據(jù)保存到硬盤上,重啟會從硬盤上加載數(shù)據(jù)。
。但是由于數(shù)據(jù)是存儲在一臺服務(wù)器上的,如果這臺服務(wù)器出現(xiàn)硬盤故障等問題,也會導(dǎo)致數(shù)據(jù)丟失。為了避免單點(diǎn)故障,通常的做法是將數(shù)據(jù)庫復(fù)制多個副本以部署在不同的服務(wù)器上,這樣即使有一臺服務(wù)器出現(xiàn)故障,其他服務(wù)器依然可以繼續(xù)提供服務(wù)。為此, Redis 提供了復(fù)制(replication)功能,可以實(shí)現(xiàn)當(dāng)一臺數(shù)據(jù)庫中的數(shù)據(jù)更新后,自動將更新的數(shù)據(jù)同步到其他數(shù)據(jù)庫上。
在復(fù)制的概念中,數(shù)據(jù)庫分為兩類,一類是主數(shù)據(jù)庫(master),另一類是從數(shù)據(jù)庫[1] (slave)。主數(shù)據(jù)庫可以進(jìn)行讀寫操作,當(dāng)寫操作導(dǎo)致數(shù)據(jù)變化時會自動將數(shù)據(jù)同步給從數(shù)據(jù)庫。而從數(shù)據(jù)庫一般是只讀的,并接受主數(shù)據(jù)庫同步過來的數(shù)據(jù)。一個主數(shù)據(jù)庫可以擁有多個從數(shù)據(jù)庫,而一個從數(shù)據(jù)庫只能擁有一個主數(shù)據(jù)庫。
主從數(shù)據(jù)庫的配置
master? slave
主不用配置,從redis的conf文件加入 slaveof ip port 就可以了
或者從redis啟動時? redis-server --port 6380 --slaveof 127.0.0.1 6379
??? 從數(shù)據(jù)庫一般是只讀,可以改為可寫,但寫入的數(shù)據(jù)很容易被主同步?jīng)],所以還是只讀就可以。
也可以在運(yùn)行是使用slaveof ip port命令,停止原來的主,切換成剛剛設(shè)置的主? slaveof no one會把自己變成主
復(fù)制原理
當(dāng)從數(shù)據(jù)庫啟動時,會向主數(shù)據(jù)庫發(fā)送sync命令,主數(shù)據(jù)庫接收到sync后開始在后臺報錯快照rdb,在保存快照期間受到的命名緩存起來,當(dāng)快照完成時,主數(shù)據(jù)庫會將快照和緩存的命令一塊發(fā)送給從。復(fù)制初始化結(jié)束。
之后,主每受到1個命令就同步發(fā)送給從。
當(dāng)出現(xiàn)斷開重連后,2.8之后的版本會將斷線期間的命令傳給重?cái)?shù)據(jù)庫。增量復(fù)制
主從復(fù)制是樂觀復(fù)制,當(dāng)客戶端發(fā)送寫執(zhí)行給主,主執(zhí)行完立即將結(jié)果返回客戶端,并異步的把命令發(fā)送給從,從而不影響性能。也可以設(shè)置至少同步給多少個從主才可寫。
無硬盤復(fù)制:如果硬盤效率低將會影響復(fù)制性能,2.8之后可以設(shè)置無硬盤復(fù)制,repl-diskless-sync yes
二、哨兵
當(dāng)主數(shù)據(jù)庫遇到異常中斷服務(wù)后,開發(fā)者可以通過手動的方式選擇一個從數(shù)據(jù)庫來升格為主數(shù)據(jù)庫,以使得系統(tǒng)能夠繼續(xù)提供服務(wù)。然而整個過程相對麻煩且需要人工介入,難以實(shí)現(xiàn)自動化。 為此,Redis 2.8中提供了哨兵工具來實(shí)現(xiàn)自動化的系統(tǒng)監(jiān)控和故障恢復(fù)功能。
哨兵的作用就是監(jiān)控redis主、從數(shù)據(jù)庫是否正常運(yùn)行,主出現(xiàn)故障自動將從數(shù)據(jù)庫轉(zhuǎn)換為主數(shù)據(jù)庫。
顧名思義,哨兵的作用就是監(jiān)控Redis系統(tǒng)的運(yùn)行狀況。它的功能包括以下兩個。
??? (1)監(jiān)控主數(shù)據(jù)庫和從數(shù)據(jù)庫是否正常運(yùn)行。
??? (2)主數(shù)據(jù)庫出現(xiàn)故障時自動將從數(shù)據(jù)庫轉(zhuǎn)換為主數(shù)據(jù)庫。
可以用info replication查看主從情況
例子:
1主2從? 1哨兵,可以用命令起也可以用配置文件里
可以使用雙哨兵,更安全,
redis-server --port 6379
redis-server --port 6380 --slaveof 192.168.0.167 6379
redis-server --port 6381 --slaveof 192.168.0.167 6379
redis-sentinel sentinel.conf
哨兵配置文件
??? sentinel.conf
??????? sentinel monitor mymaster 192.168.0.167 6379 1?
其中mymaster表示要監(jiān)控的主數(shù)據(jù)庫的名字,可以自己定義一個。這個名字必須僅由大小寫字母、數(shù)字和“.-_”這 3 個字符組成。后兩個參數(shù)表示主數(shù)據(jù)庫的地址和端口號,這里我們要監(jiān)控的是主數(shù)據(jù)庫6379。
注意:
??? 1、使用時不能用127.0.0.1,需要用真實(shí)IP,不然java程序通過哨兵會連到j(luò)ava程序所在的機(jī)器(127.0.0.1 )
??? 2、配置哨兵監(jiān)控一個系統(tǒng)時,只需要配置其監(jiān)控主數(shù)據(jù)庫即可,哨兵會自動發(fā)現(xiàn)所有復(fù)制該主數(shù)據(jù)庫的從數(shù)據(jù)庫
?
這樣哨兵就能監(jiān)控主6379和從6380、6381,一旦6379掛掉,哨兵就會在2個從中選擇一個作為主,根據(jù)優(yōu)先級選,如果一樣就選個id小的,當(dāng)6379再起來就作為從存在。
主從切換過程:
(1)????? slave leader升級為master
(2)????? 其他slave修改為新master的slave
(3)????? 客戶端修改連接
(4)????? 老的master如果重啟成功,變?yōu)樾耺aster的slave
哨兵監(jiān)控1主2從,停掉主,哨兵會選出1個從作為主,變成1主1從。然而當(dāng)我把原來的主再起來,它不會作為從,只是個獨(dú)立的節(jié)點(diǎn)。
如果在新的主剛被選出來時,我把原來的主起來,它就能成為新主的從節(jié)點(diǎn)。
如果在新的主選出來過一會再起原來的主,就不能成為新主的從節(jié)點(diǎn)
或者在老的主起來后,重啟哨兵也能把它變成從,哨兵配置文件里有,哨兵會執(zhí)行“+convert-to-slave”
這很奇怪,我也沒弄明白是怎么回事。
三、集群
即使使用哨兵,redis每個實(shí)例也是全量存儲,每個redis存儲的內(nèi)容都是完整的數(shù)據(jù),浪費(fèi)內(nèi)存且有木桶效應(yīng)。為了最大化利用內(nèi)存,可以采用集群,就是分布式存儲。即每臺redis存儲不同的內(nèi)容,
共有16384個slot。每個redis分得一些slot,hash_slot = crc16(key) mod 16384 找到對應(yīng)slot,鍵是可用鍵,如果有{}則取{}內(nèi)的作為可用鍵,否則整個鍵是可用鍵
集群至少需要3主3從,且每個實(shí)例使用不同的配置文件,主從不用配置,集群會自己選。
修改每個實(shí)例的配置文件:
??? cluster-enabled yes? --開啟集群
??? cluster-config-file nodes-6382.conf --集群配置文件名,每個實(shí)例配置的要不同,redis會根據(jù)文件名自動新建
用集群工具創(chuàng)建集群:
我們可以用集群工具進(jìn)行集群,該工具是redis源碼包中,用ruby編寫,所以需要先安裝ruby。
1、安裝rubygems
??? yum install ruby
??? yum install rubygems?
??? gem install redis
?
2、把6個redis實(shí)例都起來,每個實(shí)例的集群都打開。
3、redis安裝目錄的src執(zhí)行./redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
提示信息如下
[java] view plain copy輸入yes,這樣集群就建立了。
登錄任一臺redis,執(zhí)行 info cluster,提示cluster_enabled:1
集群過程:
首先redis-trib.rb會以客戶端的形式嘗試連接所有的節(jié)點(diǎn),并發(fā)送PING命令以確定節(jié)點(diǎn)能夠正常服務(wù)。如果有任何節(jié)點(diǎn)無法連接,則創(chuàng)建失敗。同時發(fā)送 INFO 命令獲取每個節(jié)點(diǎn)的運(yùn)行ID以及是否開啟了集群功能(即cluster_enabled為1)。 準(zhǔn)備就緒后集群會向每個節(jié)點(diǎn)發(fā)送 CLUSTER MEET命令,格式為 CLUSTER MEET ip port,這個命令用來告訴當(dāng)前節(jié)點(diǎn)指定ip和port上在運(yùn)行的節(jié)點(diǎn)也是集群的一部分,從而使得6個節(jié)點(diǎn)最終可以歸入一個集群。
然后redis-trib.rb會分配主從數(shù)據(jù)庫節(jié)點(diǎn),分配的原則是盡量保證每個主數(shù)據(jù)庫運(yùn)行在不同的IP地址上,同時每個從數(shù)據(jù)庫和主數(shù)據(jù)庫均不運(yùn)行在同一IP地址上,以保證系統(tǒng)的容災(zāi)能力
3主3從,當(dāng)1個主故障,大家會給對應(yīng)的從投票,把從立為主,若沒有從數(shù)據(jù)庫可以恢復(fù)則redis集群就down了。
客戶端連接:
使用redis-cli -c -p 任意一個端口
總結(jié)
以上是生活随笔為你收集整理的redis主从、哨兵、集群概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试经历---UC(2016年01月11
- 下一篇: 持续交付2.0(一至三章)