主从复制的原理?
- salve从服务器在开启主从复制后,会创建两个线程:I/O线程和SQL线程。
- 从服务器的I/O线程,会尝试和主服务器建立连接,相应的主服务器会创建一个dump线程,来实现和I/O线程之间的交互。
- 从服务的I/O线程会告诉主服务器的dump线程从日志的哪个位置开始获取数据。
- 当master主服务器上的数据发生变化时,将SQL写入到二进制日志中。
- 在dump线程监测到二进制日志发生变化后,会从指定位置开始读取内容,并把它发送给从服务的I/O线程。
- 从服务器I/O线程接收到通知后,会将内容保存到中继日志中。
- 从服务器还有一个SQL线程,它通过轮询机制读取中继日志,把它解析成具体的SQL,然后写入到数据库中。
注:当读取完二进制日志后IO线程将进入睡眠状态,当主服务器有新的变化时会唤醒从服务器的IO线程。
SQL线程执行完一个事件后,中继日志中没有下一个事件可供读取时,SQL线程就会进入睡眠状态,等新的事件到来时,SQL线程会被再次唤醒。
MySQL支持哪些复制类型?
基于语句、基于行、混合复制
基于语句:主服务器执行的sql,从服务器再执行一遍;默认复制方式,效率高
基于行:将改变的内容复制过去
混合型:默认基于语句,一旦语句无法精准复制,就采用基于行的复制
主从复制是拉?还是推?
主从复制是推。
- 拉:是通过不停的循环访问主库的数据变更,消耗资源过多,效率低。
- 推:是主库主动告诉从库数据变化,只有变化时,才会反生交互,消耗资源少。
主从复制是如何推的?
当从库向主库申请数据变更时,需要指定文件位置,相应的主库会启动一个dump线程,将变更的记录一条条发送给从库,从库的IO线程接收数据并写入到中继日志中,SQL线程监控中继日志的变化,并解析成可执行的sql,执行完成后再写入到二进制日志中。
如何配置主从复制?
一.主服务器配置:
1.MySQL 5.6及以上版本。
2.修改主服务器的my.cnf或my.ini配置文件,添加以下参数:
server-id = 1 #唯一标识主服务器的ID
- 重启MySQL服务。
- 主服务器数据库执行sql命令
FLUSH TABLES WITH READ LOCK; # 锁定所有表,确保数据一致性
- 导出主库数据:
mysqldump -u [用户名] -p[密码] --master-data --single-transaction [数据库名] > dump.sql
- 解锁表:
UNLOCK TABLES;
二、从服务器配置:
- 修改从服务器的my.cnf或my.ini配置文件,添加以下参数:
server-id = 2 # 唯一标识从服务器的ID
- 重启MySQL服务。
- 登录到从服务器MySQL控制台,运行以下命令:
CHANGE MASTER TO MASTER_HOST='主服务器IP', MASTER_USER='用户名', MASTER_PASSWORD='密码', MASTER_LOG_FILE='主服务器二进制日志文件名', MASTER_LOG_POS=日志位置;
注:其中,用户名和密码是你在主服务器上设置的复制用户名和密码,主服务器IP是主服务器的IP地址,主服务器二进制日志文件名和日志位置是从备份或主服务器上获取的二进制日志文件名和位置。
三、启动复制:
- 在从服务器MySQL控制台中,运行以下命令启动复制:
START SLAVE;
四、检查复制状态:
- 在从服务器MySQL控制台中,运行以下命令检查复制状态:
SHOW SLAVE STATUS\G;
- 检查输出中的"Slave_IO_Running"和"Slave_SQL_Running"的值,确保它们都为"Yes"。如果其中一个值为"No",则表示复制出现问题。
五、 注意事项:
- 在配置复制之前,确保主从服务器之间的网络连接是可靠的,并且没有任何防火墙或安全组策略阻止MySQL之间的通信。
- 使用强密码来设置复制用户名和密码,并确保它们在主从服务器上的权限是正确的。
- 在生产环境中,建议使用半同步复制来提高数据的一致性。
主从复制方案?
异步复制、半同步复制、全同步复制
- 全同步复制:MySQL5.7及以上;当主服务器执行完一个事务并准备提交时,会被暂停等待所有从服务器都执行完该事务后,才会将结果返回给客户端。
- 半同步复制:MySQL5.5及以上;当主服务器执行完事务后并准备提交时,会被暂停等待至少一个从服务器将事务日志写入到中继日志中就立刻返回给主服务器,并不需要其完成事务的执行。
- 异步复制:MySQL5.5及以上;当主服务器执行完成事务后,会立即返回给客户端,不需要等待从服务的响应。
当一台从服务器时,半同步和全同步一样吗?
不一样的,全同步是要求全部从服务器接收并写入到中继日志中,并且需要完成事务的执行,才会返回响应;但半同步是需要至少一台服务器接收并写入到中继日志,然后就立刻返回响应,并不需要等待其完成事务的执行。
如果主从同步失败该怎么办?
1:使用set全局跳过错误事件
2:重新连接主数据库,跳过中间同步问题,可能会导致一些数据未同步,可以先保证数据和结构都一致再重新连接
主从复制,数据延迟的原因?
从库太多、从库硬件太差、慢sql、主库写入并发太大、网络延迟
如何解决主从延迟?
1:强制读取主库数据(会导致主从失效)
2:检查延迟时间
3:半同步复制
4:并行复制
5:sleep等待方案(主库更新后,读从库之前先sleep一下)
主从复制和读写分离的关系?
读写分离是建立在主从复制的基础上的,通过读写分离提升数据库的并发负载,通过主从复制进行数据同步
如何实现读写分离?
通过路由控制,将更新操作和查询操作分别指向不同数据库,laravel框架的配置文件中,可以配置读库和写库
mysql主从复制和mysql集群的区别?
主从:是通过mysql的复制来保证数据一致性的,可能会有延迟;不满足高可用,主机宕机,需要手动切换,业务会中断;
集群:数据同步是同步的;实时同步,高可用,性能相对较差
集群的工作流程?
1:主节点在执行提交语句时,将事务发送到从节点;
2:每个从节点都要准备事务的提交,然后向主节点发送消息(准备成功或失败);
3-1:如果都准备成功,主节点会告知所有从节点,提交事务;
3-2:如果有一个失败,主节点会告诉所有从节点,终止事务;
4:从节点按照消息执行后,将结果返回给主节点
5:然后由主节点报告该事务最终是,被提交或终止;