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" __.
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.
Quand je créerai mon propre bgworker, j'introduirai trois points que j'ai ressentis quand je l'ai fait.
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 |
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.
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.
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.
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.
pg_ctl start -D data
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.
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!
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!
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