MySQL主从复制原理及配置

        复制解决的基本问题是让一台服务器的数据与其他服务器保持同步,一台主库的数据可以同步到多台从库上,从库本身也可以被配置成另外一台服务器的主库。

        MySQL支持两种复制方式:基于行的复制和基于语句的复制。这两种方式都是通过在主库上记录二进制日志、在从库重放日志的方式来实现异步的数据复制。这意味着在同一时间点从库上的数据和主库可能不一致,并且无法保证主从之间的延迟。

一、复制原理

总的来说,复制有三个步骤:

  1. 在主库上把数据更改记录到二进制日志中
  2. 从库将主库上的二进制日志复制到自己的中继日志
  3. 从库读取中继日志,将其重放到从库数据库上

        第一步是在主库上记录二进制日志。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会根据事务提交的顺序来记录二进制日志,并非每条语句执行的顺序。在记录二进制日志后,主库再告诉存储引擎可以提交事务了。

        第二步从库将主库中的二进制日志复制到本地的中继日志中。首先,从库会启动一个I/O线程跟主库建立一个普通的客户端连接,然后主库启动一个特殊的二进制转储(binlog dump)线程来读取二进制日志中的事件,如果该线程追赶删了主库,会进入睡眠状态,直到主库发送信号量通知其有新的事件产生才会被唤醒,从库I/O线程会将接收到的时间记录到中继日志中。

        最后由从库的SQL线程从中继日志中读取事件并在从库执行,从而实现从库数据的更新。SQL线程执行的事件也可以通过配置选项来决定是否写入自己的二进制日志中。

二、配置复制

总的来说也分以下三步:

  1. 在每台服务器上创建复制账号
  2. 配置主库和从库
  3. 通知从库连接到主库,并从主库复制数据

MySQL会赋予一些特殊的权限给复制线程。在从库运行的I/O线程会建立一个到主库的tcp连接,这意味着在主库必须创建一个用户,并赋予其合适的权限。从库I/O线程以该用户名连接到主库并读取二进制日志。

#创建用户并授权
grant replication slave, replication client on *.* to 'username'@'host' identified by 'password';

账号添加后,还需要分别在主库和从库上作一些配置。首先在主库上需要打开二进制日志,并指定一个独一无二的服务器id(server id)。

log_bin   = mysql-bin
server_id = 1

这里的服务器id必须唯一,配置好后,重启MySQL。之后可通过show master status命令查看是否配置成功。

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

如上显示就表明配置成功,同时在从库也要作类似配置。

log_bin           = mysql-bin
server_id         = 2
relay_log         = /var/log/mysql/relay-bin
log_slave_updates = 1

这里事实上只有server_id是必须的,log_bin表明从库也打开二进制日志,relay_log指定中继日志的位置和命名,log_slave_updates表明允许从库将重放的事件也记录到自身的二进制日志中。配置好主从库后,开始启动:

mysql>stop slave;
//注意不要断开,从日志开头读。
mysql>change master to master_host='host',master_user='username',master_password='password',master_log_file='mysql-bin.000002',master_log_pos=0;  
//启动从服务器复制功能,如果slave是启动状态,需要先stop slave;
mysql>start slave;

之后通过show slave status可以看到I/O线程和SQL线程都已经开始运行,这样就大功告成!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值