阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

打不死的redis集群

78次阅读
没有评论

共计 4129 个字符,预计需要花费 11 分钟才能阅读完成。

导读 最近遇到部分系统因为 redis 服务挂掉,导致部分服务不可用。所以希望搭建一个 redis 集群镜像,把原先散落各处的 redis 服务器统一管理起来,并且保障高可用和故障自动迁移。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

一 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.conf

##redis.conf
 ##redis-0, 默认为 master
port $redis_port
 ## 授权密码,请各个配置保持一致
 ## 暂且禁用指令重命名
 ##rename-command
 ## 开启 AOF,禁用 snapshot
appendonly yes
 #slaveof redis-master $master_port
slave-read-only yes

默认为 master,#slaveof 注释去掉后变为 slave,这里固化了 master 的域名 redis-master。
增加 sentinel.conf

port $sentinel_port
dir  "hljs-string""/tmp"
 ##sentinel 监控的 redis 的名字、IP 和端口,最后一个数字是 sentinel 做决策的时候需要投赞同票的最少的 sentinel 的数量。sentinel "hljs-instruction" monitor mymaster redis-master $master_port 2
 ## 选项指定了在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障转移所需的时间就越长。sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel current-epoch 1

增加启动脚本,根据入参判断启动 master,slave,sentinel

cd /data
redis_role= "hljs-variable"$1
echo  "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-alpine
MAINTAINER voidman voidman

COPY  "bash"Shanghai /etc/localtime
COPY  "bash"redis.conf /data/redis.conf
COPY  "bash"sentinel.conf /data/sentinel.conf
COPY  "bash"start.sh /data/start.sh
RUN  "bash"chmod +x /data/start.sh
RUN  "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: 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=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: 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: 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 集群。

 

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计4129字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中