Questions fréquentes

Une ou plusieurs images Postgresql ne démarrent plus

Il arrive qu’à l’arrêt (très souvent non prévu) de la stack Datachain, la base de données peut ne plus démarrer, avec comme log d’erreur :

2023-03-24 11:12:35.314 CET [24] LOG: le système de bases de données a été arrêté à 2023-03-17 06:04:58 CET
2023-03-24 11:12:35.314 CET [24] LOG: identifiant du gestionnaire de ressource invalide dans l'enregistrement primaire du point de vérification
2023-03-24 11:12:35.314 CET [24] PANIC: n'a pas pu localiser un enregistrement d'un point de vérification valide

Dans ce cas, procédez comme suit :

  • sur la machine ou se trouve le Postgresql, identifier le répertoire des data de Postgresql :

    • soit c’est un nom de volume monté sur la machine et il est dans le fichier de déploiement docker-compose

    • soit c’est un volume docker, et il se trouve dans /var/lib/docker/volumes/NOM_DE_STACK_NOM_DU_VOLUME/_data (nom de stack issue du démarrage (up.sh ?), et nom du volume le volume dans le fichier docker-compose (potentiellement pg_data). La commande 'docker volume ls' permettra de valider que c’est le bon nom de volume. Exemple sur un fichier :

version: "3.7"
services:
  dc_pg:
    image: dc/pg:dev
    networks:
      dc_network:
        aliases:
          - dc-pg
    deploy:
      mode: replicated
      replicas: 1
    volumes:
      - pg_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=adobis
...

Si le nom de la stack est datachain, alors le volume sera datachain_pg_data, et le chemin /var/lib/docker/volumes/datachain_pg_data/_data.

  • Lorsque le chemin est validé, arrêter la stack.

  • Sur la machine du postgres ciblé, executer la commande suivante.

docker run -it -u postgres -v /var/lib/docker/volumes/datachain_pg_data/_data/:/var/lib/postgresql/data ${REGISTRY}/dc/pg:7.6.0 pg_resetwal /var/lib/postgresql/data/

A noter : vous pourriez utiliser l’image postgres standard 12, cela fonctionnerait aussi. * Redémarrer la stack.

Je souhaite supprimer les mots de passe des fichiers de déploiement docker-compose.yml. Comment puis-je faire ?

Dans swarm, tous les mots de passe de datachain peuvent être stockés directement au niveau du cluster swarm dans "docker secret".

Les variables d’environnement Datachain qui contiennent des mots de passe, ont pour la plupart une seconde variable suffixée par _FILE. La procédure de stockage d’un mot de passe va être la suivante :

  • création du secret dans docker depuis le manager Swarm

$ printf "my super secret password" | docker secret create my_secret -
  • utilisation de ce secret dans le fichier de déploiement (ou le fichier .en, selon votre préférence) et remplacement de la variable d’environnement par la variable suffixée.

version: "3.7"
services:
...
  dc_pg_migration:
    image: dc/pg_migration:dev
    networks:
      dc_network:
        aliases:
          - dc-pg-migration
    environment:
      - PG_HOST=dc-pg
      - PG_PASSWORD=12345
    deploy:
      restart_policy:
        condition: none
    volumes:
      - pg_dump:/data/pg_dump

devient

version: "3.7"
services:
...
  dc_pg_migration:
    image: dc/pg_migration:dev
    networks:
      dc_network:
        aliases:
          - dc-pg-migration
    environment:
      - PG_HOST=dc-pg
      - PG_PASSWORD_FILE=/run/secrets/pg_password
      - PG_EXPOSE_PASSWORD_FILE=/run/secrets/pg_password
      - PG_KC_PASSWORD_FILE=/run/secrets/pg_password
    deploy:
      restart_policy:
        condition: none
    volumes:
      - pg_dump:/data/pg_dump
    secrets:
      - pg_password
...

secrets:
  pg_password:
    external: true
  • Les variables d’environnement sont précisés dans la page dédiée.

J’ai besoin d’ajouter une autorité de confiance ou un certificat serveur pour permettre à Datachain d’accéder à des connecteurs/dépot HTTPS. Comment puis-je faire ?

Les autorités de confiances utilisées par Datachain sont stockées dans le magasin de certificat (keystore) standard de Java.

Il faut donc fournir le JKS à la JVM avec les autorités privées complémentaires.

Le mode opératoire est le suivant :

  • Récupération du jks standard java, à partir d’un conteneur livré, à faire directement sur la machine ou s’exécute le service spark

docker ps
# récupérer l'identifiant d'un conteneur spark
# et le mettre dans la commande suivante
docker cp <idconteneurSpark>:/etc/ssl/certs/java/cacerts /tmp
# Le fichier cacerts de la jvm a pour mot de passe "changeit".
  • Mise à jour du fichier cacerts avec la clé public de l’autorité

keytool -importcert -trustcacerts -keystore cacerts -file clepublique.pem -alias monAutorite
  • Mise à disposition du fichier sur toutes les machines pour le mettre à disposition des images du cluster spark et des conteneurs spark Adobis

  • Mise à jour du/des fichiers docker-compose du cluster spark et de datachain en ajoutant le fichier en tant que volume (mis ici dans un répertoire share/cacerts). Par exemple :

dc_spark1:
    image: ${REGISTRY}/dc/spark:${PROJECT_VERSION}
    networks:
        traefik_network:
        dc_network:
        aliases:
            - dc-spark1
    env_file: spark1.env
    ports:
        - "4040:4040"
    deploy:
        mode: replicated
        replicas: 1
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.dc_spark1.rule=PathPrefix(`/actuator-spark1`)"
            - "traefik.http.routers.dc_spark1.entrypoints=web"
            - "traefik.port=9091"
            - "traefik.docker.network=traefik_network"
            - "traefik.http.services.dc_spark1.loadbalancer.server.port=9091"
            - "traefik.http.routers.dc_spark1.middlewares=dc_spark1-auth@docker"
            - "traefik.http.middlewares.dc_spark1-auth.basicauth.users=adobis:$$apr1$$ba1fhf6J$$nVxNFnb69azCnMzgBlsXP."
            - "traefik.http.middlewares.dc_spark1-auth.basicauth.removeheader=true"
    volumes:
        - /opt/adobis/data/hdfs:/data
        # déclarer comme volume le fichier cacerts.
        - /share/cacerts:/etc/ssl/certs/java/cacerts