一般在企業(yè)里面不太可能使用單機版的redis,都會有多個redis節(jié)點只锻,實現(xiàn)讀寫分離,負載均衡甚至現(xiàn)在都基本上都是高可用的redis集群。但是這些redis之間的信息怎么進行交互摸吠,怎么實現(xiàn)數(shù)據同步就是最基本的問題了。
主從復制嚎花,是指將master節(jié)點是數(shù)據的同步到它下面的slaver節(jié)點蜕便,復制路徑是單向的,只能master節(jié)點到slaver節(jié)點贩幻,而且一個master節(jié)點可以有多個slaver節(jié)點轿腺。而且master以寫為主,slave以讀為主丛楚。有全量復制和增量復制兩種族壳。
全量復制:
- master節(jié)點通過bgsave命令fork一個子進程進行RDB持久化,生成一個dump.rdb文件趣些,master節(jié)點再通過網絡將RDB文件發(fā)送給slaver節(jié)點仿荆。
- slaver節(jié)點收到dump.rdb文件之后會清空當前的數(shù)據、加載新RDB文件恢復數(shù)據坏平,但是恢復數(shù)據的過程是阻塞的拢操,無法響應客戶端的命令。
全量復制對主從節(jié)點的帶寬CPU都會帶來比較大的消耗舶替,所以能不能有一個方法盡量少使用全量復制也能達到同步的目的令境。
增量復制:
- 實現(xiàn)增量復制需要master和slaver節(jié)點都分別維護一個偏移量offset(記錄同步到哪里了),而且每個slaver節(jié)點會多維護一個相對應的master的runid顾瞪,來區(qū)分是不是上次同步是不是也和這個master節(jié)點來進行同步舔庶。
- 有了offset和runid之后抛蚁,我們就沒必要再進行全量復制了,因為我們相當于已經記錄了我上次和你已經同步到哪里了惕橙,然后我這一次就只要接著上次的位置開始同步就行了瞧甩。而且,master節(jié)點他維護著一個先進先出隊列作為復制積壓緩沖區(qū)弥鹦,將上次同步之后改變的數(shù)據都存入了這個緩沖區(qū)里面肚逸,這樣又少了一次master節(jié)點的IO操作,效率更高彬坏。
只能全量復制的情況:
- 但是如果復制積壓緩沖區(qū)如果溢出了吼虎,就會產生數(shù)據的丟失,那就將無法執(zhí)行增量復制苍鲜,只能執(zhí)行全量復制。
- master節(jié)點掛了玷犹,又重新來了一個master節(jié)點混滔,這個新來的master節(jié)點的數(shù)據有可能和掛了的哪個master節(jié)點可能數(shù)據不一致,所以必須進行全量復制歹颓,slaver是通過runid來判斷是不是master節(jié)點坯屿,每個Redis節(jié)點。