一 redis集群分類最近遇到部分系統因為redis服務掛掉,導致部分服務不可用。所以希望搭建一個redis集群鏡像,把原先散落各處的redis服務器統一管理起來,並且保障高可用和故障自動遷移。
大家都知道redis集群有兩種,一種是redis sentinel,高可用集群,同時只有一個master,各實例數據保持一致;一種是redis cluster,分布式集群,同時有多個master,數據分片部署在各個master上。基於我們的需求和redis本身技術的成熟度,本次要搭建的是redis sentinel。
Redis 的 Sentinel 系統用於管理多個 Redis 服務器(instance), 該系統執行以下三個任務:
整個集群可以分為一個master,N個slave,M個sentinel,本次以2個slave和3個sentinel為例:
首先增加redis.conf
##redis.conf ##redis-0,默認為masterport $redis_port ##授權密碼,請各個配置保持一致 ##暫且禁用指令重命名 ##rename-command ##開啟AOF,禁用snapshotappendonly yes #slaveof redis-master $master_portslave-read-only yes
默認為master,#slaveof注釋去掉後變為slave,這裡固化了master的域名redis-master。
增加sentinel.conf
port $sentinel_portdir "hljs-string""/tmp" ##sentinel監控的redis的名字、IP和端口,最後一個數字是sentinel做決策的時候需要投贊同票的最少的sentinel的數量。sentinel "hljs-instruction" monitor mymaster redis-master $master_port 2 ##選項指定了在執行故障轉移時, 最多可以有多少個從服務器同時對新的主服務器進行同步, 這個數字越小, 完成故障轉移所需的時間就越長。sentinel config-epoch mymaster 1sentinel leader-epoch mymaster 1sentinel current-epoch 1
增加啟動腳本,根據入參判斷啟動master,slave,sentinel
cd /dataredis_role= "hljs-variable"$1echo "hljs-variable"$redis_role if [ "hljs-variable"$redis_role = "hljs-string""master" ] ; then echo "hljs-string""master" sed -i "hljs-string""s/\$redis_port/ "hljs-variable"$redis_port/g" redis.conf redis-server /data/redis.conf elif [ "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.conf sed -i "hljs-string""s/#slaveof/slaveof/g" redis.conf sed -i "hljs-string""s/\$master_port/ "hljs-variable"$master_port/g" redis.conf redis-server /data/redis.conf elif [ "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.conf sed -i "hljs-string""s/\$master_port/ "hljs-variable"$master_port/g" sentinel.conf redis-sentinel /data/sentinel.conf else echo "hljs-string""unknow role!" fi #ifend
其中$redis_port和$master_port,$sentinel_port都是取自環境變量,通過Docker啟動時候傳入。
編寫Dockerfile
FROM redis:3-alpineMAINTAINER voidman voidmanCOPY "bash"Shanghai /etc/localtimeCOPY "bash"redis.conf /data/redis.confCOPY "bash"sentinel.conf /data/sentinel.confCOPY "bash"start.sh /data/start.shRUN "bash"chmod +x /data/start.shRUN "bash"chown redis:redis /data/*ENTRYPOINT "bash"[ "hljs-string""sh", "hljs-string""/data/start.sh"] CMD "bash"[ "hljs-string""master"]
選取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: always tty: true image: xxx "hljs-class".aliyun "hljs-class".com:5000/aegis-redis-ha:1.0 stdin_open: true net: hostredis-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=slaves io "hljs-class".rancher "hljs-class".container "hljs-class".pull_image: always name: slaves tty: true command: - slave image: xxx "hljs-class".aliyun "hljs-class".com:5000/aegis-redis-cluster:1.0 stdin_open: true net: hostredis-sentinels: environment: master_port: "hljs-string"'16379' sentinel_port: "hljs-string"'16381' labels: io "hljs-class".rancher "hljs-class".container "hljs-class".pull_image: always name: sentinels io "hljs-class".rancher "hljs-class".scheduler "hljs-class".affinity:container_label_ne: name=sentinels tty: true command: - sentinel image: xxx "hljs-class".aliyun "hljs-class".com:5000/aegis-redis-cluster:1.0 stdin_open: true net: host
首先啟動master,傳入端口16379,host模式,在啟動slave,成為16379 master 的slave,並且設置調度策略為盡可能分散的方式,sentinels也類似。
四 總結總的來說,只要集群中有一台redis實例存活,集群就能對外提供服務,而sentinel只會在master或slave掛掉才會有實際的作用。
這次的鏡像大小只有15M,非常小。采用啟動時配置角色和端口,包括master,slave,和sentinel3個角色,通過服務編排啟動一個redis集群。
原文來自:https://yq.aliyun.com/articles/58003?utm_content=m_5410?&utm_source=qq
本文地址:http://www.linuxprobe.com/docker-redis.html
http://xxxxxx/Linuxjc/1184584.html TechArticle