小型网站到大型网站-Mysql优化
2019独角兽企业重金招聘Python工程师标准>>>
背景
好的大型网站都是从小型网站慢慢演变来的,都不是一步就设计好的。现在的淘宝,03年创建的时候它也是只有一台服务器,使用的是我们目前还经常使用的lamp架构(Linux+Apache+MySQL+PHP),他们当时为了提高速度,买的现成PHPAuction网站系统(名字一看就是php做的),随后淘宝的快速发展,他们从Php走进Java时代,数据库也换成了oracal,自己去创造技术,进入到分布式时代,研发出适合自己的一套框架。
2015-16年国家的经济增速在下滑,很多工厂、公司倒闭。最近刚得到消息,自己的上家公司也破产了(做互联网盒子的,由于行业没落,转型不成功,曾经可有200多的研发人员!),有时候总感觉到一个互联公司的成功是靠他们的技术团队,公司的落败也是因他们的技术团队。所以做为码农的我们~还是好好学习技术吧!
Mysql优化
网站的性能主要依赖于它的数据库及存储设计。小型到中型时的瓶颈一般都会在数据库上,我们目前由于访问量比较少,webserver和mysql都是在一台服务器上,随着后续业务的增多,会慢慢的做分离,所以先学习了些这方面的知识。架构方面学习和实践的经验比较少,所以只从mysql单个知识点上做简单介绍(缓冲,mysql同步及读写分离,分库、分表)。
缓冲
目前我们项目里使用的memcache做缓冲,起先使用最简单的FileCache,该缓冲不支持多个应用之间缓冲共享,后来看了多方面的文章,引入了memcache做缓冲,yii2对memcache缓冲配置很简单,下载源码编译出memcache.so配置在php环境中,在yii应用的components中添加
'cache' => ['class' => 'yii\caching\MemCache','keyPrefix' => 'color-f', // a unique cache key prefix],
即可,keyPrefix可以为不同yii应用配置不同的前缀做分离。
选取memcache是因为它是一套支持分布式的高速缓冲系统,对以后网站做分布式服务会很有用。
1 协议简单
它是基于文本行的协议,直接通过telnet在memcached服务器上可进行存取数据操作。2 基于libevent事件处理
Libevent是一套利用C开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,与传统的select相比,提高了性能。3 内置的内存管理方式
所有数据都保存在内存中,存取数据比硬盘快,当内存满后,通过LRU算法自动删除不使用的缓存,但没有考虑数据的容灾问题,重启服务,所有数据会丢失。4 分布式
各个memcached服务器之间互不通信,各自独立存取数据,不共享任何信息。服务器并不具有分布式功能,分布式部署取决于memcache客户端。
具体yii2缓冲的使用可以点击这里。
Mysql同步和读写分离
当网站访问量大时(根据Oracle发布的mysql参考架构,一般小型网站是在query/s<500,中型网站query/s<5000,大型网站>10k+),就需要考虑做数据库的读写分离了。数据库的select操作从slave服务器获取,数据库的写操作从master服务器更新,yii2对数据库的读写分离配置也很简单。
'db' => ['class' => 'yii\db\Connection','dsn' => 'mysql:host=192.168.1.1;dbname=table_name_1','username' => 'username','password' => 'pwd','charset' => 'utf8','enableSchemaCache' => false ,'enableQueryCache' => true,'slaveConfig' => ['username' => 'username','password' => 'pwd','charset' => 'utf8','enableSchemaCache' => false ,'enableQueryCache' => true,'attributes' => [PDO::ATTR_TIMEOUT => 10,],],'slaves' => [['dsn' => 'mysql:host=192.168.1.2;dbname=table_name_1'],]],
以上是配置一主多从,也可以配置多主多从,yii支持对slave服务器负载均衡,查询时会选取最优的一台服务器去做快速查询操作。
配置完读写分离后,剩下的就是对主从服务器做数据库同步操作,原理就是将主服务器上的数据库二进制文件,根据每条更改数据在文件中的位置信息及记录,不断的将数据同步到从服务器上。
- 配置master服务器
mysql> create user username;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'username'@'192.168.1.2' IDENTIFIED BY 'pwd';
//配置username用户拥有REPLICATION SLAVE权限
查找my.cnf文件,配置主服务器server-id,
log-bin=mysql-bin
server-id=1
binlog-do-db = table_name_1
重启mysql,进入命令行查看master运行状态如下
mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysql-bin.000001 | 37652 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
- 配置slave服务器
找到从服务器的my.cnf文件,添加如下:
server_id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
重启mysql,进入mysql执行如下命令链接master
mysql> CHANGE MASTER TO-> MASTER_HOST='192.168.1.1',-> MASTER_USER='username',-> MASTER_PASSWORD='pwd',-> MASTER_LOG_FILE='mysql-bin.000001',-> MASTER_LOG_POS=37652;
//log_pos从哪个位置开始同步
然后通过start_slave启动从服务器,如果启动失败会报错,通过日志查看自己错误原因,一般错误都是因为master服务器没有配置slave的replication slave权限。
然后就可以自己测试同步、读写分离功能了。
分库、分表
分库、分表就是数据切分(Sharding)。数据切分有两种,一种是垂直切分(分库),就是按照不同的表来切分到不同的数据库(主机)之上。另一种时水平切分(分表),根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面。
数据切分是很有必要的,当数据达到千万或者上亿级别时,数据库的Replication机制缺陷就会很明显,Master往往会成为瓶颈所在,写操作需要顺序排队来执行,过载的话Master扛不住,Slaves的数据同步的延迟比较大,而且会大大耗费CPU的计算能力,因为write操作在Master上执行以后还是需要在每台slave机器上都跑一次。Replication搞不定,那么为什么Sharding可以工作呢?道理很简单,因为它可以很好的扩展。我们知道每台机器无论配置多么好它都有自身的物理上限,所以当我们应用已经能触及或远远超出单台机器的某个上限的时候,我们惟有寻找别的机器的帮助或者继续升级的我们的硬件,但常见的方案还是横向扩展, 通过添加更多的机器来共同承担压力。我们还得考虑当我们的业务逻辑不断增长,我们的机器能不能通过线性增长就能满足需求?Sharding可以轻松的将计 算,存储,I/O并行分发到多台机器上,这样可以充分利用多台机器各种处理能力,同时可以避免单点失败,提供系统的可用性,进行很好的错误隔离。
垂直切分
简单点就是将几个相关的表合并在一起,放在同一数据库(主机)上,比如用户表,用户爱好表,用户职业表等,这样的好处是在做一些关联操作时会很方便,如果跨主机去做表关联时,实现起来就会很麻烦,必须得用程序去实现。垂直切分比较好理解,它的优点也很明显,拆分规则很明确,模块清晰,整合起来会容易,数据维护也方便。缺点就是部分表关联无法在数据库级别完成,对于访问极其频繁且数据量超大的表仍然存在性能瓶颈,切分达到一定程度之后,扩展性会遇到限制,过多的切分可能会带来系统过渡复杂而难以维护。
水平切分
水平切分就是按照某一切分规则,将数据分布到一个数据库的不同表中。例如将user_id中1-10000的放在oc_user1中,10000-20000的放在oc_user2中以此类推。还有中常用的hash取模分,将user_id分在两个表中,取模为1的放在表1中,取模为2的放在表2中。水平切分的优点也很明显,表关联基本能够在数据库端全部完成,不会存在某些超大型数据量和高负载的表遇到瓶颈的问题,只要切分规则能够定义好,基本上较难遇到扩展性限制。缺点是后期数据的维护难度有所增加,人为手工定位数据会很困难,应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难。
所以分库可以降低我们单点机器的负载;而分表提高了数据操作的效率,尤其是Write操作的效率。
总结
以上主要从mysql在大数据量时常用手法做介绍,像一般小数据量的网站,优化自己的sql语句即可,通过相应的工具,查找出自己网站访问速度慢的瓶颈在哪里,是sql语句慢、还是代码复杂度导致的等等,究其根本,才能解决问题~
转载于:https://my.oschina.net/botkenni/blog/915923
小型网站到大型网站-Mysql优化相关推荐
- mysql静态化设计_网站静态化与mysql优化
一.伪静态 1.正则表达式的回顾 (1)要求取出练习的4个数字 (2)要求取出,形式为:xxx-yyy-xxx的数据 正则中几个概念: 子表达式:简单理解成用小括号括起的部分就是一个子表达式, 捕获: ...
- 网站架构(从小型网站到大型网站的架构变化)
出处:http://blog.csdn.net/anxpp/article/details/51614973 大型网站架构演化过程 1.初始阶段的网站架构网站一开始,使用的人并不多,访问量比较小,使用 ...
- 大型网站 linux,大型网站架构演变
之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的.ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不 ...
- 大型网站架构演变史(含技术栈与价值观)
这篇文章是参考李智慧的<大型网站技术架构:核心原理与案例分析>和现蘑菇街CTO曽宪杰的<大型网站系统与Java中间件实践>写的一篇读书笔记. 前言 何谓大型网站?大型网站的特点 ...
- 大型网站服务器的架构
随着用户访问量的不断增加,网站的后台也会不断变化以应对需求.本文主要从一个小型网站到大型网站的过度与变化来陈述. 1.1 网站后台架构 主要指由web server .应用服务器.数据库.存储.监控等 ...
- 1. 大型网站架构演化
如果把上世纪90年代初CERN正式发布Web标准和第一个Web服务的岀现当做互 联网站的开始,那么互联网站的发展只经历了短短20多年的时间.在20多年的时间里, 互联网的世界发生了巨大变化,今天,全球 ...
- 大型网站架构的发展演变过程
大型网站架构的发展演变过程 原文地址 什么是大型网站 如何定义一个网站是不是大型网站,一般我们会从两个纬度去考衡,访问量以及数据量,二者缺一不可. 我们以javaweb为例,来搭建一个简单的电商系统, ...
- 大型网站架构演化历程
http://www.hollischuang.com/archives/728 本文内容大部分来自<大型网站技术架构>,这本书很值得一看,强烈推荐. 大型网站系统的特点 高并发,大流量 ...
- 大型网站后台架构的演变
随着用户访问量的不断增加,网站的后台也会不断变化以应对需求.本文主要从一个小型网站到大型网站的过度与变化来陈述. 1.1 网站后台架构 主要指由web server .应用服务器.数据库.存储.监控等 ...
最新文章
- MVVM框架原理浅谈
- android View.isShown() 和 getVisibility() 的区别
- hdu 5451 Best Solver 矩阵循环群+矩阵快速幂
- Hibernate 缓存
- php吞了throw错误,PHP 异常与错误处理
- iOS 9 适配中出现的坑
- html右下角的广告特效,用jQuery实现网页右下角弹出广告效果
- windows设置定时任务并运行python脚本(windows任务计划)
- 35岁老年程序员的绝地翻身之路
- 每天学命令deletePlaceBlockage
- 第十八次CCF计算机软件能力认证
- 国家高新技术企业,哪些情况将被取消资格?
- 龙芯平台下调试蜂鸣器
- 大数据与传统BI的区别在哪?
- 抖音卖酒该如何操作?抖音怎么引流卖酒
- 拉氏(Z)变换和拉氏(Z)反变换
- Linux 常用SIG信号及其键值
- IDEA个性化设置、必须插件、设置代理,让编程更优雅
- 内蒙古中级职称计算机考试时间,2019年内蒙古中级会计职称考试时间安排
- Metasploit辅助模块服务扫描