In diesem Artikel werden die Punkte beschrieben, an denen Sie Ihr eigenes __bgworker-Modul mithilfe der Background Worker Processes-Funktion (im Folgenden: bgwoker) erstellen, die als neue Funktion aus PostgreSQL 9.3 eingeführt wurde, und das __super-einfache Cluster-Verwaltungsmodul, das Sie selbst erstellt haben. Ich werde "pg_promoter" __ vorstellen.
Eine Funktion, die erweitert werden kann, damit vom Benutzer bereitgestellter Code in separaten Prozessen in PostgreSQL ausgeführt werden kann. Als Feature,
Und so weiter. Weitere Informationen finden Sie unter Offizielles Dokument.
Wenn ich meinen eigenen bgworker mache, werde ich drei Punkte einführen, die ich fühlte, als ich es tatsächlich machte.
Es gibt ein Modul namens worker_spi im Contrib-Modul von PostgreSQL, so dass es einfach ist, es zu erstellen, indem man darauf verweist. Da es die minimal erforderlichen Funktionen hat, können Sie Ihren eigenen bgworker erstellen, indem Sie ihn einfach ändern.
_PG_init() Informationen zur Funktion _PG_init (), die beim Laden von bgworker aufgerufen wird.
_PG_init()
void
_PG_init(void)
{
BackgroundWorker worker;
/*Definieren Sie die erforderlichen Parameter usw.*/
/*Von hier aus die Einstellungen für 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;
/*bgworker Registrierung*/
snprintf(worker.bgw_name, BGW_MAXLEN, "pg_promoter");
RegisterBackgroundWorker(&worker);
}
Hier wird der bgworker selbst festgelegt. Darunter sind "worker.bgw_flags" und "worker.start_time" unten zusammengefasst.
--worker.bgw_flags (legt die vom Modul benötigten Funktionen fest)
Wert | Inhalt |
---|---|
BGWORKER_SHMEM_ACCESS | Ermöglichen Sie den Zugriff auf den gemeinsam genutzten Speicher |
BGWORKER_BACKEND_DATABASE_CONNECTION | Kann Transaktionen und Abfragen ausführen |
--worker.start_time (legt fest, wann bgworker gestartet wird)
Wert | Inhalt |
---|---|
BgWorkerStart_PostmasterStart | Beginnen Sie nach der Postgres-Initialisierung |
BgWorkerStart_ConsistentState | Starten Sie, nachdem schreibgeschützte Abfragen ausgeführt werden können |
BgWorkerStart_RecoveryFinished | Referenz/Wird gestartet, wenn eine Aktualisierungsabfrage ausgeführt wird |
Das Erstellen von Funktionen ist nicht auf bgworker beschränkt, aber ich denke, es ist einfach, Code mit __ zu schreiben, der auf andere Programme verweist. In dem als nächstes vorgestellten "pg_promoter" habe ich ihn mit Bezug auf pg_ctl, pgbench, postgres_fdw usw. erstellt.
Ich habe ein ultra-einfaches Cluster-Management-Modul "pg_promoter" mit der Funktion bgworker erstellt. Wie der Name schon sagt, ist "pg_promoter" ein einfaches Modul, das den Standby-Server einfach zum Master befördert (fehlt ihm die Funktionalität?). Die Hauptmerkmale sind wie folgt.
Als bgwoker registrierte Module werden auf die gleiche Weise wie bei der Installation des Contrib-Moduls kompiliert und mit make
, make install
installiert.
Setzen Sie bgworker bei der Registrierung auf "shared_preload_libraries".
postgresql.conf
shared_preload_libraries = 'pg_promoter'
#Das Folgende ist pg_Dies ist ein Einstellungselement, das für den Veranstalter erforderlich ist
pg_promoter.primary_conninfo = 'host=localhost port=15432'
pg_promoter.keep_alive = 5
Nehmen Sie die obigen Einstellungen + Replikationseinstellungen vor.
pg_ctl start -D data
pg_ctl start -D 2data
Betrachtet man den Prozess,
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
Sie können sehen, dass 14113? Ss 0:00 postgres: bgworker: pg_promoter
und bgworker ausgeführt werden.
Mit anderen Worten, "pg_promoter" überwacht das Leben und den Tod des Masters (PID ist 14084) im Hintergrund von PostgreSQL.
Versuchen Sie, den Standby-Server-Prozess in diesem Status zu beenden.
kill -sigkill 14084
Dann nach ein paar Sekunden. ..
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
Ich habe ein Log bekommen und wurde befördert!
Es ist schwer zu verstehen, ob es sich um einen Artikel handelt, also dachte ich: "Ich möchte, dass Sie es versuchen!". Also hatte ich vor, ihn auf Github zu stellen, aber ich hatte nicht genug Zeit, ihn zu geben. Ich werde es bald auf Github setzen, also benutze es bitte!
(Hinzugefügt am 24.12.2013) Veröffentlicht auf github! pg_promoter URL : https://github.com/Masahiko-Sawada/pg_promoter Bitte benutzen Sie es!
Dieses Mal habe ich ein einfaches Cluster-Management-Modul mit der Funktion von bgworker erstellt. Zuerst habe ich es mit Interesse gemacht, aber ich hatte das Gefühl, dass ich, wenn ich es schaffe, ein Cluster-Management-Modul machen könnte, das einigermaßen gut verwendet werden kann. Es ist ungefähr 4 Monate her, seit PostgreSQL 9.3 veröffentlicht wurde, aber da es eine Funktion ist, die verschiedene Dinge tun kann, denke ich, dass in Zukunft verschiedene Module herauskommen werden. Es gibt nicht viele Informationen über bgworker. Bitte beziehen Sie sich darauf, wenn Sie Ihren eigenen bgworker erstellen oder einen anderen bgworker verwenden! Ein schönes Wochenende wünsche ich ihnen!