標籤:redis 主從
下面的列表清楚的解釋了Redis Replication的特點和優勢。
1). 同一個Master可以同步多個Slaves。
2). Slave同樣可以接受其它Slaves的串連和同步請求,這樣可以有效分載Master的同步壓力。因此我們可以將Redis的Replication架構視為圖結構。
3). Master Server是以非阻塞的方式為Slaves提供服務。所以在Master-Slave同步期間,用戶端仍然可以提交查詢或修改請求。
4). Slave Server同樣是以非阻塞的方式完成資料同步。在同步期間,如果有用戶端提交查詢請求,Redis則返回同步之前的資料。
5). 為了分載Master的讀操作壓力,Slave伺服器可以為用戶端提供唯讀操作的服務,寫服務仍然必須由Master來完成。即便如此,系統的伸縮性還是得到了很大的提高。
6). Master可以將資料儲存操作交給Slaves完成,從而避免了在Master中要有獨立的進程來完成此操作。
在Slave啟動並串連到Master之後,它將主動發送一個SYNC命令。此後Master將啟動後台存檔進程,同時收集所有接收到的用於修改資料集的命令,在後台進程執行完畢後,Master將傳送整個資料庫檔案到Slave,以完成一次完全同步。而Slave伺服器在接收到資料庫檔案資料之後將其存檔並載入到記憶體中。此後,Master繼續將所有已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些資料修改命令,從而達到最終的資料同步。
如果Master和Slave之間的連結出現斷連現象,Slave可以自動重連Master,但是在串連成功之後,一次完全同步將被自動執行。
下面是我使用的配置,使用主從模式,在master上關掉所有持久化,在slave上使用AOF持久化:
$cat /opt/redis/etc/redis.conf
######Master config###General 配置daemonize yes #使用daemon 方式運行程式,預設為非daemon方式運行pidfile /tmp/redis.pid #pid檔案位置port 6379 #使用預設連接埠timeout 30 # client 端空閑中斷連線的時間loglevel warning #日誌記錄層級,預設是notice,我這邊使用warning,是為了監控日誌方便。使用warning後,只有發生警示才會產生日誌,這對於通過判斷記錄檔是否為空白來監控警示非常方便。logfile /opt/logs/redis/redis.log #日誌產生的位置databases 16 #預設是0,也就是只用1 個db,我這邊設定成16,方便多個應用使用同一個redis server。使用select n 命令可以確認使用的redis db ,這樣不同的應用即使使用相同的key也不會有問題。###下面是SNAPSHOTTING持久化方式的策略。為了保證資料相對安全,在下面的設定中,更改越頻繁,SNAPSHOTTING越頻繁,也就是說,壓力越大,反而花在持久化上的資源會越多。所以我選擇了master-slave模式,並在master關掉了SNAPSHOTTING。#save 900 1 #在900秒之內,redis至少發生1次修改則redis抓快照到磁碟#save 300 100 #在300秒之內,redis至少發生100次修改則redis抓快照到磁碟#save 60 10000 #在60秒之內,redis至少發生10000次修改則redis抓快照到磁碟rdbcompression yes #使用壓縮dbfilename dump.rdb #SNAPSHOTTING的檔案名稱dir /opt/data/redis/ #SNAPSHOTTING檔案的路徑###REPLICATION 設定,#slaveof#如果這台機器是台redis slave,可以開啟這個設定。如果使用master-slave模式,我就會在master上把SNAPSHOTTING關了,這樣可以不用在master上做持久化,而是在slave上做,這樣可以大大提高master 記憶體使用量率和系統效能。#slave-serve-stale-data yes #如果slave 無法與master 同步,是否還可以讀### SECURITY 設定 #requirepass aaaaaaaaa #redis效能太好,用個passwd 意義不大#rename-command FLUSHALL "" #可以用這種方式關掉非常危險的命令,如FLUSHALL這個命令,它清空整個 Redis 伺服器的資料,而且不用確認且從不會失敗###LIMIT 設定maxclients 0 #無client串連數量限制maxmemory 14gb #redis最大可使用的記憶體量,我的伺服器記憶體是16G,如果使用redis SNAPSHOTTING的copy-on-write的持久會寫方式,會額外的使用記憶體,為了使持久會操作不會使用系統VM,使redis伺服器效能下降,建議保留redis最大使用記憶體的一半8G來留給持久化使用,我個人覺得非常浪費。我沒有在master上不做持久化,使用主從方式maxmemory-policy volatile-lru #使用LRU演算法刪除設定了到期時間的key,但如果程式寫的時間沒有寫key的到期時間,建議使用allkeys-lru,這樣至少保證redis不會不可寫入。###APPEND ONLY MODE 設定appendonly no #不使用AOF,AOF是另一種持久化方式,我沒有使用的原因是這種方式並不能在伺服器或磁碟損壞的情況下,保證資料可用性。appendfsync everysec no-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb###SLOW LOG 設定slowlog-log-slower-than 10000 #如果操作時間大於0.001秒,記錄slow log,這個log是記錄在記憶體中的,可以用redis-cli slowlog get 命令查看slowlog-max-len 1024 #slow log 的最大長度###VIRTUAL MEMORY 設定vm-enabled no #不使用虛擬記憶體,在redis 2.4版本,作者已經非常不建議使用VM。vm-swap-file /tmp/redis.swapvm-max-memory 0vm-page-size 32vm-pages 134217728vm-max-threads 4###ADVANCED CONFIG 設定,下面的設定主要是用來節省記憶體的,我沒有對它們做修改hash-max-zipmap-entries 512 hash-max-zipmap-value 64list-max-ziplist-entries 512list-max-ziplist-value 64set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64activerehashing yes###INCLUDES 設定 ,使用下面的配置,可以配置一些個另其它的設定,如slave的配置#include /path/to/local.conf#include /path/to/other.conf#include /opt/redis/etc/slave.conf 如果是slave server,把這個注釋開啟
slave 配置:
$cat /opt/redis/etc/slave.conf
######slave config###REPLICATION 設定,slaveof redis01 6397 #如果這台機器是台redis slave,可以開啟這個設定。如果使用master-slave模式,我就會在master上把SNAPSHOTTING關了,這樣可以不用在master上做持久化,而是在slave上做,這樣可以大大提高master 記憶體使用量率和系統效能。slave-serve-stale-data no #如果slave 無法與master 同步,設定成slave不可讀,方便監控指令碼發現問題。###APPEND ONLY MODE 設定appendonly yes #在slave上使用了AOF,以保證資料可用性。
其它後繼資料備份工作
1、用redis-cli bgsave 命令每天淩晨一次持久化一次master redis上的資料,並CP到其它備份伺服器上。
2、用redis-cli bgrewriteaof 命令每半小時持久化一次 slave redis上的資料,並CP到其它備份伺服器上。
3、寫個指令碼 ,定期get master和slave上的key,看兩個是否同步,如果沒有同步,及時警示。
本文出自 “章小魚兒_linux” 部落格,謝絕轉載!