客户有部署有状态服务的需求,单机部署模式相对简单,尝试一下集群部署。
关于Redis的master,slave 以及sentinal的架构和作用不提,有兴趣可以参考之前的博客
https://www.cnblogs.com/ericnie/p/7203950.html
github上参考的文章不少,但很多都需要基于连接互联网进行构建,同时也创建不少的buildconfig,研究了一下,还需要在本地部署一个git.
立刻觉得把问题搞复杂了。所以本文主要以简化为主,说明主要核心步骤,当然也掉到坑里浪费了些时间,不失为一种学习过程吧。
github上参考链接
https://github.com/mjudeikis/redis-openshift
1.构建镜像
先clone到本地
git clone https://github.com/mjudeikis/redis-openshift
目录结构比较清晰明了,我喜欢
[root@master ~]# tree redis-openshift redis-openshift ├── image │ ├── Dockerfile │ ├── Dockerfile.1 │ ├── epel-7.repo │ ├── redis-master.conf │ ├── redis-openshift.tar │ ├── redis-slave.conf │ └── run.sh ├── list.yaml ├── openshift │ ├── build.yaml │ ├── is-base.yaml │ ├── is-output.yaml │ ├── redis-master-dc.yaml │ ├── redis-master-service.yaml │ ├── redis-sentinel-dc.yaml │ ├── redis-sentinel-services.yaml │ └── redis.yaml └── README.md
对了,这里我也根据我的环境修改了Dockerfile,主要是yum源的问题
先下载一个放到目录下
http://mirrors.aliyun.com/repo/epel-7.repo,
Dockerfile
FROM rhel7 #RUN yum install epel-release -y COPY epel-7.repo /etc/yum.repos.d/epel.repo RUN yum install redis hostname -y ; yum clean all COPY redis-master.conf /redis-master/redis.conf COPY redis-slave.conf /redis-slave/redis.conf RUN mkdir -p /redis-sentinel ; chmod -R 777 /redis-sentinel /redis-slave COPY run.sh /run.sh CMD [ "/run.sh" ] ENTRYPOINT [ "bash", "-c" ]
我修改了run.sh文件,最核心的原因是启动slave的时候无法获取master的地址,核心语句是
while true; do master=$(redis-cli -h ${REDIS_SENTINEL_SERVICE_HOST} -p ${REDIS_SENTINEL_SERVICE_PORT} --csv SENTINEL get-master-addr-by-name mymaster | tr ',' ' ' | cut -d' ' -f1) echo " ***** ${master}"
在启动sentinel服务的时候,还能获取到,不知道为什么相同的语句在启动slave的时候不管用了,折腾半天,发现环境变量里面有这个值,直接修改成
master=${REDIS_MASTER_SERVICE_HOST}
oc new-project建立一个项目,然后
docker build -t registry.example.com/openshift/redis-openshift:1.0 . docker push registry.example.com/openshift/redis-openshift:1.0 oc import-image redis-openshift:latest --from=registry.example.com/openshift/redis-openshift:1.0 --insecure --confirm
这里必须表扬一下openshift的了,因为在调试过程中我的run.sh改来改去,每次改动需要build镜像,搞完后,直接运行上面三条,就把镜像刷新了
而Openshift的dc的trigger功能发挥作用,每次发现镜像更新后就自动更新,发布新应用,减少大量时间,感觉非常不错!
2.构建一系列的dc和service
修改openshift下的配置文件,确保镜像地址无误。
oc create -f openshift/redis-master-dc.yaml oc create -f openshift/redis-master-service.yaml oc create -f openshift/redis-sentinel-dc.yaml oc create -f openshift/redis-sentinel-service.yaml oc create -f openshift/redis-dc.yaml
会建立一个master,3个sentinel和3个slave,如图
进去逐个检查日志,确保成功启动
运行下面命令,查看集群信息。
redis-cli -h redis-master info Replication
构建成功,可以愉快的使用了。