[LINUX] Gestion de cluster super simple avec bgworker

Dans cet article, les points lorsque vous créez votre propre module __bgworker en utilisant la fonction Processus de travail en arrière-plan (ci-après bgwoker) qui a été introduite en tant que nouvelle fonction de PostgreSQL 9.3 __, et le module de gestion de cluster __super simple que vous avez réellement créé vous-même Je vais vous présenter "pg_promoter" __.

Qu'est-ce que bgwoker?

Une fonctionnalité qui peut être étendue pour permettre au code fourni par l'utilisateur d'être exécuté dans des processus séparés dans PostgreSQL. En tant que fonctionnalité,

Etc. Pour plus de détails, veuillez vous référer au Document officiel.

Points de bgworker fait maison

Quand je créerai mon propre bgworker, j'introduirai trois points que j'ai ressentis quand je l'ai fait.

Avant de commencer à faire

Il existe un module appelé worker_spi dans le module contrib de PostgreSQL, il est donc facile de le créer en s'y référant. Puisqu'il a les fonctions minimales requises, vous pouvez créer votre propre bgworker simplement en le modifiant.

_PG_init() À propos de la fonction _PG_init () qui est appelée lorsque bgworker est chargé.

_PG_init()


void
_PG_init(void)
{
    BackgroundWorker worker;
        
    /*Définissez les paramètres nécessaires, etc.*/

    /*À partir de là, les paramètres de bgworker*/
    worker.bgw_flags = BGWORKER_SHMEM_ACCESS |
        BGWORKER_BACKEND_DATABASE_CONNECTION;
    worker.bgw_start_time = BgWorkerStart_ConsistentState;
    worker.bgw_restart_time = BGW_NEVER_RESTART;
    worker.bgw_main = pg_promoter_main;
    worker.bgw_notify_pid = 0;
    
    /*inscription bgworker*/
    snprintf(worker.bgw_name, BGW_MAXLEN, "pg_promoter");
    RegisterBackgroundWorker(&worker);
}

Ici, le bgworker lui-même est défini. Parmi eux, worker.bgw_flags et worker.start_time sont résumés ci-dessous.

--worker.bgw_flags (définir les fonctions requises par le module)

valeur Contenu
BGWORKER_SHMEM_ACCESS Autoriser l'accès à la mémoire partagée
BGWORKER_BACKEND_DATABASE_CONNECTION Peut exécuter des transactions et des requêtes

--worker.start_time (définit quand bgworker démarre)

valeur Contenu
BgWorkerStart_PostmasterStart Commencer après l'initialisation postgres
BgWorkerStart_ConsistentState Lancer après avoir autorisé l'exécution des requêtes en lecture seule
BgWorkerStart_RecoveryFinished référence/Lancé lorsqu'une requête de mise à jour est exécutée

Créer des fonctionnalités

La création de fonctions ne se limite pas à bgworker, mais je pense qu'il est facile d'écrire du code avec __ qui fait référence à d'autres programmes. Le "pg_promoter" introduit ensuite a été créé en référence à pg_ctl, pgbench, postgres_fdw, etc.

Module de gestion de cluster super simple "pg_promoter"

J'ai créé un module de gestion de cluster super simple "pg_promoter" en utilisant la fonction bgworker. Comme son nom l'indique, "pg_promoter" est un module simple qui promeut simplement le serveur de secours vers le maître (manque-t-il de fonctionnalités?). Les principales caractéristiques sont les suivantes.

Comment utiliser pg_promoter

Installation de pg_promoter

Les modules enregistrés comme bgwoker sont compilés et installés avec make, make install de la même manière que lors de l'installation du module contrib.

Enregistré dans postgresql.conf

Lors de l'enregistrement de bgworker, définissez-le sur "shared_preload_libraries".

postgresql.conf


shared_preload_libraries = 'pg_promoter'
#Ce qui suit est pg_C'est un élément de réglage requis pour le promoteur
pg_promoter.primary_conninfo = 'host=localhost port=15432'
pg_promoter.keep_alive = 5

Définissez les paramètres ci-dessus + les paramètres de réplication.

Démarrer le serveur, démarrer bgwoker

  1. Démarrez le serveur maître

pg_ctl start -D data

  1. Démarrez le serveur de secours

pg_ctl start -D 2data

En regardant le processus,

14084 pts/2 S 0:00 /home/postgres/pgsql/9.3/bin/postgres -D data 14086 ? Ss 0:00 postgres: checkpointer process 14087 ? Ss 0:00 postgres: writer process 14088 ? Ss 0:00 postgres: wal writer process 14089 ? Ss 0:00 postgres: autovacuum launcher process 14090 ? Ss 0:00 postgres: stats collector process 14105 pts/2 S 0:00 /home/postgres/pgsql/9.3/bin/postgres -D 2data 14109 ? Ss 0:00 postgres: startup process waiting for 000000010000000000000003 14110 ? Ss 0:00 postgres: checkpointer process 14111 ? Ss 0:00 postgres: writer process 14112 ? Ss 0:00 postgres: stats collector process 14113 ? Ss 0:00 postgres: bgworker: pg_promoter 14114 ? Ss 0:00 postgres: wal receiver process streaming 0/3000090 14115 ? Ss 0:00 postgres: wal sender process postgres [local] streaming 0/3000090

Vous pouvez voir que 14113? Ss 0:00 postgres: bgworker: pg_promoter et bgworker sont en cours d'exécution. En d'autres termes, "pg_promoter" surveille la vie et la mort du maître (le PID est 14084) en arrière-plan de PostgreSQL.

Promotion du serveur de secours

Essayez de tuer le processus du serveur de secours dans cet état. kill -sigkill 14084

Puis après quelques secondes. ..

LOG: received promote request LOG: redo done at 0/20000F0 LOG: selected new timeline ID: 2 LOG: worker process: pg_promoter (PID 14113) exited with exit code 1 LOG: unregistering background worker "pg_promoter" LOG: archive recovery complete LOG: database system is ready to accept connections LOG: autovacuum launcher started

J'ai eu un journal et j'ai été promu!

Code source

Il est difficile de comprendre si c'est un article, alors j'ai pensé "Je veux que vous l'essayiez!", Donc j'avais l'intention de le mettre sur github, mais je n'ai pas eu assez de temps pour le donner. Je vais bientôt le mettre sur github, alors utilisez-le!

(Ajouté le 24/12/2013) Publié sur github! pg_promoter URL : https://github.com/Masahiko-Sawada/pg_promoter Veuillez l'utiliser!

Résumé

Cette fois, j'ai fait un simple module de gestion de cluster en utilisant la fonction de bgworker. Au début, je l'ai fait avec intérêt, mais j'ai senti que si je le faisais, je pourrais faire un module de gestion de cluster qui peut être utilisé raisonnablement bien. Cela fait environ 4 mois que PostgreSQL 9.3 est sorti, mais comme c'est une fonction qui peut faire diverses choses, je pense que divers modules sortiront dans le futur. Il n'y a pas beaucoup d'informations sur bgworker, alors veuillez vous y référer lorsque vous créez votre propre bgworker ou utilisez un autre bgworker! Bon week-end!

Recommended Posts

Gestion de cluster super simple avec bgworker
Gestion de routine avec calendrier
Gestion de vidéos YouTube avec Python 3
[GUI en Python] PyQt5-Layout management-
Jeu de frappe simple avec DragonRuby
Gestion des mots de passe avec python: trousseau de clés
Gestion des serveurs avec import Jupyter (1)