這篇文章主要介紹“redis集群主從模式怎么配置”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Redis集群主從模式怎么配置”文章能幫助大家解決問題。
成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!專注中小微企業(yè)官網(wǎng)定制,網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計,塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。
在我們的實際開發(fā)當(dāng)中,只使用一臺Redis運用于工程項目中是不可以的,原因如下:
(1)從結(jié)構(gòu)上,單個Redis服務(wù)器會發(fā)生單點故障,并且一臺服務(wù)器需要處理所有的請求負(fù)載,壓力較大;
(2)從容量上,單個Redis服務(wù)器內(nèi)存容量有限,就算一臺Redis服務(wù)器內(nèi)存容量為256G,也不能將所有內(nèi)存用作Redis存儲內(nèi)存,一般來說,單臺Redis最大使用內(nèi)存不應(yīng)該超過20G。
(3)單臺Redis服務(wù)器的讀寫性能有限,利用集群可以提高讀寫能力。
目前,Redis有三種集群模式,分別是:主從模式,哨兵模式,Cluster模式;主從模式是三種模式中最簡單的,在主從復(fù)制中,是指將一臺Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。前者稱為主節(jié)點(master/leader),后者稱為從節(jié)點(slave/follower)。
注意:
(1)數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點到從節(jié)點。Master以寫為主,Slave 以讀為主。
(2)默認(rèn)情況下,每臺Redis服務(wù)器都是主節(jié)點;
(3)一個主節(jié)點可以有多個從節(jié)點(或沒有從節(jié)點),但一個從節(jié)點只能有一個主節(jié)點。
1、數(shù)據(jù)冗余:主從復(fù)制實現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
2、故障恢復(fù):當(dāng)主節(jié)點出現(xiàn)問題時,可以由從節(jié)點提供服務(wù),實現(xiàn)快速的故障恢復(fù);實際上是一種服務(wù)的冗余。
3、高可用(集群)基石:主從復(fù)制還是哨兵和集群能夠?qū)嵤┑幕A(chǔ),因此說主從復(fù)制是Redis高可用的基礎(chǔ)。
4、負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫分離,可以由主節(jié)點提供寫服務(wù),由從節(jié)點提供讀服務(wù)(即寫Redis數(shù)據(jù)時應(yīng)用連接主節(jié)點,讀Redis數(shù)據(jù)時應(yīng)用連接從節(jié)點),分擔(dān)服務(wù)器負(fù)載;尤其是在寫少讀多的場景下,通過多個從節(jié)點分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。
例如在我們的電商網(wǎng)站可以發(fā)現(xiàn),對于一個商品只需要上傳一次,但其卻能夠被用戶瀏覽多次,也就是“寫少讀多”這種情況,我們可以利用主從復(fù)制進(jìn)行讀寫分離,減緩服務(wù)器的壓力:
1、復(fù)制三個配置文件(原名:redis.conf),并分別重命名為:redis79.conf,redis80.conf,redis81.conf。
2、修改配置文件
(1)修改redis79.conf
修改端口號
port 6379
設(shè)置為后臺運行
daemonize:yes
設(shè)置日志文件的名字
logfile “6379.log"
設(shè)置db文件名字
dbfilename dump6379.rdb
(2)修改redis80.conf
修改端口號
port 6380
設(shè)置為后臺運行
daemonize:yes
設(shè)置記錄進(jìn)程Id文件名字
pidfile /var/run/redis_6380.pid
設(shè)置日志文件的名字
logfile “6380.log"
設(shè)置db文件名字
dbfilename dump6380.rdb
(3)修改redis81.conf
修改端口號
port 6381
設(shè)置為后臺運行
daemonize:yes
設(shè)置記錄進(jìn)程Id文件名字
pidfile /var/run/redis_6381.pid
設(shè)置日志文件的名字
logfile “6381.log"
設(shè)置db文件名字
dbfilename dump6381.rdb
這幾個屬性的作用如下:
pid(port ID):記錄了進(jìn)程的 ID,文件帶有鎖??梢苑乐钩绦虻亩啻螁?。
logfile:明確日志文件的位置
dbfilename:dumpxxx.file #持久化文件位置
port:進(jìn)程占用的端口號
注意:默認(rèn)情況下,每臺Reids服務(wù)器都是主節(jié)點,而我們要搭建主從只需要在從機那本搭建即可。
現(xiàn)在分別啟動redis79,redis80,redis81服務(wù)器。
redis-server redis79.conf redis-server redis80.conf redis-server redis81.conf
使用以下命令,查看是否啟動成功:
ps -ef|grep redis
打開三個客戶端窗口,分別對應(yīng)操作三個Redis服務(wù)器。
輸入命令:
注意要指定端口,才知道我們要打開哪一個Redis。
窗口一:
redis-cli -p 6379
窗口二:
redis-cli -p 6380
窗口三:
redis-cli -p 6381
我們將redis79設(shè)置為主節(jié)點,而將redis80和redis81設(shè)置為從結(jié)點。
配置主機的IP地址和端口號,相當(dāng)于想認(rèn)其為自己的老大。
redis80:
#SLAVEOF IP地址 端口 127.0.0.1:6380> slaveof 127.0.0.1 6379 OK
redis81:
#SLAVEOF IP地址 端口 127.0.0.1:6381> slaveof 127.0.0.1 6379 OK
這個時候,我們在從機使用INFO命令就可以查看主從關(guān)系了:
info replication
而此時我們?nèi)ブ鳈Credis79中使用同樣的命令進(jìn)行查看:
現(xiàn)在我們的一主二從的關(guān)系就成功搭建好了!
提示:如果要將從機變成主機,我們只需要在從機執(zhí)行以下命令,即可讓自己變?yōu)橹鳈C。
SLAVEOF no one
主機可以進(jìn)行讀寫操作,而從機只能讀操作。
注意:主機中的所有信息和數(shù)據(jù),都會自動被從機保存。
主機:
127.0.0.1:6379> set key1 v1 OK 127.0.0.1:6379> get key1 "v1"
從機:
127.0.0.1:6380> get key1 "v1" 127.0.0.1:6380> set key2 v2 #進(jìn)行寫操作就會報錯,提示從機只能進(jìn)行讀操作 (error) READONLY You can't write against a read only replica.
主機如果宕機了,從機依舊可以讀取到主機宕機前的數(shù)據(jù),但仍然沒有寫操作,如果主機恢復(fù)過來了,從機依舊可以獲取到主機寫的數(shù)據(jù)。
(1)停止主機進(jìn)程(演示主機宕機了)
停止進(jìn)程的命令:
kill -9 pid #pid為redis進(jìn)程號
(2)從機獲取宕機前主機寫入的數(shù)據(jù)
可以發(fā)現(xiàn),能夠順利拿到,但仍然是無法進(jìn)行寫操作的。
(3)恢復(fù)主機
redis-server redis79.conf
(4)主機重新寫入數(shù)據(jù),從機獲取最新數(shù)據(jù)。
主機寫入數(shù)據(jù):
127.0.0.1:6379> set k2 yixin OK
從機讀取最新數(shù)據(jù):
127.0.0.1:6380> get k2 "yixin"
兩種配置方式下的從機斷開情況
從機斷開了,其重新連接后變?yōu)橹鳈C,能拿到斷開之前的數(shù)據(jù),但拿不到主機新寫入的值,如果重新設(shè)置主從關(guān)系,就可以拿到主機全部的數(shù)據(jù)了。
(1)停止從機進(jìn)程。
(2)主機寫入新數(shù)據(jù)。
127.0.0.1:6379> set k3 new OK
(3)重新啟動從機服務(wù)器。
redis-server redis80.conf
(4)嘗試獲取從機宕機前主機寫入的數(shù)據(jù),發(fā)現(xiàn)可以拿到。
127.0.0.1:6380> get k1 "v1"
(5)嘗試獲取從機宕機期間主機寫入的數(shù)據(jù),發(fā)現(xiàn)無法拿到了。
127.0.0.1:6380> get k3 (nil)
此次我們可以進(jìn)行查看主從關(guān)系,由于是命令行配置的,所以重啟之后又變回主機了。
127.0.0.1:6380> info replication # Replication role:master connected_slaves:0
(6)如果要拿到主機的所有數(shù)據(jù),只要執(zhí)行以下命令重新配置主從關(guān)系就可以了。
slaveof 127.0.0.1 6379
從機斷開后,重新連接,也是可以拿到主機的全部數(shù)據(jù)的。
(1)修改配置文件redis80.conf,添加主從關(guān)系。
#指定主機的ip與port slaveof 127.0.0.1 6379
(2)主機添加新數(shù)據(jù)
127.0.0.1:6379> set k5 hello OK
(3)重新啟動redis80服務(wù)器。
redis-server redis80.conf
(4)獲取從機宕機期間主機新寫入的數(shù)據(jù),發(fā)現(xiàn)現(xiàn)在可以順利拿到了。
127.0.0.1:6380> get k5 "hello"
我們來查看6380的主從關(guān)系,可以發(fā)現(xiàn)在重啟的時候就已經(jīng)設(shè)置好主從關(guān)系了。
(1)Slave 啟動成功連接到 Master 后會發(fā)送一個sync同步命令
(2)Master 接到命令,啟動后臺的存盤進(jìn)程,同時收集所有接收到的用于修改數(shù)據(jù)集命令,在后臺進(jìn)程執(zhí)行完畢之后,master將傳送整個數(shù)據(jù)文件到slave,并完成一次完全同步。
(3)全量復(fù)制:而slave服務(wù)在接收到數(shù)據(jù)庫文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中。
(4)增量復(fù)制:Master 繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步。
注意:只要是重新連接master,一次完全同步(全量復(fù)制)將被自動執(zhí)行! 我們的數(shù)據(jù)一定可以在從機中看到。
(1)同一個Master可以同步多個Slaves。
(2)Slave同樣可以接受其它Slaves的連接和同步請求,這樣可以有效的分載Master的同步壓力。因此我們可以將Redis的Replication架構(gòu)視為圖結(jié)構(gòu)。
(3)Master Server是以非阻塞的方式為Slaves提供服務(wù)。所以在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請求。
(4)Slave Server同樣是以非阻塞的方式完成數(shù)據(jù)同步。在同步期間,如果有客戶端提交查詢請求,Redis則返回同步之前的數(shù)據(jù)。
(5)為了分載Master的讀操作壓力,Slave服務(wù)器可以為客戶端提供只讀操作的服務(wù),寫服務(wù)仍然必須由Master來完成。即便如此,系統(tǒng)的伸縮性還是得到了很大的提高。
(6)Master可以將數(shù)據(jù)保存操作交給Slaves完成,從而避免了在Master中要有獨立的進(jìn)程來完成此操作。
(7)支持主從復(fù)制,主機會自動將數(shù)據(jù)同步到從機,可以進(jìn)行讀寫分離。
(1) Redis 主從模式不具備自動容錯和恢復(fù)功能,如果主節(jié)點宕機,Redis 集群將無法工作,此時需要人為干預(yù),將從節(jié)點提升為主節(jié)點。
(2) 如果主機宕機前有一部分?jǐn)?shù)據(jù)未能及時同步到從機,即使切換主機后也會造成數(shù)據(jù)不一致的問題,從而降低了系統(tǒng)的可用性。
(3) 因為只有一個主節(jié)點,所以其寫入能力和存儲能力都受到一定程度地限制。
(4) 在進(jìn)行數(shù)據(jù)全量同步時,若同步的數(shù)據(jù)量較大可能會造卡頓的現(xiàn)象。
關(guān)于“Redis集群主從模式怎么配置”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。