公司上个月用户量增加到160W,日活在50W,日请求量在3亿条,并发在4万左右。
我们公司框架用的spring cloud 集成了 nacos 、zuul、xxljob、sharding分库分表、redis、rocketmq。
遇到好多问题:
1、当时买服务器的时候磁盘买小了100G,打日志都不够。有预见性的同学可以先计算一下磁盘用量再购买。
a、nginx使用日志切割sh,每天定时切割,并删除日志
b、nacos日志超级大,每天都有几十个G,因为已经上线,不想重启,索性还是用sh命令去删吧
c、业务日志也是比较大的,入参,出参你得打印吧,而且每个人的开发习惯不一样,为了好定位问题,还是需要的。前期降低留存时间呗。后面服务重启扩大机器磁盘到500G了。
2、自建的redis集群有一台服务进程被机器杀死了,没搞明白这么恢复。宕机半日。
当时用的https://www.cnblogs.com/ywrj/p/9531800.html 文章指导搭建的。是用命令把主备联系起来的。维护成本高
后面索性购买了云redis,对中间件不是非常熟的朋友还是直接买吧,省心。
后面需要修改一下配置,redis删除key的模式调整,我用的是allkeys-lru,反正redis里的数据都是可以被删除的,所以就使用删除所有key中最少命中的规则去删除。
3、遇到服务跑着跑着就卡住了。cpu飚高至100%
定位gc发现youngGC与fullGC是否过于频繁或者耗时过长,从而对症下药。我们下面将对G1垃圾收集器来做分析,这边也建议大家使用G1-XX:+UseG1GC
修改fgc方式为:
-XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:MaxGCPauseMillis=200
4、某台服务出现问题为什么会导致所有流量下降?
谢特,zuul中没有加熔断。度娘了一下随便找了一篇文章,加入熔断。看学习文章总是看见,自己搭建工程的时候总是会漏很多组件。解决单点服务故障导致全服务不能用问题。
5、新问题来了,数据库总是显示高并发压力,事务未提交。数据库cpu100%。
后面发现是2个问题
a:数据库cpu100%,发现大量行扫描。比某次上线多了几个数量级,原先10W/s-100W/s行扫描,现在分分钟1000W/s-10000w/s。这是坑爹呢,一顿索引一顿乱填加,并没有乱用。后面接口做redis优化,不查数据库总好了吧。
最终还是定位出某个接口,索引颗粒度不够,每次查询行扫描几千万行,修改业务逻辑+redis缓存解决。
b:我们使用的服务器容器是Undertow,他有2种线程,1是Io线程一般是核数,最低2个,还有一个是工作线程一般是io线程的8倍。扩大工作线程数解决服务执行任务阻塞问题。解决数据库总是显示高并发压力,事务未提交的问题。
https://blog.csdn.net/zhangjunli/article/details/89207038
持续迭代中