背景
杂货铺的读者如果有留意,之前的博文中有提到自建 Docker 集群的方案。局限于机器数量和配置,我只做了站点的微服务化相关的工作,假设数据中心可靠的前提下,保证了站点的高可用。
不得不说,所有的侥幸心理都会埋下一个地雷,这次也不例外。最近就经常有用户反映,奶油葡萄经常 4xx/5xx 的报错,但每次都是过一会就自动恢复。
排查问题
周末抽空研究了下,发现了两个问题。
第一个是奶油的代码里没有对连接 Redis 做异常处理,当出现异常时,会直接把 Apache 的相关线程挂掉,如果 Redis 在一段时间内(比如一分钟)处于非正常状态,容器中所有的 Apache 相关线程挂掉之后,容器直接挂掉。紧接着,到达 Traefik 的请求陆续无法被处理,产生 4xx/5xx 错误。
第二个问题是 Redis 服务下的容器会莫名挂掉,除了起容器时,留下的几句警告,没有其它线索,就像是有第三方手动触发一样。
1:M 12 May 2019 04:59:14.670 # Server initialized,
1:C 12 May 2019 04:59:14.656 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1, just started,1:C 12 May 2019 04:59:14.656 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo,
1:C 12 May 2019 04:59:14.656 # Configuration loaded,
1:M 12 May 2019 04:59:14.670 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.,
1:M 12 May 2019 04:59:14.670 * Running mode=standalone, port=6379.,
1:M 12 May 2019 04:59:14.670 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.,
1:M 12 May 2019 04:59:14.670 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as