1 前期需要了解的一些知識(shí)
1.1 redis在Mac下的安裝
簡(jiǎn)單來說就一個(gè)命令 brew install redis,具體如何安裝請(qǐng)參考 http://www.reibang.com/p/6b5eca8d908b
1.2 redis 的啟動(dòng)
redis 啟動(dòng)分為服務(wù)器啟動(dòng)和客戶端啟動(dòng)。
1.2.1redis服務(wù)器的啟動(dòng):
redis-server + 【對(duì)應(yīng)的配置文件】 +【&】 后臺(tái)啟動(dòng)
1.2.2 redis客戶端的啟動(dòng):
redis-cli + 【host】 + 【port】
1.3 為什么需要復(fù)制牌芋?怎么才能產(chǎn)生復(fù)制?
因?yàn)橛袉吸c(diǎn)問題耕姊,所有需要主從牵啦,有了主從就需要數(shù)據(jù)的同步,所有就有了復(fù)制。需要注意的是主從不能保證高可用仍劈,思考如何實(shí)現(xiàn)高可用?
產(chǎn)生復(fù)制很簡(jiǎn)單寡壮,也是一個(gè)命令slaveof
其他的主從關(guān)系可以通過修改配置文件:http://www.cnblogs.com/liuling/p/2014-4-19-02.html
前期準(zhǔn)備已經(jīng)完事了贩疙,直奔主題了。
2 redis 復(fù)制
首先况既,要講的是redis版本為2.8以前的復(fù)制功能这溅。redis2.8以前的復(fù)制主要包括兩個(gè)步驟:
2.1 sync
sync的操作主要是:
sync演示:
2.2 命令傳播
sync之后主從服務(wù)器確實(shí)能夠達(dá)到一致狀態(tài),但是有一個(gè)問題達(dá)到一致狀態(tài)之后棒仍,如果主服務(wù)器執(zhí)行了一個(gè)刪除命令悲靴,此時(shí)就會(huì)再次造成主從服務(wù)器不一致的情況,如何解決這個(gè)問題呢莫其?就需要命令傳播機(jī)制了癞尚,主服務(wù)器將自己執(zhí)行的寫操作命令發(fā)送給從服務(wù)器耸三,使得主從再次達(dá)到一致狀態(tài)。
舊版本的復(fù)制功能有什么問題呢浇揩?
當(dāng)舊版本的復(fù)制時(shí)候出現(xiàn)了斷電或者網(wǎng)絡(luò)超時(shí)等情況仪壮,效率會(huì)很低下,原因是這樣的胳徽。
主要是因?yàn)榕f版本復(fù)制在執(zhí)行完sync之后积锅,會(huì)執(zhí)行命令傳播,然而在命令傳播的過程中如果發(fā)生了網(wǎng)絡(luò)中斷等情況的時(shí)候养盗,
就需要重新執(zhí)行sync乏沸,sync命令是很耗內(nèi)存和CPU的,就相當(dāng)于沒有記錄網(wǎng)絡(luò)中斷的點(diǎn)爪瓜,因此效率很低下蹬跃。
3 新版本的部分同步功能
3.1 為了解決舊版本同步效率低下,引入psync,在pync之前铆铆,需要了解三個(gè)概念
3.1.1 offset 偏移量
表示主服務(wù)器的復(fù)制偏移量和從服務(wù)器的復(fù)制偏移量蝶缀,簡(jiǎn)單理解就是記錄每次復(fù)制的起點(diǎn)位置,當(dāng)主服務(wù)器每次向從服務(wù)器傳播n個(gè)字節(jié)的數(shù)據(jù)時(shí)薄货,就將自己的復(fù)制偏移量加n,從服務(wù)器接受到主服務(wù)器發(fā)送過來的n個(gè)字節(jié)就將自己的偏移量也移動(dòng)n個(gè)位置翁都,但是這里也有一個(gè)問題是,如果我們的某一臺(tái)從服務(wù)器斷線了谅猾,主服務(wù)器如何重新同步自己的數(shù)據(jù)給從服務(wù)器呢柄慰?
3.1.2 復(fù)制積壓緩沖器
復(fù)制積壓緩沖器是一個(gè)長(zhǎng)度固定的先進(jìn)先出的隊(duì)里,并且這個(gè)隊(duì)列的長(zhǎng)度是固定(默認(rèn)為1m),每次當(dāng)主服務(wù)器給從服務(wù)器發(fā)送命令的時(shí)候也會(huì)給自己的復(fù)制積壓緩沖器寫一份數(shù)據(jù)税娜,并且復(fù)制積壓緩沖區(qū)會(huì)把offset記錄下來坐搔。這個(gè)復(fù)制積壓緩沖區(qū)需要根據(jù)每秒寫的數(shù)量和斷開重連的時(shí)間來設(shè)置 當(dāng)某一次復(fù)制斷開以后,從服務(wù)器發(fā)送psync和自己的offset之后敬矩,主服務(wù)會(huì)根據(jù)偏移量去復(fù)制積壓緩存區(qū)找概行,如果存在的話,回復(fù)從服務(wù)器開始部分同步模式弧岳。因?yàn)閺姆?wù)可能不止一個(gè)凳忙,因此在同步的時(shí)候我們需要引入另外一個(gè)東西,機(jī)器號(hào)禽炬,根據(jù)機(jī)器號(hào)可以進(jìn)行主從服務(wù)器的匹配涧卵。
3.1.3 機(jī)器號(hào) runid
服務(wù)器運(yùn)行的機(jī)器號(hào),因?yàn)樾掳嫱降臅r(shí)候腹尖,主服務(wù)器會(huì)將自己的機(jī)器號(hào)發(fā)給從服務(wù)器柳恐,當(dāng)斷線之后從服務(wù)器再次向主服務(wù)器請(qǐng)求同步的時(shí)候會(huì)帶著主服務(wù)器給他的主服務(wù)器的機(jī)器號(hào)。從這個(gè)角度也能推算出這次同步是sync還是psync.