什么是mysql的主从复制?
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
Mysql复制原理
原理:
(1)Master
服务器将数据的改变记录二进制Binlog
日志,当Master
上的数据发生改变时,则将其改变写入二进制日志中;
(2)Slave
服务器会在一定时间间隔内对Master
二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread
请求Master
二进制事件
(3)同时主节点为每个I/O
线程启动一个Dump
线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread
和SQLThread
将进入睡眠状态,等待下一次被唤醒。
Undo log与Redo log原理分析
Undo log原理
Undo log
是把所有没有COMMIT
的事务回滚到事务开始前的状态,系统崩溃时,可能有些事务还没有COMMIT
,在系统恢复时,这些没有COMMIT
的事务就需要借助Undo log
来进行回滚。
使用Undo log
时要求:
1 | 1、记录修改日志时(Redo log),(T,x,v)中v为x修改前的值,这样才能借助这条日志来回滚; |
使用Undo log
时事务执行顺序
1 | 1、记录START T |
使用Undo log
进行宕机回滚
1 | 1、扫描日志,找出所有已经START,还没有COMMIT的事务。 |
如果数据库访问很多,日志量也会很大,宕机恢复时,回滚的工作量也就很大,为了加快回滚,可以通过Checkpoint
机制来加速回滚。
1 | 从后往前,扫描Undo log |
使用Undo log
,在写COMMIT
日志时,要求Redo log
以及事务的所有修改都必须已经持久化,这种做法通常很影响性能。
Redo log原理
Redo log
是指在回放日志的时候把已经COMMIT
的事务重做一遍,对于没有COMMIT
的事务按照abort
处理,不进行任何操作。
使用Redo log
时,要求:
1 | 1、记录Redo log时,(T,x,v)中的v必须是x修改后的值,否则不能通过Redo log来恢复已经COMMIT的事务。 |
使用Redo log
时事务执行顺序
1 | 1、记录START T |
使用Redo log
重做事务
1 | 1、扫描日志,找到所有已经COMMIT的事务; |
根据Checkpoint
来加速恢复
1 | 从后往前,扫描Redo log |
与Undo log
类似,在使用时对持久化以及事务操作顺序的要求都比较高,可以将两者结合起来使用,在恢复时,对于已经COMMIT
的事务使用Redo log
进行重做,对于没有COMMIT
的事务,使用Undo log
进行回滚。Redo/Undo log
结合起来使用时,要求同时记录操作修改前和修改后的值,如(T,x,v,w),v为x修改前的值,w为x修改后的值,具体操作顺序为:
1 | 1. 记录START T |
实战操作
上一篇已经对于Binlog
设置做了一些初步的实践:http://www.cyblogs.com/mysql-binlogshe-zhi/,还是在本地利用Docker
的方式启动了2个容器。
1 | ➜ ~ docker ps -a |
一个是docker-mysql-master
作为主节点,docker-mysql-slave
作为从节点,最后实现一个主从同步的功能。
Master节点
设置slave_account账户
1 | [root@c738746e9623 bin]# ./mysql -u root -p |
Master节点的my.cnf
1 | [root@c738746e9623 bin]# cat /etc/my.cnf |
查看master节点状态
1 | mysql> show master status; |
Slave节点
Slave节点my.cnf
1 | [root@662e8531eb70 mysql]#cat /etc/my.cnf |
配置与主节点同步的配置
1 | mysql> change master to master_host='172.17.0.2',master_user='slave_account',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=120; |
启动同步
1 | mysql> start slave; |
查看一个主从同步的状态
1 | mysql> show slave status\G; |
Master节点写数据
1 | CREATE TABLE `person_01` ( |
Slave节点查数据
1 | show tables; |
这样子就做好了最简单的主从同步。主从同步只是最基础的高可用架构。
参考地址
如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。