Files
hzdyjs/docs/部署文档/生产环境双机部署方案/基于现有my.cnf的主从配置指南.md
T
2025-11-27 00:02:01 +08:00

9.8 KiB
Raw Blame History

基于现有my.cnf的MySQL主从复制配置指南

📋 当前配置状态

✅ 67机器(主库): /etc/my.cnf - 无主从配置,需要添加
✅ 68机器(从库): /etc/my.cnf - 无主从配置,需要添加
✅ 数据状态: 两个数据库的hzdyjs_xg表模型和数据已一致


🚀 快速配置(推荐使用脚本)

方法一:使用自动化脚本(最简单)

步骤1:在主库(67)执行

# 1. 进入部署脚本目录
cd /Users/wuzilong/work/00code/hzdyjs_xg/docs/部署文档/生产环境双机部署方案/部署脚本/

# 2. 赋予执行权限
chmod +x setup-mysql-replication.sh

# 3. 执行主库配置
./setup-mysql-replication.sh

脚本会自动完成:

  • ✅ 在/etc/my.cnf末尾添加主库配置
  • ✅ 重启MySQL服务
  • ✅ 创建复制用户repl@172.16.0.68
  • ✅ 显示SHOW MASTER STATUS输出

⚠️ 重要:记录输出的binlog信息

File: mysql-bin.000001
Position: 154

步骤2:在从库(68)执行

# 1. 进入部署脚本目录
cd /Users/wuzilong/work/00code/hzdyjs_xg/docs/部署文档/生产环境双机部署方案/部署脚本/

# 2. 执行从库配置
./setup-mysql-replication.sh

输入步骤1记录的binlog信息:

  • MASTER_LOG_FILE: 输入File值(如:mysql-bin.000001)
  • MASTER_LOG_POS: 输入Position值(如:154)

步骤3:验证配置

# 在从库执行
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master"

正常输出:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

🔧 手动配置方法(如果脚本执行失败)

主库(67)手动配置

1. 编辑主库配置文件

vi /etc/my.cnf

在文件末尾([client]段之后)添加以下配置:

# 主从复制配置
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = hzdyjs_xg
expire_logs_days = 7
max_binlog_size = 500M

# 性能优化配置(减少主从复制对主库性能影响)
# 使用性能优先方案,性能影响约1-2%
sync_binlog = 0
binlog_cache_size = 2M
max_binlog_cache_size = 512M

完整的67机器my.cnf应该是:

[mysqld]
# 基础配置
port = 3306
default-storage-engine = InnoDB
datadir = /iflytek/mysql/data/mysql
log-error=/iflytek/mysql/log/mysqld.log
socket = /var/lib/mysql/mysql.sock
pid-file = /var/run/mysqld/mysqld.pid
lower_case_table_names = 1
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 安全优化
ft_min_word_len = 1
symbolic-links=0

# 内存配置(核心)
innodb_buffer_pool_size = 20G
innodb_buffer_pool_instances = 16
innodb_buffer_pool_chunk_size = 128M
key_buffer_size = 256M

# I/O配置
innodb_log_file_size = 2G
innodb_log_buffer_size = 256M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000

# 连接配置
max_connections = 1000
thread_cache_size = 100
back_log = 500
table_open_cache = 4096
table_definition_cache = 4096

# 查询优化(关键调整)
join_buffer_size = 8M
sort_buffer_size = 8M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
tmp_table_size = 1G
max_heap_table_size = 1G

# 网络配置
max_allowed_packet = 256M
net_buffer_length = 16K
wait_timeout = 300
interactive_timeout = 300

# 高级配置
innodb_file_per_table = ON
innodb_thread_concurrency = 0
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_page_cleaners = 8

# 监控日志
slow_query_log = ON
slow_query_log_file = /iflytek/mysql/log/slow.log
long_query_time = 2
log_queries_not_using_indexes = OFF
performance_schema = ON

# 主从复制配置
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = hzdyjs_xg
expire_logs_days = 7
max_binlog_size = 500M

# 性能优化配置(减少主从复制对主库性能影响)
sync_binlog = 0
binlog_cache_size = 2M
max_binlog_cache_size = 512M

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

2. 重启MySQL服务

systemctl restart mysqld
sleep 5

# 检查MySQL是否正常启动
systemctl status mysqld

3. 创建复制用户

mysql -u root -p <<EOF
CREATE USER IF NOT EXISTS 'repl'@'172.16.0.68' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.16.0.68';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
EOF

⚠️ 重要:记录输出的File和Position值


从库(68)手动配置

1. 编辑从库配置文件

vi /etc/my.cnf

在文件末尾([client]段之后)添加以下配置:

# 主从复制配置
server-id = 2
relay-log = mysql-relay-bin
read-only = 1
replicate-do-db = hzdyjs_xg

完整的68机器my.cnf应该是:

[mysqld]
# 基础配置
port = 3306
default-storage-engine = InnoDB
datadir = /iflytek/mysql/data/mysql
log-error=/iflytek/mysql/log/mysqld.log
socket = /var/lib/mysql/mysql.sock
pid-file = /var/run/mysqld/mysqld.pid
lower_case_table_names = 1
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 安全优化
ft_min_word_len = 1
symbolic-links=0

# 内存配置(核心)
innodb_buffer_pool_size = 20G
innodb_buffer_pool_instances = 16
innodb_buffer_pool_chunk_size = 128M
key_buffer_size = 256M

# I/O配置
innodb_log_file_size = 2G
innodb_log_buffer_size = 256M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000

# 连接配置
max_connections = 1000
thread_cache_size = 100
back_log = 500
table_open_cache = 4096
table_definition_cache = 4096

# 查询优化(关键调整)
join_buffer_size = 8M
sort_buffer_size = 8M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
tmp_table_size = 1G
max_heap_table_size = 1G

# 网络配置
max_allowed_packet = 256M
net_buffer_length = 16K
wait_timeout = 300
interactive_timeout = 300

# 高级配置
innodb_file_per_table = ON
innodb_thread_concurrency = 0
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_page_cleaners = 8

# 监控日志
slow_query_log = ON
slow_query_log_file = /iflytek/mysql/log/slow.log
long_query_time = 2
log_queries_not_using_indexes = OFF
performance_schema = ON

# 主从复制配置
server-id = 2
relay-log = mysql-relay-bin
read-only = 1
replicate-do-db = hzdyjs_xg

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock

2. 重启MySQL服务

systemctl restart mysqld
sleep 5

# 检查MySQL是否正常启动
systemctl status mysqld

3. 配置主从复制

# 替换下面的值为主库的实际值(从主库SHOW MASTER STATUS获取)
MASTER_LOG_FILE="mysql-bin.000001"  # 替换为实际值
MASTER_LOG_POS=154                   # 替换为实际值

mysql -u root -p <<EOF
STOP SLAVE;
CHANGE MASTER TO
  MASTER_HOST='172.16.0.67',
  MASTER_USER='repl',
  MASTER_PASSWORD='Repl@123456',
  MASTER_LOG_FILE='$MASTER_LOG_FILE',
  MASTER_LOG_POS=$MASTER_LOG_POS;
START SLAVE;
SHOW SLAVE STATUS\G
EOF

✅ 配置验证

1. 检查从库复制状态

mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Master_Host|Master_Log_File"

正常输出:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Master_Host: 172.16.0.67
Master_Log_File: mysql-bin.000001

2. 测试数据同步

# 在主库插入测试数据
mysql -u root -p hzdyjs_xg -e "CREATE TABLE IF NOT EXISTS test_replication (id INT PRIMARY KEY, name VARCHAR(50));"
mysql -u root -p hzdyjs_xg -e "INSERT INTO test_replication VALUES (1, 'test');"

# 等待1秒
sleep 1

# 在从库查询测试数据
mysql -u root -p hzdyjs_xg -e "SELECT * FROM test_replication;"

# 如果能看到数据,说明主从复制正常
# 清理测试数据
mysql -u root -p hzdyjs_xg -e "DROP TABLE test_replication;"

⚠️ 配置说明

主库配置参数说明

  • server-id = 1: 主库唯一标识,必须与从库不同
  • log-bin = mysql-bin: 开启binlog,文件名前缀为mysql-bin
  • binlog-format = ROW: 使用ROW格式,数据一致性最好
  • binlog-do-db = hzdyjs_xg: 只记录hzdyjs_xg数据库的binlog
  • sync_binlog = 0: 性能优先,不强制同步binlog到磁盘(性能影响约1-2%)
  • expire_logs_days = 7: binlog保留7天

从库配置参数说明

  • server-id = 2: 从库唯一标识,必须与主库不同
  • relay-log = mysql-relay-bin: relay log文件名
  • read-only = 1: 从库只读,防止误操作
  • replicate-do-db = hzdyjs_xg: 只复制hzdyjs_xg数据库

🔍 常见问题排查

问题1:从库IO线程未运行

# 检查网络连通性
ping 172.16.0.67
telnet 172.16.0.67 3306

# 检查复制用户
mysql -u root -p -e "SELECT user, host FROM mysql.user WHERE user='repl';"

# 查看详细错误
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -i "last_io_error"

问题2:从库SQL线程未运行

# 查看具体错误
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -i "last_sql_error"

# 检查从库是否可写
mysql -u root -p -e "SHOW VARIABLES LIKE 'read_only';"

问题3:配置文件语法错误

# 检查配置文件语法
mysqld --help --verbose | head -1

# 查看MySQL错误日志
tail -f /iflytek/mysql/log/mysqld.log

📚 相关文档


📝 文档版本: v1.0
🔄 最后更新: 2025-01-27
✅ 适用场景: 数据已一致的67/68机器主从复制配置