redis主從復(fù)制原理
一、???? 原理
Redis的主從復(fù)制功能非常強(qiáng)大,一個(gè)master可以擁有多個(gè)slave,而一個(gè)slave又可以擁有多個(gè)slave,如此下去,形成了強(qiáng)大的多級(jí)服務(wù)器集群架構(gòu)。下面是關(guān)于redis主從復(fù)制的一些特點(diǎn):
1.master可以有多個(gè)slave
2.除了多個(gè)slave連到相同的master外,slave也可以連接其他slave形成圖狀結(jié)構(gòu)
3.主從復(fù)制不會(huì)阻塞master。也就是說(shuō)當(dāng)一個(gè)或多個(gè)slave與master進(jìn)行初次同步數(shù)據(jù)時(shí),master可以繼續(xù)處理client發(fā)來(lái)的請(qǐng)求。相反slave在初次同步數(shù)據(jù)時(shí)則會(huì)阻塞不能處理client的請(qǐng)求。
4.主從復(fù)制可以用來(lái)提高系統(tǒng)的可伸縮性,我們可以用多個(gè)slave 專門用于client的讀請(qǐng)求,比如sort操作可以使用slave來(lái)處理。也可以用來(lái)做簡(jiǎn)單的數(shù)據(jù)冗余
5.可以在master禁用數(shù)據(jù)持久化,只需要注釋掉master 配置文件中的所有save配置,然后只在slave上配置數(shù)據(jù)持久化。
下面介紹下主從復(fù)制的過(guò)程
?????? 當(dāng)設(shè)置好slave服務(wù)器后,slave會(huì)建立和master的連接,然后發(fā)送sync命令。無(wú)論是第一次同步建立的連接還是連接斷開(kāi)后的重新連 接,master都會(huì)啟動(dòng)一個(gè)后臺(tái)進(jìn)程,將數(shù)據(jù)庫(kù)快照保存到文件中,同時(shí)master主進(jìn)程會(huì)開(kāi)始收集新的寫命令并緩存起來(lái)。后臺(tái)進(jìn)程完成寫文件
后,master就發(fā)送文件給slave,slave將文件保存到磁盤上,然后加載到內(nèi)存恢復(fù)數(shù)據(jù)庫(kù)快照到slave上。接著master就會(huì)把緩存的命 令轉(zhuǎn)發(fā)給slave。而且后續(xù)master收到的寫命令都會(huì)通過(guò)開(kāi)始建立的連接發(fā)送給slave。從master到slave的同步數(shù)據(jù)的命令和從 client發(fā)送的命令使用相同的協(xié)議格式。當(dāng)master和slave的連接斷開(kāi)時(shí)slave可以自動(dòng)重新建立連接。如果master同時(shí)收到多個(gè) slave發(fā)來(lái)的同步連接命令,只會(huì)使用啟動(dòng)一個(gè)進(jìn)程來(lái)寫數(shù)據(jù)庫(kù)鏡像,然后發(fā)送給所有slave。
二、???? 配置
下面我演示下怎樣在多臺(tái)服務(wù)器上進(jìn)行Redis數(shù)據(jù)主從復(fù)制。我假設(shè)有兩臺(tái)服務(wù)器,一臺(tái)是Linux操作系統(tǒng)(局域網(wǎng)IP:192.168.1.4,master服務(wù)器),一臺(tái)是Linux操作系統(tǒng)(局域網(wǎng)IP:192.168.1.5,slave服務(wù)器)
配置slave服務(wù)器很簡(jiǎn)單,只需要在配置文件(redis.conf)中加入如下配置
bind? 192.168.1.5(從服務(wù)器,此處默認(rèn)是127.0.0.1,請(qǐng)修改成本機(jī)的IP地址,要不然,客戶端無(wú)法進(jìn)行訪問(wèn))
slaveof 192.168.1.4 6379? (映射到主服務(wù)器上)
如果是在一臺(tái)機(jī)器上面配置主從關(guān)系,那么還需要修改從服務(wù)器的默認(rèn)端口號(hào),同樣也在redis.conf中進(jìn)行修改。
其中還有些redis自身的配置請(qǐng)參見(jiàn)我的另一篇文章
三、???? 測(cè)試
當(dāng)啟動(dòng)master機(jī)器后,寫入數(shù)據(jù)到master后,這時(shí)啟動(dòng)slave機(jī)器,可以發(fā)現(xiàn)slave上:
會(huì)發(fā)送一個(gè)SYNC請(qǐng)求,從Master上面進(jìn)行相應(yīng),而且它支持自動(dòng)重連,即當(dāng)master掉線的情況下,它會(huì)處于等待請(qǐng)求的狀態(tài)。
而Master上:
兩臺(tái)機(jī)器的dump文件大小一樣:
192.168.1.5(slave):
192.168.1.4(master):
從Redis源碼中,可以發(fā)現(xiàn)rdb文件采用的是lzf壓縮算法進(jìn)行實(shí)現(xiàn),默認(rèn)lzf壓縮算法是開(kāi)啟的。
這樣你可以通過(guò)其他的客戶端程序或者Web平臺(tái)去讀取Slave磁盤數(shù)據(jù)庫(kù)的數(shù)據(jù),真正達(dá)到了讀寫分離的目的。
posted @ 2011-09-20 18:24 weafer 閱讀(576) 評(píng)論(0)?
編輯
Redis 的安裝配置介紹
redis 是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)。 redis的出現(xiàn),很大程度補(bǔ)償了memcached這類keyvalue存儲(chǔ)的不足,在部 分場(chǎng)合可以對(duì)關(guān)系數(shù)據(jù)庫(kù)起到很好的補(bǔ)充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。問(wèn)題是這個(gè)項(xiàng)目還很新,可能還不足夠穩(wěn)定,而且沒(méi)有在實(shí)際的一些大型系統(tǒng)應(yīng)用的實(shí)例。此外,缺乏mc中批量get也是比較大的問(wèn)題,始終批量獲取跟多次獲取的網(wǎng)絡(luò)開(kāi)銷是不一樣的。
性能測(cè)試結(jié)果:
SET操作每秒鐘 110000 次,GET操作每秒鐘 81000 次,服務(wù)器配置如下:
Linux 2.6, Xeon X3320 2.5Ghz.
stackoverflow 網(wǎng)站使用 Redis 做為緩存服務(wù)器。
安裝過(guò)程:
Redis是一種高級(jí)key-value數(shù)據(jù)庫(kù)。它跟memcached類似,不過(guò)數(shù)據(jù)可以持久化,而且支持的數(shù)據(jù)類型很豐富。有字符串,鏈表,集 合和有序集合。支持在服務(wù)器端計(jì)算集合的并,交和補(bǔ)集(difference)等,還支持多種排序功能。所以Redis也可以被看成是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù) 器。
Redis的所有數(shù)據(jù)都是保存在內(nèi)存中,然后不定期的通過(guò)異步方式保存到磁盤上(這稱為“半持久化模式”);也可以把每一次數(shù)據(jù)變化都寫入到一個(gè)append only file(aof)里面(這稱為“全持久化模式”)。
一、下載最新版
wget http://redis.googlecode.com/files/redis-2.0.0-rc4.tar.gz
二、解壓縮
tar redis-2.0.0-rc4.tar.gz
三、安裝C/C++的編譯組件(非必須)
apt-get install build-essential
四、編譯
cd redis-2.0.0-rc4
make
make命令執(zhí)行完成后,會(huì)在當(dāng)前目錄下生成本個(gè)可執(zhí)行文件,分別是redis-server、redis-cli、redis-benchmark、redis-stat,它們的作用如下:
redis-server:Redis服務(wù)器的daemon啟動(dòng)程序redis-cli:Redis命令行操作工具。當(dāng)然,你也可以用telnet根據(jù)其純文本協(xié)議來(lái)操作redis-benchmark:Redis性能測(cè)試工具,測(cè)試Redis在你的系統(tǒng)及你的配置下的讀寫性能redis-stat:Redis狀態(tài)檢測(cè)工具,可以檢測(cè)Redis當(dāng)前狀態(tài)參數(shù)及延遲狀況 在后面會(huì)有這幾個(gè)命令的說(shuō)明,當(dāng)然是從網(wǎng)上抄的。。。
五、修改配置文件
/etc/sysctl.conf
添加
vm.overcommit_memory=1
刷新配置使之生效
sysctl vm.overcommit_memory=1
補(bǔ)充介紹:
**如果內(nèi)存情況比較緊張的話,需要設(shè)定內(nèi)核參數(shù):
echo 1 > /proc/sys/vm/overcommit_memory
內(nèi)核參數(shù)說(shuō)明如下:
overcommit_memory文件指定了內(nèi)核針對(duì)內(nèi)存分配的策略,其值可以是0、1、2。
0, 表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用;如果有足夠的可用內(nèi)存,內(nèi)存申請(qǐng)?jiān)试S;否則,內(nèi)存申請(qǐng)失敗,并把錯(cuò)誤返回給應(yīng)用進(jìn)程。
1, 表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何。
2, 表示內(nèi)核允許分配超過(guò)所有物理內(nèi)存和交換空間總和的內(nèi)存
**編輯redis.conf配置文件(/etc/redis.conf),按需求做出適當(dāng)調(diào)整,比如:
daemonize yes #轉(zhuǎn)為守護(hù)進(jìn)程,否則啟動(dòng)時(shí)會(huì)每隔5秒輸出一行監(jiān)控信息
save 60 1000 #減小改變次數(shù),其實(shí)這個(gè)可以根據(jù)情況進(jìn)行指定
maxmemory 256000000 #分配256M內(nèi)存
在我們成功安裝Redis后,我們直接執(zhí)行redis-server即可運(yùn)行Redis,此時(shí)它是按照默認(rèn)配置來(lái)運(yùn)行的(默認(rèn)配置甚至不是后臺(tái)運(yùn) 行)。我們希望Redis按我們的要求運(yùn)行,則我們需要修改配置文件,Redis的配置文件就是我們上面第二個(gè)cp操作的redis.conf文件,目前 它被我們拷貝到了/usr/local/redis/etc/目錄下。修改它就可以配置我們的server了。如何修改?下面是redis.conf的主 要配置參數(shù)的意義:
daemonize:是否以后臺(tái)daemon方式運(yùn)行pidfile:pid文件位置port:監(jiān)聽(tīng)的端口號(hào)timeout:請(qǐng)求超時(shí)時(shí)間loglevel:log信息級(jí)別logfile:log文件位置databases:開(kāi)啟數(shù)據(jù)庫(kù)的數(shù)量save * *:保存快照的頻率,第一個(gè)*表示多長(zhǎng)時(shí)間,第三個(gè)*表示執(zhí)行多少次寫操作。在一定時(shí)間內(nèi)執(zhí)行一定數(shù)量的寫操作時(shí),自動(dòng)保存快照??稍O(shè)置多個(gè)條件。rdbcompression:是否使用壓縮dbfilename:數(shù)據(jù)快照文件名(只是文件名,不包括目錄)dir:數(shù)據(jù)快照的保存目錄(這個(gè)是目錄)appendonly:是否開(kāi)啟appendonlylog,開(kāi)啟的話每次寫操作會(huì)記一條log,這會(huì)提高數(shù)據(jù)抗風(fēng)險(xiǎn)能力,但影響效率。appendfsync:appendonlylog如何同步到磁盤(三個(gè)選項(xiàng),分別是每次寫都強(qiáng)制調(diào)用fsync、每秒啟用一次fsync、不調(diào)用fsync等待系統(tǒng)自己同步)
下面是一個(gè)略做修改后的配置文件內(nèi)容:
daemonize?yespidfile?/usr/local/redis/var/redis.pidport?6379timeout?300loglevel?debuglogfile?/usr/local/redis/var/redis.logdatabases?16save?900?1save?300?10save?60?10000rdbcompression?yesdbfilename?dump.rdbdir?/usr/local/redis/var/appendonly?noappendfsync?alwaysglueoutputbuf?yesshareobjects?noshareobjectspoolsize?1024
將上面內(nèi)容寫為redis.conf并保存到/usr/local/redis/etc/目錄下
然后在命令行執(zhí)行:
1
/usr/local/redis/bin/redis-server?/usr/local/redis/etc/redis.conf
即可在后臺(tái)啟動(dòng)redis服務(wù),這時(shí)你通過(guò)
1
telnet?127.0.0.1?6379
即可連接到你的redis服務(wù)。
六、啟動(dòng)服務(wù)并驗(yàn)證
啟動(dòng)服務(wù)器
./redis-server
或
$redis-server /etc/redis.conf?
查看是否成功啟動(dòng)
$ ps -ef | grep redis??
或
./redis-cli ping
PONG
七、啟動(dòng)命令行客戶端賦值取值
redis-cli set mykey somevalue
./redis-cli get mykey
八、關(guān)閉服務(wù)
$ redis-cli shutdown????
#關(guān)閉指定端口的redis-server?
$redis-cli -p 6380 shutdown
九、客戶端也可以使用telnet形式連接。
[root@dbcache conf]# telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to dbcache (127.0.0.1).
Escape character is '^]'.
set foo 3
bar
+OK
get foo
$3
bar
^]
telnet> quit
Connection closed.
posted @ 2011-09-20 18:16 weafer 閱讀(159) 評(píng)論(0)?
編輯
MySQL Replication, 主從和雙主配置
MySQL的Replication是一種多個(gè)MySQL的數(shù)據(jù)庫(kù)做主從同步的方案,特點(diǎn)是異步,廣泛用在各種對(duì)MySQL有更高性能,更高可靠性要求的場(chǎng)合。與之對(duì)應(yīng)的另一個(gè)技術(shù)是同步的MySQL Cluster,但因?yàn)楸容^復(fù)雜,使用者較少。
?
下圖是MySQL官方給出了使用Replication的場(chǎng)景:
Replication原理
?
Mysql 的 Replication 是一個(gè)異步的復(fù)制過(guò)程,從一個(gè)MySQL節(jié)點(diǎn)(稱之為Master)復(fù)制到另一個(gè)MySQL節(jié)點(diǎn)(稱之Slave)。在 Master 與 Slave 之間的實(shí)現(xiàn)整個(gè)復(fù)制過(guò)程主要由三個(gè)線程來(lái)完成,其中兩個(gè)線程(SQL 線程和 I/O 線程)在 Slave 端,另外一個(gè)線程(I/O 線程)在 Master 端。
?
要實(shí)現(xiàn) MySQL 的 Replication ,首先必須打開(kāi) Master 端的 Binary Log,因?yàn)檎麄€(gè)復(fù)制過(guò)程實(shí)際上就是 Slave 從 Master 端獲取該日志然后再在自己身上完全順序的執(zhí)行日志中所記錄的各種操作。
?
看上去MySQL的Replication原理非常簡(jiǎn)單,總結(jié)一下:
???? * 每個(gè)從僅可以設(shè)置一個(gè)主。
??? * 主在執(zhí)行sql之后,記錄二進(jìn)制log文件(bin-log)。
??? * 從連接主,并從主獲取binlog,存于本地relay-log,并從上次記住的位置起執(zhí)行sql,一旦遇到錯(cuò)誤則停止同步。
??
從這幾條Replication原理來(lái)看,可以有這些推論:
???? * 主從間的數(shù)據(jù)庫(kù)不是實(shí)時(shí)同步,就算網(wǎng)絡(luò)連接正常,也存在瞬間,主從數(shù)據(jù)不一致。
??? * 如果主從的網(wǎng)絡(luò)斷開(kāi),從會(huì)在網(wǎng)絡(luò)正常后,批量同步。
??? * 如果對(duì)從進(jìn)行修改數(shù)據(jù),那么很可能從在執(zhí)行主的bin-log時(shí)出現(xiàn)錯(cuò)誤而停止同步,這個(gè)是很危險(xiǎn)的操作。所以一般情況下,非常小心的修改從上的數(shù)據(jù)。
??? * 一個(gè)衍生的配置是雙主,互為主從配置,只要雙方的修改不沖突,可以工作良好。
??? * 如果需要多主的話,可以用環(huán)形配置,這樣任意一個(gè)節(jié)點(diǎn)的修改都可以同步到所有節(jié)點(diǎn)。
??
主從設(shè)置
?
因?yàn)樵肀容^簡(jiǎn)單,所以Replication從MySQL 3就支持,并在所有平臺(tái)下可以工作,多個(gè)MySQL節(jié)點(diǎn)甚至可以不同平臺(tái),不同版本,不同局域網(wǎng)。做Replication配置包括用戶和my.ini(linux下為my.cnf)兩處設(shè)置。
?
首先在主MySQL節(jié)點(diǎn)上,為slave創(chuàng)建一個(gè)用戶:
?
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'192.168.1.10' IDENTIFIED BY 'slave';
?
實(shí)際上,為支持主從動(dòng)態(tài)同步,或者手動(dòng)切換,一般都是在所有主從節(jié)點(diǎn)上創(chuàng)建好這個(gè)用戶。然后就是MySQL本身的配置了,這需要修改my.cnf或者my.ini文件。在mysqld這一節(jié)下面增加:
?
server-id=1???
auto-increment-increment=2????
auto-increment-offset=1????
log-bin????
binlog-do-db=mstest????
binlog_format=mixed
?
master-host=192.168.1.62???
master-user=slave????
master-password=slave????
replicate-do-db=mstest
?
上面這兩段設(shè)置,前一段是為主而設(shè)置,后一段是為從設(shè)置的。也就是說(shuō)在兩個(gè)MySQL節(jié)點(diǎn)上,各加一段就好。binlog-do-db和replicate-do-db就是設(shè)置相應(yīng)的需要做同步的數(shù)據(jù)庫(kù)了,auto-increment-increment和auto-increment-offset是為了支持雙主而設(shè)置的(參考下一節(jié)),在只做主從的時(shí)候,也可以不設(shè)置。
?
雙主的設(shè)置
?
從原理論來(lái)看MySQL也支持雙主的設(shè)置,即兩個(gè)MySQL節(jié)點(diǎn)互為主備,不過(guò)雖然理論上,雙主只要數(shù)據(jù)不沖突就可以工作的很好,但實(shí)際情況中還是很容發(fā)生數(shù)據(jù)沖突的,比如在同步完成之前,雙方都修改同一條記錄。因此在實(shí)際中,最好不要讓兩邊同時(shí)修改。即邏輯上仍按照主從的方式工作。但雙主的設(shè)置仍然是有意義的,因?yàn)檫@樣做之后,切換主備會(huì)變的很簡(jiǎn)單。因?yàn)樵诔霈F(xiàn)故障后,如果之前配置了雙主,則直接切換主備會(huì)很容易。
? 雙主在設(shè)置時(shí),只需將上面的一段設(shè)置復(fù)制一份,分別寫入兩個(gè)MySQL節(jié)點(diǎn)的配置文件,但要修改相應(yīng)的server-id,auto-increment-offset和master-host。auto-increment-offset就是為了讓雙主同時(shí)在一張表中進(jìn)行添加操作時(shí)不會(huì)出現(xiàn)id沖突,所以在兩個(gè)節(jié)點(diǎn)上auto-increment-offset設(shè)置為不同的值就好。? 另:不要忘了,在兩個(gè)節(jié)點(diǎn)上都為對(duì)方創(chuàng)建用戶。?應(yīng)用層的負(fù)載均衡? 本文只介紹了MySQL自身的Repilication配置,在上面的圖中也可以看出,有了Replication,還需要應(yīng)用層(或者中間件)做一個(gè)負(fù)載均衡,這樣才能最大程度發(fā)揮MySQL
Replication的優(yōu)勢(shì),這些將在以后探討。





