打不死的redis集群
| 導(dǎo)讀 | 最近遇到部分系統(tǒng)因為redis服務(wù)掛掉,導(dǎo)致部分服務(wù)不可用。所以希望搭建一個redis集群鏡像,把原先散落各處的redis服務(wù)器統(tǒng)一管理起來,并且保障高可用和故障自動遷移。 |
最近遇到部分系統(tǒng)因為redis服務(wù)掛掉,導(dǎo)致部分服務(wù)不可用。所以希望搭建一個redis集群鏡像,把原先散落各處的redis服務(wù)器統(tǒng)一管理起來,并且保障高可用和故障自動遷移。
大家都知道redis集群有兩種,一種是redis sentinel,高可用集群,同時只有一個master,各實例數(shù)據(jù)保持一致;一種是redis cluster,分布式集群,同時有多個master,數(shù)據(jù)分片部署在各個master上。基于我們的需求和redis本身技術(shù)的成熟度,本次要搭建的是redis sentinel。
Redis 的 Sentinel 系統(tǒng)用于管理多個 Redis 服務(wù)器(instance), 該系統(tǒng)執(zhí)行以下三個任務(wù):
- 監(jiān)控(Monitoring): Sentinel 會不斷地檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)作正常。
- 提醒(Notification : 當(dāng)被監(jiān)控的某個 Redis 服務(wù)器出現(xiàn)問題時, Sentinel 可以通過 API 向管理員或者其他應(yīng)用程序發(fā)送通知。
- 自動故障遷移(Automatic failover): 當(dāng)一個主服務(wù)器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務(wù)器的其中一個從服務(wù)器升級為新的主服務(wù)器, 并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器; 當(dāng)客戶端試圖連接失效的主服務(wù)器時, 集群也會向客戶端返回新主服務(wù)器的地址, 使得集群可以使用新主服務(wù)器代替失效服務(wù)器。
整個集群可以分為一個master,N個slave,M個sentinel,本次以2個slave和3個sentinel為例:
首先增加redis.conf
默認(rèn)為master,#slaveof注釋去掉后變?yōu)閟lave,這里固化了master的域名redis-master。
增加sentinel.conf
增加啟動腳本,根據(jù)入?yún)⑴袛鄦觤aster,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都是取自環(huán)境變量,通過Docker啟動時候傳入。
編寫Dockerfile
選取redis-alpine鏡像作為基礎(chǔ)鏡像,因為它非常小,只有9M,修改時區(qū)和把一些配置拷貝進(jìn)去后,變更下權(quán)限和用戶組,因為基礎(chǔ)鏡像是redis用戶組。ENTRYPOINT和CMD組合,默認(rèn)以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,并且設(shè)置調(diào)度策略為盡可能分散的方式,sentinels也類似。
五 總結(jié)總的來說,只要集群中有一臺redis實例存活,集群就能對外提供服務(wù),而sentinel只會在master或slave掛掉才會有實際的作用。
這次的鏡像大小只有15M,非常小。采用啟動時配置角色和端口,包括master,slave,和sentinel3個角色,通過服務(wù)編排啟動一個redis集群。
?
本文地址: http://www.linuxprobe.com/docker-redis.html
總結(jié)
以上是生活随笔為你收集整理的打不死的redis集群的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gerrit plugin安装和删除
- 下一篇: 两台服务器实现会话共享