其实,还有更为激进一点的做法,使用pconnect(数据库长连接),线程一旦创建在很长时间内都保持着 。但是 , 在访问量比较大,机器比较多的情况下,这种用法很可能会导致“数据库连接数耗尽”,因为建立连接并不回收,最终达到数据库的max_connections(最大连接数) 。因此,长连接的用法通常需要在CGI和MySQL之间实现一个“连接池”服务,控制CGI机器“盲目”创建连接数 。
建立数据库连接池服务 , 有很多实现的方式,PHP的话,我推荐使用swoole(PHP的一个网络通讯拓展)来实现 。
3. Innodb缓存设置(innodb_buffer_pool_size)
innodb_buffer_pool_size这是个用来保存索引和数据的内存缓存区,如果机器是MySQL独占的机器,一般推荐为机器物理内存的80% 。在取表数据的场景中 , 它可以减少磁盘IO 。一般来说,这个值设置越大 , cache命中率会越高 。
4. 分库/分表/分区 。
MySQL数据库表一般承受数据量在百万级别 , 再往上增长,各项性能将会出现大幅度下降,因此,当我们预见数据量会超过这个量级的时候,建议进行分库/分表/分区等操作 。最好的做法 , 是服务在搭建之初就设计为分库分表的存储模式,从根本上杜绝中后期的风险 。不过 , 会牺牲一些便利性,例如列表式的查询,同时 , 也增加了维护的复杂度 。不过,到了数据量千万级别或者以上的时候,我们会发现,它们都是值得的 。
二、 MySQL数据库多台服务搭建
1台MySQL机器 , 实际上是高风险的单点,因为如果它挂了,我们Web服务就不可用了 。而且,随着Web系统访问量继续增加,终于有一天,我们发现1台MySQL服务器无法支撑下去 , 我们开始需要使用更多的MySQL机器 。当引入多台MySQL机器的时候,很多新的问题又将产生 。
1. 建立MySQL主从,从库作为备份
这种做法纯粹为了解决“单点故障”的问题,在主库出故障的时候,切换到从库 。不过,这种做法实际上有点浪费资源,因为从库实际上被闲着了 。
2. MySQL读写分离,主库写,从库读 。
两台数据库做读写分离,主库负责写入类的操作,从库负责读的操作 。并且 , 如果主库发生故障,仍然不影响读的操作,同时也可以将全部读写都临时切换到从库中(需要注意流量,可能会因为流量过大,把从库也拖垮) 。
3. 主主互备 。
两台MySQL之间互为彼此的从库,同时又是主库 。这种方案,既做到了访问量的压力分流,同时也解决了“单点故障”问题 。任何一台故障,都还有另外一套可供使用的服务 。
不过,这种方案,只能用在两台机器的场景 。如果业务拓展还是很快的话 , 可以选择将业务分离,建立多个主主互备 。
三、 MySQL数据库机器之间的数据同步
每当我们解决一个问题,新的问题必然诞生在旧的解决方案上 。当我们有多台MySQL , 在业务高峰期,很可能出现两个库之间的数据有延迟的场景 。并且,网络和机器负载等 , 也会影响数据同步的延迟 。我们曾经遇到过,在日访问量接近1亿的特殊场景下,出现,从库数据需要很多天才能同步追上主库的数据 。这种场景下 , 从库基本失去效用了 。
于是,解决同步问题,就是我们下一步需要关注的点 。
1. MySQL自带多线程同步
MySQL5.6开始支持主库和从库数据同步,走多线程 。但是,限制也是比较明显的 , 只能以库为单位 。MySQL数据同步是通过binlog日志 , 主库写入到binlog日志的操作,是具有顺序的,尤其当SQL操作中含有对于表结构的修改等操作,对于后续的SQL语句操作是有影响的 。因此,从库同步数据,必须走单进程 。
推荐阅读
- 老游戏手机解谜游戏,2020手机解谜游戏
- 现在梨树打什么药视频,梨树需要打什么药
- 怎么加装多个硬盘,怎么加装多个硬盘驱动
- 主板显卡怎么拆下来,主板上显卡怎么拆
- linux执行who命令 linux执行who命令没有返现
- 户外拍摄为什么有高光时刻,为什么室外拍照更好看
- 怎么更新电脑的显卡驱动,如何更新电脑驱动显卡
- unity+导出html5,unity导出webgl后html打不开
- linux命令开启vnc Linux命令开启桌面环境