二制作镜像
整个集群可以分为一个master,N个slave,M个sentinel,本次以2个slave和3个sentinel为例:
首先增加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
其中
r
e
d
i
s
_
p
o
r
t
和
redis\_port和
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也类似。
ter:1.0
stdin_open: true
net: host
首先启动master,传入端口16379,host模式,在启动slave,成为16379 master 的slave,并且设置调度策略为尽可能分散的方式,sentinels也类似。