INT 21h

Hi, I am Vladimir Smagin, SysAdmin and Kaptain. Telegram Email / GIT / Thingiverse / RSS / GPG

Логическая репликация в Postgresql

№ 11067 В разделе "Sysadmin" от July 10th, 2020,
В подшивках: , ,

Чтобы полностью понять принцип работы логической репликации нужно прочитать документацию. Если кратко, то логическая репликация передает не бинарные данные, а запросы INSERT, UPDATE, DELETE или их сочетание, что позволяет тонко управлять реплицируемыми данными, а также делать это между разными мажорными версиями СУБД. В моем случае я буду мигрировать с 10й версии на 12ю с маленьким даунтаймом. Вся концепция репликации строится на публикациях изменений и подписках, причем подписчик сам может публиковать данные уже для своих подписчиков.

На реплицируемой базе данных необходимо создать публикатор:

postgres=# \c zabbix 
You are now connected to database "zabbix" as user "postgres".
zabbix=# CREATE PUBLICATION zbx FOR ALL TABLES;
CREATE PUBLICATION

Не забываем в postgresql.conf поставить параметр wal_level = logical. Теперь можно сдампить текущую схему БД в файл, который позже будет залит в целевую БД.

postgres@boroda:/tmp$ pg_dump -h 127.0.0.1 -p 5432 -s zabbix > zabbix_schema.sql

Для уверенности можно проверить состояние публикатора

zabbix=# \dRp
                          List of publications
 Name |  Owner   | All tables | Inserts | Updates | Deletes | Truncates 
------+----------+------------+---------+---------+---------+-----------
 zbx  | postgres | t          | t       | t       | t       | t
(1 row)

А теперь на целевом сервере создадим новую базу, зальем схему и подпишемся на источник данных:

postgres=# create database zabbix;
CREATE DATABASE
postgres=# create role zabbix;
CREATE ROLE

А вот теперь можно и залить схему в новую БД:

postgres@boroda:/tmp$ cat /tmp/zabbix_schema.sql | psql -p 5434 zabbix

Ну вот и пришло время заливаться

postgres=# \c zabbix 
You are now connected to database "zabbix" as user "postgres".
zabbix=# CREATE SUBSCRIPTION zbx CONNECTION 'postgresql://postgres:postgres@127.0.0.1:5432/zabbix' PUBLICATION zbx WITH (slot_name=zbx_slot);
NOTICE:  created replication slot "zbx_slot" on publisher
CREATE SUBSCRIPTION

По умолчанию данные будут автоматически скопированы, но с помощью WITH можно изменить поведение подписки. Обратите внимание, что под репликацию лучше создать отдельного пользователя и ограничить ему доступ по IP в pg_hba.conf, но т.к. оба моих сервера находятся в безопасной среде мне на это пофигу и я копирую данные прямо суперюзером.

Проверим состояние подписки:

zabbix=# \dRs
          List of subscriptions
 Name |  Owner   | Enabled | Publication 
------+----------+---------+-------------
 zbx  | postgres | t       | {zbx}
(1 row)

Проверим начали ли данные передаваться:

zabbix=# select count(*) from hosts;
 count 
-------
    53
(1 row)

Все выглядит просто ништяк, данные перекачались в новое место, теперь можно переключать Zabbix со старой базы данных на новую, а потом просто дропнуть подписку.

Не забудьте перестроить индексы мигрировавшей базы данных:

zabbix=# reindex database CONCURRENTLY zabbix;

Нет комментариев »

Zabbix: monitor days before SSL expired

№ 10870 В разделе "Sysadmin" от December 30th, 2019,
В подшивках: ,

I monitor my SSL enabled domains with automatic discovery feature. On server I placed text file with new line separated domain list /etc/zabbix/scripts/ssl_list.txt, zabbix checking it every minute and creating new items with domains. No empty line at the end! Install jq tool to work with JSON.

See archive file at the end.

Create directory /etc/zabbix/scripts and place 2 files inside: ssl_get_days.sh, ssl_list.txt.
Copy configuration file for zabbix agent /etc/zabbix/zabbix_agentd.d/ssl.conf

Now import XML file with template or create discovery rule by hands:

Good! Good! Add new item prototype

And two triggers “expires” and “expired”

Now wait few minutes and you see your domains in latest data

All files you need at once, just import template data in zabbix web interface.

zabbix_ssl_check.tar

Нет комментариев »

Zabbix calculated item and abschange (change)

№ 10168 В разделе "Sysadmin" от August 9th, 2019,
В подшивках: ,

Last time I wrote to you how monitor your Nginx instance with Zabbix. Now I tell you how to calculate rates from counters.

You looking at something like that in your template

Now create new Item handled

Ok, see at field with formula, it linked with created earlier Item “Nginx Handled”. As said in official documentation abschange shows you a difference between last and current values. Now set Interval to 60 seconds and you have “Handled per minute” value.

Of course, you want to create some Graphics. All people loves graphics!

Нет комментариев »

Zabbix: MySQL to Postgresql migration

№ 9662 В разделе "Sysadmin" от December 28th, 2018,
В подшивках: , , ,

All services containerized by Docker, MySQL and Zabbix containers connected to network “zabbix”.

Start Postgresql container and add it to zabbix network group in Docker, set parameters as you need

docker run --name postgres -d --restart=Always \
    -e POSTGRES_USER=postgres
    -e POSTGRES_PASSWORD=postgres
    postgres
docker network connect zabbix postgres

Now create database and user

docker exec -it postgres su -c "createuser -P zabbix" postgres
docker exec -it postgres su -c "createdb -E UTF-8 -O zabbix zabbix" postgres

Ok, database online and accessible for Zabbix services.

Now you can stop old containers with Zabbix services for MySQL and run migration

docker stop zabbix-server-mysql zabbix-panel-mysql
docker run --network zabbix --rm -v /tmp/zabbix:/zabbix dimitri/pgloader:latest \
    bash -c "pgloader --debug --verbose \
    mysql://root:pa55w0rd@mariadb/zabbix \
    postgresql://zabbix:zabbix@postgres/zabbix"

Lets create script to start new Zabbix containers for Postgres DB

!/bin/bash

alertscripts="/srv/docker/zabbix/alertscripts:/usr/lib/zabbix/alertscripts"
externalscripts="/srv/docker/zabbix/externalscripts:/usr/lib/zabbix/externalscripts"

docker run --name zabbix-server-pg -p 10051:10051 \
    -v $alertscripts \
    -v $externalscripts \
    -e DB_SERVER_HOST="postgres" \
    -e DB_SERVER_PORT=5432 \
    -e POSTGRES_USER="zabbix" \
    -e POSTGRES_PASSWORD="zabbix" \
    -e POSTGRES_DB="zabbix" \
    -d --restart=always \
    --network zabbix \
    zabbix/zabbix-server-pgsql:ubuntu-latest

docker run --name zabbix-panel-pg -p 5001:80 \
    -e DB_SERVER_HOST="postgres" \
    -e POSTGRES_USER="zabbix" \
    -e POSTGRES_PASSWORD="zabbix" \
    -e POSTGRES_DB="zabbix" \
    -e ZBX_SERVER_HOST="zabbix-server-pg" \
    -e ZBX_SERVER_PORT="10051" \
    -e PHP_TZ="Asia/Novosibirsk" \
    -d --restart=always \
    --network zabbix \
    zabbix/zabbix-web-nginx-pgsql:ubuntu-latest

You did it! Take a cookie from shelf.

Нет комментариев »

Zabbix automatic discovery and monitoring Docker containers

№ 9617. В разделе " Sysadmin " от December 2nd, 2018

В подшивках: , ,

Яндекс.Метрика

Fortune cookie: A man was once heard to boast, That he received a parcel by post, It contained, so we heard, A magnificent turd, And the balls of his grandfather's ghost.