主从复制可以使MySQL数据库主服务器的主数据库,复制到一个或多个MySQL从服务器从数据库,默认情况下,复制异步; 根据配置,可以复制数据库中的所有数据库,选定的数据库或甚至选定的表。横向扩展解决方案:在多个从库之间扩展负载以提高性能。在这种环境中,所有写入和更新在主库上进行。但是,读取可能发生在一个或多个从库上。该模型可以提高写入的性能(由于主库专用于更新),同时在多个从库上读取,可以大大提高读取速度。
1.软件环境(docker环境中)
Mysql版本:MySQL 9.6
Master-Server : 192.168.1.5
Slave-Server : 192.168.1.6
2. Master-Server 配置
停止MySQL服务,修改 my.cnf
配置 Master 以使用基于二进制日志文件位置的复制,必须启用二进制日志记录并建立唯一的服务器ID,否则则无法进行主从复制。
要确保配置前,两台服务器的数据是一样的
[mysqld] # 服务器唯一ID(主服务器) server-id=1 # 启用二进制日志 log-bin=mysql-bin # GTID 模式(默认启用,MySQL 9.1) gtid-mode=ON enforce-gtid-consistency=ON # 字符集 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # 时区 default-time-zone='+08:00' # 跳过域名解析 skip-name-resolve # 禁止本地文件导入 local_infile=0 # 连接配置 max_connections=500 max_connect_errors=1000 wait_timeout=28800 # 缓冲区(根据 NAS 内存调整) innodb_buffer_pool_size=1G innodb_redo_log_capacity=128M innodb_log_buffer_size=64M innodb_flush_log_at_trx_commit=2 # 日志 log_error=/var/log/mysql/error.log slow_query_log=1 slow_query_log_file=/var/log/mysql/slow.log long_query_time=2 # ========== 二进制日志配置 ========== # MySQL 9.x 使用 binlog_expire_logs_seconds(替代 expire_logs_days) # 604800 秒 = 7 天 binlog_expire_logs_seconds=604800 [client] default-character-set=utf8mb4
3.重起Mysql,进入Mysql命令行创建复制用的远程账号
# 进入 MySQL docker exec -it mysql mysql -uroot -p # 或 mysql -uroot -p -- 创建复制用户 CREATE USER 'repl'@'%' IDENTIFIED BY '你的密码'; -- 授予复制权限 GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; -- 授予连接权限(可选) GRANT REPLICATION CLIENT ON *.* TO 'repl'@'%'; -- 刷新权限 FLUSH PRIVILEGES; -- 查看主服务器状态 SHOW BINARY LOG STATUS;

4.从服务器(Slave)配置,编辑 MySQL 配置文件
[mysqld] # 服务器唯一ID(从服务器,必须与主服务器不同) server-id=2 # 中继日志 relay-log=relay-bin relay-log-index=relay-bin.index # 只读模式(推荐) # read-only=1 # 超级用户也可以只读(可选,更严格) # super-read-only=1 # GTID 模式 gtid-mode=ON enforce-gtid-consistency=ON # 并行复制(提高性能) # slave_parallel_type=LOGICAL_CLOCK # slave_parallel_workers=4 # 禁用中继日志自动清除(可选) # relay_log_purge=OFF # 字符集 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # 时区 default-time-zone='+08:00' # 跳过域名解析 skip-name-resolve # 禁止本地文件导入 local_infile=0 # 连接配置 max_connections=500 max_connect_errors=1000 wait_timeout=28800 # 缓冲区(根据 NAS 内存调整) innodb_buffer_pool_size=1G innodb_redo_log_capacity=128M innodb_log_buffer_size=64M innodb_flush_log_at_trx_commit=2 # 日志 log_error=/var/log/mysql/error.log slow_query_log=1 slow_query_log_file=/var/log/mysql/slow.log long_query_time=2 # ========== 二进制日志配置 ========== # MySQL 9.x 使用 binlog_expire_logs_seconds(替代 expire_logs_days) # 604800 秒 = 7 天 binlog_expire_logs_seconds=604800 [client] default-character-set=utf8mb4
5.重启 MySQL,进入到Mysql命令行配置主从复制
-- 停止从服务器(如果有旧的配置) STOP REPLICA; -- 重置从服务器(清空旧的复制信息) RESET REPLICA ALL; -- ===== 方案A:使用 GTID 方式(推荐,MySQL 9.1) ===== CHANGE REPLICATION SOURCE TO SOURCE_HOST='主服务器IP', -- 例如:192.168.1.10 SOURCE_USER='repl', -- 复制用户 SOURCE_PASSWORD='你的密码', -- 复制用户密码 SOURCE_PORT=3306, -- MySQL 端口 SOURCE_AUTO_POSITION=1; -- 自动使用 GTID -- ===== 方案B:使用传统方式(如果需要精确控制) =====-- 先在主服务器执行 SHOW BINARY LOG STATUS;获取 File(SOURCE_LOG_FILE) 和 Position(SOURCE_LOG_POS) CHANGE REPLICATION SOURCE TO SOURCE_HOST='主服务器IP', SOURCE_USER='repl', SOURCE_PASSWORD='你的密码', SOURCE_PORT=3306, SOURCE_LOG_FILE='mysql-bin.000001', -- 从主服务器获取 SOURCE_LOG_POS=156; -- 从主服务器获取 -- 启动从服务器 START REPLICA; -- 查看从服务器状态 SHOW REPLICA STATUS\G;

本文为 小风原创文章,转载无需和我联系,但请注明来自 小风博客www.hotxf.com