同一個Master可以擁有多個Slaves。 Master下的Slave還可以接受同一架構中其它slave的鏈接與同步請求,實現數據的級聯復制,即Master->Slave->Slave模式; Master以非阻塞的方式同步數據至slave,這將意味著Master會繼續處理一個或多個slave的讀寫請求;
4.Slave端同步數據也可以修改為非阻塞是的方式,當slave在執行新的同步時,它仍可以用舊的數據信息來提供查詢;否則,當slave與master失去聯系時,slave會返回一個錯誤給客戶端; 主從復制具有可擴展性,即多個slave專門提供只讀查詢與數據的冗余,Master端專門提供寫操作; 通過配置禁用Master數據持久化機制,將其數據持久化操作交給Slaves完成,避免在Master中要有獨立的進程來完成此操作。
slave連接上master之後,slave發送一個SYNC命令到master,master接收到命令之後,無論是第一次同步建立的連接,還是連接斷開後的重新連接,master會開啟BGSAVE操作,啟動一個後台進程,保存一份當前master內存快照,並且開始保存從調用BGSAVE之後的所有寫命令,master生成完快照之後,發送內存快照rdb文件給slave。slave接收到master發送過來的rdb文件之後,將清空所有舊數據,加載接收到的rdb文件到內存中,發送完rdb文件給slave之後,開始發送剛剛保存的寫操作日志給slave,slave執行這些寫操作,至此,主從數據保存一致。發送完寫日志之後,master會增量發送之後的寫操作給slave,使主從一致。
ps: 當master和slave的連接斷開時,slave可以自動重新建立連接。如果master同時收到多個slave發來的同步連接命令,只會使用啟動一個進程來寫內存快照,然後發送給所有的slave
redis的主從復制,通過程序實現數據的讀寫分離,讓master負責處理些請求,slave負責處理讀請求,通過擴展slave處理更多的並發請求,減輕master端的負載。
ps:在程序中判斷用戶的讀寫請求,將write請求發送給master,read請求發送給slave處理
開啟主從復制,最簡單的方式,連接上從機redis,執行slaveof <主機host> <主機端口>,另外也可以在從機的配置文件中加入slaveof <主機host> <主機端口>,這樣從機啟動的時候,就會自動連接主機,並且同步數據。
slaveof 192.168.100.126 6379 # 配置主機信息
masterauth # 如果主機設置了密碼,配置密碼
slave-serve-stale-data yes # 配置當從機正在和主機進行同步的時候是否響應,如果配置是,有可能客戶端會讀到舊數據,如果配置否,當請求讀數據的時候,將會報錯SYNC with master in progress
slave-read-only yes # 從機是否只讀。這邊設置可寫,不會同步到主機,
repl-ping-slave-period 10 # 從機發送ping命令到主機的間隔時間。
repl-timeout 60 # 主機響應超時時間,這個包括傳輸超時,IO超時,ping超時,注意這邊時間必須大於上面的間隔時間,要不然會一直報超時錯誤。
repl-disable-tcp-nodelay no # 是否禁用TCP NODELAY。官方對這個配置用法的建議是:
# By default we optimize for low latency, but in very high traffic conditions
# or when the master and slaves are many hops away, turning this to “yes” may
# be a good idea.
# 默認情況下,我們優化目的是為了低延遲,但是在高傳輸條件或者主從機分布在路由很多跳之外的,建議禁用掉tcp-nodelay。
slave-priority 100 # 如果master不能再正常工作,那麼會在多個slave中,選擇優先值最小的一個slave提升為master,優先值為0表示不能提升為master