背景:支撐線上千萬級別的天級查詢請求,要求高可用。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
版本進行部署安全
是否搭建集羣關鍵要看單機是否可以知足業務需求,作了個簡單的數據評估。架構
測試:單機寫入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,減小技術債務風險。
選定了版本和基本部署方案以後,主要考慮服務的容災和穩定性
,通過思考以後採用採用極簡的主從從結構,001實時同步數據002和003;001讀寫,002,003只讀
,機構圖以下
此處略去,參考官方文檔 https://redis.io/
修改端口:port 【目的:簡單的修改默認端口是最好的防攻擊】
添加密碼:pwd
關閉壓縮:rdbcompression no 【硬盤最夠,下降cpu的能耗更利於提高性能】
開啓守護進程:daemonize yes 【master開啓守護,增長穩定性】
關閉protect-mode :容許他機器訪問
添加白名單:bind xxx
修改log地址,pid地址和數據存儲地址:logfile pidfile 【便於維護和安全】
添加慢查詢:slowlog-log-slower-than 500 【根據業務需求,便於優化】
最大內存限制:maxmemory 【考慮穩定性和性能,通常不超過最大內存的60%】
同master
設置主庫:slaveof ip:port
主庫密碼:masterauth masterpwd
只讀:slave-read-only yes
最初沒有數據,主庫寫入以後,從庫去到數據
主動容災
備份:master 全量備份,slave全量備份。
備份安全:本機保存,hadoop同步保存一份。
監控和探活:監控機分鐘級探活和預警
被動容災:
slave 宕機:重啓以後直接從master恢復
master 宕機且硬盤數據爲損壞:重啓後數據自動恢復且和從庫一致。
master 宕機且數據損壞:刪除損壞數據,使用slave1的數據恢復,保證數據一致。
master 和slave 1 同時宕機:slave2 保證讀正常,業務不影響,利用slave2 數據備份恢復master,啓動slave 便可
三臺全宕機:服務掛掉,從hadoop獲取數據恢復服務。
壓測數據,參見方案選擇,徹底hold住。
暫時採用:
noeviction -> 誰也不刪,直接在寫操做時返回錯誤。
以後採用:
volatile-lru -> 根據LRU算法刪除帶有過時時間的key。 最少使用算法刪除。
若是達到內存限制,手工清理,經過監控腳本監控內存狀況
擴展slave能夠直接擴展,擴展master須要master之間數據同步,暫時是個瓶頸。對於主讀業務的需求,暫時問題不大;寫需求的話,暫時的想法是代碼轉寫的方式。
默認不錯的監聽,嘗試了下效果不錯,還在調研中,配置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架構實踐 | 靠譜崔小拽 】