摘要
众所周知,Mysql Galera Cluster为数据库提供了高一致性高可用的方案。但从实际商用的角度来看,仅仅依靠Galera插件并不能算是一个完整的Mysql高可用方案。一个完整的高可用方案还要考虑VIP、备份、灾难恢复等。这里将介绍我自己搭建的Mysql+Haproxy+Keepalived+Zookeeper+contrail cmon的方案。
一、前置准备
首先准备一个mysql的docker容器(或者裸金属服务器上直接安装),并且在容器中安装了Haproxy、Keepalived、Zookeeper、contrail cmon等服务。另外还需要单独挂载硬盘给mysql的/var/lib/mysql目录使用。
其它前置条件 1. 安装docker 2. 下载好容器镜像 3. 关闭防火墙等
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
相关内核 自己的内核加载脚本
./ebtables.modules ./iptables.modules ./ip6tables.modules
三容器节点互信
容器启动命令
docker run --privileged -tid -e "container=docker" -h mysql1 --name=mysql --restart=always --net=host -p 10022:22 --stop-signal=RTMIN+3 docker-registry:5000/library/mysql:v1.3 /usr/sbin/init
docker run --privileged -tid -e "container=docker" -h mysql2 --name=mysql --restart=always --net=host -p 10022:22 --stop-signal=RTMIN+3 docker-registry:5000/library/mysql:v1.3 /usr/sbin/init
docker run --privileged -tid -e "container=docker" -h mysql3 --name=mysql --restart=always --net=host -p 10022:22 --stop-signal=RTMIN+3 docker-registry:5000/library/mysql:v1.3 /usr/sbin/init
二、配置mysql
三台节点配置mysql.cnf
三、配置zookeeper
三台Server节点配置zookeeper
四、配置keepalived
三台Server节点配置keepalived
五、配置Haproxy
三台Server节点配置Haproxy
六、服务启动
第一个节点启动
service mysql start --wsrep-new-cluster
其它两个节点启动及集群检查
service mysql start
mysql -uroot -p123456 -e 'show status like "wsrep%"'
启动zookeeper
service zookeeper start
service zookeeper status
/sbin/chkconfig zookeeper on
chkconfig --list
启动haproxy
systemctl start haproxy
systemctl status haproxy
systemctl enable haproxy
启动keepalived
systemctl start keepalived
systemctl status keepalived
systemctl enable keepalived
检查vip是否有效
mysql -uroot -p123456 -h 172.16.165.180 -P3306
七、配置cmon服务
mysql集群启动正常之后,开始配置cmon。contrail-cmon作用是在重启后,通过contrail-cmon-monitor.sh和contrail-bootstrap-galera.sh脚本将mysql集群恢复。其过程首先是用“service mysql start –wsrep_recover”启动mysql,找出gitd最大的,也就是数据最新的mysql节点,启动。再依次拉起其它两个节点。
首先创建cmon用户
mysql -uroot -p123456 -e "create database cmon character set utf8 collate utf8_bin;"
mysql -uroot -p123456 -e "CREATE SCHEMA IF NOT EXISTS cmon;"
mysql -uroot -p123456 -e "grant all privileges on *.* to cmon@localhost identified by 'cmon' with grant option;"
mysql -uroot -p123456 -e "grant all privileges on *.* to 'cmon'@'%' identified by 'cmon' with grant option;"
mysql -uroot -p123456 -e "flush privileges;"
mysql -uroot -p123456 < /usr/share/cmon/cmon_db.sql
mysql -uroot -p123456 < /usr/share/cmon/cmon_data.sql
mysql -uroot -p123456 -e "use cmon; insert into cluster(type) VALUES ('galera')"
mysql -ucmon -pcmon -h 172.16.165.180 cmon
mysql -ucmon -pcmon -h 172.16.165.162 -p 3306 cmon
配置cmon
配置完成后手工修改一下contrail-cmon-monitor.sh和contrail-bootstrap-galera.sh脚本,由于篇幅问题,整理不再详述。之后启动cmon,观察日志。
systemctl status contrail-hamon.service
systemctl restart contrail-hamon.service
systemctl enable contrail-hamon.service
systemctl stop contrail-hamon.service
/opt/contrail/bin (cmon 启动脚本)
tail -f /var/log/contrail/ha/cmon-monitor.log (cmon 日志)
tail -f /var/log/galera-bootstrap.log (cmon 启动mysql 日志)
八、数据库备份
可以采用cron定时任务方式,定时执行dump脚本,并且通过目录映射方式,将备份的sql压缩文件存放在物理服务器上。