乐于分享
好东西不私藏

MySQL5.7 源码编译安装与一主两从配置手册

MySQL5.7 源码编译安装与一主两从配置手册

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/shutdownnode
4.环境校验
  • 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 keepalived
2.编辑keepalived配置(DB节点)

主库 /etc/keepalived/keepalived.conf

global_defs {   router_id mysql-master}vrrp_instance VI_1 {    state BACKUP    interface eth0    virtual_router_id 51    priority 100          # 主库优先级最高    advert_int 1    nopreempt             # 关闭抢占,切换后原主恢复不抢回VIP,避免抖动    authentication {        auth_type PASS        auth_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 2    weight -50}

从库 /etc/keepalived/keepalived.conf

global_defs {   router_id mysql-master}vrrp_instance VI_1 {    state BACKUP    interface eth0    virtual_router_id 51    priority 80          # 从库优先级都写80,其他配置不变    advert_int 1    nopreempt                authentication {        auth_type PASS        auth_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 2    weight -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") {    # 新主优先级改为100    system("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