Zabbix 5.0 DB migrálás PGSQL 10 -> 12

Sziasztok!

root@tarthost:~# pg_lsclusters 
Ver Cluster Port Status                Owner    Data directory               Log file
9.3 main    5434 down,binaries_missing postgres /var/lib/postgresql/9.3/main /var/log/postgresql/postgresql-9.3-main.log
9.5 main    5432 down,binaries_missing postgres /var/lib/postgresql/9.5/main /var/log/postgresql/postgresql-9.5-main.log
10  main    5433 online                postgres /var/lib/postgresql/10/main  /var/log/postgresql/postgresql-10-main.log
12  main    5435 down                  postgres /var/lib/postgresql/12/main  /var/log/postgresql/postgresql-12-main.log
 

Jelenleg a 10-es verzióval fut, de a TimeScaleDB-hez nem találtam deb csomagokat és mindent a 12-höz akart lehozni, amit
meg is csináltam.

Van valami egyszerű módszer, amivel  a 10-esből a 12-esbe tudnám átvinni a teljes Zabbix DB-t?

A DB jelenelg 69GB, a PG partíció 591GB.

Köszönettel:
Ruzsi

Hozzászólások

En kontenerben futtatom a zabbixot, a 10-esbol csinaltam siman egy dumpot, amit a 12-be behuztam. Mukodik. Bar nekem messze nem volt benne ennyi adat. (meg fontos sem volt igazabol az elozmeny, csak a hostokat voltam lusta ujra felvenni)

A timescaledb egy fizikai tárolóréteg, alapvetően db oldalon nincs jelentősége a dump visszatöltésekor. Javaslom a tesztelését egy másik szerveren előtte elvégezni.

https://www.postgresql.org/docs/10/backup.html

Csomag van hozzá, a fejlesztő PPA tárolója:

https://www.digitalocean.com/community/tutorials/how-to-install-and-use…

 

Alaposan meg kell nézni a verziókat is, nem minden és legújabb timescaledb extension támogatott.

https://www.zabbix.com/documentation/5.0/en/manual/appendix/install/tim…

Szerkesztve: 2023. 03. 18., szo – 10:49

Nem Zabbix, de sok, elég rendesen használt DB (szumma 1.2TiB) 10-esről 14-re migrálását a pg_upgradecluster simán (inplace) megcsinálta - néhány perces leállással, ez (fejből írom, nézz utána/csinálj dump-ot előtte):

  • leállítod a zabbixot
  • leállítod a 10-es pg-t
  • pg_lscluster 10-es és 12-es-t is downnak mutatja? Ha igen, mehetünk tovább.
  • pg_dropcluster -stop 12 main
  • pg_lscluser már nem mutatja a 12-es-t
  • A 12-es PG-ből megkeresed a pg_upgradecluster -t, és pg_upgradecluster -m upgrade (vagy link?) 10 main
  • pg_lscluster - újra van 12 main :)
  • elindítod a 12-es pg-t, megnézed, minden megvan-e benne.
  • pg_dropcluster 10 main
  • leállítod a 12-est
  • a 12-es konfigját átírod, hogy megfelelő TCP_porton figyeljen
  • elindítod a 12-est
  • elindítod a Zabbix-ot

Ha ez után jól működik a Zabbix, minden rendben megy, "csak" 12-es PG-n, akkor kezdjél bele a TimescaleDB-s mókolásba, addig ne. (Egyszerre csak egy dolgot...)

 

Köszönöm szépen a részletes leírást!

Végül pg_dump + psql páros lett és melléktermékként most van egy zabbix DB mentésem, bár én csak konfiget akarok majd menteni.
A 12-re sikerült így átvinni a Zabbixot. Processz szinten úgy néz ki, működik.

A 10-es még 1 hétig megtartom, aztán megszüntetem.
A TimeScaleDB még az átvitel előtt fel lett téve az üres 12-esre. Azt nem tudom, hogy használatban van-e? Hogyan tudnám ellenőrizni?

Most jön majd a Zabbix konfig mentése, amint előkerestem a szkriptet hozzá...

Üdv:
Ruzsi

Ilyen relative kis DB esetén a dump/restore is teljesen jó - pláne ha a szükséges állásidő belefér. A 10-est megtartani nem tudom, érdemes-e? Ha visszaállás kell bármilyen okból, a mindenképp adatvesztést jelent, és ha közben volt konfigurációban módosítás, új host, új/módosult metrika, stb. akkor az is megy a levesbe - szóval én bármilyen gond esetén az előrefelé menekülést választanám, nem a rollback irányt.

Előre mentem, 12-n vagyok, de a zabbix-backup szkript még mindig nem megy:

postgres@tarthost:/home/rattila/zabbix-install/zabbix-backup-0.9.10$ ./zabbix-dump -t psql -o zabbix-config-dump.sql
Reading database options from /etc/zabbix/zabbix_server.conf...
./zabbix-dump: sor: 251: /usr/bin/grep: Nincs ilyen fájl vagy könyvtár
Configuration:
 - type:     psql
 - socket:   /var/run/postgresql/.s.PGSQL.5432
 - schema:   public
 - database: zabbix
 - user:     zabbix
 - output:   zabbix-config-dump.sql
Fetching list of existing tables...
ERROR while trying to access database:
psql: error: could not connect to server: Nem könyvtár
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432/.s.PGSQL.5432"?
postgres@tarthost:/home/rattila/zabbix-install/zabbix-backup-0.9.10$ cd /var/run
postgres@tarthost:/var/run$ cd postgresql/
postgres@tarthost:/var/run/postgresql$ ls
10-main.pg_stat_tmp  12-main.pg_stat_tmp  12-main.pid
postgres@tarthost:/var/run/postgresql$ ls -la
összesen 8
drwxrwsr-x  4 postgres postgres  140 márc  18 19:12 .
drwxr-xr-x 50 root     root     1560 márc  18 19:05 ..
drwxr-s---  2 postgres postgres   40 márc  18 19:12 10-main.pg_stat_tmp
drwxr-s---  2 postgres postgres  160 márc  18 19:16 12-main.pg_stat_tmp
-rw-r--r--  1 postgres postgres    8 márc  18 15:26 12-main.pid
srwxrwxrwx  1 postgres postgres    0 márc  18 18:20 .s.PGSQL.5432
-rw-------  1 postgres postgres   72 márc  18 18:20 .s.PGSQL.5432.lock
postgres@tarthost:/var/run/postgresql$

Miért alkönyvtárként keresi a Unix socket-et?? Olyanom nincs!
Jelenleg csak a 12-es fut, hogy ezzel is megkönnyítsem a szkript dolgát, de nem akarja!

Üdv:
Ruzsi

Ahogy megtörtént a 10->12, akkor kidobtam a 93 és 9.5-öket.

Ez maradt:
ostgres@tarthost:/var/run/postgresql$ pg_lsclusters 
Ver Cluster Port Status Owner    Data directory              Log file
10  main    5433 down   postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
12  main    5432 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log
 

Direkt tettem alapra a 12-est, mert hátha így megtalálja a szkript.
Mondjuk a portra még nem szólt semmit, ellenben a Unix domain sockettel baja van, mert dupla elérési úttal
akar odatalálni, ami persze nincs!
Vajon honnan veheti ezt?

Üdv:
Ruzsi

Az aktuális verzióban ez van ott:

DBPASS="$(/usr/bin/grep '^DBPassword=' "${ZBX_CONFIG}" | /usr/bin/cut -d= -f2-)"
 

A default:
ZBX_CONFIG="/etc/zabbix/zabbix_server.conf"

Ha nem ott van, nem úgy hívják, akkor -z /itt/van/a/zabbix.konfig.conf

De lehet, hogy elég egy -Z, és megmondani a scriptnek ( -d -u  -p paraméterek) a DB eléréshez szükséges adatokat. Mondjuk én inkább a -z és megadom, hol keresse a Zabbix beállításait irányba mozdulnék, mert a -Z -d -u -p esetében a /proc/$(pidof zabbix_dump)/cmdline - ami alapesetben midnenkinek olvasható - tartalmazni fogja a DB usert és jelszót,a mi nem biztos, hogy kívánatos... (Parancssorban paraméterként nem adunk meg hozzáférési adatot. Semmilyet.)
 

Itt tartok most és sokat nem haladtam előre:

root@tarthost:/home/rattila# ./zabbix-config-dump -t psql -s localhost -p -
Reading database options from /etc/zabbix/zabbix_server.conf...
Configuration:
 - type:     psql
 - socket:   localhost
 - database: zabbix
 - user:     zabbix
 - output:   /home/rattila
Fetching list of existing tables...
ERROR while trying to access database:
psql: error: fe_sendauth: no password supplied

Adatok jók, a jelszót, ami a zabbix DB userhez tartozik, a zabbix conf-jából olvastam ki.

A további próbálkozások:

root@tarthost:/home/rattila# ./zabbix-config-dump -t psql -s localhost -u postgres -p -
Reading database options from /etc/zabbix/zabbix_server.conf...
Enter database password for user 'postgres' (input will be hidden): 
Configuration:
 - type:     psql
 - socket:   localhost
 - database: zabbix
 - user:     postgres
 - output:   /home/rattila
Fetching list of existing tables...
ERROR while trying to access database:
psql: error: fe_sendauth: no password supplied

Itt lehet, hogy nem jó a postgres user jelszava. 

Sudo-val postgres userbe lépve a psql simán kezeli a zabbix DB-t, de ez nem nagy meglepedés, hiszen a DBk
"root" usere a postgres.

Valami ötlet, mi lehet a baj? Elvileg a zabbix conf-ból ki kellene olvasnia a DBpasswd-t is, ugye?

Üdv:
Ruzsi

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

Nekem mindegy hogyan csatlakozik, csak menjen!

Üdv:
Ruzsi

Na, ez így nem jó. Feltételezésem alapján username mapelést nem konfiguráltál pluszban.
Rövid magyarázat: https://www.postgresql.org/docs/12/auth-peer.html

Bővebben:
Nem látom, hogy pontosan mit is csinál a zabbix-config-dump script. Lehet, hogy csak 1 sor, de lehet, hogy hosszabb.
Ha Unix socketen át akarsz csatlakozni, akkor fel kell venned plusz sort, hogy engedélyezd a kapcsolódást.
A te példádban socketes kapcsolódás szerepelt.
local        zabbix        zabbix                md5
local        zabbix        zabbix                scram-sha-256 #ezt csak a jovore nezve irom

Ha TCP/IP-n keresztül akarsz kapcsolódni, akkor elvileg mennie kellene. Csak a zabbix-config-dump script legyen megfelelően megírva. Pl: legyen benne a Pgsql portja - még akkor is, ha a default 5432-n fut a Pgsql. Jobb a békesség.

Azt a dump scriptet meg tudod osztani? Természetesen az érzékeny infokat kicsillagozva belőle.
Továbbá rendben, hogy nem variáltál semmit user szinten, de egy plusz ellenőrzést megér. Nehogy valami apróság miatt pocsékold a drága időd.

Ha psql-lel postgres userrel kapcsolódsz, akkor a \du+ és a \l parancsok mit mutatnak? Látszódik a zabbix user a megfelelő jogosultságokkal?

Kis segítség a témában:
- https://linuxhint.com/check-postgres-user-privileges/
- https://dba.stackexchange.com/questions/4286/list-the-database-privileg…
- https://stackoverflow.com/questions/40759177/postgresql-show-all-the-pr…

Akkor jól sejtettem: socketet használsz.
A script (https://github.com/npotorino/zabbix-backup/blob/master/zabbix-dump) alapján a -s DBSOCKET-t vár, amit te is beállítottál. Az pedig általában egy fájlnév pl: /tmp/s.PGSQL.5432
Ha a -H DBHOST és a -P DBPORT értékeket használod, akkor tudsz IP alapon kapcsolódni a Pgsql-hez.

Ha jól látom a scriptből, akkor ha parancssorban nem állítod be a DBSOCKET, DBHOST, DBPORT értékét, akkor ezeket felparsolja awk-val a zabbix_server.conf fájlból. Ha ezek az értékek biztosan jók a zabbix_server.conf fájlban, akkor nem kell őket paraméterként is megadnod. Felesleges.
Próbáld meg csak így futtatni: ./zabbix-config-dump

Módosítás:
Futtasd le a következő parancsokat az aktuális könyvtárban:
1. mkdir zabbixdump
2. ./zabbix-config-dump -t psql -o zabbixdump -n -z /etc/zabbix/zabbix_server.conf

rattila@tarthost:~$ sudo su postgres -
postgres@tarthost:/home/rattila$ cd
postgres@tarthost:~$ psql
psql (12.14 (Ubuntu 12.14-0ubuntu0.20.04.1))
Type "help" for help.

postgres=# \du+

Role name |                         Attributes                         | Member of | Description 
-----------+------------------------------------------------------------+-----------+-------------

 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}        | 
 zabbix    |                                                            | {}        | 
 

postgres=# \l

   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | hu_HU.UTF-8 | hu_HU.UTF-8 | 
 template0 | postgres | UTF8     | hu_HU.UTF-8 | hu_HU.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | hu_HU.UTF-8 | hu_HU.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 zabbix    | postgres | UTF8     | hu_HU.UTF-8 | hu_HU.UTF-8 | 
(4 rows)

 

Ezek vannak.
Megjegyezném, hogy a Zabbix szerver gond nélkül használja a DB-t. Gondolom én ...

Üdv:
Ruzsi

Ha a pg_hba.conf a probléma, akkor annak a módosítását ez "élesíti". Én egyébként megpróbálnám "bash -x" - szel elindítani a scriptet, hátha kiköpi, hogy mi a hasfájása...

Egyébként ahonnan a dumpot indítod, onnan a zabbix userrel és a konfigban lévő jelszóval be tudsz menni psql-lel a megfelelő DB-be?

Az előbbi csatlakozási kísérletnek az eredménye a postgresql 12 log-jában:

2023-03-29 15:18:55.133 CEST [3318624] zabbix@zabbix LOG:  provided user name (zabbix) and authenticated user name (rattila) do not match
2023-03-29 15:18:55.133 CEST [3318624] zabbix@zabbix FATAL:  Peer authentication failed for user "zabbix"
2023-03-29 15:18:55.133 CEST [3318624] zabbix@zabbix DETAIL:  Connection matched pg_hba.conf line 94: "local   all             all                                     peer"

Üdv:
Ruzsi

Na akkor tessen a pg_hba.conf-ot a korábban jelzett módon megpimpelni,  majd jöhet postgres userként beugorva a pg-be a SELECT pg_reload_conf(); és utána goto usernév/jelszó ellenőrzése.
A script user/pass logint akar csinálni első blikkre (kreál egy átmeneti pgpass állományt, és egy környezeti változóval megadja a pg_dump-nak, hogy ott keresse a credential-t), nem pedig peer-t.

De ha azt mondod, hogy sudo -u zabbix zabbix_dump_script_paraméteretzve, lehet, hogy  az is működni fog...

oot@tarthost:/etc/zabbix# grep DB zabbix_server.conf 
### Option: DBHost
# DBHost=localhost
### Option: DBName
# DBName=
DBName=zabbix
### Option: DBSchema
#    Schema name. Used for IBM DB2 and PostgreSQL.
# DBSchema=
### Option: DBUser
# DBUser=
DBUser=zabbix
### Option: DBPassword
# DBPassword=
DBPassword=***************
### Option: DBSocket
# DBSocket=/tmp/mysql.sock
### Option: DBPort
# DBPort=3306
DBPort=5432
### Option: StartDBSyncers
#    Number of pre-forked instances of DB Syncers.
# StartDBSyncers=4
StartDBSyncers=10

Üdv:
Ruzsi

No, ez már mutatja, hogy a te Zabbixod nem Unix socketet, hanem IP kapcsolatot használ. És ez így jó. Az IP cím praktikusan a localhostra mutat (127.0.0.1). IPv6-t most nem keverném bele.

A DBHost értéke legyen beállítva localhostra vagy 127.0.0.1-re, amennyiben a Zabbix szerver és a Pgsql ugyanazon a gépen fut. Tisztább, szárazabb, biztonságosabb érzés.

1. A DBHost az default a localhost.

2+3:
root@tarthost:/home/rattila# mkdir zabbixdump
root@tarthost:/home/rattila# ./zabbix
zabbix-config-dump  zabbix-dump.sh      
zabbixdump/         zabbix-install/     
root@tarthost:/home/rattila# ./zabbix-config-dump -t psql -o zabbixdump -n -z /etc/zabbix/zabbix_server.conf
Reading database options from /etc/zabbix/zabbix_server.conf...
Configuration:
 - type:     psql
 - socket:   /var/run/postgresql/.s.PGSQL.5432
 - database: zabbix
 - user:     zabbix
 - output:   zabbixdump
Fetching list of existing tables...
ERROR while trying to access database:
psql: error: could not connect to server: Nem könyvtár
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432/.s.PGSQL.5432"?
root@tarthost:/home/rattila# 

A conf-ban a localhost miatt nem módosítottam semmit ...

Üdv:
Ruzsi

Újabb próba:

root@tarthost:/home/rattila# ./zabbix-config-dump -t psql -H localhost -p 5432 -o zabbixdump -n -p - -z /etc/zabbix/zabbix_server.conf
Reading database options from /etc/zabbix/zabbix_server.conf...
Enter database password for user 'zabbix' (input will be hidden): 
Configuration:
 - type:     psql
 - host:     localhost (localhost)
 - port:     5432
 - socket:   /var/run/postgresql/.s.PGSQL.5432
 - database: zabbix
 - user:     zabbix
 - output:   zabbixdump
Fetching list of existing tables...

ERROR
Unknown tables found in database:
 - interface_snmp
 - lld_override
 - lld_override_condition
 - lld_override_opdiscover
 - lld_override_operation
 - lld_override_ophistory
 - lld_override_opinventory
 - lld_override_opperiod
 - lld_override_opseverity
 - lld_override_opstatus
 - lld_override_optag
 - lld_override_optemplate
 - lld_override_optrends
 - media_type_message
 - module
 - task_data
 - task_result
To include them (full data backup) specify -f, to ignore them use -i

root@tarthost:/home/rattila# 

Azt hiszem, a DB-hez csatlakozást sikerült megugranom, de most hogyan tovább? -f vagy -i?

Üdv:
Ruzsi

Hát jó... megkapta a -f kapcsolóját.

Azt nem értem, ha kompatibilis 5.0-ás Zabbix verzióval, akkor hogyan lehet neki ismeretlen tábla ...

Mindenesetre:

...

They will be included (full data backup) as -f was specified

Starting table backups...

Remélem, hiba nélkül lefut és akkor köszönöm a segítséget mindenkinek!

Üdv:
Ruzsi

Kicsit korán örültem ...

A konfig rész kitűnő a 12-es PGSQL-el, de adatok nem jönnek!
A WEB-es Zabbix felület azt mondja, a szerver nem fut. A szerver fut. Ellenőriztem.
Van DB kapcsolat - mert ha nem lenne, akkor a konfig-jeimet, a host-jaimat se látnám.
A PG is hozza a kapcsolatot a zabbix-szal, a ::1-en. A log-ban (Zabbix) nincs hibaüzenet.

Hogyan tovább?

Üdv:
Ruzsi

"hogyan lehet neki ismeretlen tábla" - például úgy, hogy olyan zabbix kiegészítés van feltelepítve, ami DB-ben saját táblákat is használ. A scriptbe beledrótozva van n+1 táblanév, ami a script alkotója szerint kell. Egy testreszabás _nélküli_ Zabbix esetén akár jó is lehet, meg ott, ahol perverzállat módon a Zabbix olyan DB-t használ, amit más alkalmazás is... De értelmes ember külön DB-t csinál, és onnantól kezdve meg azt a DB-t kell fullban menteni - amihez máris nem kell más, csak -jelen esetben- egy jól/szépen felparaméterezett pg_dump...

Ja, csak hogy "szép" legyen, én a 9.3 meg a 9.5-ös data könyvtárára "ránéznék", és ha tényleg üres, akkor tolnék mindkettőre egy pg_dropcluster -t, hogy az lscluster-t ne szemetelje tele, illetve utána a 9.3 meg a 9.5-ből még fent lévő csomagokat is lehetne purgálni  - a 9.3 meg a 9.5 data könyvtárával együtt. (Ha van benne érdemi adat esetleg, akkor azt 9.3-as illetve 9.5-ös PG alá bemásolva (mintha egy basebackup-ot adnál oda a megfelelő verziónak) szintén fel lehet húzni valami frissebbre/ki lehet dump-pal menteni, stb. (9.3-ról, de van, amikor 9.5-ről is csak -m dump módon megy a pg_upgrade).

Én ezt (is) próbáltam:

https://github.com/npotorino/zabbix-backup

-t psql volt. Anélkül MySQL-ezni akarna.

A -s-sel se sikerült rávennem, hogy odataláljon a szerintem default sockethez. Ezt azért újra ki fogom próbálni!
De majd ha lesz időd és ránézel, akkor okosabbak leszünk.

Köszönöm!

Üdv:
Ruzsi

Szia, pont hasonló projektbe vagyok. Zabbix 5.0 LTS upgrade Zabbix 6.0LTS-re. Ehhez először debian upgrade buster-ról bullseye-re, aztán postgresql 11-ről 13-ra állok át, timescale 2.3.1-ről 2.9.0-ra.

Sikerült a demo rendszeren végigmenni a folyamaton és minden sikeresnek tűnik, jővő héten élesben megy, persze először egy vmware snapshot :) a biztonság kedvéért.

Szia!

A Zabbix DB csere úgy néz ki, megy nekem is. A Zabbix marad 5.0, mert sajnos az újabb verziók húzzák magukkal
a proxy-kat is, amiket feltenni az adott gépre macerás tud lenni. (régi Linuxok, pl.)

A TSDB-ről annyit tudok, hogy van, hogy honnan tudom, hogy megy-e, arról fogalmam sincs.

Üdv:
Ruzsi