【redis學習三】簡單高可用redis架構實踐

背景:支撐線上千萬級別的天級查詢請求,要求高可用。redis

1、方案調研

1.1 redis版本選擇

redis當前主流版本是redis 2.x 和 redis 3.x,3.0對集羣支持比較不錯,官方解釋以下:算法

Redis是一個開源、基於C語言、基於內存亦可持久化的高性能NoSQL數據庫,同時,它還提供了多種語言的API。近日,Redis 3.0在通過6個RC版本後,其正式版終於發佈了。Redis 3.0的最重要特徵是對Redis集羣的支持,此外,該版本相對於2.8版本在性能、穩定性等方面都有了重大提升。數據庫

綜合考慮以後擴展性和穩定性以後,選擇版本 redis 3.2.3-1版本進行部署安全

1.2 是否選擇搭建集羣

是否搭建集羣關鍵要看單機是否可以知足業務需求,作了個簡單的數據評估。架構

數據量評估

  • 測試:單機寫入2000w業務數據,佔用內存1.5g,本機126g內存框架

  • 評估:單機的穩定數據承載量:2000w (126/1.56) 0.6 = 96923woop

  • 結論:9T 的數據承載量,遠超當前千萬級別的數據量性能

性能評估

  • 測試:簡單壓測了下學習

    • 寫操做 1000w,80% 在20ms一下 ,98%在30ms,最大218ms,qps 5w/s,總耗時197s測試

    • 讀操做 1000w,97% 在10ms一下 ,99.99%在24ms,qps 6w/s,總耗時160s

  • 評估:當前的調用量在千萬天天,qps的話在百/s。

  • 結論:當前單機的redis徹底知足需求

所以:在單機遠可以知足當下業務需求的狀況下,決定不採用的集羣的方式來部署redis,減小技術債務風險。

1.3 初定方案和架構圖

選定了版本和基本部署方案以後,主要考慮服務的容災和穩定性,通過思考以後採用採用極簡的主從從結構,001實時同步數據002和003;001讀寫,002,003只讀,機構圖以下

redis 框架架構

2、實現過程

2.1 redis安裝

此處略去,參考官方文檔 https://redis.io/

2.2 配置讀寫master

  • 修改端口:port 【目的:簡單的修改默認端口是最好的防攻擊】

  • 添加密碼:pwd

  • 關閉壓縮:rdbcompression no 【硬盤最夠,下降cpu的能耗更利於提高性能】

  • 開啓守護進程:daemonize yes 【master開啓守護,增長穩定性】

  • 關閉protect-mode :容許他機器訪問

  • 添加白名單:bind xxx

  • 修改log地址,pid地址和數據存儲地址:logfile pidfile 【便於維護和安全】

  • 添加慢查詢:slowlog-log-slower-than 500 【根據業務需求,便於優化】

  • 最大內存限制:maxmemory 【考慮穩定性和性能,通常不超過最大內存的60%】

2.3 配置只讀slave

  • 同master

  • 設置主庫:slaveof ip:port

  • 主庫密碼:masterauth masterpwd

  • 只讀:slave-read-only yes

2.4 啓動測試

啓動主庫寫入數據

redis 寫入主庫

進入從庫查看

最初沒有數據,主庫寫入以後,從庫去到數據

redis 寫入從庫

查看log確認過程

redis log

3、架構能力評估

3.1 容災能力

  • 主動容災

    • 備份:master 全量備份,slave全量備份。

    • 備份安全:本機保存,hadoop同步保存一份。

    • 監控和探活:監控機分鐘級探活和預警

  • 被動容災:

    • slave 宕機:重啓以後直接從master恢復

    • master 宕機且硬盤數據爲損壞:重啓後數據自動恢復且和從庫一致。

    • master 宕機且數據損壞:刪除損壞數據,使用slave1的數據恢復,保證數據一致。

    • master 和slave 1 同時宕機:slave2 保證讀正常,業務不影響,利用slave2 數據備份恢復master,啓動slave 便可

    • 三臺全宕機:服務掛掉,從hadoop獲取數據恢復服務。

3.2 性能評估

壓測數據,參見方案選擇,徹底hold住。

4、問題思考

4.1 內存清理策略

暫時採用:
noeviction -> 誰也不刪,直接在寫操做時返回錯誤。
以後採用:
volatile-lru -> 根據LRU算法刪除帶有過時時間的key。 最少使用算法刪除。
若是達到內存限制,手工清理,經過監控腳本監控內存狀況

4.2 伸縮性和單節點問題

擴展slave能夠直接擴展,擴展master須要master之間數據同步,暫時是個瓶頸。對於主讀業務的需求,暫時問題不大;寫需求的話,暫時的想法是代碼轉寫的方式。

4.3 採用redis sentinal 監聽

默認不錯的監聽,嘗試了下效果不錯,還在調研中,配置conf便可,完成後能夠查看監聽的狀況

127.0.0.1:port> INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis115,status=ok,address=ip:port,slaves=2,sentinels=1

五:經常使用代碼

# 強制殺死redis,模仿宕機
ps aux |grep redis |awk '{print $2}'|xargs kill -9

# 重啓,指定conf
/home/work/xxx/bin/redis-server /home/work/xxx/etc/redis.conf

# 壓測,具體參數能夠參考benchmark
[cuihuan@cuihuan bin]$  ./redis-benchmark -h 127.0.0.1  -p 端口 -a 密碼  -c 1000 -n 10000000  -d 1024 -r 100000 -t set,get,incr,del

【轉載請註明:【redis學習三】簡單高可用redis架構實踐 | 靠譜崔小拽

相關文章
相關標籤/搜索