MySQL 学习笔记(第七期):高可用架构进阶与综合项目实战
本笔记整合 主从复制与读写分离 和 MHA 高可用与综合项目 ,涵盖:主从复制原理与搭建、Amoeba 读写分离、MHA 高可用架构(故障切换与修复)、LAMP+WordPress 项目部署、MySQL 5.7 源码安装。这是一份完整的高可用与实战指南。
第一部分:主从复制与读写分离
一、主从复制核心原理
1.1 为什么需要主从复制?
- 数据冗余与灾难恢复
- 提升读并发能力(读写分离)
- 避免读操作锁冲突
- 数据备份(从库可离线备份)
1.2 主从复制的三个核心组件
| 组件 | 位置 | 作用 |
|---|---|---|
| binlog(二进制日志) | 主库 | 记录所有数据变更操作 |
| I/O 线程 | 从库 | 连接主库,请求并接收 binlog,写入中继日志 |
| SQL 线程 | 从库 | 读取中继日志,重放 SQL 语句 |
1.3 完整复制流程
- 主库执行
INSERT/UPDATE/DELETE等操作 - 主库将这些操作记录到 binlog
- 从库的 I/O 线程连接主库,请求 binlog
- 主库的 dump 线程将 binlog 发送给从库
- 从库 I/O 线程将接收到的内容写入中继日志(relay log)
- 从库 SQL 线程读取中继日志,重放 SQL 语句
- 从库数据与主库完全一致
状态检查 :在从库执行 SHOW SLAVE STATUS\G,关键字段:
Slave_IO_Running: Yes------ I/O 线程正常Slave_SQL_Running: Yes------ SQL 线程正常
二、一主两从环境搭建
2.1 环境规划
| 主机名 | IP 地址 | 角色 | 说明 |
|---|---|---|---|
| mysql-master | 192.168.108.101 | 主库 | 可写可读 |
| mysql-slave01 | 192.168.108.102 | 从库1 | 只读 |
| mysql-slave02 | 192.168.108.103 | 从库2 | 只读 |
所有节点需完成:
- 时间同步:
ntpdate ntp.aliyun.com - 关闭防火墙:
systemctl disable --now firewalld - 关闭 SELinux:
setenforce 0
2.2 主库配置(mysql-master)
编辑配置文件 /etc/my.cnf:
ini
[mysqld]
server-id = 11
log-bin = master-bin
log-slave-updates = true
重启 MySQL:
bash
systemctl restart mysqld
创建复制用户:
sql
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.108.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
查看主库状态(记录 File 和 Position):
sql
SHOW MASTER STATUS;
+---------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------+------------------+
| master-bin.000001 | 604 | | |
+---------------------+----------+--------------+------------------+
2.3 从库配置(mysql-slave01 / mysql-slave02)
处理 UUID 冲突(如果从库是从主库克隆而来):
bash
systemctl stop mysqld
rm -f /usr/local/mysql/data/auto.cnf
systemctl start mysqld
编辑配置文件 /etc/my.cnf:
ini
[mysqld]
server-id = 22 # slave02 为 23
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
重启 MySQL。
配置主从连接:
sql
CHANGE MASTER TO
MASTER_HOST='192.168.108.101',
MASTER_USER='myslave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=604;
START SLAVE;
验证从库状态:
sql
SHOW SLAVE STATUS\G
确保 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes。
2.4 验证主从同步
在主库创建测试数据:
sql
CREATE DATABASE school;
USE school;
CREATE TABLE student (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED,
gender ENUM('M','F') DEFAULT 'M'
);
INSERT INTO student (name, age) VALUES ('路飞', 20);
在从库查询:
sql
USE school;
SELECT * FROM student;
+----+--------+------+--------+
| id | name | age | gender |
+----+--------+------+--------+
| 10 | 路飞 | 20 | M |
+----+--------+------+--------+
同步成功。
三、读写分离(Amoeba)
3.1 读写分离核心原理
- 写操作(INSERT/UPDATE/DELETE) → 主库
- 读操作(SELECT) → 从库(多个从库可负载均衡)
Amoeba 是一款基于 Java 的 MySQL 代理中间件,对应用透明,自动识别 SQL 类型并路由。
架构流程:
text
应用程序 → Amoeba (端口 8066) → 判断 SQL 类型
├── 写操作 → 主库池 (writePool)
└── 读操作 → 从库池 (readPool) → 轮询/权重负载均衡
3.2 Amoeba 环境准备
节点规划:
| 主机名 | IP | 软件 |
|---|---|---|
| amoeba | 192.168.108.110 | Amoeba + JDK 1.6 |
| mysql-client | 192.168.108.111 | MySQL 客户端(测试用) |
安装 JDK 1.6:
bash
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin # 按提示输入 yes
mv jdk1.6.0_14 /usr/local/jdk1.6
配置环境变量 (/etc/profile):
bash
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
bash
source /etc/profile
安装 Amoeba:
bash
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
测试安装:
bash
/usr/local/amoeba/bin/amoeba
# 显示 start|stop 说明成功
3.3 后端 MySQL 授权
在三台 MySQL 节点上,创建 Amoeba 访问账号:
sql
GRANT ALL ON *.* TO 'test'@'192.168.108.%' IDENTIFIED BY '123.com';
3.4 配置 Amoeba
配置文件位置
conf/amoeba.xml------ 代理核心配置(端口、认证、路由规则)conf/dbServers.xml------ 后端 MySQL 节点定义
配置 amoeba.xml
xml
<!-- 30行附近:客户端连接 Amoeba 的账号密码 -->
<property name="user">amoeba</property>
<property name="password">123456</property>
<!-- 115-120行:读写池配置 -->
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
配置 dbServers.xml
修改连接信息(23-30行):
xml
<!-- 注意:MySQL 5.7 默认无 test 库,需改为 mysql -->
<property name="schema">mysql</property>
<property name="user">test</property>
<property name="password">123.com</property>
定义后端服务器(45-60行):
xml
<dbServer name="master" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.108.101</property>
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.108.102</property>
</factoryConfig>
</dbServer>
<dbServer name="slave2" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.108.103</property>
</factoryConfig>
</dbServer>
定义从库池(负载均衡):
xml
<dbServer name="slaves" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<property name="loadbalance">1</property> <!-- 1=轮询 -->
<property name="poolNames">slave1,slave2</property>
</poolConfig>
</dbServer>
3.5 启动 Amoeba
bash
/usr/local/amoeba/bin/amoeba start &
检查监听端口:
bash
netstat -anpt | grep java
# 8066 端口应处于 LISTEN 状态
3.6 验证读写分离
测试客户端连接
bash
# 安装 mysql 客户端
yum install -y mysql
# 连接 Amoeba(端口 8066)
mysql -u amoeba -p123456 -h 192.168.108.110 -P 8066
数据同步测试
-
在主库写入数据:
sql
INSERT INTO student (name, age) VALUES ('鸣人', 20); -
在客户端通过 Amoeba 读取,会发现数据已同步。
读写分离验证(轮询效果)
在从库 slave01 和 slave02 上分别停止 SQL 线程,手动插入不同数据:
sql
-- slave01
STOP SLAVE;
INSERT INTO student (name, age) VALUES ('卡卡西', 31);
-- slave02
STOP SLAVE;
INSERT INTO student (name, age) VALUES ('卡卡西', 32);
然后在客户端通过 Amoeba 多次执行 SELECT * FROM student,会发现结果在 31 和 32 之间交替出现,证明读请求被轮询分发到两个从库。
注意:停止从库复制仅用于验证读写分离,实际生产中从库应保持与主库同步。
第二部分:MHA 高可用架构
四、MHA 概述
MHA(Master High Availability) 是专为 MySQL 主从复制设计的高可用工具,解决主库单点故障问题,实现自动故障转移(0--30 秒),兼顾数据一致性。
4.1 MHA 核心概念
- 组成:MHA Manager(管理节点)+ MHA Node(数据节点)
- 目标:自动故障切换,数据不丢,对业务透明
- 场景:自动故障转移(Failover)和主从切换(Switchover)
4.2 MHA 工作流程
- Manager 定期检测主库健康状态
- 检测到主库宕机后,自动选择数据最接近的新主库(候选主库)
- 尝试从宕机主库保存二进制日志
- 将差异的中继日志应用到新主库
- 重新配置其他从库指向新主库
- 完成 VIP 漂移(可选)
五、MHA 环境搭建
5.1 环境规划
| 主机名 | IP 地址 | 角色 | 说明 |
|---|---|---|---|
| mysql-master | 192.168.108.131 | 主库 | 安装 node 组件 |
| mysql-slave01 | 192.168.108.132 | 从库1(候选主库) | 安装 node 组件 |
| mysql-slave02 | 192.168.108.133 | 从库2 | 安装 node 组件 |
| mha | 192.168.108.130 | MHA Manager | 安装 node + manager 组件 |
注意:操作系统为 CentOS 7,MHA 版本 0.57。
5.2 处理 UUID 冲突(克隆节点)
bash
# 在三台 MySQL 节点上分别执行
systemctl stop mysqld
rm -f /usr/local/mysql/data/auto.cnf
systemctl start mysqld
5.3 配置主从复制(一主两从)
主库配置 (/etc/my.cnf):
ini
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true
从库配置(slave01 和 slave02):
ini
[mysqld]
server-id = 2 # slave02 为 3
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
建立主从(从库上执行):
sql
CHANGE MASTER TO
MASTER_HOST='192.168.108.131',
MASTER_USER='myslave',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=1897; -- 根据主库 SHOW MASTER STATUS 实际值
START SLAVE;
设置从库只读:
sql
SET GLOBAL read_only = 1;
5.4 安装 MHA 软件
所有节点安装依赖
bash
yum install epel-release --nogpgcheck -y
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch \
perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
所有节点安装 MHA Node
bash
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
Manager 节点安装 MHA Manager(需先装 Node)
bash
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install
安装后 /usr/local/bin 下生成的主要工具:
| 工具 | 作用 |
|---|---|
masterha_check_ssh |
检查 SSH 配置 |
masterha_check_repl |
检查 MySQL 复制状况 |
masterha_manager |
启动 Manager |
masterha_check_status |
检查运行状态 |
masterha_master_switch |
手动切换 |
masterha_stop |
关闭 Manager |
5.5 配置无密码 SSH 认证
在 Manager 节点配置到所有 MySQL 节点的免密登录:
bash
ssh-keygen -t rsa
ssh-copy-id 192.168.108.131
ssh-copy-id 192.168.108.132
ssh-copy-id 192.168.108.133
在 MySQL 节点之间也配置免密(用于中继日志获取):
bash
# mysql-master
ssh-keygen -t rsa
ssh-copy-id 192.168.108.132
ssh-copy-id 192.168.108.133
# mysql-slave01
ssh-keygen -t rsa
ssh-copy-id 192.168.108.131
ssh-copy-id 192.168.108.133
# mysql-slave02
ssh-keygen -t rsa
ssh-copy-id 192.168.108.131
ssh-copy-id 192.168.108.132
5.6 配置 MHA
复制故障切换脚本
bash
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin/
编辑 /usr/local/bin/master_ip_failover,修改以下变量(删除原有内容,替换为下方):
perl
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my ($command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port,
$new_master_host, $new_master_ip, $new_master_port);
my $vip = '192.168.108.200'; # 虚拟 IP
my $brdc = '192.168.108.255'; # 广播地址
my $ifdev = 'ens33'; # 网卡接口
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
exit &main();
sub main {
if ($command eq "stop" || $command eq "stopssh") {
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) { warn "Got Error: $@\n"; exit $exit_code; }
exit $exit_code;
}
elsif ($command eq "start") {
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) { warn $@; exit $exit_code; }
exit $exit_code;
}
elsif ($command eq "status") {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print "Usage: master_ip_failover --command=start|stop|stopssh|status ...\n";
}
创建 MHA 配置文件
bash
mkdir /etc/masterha
cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
编辑 /etc/masterha/app1.cnf,替换为以下内容:
ini
[server default]
manager_log=/var/log/masterha/app1_manager_log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.108.132 -s 192.168.108.133
ssh_user=root
user=mha
[server1]
hostname=192.168.108.131
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.108.132
port=3306
[server3]
hostname=192.168.108.133
port=3306
参数说明:
candidate_master=1:将该从库设为候选主库,故障时优先提升check_repl_delay=0:忽略复制延迟,确保候选主库总是被选中(即使有延迟)secondary_check_script:二次检查脚本,防止误切换
5.7 验证配置
检查 SSH 免密:
bash
masterha_check_ssh --conf=/etc/masterha/app1.cnf
检查主从复制状态:
bash
masterha_check_repl --conf=/etc/masterha/app1.cnf
5.8 启动 MHA Manager
bash
nohup masterha_manager --conf=/etc/masterha/app1.cnf \
--remove_dead_master_conf \
--ignore_last_failover \
</dev/null > /var/log/masterha/app1/manager.log 2>&1 &
参数说明:
--remove_dead_master_conf:切换后自动移除宕机主库的配置--ignore_last_failover:忽略上次切换记录,允许立即再次切换(测试用)
查看运行状态:
bash
masterha_check_status --conf=/etc/masterha/app1.cnf
5.9 手动绑定 VIP(首次需在主库执行)
bash
/sbin/ifconfig ens33:1 192.168.108.200/24
六、故障模拟与自动切换
6.1 模拟主库宕机
在 mysql-master 节点上:
bash
systemctl stop mysql
# 或 kill -9 mysqld 进程模拟崩溃
6.2 观察 MHA 切换日志
在 MHA Manager 节点:
bash
tail -f /var/log/masterha/app1/manager.log
日志会显示:
- 检测到主库无响应
- 执行二次检查
- 选择新主库(此处为 slave01,因设置了
candidate_master=1) - 保存原主库的 binlog
- 应用差异日志到新主库
- 将 VIP 漂移到新主库
- 重新配置其他从库指向新主库
6.3 验证切换结果
新主库(原 slave01)上:
bash
ifconfig | grep 192.168.108.200 # VIP 已漂移
mysql -e "SHOW SLAVE STATUS\G" # 已不再是从库
新从库(原 slave02)上:
sql
SHOW SLAVE STATUS\G
-- Master_Host 应变为 192.168.108.132(新主库)
配置文件变化 :/etc/masterha/app1.cnf 中的 [server1] 段已被自动删除。
七、故障修复与恢复
7.1 修复原主库
bash
systemctl start mysql
7.2 将原主库作为新主库的从库加入
查看新主库的 binlog 位置:
sql
SHOW MASTER STATUS;
+---------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------+------------------+
| master-bin.000002 | 2210 | | |
+---------------------+----------+--------------+------------------+
在原主库上执行:
sql
CHANGE MASTER TO
MASTER_HOST='192.168.108.132',
MASTER_USER='myslave',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='master-bin.000002',
MASTER_LOG_POS=2210;
START SLAVE;
7.3 恢复 MHA 配置文件
手动编辑 /etc/masterha/app1.cnf,重新添加原主库的 [server1] 段(可按需调整顺序)。
7.4 重启 MHA Manager
bash
masterha_stop --conf=/etc/masterha/app1.cnf
nohup masterha_manager ... & # 重新启动
第三部分:LAMP + WordPress 项目实战
八、LAMP 架构说明
LAMP 是一组常用于运行动态网站的软件首字母缩写:
- L:Linux 操作系统
- A:Apache(Web 服务器)
- M:MySQL(数据库)
- P:PHP(服务器端脚本语言)
九、WordPress 博客项目部署
9.1 环境规划
| 主机名 | IP 地址 | 作用 | 软件 |
|---|---|---|---|
| web | 192.168.108.100 | Web 服务器 + PHP 解析 | Apache, PHP |
| mysql | 192.168.108.101 | 数据库服务器 | MySQL |
9.2 安装 Apache 和 PHP
在 web 节点:
bash
yum -y install httpd php php-mysqlnd php-json php-gd php-xml php-mbstring php-zip
# 查看 PHP 版本
php -v
# PHP 7.2.24
# 关闭防火墙
systemctl disable --now firewalld
# 启动 Apache
systemctl start httpd
浏览器访问 http://192.168.108.100,看到 Apache 测试页即成功。
9.3 下载并配置 WordPress
bash
cd /var/www/html/
wget https://cn.wordpress.org/latest-zh_CN.zip
unzip latest-zh_CN.zip
chown -R apache.apache wordpress/
9.4 配置数据库(mysql 节点)
sql
CREATE DATABASE wordpress;
CREATE USER 'wordpresser'@'192.168.108.%' IDENTIFIED BY '123456';
GRANT ALL ON wordpress.* TO 'wordpresser'@'192.168.108.%';
FLUSH PRIVILEGES;
9.5 配置虚拟主机(web 节点)
bash
vim /etc/httpd/conf.d/blog.ggd.cloud.conf
apache
<VirtualHost *:80>
ServerName blog.ggd.cloud
DocumentRoot "/var/www/html/wordpress"
<Directory "/var/www/html/wordpress">
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
重启 Apache:
bash
systemctl restart httpd
9.6 客户端解析(在物理机或测试机)
编辑 C:\Windows\System32\drivers\etc\hosts,添加:
text
192.168.108.100 blog.ggd.cloud
9.7 浏览器安装 WordPress
访问 http://blog.ggd.cloud,按提示填写数据库连接信息:
- 数据库名:
wordpress - 用户名:
wordpresser - 密码:
123456 - 数据库主机:
192.168.108.101(mysql 节点 IP) - 表前缀:
wp_(默认)
后续填写站点标题、管理员账号即可完成安装。
第四部分:MySQL 5.7 源码安装(扩展)
十、源码编译安装 MySQL 5.7
适用于 CentOS 7 环境,需要手动编译,适合定制化需求。
10.1 环境准备
bash
hostnamectl set-hostname mysql01
systemctl disable firewalld --now
setenforce 0
10.2 安装依赖
bash
yum -y install ncurses ncurses-devel bison cmake gcc gcc-c++
10.3 创建运行用户
bash
useradd -s /sbin/nologin mysql
10.4 解压源码与 boost 库
bash
tar zxvf mysql-5.7.17.tar.gz -C /opt/
tar zxvf boost_1_59_0.tar.gz -C /usr/local/
mv /usr/local/boost_1_59_0 /usr/local/boost
10.5 CMake 配置
bash
cd /opt/mysql-5.7.17/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=/usr/local/boost \
-DWITH_SYSTEMD=1
注意 :如果 cmake 出错,删除源码目录中的
CMakeCache.txt后重新执行。
10.6 编译与安装
bash
make && make install
10.7 配置权限与文件
bash
chown -R mysql.mysql /usr/local/mysql/
编辑 /etc/my.cnf:
ini
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
bash
chown mysql:mysql /etc/my.cnf
10.8 配置环境变量
bash
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
source /etc/profile
10.9 初始化数据库
bash
cd /usr/local/mysql/
bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
10.10 配置 systemd 服务
bash
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl start mysqld
systemctl enable mysqld
10.11 设置 root 密码
bash
mysqladmin -uroot password "huawei"
10.12 授权远程登录
sql
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'huawei' WITH GRANT OPTION;
FLUSH PRIVILEGES;
第五部分:总结与知识点一览表
十一、核心知识点汇总
| 类别 | 技术点 | 关键命令/配置 |
|---|---|---|
| 主从复制 | binlog, I/O 线程, SQL 线程 | CHANGE MASTER TO, START SLAVE |
| 状态检查 | SHOW SLAVE STATUS\G |
|
| 读写分离 | Amoeba 代理 | 监听 8066,路由 SQL |
| 后端池配置 | writePool, readPool, loadbalance=1 |
|
| MHA 高可用 | Manager + Node | masterha_manager |
| 故障切换脚本 | master_ip_failover(VIP 管理) |
|
| 配置参数 | candidate_master, check_repl_delay |
|
| 切换验证 | VIP 漂移,从库重新指向 | |
| LAMP + WordPress | Apache + PHP + MySQL | 虚拟主机配置,WordPress 安装 |
| 源码安装 | MySQL 5.7 编译 | cmake, make, make install |
十二、常见故障排查速查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
Slave_IO_Running: No |
网络不通、账号错误、binlog 位置错误 | 检查 Last_IO_Error,重新 CHANGE MASTER TO |
Slave_SQL_Running: No |
主键冲突、SQL 语法错误 | STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; |
| MHA 不切换 | ssh 免密失败、复制状态异常 | 重新检查 masterha_check_ssh 和 masterha_check_repl |
| VIP 不漂移 | 脚本权限、网卡名错误 | 检查脚本中 ifdev 变量,手动执行 ifconfig 测试 |
| WordPress 连接数据库失败 | 数据库主机 IP 错误、用户未授权 | 确认 MySQL 授权中 'wordpresser'@'192.168.108.%' |
| Amoeba 连接 MySQL 失败 | 后端授权不足 | GRANT ALL ON *.* TO 'test'@'192.168.108.%' |
本合刊至此结束,涵盖从基础复制到企业级高可用架构的完整实践链路。建议动手搭建环境,逐一验证各环节,以加深理解。后续可根据需要深入学习:MySQL 优化、分库分表、分布式数据库等进阶内容。