MySQL 5.6 主从部署
主从同步分析参考: MySQL 主从同步分析 | 云原生基站
因为我们环境 MySQL 是 5.6 的,主从同步还是会有延迟的,5.7 会解决这问题
1 环境规划
| ip | 端口 | 名称 | ||
|---|---|---|---|---|
| 10.1.1.1 | 5.6.51 | 3306 | Master | /var/lib/mysql/binlog/ |
| 10.1.1.2 | 5.6.51 | 3306 | Slave1 | /var/lib/mysql/binlog/ |
| 10.1.1.3 | 5.6.51 | 3306 | Slave2 | /var/lib/mysql/binlog/ |
2 搭建 mysql
5.6yum源:rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm5.7yum源:rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm这里注意下,mysql 版本
- 5.6: I/O thread 同步并发线程是以库级别并行的,也就是说两个库可以并行两个线程,三个库可以并行三个线程,但是注意一个库不要开启并行,影响性能.而且就算开启也会存在 slave 同步延迟
- 5.7: I/O thread 同步并发线程可以做到按行级别并行,线程数量一般与 CPU 数量一样,可以做到 slave 节点无延迟,slave_parallel_workers=4,slave_parallel_type=LOGICAL_CLOCK,这两个参数一定要加上
2.1 安装 mysql
sudo yum clean allsudo yum -y install mysql-community-server2.2 添加 binlog 目录
mkdir -p /var/lib/mysql/binlog/sudo chown mysql:mysql /var/lib/mysql/binlog/2.3 修改配置文件
配置特殊说明:如果 MySQL5.7 启用并行复制(MTS)却没开启事务 ID(GTID)需要开启 slave_preserve_commit_order 来保证从库与主库提交的顺序完全一致。但是使用 xtrabackup 备份可能会造成备份锁
Master1:(因为要切换主从,配置基本跟 slave 配置一样)
# 服务配置serveMTSr-id=1 # 要唯一slave_preserve_commit_orderlog_slave_updates=1 # 开启此参数才可以切换masterreport-host=10.1.132.124 # 返回给master的地址report_port=3306 # 返回给master的端口slave_net_timeout=8 # 与master握手超时时间master_info_repository=table # 主节点信息写表里relay_log_info_repository=table # slave信息写表里
# binlog配置binlog_row_image=FULLbinlog_format=ROW # binlog日志格式log-bin=/var/lib/mysql/binlog/mysql-bin.log # binlog日志文件expire_logs_days=30 # binlog过期清理时间max_binlog_size=300m # binlog每个日志文件大小binlog_cache_size=12m # binlog缓存大小max_binlog_cache_size=512m # 最大binlog缓存大小
# 事务ID(GTID)配置gtid-mode = ONenforce-gtid-consistency = ON
# 主从并行复制(MTS)配置relay_log_recovery=1 # 数据库启动后立即启动自动relay log恢复slave_parallel_workers=4 # 设置I/O thread同步并发线程数量,一般与CPU数量一样innodb_flush_log_at_trx_commit=2 # 每次事务提交的时候会把log buffer刷到文件系统中去,但并不会立即刷写到磁盘。sync_binlog=20 # 当每进行20次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。slave_parallel_type=LOGICAL_CLOCK # 设置并行同步粒度,库级别或者表级别,MySQL5.7支持的参数2.3.1 mysql slave 配置文件
Slave1,Slave2 上执行
Slvae2:(因为要切换主从,配置基本跟 master 配置一样)
# 服务配置serveMTSr-id=2 # 要唯一slave_preserve_commit_orderlog_slave_updates=1 # 开启此参数才可以切换masterreport-host=10.1.132.124 # 返回给master的地址report_port=3306 # 返回给master的端口slave_net_timeout=8 # 与master握手超时时间master_info_repository=table # 主节点信息写表里relay_log_info_repository=table # slave信息写表里
# binlog配置binlog_row_image=FULLbinlog_format=ROW # binlog日志格式log-bin=/var/lib/mysql/binlog/mysql-bin.log # binlog日志文件expire_logs_days=30 # binlog过期清理时间max_binlog_size=300m # binlog每个日志文件大小binlog_cache_size=12m # binlog缓存大小max_binlog_cache_size=512m # 最大binlog缓存大小# 事务ID(GTID)配置gtid-mode = ONenforce-gtid-consistency = ON
# 主从并行复制(MTS)配置relay_log_recovery=1 # 数据库启动后立即启动自动relay log恢复slave_parallel_workers=4 # 设置I/O thread同步并发线程数量,一般与CPU数量一样innodb_flush_log_at_trx_commit=2 # 每次事务提交的时候会把log buffer刷到文件系统中去,但并不会立即刷写到磁盘。sync_binlog=20 # 当每进行20次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。slave_parallel_type=LOGICAL_CLOCK # 设置并行同步粒度,库级别或者表级别,MySQL5.7支持的参数Slvae3:(不需要主从切换)
# 服务配置serveMTSr-id=3 # 要唯一slave_preserve_commit_orderlog_slave_updates=1 # 开启此参数才可以切换masterreport-host=10.1.132.124 # 返回给master的地址report_port=3306 # 返回给master的端口slave_net_timeout=8 # 与master握手超时时间master_info_repository=table # 主节点信息写表里relay_log_info_repository=table # slave信息写表里
# binlog配置binlog_row_image=FULLbinlog_format=ROW # binlog日志格式log-bin=/var/lib/mysql/binlog/mysql-bin.log # binlog日志文件expire_logs_days=30 # binlog过期清理时间max_binlog_size=300m # binlog每个日志文件大小binlog_cache_size=12m # binlog缓存大小max_binlog_cache_size=512m # 最大binlog缓存大小启动
sudo systemctl start mysqld初始化账户
mysql_secure_installation2.4 添加账户
所有mysql实例添加的账户CREATE USER 'orchestrator'@'%' IDENTIFIED BY 'qweasd';GRANT SUPER, PROCESS, REPLICATION SLAVE, REPLICATION CLIENT, RELOAD ON *.* TO 'orchestrator'@'%';GRANT SELECT ON meta.* TO 'orchestrator'@'%'; #如果需要伪GTID,需要导入sqlGRANT SELECT ON mysql.slave_master_info TO 'orchestrator'@'%'; # 允许读取mysql主从信息,提前设置把信息存到表里GRANT DROP ON _pseudo_gtid_.* to 'orchestrator'@'%'; #增加更新伪gtid权限刷新权限FLUSH PRIVILEGES;2.5 创建拓扑信息库
DROP TABLE IF EXISTS `cluster`;CREATE TABLE `cluster` ( `anchor` tinyint(4) NOT NULL, `cluster_name` varchar(128) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL DEFAULT '', `cluster_domain` varchar(128) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL DEFAULT '', `data_center` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY (`anchor`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;INSERT INTO `cluster` VALUES (1, 'test', 'cc', 'TJ'); # 根据需求自定义SET FOREIGN_KEY_CHECKS = 1;
DROP TABLE IF EXISTS `heartbeat_view`;CREATE TABLE `heartbeat_view` ( `absolute_lag` int(11) NULL DEFAULT NULL) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Compact;INSERT INTO `heartbeat_view` VALUES (1);SET FOREIGN_KEY_CHECKS = 1;如果开启伪 GTID 导入下面的 sql
https://github.com/caixin-ops/ops/blob/master/Orchestrator/pseudo-gtid.sql
source pseudo-gtid.sql
配置主从
查看 master 节点 binlog 文件名与位置
SHOW MASTER STATUS;+------------------+-----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+-----------+--------------+------------------+-------------------+| mysql-bin.000005 | `2309 ` | | | |+------------------+-----------+--------------+------------------+-------------------+两个 slave 节点执行:
CHANGE MASTER TO MASTER_HOST='10.1.1.1',MASTER_USER='orchestrator',MASTER_PASSWORD='qweasd',MASTER_PORT=3306,MASTER_LOG_FILE='mmysql-bin.000005',MASTER_LOG_POS=2309;如果使用 gtid:CHANGE MASTER TO MASTER_HOST='10.1.1.1',MASTER_USER='orchestrator',MASTER_PASSWORD='qweasd',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;
查看状态:
SHOW SLAVE STATUS\G3 添加新的 slave 节点
3.1 获取最新备份
因为每个公司项目环境不一样,此步骤掠过,备份与工具安装参考如何优雅的备份 MySQL 数据 | 云原生基站
3.1.1 解压
保证目录干净:
rm -rf /var/lib/mysql/*
cat bak_20220106.xb | xbstream -x -v -C /var/lib/mysql
innobackupex --decompress --remove-original /var/lib/mysql/
ll /var/lib/mysql
-rw-r--r-- 1 xopsadmin wheel 481 Dec 30 14:05 backup-my.cnf-rw-r--r-- 1 xopsadmin wheel 76M Dec 30 14:05 ibdata1drwxr-x--- 2 xopsadmin wheel 170 Dec 30 14:05 metadrwxr-x--- 2 xopsadmin wheel 4.0K Dec 30 14:05 mysqldrwxr-x--- 2 xopsadmin wheel 4.0K Dec 30 14:05 performance_schemadrwxr-x--- 2 xopsadmin wheel 52 Dec 30 14:05 test-rw-r--r-- 1 xopsadmin wheel 25 Dec 30 14:05 xtrabackup_binlog_info-rw-r----- 1 xopsadmin wheel 141 Dec 30 13:58 xtrabackup_checkpoints-rw-r--r-- 1 xopsadmin wheel 544 Dec 30 14:05 xtrabackup_info-rw-r--r-- 1 xopsadmin wheel 2.5K Dec 30 14:05 xtrabackup_logfile3.1.2 配置新实例
cat /etc/my.cnf
server-id=1 # 要唯一binlog_row_image=FULLbinlog_format=ROW # binlog日志格式log-bin=/var/lib/mysql/binlog/mysql-bin.log # binlog日志文件max_binlog_size = 300m # binlog每个日志文件大小binlog_cache_size = 12m # binlog缓存大小max_binlog_cache_size = 512m # 最大binlog缓存大小slave_sql_verify_checksum=0log_slave_updates= 2 # 开启此参数才可以切换masterreport-host=10.1.133.211 # 返回给master的地址report_port=3306 # 返回给master的端口slave_net_timeout=8 # 与master握手超时时间master_info_repository=table # 主节点信息写表里relay_log_info_repository=table # slave信息写表里relay_log_recovery=1 # 数据库启动后立即启动自动relay log恢复slave_parallel_workers=4 # 设置I/O thread同步并发线程数量,一般与CPU数量一样innodb_flush_log_at_trx_commit=2 # 每次事务提交的时候会把log buffer刷到文件系统中去,但并不会立即刷写到磁盘。sync_binlog=20 # 当每进行20次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。\#slave_parallel_type=LOGICAL_CLOCK # 设置并行同步粒度,库级别或者表级别,MySQL5.7支持的参数恢复数据
innobackupex --defaults-file=/etc/my.cnf --apply-log /var/lib/mysql/
看到211230 14:06:41 completed OK!说明还原成功
修改权限
mkdir -p /var/lib/mysql/binlog/
chown mysql:mysql -R /var/lib/mysql/
启动
指定配置文件与数据库目录
mysqld_safe --defaults-extra-file=/etc/my.cnf --datadir=/root/test/ --user=mysql
systemctl start mysqld
3.2 查看 binlog 位置
如果备份的是 master:
cat xtrabackup_binlog_info
mysql-bin.000009 79303734
如果备份的是 salve
cat xtrabackup_slave_info
CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000011’, MASTER_LOG_POS=55452573;
如果开启伪 gtid 执行:
mysql -uroot -pqweasd -e "DROP TABLE meta.pseudo_gtid_status;"
mysql -uroot -pqweasd -e "SOURCE pseudo-gtid.sql"
新 slave 节点执行:
CHANGE MASTER TO MASTER_HOST='10.1.1.1',MASTER_USER='orchestrator',MASTER_PASSWORD='qweasd',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=55452573;如果使用 gtid:
CHANGE MASTER TO MASTER_HOST='10.1.1.1',MASTER_USER='orchestrator',MASTER_PASSWORD='qweasd',MASTER_PORT=3306,`MASTER_AUTO_POSITION=1;启动主从同步
mysql -uroot -pqweasd -e "START SLAVE;"
查看状态:
SHOW SLAVE STATUS\G
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!