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]