首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
宝塔
V2EX  ›  程序员

大并发下 PHP +Laravel 的部署架构应该是怎样的?

  •  
  •   HaroldChen · 189 天前 · 3843 次点击
    这是一个创建于 189 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:

    1. 公司的开发语言是 PHP, 大部分业务是 php7+laravel5, 小部分是 php5+laravel4。
    2. 电商类,日常 tcp 并发连接在 1.5W 左右,赶上活动,tcp 连接数短时间会达到 10W+。现在是靠机器去堆,但高峰期还是会看到 php-fpm 经常 cpu 100%,且 php-fpm 的端口健康检测失败。已排除数据库层面的问题。xhprof 之类的代码分析目前暂时没精力去看,以后会关注。
    3. 目前正在进行服务化,已经拆出的服务数量在 10 个左右。

    目前部署的架构是每个服务都购买单独的服务器(访问量最大的一个业务,用了 20 台左右的服务器支撑),每台服务器上面部署 Openresty + php-fpm,代码也在每台服务器发布。

    现在其实每台服务器的冗余比较严重,非高峰期的负载不需要这么多服务器。所以考虑换一种方式,前端负载均衡(阿里云 SLB ) -> Openresty 集群(每台上都有所有业务域名的配置文件) -> php-fpm 集群 ,每台服务器只负责一个服务的运行。并发量大的时候直接扩容 php-fpm 服务器的个数。

    问题:

    1. 想请教下,这种部署方式有问题吗?现在主流的部署结构是怎样的?
    2. 以前的那种部署方式,哪里支撑不住只会影响单个业务。现在这种部署方式如果并发上来,怎么去判断是哪个业务造成的?(查看各个业务的 pv 和 qps?)
    3. 目前也在进行容器化的改造,想问下 php 部署一般是什么形式,sidecar?
    52 回复  |  直到 2019-05-15 08:51:56 +08:00
        1
    jowan   189 天前
    可以尝试下抛弃 php-fpm 使用 Swoole 加速一下 Laravel qps 会有很明显的提升
    第三方包有 LaravelS 无侵入式的 成本最小
        2
    mamahaha   189 天前   ♥ 1
    很多服务器不是可以按小时计费吗?高峰期加点按小时计费的啊。
        3
    bestkayle   189 天前 via iPhone
    用 go 重构😏
        4
    Varobjs   189 天前
    好奇这么重大的决定,会让一个到 v2 上找解决方案的人来搞吗,/233
        5
    RickyC   189 天前 via iPhone
    @Varobjs 没有不可能。你知道楼主是谁。
        6
    xrlin   189 天前 via iPhone
    并发量这么大?哪家大公司?
        7
    HaroldChen   189 天前
    @mamahaha 现在考虑的是上述两种部署方式怎么去选。
        8
    HaroldChen   189 天前
    @Varobjs 哈哈,只是想拓宽一下思路,看看大家怎么做的,取长补短。
        9
    HaroldChen   189 天前
    @jowan thx,从语言框架上优化性能短期可能不会考虑。部署的思路上面有推荐吗?
        10
    myvyang   189 天前
    1. 负载均衡的集群挂了的话会导致全部业务挂掉。因为负载均衡集群的配置都是 copy 的,某些 BUG 会导致全部 hang 住。但是应该大公司业务都走这种模式的,方便管控。

    2. 查看各个业务的 pv 和 qps? 每个服务的 API 记录下调用量,做个大盘,除了看请求的暴增,更有意义的是,如果交易下跌,可以立马看到是哪出了问题。
        11
    Immortal   189 天前
    好奇你们这边数据库的架构
    前面 20 台 php
    那数据库呢 几台 主从和缓存架构
        12
    dylan   189 天前
    用 Docker 集群部署。或者做阿里云的 ECS 自动化部署,需要的时候就自动增加服务器。
        13
    polymerdg   189 天前
    比較好奇 數據層 是怎麼設計的 一般幷發問題 瓶頸都在數據層
        14
    sagaxu   189 天前 via Android
    不要问,问就是够浪
        15
    realpg   189 天前
    @Varobjs #4
    人家也是有一系列备选方案的 只是上来问问其他类似经验的 哪种好 有什么坑
    而不是纯按照 V2 内容来做
        16
    HaroldChen   189 天前
    @myvyang thx, 我也觉得集群模式方便管理及扩缩容。服务器上基础组件的版本都是一致且运行了很长时间的,所以 bug 这个问题就不在考虑范围内了。
        17
    yzhfd   189 天前
    单台服务器的极限是多少?我觉得架构是其次的,主要是看瓶颈在哪?有针对性的优化。 如果是活动的话,10W 的并发,是否考虑用缓存中间件?个人感觉 20 台机器是有一定浪费的。
        18
    HaroldChen   189 天前
    @realpg 谢谢理解,您说的对。想看看大家遇到这类问题时会怎么考虑,每一句话都可能是一个新的思路。
        19
    realpg   189 天前   ♥ 2
    @HaroldChen #18
    这么大规模还用 laravel 真不如 java 了……
    我一直是反 laravel 这种重型框架的 真要这么开发还不如用 java 去 性能更高 轮子更多 开发更快
    把 PHP 的优点严重抑制 弄得更像别人
        20
    HaroldChen   189 天前
    @yzhfd thx,性能分析这块确实要做。每次并发量上来,php-fpm 一定是 cpu 100%的。缓存目前涉及到的有 cdn, lua, opcache, redis。
        21
    HaroldChen   189 天前
    @realpg 哈哈,其实我也觉得... 但短时间内重构又不太现实,所以只能先从架构上看看了。
        22
    zjsxwc   189 天前
    楼主的问题是平时不搞活动时这么多服务器浪费钱,应该怎么省钱。

    某些答主的回复是换语言。

    233333
        23
    keikeizhang   189 天前
    我朋友所在公司开始是 PHP,然后开始前后端分离,等分离完毕,用户开始猛增,然后用 JAVA 去替换频率高的 API,差不多用 1 年多时间,整个项目用 JAVA 重构完毕,中间 PHP 也保持对新功能更新,踩坑修复为 JAVA 提供不错的重构参考。

    如果想从根本解决问题,可以参考一下。
        24
    keikeizhang   189 天前
    阿里云有突发性服务器,这个可以考虑一下
        25
    zfy941   189 天前
    别问 问就是别用 PHP
        26
    eluotao   189 天前   ♥ 5
    肯定不是 PHP 的问题 这个流量 PHP 完全吃得下 最讨厌说换语言的人 虽然这也是种解决方案.

    但你要知道 自己辛辛苦苦 日日夜夜培养出来的孩子 一下说这个不要 再生一个...如有比喻不当 别喷 ..
        27
    MakeHui   189 天前
    按你的情况来说,也就弹性扩容比较符合你的需求了
    ~~高并发场景确实真不应该用 laravel~~
        28
    shehuizhuyi   189 天前
    去掉 laravel 这种框架再说高并非
        29
    HiCode   189 天前   ♥ 1
    laravel 可用于学习,不建议用于实际项目。
        30
    csbde   189 天前 via iPad
    我觉得先优化吧,感觉优化不到位。前面一项目 laravel5 做的,每小时大约 600 万请求,一个请求会有几个到 10 几个的数据库请求,查询居多,写入大约 1/10,有 api 也有 web,一台 5 核 16g 的做主 web,一台 4 核 16g 计算实例做负载平衡,数据库单独服务器。就能撑下来了。前期我们没有优化好,用了大约 8 台做负载。所以语言不是太大的问题,也许用 java 做会有一些收益,但不是决定性的。
        31
    dadade   189 天前
    先不考虑换掉 laravel 和 php 问题的,想到的几个思路:
    1.从业务出发,你们电商系统最耗费资源的逻辑在哪儿?执行代码耗 cpu 还是其他的?耗费资源的业务单独拆分出来,再优化这个业务,这个业务是否有更好的方案?其他语言或者组件?
    2.单个服务器的性能是否已经优化到极致?
    3.大流量的应急预案是什么?
        32
    avenger   188 天前 via iPhone
    10w 并发要 20 台服务器吗?找到瓶颈在哪才能有优化方案,楼上说换语言的真是站着说话不腰疼
        33
    sagaxu   188 天前 via Android
    @eluotao 孩子?我觉得拿鞋子类比更合适,鞋子不合脚了,可以改一下,也可以换一双。
        34
    realpg   188 天前
    @avenger #32
    用 laravel 的话 20 台可能都不够……
        35
    akira   188 天前
    如果是要省钱的话 突发性能实例 考虑下
        36
    yc8332   188 天前   ♥ 1
    可以用常驻进程的方式来提高下性能,或者换个轻量级框架,laravel 是比较有难度
        37
    andychen1   188 天前 via iPhone
    可以去网上找找框架性能对比图,你就知道了,(坏笑
        38
    yiqiao   188 天前
    @andychen1 关于性能问题,作者本人回复 https://medium.com/@taylorotwell/benchmarking-laravel-symfony-zend-2c01c2b270f8
    laravel 确实慢,但是不至于差很多
        39
    rapkey   188 天前
    试一下能回复吗?
        40
    oneonesv   188 天前
    laravel 那性能 rps 能有 20 ?
    和 lumen 比差了不是一点半点

    不想换就上 laravel-swoole 几十倍的提升
        41
    mooncakejs   188 天前 via iPhone
    @realpg 真诚的问,最近用 JAVA 写个小项目,JAVA 有像 laravel migration 这么方便的轮子吗,
        42
    realpg   188 天前
    @mooncakejs #41
    不知道 我不写 java 我写 PHP
        43
    zyh94946   188 天前
    我猜楼主不是开发,估计是 SRE,动不了框架业务逻辑
        44
    haohappy   188 天前
    @keikeizhang “用户开始猛增,然后用 JAVA 去替换频率高的 API ” 你好 换 JAVA 主要是因为性能吗 还是其他原因?
        45
    Caballarii   188 天前
    @mooncakejs 不懂 laravel,写 java 现在就 springboot 一把梭
        46
    zibber   188 天前
    nginx 日志 awk 查一下看一下接口耗时,定向排查一下
    nginx 的并发数 和 php-fpm 的进程数要优化一下
        47
    fuxkcsdn   188 天前
    用容器部署避免资源浪费
    不好改动语言或者语言框架的话,就只能是活动期间加资源硬抗了

    语言改不动也建议改框架,讲真,用过一阵 laravel 后我一直在想,php 都写成这样了,我干嘛不用 java ?比如上面说的 SpringBoot 一把梭,有点 java 基础开发起来肯定比 laravel 快(单从 ide 支持方面,反正调试需要跟踪 laravel 源码的时候,我是真想屎)。20 台服务器的前提下,性能应该也能甩 laravel 一条街以上
        48
    keikeizhang   188 天前
    @haohappy 性能是当时的一部分原因,还有就是 PHP 优秀的程序员少,未来项目扩大,需要的系统肯定有更高的稳定性和性能,显然这方面 JAVA 更好一些。
        49
    fghjghf   188 天前
    不是写 php 的。但 10W+ 并发量不算大吧。socket 吞吐量从来不是瓶颈,瓶颈都是出在 IO 上,主机分配请求、多机读写分离,缓存。注意来者不拒的 io 多路复用,请求过多击穿数据库哦
        50
    hasdream   188 天前   ♥ 1
    php 特性短连接,连接数据库短连接,连接 redis 短连接, 连接 mysql 和 redis 都有持久连接的方法,实际 php 的长连接不是特别靠谱(基于 php-fpm 的),
    优化的话
    1. 使用 Swoole 替代 php-fpm,使用 swoole 要考虑资源回收(关闭文件,请求连接池用完释放等等 我知道 php 是最牛逼的语言,写程序不需要考虑资源释放。)
    2. 暴力优化 php-fpm 和 Openresty 分离 php-fpm 机器开启 tcp 快速回收,tcp 时间戳, Openresty 机器开启开启 tcp 时间戳不开 tcp 快速回收。 开启快速回收 对 NAT 网络环境有概率问题, 局域网内没啥问题(我没测试过).
        51
    mandy0119   187 天前
    @avenger 老哥,20 台抗 10 万并发很菜吗。。。我看他意思是一个频繁调用的业务就要 20 台服务器。 我是用 java 的,这边服务器比较差,2C4G 的机器 抗 2K 并发就满负荷了,业务逻辑还极其简单
        52
    xman99   187 天前 via iPhone
    考虑下用轻量级 lume 框架,替代一些高频接口。优化下性能,lavavel 并发不高情况下,其实短板不大
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4080 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 32ms · UTC 09:23 · PVG 17:23 · LAX 01:23 · JFK 04:23
    ♥ Do have faith in what you're doing.