MySQL主从复制的原理及配置方法
1. 原理
MySQL主从复制是一种数据备份和数据读写分离的解决方案,能够实现多台MySQL服务器之间的数据同步。主从复制主要由一个主库和多个从库组成,主库将数据更新操作通过二进制日志(Binary Log)记录下来,从库通过读取主库的二进制日志实现数据的同步。
主从复制的原理大致如下:
- 首先需要在主库上启用二进制日志(Binary Log),将所有的数据更新操作记录到二进制日志中。
- 当从库连接到主库时,主库会将所有的二进制日志文件名和位置信息传给从库。
- 从库通过解析主库传输过来的二进制日志,将其中的更新操作复制到本地的数据文件中。
- 当主库有数据更新时,从库会从主库获取最新的二进制日志并解析,然后将其中的更新操作更新到本地的数据文件中。
主从复制的好处在于,从库可以通过读取本地的数据文件提供读操作,降低主库的压力,提高MySQL服务器的性能和可用性。
2. 配置方法
下面我们来讲解如何在MySQL服务器上配置主从复制。假设主库的IP地址为192.168.1.10,从库的IP地址为192.168.1.20。
2.1. 在主库上配置
- 编辑主库的my.cnf配置文件,启用二进制日志
在my.cnf中加入以下内容:
[mysqld]
log-bin=mysql-bin
server-id=1
其中log-bin设置二进制日志的文件名前缀,server-id设置服务器唯一ID号,该号在整个复制环境中必须唯一。
- 重启MySQL服务器,使配置生效
systemctl restart mysql
- 创建用户名为repl的用户并授权复制操作
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.20' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;
其中repl为用户名,192.168.1.20为从库IP地址,password为密码,需要替换成实际值。
- 查看主库状态并记录Binary Log文件名和位置信息
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | | |
+------------------+----------+--------------+------------------+
记录File和Position的值,这两个值在从库连接主库时会用到。
2.2. 在从库上配置
- 编辑从库的my.cnf配置文件
在my.cnf中加入以下内容:
[mysqld]
server-id=2
其中server-id为服务器唯一ID号,该号在整个复制环境中必须唯一。
- 重启MySQL服务器,使配置生效
systemctl restart mysql
- 连接主库并设置主从同步
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.10',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=107;
mysql> START SLAVE;
其中MASTER_HOST为主库IP地址,MASTER_USER为主库授权的帐号名,MASTER_PASSWORD为密码,MASTER_LOG_FILE和MASTER_LOG_POS为从主库记录的二进制日志文件名和位置,需要从主库记录的结果中复制。
- 查看从库状态
mysql> SHOW SLAVE STATUS\G
如果看到如下信息,说明主从同步已经成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3. 示范
以下是两个示例,演示了在Ubuntu 18.04系统上配置MySQL主从复制。
示例一:在主机上配置
- 安装MySQL服务器(假设已经安装了)
sudo apt-get install mysql-server
- 启用二进制日志
在/etc/mysql/mysql.conf.d/mysqld.cnf文件中添加以下内容:
[mysqld]
log-bin=mysql-bin
server-id=1
- 重启MySQL服务器
sudo systemctl restart mysql
- 授权复制操作
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.20' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;
- 查看主库状态并记录Binary Log文件名和位置信息
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | | |
+------------------+----------+--------------+------------------+
- 配置防火墙开放3306端口
sudo ufw allow 3306/tcp
示例二:在从机上配置
- 安装MySQL服务器
sudo apt-get install mysql-server
- 加入冗杂的配置main.cnf
sudo vim /etc/mysql/mysql.conf.d/main.cnf
- 添加server-id=2
[mysqld]
server-id=2
- 重启MySQL服务器
sudo systemctl restart mysql
- 连接主库并设置主从同步
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.10',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=107;
mysql> START SLAVE;
- 查看从库状态
mysql> SHOW SLAVE STATUS\G
如果看到如下信息,说明主从同步已经成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL主从复制的原理及配置方法(比较详细) - Python技术站