歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> 學習Linux >> 打不死的redis集群

打不死的redis集群

日期:2017/3/3 17:51:30   编辑:學習Linux

打不死的redis集群

打不死的redis集群


導讀最近遇到部分系統因為redis服務掛掉,導致部分服務不可用。所以希望搭建一個redis集群鏡像,把原先散落各處的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集群打不死的redis集群
首先增加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

Copyright © Linux教程網 All Rights Reserved