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