五年前,我在CNBLOG写的一篇文章,《php+mysql下,对网站架构方面的一些认识(以我维护的站点为例)》,当然,整套架构不是做的,而是配合当初的运维部门,共同完成。那个时候我从入行PHP两年,对所谓的“架构”也是懵懂。只觉得很深奥,很高大上。那时候,架构师,那简直就是神一般的职位。

当时,这篇文章被很多站点收录,诸如:51CTO、CSDN等这样的大站,也有很多小站。不过文章中,我已经去掉了很多的配图,因为可能涉及到安全因素。在当时看,架构还是蛮不错的。但是也存在较多问题。

放眼现在,我们可以重新整理这套架构

  • 找到可以优化的地方

  • 找到替代的方案

需要思考地方

我们先来看下架构图:

从上图,我们分两大部分,分析:

  • 左侧的程序代码同步

  • 右侧的架构

如何优化

现有做法:

从版本管理工具拉取最新代码,除去.svn标记等文件,同步到生产环境

svn拉取最新代码 -> 测试服务器 -->rsync同步--> 生产环境

存在的问题:

1、采用svn进行版本管理,不利于团队协作开发;经常会出现修改的文件又被之前的覆盖了,白做了

2、在项目较大的情况下,所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,这个.svn文件会巨大,
svn是按照文件进行比较的,会占用很大资源

进一步优化:

使用SVN进行版本管理,和程序发布,不方便进行测试环境和生产环境的代码区分,麻烦点,可以解决

trunk->tag

trunk的发布到测试环境

tag的发布到生产环境

tag的程序均是经过测试通过的,由trunk合并过来的

最优方案:

采用git版本管理工具

svn 与 git 的区别

  • 最核心的区别Git是分布式的,而Svn不是分布的。svn必须联网进行操作。好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交。

  • GIT把内容按元数据方式存储,而SVN是按文件。你会发现有个.svn 这个文件会越来越大。

  • GIT分支和SVN的分支不同。分支在svn中并不突出。常见的就是branch,它是一个完整的目录。而git的特征就是分支。

SVN的特点是简单,使用一个中央版本库。

Git的对分支和合并有更好的支持,这是开发者最关心的。

具体做法:

1、建立两个分支:master 和 develop
2、master用于生产环境,develop用户测试环境。
3、master分支禁止被提交(commit、push),只准从develop或hotfix(线上bug)合并而来。
4、服务器上写一个shell脚本,用来做两件事,一是拉取最新代码,而是rsync同步代码

剩下的是团队成员开发协作、以及发布流程相关问题。

1、如何协作开发?参考这篇文章 Git 在团队中的最佳实践--如何正确使用Git Flow,写的很不错。很多公司在此基础上进行优化和改进

2、发布流程,我这里草拟了一份,增加了一个pre_product预发布分支。可能在你公司就不适合,请酌情调整。

我们用的是Teambition项目管理工具,可以新建个TAB,如:opend、working on、pull request、review、

merged、done。任务有技术负责人下发,成员认领开发。

代码审查

你Google一下Code Reivew这个关键词,你就会发现Code Review的好处基本上是不存在争议的,有很多很多的文章和博文都在说Code Review的重要性,怎么做会更好,而且很多公司在面试过程中会加入“Code Review”的问题。

但是,我们经常会遇到这种情况:

1)工期压得太紧,时间连coding都不够,以上线为目的,

2)需求老变,代码的生命周期太短。所以,写好的代码没有任何意义,烂就烂吧,反正与绩效无关。

其实,我认为这是很不负责任的。后面,我们会用大量时间来解决之前本不该发生的问题。

架构优化

LVS部分可以使用nginx的反向代理去实现,道理与LVS相同。用户请求到代理服务器,nginx代理服务器分发请求到后端WEB,我找了个图,方便大家去理解

nginx特点

nginx性能好,承担高的负载压力且稳定,可以负载超过1万的并发。

工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;

Nginx对网络的依赖比较小;

Nginx安装和配置比较简单,测试起来比较方便;

Nginx对请求的异步处理可以帮助节点服务器减轻负载;

LVS的特点

抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生;

配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;

工作稳定,自身有完整的双机热备方案;

无流量,保证了均衡器IO的性能不会收到大流量的影响;

LVS需要向IDC多申请一个IP来做Visual IP,因此需要一定的网络知识,所以对操作人的要求比较高;

具体看你的业务情况,使用nginx或者lvs。当初公司的日均PV均超过100W,所以采用的是LVS方案+双机热备

集群优化

架构图上是两主两从MMM (Master-Masterreplication manager for MySQL)。其实很长情况下,是一主三从模式。只有在master1宕机的情况下,才启用master2。

主从复制

MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。

每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。

从架构图中我们可以分析,在大并发量较大的情况下,会出现主从复制延迟这种问题,如何解决?目前已经有了比较成熟的方案。

主从复制原理图

步骤1: 所有数据更新都会被主库记录到主库的二进制日志。

步骤2: 与此同时从库的IO线程会从主库上读取二进制日志,写入到从库的中继日志上。

步骤3: 从库的SQL线程读取中继日志上的内容来更新从库。

造成延迟的原因

1、并发较大的情况下,master产生的DDL和DML数量大于salve的可接受数。从库的Slave_SQL_Running是单线程作业,不能并发执行,所以当主库的TPS并发较高时,就容易产生延迟。

2、slave将主库的DDL和DML操作在slave实施。DML和DDL的IO操作是随即的,不是顺序的,成本高很多,还可能可slave上的其他查询产生lock争用,所以一个DDL卡主了,需要执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延时

如何解决

1、减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行

2、主库写对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的数据安全,完全可以将sync_binlog设置为0或者关闭binlog,innodb_flushlog也可以设置为0来提高sql的执行效率

3、使用比主库更好的硬件设备作为slave

4、使用mysql5.7 参看 《MySQL 5.7 并行复制实现原理与调优》

对一个“老”架构的重新思考相关推荐

  1. 一个“老”程序员的思考

    本文是一位40岁老程序员对职业生涯的思考,建议多学习接触新事物,将精力投入到衰竭期比较长的知识领域,这些都是很有建设性的.下面是大意译文: 我是一个程序员,几个月前刚过完害羞的四十岁生日.这是一个星期 ...

  2. 一个老程序员的心里话(转载)

    1.希特勒地堡与cih病毒 99年4月,我来到北京参加研究生复试.复试完了之后就不回去了,我拿着一张光盘,里面刻着我用vb和authorware3.5编的一个cool 3d的教学软件,到处参加招聘会, ...

  3. “创业吃过饼,国企养过老” 架构师的头发不是一天掉完的!

    "创业吃过饼,国企养过老" 架构师的头发不是一天掉完的! https://blog.csdn.net/Androidxox/article/details/114640508 床上 ...

  4. 风雨十年:一个老程序员的心里话!

    风雨十年:一个老程序员的心里话!   曲折的实践之路   1.希特勒地堡与cih病毒   99年4月,我来到北京参加研究生复试.复试完了之后就不回去了,我拿着一张光盘,里面刻着我用vb和authorw ...

  5. 【转】一个老程序员的心理话

    思考再三,还是决定把这篇文章给贴出来,话不多说,直接看文章吧. 风雨十年:一个老程序员的心里话! 曲折的实践之路 1.希特勒地堡与cih病毒 99年4月,我来到北京参加研究生复试.复试完了之后就不回去 ...

  6. 腾讯组织架构整改引思考:中小团队要怎样搭建架构?

    原文网址:https://www.infoq.cn/article/UoWc9uUtVIrm-azWOglu 2019 年 1 月 4 日,腾讯宣布成立技术委员会,也代表之前宣布的架构调整终于拉开序幕 ...

  7. [值得学习]售前工程师的成长---一个老员工的经验之谈(一)

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.[url]http://zhaisj.blog.51cto.com/219066/47 ...

  8. 售前工程师的成长(五)---一个老员工的经验之谈

    售前工程师的成长---一个老员工的经验之谈 此文章来自http://zhaisj.blog.51cto.com 感谢经验分享   <续> 一.             写方案要有自己的特点 ...

  9. 软件体系结构设计文档_一个java架构师是如何设计出一个好的架构的

    一.架构的定义 所谓一千个架构师中有一千种"最好的架构"模式. "架构"是我们行业中非常普遍的词,表示它也必须是经过长时间磨合后形成的词. 架构一词的含义是什么 ...

  10. 需求与问题——一个老现象

    今天,和一个在成都的人谈了一个项目的情况,对方一直坚持他们对需求很清楚,我对他说,你们清楚的不是需求,你们清楚的只是问题或者说目标. 过程是这样的: 对方提到: 目前的粮库经常生虫,每过不知道多长时间 ...

最新文章

  1. powershell创建iis站点、应用程序及应用程序池
  2. Centos7上安装 elasticsearch-6.2.2及相关插件
  3. from表单中 action的后面 内如果是 servlet的虚拟路径的话
  4. mac mysql 安装日志_Mac 安装 MySQL
  5. vue-router常见问题解决方案。(滚轴回到顶部、页面跳转同一页面报错、手机电脑端路由跳转)
  6. C# 的扩展方法在 LINQ 中实现数组排序
  7. C语言,功能一、利用一维数组和选择法对成绩高低排序,功能二、输出对应的学号,功能三、查找对应学生成绩
  8. 【心路】谈谈最近的一些想法吧
  9. java代码程序流程思想_控制执行流程——java编程思想第4章
  10. rac节点频繁重启的问题分析
  11. windows 使用自带的cmd终端进行文件MD5校验
  12. vim字符串替换命令
  13. Maven下载安装旧版本
  14. Win10锁屏壁纸位置在哪?默认锁屏壁纸怎么提取
  15. Java中get和set的作用、用法
  16. 香蕉树上第六根芭蕉——PCA算法python实现和思考-站在巨人肩膀上
  17. 怎样清理软件卸载残留文件和系统垃圾
  18. Accelerate Activity Tracker隐私政策
  19. 计算机系学霸表白,高级暗语表白 学霸隐藏式表白
  20. Altium Designer Summer 09快捷键

热门文章

  1. 计算机系统结构02325知识点,02325计算机系统结构复习资料.doc
  2. python课设带报告_python实时投票系统的课设报告
  3. 中缀表达式求值、后缀表达式求值、中缀转后缀、前缀
  4. 能运行c语言的最便宜电脑配置,低配置电脑流畅运行Win7的技巧
  5. ubunt Linux nginx,linux ubuntu系统安装nginx教程
  6. 学了python的感悟_初学python之感悟
  7. 以下哪些可以成为html文件的扩展名_今天在我的visual studio code里装了以下插件,现在用着很爽...
  8. 电脑常用音频剪辑软件_常用手机视频剪辑软件
  9. php使用switch语句编写程序,PHP控制语句之“switch”语句实例详解
  10. 翻译: 自动驾驶汽车技术:自动驾驶汽车如何工作?