# 主從復制
Redis 的復制功能是支持多個數據庫之間的數據同步。主數據庫可以進行讀寫操作,當主數據庫的數據發生變化時會自動將數據同步到從數據庫。從數據庫一般是只讀的,它會接收主數據庫同步過來的數據。一個主數據庫可以有多個從數據庫,而一個從數據庫只能有一個主數據庫。
**數據的復制是單向的,只能由主節點到從節點。 Master以寫為主,Slave 以讀為主。**
默認情況下,每臺Redis服務器都是主節點;
且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。
## 作用
1. 數據冗余:主從復制實現了數據的熱備份,是持久化之外的一種數據冗余方式。
2. 故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復;實際上是一種服務的冗余。
3. 負載均衡衡:在主從復制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務,分擔服務器負載
4. 高可用的基礎
## 原理
1. 當啟動一個從節點時,它會發送一個`PSYNC`命令給主節點;
2. 如果是從節點**初次連接到主節點,那么會觸發一次全量復制**。此時主節點會啟動一個后臺線程,開始生成一份 RDB 快照文件;
3. 同時還會將從客戶端 client 新收到的所有寫命令緩存在內存中。RDB 文件生成完畢后, 主節點會將 RDB 文件發送給從節點,**從節點會先將 RDB 文件寫入本地磁盤,然后再從本地磁盤加載到內存**
4. 接著主節點會將內存中緩存的寫命令發送到從節點,從節點同步這些數據;
5. 如果從節點跟主節點之間網絡出現故障,連接斷開了,會自動重連,連接之后主節點僅會將部分缺失的數據同步給從節點。
## 配置
例:開啟三個 redis 服務,配置一主二從。端口號分別是 6379、6380、6381
~~~shell
127.0.0.1:6379> info replication # 查看當前庫的信息
# Replication
role:master # 角色 master
connected_slaves:0 # 沒有從機
master_failover_state:no-failover
master_replid:9a6cd17bac5608f98698b2ff808f001eeecfdc42
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
~~~
> 只配置從庫,不用配置主庫!
~~~shell
# 從機 1
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave # 當前角色是從機
master_host:127.0.0.1 # 主機的信息
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:jd
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
------------------------------------------------------------------------------
# 從機 2
127.0.0.1:6380> slaveof 127.0.0.1 6379
------------------------------------------------------------------------------
# 在主機中查看!
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2 # 多了從機的配置
slave0:ip=127.0.0.1,port=6380,state=online,offset=0,lag=4
slave1:ip=127.0.0.1,port=6381,state=online,offset=0,lag=1
master_failover_state:no-failover
master_replid:d270c363e7eea2ada10075696d6c99c0149a597f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:434
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:434
127.0.0.1:6379> set name 1
OK
------------------------------------------------------------------------------
# 從機查看
127.0.0.1:6380> get name
"1"
127.0.0.1:6381> get name
"1"
~~~
### 在配置文件配置
~~~
replicaof 127.0.0.1 6379
masterauth 123456 # 主服務器密碼
~~~
> 詳細配置:https://redis.io/docs/manual/replication/
# 哨兵 Sentinel
主從切換技術的方法是:當主服務器宕機后,需要手動把一臺從服務器切換為主服務器,這就需要人工 干預,費事費力,還會造成一段時間內服務不可用。這不是一種推薦的方式,更多時候,我們優先考慮 哨兵模式。Redis從2.8開始正式提供了Sentinel(哨兵) 架構來解決這個問題
:-: 
客戶端連接 Redis 的時候,先連接哨兵,哨兵會告訴客戶端 Redis 主節點的地址,然后客戶端連接上 redis 并進行后續的操作,當主節點宕機的時候,哨兵監測到主節點宕機,會重新推選出某個表現良好的從節點成為新的主節點,然后通過發布訂閱模式通知其他服務器,讓他們切換主機。
> 官網詳細:https://redis.io/docs/manual/sentinel
## 工作原理
* 每個**Sentinel**以每秒鐘一次的頻率向它所知道的Master,Slave以及其他 **Sentinel**實例發送一個`PING`命令。
* 如果一個實例距離最后一次有效回復 `PING` 命令的時間超過指定值, 則這個實例會被 **Sentine** 標記為**主觀下線**。
* 如果一個 Master 被標記為主觀下線,則正在監視這個 Master 的所有 Sentinel 要以每秒一次的頻率確認 Master 是否真正進入主觀下線狀態
* 當有足夠數量的 Sentinel(大于等于配置文件指定值)在指定的時間范圍內確認 Master 的確進入了主觀下線狀態, 則 Master 會被標記為**客觀下線** 。若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被解除。若 Master 重新向 Sentinel 的 PING 命令返回有效回復, Master 的主觀下線狀態就會被移除。
* 哨兵節點會選舉出**哨兵 leader**,負責故障轉移的工作。
* **哨兵 leader** 會推選出某個表現良好的從節點成為新的主節點,然后通知其他從節點更新主節點信息。
## 配置
sentinel.conf
~~~shell
sentinel monitor mymaster 127.0.0.1 6379 2 # Redis 監控一個名為*mymaster*的主服務器,該主服務器位于地址 127.0.0.1 和端口 6379,投票機制為 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
~~~
sentinel monitor <master-group-name> <ip> <port> <quorum>
例如,如果您有 5 個 Sentinel 進程,并且給定主進程的法定人數設置為 2,則會發生以下情況:
* 如果兩個 Sentinel 同時同意 master 不可訪問,則兩個 Sentinel 中的一個將嘗試啟動故障轉移。
* 如果總共至少有三個 Sentinel 可達,則故障轉移將被授權并實際啟動
sentinel <option_name> <master_name> <option_value>
* `down-after-milliseconds`是以毫秒為單位的時間,Sentinel 開始認為它已關閉,因此實例不應到達(不回復我們的 PING 或回復錯誤)。
* `parallel-syncs`設置在故障轉移后可以重新配置以同時使用新主服務器的副本數。數字越小,完成故障轉移過程所需的時間就越長,但是如果將副本配置為服務舊數據,您可能不希望所有副本同時與主服務器重新同步。雖然復制過程對于副本來說大部分是非阻塞的,但有時它會停止從主服務器加載批量數據。您可能希望通過將此選項設置為值 1 來確保一次只能訪問一個副本。
## 優點
* 主從可以切換,故障可以轉移,系統的可用性就會更好
* 哨兵模式就是主從模式的升級,手動到自動,更加健壯!
## 缺點
* 配置麻煩
# Redis cluster
哨兵模式解決了主從復制不能自動故障轉移、達不到高可用的問題,但還是存在主節點的寫能力、容量受限于單機配置的問題。而 cluster 模式實現了 Redis 的分布式存儲,每個節點存儲不同的內容,解決主節點的寫能力、容量受限于單機配置的問題
Redis cluster 集群節點最小配置 6 個節點以上(3 主 3 從),其中主節點提供讀寫操作,從節點作為備用節點,不提供請求,只作為故障轉移使用
- PHP
- PHP 核心架構
- PHP 生命周期
- PHP-FPM 詳解
- PHP-FPM 配置優化
- PHP 命名空間和自動加載
- PHP 運行模式
- PHP 的 Buffer(緩沖區)
- php.ini 配置文件參數優化
- 常見面試題
- 常用函數
- 幾種排序算法
- PHP - 框架
- Laravel
- Laravel 生命周期
- ThinkPHP
- MySQL
- 常見問題
- MySQL 索引
- 事務
- 鎖機制
- Explain 使用分析
- MySQL 高性能優化規范
- UNION 與 UNION ALL
- MySQL報錯:sql_mode=only_full_group_by
- MySQL 默認的 sql_mode 詳解
- 正則表達式
- Redis
- Redis 知識
- 持久化
- 主從復制、哨兵、集群
- Redis 緩存擊穿、穿透、雪崩
- Redis 分布式鎖
- RedisBloom
- 網絡
- 計算機網絡模型
- TCP
- UDP
- HTTP
- HTTPS
- WebSocket
- 常見幾種網絡攻擊方式
- Nginx
- 狀態碼
- 配置文件
- Nginx 代理+負載均衡
- Nginx 緩存
- Nginx 優化
- Nginx 配置 SSL 證書
- Linux
- 常用命令
- Vim 常用操作命令
- Supervisor 進程管理
- CentOS與Ubuntu系統區別
- Java
- 消息隊列
- 運維
- RAID 磁盤陣列
- 邏輯分區管理 LVM
- 業務
- 標準通信接口設計
- 業務邏輯開發套路的三板斧
- 微信小程序登錄流程
- 7種Web實時消息推送方案
- 用戶簽到
- 用戶注冊-短信驗證碼
- SQLServer 刪除同一天用戶重復簽到
- 軟件研發完整流程
- 前端
- Redux
- 其他
- 百度云盤大文件下載
- 日常報錯記錄
- GIT
- SSL certificate problem: unable to get local issuer certificate
- NPM
- reason: connect ECONNREFUSED 127.0.0.1:31181
- SVN
- SVN客戶端無法連接SVN服務器,主機積極拒絕
- Python
- 基礎
- pyecharts圖表
- 對象
- 數據庫
- PySpark
- 多線程
- 正則
- Hadoop
- 概述
- HDFS