环境&版本
使用docker hub中的镜像搭建,方便单机搭建demo,另外自己安装了一些基本工具(ping、vim等)
因为要搭一主二从,先把主实例环境弄好后再创建出新的docker镜像,快速搭起从库容器
MySQL版本:5.7
主库
宿主机启动:
docker run --name mysqlMaster -e MYSQL_LOG_CONSOLE=true -e MYSQL_ROOT_PASSWORD=lagou123456 -d mysql:5.7
连接上镜像
echo 'deb http://mirrors.163.com/debian/ buster main non-free contrib' > /etc/apt/sources.listecho 'deb http://mirrors.163.com/debian/ buster-updates main non-free contrib' >> /etc/apt/sources.listecho 'deb http://mirrors.163.com/debian/ buster-backports main non-free contrib' >> /etc/apt/sources.listecho 'deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib' >> /etc/apt/sources.listapt-get updateapt-get upgradeapt-get install vim*
每一台都需要开启binlog并且设置唯一的server-id
[mysqld]log-bin=mysql-binserver-id=1
然后登陆进mysql,新建账户并授予权限,注意三台机子都要做,不然没法切换
create user 'repl'@'%' identified by 'lagou123456';grant REPLICATION SLAVE ON *.* TO 'repl'@'%' identified by 'lagou123456';flush privileges;
安装半同步复制插件
# 安装插件INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';# 开启set global rpl_semi_sync_master_enabled=on;show variables like '%rpl_semi_sync_master%';# 验证show global status like 'rpl%';
从库
复制主库镜像
docker commit <master container id> mine/mysql57:v1docker run --name slave1 -e MYSQL_LOG_CONSOLE=true -e MYSQL_ROOT_PASSWORD=lagou123456 -d mine/mysql57:v1
设置与主库不同的server-id
登陆进去执行以下指令
# LOG相关值需要在主库中 show master status获取CHANGE MASTER TO MASTER_HOST='172.17.0.2', MASTER_USER='repl',MASTER_PASSWORD='lagou123456',MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=154;# 开启同步START SLAVE;# 查看同步状态SHOW SLAVE STATUS \G;
安装半同步复制插件
# 安装插件INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';# 开启set global rpl_semi_sync_slave_enabled=on;# 如果之前已经开启同步,需要重启stop slave;start slave;# 验证show global status like 'rpl%';
MHA搭建
环境安装,三台机器都安装mha node,我这边偷懒就把manager安装在从库上
apt-get install libdbd-mysql-perl# rpm包需要到网上下载 此命令在宿主机执行docker cp /Users/canzihou/software/mha bdef0d156e93:/root/dpkg -i mha4mysql-node_0.54-0_all.deb
安装manager
# apt-get install libdbd-mysql-perl# apt-get install libconfig-tiny-perl# apt-get install liblog-dispatch-perl# apt-get install libparallel-forkmanager-perl
manager配置文件
# /etc/app1.cnf[server default]# mysql user and passworduser=rootpassword=lagou123456ssh_user=root# working directory on the managermanager_workdir=/var/log/masterha/app1# working directory on MySQL serversremote_workdir=/var/log/masterha/app1[server1]hostname=<ip>[server2]hostname=<ip>[server3]hostname=<ip>
检查ssh连接,每台机器都要
# managermasterha_check_ssh --conf=/etc/app1.cnf
# 没有ssh 从头安装apt-get install openssh-server# 共享公钥ssh-keygen -t rsacat /root/.ssh/id_rsa.pub>> /root/.ssh/authorized_keysssh root@172.17.0.2 cat ~/.ssh/id_rsa.pub >> authorized_keysssh root@172.17.0.3 cat ~/.ssh/id_rsa.pub >> authorized_keysssh root@172.17.0.4 cat ~/.ssh/id_rsa.pub >> authorized_keysservice ssh start
修改配置文件/etc/ssh/sshd_config
PermitRootLogin yesPubkeyAuthentication yesUsePAM no
检查主从状态
masterha_check_repl --conf=/etc/app1.cnf
通过后可以开启manager
nohup masterha_manager --conf=/etc/app1.cnf < /dev/null > /var/log/masterha/app1/app1.log 2>&1 &masterha_manager --conf=/etc/app1.cnf# 查看manager状态masterha_check_status --conf=/etc/app1.cnf
模拟主库挂掉
# 禁用主库3306端口nft add rule iptable1 filter-input-ens33-p0 ip daddr 172.17.0.2 tcp dport 3306 drop
问题
运行以下命令报错,需要修改源码
masterha_check_repl --conf=/etc/app1.cnf
sub parse_mysql_major_version($) {my $str = shift;$str =~ /(\d+)\.(\d+)/;my $strmajor = "$1.$2";my $result = sprintf( '%03d%03d', $strmajor =~ m/(\d+)/g );return $result;}
