zoukankan      html  css  js  c++  java
  • 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镜像打包过程
    详细过程待补充

  • 相关阅读:
    基于WS流的RTSP监控,H5低延时,Web无插件,手机,微信ONVIF操控摄像头方案
    H5微信视频,直播低延时,IOS限制全屏播放,自动播放问题处理。
    最新IOS,safari11中对webrtc支持,IOS和android视频聊天,web低延时视频教学技术分析
    MySql 用户篇
    Sql Server 数据库帮助类
    [C#基础知识]转载 private、protected、public和internal的区别
    Mysql 插入语句
    .net core identityserver4 学习日志
    mysql 事务模板
    .net core 生成二维码
  • 原文地址:https://www.cnblogs.com/zoujiaojiao/p/13500835.html
Copyright © 2011-2022 走看看