kubernetes集群:postgresql挂掉后启动失败:ERROR: tuple already updated by self

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镜像打包过程
详细过程待补充

posted @ 2020-08-14 10:36  邹姣姣  阅读(1022)  评论(0编辑  收藏  举报