首先主服务器与从服务器都需先安装MySQL, 安装可以参考这篇文章: 源码安装MySQL8.0
主从复制主要用途
- 读写分离, 降低单机的压力
- 数据实时备份, 当系统中某个节点故障, 可以方便故障切换
- 高可用
- 架构扩展
主从复制原理
- 主节点将所有写的操作( insert, create, delete, update, alter)记录到binlog中, 当从节点连接主节点, 主节点会创建一个log dump线程, 用于发送binlog内容
- 从节点将主节点的binlog日志复制到中继日志, 即当从节点运行 ‘start slave’, 会立即创建一个IO线程, 向主节点发送一个更新binlog请求, 以及接收主节点binlog dump内容, 保存到中继日志
- 从节点中的SQL线程, 读取中继日志内容, 解析成具体的操作并执行, 最终保持主从数据一致
主从复制配置
配置之前, 确保从数据库的数据与主数据库的数据一致
主服务器配置
- 开启binlog日志, 可以在配置文件中添加
log-bin=mysql-bin; server-id=1; // 可以用IP的最后一段来设置, 但是各个节点不要重复
配置其他参数:
replicate-do-table: 只复制指定的表, 在从库使用
replicate-ignore-table: 不复制指定的表, 在从库使用
replicate-do-db: 只复制指定的库, 在从库使用
replicate-ignore-db: 不复制指定的库, 在从库使用
# 进入目录
cd /etc/my.cnf
# 添加配置
log-bin=mysql-bin
server-id=117
可以进入mysql查看是否开启
show variables like '%log_bin%';
- 创建一个用于主从复制的用户并授权, 一主一从或一主多从
--选中数据库
use mysql;
--创建用户, 可以指定允许访问的IP或者所有%
create user 'username1'@'IP1' identified with mysql_native_password by 'password1'; --用户1, 对应从节点1
create user 'username2'@'IP2' identified with mysql_native_password by 'password2'; --用户2, 对应从节点2
--授权从节点的所有数据库的所有表
grant replication slave on *.* to 'username1'@'IP1'; --从节点1
grant replication slave on *.* to 'username2'@'IP2'; --从节点2
--刷新权限
flush privileges;
从服务器配置
- 建议开启binlog
- 配置
change master to master_host='主服务器IP',master_port=端口号,master_user='username',master_password='password',master_log_file='指定主服务器的binlog日志',master_log_pos=日志节点;
# 登录主服务器mysql后, 并查看主服务器的binlog日志, 获取日志和日志节点
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 156 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
# 执行, 从节点1, 用户名及密码与前面设置的用户对应
change master to master_host='主服务器IP',master_port=3306,master_user='username1',master_password='password1',master_log_file='mysql-bin.000001',master_log_pos=156;
# 执行, 从节点2, 用户名及密码与前面设置的用户对应
change master to master_host='主服务器IP',master_port=3306,master_user='username2',master_password='password2',master_log_file='mysql-bin.000001',master_log_pos=156;
- 开启
start slave;
- 查看状态
show slave status\G;
# 代表配置成功
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
若出现Slave_IO_Running:Connecting ; Slave_SQL_Running:Yes
查看错误信息:
Last_IO_Error: error connecting to master ‘slave@120.55.85.68:3306’ - retry-time: 60 retries: 1 message: Host ‘39.100.119.51’ is not allowed to connect to this MySQL server
权限有误, 需重新创建用户并授权