1.什麼是主從複製
2.單機有什麼問題?
(1)機器故障
(2)容量瓶頸
(3)QPS瓶頸
3.主從複製的模型:
(1)一主一從模型
(2)一主多從模型
4.主從複製的做用
(1)數據副本
(2)擴展讀性能
5.主從複製須要注意的地方:
一個master能夠有多個slave
一個slave只能有一個master
數據流向是單向的,master到slave
6.複製的配置
(1)兩種實現方式
方式一:slaveof命令(優勢:無需重啓,缺點:不變於管理)
<1>設置:
master(主):127.0.0.1端口6379
slave(從):127.0.0.1端口6380
127.0.0.1:6379> slaveof 127.0.0.1 6380
OK
<2>取消:
master(主):127.0.0.1端口6379
slave(從):127.0.0.1端口6380
經過命令在slave:127.0.0.1端口6380上取消掉主從複製
127.0.0.1:6380> slaveof no one
OK
方式二:配置文件(優勢:統一配置,缺點:須要重啓)
<1>在從配置文件配將要同步的主ip和端口
slaveof 127.0.0.1 6379
#從節點只作讀的操做
slave-read-noly yes
<2>啓動主從
啓動主:./redis-server ../data/redis-6379.conf
啓動從:./redis-server ../data/redis-6380.conf
<3>
master(主):127.0.0.1端口6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=15,lag=1
master_repl_offset:15(偏移量)
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:14
在主節點寫入一條命令:
127.0.0.1:6379> set xixi 18
OK
127.0.0.1:6379> get xixi
"18"
<4>
slave(從):127.0.0.1端口6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1(主ip)
master_port:6379(主端口)
master_link_status:up(成功)
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:15(從節點會向主節點作一個上報,會把從節點的狀態同步給主節點,這樣主節點就知道從節點的偏移量)
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
從節點查看是否同步成功
127.0.0.1:6380> get xixi
"18"
從節點是不能夠本身寫入任何
127.0.0.1:6380> set xixia 18a
(error) READONLY You can't write against a read only slave.
從節點取消對主節點的關係
127.0.0.1:6380> slaveof no one
OK
查看取消後
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:1301
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
7.全量複製
(1)全量複製:
(2)全量複製的流程
首先slave內部向master發送一條命令psync ? -1,master接收到命令能感受到須要作全量複製的,由於跟本不知道我是誰也沒有傳偏移量,而後master告訴slave本身的偏移量和run_id是多少,slave會保存master的基本信息,master會作一個bgsave快照,master將自己的RDB文件同步到slave,在此期間,master會經過send buffer記錄最新寫入的命令,當slave的接收完RDB文件後緊接着收master傳來的最新寫入的命令,等都接收完畢後,清空本地內容,加載RDB文件和最新的命令,最後,master會經過偏移量的對比,將這個期間產生的值同步到slave
(3)全量複製的開銷
<1>master節點bgsaver時間(對CPU,內存,硬盤都會有必定開銷)
<2>>master節點RDB文件網絡傳輸時間(佔用網絡帶寬資源)
<3>從節點清空數據時間
<4>從節點加載RDB的時間
<5>從節點若是AOF開啓,AOF重寫的時間
8.部分複製:若是發生網絡抖動形成主從複製長期沒有複製成功,可使用部分複製
(1)部分複製的流程
當slave跟master發生網絡抖動,slave鏈接master失敗,master會寫入一份repl_back_buffer複製緩衝區的命令。當slave再次鏈接master成功的時候,會執行一條命令pysnc{offset}{runid},把本身的offset和runid給master,告訴當前偏移量是多少,master接收到發現若是偏移量在當前repl_back_buffer的範圍內的,若是在這個隊列內,會返回continue,將數據發給slave,若是超過範圍會執行全量複製
9.故障處理-自動故障轉移
主從結構-故障轉移
(1)slave宕掉
主從複製,一主兩從,作讀寫分離
redis
若是一個slave宕,把一個客戶端改到另外一個slave上
(2)master宕掉
主從複製,一主兩從,作讀寫分離
網絡
主客戶端從兩個從客戶端找一個客戶端作主客戶端
10.開發運維常見問題
(1)讀寫分離:讀流量分攤到從節點
<1>可能遇到的問題:
複製數據延遲
讀到過時數據
從節點故障
(2)主從配置不一致
例如maxmemory不一致:丟失數據
例如數據結構化參數(列如hash-max-ziplist-entries):內存不一致
(3)規避全量複製
<1>第一次全量複製
第一次不可避免
小主節點,低峯
<2>節點運行ID不匹配
主節點重啓(運行ID變化)
故障轉移
<3>複製積壓緩衝區不足
網絡中斷,部分複製沒法知足
增大複製緩衝區配置rel_backlog_size,網絡,"加強"
(4)規避複製風暴
<1>單主節點複製風暴:
問題:主節點重啓,多從節點複製
解決:更換複製拓撲
<2>單機器複製風暴
機器宕機後,大量全量複製
主節點分散多機器數據結構