生产环境遇到一个问题,基于 postgresql 轻量消息特性 做的同步方案,使用 pgjdbc-ng 创建的 postgresql
数据库监听,在数据库创建 1 分钟后就会被 close 掉,无法保持长连接。
1 本地运行工程连接同一个数据库,连接会话正常,未被关闭,问题无法复现
2 同样的镜像包在虚拟机上 docker run ,连接正常 无法复现,
3 生产环境(华为云),程序启动 连接第一次创建成功后 1 分钟关闭
服务运行指定的环境参数也是一样的,
给我整不会,我一直以为 docker 是可以完全屏蔽环境问题的。
1
Worldispow 2023-08-09 16:19:04 +08:00 via Android
docker 屏蔽的软件自身的依赖环境。
网络环境、外部程序环境天王老子来了也屏蔽不了。 |
2
DdDddDlush 2023-08-09 16:28:21 +08:00
你这是网的问题
|
3
clifftts OP @Worldispow 网络环境,外部程序这些是屏蔽不了,毕竟这些都不在 image 之内,但是同样的 image 和外部服务,image 运行起来应该是同样的结果
|
4
clifftts OP @DdDddDlush 如果是网的问题,我想应该是连接超时,连接报错或者其他,而不是能连接并且有规律的会话结束
|
5
shyrock 2023-08-09 16:39:26 +08:00
你是把你的数据库和应用打包到一个镜像里面吗?如果这样我理解才能保证依赖环境一致。
|
6
xiaooloong 2023-08-09 16:44:02 +08:00
极端条件下可能遇到 libc 的兼容性问题。说是 libc 一半在内核一半在 os ,之前有人遇到过主机 gnu libc 容器 musl libc 炸了,还有甚至都是 gnu libc ,内外 os 不同的发型版导致的 libc 差异炸的。
——反正我是没遇到(因为遇到了也不会判断 |
8
vmlinz 2023-08-09 16:50:27 +08:00
需要先搞清楚你在华为云上的具体运行方式,是虚拟机里面运行 docker ,还是华为云的调度平台,还是 k8s 这样的 docker 调度平台?
不同调度平台会有不同的内部行为,比如如果是虚拟机上运行 docker ,按道理和你本地行为应该会保持一致。 |
9
clifftts OP @xiaooloong 应该没那么幸运遇到极端问题
|
11
vmlinz 2023-08-09 16:54:13 +08:00
有的所谓 serverless docker 运行方式,实际上是有要求你的服务是 stateless 的,或者 fault tolerant ,要求你自己处理好容器关闭,重启之类的生命周期。你目前这种情况,就是华为云可能是在没有活跃链接的时候会自动关闭容器,有了流量后再重启接受链接,这种情况,你可能需要一个 sql proxy 来保持数据库连接。
|
12
vmlinz 2023-08-09 16:57:34 +08:00
@clifftts 这种情况,你需要看 k8s 的 event log ,看看你的 service pod 是否有重启的情况,PostgreSQL 你如果部署到 k8s ,可能需要一些官方的 helm chart 来部署。最好是是用 managed postgressql ,不要在 k8s 里面自己部署 postgresql 这样的有状态服务,运维复杂度提升了很多。
|
13
vmlinz 2023-08-09 17:00:58 +08:00
@clifftts 另外开发环境,你可以使用本地 k8s 来和远程环境保持一致,比如 minikube ,microk8s ,k3s 之类的本地环境。
|
14
lmshl 2023-08-09 17:02:44 +08:00
以前遇到过类似问题,k8s 网络组件没配置好,过早 drop 掉了一些路由信息,导致长链接失效,不确定你遇到的和我是不是同一个问题
|
15
ch2 2023-08-09 17:07:59 +08:00
容器只是利用了 linux 的 userspace 和 kernel 分得很开的设计发明的产物,但是如果你的代码跑的 userspace 跟 kernel 版本差的太远还是不行的,需要直接跟 kernel 打交道的也不行
|
16
clifftts OP @vmlinz 谢谢,应用服务是华为云 k8s+docker ,检查了 eventlog 没有被重启过,而且服务启动 1 分钟就会关不数据库连接 但是应用服务是正常工作的,关闭数据库连接程序内有 close 方法回调,我目前是 close 的时候重新建立连接,pg 是华为云的服务 docker-compose 部署
|
17
clifftts OP |
18
codehz 2023-08-09 19:16:11 +08:00 1
要不你先看下是不是生产环境数据多了,内存需求也变多了
|
19
julyclyde 2023-08-11 12:57:07 +08:00
不能完全
举个例子,inotify instance 资源,就无法隔离 |