master
節點提供數據,也就是寫。slave
節點負責讀。redis
不是說master 分支不能讀數據,也能只是咱們但願將讀寫進行分離。數據庫
slave 是不能寫數據的,只能處理讀請求服務器
客戶端 127.0.0.1:6379
服務器 212.64.89.173:6379
網絡
客戶端發送請求同步命令架構
slaveof masterip masterport
併發
slaveof 212.64.89.173 6379
客戶端啓動服務器參數負載均衡
redis-server --slaveof masterip masterport
高併發
redis-server --slaveof 212.64.89.173 6379
在客戶端的配置文件中寫入 slaveof
信息ui
redis.conf slaveof 212.64.89.173 6379
注意 斷開主從連接方式: 客戶端執行 slaveof no one
加密
服務啓動後設置
config set requierpass <password>
配置文件添加密碼
# redis.conf requirepass <password>
命令設置密碼
auth <password>
配置文件設置密碼
masterauth <password>
啓動客戶端設置密碼
redis-cli -a <password>
創建連接的過程就是但願 master
和 slave
都保有對方的 IP
和 Port
。
數據的同步分兩部分,全量同步和增量同步,在增量同步結束後,master 應當保存Slave 同步數據的位置。
它有兩部分組成 偏移量
+ 字節值
1 當啓動AOF
時就會建立 複製積壓緩衝區
2 當被選爲 master
節點,必須建立積壓緩衝區
保存全部的對數據修改或數據庫修改的指令,查詢指令不會被記錄。
全部的進入master
的對數據修改或數據庫修改的指令都會被填充到積壓緩衝區中。
1 Master
和 Slave
都會記錄 offset
值, 每次複製都會對比offset
是否一致。若是一致,Master
直接從 offset
處開始傳緩衝區數據,若是不一致,那麼Master
將遵循 Slave
的offset
來傳。固然會保證命令是完整的。
2 Master
保存有多個 offset
而 Slave
僅保存本身的。
3 Master
發送一次,記錄一次, Slave
接受一次記錄一次。
1若是master 數據量過大,應該避免業務高峯期進行數據同步。避免形成 master 阻塞
2 數據緩衝區滿, 此時將會丟棄最先的記錄(FIFO),若是全量複製的時間開銷過大,則可能在開增量複製時候已經存在數據丟失,這會致使Master 和 Slave 數據不一致,爲了保證一致性,必須開始新一輪的全量複製,完成後緩衝區又被填滿並存在丟棄,則會讓Slave進入死循環。
所以數據緩衝區要設置的大小合適(依具體狀況而定)。
repl-backlog-size 1mb # 默認的大小爲 1MB
3 master
單機內存不該該佔用主機內存過多。通常的 50 ~ 70% 預留下 30% ~ 50%來進行bgsave
、 建立複製緩衝區
、執行其餘業務等。
1 爲避免slave
進行全量複製、部分複製時服務器響應阻塞或數據不一樣步,建議關閉此期間的對外服務。
slave-server-stale-data yes|no
2 數據同步階段,master
發送給 slave
信息能夠理解 master
是 slave
的一個客戶端,主動向slave發送命令。
3 多個slave
同時對master
請求數據同步,master
發送的RDB
文件增多,會對帶寬形成巨大沖擊,若是master
寬帶不足,所以數據同步須要根據業務需求,適量錯峯。
4 slave
過多時,應該對拓撲結構進行調整,由一主多從結構變爲樹狀結構,中間結點便是master,也是slave。可是使用樹狀結構時,由於層級越深,數據同步時延越大,所以將強一致性的數據放在頂層節點,一致性稍弱的數據放在靠底層的節點。
當master
數據庫狀態被修改後,致使主從服務器數據庫狀態不一致,此時須要讓主從數據同步到一致的狀態,同步的動做成爲命令傳播
master
將接受到的數據變動命令發送給slave
,slave
接受命令後執行命令。
網絡閃斷閃連 忽略
短期網絡中斷 部分複製
長時間網絡中斷 全量複製
每臺服務器每次運行都會產生的身份識別碼,同一個服務器屢次運行產生的runid
是不同的。
形式:runid 由 40 個字符組成 通常是16進制的字符串
info server run_id:409b6e9ea2e5c32958de8f365711598c98489f13
master
指令 PING
週期 repl-ping-slave-period
默認是 10s
做用 判斷 slave
是否在線
查詢 INFO replication 獲取最後一次 slave
鏈接時間間隔 lag = 0 / 1 屬於正常
slave
指令 REPLCONF{offset}
週期: 1s
做用1: 彙報本身的複製偏移量 獲取最新的數據變動指令
做用2: 判斷 master
是否存活
當 salve多數掉線 或者網絡延時太高時,master 會拒絕全部的同步信息。
min-slaves-to-write 2 # 最小的 slave 數量 min-slaves-max-lag 8 # 最長的
當 slave 的數量小於2 ,或者全部的時延都大於等於 8 時,會強 關閉 master
的血功能來中止數據同步。
Slave 的數量和延時由REPLCONF{offset}
命令確認。
在redis主從架構中,Master節點負責處理寫請求,Slave節點只處理讀請求。對於寫請求少,讀請求多的場景,例如電商詳情頁,經過這種讀寫分離的操做能夠大幅提升併發量,經過增長redis從節點的數量可使得redis的QPS達到10W+。
基於主從結構,配合讀寫分離,由slave分擔master負載,並根據需求的變化,改變slave的數量,經過多個從節點分擔數據讀取負載,大大提升Redis服務器併發量與數據吞吐量
當master出現問題時,由slave提供服務,實現快速的故障恢復
實現數據熱備份,時持久化以外的一種數據冗餘方式
基於主從複製,構建哨兵模式與集羣,實現redis 的高可用方案。