Redis學習 - 主從拷貝

haifeng0730發表於2015-05-07

Redis主從拷貝的特點

  1. 同一個Master可以擁有多個Slaves。
  2. Master下的Slave還可以接受同一架構中其它slave的連結與同步請求,實現資料的級聯複製,即Master->Slave->Slave模式;
  3. Master以非阻塞的方式同步資料至slave,這將意味著Master會繼續處理一個或多個slave的讀寫請求;
    4.Slave端同步資料也可以修改為非阻塞是的方式,當slave在執行新的同步時,它仍可以用舊的資料資訊來提供查詢;否則,當slave與master失去聯絡時,slave會返回一個錯誤給客戶端;
  4. 主從複製具有可擴充套件性,即多個slave專門提供只讀查詢與資料的冗餘,Master端專門提供寫操作;
  5. 通過配置禁用Master資料持久化機制,將其資料持久化操作交給Slaves完成,避免在Master中要有獨立的程式來完成此操作。

Redis主從拷貝的過程
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

Master write, Slave read機制
redis的主從複製,通過程式實現資料的讀寫分離,讓master負責處理些請求,slave負責處理讀請求,通過擴充套件slave處理更多的併發請求,減輕master端的負載。

ps:在程式中判斷使用者的讀寫請求,將write請求傳送給master,read請求傳送給slave處理

redis主從拷貝配置
開啟主從複製,最簡單的方式,連線上從機redis,執行slaveof ,另外也可以在從機的配置檔案中加入slaveof ,這樣從機啟動的時候,就會自動連線主機,並且同步資料。

slaveof 192.168.100.126 6379 # 配置主機資訊
masterauth <master-password> # 如果主機設定了密碼,配置密碼
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

相關文章