本来应该续之前那篇博客Docker配置redis哨兵模式——多服务器·上写一个下篇的,但是忽然意识到应该将必要的环境打包为一个基础镜像,在此基础上建立与redis有关的镜像,这样既能够快速打包,又能够高度复用代码。

所以本篇实际上相当于一个完整的多服务器使用Docker来部署Redis哨兵模式的过程。

目录

  1. 服务器条件
  2. 安装Docker
  3. 制备基础镜像
  4. 配置redis主从节点
  5. 哨兵节点

服务器条件

因为我的服务器又是新租(日租)的,所以要重新恢复一下。

三台服务器(因为需要至少三个哨兵保证安全性)

  • 服务器1:123.57.234.161
  • 服务器2:123.56.85.138
  • 服务器3:8.131.68.191
  • 端口号7000、17000已在安全组上放行(阿里云)
  • 环境:centos8.0

安装Docker

逐行执行以下指令:

# 1. 更新编译环境
yum -y install gcc

# 2. 同上
yum -y install gcc-c++

# 3. 安装docker
# 3.1 卸载旧版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 3.2 安装需要的安装包
yum install -y yum-utils
# 3.3设置镜像的仓库,推荐使用国内的镜像,比较快
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3.4 更新yum软件包索引,功能是将软件包缓存在本地一份
yum makecache
# 3.5 安装docker相关的 docker-ce 社区版
yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm
# 3.6 安装
yum install docker-ce docker-ce-cli containerd.io
# 3.7 启动docker
systemctl start docker
# 3.8 设置为后台启动
systemctl enable docker
# 3.9 使用docker version查看是否按照成功
docker version
# 3.10 测试(可以不做)
docker run hello-world
# 3.11 卸载删除(仅供参考,本次不做)
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker

# 4. 配置加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://qdxc3615.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

制备基础镜像

docker仓库中的centos镜像非常简单,缺少一些功能,不方便我们安装和调试,所以我们把与redis本身无关但有助于我们使用的部分打包成一个常用的基础镜像。

主要安装的是vim编辑器和procps(查看容器内运行的进程)所以创建一个目录为basecentos,在其中创建并编写Dockerfile如下:

# 创建Dockerfile
vi Dockerfile

# 以下所有代码为Dockerfile的内容

FROM redis
MAINTAINER blue<[email protected]>
# 安装一些环境
RUN apt-get update
RUN apt-get install -y vim
RUN apt-get install procps --assume-yes

保存Dockerf后可以创建名为base-centos的镜像,以后就可以直接从这个镜像生成新的容器,不需要一直下载。步骤如下:

docker build -t base-centos .

# 查看现有的镜像:
[root@docker001 baseimage]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
base-centos            latest              646e329bb8db        2 minutes ago       157MB

# 使用docker login 登录自己的docker账号

将它push到我们的dockerhub上,再在另外两个服务器上pull下来,现在三个服务器上都有这个镜像啦,我给他起的名字叫lanblue/mygoodcentos。

配置redis主从节点

我们使用的服务器是服务器1和服务器2。

TIPS: 对于xshell可以使用右键选择发送键输入到所有会话,这样就不需要配置两遍了。或者使用scp语句将配置好的文件共享给其他服务器:

# scp local_file remote_username@remote_ip:remote_folder
scp redis.conf [email protected]:/blue/redis02
  1. 首先创建文件夹,注意不要放在home路径下,否则容易因为权限问题是容器运行失败。我创建的目录为/blue/redis01,指令比较简单:
cd /
mkdir blue && cd blue
mkdir redis01 && cd redis01
  1. 创建Dockerfile,内容如下:
FROM lanblue/mygoodcentos
MAINTAINER blue<[email protected]>

COPY redis.conf /usr/local/etc/redis/redis.conf

VOLUME ["/data1"]

WORKDIR /etc/redis

# 开放端口7000
EXPOSE 7000

# 使用配置文件启动
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf"]

  1. 从官网上下载一个redis.conf放在redis01目录下,redis.conf则是redis的一些配置,这个和之前单机版的redis一主一从三哨兵的配置基本相同,做如下修改:
# 注释掉bind 127.0.0.1
# bind 127.0.0.1

port 7000

# 这里如果是yes会影响使用配置文件启动
daemonize no

pidfile /var/run/redis_7000.pid

# 需要设置以下两处密码,密码要一致
requirepass testmaster123
masterauth testmaster123

# 修改保护模式,如果是yes会导致外部服务器无法访问
protected-mode no

# 对于服务器2,还需要加上一句,表示是服务器1的从服务器
# slaveof 主.机.I.P 端口
slaveof 123.57.234.161 7000
  1. 创建镜像和运行容器:
# 创建镜像
docker build -t myredis .
# 启动容器
docker run -d -p 7000:7000 --name redis-test myredis
# 进入容器内部
docker exec -it redis-test /bin/bash
# 查看容器内进程
ps -ef

  1. 测试:

root@9692ae0ac72c:/etc/redis# redis-cli -p 7000
127.0.0.1:7000> auth testmaster123
OK
127.0.0.1:7000> info replication

哨兵节点

在/blue下创建文件夹sentinel01。其内存放Dockerfile和sentinel.conf文件。

  1. Dockerfile文件内容如下:
FROM lanblue/mygoodcentos
MAINTAINER blue<[email protected]>

COPY sentinel.conf /usr/local/etc/redis/sentinel.conf

# VOLUME ["/data2"]

# 开放端口17000
EXPOSE 17000

# 使用配置文件启动
CMD [ "redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]

  1. sentinel.conf文件如下,注意不能在配置文件里设置daemonize yes,会导致我们的指定配置失败:
port 17000
sentinel monitor mymaster 123.57.234.161 7000 2
sentinel auth-pass mymaster testmaster123

sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
# 设置为no才会被其他主机发现
protected-mode no

  1. 创建镜像,启动容器,进入容器内部:
# 创建镜像
docker build -t mysentinel .
# 启动容器
docker run -d -p 17000:17000 --name sentinel-test mysentinel
# 进入容器内部
docker exec -it sentinel-test /bin/bash
# 访问17000端口
redis-cli -p 17000
# 查看哨兵情况
# 以下是端口返回的信息
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=123.57.234.161:7000,slaves=1,sentinels=4

# 哨兵节点会自动发现其他哨兵,如果某些哨兵线程已经失效了,可以用下列语句更新
127.0.0.1:17000> SENTINEL RESET *
(integer) 1


  1. 主从切换测试
    使用docker stop 语句可以关闭某个运行的容器。关闭主节点所在的容器后可以观察到从节点变成master。切换基本与之前单机版本相同。
11-10 05:42