当前位置: 首页 > 编程日记 > 正文

小型网站到大型网站-Mysql优化

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

背景

好的大型网站都是从小型网站慢慢演变来的,都不是一步就设计好的。现在的淘宝,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

相关文章:

Matlab与线性代数--矩阵的正交分解

本图文介绍了Matlab中对于QR分解的操作。

leetcode--搜索插入位置--python

文章目录题目题目详情示例解题思路思路代码运行结果最佳方案题目 题目详情 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 示…

SQL学习笔记-嵌套查询

嵌套查询定义&#xff1a; 1 .指在一个外层查询中包含有另一个内层查询。其中外层查询称为主查询&#xff0c;内层查询称为子查询。 2 .SQL允许多层嵌套&#xff0c;由内而外地进行分析&#xff0c;子查询的结果作为主查询的查询条件 3 .子查询中一般不使用order by子句&#x…

Matlab与线性代数--矩阵的Cholesky分解

本图文介绍了Matlab对正交矩阵的Cholesky分解操作。

IIS 7启用static JSON文件能POST方法

<?xml version"1.0" encoding"UTF-8"?> <configuration> <system.webServer><handlers><add name"JSON" path"*.json" verb"GET,POST" modules"IsapiModule" scriptProcessor"…

leetcode--在排序数组中查找元素的第一个和最后一个位置--python

文章目录题目题目详情示例解题思路思路代码运行结果最佳方案题目 题目详情 给定一个按照升序排列的整数数组 nums&#xff0c;和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值&#…

Matlab与线性代数--矩阵的奇异值和奇异值分解

本图文介绍了Matlab中有关奇异值与奇异值分解的操作。

那些进入 Alexa 排名前 250 的 WordPress 网站

目前在全球的所有网站中&#xff0c;WordPress占据了接近25%的市场份额&#xff0c;几乎每四个网站中就有一个是使用WordPress搭建的。那么&#xff0c;在全球访问量前250个网站中&#xff0c;又有多少个是使用WordPress搭建的呢&#xff1f;最近&#xff0c;WPMU DEV网站对此进…

转帖:硬盘生产全过程(图)

from&#xff1a;http://www.eygle.com/archives/2004/12/aeeaoaooieuuei.html 1957年IBM公司研制成功的IBM 350&#xff08;RAMAC&#xff09;是第一台真正意义上的硬盘存储器。它由许多片直径为61厘米的盘片组成&#xff0c;盘片由一台电动机带动&#xff0c;只有一个磁头&am…

leetcode--最长回文子串--python

文章目录题目题目详情示例解题思路思路代码运行结果最佳方案题目 题目详情 给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。输入:…

java调用接口

public class DemoTest { public static final String GET_URL "http://112.4.27.9/mall-back/if_user/store_list?storeId32"; //get请求// public static final String POST_URL "http://112.4.27.9/mall-back/if_user/store_list"; public sta…

LSGO:团队学习模式“社群化”讨论!

大家关注LSGO软件技术团队也有一段时间了&#xff0c;容我向大家汇报一下目前团队的工作模式。我们通常是这样的&#xff0c;新来团队的同学我们会按照兴趣进行分组&#xff0c;然后在学长或者我的牵头下带着大家“刷”书&#xff0c;以便新来的同学具备最小核心知识。通常&…

Captaris Workflow 6.0 EventService 执行效率低下的排除。

如果您的Captaris Workflow Event Task执行的间隔时间超过30分钟&#xff0c;客户可能向您抱怨流程效率太低了&#xff0c;这时候你可以准备一个只包含Event Task的模型&#xff08;我已经做了一个&#xff0c;点击此处下载&#xff09;&#xff0c;把它部署到服务器并新建一个…

leetcode--最长公共前缀--python

文章目录题目题目详情示例解题思路代码运行结果最佳方案题目 题目详情 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 输入: ["flower","flow","flight"] 输出: "fl"…

个人知识管理的29个原则--摘录

1、持续的学习成为个人生存和发展的基础。持续学习不一定能带来成功&#xff0c;但不学习一定失败&#xff1b; 2、信息和知识爆炸&#xff0c;在一段时间和时期内&#xff0c;学习的内容必须聚焦。起码要在一个领域内成为专家。 3、你应该学习的内容取决于你的价值观、特长、…

硬铺路、软筑墙:三星移动在中国的新路径

虽然已经来过中国60多次&#xff0c;但是高东真的普通话并不十分“地道”。但是当这个三星移动掌舵者一字一字吐出“三星绝不放弃中国市场”的话语时&#xff0c;与会的媒体几乎都在他脸上读到了一种坚毅——在5月于古北水镇召开的Galaxy S8|S8发布会上&#xff0c;他向数百家媒…

对矩阵分解的粗浅理解之LU分解

** 欢迎大家到Matlab与线性代数专栏中查看相关图文。 ** 本图文从行列式计算出发引出了对矩阵LU分解的粗浅理解&#xff0c;希望对正在学习线性代数的同学有所帮助。

leetcode--删除链表的倒数第N个节点--python

文章目录题目题目详情示例说明解题思路思路代码运行结果最佳方案题目 题目详情 给定一个链表&#xff0c;删除链表的倒数第 n 个节点&#xff0c;并且返回链表的头结点。 示例 给定一个链表: 1->2->3->4->5, 和 n 2.当删除了倒数第二个节点后&#xff0c;链表…

VmWare 与 宿主主机通信 STEP BY STEP (适用于刚開始学习的人)

基本原理 在虚拟机中有三种通信方式&#xff0c;例如以下图所看到的 1. Bridged(桥接模式) 在桥接模式下&#xff0c;VMware虚拟出来的操作系统就像是局域网中的一独立的主机&#xff0c;它能够訪问网内不论什么一台机器只是你须要多于一个的IP地址&#xff0c;并且须要手工为 …

古墓丽影8通关了

大概完了两三周吧&#xff0c;每天玩两个多小时&#xff0c;终于把它通关了。这里谈一下我的感受。 画面、声音非常棒&#xff0c;游戏场景也十分宏大&#xff0c;人物造型也更适合东方的审美观&#xff0c;比古墓7强了不少。人物的花样更多了&#xff0c;操作也非常流畅&#…

如何利用遗传算法进行自变量降维

如何利用遗传算法进行自变量降维 GAOT工具箱下载地址&#xff1a;http://download.csdn.net/download/lsgo_myp/9721624 乳腺癌数据集下载地址&#xff1a;http://download.csdn.net/download/lsgo_myp/9721664

leetcode--括号生成--python

文章目录题目题目详情示例解题思路思路代码运行结果最佳方案题目 题目详情 给出 n 代表生成括号的对数&#xff0c;请你写出一个函数&#xff0c;使其能够生成所有可能的并且有效的括号组合。 示例 例如&#xff0c;给出 n 3&#xff0c;生成结果为&#xff1a;["(((…

smarty的简单分页

以下是模板中的smarty代码,用smarty简单的代入相关的变量就行了&#xff0c;非常简单&#xff0c;但是在php代码中还要传入page这个参数。我觉得这样分挺好&#xff0c;非常简单。我越来越喜欢用smarty了 {if $pageCount > 1} {foreach itemi from$pagerList} {if $pageN…

如何利用遗传算法进行自变量降维(代码部分)

如何利用遗传算法进行自变量降维&#xff08;代码部分&#xff09; main.m 主函数 输入自变量优化适应度子函数 fitness.m 输入自变量优化编码解码子函数 de_code.m BP网络权值和阈值优化适应度子函数 gabpEval.m BP网络权值和阈值优化编码解码子函数 gadecod.m 输出结果

unity3d教程运行物理机制

首先&#xff0c;我们将把Hooke定律写Euler方法结合在一起找到新坐标、加速和速度。Hooke定律是Fkx&#xff0c;这里的F是指由水流产生的力&#xff08;记住&#xff0c;我们将把水体表面模拟为水流&#xff09;&#xff0c;k是指水流的常量。x则是位移。我们的位移将成为每一个…

leetcode--电话号码和字母组合--python

文章目录题目题目详情示例解题思路思路代码运行结果最佳方案题目 题目详情 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 输入&#xff1a…

轻松记账工程冲刺第二阶段10

昨天干了什么&#xff1a; 对页面进行优化测试&#xff0c;对软件进行测试&#xff0c;找出bug&#xff0c;并调试bug 今天准备干什么&#xff1a; 测试完成后&#xff0c;进行应用的发布。注册应用商店账户&#xff0c;然后对apk进行加固签名&#xff0c;并进行发布等待审核。…

Matlab与线性代数 -- 矩阵的范数

本图文介绍了矩阵的范数以及在Matlab中的具体操作。

leetcode--罗马数字转整数--python

文章目录题目题目详情示例解题思路思路代码运行结果最佳方案题目 题目详情 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L …

如何利用azMan (Authorization Manager) 实现 role-based的安全验证机制

在WCF中如何配置基于asp.net role的授权机制&#xff0c;看了些时日&#xff0c;总算有点眉目了 。 以下是一个典型的通过自定义的role-based (principalPermissionModeUseAspNetRoles)来进行授权的WCF service config file. Code<?xml version"1.0" encoding&q…