Redis運維和開發學習筆記(5) 主從復制和sentinel哨兵模式
主從復制
將主節點的數據改變同步給從節點
- 作用
- 備份數據
- 讀寫分離
- 存在的問題:
- 手動干預切主等操作
- 主節點的寫能力受到單機限制
- 主節點的存儲能力受到單機限制
主從模式的故障恢復
- 當主節點發生故障時,客戶端連接主節點失敗,兩個從節點和主連接失敗
- (人工)選取一個從節點slaveof no one使其成為新的主節點
- 更新應用方信息,重啟
- 讓另一個從節點連接新主
- 原來的主恢復作為從,去連接新主
哨兵
blog
拓撲結構圖
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qDHbOoMx-1572053628652)(media/15653345582593/%206.2%20%E6%8B%93%E6%89%91%EF%BC%88171%EF%BC%89.png)]
復制配置
復制過程
命令:slaveof slaveof 127.0.0.1:6379
- 保存主節點信息
- 執行slaveof后會打印日志
id=38 addr=127.0.0.1:47458 fd=6 name= age=2700 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
參數 含義
id 客戶端連接的唯一標識,這個id是隨著Redis的連接自增的,重啟Redis后會重置為0。
addr 客戶端的地址和端口
fd 套接字所使用的文件描述符
age 以秒計算的已連接時長
idle 以秒計算的空閑時長看, age=idle時則此鏈接為空連接
flags 客戶端 flag
db 該客戶端正在使用的數據庫 ID
sub 已訂閱頻道的數量
psub 已訂閱模式的數量
multi 在事務中被執行的命令數量
qbuf 輸入緩沖區總量(字節為單位, 0 表示沒有分配查詢緩沖區)
qbuf-free 輸入緩沖區剩余容量(字節為單位, 0 表示沒有剩余空間)
obl 輸出緩沖區的長度(字節為單位, 0 表示沒有分配輸出緩沖區)
oll 輸出列表包含的對象數量(當輸出緩沖區沒有剩余空間時,命令回復會以字符串對象的形式被入隊到這個隊列里)
omem 輸出緩沖區和輸出列表占用的內存總量
events 文件描述符事件
cmd 最近一次執行的命令
- 主從建立socket連接
- 每秒運行定時任務維護復制邏輯,直到成功;或者slaveof no one取消復制
- 連接失敗:Error condition on socket for SYNC:{socket_error_reason}
- 發送pingmingling
- 檢查主從質檢網絡套接字是否可用
- 檢測主從節點當前是否可接收處理命令
- 日志:
Master replied to PING, replication can continue...
- 權限驗證
5. 主節點:如果配置了requirepass,就需要認證
6. 從節點:配置相應的masterauth。 - 同步數據集
- 命令持續復制
7. 上面的操作已經把數據同步完了,后面就持續把寫命令發送給從庫
數據同步
復制偏移量
- 主節點在處理完畢寫入命令之后,會把命令的字節長度做累加記錄,統計信息在master_repl_offset
- 對比主從節點的復制偏移量,判斷是否數據一致
復制積壓緩沖區(repl_backlog)
-
保存在主節點上的一個固定長度的隊列,默認為1M
-
保存最近已復制的數據,用于部分復制和復制命令丟失的數據補救
-
參數含義
repl_backlog_active:1 開啟復制緩沖區 repl_backlog_size:1048576 緩沖區最大長度 repl_backlog_first_byte_offset:2 起始偏移量,計算當前緩沖區 可用范圍 repl_backlog_histlen:969335 已保存數據的有效長度
參數信息
主庫(info replication)
127.0.0.1:7001> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7004,state=online,offset=969336,lag=1
master_repl_offset:969336
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:969335
從庫(info replication)
127.0.0.1:7004> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:7001
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:969350
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
主節點運行id
節點啟動后動態分配的ID,用于唯一識別節點,ID變更后會發生全量復制
重啟后會改變,需要使用debug reload命令重啟并保持ID不變(命令會阻塞當前節點主線程),阻塞期間先生成rdb快照,并清空數據后再加載rdb文件。對于大數據量的主節點和無法容忍阻塞的應用場景慎用
- 參數
127.0.0.1:7002> info server
# Server
redis_version:3.2.4
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:53849fee5fb41517
redis_mode:cluster
os:Linux 3.10.0-957.1.3.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:24334
run_id:698e129042d03211b71e7c3117e37731a3bc5eca
tcp_port:7002
uptime_in_seconds:700399
uptime_in_days:8
hz:10
lru_clock:4879595
executable:/usr/local/redis/3.2/redis-server
config_file:/etc/redis.d/redistest_7002.conf
psync(178)
- 從節點使用psync命令完成部分復制和全量復制功能。