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中要有獨立的進程來完成此操作。
    Replication的工作原理:

    在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 no
auto-aof-rewrite-percentage 100
auto-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.swap
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 4

###ADVANCED CONFIG 設置,下面的設置主要是用來節省內存的,我沒有對它們做修改
hash-max-zipmap-entries 512   
hash-max-zipmap-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing 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,看兩個是否同步,如果沒有同步,及時報警。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章