Redis主從復制與讀寫分離的實現(xiàn)
1、為什么要主從復制、讀寫分離
Redis在作為緩存的時候,隨著項目訪問量的增加,對Redis服務器的操作也越加頻繁,雖然Redis讀寫速度都很快,但是一定程度上也會造成一定的延時,甚至出現(xiàn)宕機的可能性,這時候就出現(xiàn)了“單點故障”,那么為了解決訪問量大的問題,通常會采取的一種方式是主從架構Master/Slave,Master 以寫為主,Slave 以讀為主,并且會伴隨哨兵進行監(jiān)控
主從復制機制說明:
- 主redis中的數(shù)據(jù)有兩個副本(replication)即從redis1和從redis2,即使一臺redis服務器宕機其他兩臺redis服務也可以繼續(xù)提供服務。
- 主redis中的數(shù)據(jù)和從redis上的數(shù)據(jù)保持實時同步,當主redis寫入數(shù)據(jù)時通過主從復制機制會復制到兩個從redis服務上。
- 只有一個主redis,可以有多個從redis。
- 主從復制不會阻塞master,在同步數(shù)據(jù)時,master可以繼續(xù)處理client請求。
一個 Redis 可以即是主又是從,如下圖:
2、主從配置實踐,修改配置文件
[root@localhost ~]# cd /usr/local/redis/bin/ [root@localhost bin]# cp redis.conf redis6379.conf [root@localhost bin]# cp redis.conf redis6380.conf [root@localhost bin]# cp redis.conf redis6381.conf
然后對這3個配置文件redis6379.conf、redis6380.conf、redis6381.conf分別進行修改(每個配置文件都要修改)
①、修改配置端口,分別改成對應的端口即可
注:我用的是FinalShell工具,挺方便的,推薦。
②、修改daemonize為yes
③、配置pid文件路徑 pidfile
④、配置log 文件名字
⑤、配置rdb文件名
⑥、看情況選擇:如果redis配置了密碼(requirepass 123456),則還需在從redis服務中設置這一項,如果沒有設置密碼則忽略這一項
問題介紹:如果我們在主redis服務器上設置了密碼,即:在redis.conf配置文件中使用了requirepass 123456(你設置的密碼);那么我們在從redis服務器上的配置文件redis.conf中使用了slaveof 127.0.0.1 6379后發(fā)現(xiàn):主從復制失敗。
解決方案:在從redis服務器上的配置文件redis.conf中找到:masterauth <master-password>這一行,然后在這一行的下面寫上masterauth 123456(主redis服務器密碼)。這時候我們再分別重啟主redis服務器和從redis服務器,則發(fā)現(xiàn)主從復制成功!
當三份都配置完成后,分別啟動這三個服務:
使用ps -ef | grep redis
查看:
然后通過如下命令選擇不同的端口進入到這三個Redis客戶端:
redis-cli -p 6379
3、設置主從關系
①、設置一主二從:
通過 INFO replication 命令查看發(fā)現(xiàn),三個默認的都是Master角色,
然后我們將 6380 和 6381設置為Slave角色,可以使用如下命令:
SLAVEOF 127.0.0.1 6379 或 REPLICAOF 127.0.0.1 6379
這時 6380 和 6381成為了Slave,然后查看一下主機(Master)信息:
可以發(fā)現(xiàn)主機下面有兩個Slave節(jié)點。
注:通過這種方式來設置主從關系,一旦服務重啟,那么角色關系將不復存在。想要保存這種關系,可以通過Slave的 配置文件來進行配置。
分別編輯 redis6380.conf 和 redis6381.conf 配置文件,加入(約在286行):
replicaof 127.0.0.1 6379
4、測試數(shù)據(jù)
①、給主節(jié)點設置值:set k1 v1
從節(jié)點也可以獲取到值,說明沒問題。
在沒有設置主從關系之前,如果主節(jié)點內(nèi)有數(shù)據(jù),那么在設置主從關系后,Slave從節(jié)點也能獲取到主節(jié)點原來的數(shù)據(jù)。
如果Master主節(jié)點掛掉了,Slave從節(jié)點的角色不會發(fā)生變化,一直處于等待狀態(tài),直到Master主節(jié)點重新啟動。
如果要將Slave從節(jié)點變成Master節(jié)點,可以使用如下命令:
SLAVEOF no one
5、Redis配置文件解析
下面是redis主從復制場景的一些可調(diào)參數(shù),需要根據(jù)實際環(huán)境調(diào)整
- slave-serve-stale-data yes : 是否可以把不新鮮的數(shù)據(jù)服務與客戶端
- slave-read-only yes : 從節(jié)點只讀,啟用slaveof定義后才生效
- repl-diskless-sync no :是否同時向多個從節(jié)點同時發(fā)數(shù)據(jù)
- repl-diskless-sync-delay 5 :發(fā)送的延遲時間
- repl-ping-slave-period 10 探測從節(jié)點狀態(tài)
- repl-timeout 60 探測節(jié)點超時時間
- repl-disable-tcp-nodelay no : 啟用nodelay
- repl-backlog-size 1mb
- slave-priority 100 : 從節(jié)點優(yōu)先級,復制集群中,主節(jié)點故障時,sentinel應用場景中的主節(jié)點選舉時使用的優(yōu)先級;數(shù)字越小優(yōu)先級越高,但0表示不參與選舉;
- min-slaves-to-write 3:主節(jié)點僅允許其能夠通信的從節(jié)點數(shù)量大于等于此處的值時接受寫操作;
- min-slaves-max-lag 10:從節(jié)點延遲時長超出此處指定的時長時,主節(jié)點會拒絕寫入操作;
6、主從復制的優(yōu)點(特點)與缺點
6.1、優(yōu)點(特點)
主從采用異步復制數(shù)據(jù)
主數(shù)據(jù)庫可以進行讀寫操作,當寫操作時會自動將數(shù)據(jù)同步給從數(shù)據(jù)庫
從數(shù)據(jù)庫一般只讀的,并且接收主數(shù)據(jù)庫同步過來的數(shù)據(jù)
一個master可以擁有多個slave,但是一個slave只能對應一個master
一個slave也可以連接多個slave
slave意外退出,不影響其他slave的讀和master的讀和寫,重新啟動后會將數(shù)據(jù)從master同步過來
master意外退出,不影響slave的讀,但redis不再提供寫服務,master重啟后redis將重新對外提供寫服務
master掛了以后,不會在slave節(jié)點中重新選一個master
6.2、缺點
由于所有的寫操作都是先在Master上操作,然后同步更新到Slave上,所以從Master同步到Slave機器有一定的延遲,當系統(tǒng)很繁忙的時候,延遲問題會更加嚴重,Slave機器數(shù)量的增加也會使這個問題更加嚴重。
7、Redis主從復制之原理介紹
Slave啟動成功連接到Master后會發(fā)送一個sync命令,Master接到命令啟動后臺的存盤進程,同時收集所有接收到的用于修改數(shù)據(jù)集命令,在后臺進程執(zhí)行完畢之后,Master將傳送整個數(shù)據(jù)文件到Slave,以完成一次完全同步
- 全量同步:而Slave服務在接收到數(shù)據(jù)庫文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中。
- 增量同步:Master繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步。
但是只要是重新連接Master,一次完全同步(全量同步)將被自動執(zhí)行。
--詳細介紹:
①、全量同步
Redis 的全量同步過程主要分三個階段:
同步快照階段: Master 創(chuàng)建并發(fā)送快照給 Slave , Slave 載入并解析快照。 Master 同時將此階段所產(chǎn)生的 新的寫命令存儲到緩沖區(qū)。
同步寫緩沖階段: Master 向 Slave 同步存儲在緩沖區(qū)的寫操作命令。
同步增量階段: Master 向 Slave 同步寫操作命令。
②、增量同步
Redis 增量同步主要指 Slave 完成初始化后開始正常工作時, Master 發(fā)生的寫操作同步到 Slave 的過程。
通常情況下, Master 每執(zhí)行一個寫命令就會向 Slave 發(fā)送相同的寫命令,然后 Slave 接收并執(zhí)行。
到此這篇關于Redis主從復制與讀寫分離的實現(xiàn)的文章就介紹到這了,更多相關Redis主從復制與讀寫分離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
redis 解決庫存并發(fā)問題實現(xiàn)數(shù)量控制
本文主要介紹了redis 解決庫存并發(fā)問題實現(xiàn)數(shù)量控制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04