1.mysql主库、从库
在 MySQL 中,读写分离是一种常见的数据库架构设计方案,用于提高数据库的性能和可用性。
一、主库(Master)
作用
主库主要负责接收写操作(INSERT、UPDATE、DELETE 等),并将这些操作记录到二进制日志(Binary Log)中。
主库是数据的主要来源,确保数据的完整性和一致性。
特点
承担写入压力:由于所有的写操作都集中在主库上,主库需要具备较高的性能和可靠性,以应对大量的写入请求。
数据同步源头:主库的二进制日志是从库进行数据同步的依据,主库的任何数据变化都会被记录下来并发送给从库。
配置要点
开启二进制日志:在 MySQL 的配置文件(my.cnf 或 my.ini)中,需要设置 log-bin 参数来开启二进制日志。
设置唯一的服务器 ID:每个 MySQL 实例都应该有一个唯一的服务器 ID,以便在主从复制中进行区分。可以在配置文件中设置
server-id 参数。
二、从库(Slave)
作用
从库通过读取主库的二进制日志,将主库上的写操作应用到自己的数据库中,以实现数据的同步。
从库主要负责处理读操作(SELECT 等),分担主库的读压力。
特点
数据同步:从库不断地从主库获取二进制日志,并将其中的操作应用到自己的数据库中,以保持与主库的数据一致。
读负载分担:多个从库可以同时处理读操作,提高系统的读性能。
配置要点
指定主库信息:在从库的配置文件中,需要设置 master-host(主库的 IP地址或域名)、master-user(用于连接主库的用户名)、master-password(连接主库的密码)等参数,以指定主库的连接信息。
开启从库服务:使用 START SLAVE 命令启动从库的复制服务,使从库开始从主库同步数据。
三、主从复制的过程
1.主库记录二进制日志
当主库上发生写操作时,MySQL 会将这些操作记录到二进制日志中。二进制日志记录了所有对数据的更改操作,包括 SQL 语句、数据行的更改等。
2.从库连接主库并请求二进制日志
从库启动后,会连接到主库,并请求主库的二进制日志。从库会记录主库的二进制日志文件名和位置,以便下次连接时继续从上次的位置进行同步。
3.主库发送二进制日志给从库
主库接收到从库的请求后,会将二进制日志发送给从库。主库可以同时向多个从库发送二进制日志。
从库应用二进制日志
从库接收到主库的二进制日志后,会将其中的操作应用到自己的数据库中。从库会按照二进制日志中的顺序依次执行这些操作,以确保数据的一致性。
2.从库保持与主库的同步
从库会不断地从主库获取新的二进制日志,并将其中的操作应用到自己的数据库中,以保持与主库的数据同步。如果从库在应用二进制日志的过程中出现错误,从库会停止复制,并尝试重新连接主库并同步数据。
一.主从复制的优势
1.提高性能
通过将读操作分配到从库上,可以减轻主库的读压力,提高系统的整体性能。
主库可以专注于处理写操作,从库可以同时处理多个读操作,从而提高系统的并发处理能力。
2.增强可用性
如果主库出现故障,可以将写操作切换到备用主库上,而读操作仍然可以在从库上进行,从而提高了系统的可用性。
从库可以作为主库的备份,在主库出现故障时,可以快速地切换到从库上,以减少系统的停机时间。
3.便于数据备份和恢复
可以在从库上进行数据备份,而不会影响主库的性能。
如果主库的数据出现损坏,可以从从库上恢复数据,从而提高了数据的安全性和可靠性。
3.什么是读写分离
一、读写分离的概念
读写分离即将数据库的读操作和写操作分离到不同的数据库服务器上,以减轻单个数据库服务器的负载,提高系统的整体性能和可用性。一般情况下,读操作的频率远远高于写操作,通过将读操作分配到多个从数据库服务器上,可以有效地提高系统的并发处理能力。
二、实现读写分离的常见方式
1. 基于程序代码实现
- 开发人员在应用程序中通过代码逻辑来区分读操作和写操作,并将读操作发送到从数据库服务器,写操作发送到主数据库服务器。
- 例如,在 Java 应用中,可以使用数据库连接池(如 HikariCP、Druid 等)配置多个数据源,分别指向主数据库和从数据库。然后,在代码中根据操作类型选择不同的数据源进行数据库访问。
// 配置主从数据源
DataSource masterDataSource = // 配置主数据库连接信息
DataSource slaveDataSource = // 配置从数据库连接信息// 根据操作类型选择数据源
if (isWriteOperation()) {return masterDataSource.getConnection();
} else {return slaveDataSource.getConnection();
}
2. 基于中间件实现
- 使用数据库中间件来实现读写分离,常见的中间件有 MyCat、Sharding-JDBC 等。
- 这些中间件位于应用程序和数据库服务器之间,对数据库连接进行管理和路由。应用程序只需要连接到中间件,中间件负责将读操作和写操作分发到不同的数据库服务器上。
- 以 MyCat 为例,它可以将多个 MySQL 数据库实例虚拟成一个逻辑数据库,对外提供统一的访问入口。通过配置读写分离规则,MyCat 可以自动将读操作分发到从数据库服务器,写操作分发到主数据库服务器。
**
三、读写分离的优势**
1. 提高性能
- 读操作可以在多个从数据库服务器上并行执行,大大提高了系统的读性能。
- 写操作集中在主数据库服务器上,保证了数据的一致性。
2. 增强可用性
- 如果主数据库服务器出现故障,可以将写操作切换到备用主数据库服务器上,而读操作仍然可以在从数据库服务器上进行,从而提高了系统的可用性。
3. 便于扩展
- 可以根据系统的负载情况,动态地增加或减少从数据库服务器的数量,以满足不同的性能需求。
四、读写分离的注意事项
1. 数据同步延迟
- 由于从数据库服务器的数据是通过复制主数据库服务器的数据得到的,可能会存在一定的延迟。在一些对数据实时性要求较高的场景下,需要特别注意这个问题。
2. 主从切换
- 当主数据库服务器出现故障时,需要进行主从切换。在切换过程中,可能会出现短暂的数据库不可用情况,需要采取相应的措施来减少对业务的影响。
3. 负载均衡
- 如果有多个从数据库服务器,需要考虑如何进行负载均衡,以充分利用各个从数据库服务器的性能。可以使用中间件提供的负载均衡策略,或者在应用程序中实现自定义的负载均衡算法。
在实现 MySQL 读写分离后,可以通过以下几种方式来保证主库和从库的数据一致性:
一、使用合适的复制模式
-
基于语句的复制(Statement-Based Replication,SBR)
- 主库将 SQL 语句记录到二进制日志中,从库读取这些日志并执行相同的 SQL 语句。
- 优点:占用空间相对较小,因为只记录语句。
- 缺点:某些情况下可能导致主从数据不一致,例如使用不确定函数或依赖于当前时间的语句。
-
基于行的复制(Row-Based Replication,RBR)
- 主库将对数据行的更改记录到二进制日志中,从库根据这些行更改进行同步。
- 优点:可以准确地复制数据更改,避免了 SBR 中一些不确定性问题。
- 缺点:日志文件相对较大,占用更多的磁盘空间和网络带宽。
-
混合复制(Mixed-Based Replication)
- MySQL 会根据具体情况自动选择使用 SBR 或 RBR。
- 例如,对于确定性的语句使用 SBR,对于不确定的语句使用 RBR。
二、合理配置复制参数
-
设置合适的复制延迟参数
slave_net_timeout
:从库与主库连接超时时间。如果从库在这个时间内没有收到主库的数据包,会认为连接中断并尝试重新连接。master_heartbeat_period
:主库向从库发送心跳包的时间间隔。从库可以根据这个心跳包来判断主库是否仍然活跃。
-
调整复制缓冲区大小
relay_log_space_limit
:从库中继日志的总空间限制。如果中继日志占用的空间超过这个限制,从库会停止复制并等待应用中继日志中的数据,以释放空间。innodb_flush_log_at_trx_commit
:主库和从库都可以设置这个参数来控制事务日志的刷新方式。一般建议设置为 1(每次事务提交时将日志刷新到磁盘),以确保数据的持久性和一致性。
三、监控和管理复制
-
定期监控复制状态
- 使用 MySQL 提供的命令或工具来检查主从复制的状态,例如
SHOW SLAVE STATUS
命令可以查看从库的复制状态信息,包括连接状态、复制延迟等。 - 也可以使用第三方监控工具,如 Nagios、Zabbix 等,对主从复制进行实时监控。
- 使用 MySQL 提供的命令或工具来检查主从复制的状态,例如
-
及时处理复制错误
- 如果从库出现复制错误,需要及时分析错误原因并进行处理。常见的错误包括网络问题、主库数据更改导致从库无法应用日志等。
- 可以根据错误信息进行相应的调整,例如重新启动复制、跳过错误的事务等。
四、避免在从库上进行写操作
-
严格控制从库的写权限
- 确保只有在必要的情况下才在从库上进行写操作,例如进行数据备份、数据分析等。
- 可以通过设置从库的用户权限来限制写操作,只赋予从库用户只读权限。
-
防止应用程序错误地将写操作发送到从库
- 在应用程序中,应该明确区分读操作和写操作,并将写操作发送到主库。可以通过配置数据库连接池或使用中间件来实现这一点。
五、使用数据校验工具
-
定期进行数据校验
- 使用工具对主库和从库的数据进行比较,以确保数据的一致性。例如,可以使用 pt-table-checksum 工具来比较主从库中表的数据差异。
- 如果发现数据不一致,可以根据具体情况进行修复,例如重新同步数据或手动修复错误的数据。
-
数据校验的频率和范围
- 根据系统的重要性和数据变化的频率,确定数据校验的频率。对于关键业务系统,可能需要更频繁地进行数据校验。
- 可以选择对整个数据库进行校验,也可以只对特定的表或数据范围进行校验,以提高校验的效率。