centos7.x下,使用宝塔进行主从复制的原理和实践

操作原理:

一、主库配置
1.修改 MySQL 配置文件
# 编辑主库配置文件(路径根据实际系统可能不同)
vim /etc/my.cnf
 
# 添加以下配置
[mysqld]
server-id = 1                 # 唯一 ID,主库设置为 1
log-bin = mysql-bin           # 启用二进制日志
binlog_format = ROW           # 推荐使用 ROW 模式
expire_logs_days = 7          # 日志保留天数
max_binlog_size = 100M        # 单个日志文件大小
skip_name_resolve = ON        # 跳过域名解析(可选)

重启 MySQL 服务
systemctl restart mysqld

2.登录到主服务器:
mysql -u root -p

3.创建复制用户
CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;

4.查看主服务器的状态
SHOW MASTER STATUS;

二、从库配置
1.修改 MySQL 配置文件
# 编辑从库配置文件
vim /etc/my.cnf
 
# 添加以下配置
[mysqld]
server-id = 2                 # 唯一 ID,不能与主库相同
relay-log = mysql-relay-bin   # 启用中继日志
read_only = ON                # 从库只读(可选,确保数据安全)

重启 MySQL 服务
systemctl restart mysqld

2.登录到主服务器:
mysql -u root -p

3.配置从服务器
CHANGE MASTER TO
  MASTER_HOST='主服务器IP',
  MASTER_USER='replicator',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='记录的File值',
  MASTER_LOG_POS=记录的Position值;
  
4.启动复制
START SLAVE;

5.检查从服务器的状态
SHOW SLAVE STATUS\G
查看 Slave_IO_Running 和 Slave_SQL_Running 是否都为 Yes,这表示复制正在正常运行。
关键字段检查:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0(表示无延迟)
若出现错误,检查 Last_IO_Error 或 Last_SQL_Error。

三、如何遇到错误后,排查解决后,重新执行
STOP SLAVE;
RESET SLAVE ALL;
-- 重新执行
CHANGE MASTER TO ……
START SLAVE;
SHOW SLAVE STATUS;

四、同步主库现有数据(可选)

1.主库导出数据
# 使用 mysqldump 导出数据(自动记录 binlog 位置)
mysqldump -uroot -p --all-databases --master-data=1 > /tmp/master_dump.sql(或使用宝塔备份功能)
2.将备份文件导入从库
# 复制文件到从库
scp /tmp/master_dump.sql root@slave_ip:/tmp/
# 从库导入数据
mysql -uroot -p < /tmp/master_dump.sql

---------------------------------------------------------------------------------
实战案例

一、主库配置(10.0.12.16)
1.配置防火墙,主库服务器对从库IP开放3306端口
2.宝塔修改配置文件,保存后重启
server-id = 1                 # 唯一 ID,主库设置为 1,默认不需要修改
3.phpMyadmin执行SQL,创建复制用户(10.0.16.16为从库IP)
CREATE USER 'replicator'@'10.0.16.16' IDENTIFIED BY 'abcc1b259f57f8b9111';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'10.0.16.16';
FLUSH PRIVILEGES;
4.记录的File值,记录的Position值
SHOW MASTER STATUS;

二、从库配置(10.0.16.16)
1.宝塔修改配置文件,保存后重启
server-id = 2                 # 唯一 ID,不能与主库相同
relay-log = mysql-relay-bin   # 启用中继日志
2.phpMyadmin执行SQL
CHANGE MASTER TO
  MASTER_HOST='10.0.12.16',
  MASTER_USER='replicator',
  MASTER_PASSWORD='abcc1b259f57f8b9111',
  MASTER_LOG_FILE='mysql-bin.000005',
  MASTER_LOG_POS=3629;
3.启动复制
START SLAVE;
4.查看从服务器的状态
SHOW SLAVE STATUS;

三、同步主库现有数据
1.从有数据的服务器上使用宝塔进行备份
2.上传备份数据到新的主服务器
scp /www/backup/database/mysql/hz_fw_game/hz_fw_game_2025-05-13_20-43-58_mysql_data_vmdYO.sql.zip root@xxx.229.73.57:/root/
3.在新的主服务器上执行数据库导入操作,此时从数据库就正常同步了,可以做到主从一致

### 如何在宝塔面板中设置MySQL读写分离 #### 配置环境准备 为了实现 MySQL 的读写分离,在 Linux CentOS7 上需预先完成如下组件的部署:Mysql5.7、php8.2 Nginx1.22.1。确保主服务器 IP 地址为 192.168.128.132 已经正确配置并运行着上述软件版本[^1]。 #### 主从复制基础架构搭建 创建用于连接到 Slave 数据库实例所需的账户,这一步骤对于建立安全可靠的主从关系至关重要。通过此操作可以赋予特定权限给 slave 账号以便于数据同步过程顺利进行: ```sql CREATE USER 'replication_user'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%'; FLUSH PRIVILEGES; ``` #### 设置主数据库(Master) 编辑 Master 数据库配置文件 `/etc/my.cnf` 或者位于其他路径下的相应配置文件来增加或调整以下参数以支持二进制日志记录功能以及唯一 server-id 属性: ```ini server-id = 1 log-bin = master-log binlog-format = ROW expire_logs_days = 10 max_binlog_size = 100M ``` 重启 MySQL 服务使更改生效,并锁定所有表防止任何更新活动干扰初始状态的数据传输工作;随后执行 `SHOW MASTER STATUS;` 获取当前 binlog 文件名及其位置信息作为后续配置依据之一。 #### 设置从数据库(Slave) 同样地修改 Slave 端 my.cnf 中关于 server-id 参数设定确保其不同于Master端且在整个集群内保持独一无二性之后启动Slave进程加载之前获得的位置信息继续追加增量变更直至两者达到一致的状态为止。具体命令如下所示: ```sql CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replication_user', MASTER_PASSWORD='your_password', MASTER_LOG_FILE='recorded_log_file_name', MASTER_LOG_POS=recorded_log_position; START SLAVE; ``` 确认 Slave 正常运作可通过查询 `SHOW SLAVE STATUS\G;` 来验证 I/O Thread 及 SQL Thread 是否均为 Yes 表明成功建立了稳定有效的主从链路。 #### 实现读写分离逻辑处理机制 借助 ThinkPHP6 框架内置的支持多数据库连接特性轻松达成业务层面上针对不同类型的SQL语句自动路由至相应的节点上去执行从而实现了负载均衡的效果同时也提高了系统的高可用性性能表现。下面是一个简单的例子展示怎样定义多个数据源并在模型类里指定默认使用的DSN链接字符串: ```php // application/database.php return [ // 默认使用数据库连接配置 'default' => env('database.default', 'mysql_master'), // 多个数据库配置 'connections' => [ 'mysql_master' => [ // ... 主库配置 ... ], 'mysql_slave_1' => [ // ... 从库配置 ... ] ], // 更多功能选项... ]; // Model 类中的使用方式 namespace app\model; use think\Model; class Example extends Model { protected $connection = 'mysql_slave_1'; // 使用从库 } ``` 当应用程序访问该模型时,默认情况下会向名为 "mysql_slave_1" 的从属数据库发出请求,而涉及到了 INSERT/UPDATE/DELETE 这样的写入型事务则应该被导向指向了 "mysql_master" 的主控方去完成实际的操作流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值