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优化相关推荐

  1. mysql静态化设计_网站静态化与mysql优化

    一.伪静态 1.正则表达式的回顾 (1)要求取出练习的4个数字 (2)要求取出,形式为:xxx-yyy-xxx的数据 正则中几个概念: 子表达式:简单理解成用小括号括起的部分就是一个子表达式, 捕获: ...

  2. 网站架构(从小型网站到大型网站的架构变化)

    出处:http://blog.csdn.net/anxpp/article/details/51614973 大型网站架构演化过程 1.初始阶段的网站架构网站一开始,使用的人并不多,访问量比较小,使用 ...

  3. 大型网站 linux,大型网站架构演变

    之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的.ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不 ...

  4. 大型网站架构演变史(含技术栈与价值观)

    这篇文章是参考李智慧的<大型网站技术架构:核心原理与案例分析>和现蘑菇街CTO曽宪杰的<大型网站系统与Java中间件实践>写的一篇读书笔记. 前言 何谓大型网站?大型网站的特点 ...

  5. 大型网站服务器的架构

    随着用户访问量的不断增加,网站的后台也会不断变化以应对需求.本文主要从一个小型网站到大型网站的过度与变化来陈述. 1.1 网站后台架构 主要指由web server .应用服务器.数据库.存储.监控等 ...

  6. 1. 大型网站架构演化

    如果把上世纪90年代初CERN正式发布Web标准和第一个Web服务的岀现当做互 联网站的开始,那么互联网站的发展只经历了短短20多年的时间.在20多年的时间里, 互联网的世界发生了巨大变化,今天,全球 ...

  7. 大型网站架构的发展演变过程

    大型网站架构的发展演变过程 原文地址 什么是大型网站 如何定义一个网站是不是大型网站,一般我们会从两个纬度去考衡,访问量以及数据量,二者缺一不可. 我们以javaweb为例,来搭建一个简单的电商系统, ...

  8. 大型网站架构演化历程

    http://www.hollischuang.com/archives/728 本文内容大部分来自<大型网站技术架构>,这本书很值得一看,强烈推荐. 大型网站系统的特点 高并发,大流量 ...

  9. 大型网站后台架构的演变

    随着用户访问量的不断增加,网站的后台也会不断变化以应对需求.本文主要从一个小型网站到大型网站的过度与变化来陈述. 1.1 网站后台架构 主要指由web server .应用服务器.数据库.存储.监控等 ...

最新文章

  1. MVVM框架原理浅谈
  2. android View.isShown() 和 getVisibility() 的区别
  3. hdu 5451 Best Solver 矩阵循环群+矩阵快速幂
  4. Hibernate 缓存
  5. php吞了throw错误,PHP 异常与错误处理
  6. iOS 9 适配中出现的坑
  7. html右下角的广告特效,用jQuery实现网页右下角弹出广告效果
  8. windows设置定时任务并运行python脚本(windows任务计划)
  9. 35岁老年程序员的绝地翻身之路
  10. 每天学命令deletePlaceBlockage
  11. 第十八次CCF计算机软件能力认证
  12. 国家高新技术企业,哪些情况将被取消资格?
  13. 龙芯平台下调试蜂鸣器
  14. 大数据与传统BI的区别在哪?
  15. 抖音卖酒该如何操作?抖音怎么引流卖酒
  16. 拉氏(Z)变换和拉氏(Z)反变换
  17. Linux 常用SIG信号及其键值
  18. IDEA个性化设置、必须插件、设置代理,让编程更优雅
  19. 内蒙古中级职称计算机考试时间,2019年内蒙古中级会计职称考试时间安排
  20. Metasploit辅助模块服务扫描

热门文章

  1. Android读写XML(上)
  2. C语言的一个关键字——static
  3. 对于广泛依赖外部资源的应用程序,请考虑在多处理器计算机上启用网络园艺
  4. Shiro源码学习之二
  5. bzero, memset ,setmem 区别
  6. VirtualBox虚拟机安装RedHat7.3编译Linux0.01内核
  7. 设计模式之适配器模式(Adapter)摘录
  8. OpenCV中OpenCL模块函数
  9. 图像空间变换--imtransform
  10. 当代的设计潮流是什么_解码“潮流合伙人”IP生意经