一, MySQL 主从复制的工作原理
1,MySQL 支持的复制类型
1) 基于语句的复制. 在服务器上执行 sql 语句, 在从服务器上执行同样的语句, MySQL 默认采用基于语句的复制, 执行效率高.
2) 基于行的复制. 把改变的内容复制过去, 而不是把命令在从服务器上执行一遍.
3) 混合类型的复制. 默认采用基于语句的复制, 一旦发现基于语句无法精确复制时, 就会采用基于行的复制.
2, 复制的工作过程
1) 在每个事务更新数据完成之前, master 在二进制日志记录这些改变. 写入二进制日志完成后, master 通知存储引擎提交事务.
2)Slave 将 master 的 binary log 复制到其中继日志. 首先 slave 开始一个工作线程 (I/O),I/O 线程在 master 上打开一个普通的连接, 然后开始 binlog dump process.binlog dump process 从 master 的二进制日志中读取事件, 如果已经跟上 master, 它会睡眠并等待 master 产生新的事件, I/O 线程将这些事件写入中继日志.
3)Sql slave thread(sql 从线程) 处理该过程的最后一步, sql 线程从中继日志读取事件, 并重放其中的事件而更新 slave 数据, 使其与 master 中的数据一致, 只要该线程与 I/O 线程保持一致, 中继日志通常会位于 os 缓存中, 所以中继日志的开销很小.
3,MySQL 读写分离原理
读写分离就是在主服务器上修改, 数据会同步到从服务器, 从服务器只能提供读取数据, 不能写入, 实现备份的同时也实现了数据库性能的优化, 以及提升了服务器安全.
目前较为常见的 MySQL 读写分离分为两种
1) 基于程序代码内部实现
在代码中根据 select ,insert 进行路由分类, 这类方法也是目前生产环境下应用最广泛的. 优点是性能较好, 因为程序在代码中实现, 不需要增加额外的硬件开支, 缺点是需要开发人员来实现, 运维人员无从下手.
2) 基于中间代理层实现
代理一般介于应用服务器和数据库服务器之间, 代理数据库服务器接收到应用服务器的请求后根据判断后转发到, 后端数据库, 有以下代表性的程序.
(1)MySQL_proxy.MySQL_proxy 是 MySQL 的一个开源项目, 通过其自带的 lua 脚本进行 sql 判断.
(2)Atlas. 是由 Qihoo 360, web 平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目. 它是在 MySQL-proxy 0.8.2 版本的基础上, 对其进行了优化, 增加了一些新的功能特性. 360 内部使用 Atlas 运行的 MySQL 业务, 每天承载的读写请求数达几十亿条. 支持事物以及存储过程.
(3)Amoeba. 由阿里巴巴集团在职员工陈思儒使用序 java 语言进行开发, 阿里巴巴集团将其用户生产环境下, 但是他并不支持事物以及存数过程.
不是所有的应用都能够在基于程序代码中实现读写分离, 像一些大型的 java 应用, 如果在程序代码中实现读写分离对代码的改动就较大, 所以, 像这种应用一般会考虑使用代理层来实现.
Ubuntu 16.04 下实现 MySQL 主从复制 http://www.linuxidc.com/Linux/2017-08/146624.htm
MySQL 5.6.26 主从复制报错 1050 http://www.linuxidc.com/Linux/2017-08/146203.htm
MySQL 主从复制详解 http://www.linuxidc.com/Linux/2017-10/147550.htm
MySQL 基于 GTID 主从复制之半同步复制 https://www.linuxidc.com/Linux/2018-05/152175tm
MySQL 主从复制读写分离与高可用配置 https://www.linuxidc.com/Linux/2018-04/151893.htm
mysql-proxy 代理加 MySQL 主从实现读写分离 https://www.linuxidc.com/Linux/2017-05/143453.htm
CentOS 7.4 下 MySQL+Amoeba 实现主从同步读写分离 https://www.linuxidc.com/Linux/2018-03/151648.htm
来源: http://www.linuxidc.com/Linux/2018-05/152252.htm