成长是一棵树,总是在你不知不觉的情况下快乐长大;成长是一株草,总是在你不知不觉的情况下长满大地;成长是一朵花,总是在你不知不觉的情况下开满山头 。
这不,随着时间的迁移 。项目网站的用户量、数据量持续上升,普通模式下的单机MySQL即将面临被请求压力打垮的情景 。老早就被急的像热锅上蚂蚁一样的产品经理,把我给叫了过去,看着那诚恳的小眼神儿 。心理甚是开心 。
文章插图
你说,早知道会遇到这样的事儿,以前咋不见他好好说话,朝令夕改的需求,感觉就不要欠钱似的直接堆过来,今天终于轮到我 农民翻身把歌唱 啦 。
自己首先就是一副处变不惊的表情,抽根烟,喝口茶 。对产品说到:“不急不急,一切尽在我们团队的预料之中” 。 由我一一道来,这下咱真的是腿不酸了,腰板儿也硬朗了 。好不容易,你撞我枪口上来了,还不得杀杀你的锐气 。也让你知道知道咋的手段 。
随着网站的发展,在面对高并发请求的时候 。单机下面的MySQL肯定是会遇到性能的瓶颈 。因为你单机无论是磁盘的存储、I/O的开销上都是会有资源上限 。没办法支持网站后续的发展 。毕竟双拳难敌四手 。正是因为这样我们才会构建大规模、高性能的应用 。基于“水平扩展”的方式来满足项目发展的需要 。这也是搭建高可用、可扩展性、灾难恢复、备份及数据仓库等工作的基础 。
在有规模的网站中,程序员往往都是避免不了这类型的话题 。
为什么使用MySQL主从复制?
1、自身不足:解决单机下的瓶颈问题为什么随着公司的发展,需要越来越多的人,而不应该人数越少越好好吗?那是因为公司越发展业务会增多,相关的事情也会越来越多 。如果都交给一个人,那必定精力是有限 。根本不能完成每天的工作 。
单机MySQL也是一样 。它的磁盘、内存、I/O、CPU等资源都是有限制 。
注:单机MySQL指在一台物理服务器上安装一台MySQL,专门只提供数据库的服务 。单机多实例指在一台物理服务器上可以安装多台MySQL实例一般中、大型网站的数据量可能达到几百GB、几个TB的数据,甚至是更高 。而你单机下面的磁盘容量可能才是几十个GB 。它能够支持数据存储的容量吗?
网站项目规模过大,那必定你业务的请求量肯定是十分巨大的,在这么大的情况下面,少说也得亿级的PV的用户请求吧 。这样的条件下,你的I/O访问的频率过高,CPU切换忙都忙不过来,一直都是高负载的情况 。它能搞的赢?
因为系统的软件运行是由CPU每隔一个时间片切换后才能执行程序的 。这样服务器的压力会异常的大,一直都高负荷运行状态 。从而导致宕机 。同时你在这样的条件下,每一个请求走到MySQL后,都需要给每一个请求分配一个线程去执行该请求里面的SQL语句 。那线程的资源开销也是需要内存的啊 。就算你是单机的MySQL 。那你的内存也有上限,难道可以分配几千个线程?
这不,葛优大爷出演的电影《甲方乙方》也说道了,"地主家也没有余粮啊"
并且,你磁盘I/O的读写也是需要时间的,请求越多,你磁盘读写机会也机会多,而从数据库的数据是需要从磁盘里面读取到内存中,然后在响应给客户端的 。那所有的请求都要做磁盘寻址 。那这个消耗也是很大的 。
- 磁盘获取数据过程的时间:访问时间+传输时间
- 移动磁头到磁盘面上的正确位置(访问时间)
- 等待磁盘旋转,使得所需要的数据在磁头之下(访问时间)
- 等待磁盘旋转过去,所有需要的数据都被磁头读出(传输速度)
后面出一篇详细的数据库数据载入原理,这里大家先给一个总结
2、压力分担:让请求负载均衡给多台数据库做了主从复制后最明显的特点就是,把相关的读写请求分离 。主库针对写请求,从库针对读请求,这样能够在业务上面把各个数据库的职责划分开 。对后续的一切客户端的请求,我们可以根据读或者是写直接交给对应的数据库 。
一般项目绝大多数都是读操作,通过MYSQL复制将读操作分布到多个服务器上,从而实现对密集性应用的优化,通过Nginx简单的代码修改就能实现基本负载均衡 。
对于小规模的网站,可以对机器名做硬编码或使用DNS轮询(将一个机器名指定到多个IP地址),当然也可以选择复杂的方法,采用LVS网络的负载均衡来实现网络的情求的分担 。
推荐阅读
- Mysql报too many connections详解
- Mysql访问中间件--Atlas初探
- Centos7 安装redis主从及配置哨兵模式
- Linux怎么复制文件到其他文件夹
- 我常用的免费MySQL图形化管理工具
- Linux安装JDK 以及 tomcat 和mysql
- MySQL-分布式架构-MyCAT
- MySQL中七个查询命令的优先级及特点
- 千万级MySQL数据库建立索引,提高性能的秘诀
- Docker下搭建Apache+PHP+Mysql