MySQL5.7 源码编译 一主两从搭建完整笔记
环境信息
系统版本:CentOS 7.9
MySQL 版本:5.7.33 boost 整合包源码编译
安装路径:
/usr/local/mysql数据目录:
/usr/local/mysql/data架构:1 主 2 从
主Master: IP 172.16.3.229,server-id=1
从Slave1:IP 172.16.3.233,server-id=2
从Slave2:IP 172.16.3.234,server-id=3
账号信息
数据库账号密码:
root/test123复制账号:
repl / Repl@123456
第一部分:部署MySQL
一、安装编译依赖(三台机器都操作)
yum install cmake gcc gcc-c++ make ncurses-devel openssl-devel bison libaio-devel wget -y二、创建MySQL用户和组(三台机器都操作)
groupadd mysqluseradd -M -s /sbin/nologin mysql
三、下载解压MySQL源码包(三台机器都操作)
使用华为镜像站压缩包:Index of mysql-local/Downloads/MySQL-5.7
cd /usr/local/srcwget https://mirrors.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-boost-5.7.33.tar.gztar -zxvf mysql-boost-5.7.33.tar.gzcd mysql-5.7.33
四、创建目录并授权(三台机器都操作)
mkdir -p /usr/local/mysqlmkdir -p /usr/local/mysql/datachown -R mysql:mysql /usr/local/mysql
五、cmake 编译配置(三台机器都操作)
cmake \-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \-DMYSQL_DATADIR=/usr/local/mysql/data \-DSYSCONFDIR=/etc \-DWITH_MYISAM_STORAGE_ENGINE=1 \-DWITH_INNOBASE_STORAGE_ENGINE=1 \-DWITH_MEMORY_STORAGE_ENGINE=1 \-DWITH_READLINE=1 \-DMYSQL_UNIX_ADDR=/usr/local/mysql/data/mysql.sock \-DMYSQL_TCP_PORT=3306 \-DENABLED_LOCAL_INFILE=1 \-DWITH_PARTITION_STORAGE_ENGINE=1 \-DEXTRA_CHARSETS=all \-DDEFAULT_CHARSET=utf8mb4 \-DDEFAULT_COLLATION=utf8mb4_unicode_ci \-DWITH_SSL=system \-DWITH_BOOST=/usr/local/src/mysql-5.7.33/boost
五、编译安装(三台机器都操作)
make -j2make install
六、初始化数据目录(三台机器都操作,生成系统库、临时 root 密码)
/usr/local/mysql/bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize执行后终端会输出临时 root 密码,保存备用。
七、配置 systemd 管理 mysqld 服务(三台机器都操作)
编辑文件 /usr/lib/systemd/system/mysqld.service
[Unit]After=network.target syslog.target[Service]User=mysqlGroup=mysqlType=forkingPIDFile=/usr/local/mysql/data/mysqld.pidExecStart=/usr/local/mysql/bin/mysqld \--daemonize \--pid-file=/usr/local/mysql/data/mysqld.pid \--basedir=/usr/local/mysql \--datadir=/usr/local/mysql/dataExecReload=/bin/kill -s HUP MAINPIDLimitNOFILE=65535PrivateTmp=true[Install]WantedBy=multi-user.target
八、重载 systemd,启动并开机自启(三台机器都操作)
systemctl daemon-reloadsystemctl start mysqldsystemctl enable mysqldsystemctl status mysqld

九、修改root初始密码(三台都执行)
# 用初始化输出的临时密码登录/usr/local/mysql/bin/mysql -uroot -p
修改密码
# 修改root密码为test123ALTER USER 'root'@'localhost' IDENTIFIED BY 'test123';FLUSH PRIVILEGES;exit;
第二部分:配置一主两从
一、主库配置(master执行)
编辑/etc/my.cnf,写入以下配置
[mysqld]basedir=/usr/local/mysqldatadir=/usr/local/mysql/datasocket=/usr/local/mysql/data/mysql.sockpid-file=/usr/local/mysql/data/mysqld.pidlog-error=/usr/local/mysql/data/mysql-error.logport=3306user=mysqlcharacter-set-server=utf8mb4# 主库复制参数server-id = 1log-bin = mysql-binbinlog-format = ROWsync_binlog = 1expire_logs_days = 7[mysqld_safe]log-error=/usr/local/mysql/data/mysql-error.logpid-file=/usr/local/mysql/data/mysqld.pidsocket=/usr/local/mysql/data/mysql.sock[client]socket=/usr/local/mysql/data/mysql.sockport=3306
二、从库配置(Slave执行)
编辑/etc/my.cnf,写入以下配置
#Slave1[mysqld]basedir=/usr/local/mysqldatadir=/usr/local/mysql/datasocket=/usr/local/mysql/data/mysql.sockpid-file=/usr/local/mysql/data/mysqld.pidlog-error=/usr/local/mysql/data/mysql-error.logport=3306user=mysqlcharacter-set-server=utf8mb4# 从库Slave1复制参数server-id = 2log-bin = mysql-binbinlog-format = ROWrelay-log = relay-binread_only = 1super_read_only = 1[mysqld_safe]log-error=/usr/local/mysql/data/mysql-error.logpid-file=/usr/local/mysql/data/mysqld.pidsocket=/usr/local/mysql/data/mysql.sock[client]socket=/usr/local/mysql/data/mysql.sockport=3306
#Slave2[mysqld]basedir=/usr/local/mysqldatadir=/usr/local/mysql/datasocket=/usr/local/mysql/data/mysql.sockpid-file=/usr/local/mysql/data/mysqld.pidlog-error=/usr/local/mysql/data/mysql-error.logport=3306user=mysqlcharacter-set-server=utf8mb4# 从库Slave2复制参数server-id = 3log-bin = mysql-binbinlog-format = ROWrelay-log = relay-binread_only = 1super_read_only = 1[mysqld_safe]log-error=/usr/local/mysql/data/mysql-error.logpid-file=/usr/local/mysql/data/mysqld.pidsocket=/usr/local/mysql/data/mysql.sock[client]socket=/usr/local/mysql/data/mysql.sockport=3306
三、三台修改配置后重启 mysql
systemctl stop mysqldsystemctl daemon-reloadsystemctl start mysqld
第三部分:创建复制账号(仅主库操作)
一、登录MySQL
/usr/local/mysql/bin/mysql -uroot -ptest123二、创建复制同步账号(主库、候选主库都要创建)
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';FLUSH PRIVILEGES;
三、查看主库 binlog 同步位点(关键,记录 File、Position)
SHOW MASTER STATUS;-- 示例记录 File: mysql-bin.000001 Position:1749

第四部分:从库配置主从同步(两个从库执行)
一、登录 MySQL
/usr/local/mysql/bin/mysql -uroot -ptest123二、关联主库
STOP SLAVE;RESET SLAVE ALL;CHANGE MASTER TOMASTER_HOST='172.16.3.229',MASTER_USER='repl',MASTER_PASSWORD='Repl@123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1749;START SLAVE;
三、校验同步状态
SHOW SLAVE STATUS\G正常标准指标:
第五部分:主从同步验证
主库 master 执行写入测试
CREATE DATABASE game;USE game;CREATE TABLE role(id INT,name VARCHAR(20));INSERT INTO role VALUES (1,"张三");
两台从库分别查询
USE game;SELECT * FROM role;
能查询到数据,代表一主两从搭建完成。
第六部分:MHA+Keepalived高可用
MHA服务器环境信息
kvm1:172.16.3.229 当前主库
kvm2:172.16.3.233 候选从库(可提升新主)
kvm3:172.16.3.234 普通只读从库(不参与选主)
MHA-Manager:172.16.2.14 独立管理节点,仅部署监控程序
VIP 业务访问地址:172.16.3.236
一、准备基础环境
1.所有节点配置主机名解析/etc/hosts
172.16.3.229 kvm1172.16.3.233 kvm2172.16.3.234 kvm3
2.所有节点 SSH 免密互通
MHA Manager 可免密 ssh 到 三台MySQL服务器 (MHA服务器执行)
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa把公钥发给另外 3 台
ssh-copy-id root@kvm1ssh-copy-id root@kvm2ssh-copy-id root@kvm3
数据库节点之间互相免密 ssh (每台MySQL服务器执行)
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa分发公钥(每台MySQL服务器把公钥发给另外 2 台)
ssh-copy-id root@kvm1ssh-copy-id root@kvm2ssh-copy-id root@kvm3
快速校验命令(验证双向连通)
在 MySQL主库 上执行,可以直接登录
ssh root@kvm2ssh root@kvm3
在 MHA Manager 上执行,可以直接登录
ssh root@kvm1ssh root@kvm2ssh root@kvm3
3.编辑MySQL my.cnf 关键配置(所有 DB 节点)
主库
[mysqld]server-id=1log-bin=mysql-binbinlog-format=ROWgtid_mode=ONenforce_gtid_consistency=ONrelay_log=relay-binlog_slave_updates=1 #log_slave_updates=1 必须开启,切换新主后从库能同步完整 binlog 数据
从库
[mysqld]server-id=2 # MySQL2填2 / MySQL3填3 不能重复log-bin=mysql-binbinlog-format=ROWgtid_mode=ONenforce_gtid_consistency=ONrelay_log=relay-binlog_slave_updates=1 #log_slave_updates=1 必须开启,切换新主后从库能同步完整 binlog 数据read_only=1super_read_only=1
4.创建MHA用户(所有 DB 节点执行)
SET GLOBAL super_read_only=0;SET GLOBAL read_only=0;CREATE USER 'mha'@'%' IDENTIFIED BY 'Mha@123456';GRANT ALL PRIVILEGES ON *.* TO 'mha'@'%';
备选主库创建后关闭写入
SET GLOBAL super_read_only=1;SET GLOBAL read_only=1;
二、安装运行
1.安装MHA软件包
MySQL 数据库节点(MySQL1/2/3)
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManagerrpm -ivh mha4mysql-node-0.58-0.el7.noarch.rpm
MHA-Manager 节点
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManagerrpm -ivh mha4mysql-node-0.58-0.el7.noarch.rpmrpm -ivh mha4mysql-manager-0.58-0.el7.noarch.rpm
2.创建工作目录
MHA服务器执行:
mkdir -p /etc/mha /var/log/mha/mysql_cluster /data/mha_workchmod 777 /data/mha_work
三台 MySQL 数据库节点执行:
mkdir -p /data/mha_workchmod 777 /data/mha_work
3.编写MHA配置文件(MHA服务器执行)
/etc/mha/mysql_cluster.conf
user=mhapassword=Mha@123456ssh_user=rootrepl_user=replrepl_password=Repl@123456# MHA日志与工作目录manager_workdir=/var/log/mha/mysql_clustermanager_log=/var/log/mha/mysql_cluster/manager.logremote_workdir=/data/mha_work# 主库故障检测间隔秒ping_interval=1# 1. 双从库二次校验脚本(区分网络抖动/真实宕机)secondary_check_script=/usr/bin/masterha_secondary_check -s 172.16.3.233 -s 172.16.3.234# 2. 故障宕机时,旧主防脑裂隔离脚本shutdown_script=/etc/mha/shutdownnode# 3. 在线切换VIP脚本(手动切换主库、在线迁移时自动调用)master_ip_online_change_script=/etc/mha/switch_ka.plmaster_binlog_dir=/usr/local/mysql/data# 节点1:当前主库,优先候选主[server1]hostname=kvm-1candidate_master=1check_repl_delay=0ip=172.16.3.229# 节点2:备选从库[server2]hostname=kvm-2candidate_master=1ip=172.16.3.233# 节点3:普通从库,不参与竞选主库[server3]hostname=kvm-3no_master=1ip=172.16.3.234
脑裂隔离脚本 shutdownnode示例:
/etc/mha/shutdownnode
#!/bin/bashCOMMAND=""HOST=""IP=""while [[ 1" in--command=*)COMMAND="{1#--host=}"shift;;--ip=*)IP="{COMMAND}" instatus)exit 0;;stopssh)ssh -o ConnectTimeout=3 root@?;;*)exit 1;;esac
授权脚本
chmod +x /etc/mha/shutdownnode4.环境校验
- SSH 连通校验
masterha_check_ssh --conf=/etc/mha/mysql_cluster.conf正常输出:All SSH connection tests passed successfully.
- 复制整体环境校验
masterha_check_repl --conf=/etc/mha/mysql_cluster.conf正常结尾:MySQL Replication Health is OK.
5.后台启动MHA监控进程
启动命令
nohup masterha_manager --conf=/etc/mha/mysql_cluster.conf > /var/log/mha/mysql_cluster/manager.log 2>&1 &查看MHA 监控进程状态
masterha_check_status --conf=/etc/mha/mysql_cluster.conf
三、keepalived VIP漂移
MHA 无自动切换 VIP 脚本,通过 Keepalived 提供统一业务 VIP,搭配切换脚本漂移
1.三台MySQL节点安装 Keepalived
yum install -y keepalived2.编辑keepalived配置(DB节点)
主库 /etc/keepalived/keepalived.conf
global_defs {router_id mysql-master}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 100 # 主库优先级最高advert_int 1nopreempt # 关闭抢占,切换后原主恢复不抢回VIP,避免抖动authentication {auth_type PASSauth_pass 123456}virtual_ipaddress {172.16.3.236/21 dev eth0 label eth0:0}# 监控mysql,mysql挂了自动降低权重,VIP飘走track_script {chk_mysql}}# 检测MySQL是否存活vrrp_script chk_mysql {script "/etc/keepalived/check_mysql.sh"interval 2weight -50}
从库 /etc/keepalived/keepalived.conf
global_defs {router_id mysql-master}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 80 # 从库优先级都写80,其他配置不变advert_int 1nopreemptauthentication {auth_type PASSauth_pass 123456}virtual_ipaddress {172.16.3.236/21 dev eth0 label eth0:0}track_script {chk_mysql}}vrrp_script chk_mysql {script "/etc/keepalived/check_mysql.sh"interval 2weight -50}
3.keepalived检查脚本(DB节点)
/etc/keepalived/check_mysql.sh
#!/bin/bash# 检测mysql端口3306是否存活mysql -u mha -pMha@123456 -h 127.0.0.1 -P3306 -e "select 1;" > /dev/null 2>&1if [ command,orig_master_ip);GetOptions("command=s" => \new_master_ip,"orig_master_ip=s" => \command eq "change_master") {# 新主优先级改为100system("ssh root\@orig_master_ip 'sed -i \"s/priority [0-9]*/priority 80/\" /etc/keepalived/keepalived.conf; systemctl restart keepalived'");}exit 0;
使用说明:
/etc/mha/switch_ka.pl --command=change_master --new_master_ip=新主IP --orig_master_ip=旧主IP# 切换VIP到新主/etc/mha/switch_ka.pl --command=change_master --new_master_ip=172.16.3.233 --orig_master_ip=172.16.3.229# 故障恢复切回原主/etc/mha/switch_ka.pl --command=change_master --new_master_ip=172.16.3.229 --orig_master_ip=172.16.3.233
6.业务访问方式
业务统一连接 VIP 172.16.3.236,无需关心后端真实主库 IP
四、完整故障切换测试流程
1.模拟主库宕机
ssh root@172.16.3.229systemctl stop mysqld
2.MHA全自动执行流程
①故障检测:1 秒轮询 MySQL 失败,双从库二次校验确认主库宕机
②Phase2 隔离旧主:自动调用 shutdownnode,给宕机主添加 iptables 3306 拦截,防止脑裂
③Phase3 选举提升新主
对比从库 relay 日志完整度,优先选中 candidate_master=1的 kvm2自动回放全部中继日志,保证数据完整 自动关闭 super_read_only/read_only,放开写入权限
④Phase4 自动重构从库同步
自动重置 kvm3 复制、自动执行 change master 指向新主、自动启动同步、等待 GTID 数据追平,Slave_IO/SQL_Running=Yes
⑤Phase5 切换收尾:新主清理从库标记,输出completed successfully,MHA 进程自动退出
3.切换后手动操作
从日志可以看到,172.16.3.233:3306 已选举为新主,执行脚本漂移 VIP 至新主
/etc/mha/switch_ka.pl --command=change_master --new_master_ip=172.16.3.233 --orig_master_ip=172.16.3.229业务读写验证:VIP 建库,登录 kvm3 核对数据同步
4.故障恢复切回原主流程
修复旧主 kvm1,删除隔离防火墙规则
ssh root@172.16.3.229iptables -D INPUT -p tcp --dport 3306 -j DROPiptables-save > /etc/sysconfig/iptablessystemctl start mysqld# 查询当前主库最新binlog位点mysql -uroot -p -e "show master status;"
kvm2、kvm3 重置复制,重新指向原主 kvm1
STOP SLAVE;RESET SLAVE ALL;CHANGE MASTER TOMASTER_HOST='172.16.3.229',MASTER_USER='repl',MASTER_PASSWORD='Repl@123456',MASTER_AUTO_POSITION=1;START SLAVE;SHOW SLAVE STATUS\G
VIP 切回原主
/etc/mha/switch_ka.pl --command=change_master --new_master_ip=172.16.3.229 --orig_master_ip=172.16.3.233校验集群健康,重启 MHA 监控
masterha_check_repl --conf=/etc/mha/mysql_cluster.confpkill -f masterha_managerrm -f /var/log/mha/mysql_cluster/mysql_cluster.failover.* #清理锁文件nohup masterha_manager --conf=/etc/mha/mysql_cluster.conf > /var/log/mha/mysql_cluster/manager.log 2>&1 &tail -f /var/log/mha/mysql_cluster/manager.log
夜雨聆风