## 一、什么是主從復制
### 1、單機有什么問題
* 機器故障
* 容量瓶頸
* QPS瓶頸
### 2、主從復制的作用
* 數據副本
* 擴展讀性能
### 3、一主多從
## 二、主從復制配置
### 1、命令實現

* 在6380 服務器上執行 slaveof 0.0.0.0 6379
* 取消復制,不想成為任何服務器的從 -- 在6380 服務器上執行 slaveof no one
### 2、配置實現
~~~
slaveof ip port
slave-read-only yes //只做讀操作,保障保障與主服務器數據一致
~~~
### 3、比較
| 方式 | 命令 | 配置 |
| --- | --- | --- |
| 優點 | 無需重啟 | 統一配置 |
| 缺點 | 不便于管理 | 需要重啟 |
## 三、runid和復制偏移量
### 1、runid
* redis每次啟動的時候都會有一個隨機的id來保障redis的標識,重啟后消失。
* 查看runid
```
redis-cli -p 6979 info server | grep run
run_id:dsfsdf34234wfdsdf23432fdsdf
```
### 2、偏移量
* 一個數據寫入量的字節,記錄寫了多少數據。主服務器會把偏移量同步給從服務器,當主從的偏移量一致,則數據是完全同步的。
* 如果主從服務的偏移量大于從服務器,則主從不同步。
~~~
redis-cli -p 6979 info replication //查看命令
slave_repl_offset:1978 // 偏移量參數
~~~
## 四、全量復制和部分復制
### 1、全量復制
* 流程
* slave 向 master 傳遞命令 psync? -1 (因為第一次通信不知道master的runid和偏移量,所以傳-1)
* master 向 slave 返回runid 和偏移量
* slave 保存 master 的信息
* master 執行 bgsave 生產RDB快照
* master 做send RDB 操作 向 slave 同步快照信息
* master 做 send buffer 操作 , 向 slave 同步 生成快照過程中的 緩存命令
* slave 加載 RDB文件及數據
* 開銷
* bgsave時間
* RDB文件網絡傳輸時間
* 從節點清空數據時間
* 從節點加載RDB的時間
* 可能的AOF重寫時間

### 2、部分復制
* redis 2.8后的功能,當網絡發生抖動斷開后,會用到部分復制的功能
* 當網絡發生抖動,slave會與master斷開
* master 寫命令時,會寫一份復制緩沖區的命令
* 當slave在此連接master時 ,傳遞命令 psync {offset} {runid} ,告訴 master 自己當前的偏移量是多少
* master 向 slave 返回CONTINUE 把 缺失的內容 傳遞過去。

## 五、故障處理
## 六、主從復制常見問題
### 1、讀寫分離
* 讀流量分攤到從節點
* 可能遇到問題:
* 復制數據延遲
* 讀到過期數據
* 從節點故障
* 規避全量復制
* 第一次全量復制
* 第一次不可避免
* 小主節點、低峰
* 節點運行ID不匹配
* 主節點重啟(運行ID變化)
* 故障轉義,例如哨兵或集群
* 復制積壓緩沖區不足
* 網絡中斷,部分復制無法滿足
* 增大復制緩沖區配置rel_backlog_size,網絡“增強”。
* 規避復制風暴
* 單主節點復制風暴
* 問題:主節點重啟,多從節點復制
* 更換復制拓撲
*