这里写目录标题
分库分表
分库分表包括分库和分表两个部分,在生产中通常包括:垂直分表、垂直分库、水平分表、水平分库四种方式。
垂直分表
把主键和一些列放在一个表,然后把主键和另外的列放在另一个表中。
垂直分表的优点:将一个大表拆分为不同包含不同模块的小表,可以让分别查询两个表的用户不受影响。
垂直分表的缺点:查询所有数据需要join操作,单标的数据量可能还是比较大。
垂直分库
垂直分库是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用。
垂直分库的优点:解决业务层面的耦合,业务清晰。
垂直分库的缺点:依然没有解决单表数据量过大的问题。
水平分表
保持数据表结构不变,通过某种策略将存储数据分片,这样每一片数据分散到不同的表中。 水平拆分可以支撑非常大的数据量。
水平分表的优点:优化单一表数据量过大而产生的性能问题。
水平分表的缺点:给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需UNION操作。
水平分库
水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。
水平分库的优点:解决了单库大数据,高并发的性能瓶颈。
水平分库的缺点:同一个表被分配在不同的数据库,查询时需要多个数据库。
主从复制+读写分离
主从复制
将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。
主从复制的过程
- 主服务器上面启动一个binlog线程,主服务器的任何修改都会保存在Binary log(二进制日志)里面。
- 从服务器上面启动一个I/O线程,连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。
- 从服务器上面开启一个SQL线程,定时检查Realy log,如果发现有更改立即把更改的内容在本机上面执行一遍。
主从复制的模式
- 异步复制模式:主库接受到客户请求后,处理完事务后,立即将结果返给客户端,不关心从库是否已经接收并处理。客户体验度高,访问从库可能没有数据。
- 全同步复制:当主库执行完一次事务,且所有从库都接受并处理之后,才返回给客户端。客户体验度差,数据同步好。
- 半同步复制:介于两种模式之间,主库执行一次事务后,等待至少一个从库接受并写到relay log中才返回给客户端。
主从复制的优点
- 做数据的备份,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
- 可以做读写分离,使数据库能支持更大的并发。如果进程A使用master,进程B使用slave,那么进程B将不会影响进程A的速度。
主从复制的缺点
- 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。
- 主服务器宕机,但是数据还没写入到binlog,可能会造成主从数据不一致。
读写分离
读写分离是依赖于主从复制,而主从复制又是为读写分离服务的。因为主从复制要求slave不能写只能读。
通过设置主从数据库实现读写分离,主数据库负责“写操作”,从数据库负责“读操作”,根据压力情况,从数据库可以部署多个提高“读”的速度,借此来提高系统总体的性能。
主从同步过程中,SQL线程可不可以并行执行?
不可以,因为这样可能SQL执行的顺序不同,导致事务提交时间有差异。
缓存
redis
Redis是一个使用 C 语言开发的数据库,不过与传统数据库不同的是Redis 的数据是存在内存中的,也就是它是内存数据库,所以读写速度非常快,因此Redis被广泛应用于分布式缓存方向。
关于redis的详解请移步redis专栏。