大并发下 PHP +Laravel 的部署架构应该是怎样的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
HaroldChen
V2EX    程序员

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

  •  
  •   HaroldChen 2019-05-13 11:23:26 +08:00 7846 次点击
    这是一个创建于 2349 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:

    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
    jowan
        1
    jowan  
       2019-05-13 11:48:23 +08:00
    可以尝试下抛弃 php-fpm 使用 Swoole 加速一下 Laravel qps 会有很明显的提升
    第三方包有 LaravelS 无侵入式的 成本最小
    mamahaha
        2
    mamahaha  
       2019-05-13 11:59:26 +08:00   1
    很多服务器不是可以按小时计费吗?高峰期加点按小时计费的啊。
    KgM4gLtF0shViDH3
        3
    KgM4gLtF0shViDH3  
       2019-05-13 12:55:04 +08:00 via iPhone
    用 go 重构
    Varobjs
        4
    Varobjs  
       2019-05-13 13:00:41 +08:00
    好奇这么重大的决定,会让一个到 v2 上找解决方案的人来搞吗,/233
    RickyC
        5
    RickyC  
       2019-05-13 13:15:52 +08:00 via iPhone
    @Varobjs 没有不可能。你知道楼主是谁。
    xrlin
        6
    xrlin  
       2019-05-13 13:17:05 +08:00 via iPhone
    并量这么大?哪家大公司?
    HaroldChen
        7
    HaroldChen  
    OP
       2019-05-13 13:43:11 +08:00
    @mamahaha 现在考虑的是上述两种部署方式怎么去选。
    HaroldChen
        8
    HaroldChen  
    OP
       2019-05-13 13:45:29 +08:00
    @Varobjs 哈哈,只是想拓宽一下思路,看看大家怎么做的,取长补短。
    HaroldChen
        9
    HaroldChen  
    OP
       2019-05-13 13:48:56 +08:00
    @jowan thx,从语言框架上优化性能短期可能不会考虑。部署的思路上面有推荐吗?
    myvyang
        10
    myvyang  
       2019-05-13 14:02:39 +08:00
    1. 负载均衡的集群挂了的话会导致全部业务挂掉。因为负载均衡集群的配置都是 copy 的,某些 BUG 会导致全部 hang 住。但是应该大公司业务都走这种模式的,方便管控。

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

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

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

    如果想从根本解决问题,可以参考一下。
    keikeizhang
        24
    keikeizhang  
       2019-05-13 15:40:50 +08:00
    阿里云有突发性服务器,这个可以考虑一下
    zfyime
        25
    zfyime  
       2019-05-13 15:42:01 +08:00
    别问 问就是别用 PHP
    eluotao
        26
    eluotao  
       2019-05-13 15:49:16 +08:00   5
    肯定不是 PHP 的问题 这个流量 PHP 完全吃得下 最讨厌说换语言的人 虽然这也是种解决方案.

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

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

    语言改不动也建议改框架,讲真,用过一阵 laravel 后我一直在想,php 都写成这样了,我干嘛不用 java ?比如上面说的 SpringBoot 一把梭,有点 java 基础开发起来肯定比 laravel 快(单从 ide 支持方面,反正调试需要跟踪 laravel 源码的时候,我是真想屎)。20 台服务器的前提下,性能应该也能甩 laravel 一条街以上
    keikeizhang
        48
    keikeizhang  
       2019-05-14 14:41:02 +08:00
    @haohappy 性能是当时的一部分原因,还有就是 PHP 优秀的程序员少,未来项目扩大,需要的系统肯定有更高的稳定性和性能,显然这方面 JAVA 更好一些。
    fghjghf
        49
    fghjghf  
       2019-05-14 15:09:17 +08:00
    不是写 php 的。但 10W+ 并发量不算大吧。socket 吞吐量从来不是瓶颈,瓶颈都是出在 IO 上,主机分配请求、多机读写分离,缓存。注意来者不拒的 io 多路复用,请求过多击穿数据库哦
    hasdream
        50
    hasdream  
       2019-05-14 16:12:29 +08:00   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 网络环境有概率问题, 局域网内没啥问题(我没测试过).
    mandy0119
        51
    mandy0119  
       2019-05-14 18:33:29 +08:00
    @avenger 老哥,20 台抗 10 万并发很菜吗。。。我看他意思是一个频繁调用的业务就要 20 台服务器。 我是用 java 的,这边服务器比较差,2C4G 的机器 抗 2K 并发就满负荷了,业务逻辑还极其简单
    xman99
        52
    xman99  
       2019-05-15 08:51:56 +08:00 via iPhone
    考虑下用轻量级 lume 框架,替代一些高频接口。优化下性能,lavavel 并发不高情况下,其实短板不大
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5550 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 03:36 PVG 11:36 LAX 20:36 JFK 23:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86