redis全部數據保持在內存中,對數據的更新將異步地保存到磁盤上。node
RDB文件(二進制)
Redis建立RDB文件,啓動時自帶載入RDB文件
觸發機制-主要三種方式
save(同步) 建立RDB 阻塞 文件策略:如存在老的RDB文件,新替換老 複雜度:O(n)
bgsave(異步) 一、basave 二、fork子進程 三、create RDB 四、bgsave successfully(異步響應客戶端在fork以後)
自動 配置 secondes 900 changes 1 seconds 300 changes 10 seconds 60 changes 10000 知足任一條件
最佳配置
dbfilename dump-{$port}.rdb
dir /bigdiskpath
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yesios
RDB的現存問題:耗時耗性能
三種策略:
always 寫命令刷新的緩衝區 每條命令 fsync到硬盤 優勢 不丟數據 缺點 IO開銷大
everysec 寫命令刷新緩衝區,每秒把緩衝區 fsync到硬盤 優勢 IO開銷可控 缺點 丟失一秒數據
no 寫命令到緩衝區 OS決定fsync到硬盤 優勢 不用管 缺點 不可空
推薦 everysec
AOF重寫:redis
AOF 重寫實現的兩種方式 bgrewriteof AOF重寫配置
重寫配置 auto-aof-rewrite-min-size AOF文件重寫須要的尺寸 auto-aof-rewrite-percentage AOF文件增加率
aof_current_size AOF當前尺寸 aof_base_size AOF上次啓動和重寫的尺寸
同時知足 自動出發機制
aof_current_size > auto-aof-rewrite-min-size
aof_current_size - aof_base_size/aof_base_size > auto-aof-rewrite-percentage
推薦配置緩存
appendonly yes appendfilename "appendonly-${port}.aof" appendfsync everysec dir /bigdiskpath no-appendfsync-on-rewrite yes auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
RDB 啓動優先級安全
命令 | RDB | AOF |
---|---|---|
啓動優先級 | 低 | 高 |
體積 | 小 | 大 |
恢復速度 | 快 | 慢 |
數據安全性 | 丟數據 | 根據策略決定 |
輕重 | 重 | 輕 |
關 集中管理 主關從開
AOF最佳策略
開:緩存和存儲 AOF重寫集中管理 everysec
最佳策略
小分片 緩存或者存儲 監控(硬盤、內存、負載、網絡) 足夠的內存ruby
fork特性網絡
改善fork數據結構
CPU
開銷:RDB和AOF文件生成,屬於CPU密集型
優化:不作CPU綁定,不和CPU密集型部署
內存
開銷:fork內存開銷,copy-on-write
優化:echo never > /sys/kernel/mm/transparent_hugepage/enable
硬盤
開銷:AOF和RDB文件寫入,能夠結合iostat,iotop分析
優化:不要和高硬盤負載服務部署一塊兒:存儲服務,隊列服務等 no-appendfsync-on-rewrite=yes
根據寫入量決定磁盤類型 單機多實例持久化目錄能夠考慮分盤架構
阻塞定位:Redis日誌 info Persistence併發
單機的問題:機器故障 容量瓶頸 QPS瓶頸
主從複製的做用:數據副本 擴展讀性能
實現方式:slaveof命令 配置
命令實現:slaveof 127.0.0.1 6379 複製 slaveof no one 取消複製
修改配置:
slaveof ip port slave-read-only yes
比較
方式 | 命令 | 配置 |
---|---|---|
優勢 | 不須要重啓 | 統一配置 |
缺點 | 不便於管理 | 須要重啓 |
info replaction 查看主從複製的信息
run_id:redis每次啓動的時候都會有一個隨機的id來保障redis的標識,重啓後消失
複製偏移量:master_repl_offset 記錄寫入了多少字節
全量複製:psync -> fullresync -> save masterInfo -> bgsave -> send RDB -> send buffer -> flush old data -> load RDB
全量複製的開銷:bgsave的時間 RDB文件網絡傳輸時間 從節點清空數據時間 從節點加載RDB時間 可能AOF重寫時間
部分複製:connection lost -> master -> connection to master -> psync -> continue
主從結構故障轉移:slave宕掉 客戶端從新鏈接另外一個slave master宕掉 使用sentinel自動故障轉移
開發運維中的問題:
可能遇到的問題: 複製數據延遲 讀到過時數據 從節點故障
例如maxmemory不一致,丟失數據;例如數據結構優化參數,內存不一致
第一次全量複製,不可避免 小主節點,低峯
節點運行ID不匹配 主節點重啓 故障轉移,例如哨兵或集羣
複製積壓緩衝區不足 網絡中斷,部分複製沒法知足 增大複製緩衝區配置rel_backlog_size,網絡增長
單節點複製風暴 主節點重啓,多從節點複製 更換複製拓補
單機器複製風暴 機器宕機後,大量全量複製 主節點分散多機器
主從複製的問題:手動故障轉移 寫能力和存儲能力受限
主節點
port 7000 daemonize yes pidfile /var/run/redis-7000.pid logfile "7000.log" dir "/opt/soft/redis/data/"
從節點
port 7001 daemonize yes pidfile /var/run/redis-7000.pid logfile "7000.log" dir "/opt/soft/redis/data/" slaveof 127.0.0.1 7000
sentinel主要配置
port ${port} daemonize yes dir "/opt/soft/redis/data/" logfile "${port}.log" sentinel monitor mymaster 127.0.0.1 7000 2 sentinel down-after-milliseconds mymaster 300000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
客戶端接入流程
Sentinel地址集合 =》 mastername =》 不是代理模式
客戶端高可用觀察
服務端日誌分析:數據節點和Sentinel節點
三個定時任務
(1)、每10秒每一個sentinel對master和slave執行info
(2)、每2秒每一個sentinel經過master節點的channel交換信息(pub/sub)
(3)、每1秒每一個sentinel對其餘sentinel和redis執行ping
主觀下線:每一個sentinel節點對Redis節點失敗的偏見
客觀下線:全部sentinel節點對Redis節點失敗達成共識
緣由:只要一個sentinel節點完成故障轉移
選舉:經過sentinel is-master-down-by-addr命令都但願成爲領導者
選擇合適的slave節點 選擇slave-pripority最高的slave節點,若是存在則返回,不存在則繼續 選擇複製偏移量將達的slave節點,若是存在則返回,不存在則繼續 選擇runId最小的節點
機器下線:例如過保等狀況
機器性能不足:例如CPU、內存、硬盤、網絡等
節點自身故障:例如服務不穩定
從節點:臨時下線仍是永久下線,例如是否作一些清理工做,可是要考慮讀寫分離的狀況
主節點:sentinel failover進行替換
從節點的做用
副本:高可用的基礎
擴展:讀能力
Redis Sentinel是Redis的高可用實現方案
併發量超過10萬QPS,數據量超過單機內存
解決方法:分佈式(簡單的認爲加機器)
順序分區:1-100 =》 1-33,34-66,67-100
哈希分區:1-100 =》 hash(key)%3 0,1,2
哈希分佈分爲 節點取餘分區,一致性哈希分區,虛擬槽分區
客戶端分片:哈希+取餘 節點伸縮:數據節點關係變化,致使數據遷移 遷移數量和添加節點數量有關:建議翻倍擴容
客戶端分片:哈希+順時針(優化取餘) 節點伸縮:隻影響臨近節點,可是仍是有數據遷移 翻倍伸縮:保證最小數據遷移和負載均衡
預設虛擬槽:每一個槽映射一個數據子集,通常比節點數大
良好的哈希函數:CRC16
服務端管理節點:槽,數據
Redis Cluster架構: 節點 meet 指派槽 複製 高可用 分片
配置開啓節點 =》 meet =》 指派槽 =》 主從
port ${port} daemonize yes dir "/opt/redis/redis/data" dbfilename "dump-${port}.rdb" logfile "${port}.file" cluster-enabled yes cluster-config-file nodes-${port}.conf cluster-require-full-coverage no
cluster meet ip port
Cluster節點主要配置
cluster-enabled yes cluster-node-timeout 15000 cluster-config-file "nodes.conf" cluster-require-full-coverage yes
分配槽: cluster addslots slot
設置主從:cluster replicate node-id
下載編譯安裝Ruby => 安裝rubygem redis => 安裝redis-trib.rb配置開啓Redis一鍵開啓:./redis-trib.rb create --replicas 1 127.0.0.1:8000 127.0.0.1:8001...