打不死的redis集群
| 導讀 | 最近遇到部分系統因為redis服務掛掉,導致部分服務不可用。所以希望搭建一個redis集群鏡像,把原先散落各處的redis服務器統一管理起來,并且保障高可用和故障自動遷移。 |
最近遇到部分系統因為redis服務掛掉,導致部分服務不可用。所以希望搭建一個redis集群鏡像,把原先散落各處的redis服務器統一管理起來,并且保障高可用和故障自動遷移。
大家都知道redis集群有兩種,一種是redis sentinel,高可用集群,同時只有一個master,各實例數據保持一致;一種是redis cluster,分布式集群,同時有多個master,數據分片部署在各個master上。基于我們的需求和redis本身技術的成熟度,本次要搭建的是redis sentinel。
Redis 的 Sentinel 系統用于管理多個 Redis 服務器(instance), 該系統執行以下三個任務:
- 監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
- 提醒(Notification : 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
- 自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級為新的主服務器, 并讓失效主服務器的其他從服務器改為復制新的主服務器; 當客戶端試圖連接失效的主服務器時, 集群也會向客戶端返回新主服務器的地址, 使得集群可以使用新主服務器代替失效服務器。
整個集群可以分為一個master,N個slave,M個sentinel,本次以2個slave和3個sentinel為例:
首先增加redis.conf
默認為master,#slaveof注釋去掉后變為slave,這里固化了master的域名redis-master。
增加sentinel.conf
增加啟動腳本,根據入參判斷啟動master,slave,sentinel
cd /data redis_role= "hljs-variable"$1 echo "hljs-variable"$redis_roleif [ "hljs-variable"$redis_role = "hljs-string""master" ] ; thenecho "hljs-string""master" sed -i "hljs-string""s/\$redis_port/ "hljs-variable"$redis_port/g" redis.confredis-server /data/redis.confelif [ "hljs-variable"$redis_role = "hljs-string""slave" ] ; then echo "hljs-string""slave" sed -i "hljs-string""s/\$redis_port/ "hljs-variable"$redis_port/g" redis.confsed -i "hljs-string""s/#slaveof/slaveof/g" redis.confsed -i "hljs-string""s/\$master_port/ "hljs-variable"$master_port/g" redis.confredis-server /data/redis.confelif [ "hljs-variable"$redis_role = "hljs-string""sentinel" ] ; then echo "hljs-string""sentinel" sed -i "hljs-string""s/\$sentinel_port/ "hljs-variable"$sentinel_port/g" sentinel.confsed -i "hljs-string""s/\$master_port/ "hljs-variable"$master_port/g" sentinel.confredis-sentinel /data/sentinel.confelse echo "hljs-string""unknow role!" fi #ifend其中$redis_port和$master_port,$sentinel_port都是取自環境變量,通過Docker啟動時候傳入。
編寫Dockerfile
選取redis-alpine鏡像作為基礎鏡像,因為它非常小,只有9M,修改時區和把一些配置拷貝進去后,變更下權限和用戶組,因為基礎鏡像是redis用戶組。ENTRYPOINT和CMD組合,默認以master方式啟動。
build完成后,鏡像只有15M。
采用docker-compose格式:
redis-master-host:environment:redis_port: "hljs-string"'16379'labels:io "hljs-class".rancher "hljs-class".container "hljs-class".pull_image: alwaystty: trueimage: xxx "hljs-class".aliyun "hljs-class".com:5000/aegis-redis-ha:1.0stdin_open: truenet: host redis-slaves:environment:master_port: "hljs-string"'16379'redis_port: "hljs-string"'16380'labels:io "hljs-class".rancher "hljs-class".scheduler "hljs-class".affinity:container_label_soft_ne: name=slavesio "hljs-class".rancher "hljs-class".container "hljs-class".pull_image: alwaysname: slavestty: truecommand:- slaveimage: xxx "hljs-class".aliyun "hljs-class".com:5000/aegis-redis-cluster:1.0stdin_open: truenet: host redis-sentinels:environment:master_port: "hljs-string"'16379'sentinel_port: "hljs-string"'16381'labels:io "hljs-class".rancher "hljs-class".container "hljs-class".pull_image: alwaysname: sentinelsio "hljs-class".rancher "hljs-class".scheduler "hljs-class".affinity:container_label_ne: name=sentinelstty: truecommand:- sentinelimage: xxx "hljs-class".aliyun "hljs-class".com:5000/aegis-redis-cluster:1.0stdin_open: truenet: host首先啟動master,傳入端口16379,host模式,在啟動slave,成為16379 master 的slave,并且設置調度策略為盡可能分散的方式,sentinels也類似。
五 總結總的來說,只要集群中有一臺redis實例存活,集群就能對外提供服務,而sentinel只會在master或slave掛掉才會有實際的作用。
這次的鏡像大小只有15M,非常小。采用啟動時配置角色和端口,包括master,slave,和sentinel3個角色,通過服務編排啟動一個redis集群。
?
本文地址: http://www.linuxprobe.com/docker-redis.html
總結
以上是生活随笔為你收集整理的打不死的redis集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gerrit plugin安装和删除
- 下一篇: 两台服务器实现会话共享