怎么设计大型的高并发系统
【mysql主从配置】
主从原理大致有三个步骤:
1.在主库上把数据更改记录到二进制日志中(Binary Log)中,这些记录称为二进制日志事件。
2.从库通过IO线程将主库上的日志复制到自己的中继日志(Relay Log)中。
3.从库通过SQL线程读取中继日志中的事件,将其重放到自己数据上。
MySQL主从模式是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。
MySQL默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,从节点可以复制主数据库 中的所有数据库,或者特定的数据库,或者特定的表。
Mysql主从同步是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,整个过程需要开启3个线程,分别是Master开启IO线程,slave开启IO线程和SQL线程。
主从复制的优点:
1.实时灾备,用于故障切换(高可用)服务器或者数据库突然砸机了,可以立即切换到从数据库,将从数据库设置为新的主数据库。
2.读写分离,提供查询服务(读扩展)
3.数据备份,避免影响业务(高可用)
【高可用系统】
通过主从配置实现,发生服务器或者数据库突然砸机时,可以立即切换到从数据库。
【mysql读写分离】
实现读写分离有3种方式:
(权限:在主库创建一个只写的用户,而从库创建一个只写的用户,让程序去连接不同的服务器可达到读写分离的效果。)
1.代码:在代码中根据select 、insert进行路由分类,这类方法也是目前生产环境下应用最广泛的。适用于简单系统。一般配合mysql用户权限设置
2.代理:mysql_proxy和amoeba,需要增加硬件的开支,一般新增独立服务器。
读写分离架构也能够消除读锁和写锁的冲突,从而提升数据库的读写性能。
使用读写分离架构需要注意:主从同步延迟和读写分配机制问题。
参考:
https://www.cnblogs.com/zezhou/p/11525081.html
https://blog.csdn.net/rzpy_qifengxiaoyue/article/details/108663411
【主从同步延迟的解决方案】
1.半同步复制,需要从库返回确认才允许读取从库,否则读主库。
2.先去从库读取数据,找不到时就去主库进行数据读取,同时告诉从库没有数据。读完之后将数据重新写入从库,如果没有值,就设置为空值。
3.如果数据是需要实时显示,对速度性能要求很高,可以直接在主库上读取数据。
【mysql支持的复制类型】
1.基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。
2.基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
3.混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
【Mysql常用的两大引擎有 MyISAM 和 innoDB,有什么明显区别及在什么场合使用什么引擎呢?】
InnoDB和MyISAM都是使用B+树作为索引存储结构。
MyISAM 类型的表强调的是性能,其执行速度比 innoDB类型更快,但不提供事务支持,如果执行大量的 SELECT操作,MyISAM 是更好的选择,支持表锁。
InnoDB 提供事务支持,外部键等高级数据库功能,执行大量的 INSERT 或 UPDATE,处于性能方面的考虑,应该使用 InnoDB表,支持行锁。
如果使用mysql, 还有一个更严重的问题是,当需要添加一列的时候,mysql会锁表,期间所有的读写操作只能等待。
添加行,InnoDB会锁行,MyISAM会锁表。
【mysql分库分表】
分库规则:
依据业务,功能,大单表划分
分表规则:
1.时间:按照时间切分,就是将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据。被查询的概率变小,所以没必要和“热数据”放在一起,这个也是“冷热数据分离”。(如订单表,数据太多,设置更小的时间区间,做个判断分发)
2.范围值:从0到10000一个表,10001到20000一个表;(如用户表)
3.地理区域:比如按照华东,华南,华北这样来区分业务,七牛云应该就是如此。
4.HASH取模(如MD5和SHA):一个商场系统,一般都是将用户,订单作为主表,然后将和它们相关的作为附表,这样不会造成跨库事务之类的问题。取用户id,然后hash取模,分配到不同的数据库上。
安装jdk
下载和安装mycat
完成操作: https://segmentfault.com/a/1190000014231377
用户表可以按照用户id区间数来做划分
1.按照用户数据
2.按照日期,但是日期是有问题,因为后续日期,用户量明显增多。
test_user
id username
test_log
user_id content
【mysql索引的理解,如何进行设置,有什么优缺点】
索引的结构是B+树,
【mysql慢查询优化】
1.根据慢日志定位慢查询sql
检查慢日志是否开启
SHOW VARIABLES LIKE ‘%query%’ # 查询慢日志相关信息
slow_query_log 默认是off关闭的,使用时,需要改为on 打开
slow_query_log_file 记录的是慢日志的记录文件
long_query_time 默认是3S,每次执行的sql达到这个时长,就会被记录
SHOW STATUS LIKE ‘%slow_queries%’ 查看慢查询状态
如何打开慢查询 : SET GLOBAL slow_query_log = ON;
将默认时间改为2S: SET GLOBAL long_query_time = 2;
2.通过explain语句分析慢查询sql,里面的type字段,来定位性能级别
例如all为最差,MySQL将遍历全表以找到匹配的行
system和null最高,system代表表只有一个行,null代表表没有行,或者不需要访问表
https://www.cnblogs.com/tufujie/p/9413852.html
3.修改sql或者尽量让sql经过索引查找
4.利用数据库工具进行分析,例如heidisql里面有一个“查询分析”的选项,选中后进行查询,会出现很多参数,例如opening tables打开表, closing tables关闭表, execting执行时间,这些参数可以看到用了多少时间,然后定位指定参数进行优化
【索引是建立得越多越好吗】
1.数据量小的表不需要建立索引,建立会增加额外的索引开销。
2.数据变更需要维护索引,因此更多的索引意味着更多的维护成本。
3.更多的索引意味着也需要更多的空间。
【qps是什么,百万级和千万级的qps是多少】
【mysql读和写的哪个快】
小量数据时,读取比写入快。
大量数据时,如50万条数据时,写入速度是读取的3-4倍。因为写入的时候,数据表已经有了写入的预定的id值,写入速度没有因为数据量增多而变慢。
例子:
因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
【mysql优化】
SQL优化最快速见效的是:修改SQL写法,和新增索引。
查询时尽量一批批的查,不要一条条的查。
对经过搜索的字段增加索引。在主从配置的数据库中,可以在从库追加多个索引来优化查询,主库这些索引可以不加,用于提升写效率。
增加redis和文本缓存
增加定时任务完成处理结果保存在redis和文本缓存中
增加搜索引擎如elasticsearch
优化慢查询
分库分表,减少数据表容量
数据主从配置,读写分离
采用异步通讯框架,减少php脚本执行的资源开销
mysql如何获取慢SQL,以及慢查询的解决方式
https://blog.csdn.net/qq_32002253/article/details/86772940
下一页: PHP常用函数
发表回复