1、Redis主從複製架構的介紹node
## 基本介紹redis
01:一個主能夠有多個從(一主多從);從庫下能夠有多個從(級聯式主從); 02:Redis主從複製時是使用異步複製(主無論slave有沒有接收到數據); 03:複製時不會阻塞主服務器響應客戶端的請求,由於在進行數據同步時, 主上面執行bgsave命令for出一個子進程來進行數據的同步操做; 04:在複製時可能會影響slave端redis的主進程對客戶端的響應;在2.8版本 之後,slave默認是隻讀的哈? 例如:主從複製架構,寫是在master端進行,你經過手段作了讀寫分離, 讓客戶端在slave中進行讀的操做,此時slave在同步(無論全同步,仍是 增量同步)master端的數據時會不會阻塞客戶端的讀取操做呢? 解答:這個實際上是由參數slave-serve-stale-data控制的,它有兩個值, yes和no;yes表示仍然響應,可能數據不是最新的;默認就是yes;no表示 不響應,給客戶端報"SYNC with master in progress"錯誤;
## 主從複製時的一個數據安全問題安全
## 基於有數據持久化(無論是RDB仍是AOF)的需求下: 01:Master端若沒有開啓持久化,而Slave中開啓了持久化; 02:若Master端重啓或宕服/機恢復後,會銷燬Slave中的數據(持久化文件和內存中的數據)
2、主從複製的原理bash
## Master端的參數配置服務器
## Basic parameters bind 172.16.1.31 # Master端redis綁定的IP地址 protected-mode yes # 開啓安全模式,只能經過bind的地址鏈接 port 6379 # Master端redis監聽的端口 maxmemory 1GB requirepass chenliang # Master端redis的鏈接密碼 daemonize yes databases 16 syslog-enabled no loglevel notice logfile /data/redis/6379/logs/redis.log pidfile /data/redis/6379/run/redis.pid unixsocket /data/redis/6379/run/redis.sock ## Client maxclients 10000 timeout 300 tcp-backlog 511 tcp-keepalive 60 ## RDB Persistence save 900 1 # 900秒內有1個key被改變就進行rdb持久化 save 300 10 # 300秒內有10個key被改變就進行rdb持久化 save 60 10000 # 60秒內有10000個key被改變就進行rdb持久化 dir /data/redis/6379/data/ # 持久化文件的保存路徑 dbfilename dump.rdb # rdb持久化的文件名稱 rdbcompression yes # 對字符串是否開啓壓縮,默認是yes rdbchecksum yes # 是否對持久化文件進行檢測 ## replication repl-disable-tcp-nodelay no # 在主從複製的時候關閉tcp的延遲,這樣master一但有數據產生,當即發送給slave; repl-timeout 60 # 主從複製的超時時間,默認是60秒,不要超過timeout的時間,數據集較大時要調大; repl-diskless-sync no # 關閉redis的無盤複製,默認也是no,還在實驗中,不要開啓哈;
## Slave端的參數配置架構
## Basic parameters bind 172.16.1.32 protected-mode yes port 6379 maxmemory 1GB requirepass chenliang daemonize yes databases 16 syslog-enabled no loglevel notice logfile /data/redis/6379/logs/redis.log pidfile /data/redis/6379/run/redis.pid unixsocket /data/redis/6379/run/redis.sock ## Client maxclients 10000 timeout 300 tcp-backlog 511 tcp-keepalive 60 ## RDB Persistence save 900 1 save 300 10 save 60 10000 dir /data/redis/6379/data/ dbfilename dump.rdb rdbcompression yes rdbchecksum yes # replication slaveof 172.16.1.31 6379 # 告訴slave它要鏈接的Master的IP、端口 masterauth "chenliang" # 告訴slave鏈接Master時須要的密碼,前面master進行了設置的 repl-ping-slave-period 10 # slave每隔10秒檢測(ping)一下master是否存活 repl-timeout 60 # slave-read-only yes # 設置slave爲只讀,2.8版本之後默認是隻讀的哈 slave-serve-stale-data yes # slave與master斷開,或者正在全量同步數據時,slave是否響應客戶端的讀請求;
## 當Slave第一次與Master創建鏈接的過程;Master和Slave都開啓了RDB持久化。less
## Slave與Master創建鏈接後,Master端產生數據了;接上圖異步
## Slave與Master創建鏈接後,Slave重啓或者宕機恢復後[但slave的RDB持久化文件沒有被移除或損壞,Master也仍是好好的運行着哈,重來沒有重啓過]。接上圖socket
## Master重啓或宕服恢復後,Slave再次鏈接Master時的過程tcp