Redis 的主從複製配置首先要理解Redis主從結構的特性。html
Redis master能夠鏈接多個Slave,一個Slave能夠擁有master身份被多個slave連接,也就是說,redis每一個節點的角色能夠同時是master和slave。java
redis 複製在 slave 這一端也是非阻塞的。在配置文件裏面有 slave-serve-stale-data 這一項,若是它爲 yes ,slave 在執行同步時,它可使用老版本的數據來處理查詢請求,若是是 no ,slave 將返回一個錯誤。在完成同步後,slave 須要刪除老數據,加載新數據,在這個階段,slave 會阻止鏈接進來。redis
使用複製能夠避免 master 由於須要把所有的數據集寫入磁盤而形成的開銷,所以能夠把 master 中 save 配置項所有註釋掉,不讓它進行保存,而後配置 slave ,讓 slave 保存。雖然有這個特性,可是咱們好像通常不這麼作。數據庫
關於基本配置項工具
daemonize no 說明:是否把redis-server啓動在後臺,默認是「否」。若改爲yes,會生成一個pid文件。
pidfile /var/run/redis.pid 說明:redis-server的pid文件。
port 6379 說明:redis-server的端口號
dbfilename dump.rdb 說明:數據庫文件的位置,最好添加絕對路徑,若不添加時在啓動用戶的home目錄下。
loglevel verbose 說明:日誌級別,有四種,debug,verbose,notice,warning。
logfile stdout 說明:日誌的輸出文件,默認是標準輸出。例如:logfile /tmp/redis.log
咱們這裏使用進程來模擬上臺主機
ui
主機1:127.0.0.1:9001 (master)spa
主機2:127.0.0.1:9002 (slave1).net
主機3:127.0.0.1:9003 (slave2)命令行
打開每一個redis的redis.conf,主要修改以下幾項,如下除了端口不一致,其餘的都相同debug
port 9001 --端口 min-slaves-to-write 3 --用於報告master被報告超過3個slave報告宕機時觸發sentinel去調整集羣 masterauth pass123456789 --密碼,在主從複製中開啓密碼 requirepass pass123456789 --master密碼,配置成同樣的,便於管理 slave-read-only no --設置爲no,不然只能單向複製(master->slave)
而後按照命令啓動各自的redis-server
redis-server redis.conf
接下來使用終端命令行工具,登陸啓動每一個redis-server
redis-cli -h 127.0.0.1 -p 9001 -a pass123456789
redis-cli -h 127.0.0.1 -p 9002 -a pass123456789
redis-cli -h 127.0.0.1 -p 9003 -a pass123456789
而後讓9001做爲9002和9003的master
在9002和9003客戶端執行
slaveof 127.0.0.1 9001
經過9001驗證命令
set testKey1 '1234'
而後再9002,9003執行以下命令,獲得的值和 「1234」同樣,那麼意味着配置成功
get testKey1
但問題來了,master能夠閒slave寫數據,但slave寫的數據沒法同步到master,目前只實現了單向同步,對於雙向同步,如何解決呢?
答案是讓master委屈求全和slave作朋友,做爲一種平等的關係,這種關係的判斷是,雙方你情我願同樣,互相是對方的slave,同時也是對方的master。
咱們讓master成爲slave的朋友,很簡單.
master執行以下命令
exit
redis-cli -h 127.0.0.1 -p 9001 -a pass123456789
slaveof 127.0.0.1 9002
slaveof 127.0.0.1 9003
之因此重啓master,主要問題是master可能會遭遇一些意想不到的問題。
以上即可實現主從雙向同步複製。