1.主从复制
在主服务器上,所有修改数据的语句(如 INSERT、UPDATE、DELETE)会被记录到二进制日志中。
主服务器上的一个线程(二进制日志转储线程)负责读取二进制日志的内容并发送给从服务器。
从服务器接收到二进制日志数据后,会将这些数据写入自己的中继日志(Relay Log)。中继日志是从服务器上的一个本地存储。
从服务器上有一个 SQL 线程会读取中继日志,并在本地数据库上执行,从而将更改应用到从数据库中,完成同步。
2.分库分表
2.1.分库
①垂直分库:按照业务模块将不同的表拆分到不同的库中,例如,用户表、订单表、商品表等分到不同的库中。
②水平分库:按照一定的策略将一个表中的数据拆分到多个库中,例如,按照用户 id 的 hash 值将用户表拆分到不同的库中。
2.2.分表
2.2.1.分表的方式分类
垂直拆分可以减轻查询业务的基本数据,不需要附带一些数据量大的字段的查询压力。
当表的数据量过大时,仍然要考虑水平分表,将一个表的数据分散到多个表中,以减轻单表的查询压力。
2.2.3.分表策略
为了实现水平分表,需要设计合适的路由策略来确定数据应该存储在哪个表中,具体哪个表,由分片键(Sharding Key)来决定,分片键的选择应满足以下条件:
1)高区分度:分片键的值应尽量均匀分布,以避免数据倾斜。
2)查询频率高:选择经常在查询条件中使用的字段作为分片键,有助于提高查询效率。
3)写入频率高:选择经常被写入的字段,可以均匀分布写入负载。
那常见的路由策略有三种,分别是范围路由、Hash 路由和配置路由。
2.2.3.1.范围路由
什么是范围路由?
范围路由是根据某个字段的值范围进行分表。这种方式适用于分片键具有顺序性或连续性的场景。
范围路由的优点是实现简单,可以随着数据的增加平滑地扩充新的表。适用于按时间或按顺序增长的字段(如时间戳、订单号等)。缺点是可能出现数据倾斜问题,导致某些表的数据量明显大于其他表。
2.2.3.2.Hash路由(?)
哈希路由是通过对分片键进行哈希计算,然后取模来确定数据存储的表。哈希值决定了数据分布,通常能较好地平衡数据量。
哈希路由的优点是数据可以均匀分布,避免了数据倾斜,但范围查询时可能会涉及多个表,性能较差。
2.2.3.3.配置路由
配置路由是通过配置表来确定数据存储的表,适用于分片键不规律的场景。
配置路由的优点是可以根据实际情况灵活配置。缺点是需要额外的配置表,维护成本较高。