Docker中的MySQL5.7双主Keepalived配置

上一篇说了这货的基本配置,主机上搞是没啥困难的,然而这回有客户是纯内网环境,虽然用离线包也不是不可以,但手工处理依赖太麻烦,好在还是有Docker环境可以用,所以同事说要不搞个Docker版本吧。

MySQL

我一般是用Percona官方的版本:percona-server

mkdir /var/lib/mysql /var/log/mysql
chown 1001:1001 /var/lib/mysql /var/log/mysql
# 把 mysqld.cnf 放到某个路径 /path_to/my.cnf.d
docker run -d -p3306:3306 \
    -v /var/lib/mysql:/var/lib/mysql \
    -v /var/log/mysql:/var/log/mysql \
    -v /path_to/my.cnf.d:/etc/my.cnf.d \
    -e MYSQL_ROOT_PASSWORD="RootPassword" \
    --name mysql \
    percona/percona-server:5.7

Keepalived

这个比较麻烦,因为Keepalived需要直接操作服务器的网卡配置,为了实现这一点,需要运行Keepalived的容器具有相应的权限。解决方案是运行容器时加上--privileged--network=host

实际使用是有现成的解决方案:osixia/keepalived

但为了省事起见,我把两个服务放到一个镜像里做了一个Dockerfile:

FROM percona/percona-server:5.7
MAINTAINER raptor<[email protected]>
USER root
RUN yum update -y && yum install -y keepalived
COPY ./my_bin /opt/mysql
USER mysql

用的是percona版本的MySQL 5.7,加装上keepalived,my_bin里是几个用到的脚本和配置文件模板。

其中一个脚本是用来启动Keepalived的,其中核心一句是:

/usr/sbin/keepalived -f /etc/keepalived/keepalived.conf -nldD &> /proc/1/fd/1 &

就是后台运行Keepalived,并把日志追加到docker容器日志里。

这个脚本的其它部分是从模板根据命令行参数构造一个配置文件,具体看代码。

镜像已上传docker hub,代码也发在Gayhub

Troubleshooting

启动完如果有问题,可以查看一下日志,根据错误信息排查原因。

比如这个错误:

IPVS: Cannot initialize ipvs: Protocol not available

通常是因为ip_vs模块未加载。

在服务器上(不是容器里)查看:

lsmod | grep ip_vs

如果没有结果的话,就需要加载一下:

modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4

同时需要把这几句保存成一个文件:ipvs.modules 放到:/etc/sysconfig/modules/ 并设置权限:

chmod 755 /etc/sysconfig/modules/ipvs.modules

用于启动时加载。

另外,还可以安装一个ipvsadm应用来处理问题。

推送到[go4pro.org]