精读笔记 · 第24章 数据库代理与集群管理
大约 5 分钟
精读笔记 · 第24章 数据库代理与集群管理
精读整理自 RHCE9 随堂讲义(原文字版 25 页)|同名视频约 15 节(第02套) 关联知识文件:
分章笔记/02-Oracle(RAC/DataGuard 对照)、05-认证考试要点
一、集群目的与类型
- 目的:负载均衡(高并发)、高可用 HA(服务可用性)、远程灾备(数据有效性)。
- 拓扑类型:M(单主)、M-S(一主一从)、M-S-S(一主多从)、M-M(双主)、M-M-S-S(双主双从)。
- 复制三线程原理(重点):① 主库把数据更改(DDL/DML/DCL)写 Binary Log;② 从库 I/O 线程把主库 binlog 拉到自己的 Relay Log(中继日志);③ 从库 SQL 线程读取中继日志事件并重放到本地。
- 环境注意:多台库要各自全新安装(不要克隆已装库——server-id/auto 值会重复);配好 hosts/DNS 域名解析、关防火墙。
二、一主一从 M-S(传统 binlog+position 方式)
- 主(master1):建库建表造数据;my.cnf 加
log_bin+server-id=1→ 重启。 - 主:建复制账号
create user 'rep'@'10.18.41.%' identified by ...→grant replication slave, replication client on *.* to 'rep'@'10.18.41.%'; - 主:全备
mysqldump -p密码 --all-databases --single-transaction --master-data=2 --flush-logs > 备份.sql→scp到从机;备份文件里能看到CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000002', MASTER_LOG_POS=154;(同步起点)。 - 从(master2):my.cnf 只需
server-id=2(从机可不开 binlog)→ 重启;先测试mysql -h master1 -urep -p密码连通。 - 从:手动导入主库数据
set sql_log_bin=0;+source /tmp/备份.sql;(同步数据不写自己 binlog)。 - 从:指定主库
change master to master_host='master1', master_user='rep', master_password='...', master_log_file='localhost-bin.000002', master_log_pos=154; start slave;→show slave status\G重点看 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes(双 Yes)。- 回主库插数据,从库查询验证同步。
三、M-S(GTID 方式,自动定位)
- 主从 my.cnf 都加:
gtid_mode=ON+enforce_gtid_consistency=1(master-data 的 position 不再需要)。 - change master 简化(少两行):
change master to master_host=..., master_user='rep', master_password='...', master_auto_position=1;→start slave;→ 双 Yes 验证。 - 重置从库再配置:
stop slave; reset master;后重新 CHANGE MASTER。
四、双主双从 M-M-S-S(高可用写入)
- 结构:从1←主1↔主2→从2;主1/主2 互为主从(主1 挂后主2 自动升级)。
- 各机 my.cnf 关键项:
- 主1/主2:
log-bin=/var/lib/mysql/binlog、server-id=1/3、binlog-do-db=mydb2(只复制业务库)、binlog-ignore-db=mysql/information_schema、binlog_format=statement|row|mixed、expire_logs_days=7、slave_skip_errors=1062、log-slave-updates(从角色写入也记 binlog)、auto-increment-increment=2(步长)+auto-increment-offset=1/2(防止双主自增主键冲突:1、3、5… 与 2、4、6…)。 - 从1/从2:
server-id=2/4、relay-log=mysql-relay。
- 主1/主2:
- 建同步账号:
CREATE USER ... IDENTIFIED WITH mysql_native_password BY ...(主1主2都建 repl_user 与 slave_sync_user)→GRANT REPLICATION SLAVE ON *.* TO ...。 - 配置四条复制链:主1→从1、主2→从2、主1↔主2(互指,各自
show master status取文件与 position → 对方change master to ...→ start slave)。 - 验证:任一台建 mydb2/表/插数据 → 四台库全部同步出现(经 log-slave-updates 链式传递)。
- 排错:双 Yes 不是两个 YES 时,
stop slave; reset master;后重新 CHANGE MASTER。
五、数据库代理(Mycat 1.6,读写分离中间件)
- 代理功能:读写分离(M-S/M-M-S-S)、负载均衡(Galera 等)、分片(数据分库分表自动路由聚合)。
- 常见产品:MySQL Proxy(官方)、Atlas(360)、Mycat(阿里系,企业常用 1.6)、Cobar/Amoeba(早期)。
- 环境:mycat 服务器 + Java JDK(
tar xf jdk... -C /usr/local+ 软链/usr/local/java+/etc/profile设 JAVA_HOME/PATH)。 - 部署:下载 Mycat-server-1.6 解压到 /usr/local;改
conf/server.xml(前端用户);改conf/schema.xml(后端数据源映射,先备份)。 - schema.xml 结构(倒着读):
dataHost(writeHost=写主 1 + 其 readHost=从 1;writeHost=主 2 + readHost=从 2)→dataNode(指向 dataHost 与物理库名)→schema name="mydb2"(逻辑库)。 - 关键属性:
balance(0=不分、1=readHost+备用 writeHost 参与读均衡、2=读写随机、3=只往 readHost 分读);writeType(0=全写第一个 writeHost、挂了切第二个;1=随机写);switchType(-1 不自动切、1 按心跳/延时切、2 依据show slave status的 Seconds_Behind_Master 判断,配slaveThreshold秒阈值防读到旧数据)。 - MySQL8 兼容:mycatproxy 用户要改
IDENTIFIED WITH mysql_native_password+PASSWORD EXPIRE NEVER;my.cnf 加max_connect_errors=1000;必要时mysqladmin flush-hosts。 - 启动验证:
/usr/local/mycat/bin/mycat start(启动失败多为 schema.xml 语法错)→netstat -anpt | grep java看到 8066(业务端口)/9066(管理端口)→ 客户端mysql -hmycat -uroot -p123456 -P8066→show databases;看到虚拟库 mydb2 → 后端主库建真实库表后,经 mycat 读写均落到集群并可查回。
六、命令速查表
| 场景 | 命令 |
|---|---|
| 主库配置 | my.cnf log_bin、server-id=N、可选 gtid_mode=ON、enforce_gtid_consistency=1 |
| 复制账号 | grant replication slave, replication client on *.* to 'rep'@'网段' |
| 备份带位置 | mysqldump --all-databases --single-transaction --master-data=2 --flush-logs |
| 从库指定主 | change master to master_host=..., master_user=..., master_password=..., master_log_file=..., master_log_pos=... |
| GTID 指定主 | 同上 + master_auto_position=1 |
| 启动/查看 | start slave;、stop slave;、show slave status\G(IO/SQL 双 Yes) |
| 双主防冲突 | auto-increment-increment=2 + auto-increment-offset=1/2 |
| Mycat 启动 | /usr/local/mycat/bin/mycat start、netstat -anpt | grep java |
| 经代理连接 | mysql -hmycat -uroot -p密码 -P8066 |
七、易错点
- 复制三线程:主库 binlog → 从库 IO 线程拉取写 relay log → 从库 SQL 线程回放;双 Yes 才正常。
- 从机初始化顺序不能乱:先导入全备(source 前
set sql_log_bin=0),再 change master,再 start slave。 - change master 的 file/pos 必须与备份文件一致,否则同步起点错乱(GTID 模式用 auto_position 免去手工)。
- 双主双从必须配自增步长+错开 offset,否则双写主键冲突;
log-slave-updates保证“从转主”后链路不断。 - Mycat schema.xml 三层倒读:schema→dataNode→dataHost;writeHost/readHost 成对嵌套。
- Mycat1.6 连 MySQL8 需把代理账号改回 mysql_native_password 认证,否则连不上。
八、实操清单
两台机做传统 M-S(含备份 position 指定)→ 重置后做 GTID 版对比 → 四台机搭 M-M-S-S 并验证任意机建表四机同步 → 加 Mycat 做读写分离(jdk+mycat+schema.xml+账号+8066 连接测试)。
九、本章自测
- 复制三线程流程?2. Slave_IO_Running/SQL_Running 什么含义?3. GTID 与 position 方式差异?4. M-M 为什么配 auto-increment-increment=2?5. log-slave-updates 作用?6. Mycat 的 writeHost/readHost 与 balance 各取值含义?7. Mycat 连 MySQL8 的兼容处理?
