客户有部署有状态服务的需求,单机部署模式相对简单,尝试一下集群部署。

关于Redis的master,slave 以及sentinal的架构和作用不提,有兴趣可以参考之前的博客

https://www.cnblogs.com/ericnie/p/7203950.html

github上参考的文章不少,但很多都需要基于连接互联网进行构建,同时也创建不少的buildconfig,研究了一下,还需要在本地部署一个git.

立刻觉得把问题搞复杂了。所以本文主要以简化为主,说明主要核心步骤,当然也掉到坑里浪费了些时间,不失为一种学习过程吧。

github上参考链接

https://github.com/mjudeikis/redis-openshift

架构

传统的Redis个节点角色和端口

在OpenShift上部署架构图

1.构建镜像

先clone到本地

git clone https://github.com/mjudeikis/redis-openshift

目录结构比较清晰明了,我喜欢

[root@master ~]# tree redis-openshift
redis-openshift
├── image
│   ├── Dockerfile
│   ├── Dockerfile.
│   ├── epel-.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-.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 /redis-sentinel /redis-slave
COPY run.sh /run.sh CMD [ "/run.sh" ] ENTRYPOINT [ "bash", "-c" ]

比较核心的run文件,我修改成这样

[root@master image]# cat run.sh
#!/bin/bash # Copyright The Kubernetes Authors All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. function launchmaster() {
if [[ ! -e /redis-master-data ]]; then
echo "Redis master data doesn't exist, data won't be persistent!"
mkdir /redis-master-data
fi
redis-server /redis-master/redis.conf --protected-mode no
} function launchsentinel() {
echo "Enter launch sentinel...." 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)
if [[ -n ${master} ]]; then
master="${master//\"}"
else
master=$(hostname -i)
fi redis-cli -h ${master} INFO
if [[ "$?" == "" ]]; then
break
fi
echo "Connecting to master failed. Waiting..."
sleep
done sentinel_conf=/redis-sentinel/sentinel.conf echo "sentinel monitor mymaster ${master} 6379 2" > ${sentinel_conf}
echo "sentinel down-after-milliseconds mymaster 60000" >> ${sentinel_conf}
echo "sentinel failover-timeout mymaster 180000" >> ${sentinel_conf}
echo "sentinel parallel-syncs mymaster 1" >> ${sentinel_conf}
echo "bind 0.0.0.0" >> ${sentinel_conf} redis-sentinel ${sentinel_conf} --protected-mode no } function launchslave() {
echo "Enter lauch slave....." 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)
if [[ -n ${master} ]]; then
master="${master//\"}"
else
echo "Failed to find master."
sleep
exit
fi redis-cli -h ${master} INFO
if [[ "$?" == "" ]]; then
break
fi
echo "Connecting to master failed. Waiting..."
sleep
done
sed -i "s/%master-ip%/${master}/" /redis-slave/redis.conf
sed -i "s/%master-port%/6379/" /redis-slave/redis.conf
redis-server /redis-slave/redis.conf --protected-mode no } if [[ "${MASTER}" == "true" ]]; then
launchmaster
exit
fi if [[ "${SENTINEL}" == "true" ]]; then
launchsentinel
exit
fi launchslave

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-services.yaml oc create -f openshift/redis.yaml

会建立一个master,3个sentinel和3个slave,如图

进去逐个检查日志,确保成功启动

运行下面命令,查看集群信息。

redis-cli -h redis-master  info Replication

构建成功,可以愉快的使用了。

3.集群切换

讲redis-master直接scale到0,模拟down掉

然后检查sentinel的日志,发现mymaster已经从10.129.0.2切换到了10.129.0.8的redis pod.

在reids节点上运行 redis-cli -h 10.129.0.8  info Replication

可以看到集群状态已经发生变化

OpenShift上部署Redis主从集群的更多相关文章

  1. 02.Redis主从集群的Sentinel配置

    1.集群环境 1.Linux服务器列表 使用4台CentOS Linux服务器搭建环境,其IP地址如下: 192.168.110.100 192.168.110.101 192.168.110.102 ...

  2. 一、全新安装搭建redis主从集群

    前言· 这里分为三篇文章来写我是如何重新搭建redis主从集群和哨兵集群的及原本服务器上有单redis如何通过升级脚本来实现redis集群.(redis结构:主-从(备)-从(备)) 至于为什么要搭建 ...

  3. docker搭建redis主从集群和sentinel哨兵集群,springboot客户端连接

    花了两天搭建redis主从集群和sentinel哨兵集群,讲一下springboot客户端连接测试情况 redis主从集群 从网上查看说是有两种方式:一种是指定配置文件,一种是不指定配置文件 引用地址 ...

  4. K8S部署Redis Cluster集群

    kubernetes部署单节点redis: https://www.cnblogs.com/zisefeizhu/p/14282299.html Redis 介绍 • Redis代表REmote DI ...

  5. K8S部署Redis Cluster集群(三主三从模式) - 部署笔记

    一.Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理.它可以存储和操作高级数据类型,例如列表,地图,集合和排序 ...

  6. helm部署Redis哨兵集群

    介绍 Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现.故障自动转移.配置中心和客户端通知. 如下图: Redis Sentinel 故障转移过程: 从这 ...

  7. redis —主从&&集群(CLUSTER)

    REDIS主从配置 为了节省资源,本实验在一台机器进行.即,在一台机器上启动两个端口,模拟两台机器. 机器准备: [root@adailinux ~]# cp /etc/redis.conf /etc ...

  8. Redis主从集群及哨兵模式

    本次实验环境准备用一台服务器模拟3台redis服务器,1主2从 主从集群搭建 第一步:安装Redis 安装Redis,参考前面安装Redis文章,保证单机使用没有问题. 第二步:配置服务器文件 定位到 ...

  9. docker swarm快速部署redis分布式集群

    环境准备 四台虚拟机 192.168.2.38(管理节点) 192.168.2.81(工作节点) 192.168.2.100(工作节点) 192.168.2.102(工作节点) 时间同步 每台机器都执 ...

随机推荐

  1. 【LOJ】#2070. 「SDOI2016」平凡的骰子

    题解 用了一堆迷之复杂的结论结果迷之好写的计算几何???? 好吧,要写立体几何了 如果有名词不懂自己搜吧 首先我们求重心,我们可以求带权重心,也就是x坐标的话是所有分割的小四面体的x坐标 * 四面体体 ...

  2. 分享实用的JavaScript代码库

    1 var keyCodeMap = { 2 8: 'Backspace', 3 9: 'Tab', 4 13: 'Enter', 5 16: 'Shift', 6 17: 'Ctrl', 7 18: ...

  3. hdoj2544 最短路(Dijkstra || Floyd || SPFA)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路 最短路算法模板题,求解使用的Dijkstra算法.Floyd算法.SPFA算法可以当做求解 ...

  4. TradingView 自定义指标

    TradingView 支持自定义指标,不过是把你要定义的指标写成一个 JS 源文件(customIndex.js),放在图表库 static 文件夹下.自定义指标 JS 源代码模板如下: __cus ...

  5. CSUOJ 1011 Counting Pixels

    Description Did you know that if you draw a circle that fills the screen on your 1080p high definiti ...

  6. 世界杯:用Python分析热门夺冠球队-(附源代码)

    2018年,火热的世界杯即将拉开序幕.在比赛开始之前,我们不妨用 Python 来对参赛队伍的实力情况进行分析,并大胆的预测下本届世界杯的夺冠热门球队. 通过数据分析,可以发现很多有趣的结果,比如: ...

  7. NetCore+Dapper WebApi架构搭建(四):仓储的依赖注入

    上一节我们讲到实体,仓储接口和仓储接口的实现需要遵循约定的命名规范,不仅是规范,而且为了依赖注入,现在我们实现仓储的依赖注入 在NetCore WebApi项目中新添加一个文件夹(Unit),当然你也 ...

  8. BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 868  Solved: 236[Submit][Status ...

  9. Java并发(十七):ConcurrentHashMap

    先做总结: 1.HashMap HashTable ConcurrentHashMap HashMap:线程不安全 HashTable:线程安全,每个方法都加了 synchronized 修饰.类似 ...

  10. opencv第三课 Canny边缘检测

    #include<stdio.h> #include<iostream> #include<opencv2\opencv.hpp> using namespace ...