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

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

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

    背景:

    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  
       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  
       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
    阿里云有突发性服务器,这个可以考虑一下
    zfy941
        25
    zfy941  
       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 这种框架再说高并非
    HiCode
        29
    HiCode  
       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  
       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  
       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   ·   实用小工具   ·   5306 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:40 · PVG 16:40 · LAX 00:40 · JFK 03:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.