筆記內容來自B站博主《遇見狂神說》:Redis視頻鏈接
1、概念
主從復制,是指將一個臺 Redis 服務器的數據,復制到其他的 Redis 服務器。前者稱為主節點(master/leader),后者稱為從節點(slave/follower);數據的復制是單向的,只能有主節點到從節點。
Master以寫為主,Slave以讀為主。
默認情況下,每臺 Redis 服務器都是主節點;
且一個主節點可以有多個從節點(或者沒有從節點),但一個從節點只能有一個主節點。(類似小黃人,小黃人(從節點)只會跟隨一個Boss(主節點),當Boss宕機,就會尋找追隨新的Boss)
2、主從復制的作用主要包括:
1、數據冗余:主從復制實現了數據的熱備份,是持久化之外的一種數據冗余方式。
2、故障恢復:當主節點出現問題時,可以有從節點提供服務,實現快速的故障恢復;實際上是一種服務的冗余。
3、負載均衡:在主從復制的基礎上,配合讀寫分離,可以有主節點提供寫服務,由從節點提供讀服務(即寫 Redis 數據時應用連接主節點,讀 Redis 數據時應用連接從節點),分擔服務器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載。可以大大提高 Redis 服務器的并發量。
4、高可用基石:除了上述作用以外,主從復制還是哨兵和集群能夠實施的基礎,因此說主從復制時 Redis 高可用的基礎。
一般來說,要將 Redis 運用于工程項目中,只使用一臺 Redis 是萬萬不能的,原因如下:
1、從結構上,單個 Redis 服務器會發生單點故障,并且一臺服務器需要處理所有的請求負載,壓力較大;
2、從容量上,單個 Redis 服務器內容容量有限,就算一臺 Redis 服務器內存容量為256G,也不能將所有內存用作 Redis 存儲內存,一般來說,單臺 Redis 最大使用內存不應該超過20G。
電商網站上的商品,一般都是一次上傳,無數次瀏覽的,說專業點就是“多讀少寫”。
對于這種場景,我們可以使用如下這種結構:
3、配置
只配置從庫,不用配置主庫。
這里我們測試配置一主二從。
在沒有配置主從復制之前,我們先看一下配置信息
info replication
查詢當前庫信息
### redis-6379.conf127.0.0.1:6379> info replication # 查詢當前庫信息
# Replication
role:master # 角色 主機master
connected_slaves:0 # 當前連接從機個數 0
master_replid:89f39314020994147d9efb674b44c30c79cc1065
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
Redis 是通過配置文件啟動的,我們需要配置一主二從,那么就需要啟動3個 Redis 端口。
我們先復制3個配置文件
然后簡單配置一下各配置文件
### redis-6379.confport 6379 # 端口
daemonize yes # 打開后臺運行
pidfile /var/run/redis/redis-server_6379.pid # pid文件名
logfile /var/log/redis/redis-server_6379.log # 日志文件名
dbfilename dump_6379.rdb # rdb 文件名
### redis-6380.confport 6380 # 端口
daemonize yes # 打開后臺運行
pidfile /var/run/redis/redis-server_6380.pid # pid文件名
logfile /var/log/redis/redis-server_6380.log # 日志文件名
dbfilename dump_6380.rdb # rdb 文件名
### redis-6381.confport 6381 # 端口
daemonize yes # 打開后臺運行
pidfile /var/run/redis/redis-server_6381.pid # pid文件名
logfile /var/log/redis/redis-server_6381.log # 日志文件名
dbfilename dump_6381.rdb # rdb 文件名
修改完成之后,啟動我們的3個 Redis 服務器。可以看到三個 Redis 進程
4、一主二從
默認情況下,每臺Redis 服務器都是主節點;我們一般情況下只用配置從機就好了。
一主二從我們設置主庫為端口6379,從庫為6380和6381。所以我們去6380和6381端口上配置就好,主機不用配置。
測試
未配置前,各服務都為主機:
使用 slaveof host port
命令用80和81上連接主機
### redis-6380.conf
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK### redis-6381.conf
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
再次查看主從機配置信息:
我們也可以使用 slaveof no one
讓自己變回主機
注意!!!
真實的主從配置應該在配置文件中配置,這樣的話才是永久的。我們這里使用命令配置,是暫時的,關機就會失效。
配置文件中只需改如下就可以,如果主機設置了密碼需要配置上:
細節
主機可以寫,從機不能寫只能讀,主機中的所有信息和數據,都會自動被從機保存。
主機寫:
從機只能讀取內容,當執行寫操作的時候會報錯:
復制原理
Slave 啟動成功連接到 Master 后會發送一個 sync 命令。
Master 接到命令,啟動后臺的存盤進程,同時收集所有接收到的用于修改數據集命令,在后臺進程執行完畢之后,Master 將傳送整個數據文件到 Slave,并完成一次完全同步。
全量復制:而 slave 服務在接收到數據庫文件數據后,將其存盤并加載到內存中。
增量復制:Master 繼續將新的所有收集到的修改命令依次傳給 Slave ,完成同步。
但是只要是重新連接Master ,一次完全同步(全量復制)將被自動執行。
下一篇:【從0到1進階Redis】主從復制 — 主從機宕機測試