业务分析
在互联网企业, 高并发, 大数据量的情况下, 单个数据库指定在一定情况下会造成数据库宕机.
数据库怎么做集群:
-
业务:
读大于写(大多数企业业务都这样)
数据库解决方案:
集群, 读写分离, 一台主库作为写入的数据库, 写数据库不允许读, 多台从库, 也就是读取库, 读取库不允许人为的往里写数据. 平时高并发读的时候, 例如: a用户从一个库中去读取数据, b用户去另一个从库中去读取数据, 这样高并发的读取操作就可以负载均衡了. -
业务:
写大于读(特殊业务)
数据库解决方案:
集群, 多个数据库, 多个数据库中存储的内容不一样, 但是多个数据库中不管是库名还是表名, 还是表结构都是一模一样的, 只是存储的数据不一样而已, 这种配置叫做分库,
在数据量很大的情况下还需要分表, 同样的表结构的表有一堆, 每个表存储的内容也不一样, 也叫作水平分表,
mysql最好单表的数据量保证在五百万条以内, 那么查询效率不会太低, 如果超过这个数据量, 命中率会成指数级下降.
主从复制
主从复制需要两台以上的数据库,至少有一台主数据库,和一台从数据库,从数据库是和主数据库完全一样的数据库环境,主数据库一般是准实时的业务数据库。
作用 :
(1)做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
(2)架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
(3)读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
主从复制的原理
(1)主服务器凡运行语句,都产生一个二进制日志 binlog
(2)从服务器不断读取主服务器的binlog
(3)从主服务读取到的binlog,转换为自身可执行的relaylog,
(4)执行relaylog
(5)具体需要三个线程来操作:
-
binlog输出线程(dump thread):每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
-
从库I/O线程(I/O thread):当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。
-
从库的SQL线程(sql thread):从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
原理图:
主从复制的几种方式:
同步复制:
意思是master变化,必须等待slave-1,slave-2,...,slave-n完成后才能返回。
这样显然不可取,也不是MySQL复制的默认设置。比如用户增加了条记录,需要等待很长时间。
异步复制:
如同AJAX请求一样。master只需要完成自己的数据库操作即可。至于slaves是否收到二进制日志,是否完成操作,不用关心,MySQL的默认设置。
半同步复制:
master只保证slaves中的一个操作成功,就返回,其他slave不管。
做主从后主服务器挂了怎么办
主服务器挂了,使用从数据库代替为主库,但是可能会出现从数据库中的数据因为主数据库还没传过来就挂掉了,而缺失某些数据的问题。
解决方法:半同步复制
读写分离
好处:
主从服务器负责各自的读和写,极大程度缓解了锁的争用;
从服务器可以使用 MyISAM,提升查询性能以及节约系统开销;
增加冗余,提高可用性。
问题:
在应用程序中,insert/delete/update这些更新操作,用connection(for master)进行操作;select用connection(for slaves)进行操作。
那怎么从slaves选择一个来执行select?
如果使用简单的轮循算法,相当于应用程序与MySQL的主从复制架构非常关联(耦合起来),一旦master挂了,某些slave挂了,那么应用程序就要修改了。能不能让应用程序与MySQL的主从复制架构没有什么太多关系呢?
解决方法:
读写分离常用代理方式来实现,代理服务器接收应用层传来的读写请求,然后决定转发到哪个服务器
实际上,在MySQL master内部,维护N个线程,每一个线程负责将二进制日志文件发往对应的slave。master既要负责写操作,还的维护N个线程,负担会很重。可以这样,slave-1是master的从,slave-1又是slave-2,slave-3,…的主,同时slave-1不再负责select。 slave-1将master的复制线程的负担,转移到自己的身上。这就是所谓的多级复制的概念。