Redis数据库(三)——(主从复制、哨兵模式、集群)
Redis數(shù)據(jù)庫(三)——(主從復(fù)制、哨兵模式、集群)
- 一、Redis主從復(fù)制
- 1、Redis主從模式介紹
- 2、Redis主從復(fù)制的流程
- 3、Redis主從復(fù)制的作用
- 4、Redis主從復(fù)制的搭建
- 環(huán)境配置/安裝包
- 安裝Redis(所有主機(jī))
- 修改Master節(jié)點(diǎn)Redis配置文件
- 修改Slave節(jié)點(diǎn)Redis配置文件
- 驗(yàn)證主從效果
- 二、Redis 哨兵模式
- 1、哨兵模式的原理
- 2、哨兵模式主要功能
- 3、哨兵模式的結(jié)構(gòu)
- 4、優(yōu)點(diǎn)與缺點(diǎn)
- 5、哨兵模式的搭建
- 環(huán)境配置
- 修改 Redis 配置文件(==所有節(jié)點(diǎn)操作==)
- 啟動(dòng)哨兵模式
- 查看哨兵模式信息
- 故障模擬
- 驗(yàn)證結(jié)果
- 三、Redis 群集模式
- 1、集群模式的搭建
- 所有節(jié)點(diǎn)
- 其余節(jié)點(diǎn)
- 所有節(jié)點(diǎn)
一、Redis主從復(fù)制
1、Redis主從模式介紹
- 通過持久化功能,redis保證了即使在服務(wù)器重啟的情況下也不會(huì)丟失(或少量丟失)數(shù)據(jù),因?yàn)槌志没瘯?huì)把內(nèi)存中的數(shù)據(jù)保存到硬盤上,重啟會(huì)從硬盤上加載數(shù)據(jù),但是由于數(shù)據(jù)是存儲(chǔ)在一臺(tái)服務(wù)器上的,如果這臺(tái)服務(wù)器出現(xiàn)硬盤故障等問題,也會(huì)導(dǎo)致數(shù)據(jù)丟失。為了避免單點(diǎn)故障,通常的做法是將數(shù)據(jù)庫復(fù)制多個(gè)副本以部署在不同的服務(wù)器上,這樣即使有一臺(tái)服務(wù)器出現(xiàn)故障其他服務(wù)器依然可以繼續(xù)提供服務(wù),為此,redis提供了復(fù)制(replication)功能,可以實(shí)現(xiàn)當(dāng)一臺(tái)數(shù)據(jù)庫中的數(shù)據(jù)更新后,自動(dòng)將更新的數(shù)據(jù)同步到其他數(shù)據(jù)庫上。
- 在復(fù)制的概念中,數(shù)據(jù)庫分為兩類,一類是主數(shù)據(jù)庫(master),另一類是從數(shù)據(jù)(slave)。主數(shù)據(jù)可以進(jìn)行讀寫操作,當(dāng)寫操作導(dǎo)致數(shù)據(jù)變化時(shí)會(huì)自動(dòng)將數(shù)據(jù)同步給從數(shù)據(jù)庫,而從數(shù)據(jù)庫一般是只讀的,并接受主數(shù)據(jù)同步過來的數(shù)據(jù)。一個(gè)主數(shù)據(jù)庫可以擁有多個(gè)從數(shù)據(jù)庫,而一個(gè)從數(shù)據(jù)庫只能擁有一個(gè)主數(shù)據(jù)庫。
2、Redis主從復(fù)制的流程
- (1)若啟動(dòng)一個(gè)Slave機(jī)器進(jìn)程,則它會(huì)向Master機(jī)器發(fā)送一個(gè)“sync command”命令,請(qǐng)求同步連接。
- (2)無論是第一次連接還是重新連接,Master機(jī)器都會(huì)啟動(dòng)一個(gè)后臺(tái)進(jìn)程,將數(shù)據(jù)快照保存到數(shù)據(jù)文件中(執(zhí)行rdb操作),同時(shí)Master還會(huì)記錄修改數(shù)據(jù)的所有命令并緩存在數(shù)據(jù)文件中。
- (3)后臺(tái)進(jìn)程完成緩存操作之后,Maste機(jī)器就會(huì)向Slave機(jī)器發(fā)送數(shù)據(jù)文件,Slave端機(jī)器將數(shù)據(jù)文件保存到硬盤上,然后將其加載到內(nèi)存中,接著Master機(jī)器就會(huì)將修改數(shù)據(jù)的所有操作一并發(fā)送給Slave端機(jī)器。若Slave出現(xiàn)故障導(dǎo)致宕機(jī),則恢復(fù)正常后會(huì)自動(dòng)重新連接。
- (4)Master機(jī)器收到Slave端機(jī)器的連接后,將其完整的數(shù)據(jù)文件發(fā)送給Slave端機(jī)器,如果Mater同時(shí)收到多個(gè)Slave發(fā)來的同步請(qǐng)求,則Master會(huì)在后臺(tái)啟動(dòng)一個(gè)進(jìn)程以保存數(shù)據(jù)文件,然后將其發(fā)送給所有的Slave端機(jī)器,確保所有的Slave端機(jī)器都正常。
3、Redis主從復(fù)制的作用
- 數(shù)據(jù)冗余:主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
- 故障恢復(fù):當(dāng)主節(jié)點(diǎn)出現(xiàn)問題時(shí),可以由從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù);實(shí)際上是一種服務(wù)的冗余。
- 負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫分離,可以由主節(jié)點(diǎn)提供寫服務(wù),由從節(jié)點(diǎn)提供讀服務(wù)(即寫Redis數(shù)據(jù)時(shí)應(yīng)用連接主節(jié)點(diǎn),讀Redis數(shù)據(jù)時(shí)應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫少讀多的場景下,通過多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。
- 高可用基石:除了上述作用以外,主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說主從復(fù)制是Redis高可用的基礎(chǔ)。
4、Redis主從復(fù)制的搭建
環(huán)境配置/安裝包
安裝包:redis-5.0.7.tar.gz
| Master | CentOS7 | 192.168.172.10 | redis-5.0.7.tar.gz |
| Slave1 | CentOS7 | 192.168.172.20 | redis-5.0.7.tar.gz |
| Slave2 | CentOS7 | 192.168.172.30 | redis-5.0.7.tar.gz |
安裝Redis(所有主機(jī))
systemctl stop firewalld setenforce 0yum install -y gcc gcc-c++ maketar zxvf redis-5.0.7.tar.gz -C /opt/cd /opt/redis-5.0.7/ make && make PREFIX=/usr/local/redis installcd /opt/redis-5.0.7/utils ./install_server.sh回車四次,下一步需要手動(dòng)輸入Please select the redis executable path [] /usr/local/redis/bin/redis-server ln -s /usr/local/redis/bin/* /usr/local/bin/
修改Master節(jié)點(diǎn)Redis配置文件
(192.168.172.10)
vim /etc/redis/6379.conf bind 0.0.0.0 #70行,修改bind 項(xiàng),0.0.0.0監(jiān)聽所有網(wǎng)段 daemonize yes #137行,開啟守護(hù)進(jìn)程 logfile /var/log/redis_6379.log #172行,指定日志文件目錄 dir /var/lib/redis/6379 #264行,指定工作目錄 appendonly yes #700行,開啟AOF持久化功能/etc/init.d/redis_6379 restart
修改Slave節(jié)點(diǎn)Redis配置文件
(192.168.172.20)、(192.168.172.30)
vim /etc/redis/6379.conf bind 0.0.0.0 #70行,修改bind 項(xiàng),0.0.0.0監(jiān)聽所有網(wǎng)卡 daemonize yes #137行,開啟守護(hù)進(jìn)程 logfile /var/log/redis_6379.log #172行,指定日志文件目錄 dir /var/lib/redis/6379 #264行,指定工作目錄 replicaof 192.168.172.10 6379 #288行,指定要同步的Master節(jié)點(diǎn)IP和端口 appendonly yes #700行,開啟AOF持久化功能/etc/init.d/redis_6379 restart
驗(yàn)證主從效果
在Master節(jié)點(diǎn)上看日志
tail -f /var/log/redis_6379.log在Master節(jié)點(diǎn)上驗(yàn)證從節(jié)點(diǎn)
redis-cli info replication二、Redis 哨兵模式
哨兵是Redis集群架構(gòu)中非常重要的一個(gè)組件,哨兵的出現(xiàn)主要是解決了主從復(fù)制出現(xiàn)故障時(shí)需要人為干預(yù)的問題。
1、哨兵模式的原理
哨兵(sentinel):是一個(gè)分布式系統(tǒng),用于對(duì)主從結(jié)構(gòu)中的每臺(tái)服務(wù)器進(jìn)行監(jiān)控,當(dāng)出現(xiàn)故障時(shí)通過投票機(jī)制選擇新的 Master 并將所有 Slave 連接到新的 Master。所以整個(gè)運(yùn)行哨兵的集群的數(shù)量不得少于3個(gè)節(jié)點(diǎn)。
2、哨兵模式主要功能
- 集群監(jiān)控:負(fù)責(zé)監(jiān)控Redis master和slave進(jìn)程是否正常工作
- 消息通知:如果某個(gè)Redis實(shí)例有故障,那么哨兵負(fù)責(zé)發(fā)送消息作為報(bào)警通知給管理員
- 故障轉(zhuǎn)移:如果master node掛掉了,會(huì)自動(dòng)轉(zhuǎn)移到slave node上
- 配置中心:如果故障轉(zhuǎn)移發(fā)生了,通知client客戶端新的master地址
使用一個(gè)或者多個(gè)哨兵(Sentinel)實(shí)例組成的系統(tǒng),對(duì)redis節(jié)點(diǎn)進(jìn)行監(jiān)控,在主節(jié)點(diǎn)出現(xiàn)故障的情況下,能將從節(jié)點(diǎn)中的一個(gè)升級(jí)為主節(jié)點(diǎn),進(jìn)行故障轉(zhuǎn)義,保證系統(tǒng)的可用性。
3、哨兵模式的結(jié)構(gòu)
哨兵結(jié)構(gòu)由兩部分組成,哨兵節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn):
- 哨兵節(jié)點(diǎn):哨兵系統(tǒng)由一個(gè)或多個(gè)哨兵節(jié)點(diǎn)組成,哨兵節(jié)點(diǎn)是特殊的redis節(jié)點(diǎn),不存儲(chǔ)數(shù)據(jù)。
- 數(shù)據(jù)節(jié)點(diǎn):主節(jié)點(diǎn)和從節(jié)點(diǎn)都是數(shù)據(jù)節(jié)點(diǎn)。
哨兵的啟動(dòng)依賴于主從模式,所以須把主從模式安裝好的情況下再去做哨兵模式,所有節(jié)點(diǎn)上都需要部署哨兵模式,哨兵模式會(huì)監(jiān)控所有的 Redis 工作節(jié)點(diǎn)是否正常,當(dāng) Master 出現(xiàn)問題的時(shí)候,因?yàn)槠渌?jié)點(diǎn)與主節(jié)點(diǎn)失去聯(lián)系,因此會(huì)投票,投票過半就認(rèn)為這個(gè) Master 的確出現(xiàn)問題,然后會(huì)通知哨兵間,然后從 Slaves 中選取一個(gè)作為新的 Master。
需要特別注意的是,客觀下線是主節(jié)點(diǎn)才有的概念;如果從節(jié)點(diǎn)和哨兵節(jié)點(diǎn)發(fā)生故障,被哨兵主觀下線后,不會(huì)再有后續(xù)的客觀下線和故障轉(zhuǎn)移操作。
4、優(yōu)點(diǎn)與缺點(diǎn)
- 優(yōu)點(diǎn):高可用,哨兵模式是基于主從模式的,所有主從模式的優(yōu)點(diǎn),哨兵模式都有;主從可以自動(dòng)切換,系統(tǒng)更健壯,可用性更高
- 缺點(diǎn):redis 比較難支持在線擴(kuò)容,在群集容量達(dá)到上限時(shí)在線擴(kuò)容會(huì)變得很復(fù)雜
5、哨兵模式的搭建
環(huán)境配置
| Master | CentOS7 | 192.168.172.10 | redis-5.0.7.tar.gz |
| Slave1 | CentOS7 | 192.172.184.20 | redis-5.0.7.tar.gz |
| Slave2 | CentOS7 | 192.168.172.30 | redis-5.0.7.tar.gz |
修改 Redis 配置文件(所有節(jié)點(diǎn)操作)
systemctl stop firewalld setenforce 0vim /opt/redis-5.0.7/sentinel.conf protected-mode no #17行,關(guān)閉保護(hù)模式 port 26379 #21行,Redis哨兵默認(rèn)的監(jiān)聽端口 daemonize yes #26行,指定sentinel為后臺(tái)啟動(dòng) logfile "/var/log/sentinel.log" #36行,指定日志存放路徑 dir "/var/lib/redis/6379" #65行,指定數(shù)據(jù)庫存放路徑 sentinel monitor mymaster 192.168.172.10 6379 2 #84行,修改 指定該哨兵節(jié)點(diǎn)監(jiān)控192.168.172.10:6379這個(gè)主節(jié)點(diǎn),該主節(jié)點(diǎn)的名稱是mymaster,最后的2的含義與主節(jié)點(diǎn)的故障判定有關(guān):至少需要2個(gè)哨兵節(jié)點(diǎn)同意,才能判定主節(jié)點(diǎn)故障并進(jìn)行故障轉(zhuǎn)移 sentinel down-after-milliseconds mymaster 30000 #113行,判定服務(wù)器down掉的時(shí)間周期,默認(rèn)30000毫秒(30秒) sentinel failover-timeout mymaster 180000 #146行,故障節(jié)點(diǎn)的最大超時(shí)時(shí)間為180000(180秒)
啟動(dòng)哨兵模式
PS:先啟master,再啟slave
cd /opt/redis-5.0.7/ redis-sentinel sentinel.conf & 注意!先啟動(dòng)主服務(wù)器,再啟動(dòng)從服務(wù)器先啟動(dòng)主節(jié)點(diǎn)
在啟動(dòng)從節(jié)點(diǎn)
查看哨兵模式信息
redis-cli -p 26379 info SentinelMaster:192.168.172.10
故障模擬
Master:192.168.172.10
查看redis-server進(jìn)程號(hào) netstat -natp | grep redis kill -9 11343 #Master節(jié)點(diǎn)上redis-server的進(jìn)程號(hào)驗(yàn)證結(jié)果
tail -f /var/log/sentinel.log redis-cli -p 26379 INFO Sentinel三、Redis 群集模式
-
redis的哨兵模式基本已經(jīng)可以實(shí)現(xiàn)高可用、讀寫分離,但是在這種模式,每臺(tái)redis服務(wù)器都存儲(chǔ)相同的數(shù)據(jù),很浪費(fèi)內(nèi)存資源,所以加入了 Cluster 群集模式,實(shí)現(xiàn)了redis的分布式存儲(chǔ),也就是說,每臺(tái)redis節(jié)點(diǎn)存儲(chǔ)著不同的內(nèi)容
-
群集部署建議至少3臺(tái)以上的master節(jié)點(diǎn),建議使用3主3從六個(gè)節(jié)點(diǎn)的模式
-
Cluster 群集由多個(gè)redis服務(wù)器組成的分布式網(wǎng)絡(luò)服務(wù)群集,群集中有多個(gè)master主節(jié)點(diǎn),每個(gè)主節(jié)點(diǎn)都可讀可寫,節(jié)點(diǎn)之間會(huì)互相通信,兩兩相連,redis群集無中心節(jié)點(diǎn)
-
在 redis-Cluster 群集中,可以給每個(gè)主節(jié)點(diǎn)添加從節(jié)點(diǎn),主節(jié)點(diǎn)和從節(jié)點(diǎn)直接遵循主從模型的特性,當(dāng)用戶需要處理更多讀請(qǐng)求的時(shí)候,添加從節(jié)點(diǎn)可以擴(kuò)展系統(tǒng)的讀性能
-
redis-Cluster 的故障轉(zhuǎn)移:redis群集的主節(jié)點(diǎn)內(nèi)置了類似 redis sentinel 的節(jié)點(diǎn)故障檢測和自動(dòng)故障轉(zhuǎn)移功能,當(dāng)群集中的某個(gè)主節(jié)點(diǎn)下線時(shí),群集中的其他在線主節(jié)點(diǎn)會(huì)注意到這點(diǎn),并且對(duì)已經(jīng)下線的主節(jié)點(diǎn)進(jìn)行故障轉(zhuǎn)移
-
群集進(jìn)行故障轉(zhuǎn)移的方法和 redis sentinel 進(jìn)行故障轉(zhuǎn)移的方法基本一樣,不同的是,在集群里面,故障轉(zhuǎn)移是由集群中其他在線的主節(jié)點(diǎn)復(fù)制進(jìn)行的,所以群集不必另外使用 redis sentinel
1、集群模式的搭建
| Master1 | CentOS7 | 192.168.172.10:7001 | redis-5.0.7.tar.gz |
| Master2 | CentOS7 | 192.168.172.20:7002 | redis-5.0.7.tar.gz |
| Master3 | CentOS7 | 192.168.172.30:7003 | redis-5.0.7.tar.gz |
| salve1 | CentOS7 | 192.168.172.40:7004 | redis-5.0.7.tar.gz |
| salve2 | CentOS7 | 192.168.172.50:7005 | redis-5.0.7.tar.gz |
| slave3 | CentOS7 | 192.168.172.60:7006 | redis-5.0.7.tar.gz |
所有節(jié)點(diǎn)
cd /etc/redis/ mkdir -p redis-cluster/redis6379 cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis6379/ cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis6379/ #其他5個(gè)文件夾的配置文件以此類推修改,注意6個(gè)端口都要不一樣。 cd /etc/redis/redis-cluster/redis6379 vim redis.confbind 192.168.172.10 #69行,修改bind項(xiàng),監(jiān)聽自己的IP protected-mode no #88行,修改,關(guān)閉保護(hù)模式 port 7001 #92行,修改,redis監(jiān)聽端口, daemonize yes #136行,以獨(dú)立進(jìn)程啟動(dòng) cluster-enabled yes #832行,取消注釋,開啟群集功能 cluster-config-file nodes-6379.conf #840行,取消注釋,群集名稱文件設(shè)置,無需修改 cluster-node-timeout 15000 #846行,取消注釋群集超時(shí)時(shí)間設(shè)置 appendonly yes #699行,修改,開啟AOF持久化
其余節(jié)點(diǎn)
vim /etc/redis/redis-cluster/redis6379/redis.conf所有節(jié)點(diǎn)
啟動(dòng)redis節(jié)點(diǎn)
cd /etc/redis/redis-cluster/redis6379/ redis-server redis.conf啟動(dòng)集群
redis-cli --cluster create 192.168.172.10:7001 192.168.172.20:7002 192.168.172.30:7003 192.168.172.40:7004 192.168.172.50:7005 192.168.172.60:7006 --cluster-replicas 1
總結(jié)
以上是生活随笔為你收集整理的Redis数据库(三)——(主从复制、哨兵模式、集群)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存大战:3200双通道,A品牌VS.B
- 下一篇: Windows使用msi安装MySQL安