主从复制
当单台 MYSQL 服务器无法满足当前网站流量时的优化方案。需要搭建 mysql 集群技术。
复制的功能和特点
- 数据分布
- 负载均衡(读)
- 备份
- 高可用和故障切换(容错)
复制方式
- 主–从复制
- 主–主复制
- 半同步复制:半同步复制在提交过程中增加了一个延迟:当提交事物时,在客户端接收到查询结束反馈前必须保证二进制日志已经传输到至少一台备库上。主库将事物提交到磁盘之后会增加一些延迟。同样的也增加了客户端的延迟。主库和从库必须同时配置半同步插件才可以生效,否则还是异步的方式。
复制原理
Mysql中有一个bin日志(二进制日志),这个日志会记录所以修改了数据库的语句(如insert、update等等)
主从复制的原理就是把主服务器上的bin日志复制到从服务器上执行一遍,这样从服务器上的数据和主服务器上的数据就相同了。
工作流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8QYrOdXP-1618299549567)(https://note.youdao.com/yws/api/personal/file/1F30F471676544BE93BB97B8F862EC63?method=download&shareKey=ff79d23b7263131175d0875c6dd143b1)]
- 主节点必须启用二进制日志,记录任何修改了数据库数据的事件。
- 从节点开启一个线程(I/O Thread)把自己扮演成 mysql 的客户端,通过 mysql 协议,请求主节点的二进制日志文件中的事件
- 主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
- 从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具体哪一个二进制日志文件内部的哪一个位置(主节点中的二进制文件会有多个,在后面详细讲解)。
- 从节点启动另外一个线程(sql Thread ),把 Relay log 中的事件读取出来,并在本地再执行一次。
主从复制
主要涉及三个线程:binlog 线程、Dump线程 、I/O 线程和 SQL 线程。
- binlog 线程 :负责将主服务器上的数据更改写入二进制日志(Binary log)中。
- I/O 线程 :负责从主服务器上读取二进制日志,并写入从服务器的中继日志(Relay log)。
- SQL 线程 :负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中重放(Replay)。
- Dump线程:主服务器中,负责为每个从服务器 的 I/O 线程启动一个 dump 线程,用于向从节点发送二进制事件。
配置要求
主节点:
- 启用二进制日志。
- 为当前节点设置一个全局唯一的server_id。
- 创建有复制权限的用户账号 REPLIACTION SLAVE ,REPLIATION CLIENT。
从节点:
- 启动中继日志。
- 为当前节点设置一个全局唯一的server_id。
- 使用有复制权限的用户账号连接至主节点,并启动复制线程。
注:如果从节点需要作为其他节点的主节点时,是需要开启二进制日志文件的。这种情况叫做级联复制。如果只是作为从节点,则不需要创建二进制文件
读写分离
主服务器处理写操作以及实时性要求比较高的读操作,而从服务器处理读操作。
读写分离能提高性能的原因在于:
- 主从服务器负责各自的读和写,极大程度缓解了锁的争用;
- 从服务器可以使用 MyISAM,提升查询性能以及节约系统开销;
- 增加冗余,提高可用性。
读写分离常用代理方式来实现,代理服务器接收应用层传来的读写请求,然后决定转发到哪个服务器。