決心做好你自己吨岭,要知道,只有發(fā)現(xiàn)自我價值的人峦树,才不會苦惱 !
總結(jié):
- redis持久化是有缺陷的辣辫,
Redis集群
Redis集群分為:
主從復(fù)制Replication
高可用 Sentinel(必用) 怎么都能用:3臺
集群Cluster
1. 主從復(fù)制
典型的主從模型,主Redis服務(wù)稱為Master魁巩,從Redis服務(wù)稱為Slave急灭。一主可以多從。
Master會一直將自己的數(shù)據(jù)更新同步到Slave谷遂,以保持主從同步葬馋。
只有Master可以執(zhí)行讀寫操作,Slave只能執(zhí)行讀操作肾扰〕胨唬客戶端可以連接到任一Slave執(zhí)行讀操作,來降低Master的讀取壓力。
創(chuàng)建主從復(fù)制
1. 命令創(chuàng)建(主 從)
redis-server --slaveof <master-ip> <master-port>
配置當(dāng)前服務(wù)稱為某Redis服務(wù)的Slave
redis-server --port 6380 --slaveof 127.0.0.1 6379
2. 指令創(chuàng)建
SLAVEOF host port命令,將當(dāng)前服務(wù)器狀態(tài)從Master修改為別的服務(wù)器的Slave
redis > SLAVEOF 192.168.1.1 6379娜亿,將服務(wù)器轉(zhuǎn)換為Slave
redis > SLAVEOF NO ONE ,將服務(wù)器重新恢復(fù)到Master蒋院,不會丟棄已同步數(shù)據(jù)
3. 配置方式
啟動時,服務(wù)器讀取配置文件莲绰,并自動成為指定服務(wù)器的從服務(wù)器
slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379
主從實驗
Master 192.168.140.135 6379
Slave 192.168.140.140 6379
# redis-cli -h 192.168.142.140 -p 6379
slave> SET testkey abc
slave> KEYS *
slave> SLAVEOF 192.168.142.135 6379
slave> KEYS * 看看是否發(fā)生改變
slave> set slavekey 123
(error) READONLY You can't write against a read only slave.
master> SET masterkey 123
slave> GET masterkey
slave> SLAVEOF NO ONE 解除從
slave> KEYS *
slave> SET slavekey1 abc 可寫了
slave> KEYS *
采用上面的多種方式都可以實現(xiàn)主從模式欺旧,一般來說,主從服務(wù)器都是固定的钉蒲,采用配置文件方式切端。
主從復(fù)制問題
一個Master可以有多個Slaves。
如果Slave下線顷啼,只是讀請求的處理能力下降踏枣。
但Master下線,寫請求無法執(zhí)行钙蒙。
當(dāng)Master下線茵瀑,其中一臺Slave使用SLAVEOF no one命令成為Master,其它Slaves執(zhí)行SLAVEOF命令指向這個新的Master躬厌,從它這里同步數(shù)據(jù)马昨。
這個主從轉(zhuǎn)移的過程手動的竞帽,如果要實現(xiàn)自動故障轉(zhuǎn)移,這就需要Sentinel哨兵鸿捧,實現(xiàn)故障轉(zhuǎn)移Failover操作
2. 高可用Sentinel
Redis官方的高可用方案屹篓,可以用它管理多個Redis服務(wù)實例。
Redis Sentinel是一個分布式系統(tǒng)匙奴,可以在一個架構(gòu)中運行多個Sentinel進(jìn)程
使用編譯時產(chǎn)生的redis-sentinel文件堆巧,在新的版本中,它就是redis-server的軟鏈接泼菌。
Sentinel啟動啟動一個運行在Sentinel模式下的Redis服務(wù)實例
redis-sentinel /path/to/sentinel.conf
redis-server /path/to/sentinel.conf --sentinel
推薦使用第一種
[root@Centos7 dell]# cd /magedu/redis/bin/
[root@Centos7 bin]# ll
total 15080
-rwxr-xr-x. 1 root root 2433432 Aug 13 17:07 redis-benchmark
-rwxr-xr-x. 1 root root 24992 Aug 13 17:07 redis-check-aof
-rwxr-xr-x. 1 root root 5191752 Aug 13 17:07 redis-check-rdb
-rwxr-xr-x. 1 root root 2586480 Aug 13 17:07 redis-cli
lrwxrwxrwx. 1 root root 12 Aug 13 17:07 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 5191752 Aug 13 17:07 redis-server
Sentinel會監(jiān)控Master谍肤、Slave是否正常,可以監(jiān)控多個Master哗伯、Slave荒揣。
Sentinel網(wǎng)絡(luò):監(jiān)控同一個Master的Sentinel會自動連接,組成分布式的Sentinel網(wǎng)絡(luò)焊刹,相互通信并交換監(jiān)控信息
服務(wù)器下線
當(dāng)一個sentinel認(rèn)為被監(jiān)視的服務(wù)器已經(jīng)下線時系任,它會向網(wǎng)絡(luò)中的其他Sentinel進(jìn)行確認(rèn),判斷該服務(wù)器是否真的已經(jīng)下線
如果下線的服務(wù)器為主服務(wù)器虐块,那么sentinel網(wǎng)絡(luò)將對下線主服務(wù)器進(jìn)行自動故障轉(zhuǎn)移赋除,通過將下線主服務(wù)器的某個從服務(wù)器提升為新的主服務(wù)器,并讓其從服務(wù)器轉(zhuǎn)為復(fù)制新的主服務(wù)器非凌,以此來讓系統(tǒng)重新回到上線的狀態(tài)
如果原來的主服務(wù)器恢復(fù),只能成為一臺Slave服務(wù)器荆针。
主觀下線sdown:單個Sentinel認(rèn)為服務(wù)器下線
客觀下線odown:多個Sentinel通信后做出了服務(wù)器下線的判斷
當(dāng)server1的下線時長超過用戶設(shè)定的下線時長上限時敞嗡,Sentinel系統(tǒng)就會對server1執(zhí)行故障轉(zhuǎn)移操作:
- 首先,Sentinel系統(tǒng)會挑選server1屬下的其中一個從服務(wù)器航背,并將這個被選中的從服務(wù)器升級為新的主服務(wù)器喉悴。
- 之后,Sentinel系統(tǒng)會向server1屬下的所有從服務(wù)器發(fā)送新的復(fù)制指令玖媚,讓它們成為新的主服務(wù)器的從服務(wù)器箕肃,當(dāng)所有從服務(wù)器都開始復(fù)制新的主服務(wù)器時,故障轉(zhuǎn)移操作執(zhí)行完畢今魔。
- 另外勺像,Sentinel還會繼續(xù)監(jiān)視已下線的server1,并在它重新上線時错森,將它設(shè)置為新的主服務(wù)器的從服務(wù)器吟宦。
配置
至少包含一個監(jiān)控配置選項,用于指定被監(jiān)控Master的相關(guān)信息
Sentinel monitor<name><ip><port><quorum> 涩维,例如 sentinel monitor mymaster 127.0.0.1 6379 2
監(jiān)視mymaster的主服務(wù)器殃姓,服務(wù)器ip和端口,將這個主服務(wù)器判斷為下線失效至少需要2個Sentinel同意,如果多數(shù)Sentinel同意才會執(zhí)行故障轉(zhuǎn)移
Sentinel會根據(jù)Master的配置自動發(fā)現(xiàn)Master的Slaves
sentinel down-after-milliseconds mymaster 60000
認(rèn)為服務(wù)器下線的毫秒數(shù)蜗侈。Sentinel在指定的毫秒數(shù)內(nèi)沒有返回給Sentinel的Ping回復(fù)篷牌,視為主管下線Sdown。
sentinel failover-timeout mymaster 180000
若sentinel在該配置值內(nèi)未能完成failover操作(即故障時主從自動切換)踏幻,則認(rèn)為本次failover失敗
sentinel parallel-syncs mymaster 1
在執(zhí)行故障轉(zhuǎn)移時枷颊, 最多可以有多少個從服務(wù)器同時對新的主服務(wù)器進(jìn)行同步。1表示只能有1臺從服務(wù)器從新主服務(wù)器同步數(shù)據(jù)叫倍,以便其他從服務(wù)器繼續(xù)提供客戶端服務(wù)的響應(yīng)偷卧。
port 26379
Sentinel默認(rèn)端口號為26379
Sentinel實驗
Master 192.168.140.135 6379
Slave 192.168.140.140 6379
先啟動主從2個Redis服務(wù)
提供Sentinel配置文件
sentinel1.conf文件內(nèi)容如下
port 26379
Sentinel monitor s1 192.168.142.135 6379 1 # 1臺下線;
sentinel down-after-milliseconds s1 6000
sentinel failover-timeout s1 10000
sentinel parallel-syncs s1 1
啟動Sentinel
redis-sentinel sentinel1.conf
在從服務(wù)器的配置中增加 slaveof 192.168.142.135 6379 吆倦,并重啟該服務(wù)
模擬Master下線
主觀下線有一個超時時間 听诸;
# ps aux | grep redis-server
root 4588 0.1 0.9 38736 9752 ? Ssl 14:44 0:34 /magedu/redis/bin/redis-server
192.168.142.135:6379
root 4754 0.0 0.0 103244 852 pts/2 S+ 20:23 0:00 grep redis-server
# kill -9 4588
Master下線后,開始投票蚕泽,決議通過后晌梨,提升從為新主
Master再次上線
原來的主上線后,被迫轉(zhuǎn)換為從须妻。
3. Redis Cluster
從3.0開始仔蝌,Redis支持分布式集群。
Redis集群采用無中心節(jié)點設(shè)計荒吏,每一個Redis節(jié)點間互相通信敛惊。
客戶端可以連接任意一個集群的節(jié)點。
Redis集群節(jié)點復(fù)制
Redis集群的每個節(jié)點都有兩種角色可選:主節(jié)點master node绰更、從節(jié)點slave node瞧挤。其中主節(jié)點用于存儲數(shù)據(jù),而從節(jié)點則是某個主節(jié)點的復(fù)制品
當(dāng)用戶需要處理更多讀請求的時候儡湾,添加從節(jié)點可以擴(kuò)展系統(tǒng)的讀性能特恬,因為Redis集群重用了單機(jī)Redis復(fù)制特性的代碼,所以集群的復(fù)制行為和我們之前介紹的單機(jī)復(fù)制特性的行為是完全一樣的
Redis集群故障轉(zhuǎn)移
Redis集群的主節(jié)點內(nèi)置了類似Redis Sentinel的節(jié)點故障檢測和自動故障轉(zhuǎn)移功能徐钠,當(dāng)集群中的某個主節(jié)點下線時癌刽,集群中的其他在線主節(jié)點會注意到這一點,并對已下線的主節(jié)點進(jìn)行故障轉(zhuǎn)移
集群進(jìn)行故障轉(zhuǎn)移的方法和Redis Sentinel進(jìn)行故障轉(zhuǎn)移的方法基本一樣尝丐,不同的是显拜,在集群里面,故障轉(zhuǎn)移是由集群中其他在線的主節(jié)點負(fù)責(zé)進(jìn)行的摊崭,所以集群不必另外使用Redis Sentinel
Redis集群分片
集群將整個數(shù)據(jù)庫分為16384個槽位slot讼油,所有key都數(shù)據(jù)這些slot中的一個,key的槽位計算公式為slot_number=crc16(key)%16384呢簸,其中crc16為16位的循環(huán)冗余校驗和函數(shù)
集群中的每個主節(jié)點都可以處理0個至16383個槽的訪問請求矮台,當(dāng)16384個槽都有某個節(jié)點在負(fù)責(zé)處理時乏屯,集群進(jìn)入上線狀態(tài),并開始處理客戶端發(fā)送的數(shù)據(jù)命令請求
舉例
三個主節(jié)點7000瘦赫、7001辰晕、7002平均分配16384個slot槽位
節(jié)點7000指派的槽位為0到5460
節(jié)點7001指派的槽位為5461到10922
節(jié)點7002指派的槽位為10923到16383
Redis集群Redirect轉(zhuǎn)向
由于Redis集群無中心節(jié)點,請求會發(fā)給任意主節(jié)點
主節(jié)點只會處理自己負(fù)責(zé)槽位的命令請求确虱,其它槽位的命令請求含友,該主節(jié)點會返回客戶端一個轉(zhuǎn)向錯誤
客戶端根據(jù)錯誤中包含的地址和端口,重新向正確的負(fù)責(zé)的主節(jié)點發(fā)起命令請求
Redis集群總結(jié)
Redis集群是一個由多個節(jié)點組成的分布式服務(wù)集群校辩,它具有復(fù)制窘问、高可用和分片特性
Redis的集群沒有中心節(jié)點,并且?guī)в袕?fù)制和故障轉(zhuǎn)移特性宜咒,這可用避免單個節(jié)點成為性能瓶頸惠赫,或者因為某個節(jié)點下線而導(dǎo)致整個集群下線
集群中的主節(jié)點負(fù)責(zé)處理槽(儲存數(shù)據(jù)),而從節(jié)點則是主節(jié)點的復(fù)制品
Redis集群將整個數(shù)據(jù)庫分為16384個槽故黑,數(shù)據(jù)庫中的每個鍵都屬于16384個槽中的其中一個
集群中的每個主節(jié)點都可以管理槽儿咱,當(dāng)16384個槽都有節(jié)點在負(fù)責(zé)時,集群進(jìn)入上線狀態(tài)场晶,可以執(zhí)行客戶端發(fā)送的數(shù)據(jù)命令
主節(jié)點只會執(zhí)行和自己負(fù)責(zé)的槽有關(guān)的命令混埠,當(dāng)節(jié)點接收到不屬于自己處理的槽的命令時,它將會處理指定槽的節(jié)點的地址返回給客戶端诗轻,而客戶端會向正確的節(jié)點重新發(fā)送