ERROR: tuple already updated by self
早上git访问出现503。经过排查是数据库挂了。
postgresql挂掉了:
postgresql 提供给git作为数据库。使用k8s集群方式部署(部署方式:https://www.cnblogs.com/zoujiaojiao/p/12552233.html)
想通过停止挂掉的pod,然后再启动的方式恢复:
停止pod
kubectl delete -f gitlab-postgresql.yaml
启动pod
kubectl create -f gitlab-postgresql.yaml
该方式启动postgresql失败,查看postgresql容器的日志:
容器失败的最终错误提示:ERROR: tuple already updated by self
拿着“ERROR: tuple already updated by self”百度了一波,只查到:
分析为什么“更新过”
本分析全靠自己猜测。我们使用的是阿里云的postgresql镜像sameersbn/postgresql:9.6-2。镜像中可能有初始化脚本。而我们的postgresql已经启动过,初始化过。初始化的数据应该是存在的,挂掉后重新用原来配置启动数据库,“更新过”说明镜像运行时又执行了初始化,而数据已经存在,所以有冲突。照着这个想法,我采取了以下措施:
看看yaml配置中,有哪些可能是触发初始化的配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgresql
namespace: kube-ops
labels:
name: postgresql
spec:
selector:
matchLabels:
name: postgresql
template:
metadata:
name: postgresql
labels:
name: postgresql
spec:
containers:
- name: postgresql
# image: docker.vonedao.com/bases/postgresql:10
image: sameersbn/postgresql:9.6-2
imagePullPolicy: IfNotPresent
env:
- name: POSTGRES_PASSWORD
value: git0318
- name: DB_USER
value: gitlab
- name: DB_PASS
value: git0318
- name: DB_NAME
value: gitlab_production
- name: DB_EXTENSION
value: pg_trgm
ports:
- name: postgres
containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: gitlab-postgresql-pvc
将猜测的这部分配置注释掉。
重新启动:
停止pod
kubectl delete -f gitlab-postgresql.yaml
启动pod
kubectl create -f gitlab-postgresql.yaml
再次查看postgresql容器日志:kubectl --namespace=kube-ops logs postgresql-75fbb7b9fd-8mllg
可以看到数据库已经启动成功
然后再将git重新启动
# kubectl apply -f gitlab-gitlab.yaml
再次访问已经正常:
求证我分析的是否正确
有两个方式去验证:
1.进入容器查看数据库启动配置
2.到官方网站找到sameersbn/postgresql:9.6-2镜像打包过程
详细过程待补充