MySQL Replication
主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。
复制是异步的 从站不需要永久连接以接收来自主站的更新。
MySQL中主从复制的有点包括:
-
横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可以在一个或多个从设备上进行。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。
-
数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。
-
分析 - 可以在主服务器上创建实时数据,而信息分析可以在从服务器上进行,而不会影响主服务器的性能。
-
远程数据分发 - 您可以使用复制为远程站点创建数据的本地副本,而无需永久访问主服务器。
配置步骤
1.在主服务器上,必须启用二进制日志记录并配置唯一的服务器ID,需要重启服务器
编辑主服务器的配置文件
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
一般主服务器上id为1
注意:
如果省略server-id
(或者将其显示设置为0),主服务器将
拒绝来自从服务器的任何连接。
创建日志目录并且赋予MySQL权限
mkdir /var/log/mysql
chown mysql.mysql -R /var/log/mysql
重启服务
systemctl restart mysqld
为了在使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性,
您应该在master my.cnf
文件中使用以下配置项:
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
需要确保主服务器上skip_networking
选项处于OFF
关闭状态,OFF
是默认值。
如果是启用的,则主站和从站无法通信,并且复制失败
show variables like '%skip_networking%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| skip_networking | OFF |
+-----------------+-------+
1 row in set (0.00 sec)
2.我们需要创建一个专门用于复制数据的用户
每当主服务器内容更新时,从服务器需要使用主服务器的MySQL用户名和密码连接到主站
在主服务器上创建一个用户,并且赋予该用户复制的权限
create user 'repl'@'%';
greate replication slave on *.* to 'repl'@'%' identified by 'QFedu123!';
3.在从服务器上使用刚才的用户进行测试连接
mysql -urepl -P'QFedu123!' -h主服务器ip
主服务器中有数据
- 如果在启动复制之前有现有数据需要与从属设备同步,请保持客户端正常运行,以便锁定保持不变。这可以防止进行任何进一步的更改,以便复制到从站的数据与主站同步。
1.在主服务器中导出现有的数据
mysqldump -u用户名 -p密码 --all-databases --master-data=1 > dbdump.db
这里的用户是主服务器的用户
如果不使用 --master-data
参数,则需要手动锁定单独会话中的所有表。
2.从主服务器中使用 scp 或 rsync 等工具,把备份出来的数据传输到从服务器中。
在主服务中执行如下命令
scp dbdump.db root@mysql-slave1:/root/
3.配置从服务器,并重启
在从服务器 上编辑其配置文件 my.cnf 并添加如下内容:
[mysqld]
server-id=2
4.导入数据到从服务器,并配置连接到主服务器的相关信息
登录到从服务器上,执行如下操作
/*导入数据*/
mysql> source /root/fulldb.dump
或者
mysqldump -u -p
在从服务器配置连接到主服务器的相关信息
mysql> CHANGE MASTER TO
MASTER_HOST='mysql-master1', -- 主服务器的主机名(也可以是 IP)
MASTER_USER='repl', -- 连接到主服务器的用户
MASTER_PASSWORD='123'; == 到主服务器的密码
使用mysqldump -u -p 这条命令恢复数据库时
需要添加
master_log_file='mysql-bin.000001'
master_log_pos=111
这两条配置 需要在备份的库中查找到
5.启动从服务器的复制线程
mysql> start slave;
Query OK, 0 rows affected (0.09 sec)
检查是否配置成功
show slave status\G;
网友评论