Tehosta Datavirtojasi: PostgreSQL-muutokset NATS.io:hon Debezium Serverillä – Ilman Kafkaa!
Kattava opas reaaliaikaiseen datastriimaukseen PostgreSQL-tietokannasta NATS.io-viestijärjestelmään hyödyntäen Debezium Serveriä.
Tämä opas näyttää, kuinka voit ottaa käyttöön tehokkaan muutosdatan kaappausjärjestelmän (Change Data Capture, CDC) PostgreSQL-tietokannallesi ja striimata muutokset suoraan NATS.io-viestijärjestelmään käyttämällä Debezium Serveriä. Tämä ratkaisu tarjoaa kevyemmän vaihtoehdon perinteiselle Kafka-pohjaiselle arkkitehtuurille, vähentäen infrastruktuurin monimutkaisuutta ja hallinnointitaakkaa.
Keskeiset Oivallukset
- Debezium Server mahdollistaa CDC:n ilman Kafkaa: Voit striimata tietokantamuutokset suoraan NATS.io:n kaltaisiin viestijärjestelmiin.
- PostgreSQL:n looginen replikointi on ytimessä: Debezium hyödyntää PostgreSQL:n sisäänrakennettua loogista replikointia muutosten tehokkaaseen kaappaamiseen.
- Helppo konfiguraatio: Debezium Serverin asetukset määritellään selkeästi
application.properties-tiedostossa, mikä tekee käyttöönotosta suoraviivaista. - NATS JetStream takaa kestävyyden: Käyttämällä NATS JetStreamiä varmistat viestien pysyvyyden ja luotettavan toimituksen.
Johdanto: Debezium Server ja NATS.io Yhdistelmä
Debezium on avoimen lähdekoodin hajautettu alusta muutosdatan kaappaamiseen. Perinteisesti se on vahvasti yhdistetty Apache Kafkaan, mutta Debezium Server -komponentti laajentaa sen käyttömahdollisuuksia. Debezium Server on itsenäinen sovellus, joka pystyy lukemaan tietokantamuutoksia Debezium-liittimien avulla ja lähettämään ne useisiin eri viestinvälitysjärjestelmiin, kuten NATS.io, Google Cloud Pub/Sub, Amazon Kinesis ja muihin.
NATS.io on kevyt, suorituskykyinen ja skaalautuva avoimen lähdekoodin viestijärjestelmä. Sen JetStream-ominaisuus lisää NATS:iin pysyvän tallennuksen, mikä tekee siitä erinomaisen valinnan CDC-tapahtumien käsittelyyn. Yhdistämällä Debezium Serverin NATS JetStreamiin voit rakentaa ketterän ja tehokkaan järjestelmän tietokantamuutosten reaaliaikaiseen välittämiseen ilman tarvetta ylläpitää monimutkaista Kafka-klusteria.
Debezium Serverin arkkitehtuuri, joka mahdollistaa yhteydet eri kohdejärjestelmiin.
Edellytykset ja Ympäristön Valmistelu
Ennen kuin aloitat, varmista että seuraavat edellytykset täyttyvät:
- PostgreSQL-tietokanta: Versio, joka tukee loogista replikointia (yleensä PostgreSQL 9.6 tai uudempi, suositeltavaa käyttää versiota 10+).
- NATS.io-palvelin: Asennettuna ja käynnissä, JetStream-ominaisuus aktivoituna. Docker on kätevä tapa NATS:n pystyttämiseen.
- Debezium Server: Uusin vakaa versio, joka tukee NATS JetStream -kohdetta (esim. Debezium 2.1.0.Final tai uudempi). Tämäkin voidaan ajaa Docker-kontissa.
- Työkalut: Docker ja Docker Compose ovat suositeltavia ympäristön hallintaan. Jos ajat Debezium Serveriä suoraan, tarvitset Javan (JDK 11 tai uudempi).
PostgreSQL:n Konfigurointi Loogista Replikointia Varten
Debezium käyttää PostgreSQL:n loogista replikointia muutosten seuraamiseen. Tämä vaatii muutamia asetuksia tietokannassasi.
1. Muokkaa postgresql.conf-tiedostoa:
Varmista, että seuraavat asetukset ovat voimassa (yleensä vaatii palvelimen uudelleenkäynnistyksen):
# TÄRKEÄÄ: Varmista, että wal_level on asetettu oikein
wal_level = logical
# Muita suositeltavia asetuksia replikointia varten (säädä tarpeen mukaan)
max_wal_senders = 10 # Vähintään yhtä monta kuin replikointiyhteyksiä
max_replication_slots = 10 # Vähintään yhtä monta kuin Debezium-instansseja
2. Luo Replikointikäyttäjä ja Anna Oikeudet:
Yhdistä PostgreSQL-tietokantaasi (esim. psql-työkalulla) ja suorita seuraavat komennot:
-- Luo dedikoitu käyttäjä Debeziumille replikointia varten
CREATE USER debezium_user WITH REPLICATION LOGIN PASSWORD 'salasana_tahan';
-- Anna tarvittavat oikeudet seurattaviin tauluihin (esimerkkinä public-skeema)
-- Jos haluat seurata kaikkia tauluja tietyssä skeemassa:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO debezium_user;
-- Tai yksittäiselle taululle:
-- GRANT SELECT ON public.oma_taulu TO debezium_user;
-- (PostgreSQL 10+): Anna käyttäjälle oikeus luoda replikointislotteja, jos tarpeen (tai luo slotit manuaalisesti superuserina)
-- Tämä ei ole aina välttämätöntä, jos Debeziumilla on riittävät oikeudet slotin luontiin itse.
Huom: Tuotantoympäristössä käytä vahvaa salasanaa ja rajoita oikeudet vain tarvittaviin skeemoihin ja tauluihin.
3. Luo Julkaisu (Publication) (PostgreSQL 10+):
Debeziumin PostgreSQL-liitin käyttää julkaisua (publication) määrittämään, mitkä taulut sisällytetään replikointiin. Jos et käytä `publication.autocreate.mode=all_tables` -asetusta Debeziumissa, sinun tulee luoda julkaisu manuaalisesti.
-- Luo julkaisu kaikille tauluille (varovaisuutta tämän kanssa tuotannossa)
-- CREATE PUBLICATION dbz_publication FOR ALL TABLES;
-- Tai suositellumpi tapa: luo julkaisu vain tietyille tauluille
CREATE PUBLICATION dbz_publication FOR TABLE public.asiakkaat, public.tilaukset;
-- Lisää olemassa olevaan julkaisuun tauluja:
-- ALTER PUBLICATION dbz_publication ADD TABLE public.uusi_taulu;
Debeziumin konfiguraatiossa viitataan tähän julkaisun nimeen (esim. `debezium.source.publication.name=dbz_publication`).
Käyttöönotto Vaihe Vaiheelta
Seuraavassa kuvataan, miten pystytät järjestelmän Docker Compose -työkalulla. Tämä yksinkertaistaa PostgreSQL:n, NATS:n ja Debezium Serverin ajamista ja linkittämistä.
1. Docker Compose -tiedoston Luonti
Luo docker-compose.yml-tiedosto projektiisi seuraavalla sisällöllä:
version: '3.8'
services:
postgres:
image: postgres:15 # Käytä haluamaasi PostgreSQL-versiota
container_name: postgres_db
environment:
POSTGRES_USER: kayttaja
POSTGRES_PASSWORD: salasana
POSTGRES_DB: tietokanta
ports:
- "5432:5432"
volumes:
- ./pg_data:/var/lib/postgresql/data
# Lisää oma postgresql.conf tarvittaessa, esim. loogisen replikoinnin asetuksille:
# - ./custom-postgresql.conf:/etc/postgresql/postgresql.conf
# Komento käynnistämään Postgres custom-konfiguraatiolla:
# command: postgres -c config_file=/etc/postgresql/postgresql.conf
# Varmista, että `wal_level = logical` on asetettu joko kuvassa oletuksena tai custom-konfiguraatiossa.
nats:
image: nats:latest # Uusin NATS-kuva
container_name: nats_server
ports:
- "4222:4222" # NATS client port
- "8222:8222" # NATS HTTP monitoring port
command:
- "--js" # Aktivoi JetStream
- "--http_port=8222" # Määritä monitorointiportti
debezium:
image: debezium/server:2.6 # Käytä uusinta vakaata Debezium Server -versiota
container_name: debezium_server
ports:
- "8080:8080" # Debezium Serverin portti (jos tarjoaa REST API:n tms.)
volumes:
- ./debezium_conf:/debezium/conf # Debeziumin konfiguraatiotiedostot
- ./debezium_data:/debezium/data # Debeziumin offset-tiedot
depends_on:
- postgres
- nats
environment:
# Voit asettaa konfiguraatioita myös ympäristömuuttujina, jos haluat.
# Esim. DEBEZIUM_SINK_NATS_JETSTREAM_URL: nats://nats:4222
QUARKUS_LOG_CONSOLE_JSON: "false" # Selkeämmät lokit konsolissa
Huomioitavaa:
- Luo hakemistot
./pg_data,./debezium_confja./debezium_dataprojektisi juureen. - Jos käytät omaa
postgresql.conf-tiedostoa, varmista, että se on oikein määritetty ja linkitetty Docker Compose -tiedostossa.
2. Debezium Serverin Konfigurointi
Luo application.properties-tiedosto ./debezium_conf-hakemistoon. Tämä tiedosto sisältää Debezium Serverin asetukset.
# Debezium Serverin yleiset asetukset
quarkus.http.port=8080 # Ei välttämätön NATS-striimaukselle, mutta hyvä olla olemassa
# Lähdekonfiguraatio (PostgreSQL)
debezium.source.connector.class=io.debezium.connector.postgresql.PostgresConnector
debezium.source.database.hostname=postgres # Docker Compose -palvelun nimi
debezium.source.database.port=5432
debezium.source.database.user=kayttaja # Sama kuin postgres-ympäristömuuttujissa
debezium.source.database.password=salasana
debezium.source.database.dbname=tietokanta
debezium.source.database.server.name=pgserver1 # Looginen nimi palvelimelle, käytetään aiheiden muodostukseen
debezium.source.topic.prefix=pgserver1 # Vaihtoehtoisesti, jos haluat kontrolloida etuliitettä
debezium.source.plugin.name=pgoutput # Suositeltu plugin PostgreSQL 10+
debezium.source.publication.name=dbz_publication # PostgreSQL:ssä luodun julkaisun nimi
debezium.source.publication.autocreate.mode=disabled # (disabled, filtered, all_tables) Jos julkaisu luodaan manuaalisesti, käytä disabled.
# 'filtered' luo julkaisun table.include.list perusteella.
# 'all_tables' luo julkaisun kaikille tauluille (vaatii superuser-oikeudet).
debezium.source.schema.include.list=public # Seurattavat skeemat (pilkulla erotettu)
debezium.source.table.include.list=public.asiakkaat,public.tilaukset # Seurattavat taulut (pilkulla erotettu)
# Voit myös käyttää table.exclude.list poissulkemaan tauluja.
# Offset-tietojen tallennus (Debezium Server käyttää tätä muistamaan, mihin asti on luettu)
debezium.source.offset.storage=org.apache.kafka.connect.storage.FileOffsetBackingStore
debezium.source.offset.storage.file.filename=/debezium/data/offsets.dat
debezium.source.offset.flush.interval.ms=10000 # Kuinka usein offset-tiedot tallennetaan (ms)
# Kohdekonfiguraatio (NATS JetStream Sink)
debezium.sink.type=nats-jetstream
debezium.sink.nats-jetstream.url=nats://nats:4222 # Docker Compose -palvelun nimi ja portti
debezium.sink.nats-jetstream.stream.name=DEBEZIUM_STREAM # NATS JetStream -streamin nimi, johon data julkaistaan.
# Jos streamia ei ole, se yritetään luoda (jos oikeudet riittävät).
# Voit myös määrittää käyttäjätunnistuksen NATS:lle tarvittaessa:
# debezium.sink.nats-jetstream.auth.token=your_nats_token
# debezium.sink.nats-jetstream.auth.username=your_nats_user
# debezium.sink.nats-jetstream.auth.password=your_nats_password
# Muotoilijat (Converters) - oletuksena JSON
debezium.format.key=json
debezium.format.value=json
# Valinnaiset muunnokset (Transformations)
# Esimerkiksi UnwrapFromEnvelope poistaa Debeziumin ulkoisen kääreen ja välittää vain datan:
# debezium.transforms=unwrap
# debezium.transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState
# debezium.transforms.unwrap.drop.tombstones=false
# debezium.transforms.unwrap.delete.handling.mode=rewrite
# debezium.transforms.unwrap.add.fields=op,table,source.ts_ms
# debezium.transforms.unwrap.add.headers=db,op # Lisää metatietoa NATS-viestin headereihin
Varmista, että korvaat placeholder-arvot (kuten käyttäjätunnukset, salasanat, tietokannan nimet, taulujen nimet) omilla asetuksillasi.
3. Palveluiden Käynnistäminen
Kun docker-compose.yml ja application.properties ovat valmiina, käynnistä palvelut komennolla projektisi juurihakemistossa:
docker-compose up -d
Tämä komento käynnistää PostgreSQL:n, NATS:n ja Debezium Serverin taustalla (-d).
Voit seurata lokia komennolla:
docker-compose logs -f debezium
Lokeista näet, onnistuuko Debezium Server yhdistämään PostgreSQL:ään ja NATS:iin, sekä mahdolliset virheilmoitukset.
4. Testaus: Tietokantamuutosten Striimaus
Kun kaikki palvelut ovat käynnissä ja Debezium Server on yhdistänyt onnistuneesti PostgreSQL:ään:
a) Tee muutoksia PostgreSQL-tietokantaan:
Yhdistä PostgreSQL-tietokantaasi (esim. psql tai muu SQL-työkalu) ja tee muutoksia seurattavaan tauluun (esim. public.asiakkaat):
-- Olettaen, että 'asiakkaat'-taulu on olemassa ja määritelty seurattavaksi
INSERT INTO public.asiakkaat (nimi, sahkoposti) VALUES ('Testi Kayttaja', 'testi@example.com');
UPDATE public.asiakkaat SET sahkoposti = 'uusi.testi@example.com' WHERE nimi = 'Testi Kayttaja';
DELETE FROM public.asiakkaat WHERE nimi = 'Testi Kayttaja';
b) Tarkkaile NATS JetStream -virtaa:
Voit käyttää NATS CLI -työkalua (nats) kuuntelemaan viestejä NATS JetStream -virrasta. Jos sinulla ei ole NATS CLI:tä asennettuna paikallisesti, voit ajaa sen Docker-kontissa tai käyttää NATS-palvelimen monitorointi-UI:ta (http://localhost:8222 jos käytit yllä olevaa Docker Composea).
NATS CLI:n käyttäminen kuunteluun (oletetaan, että stream on DEBEZIUM_STREAM ja aiheet ovat muotoa pgserver1.public.asiakkaat):
# Yhdistä NATS-palvelimeen (jos ajat ulkopuolelta Docker-verkkoa, käytä localhost:4222)
# Kuuntele kaikkia viestejä pgserver1.public.asiakkaat -aiheesta streamissa DEBEZIUM_STREAM
nats sub --server localhost:4222 --stream DEBEZIUM_STREAM pgserver1.public.asiakkaat --ack --deliver all
Sinun pitäisi nähdä JSON-muotoisia viestejä, jotka vastaavat PostgreSQL:ssä tekemiäsi muutoksia.
Yksinkertaistettu kaavio datavirrasta: PostgreSQL -> Debezium Server -> NATS -> Mikropalvelut.
Debezium Server + NATS vs. Perinteinen Kafka-ratkaisu
Tämä osio vertailee Debezium Serverin käyttöä NATS:n kanssa perinteisempään Debezium + Kafka Connect + Kafka -arkkitehtuuriin eri näkökulmista. Arviot ovat suuntaa-antavia ja voivat vaihdella käyttökohteen mukaan.
Kaavio havainnollistaa, että Debezium Server + NATS -ratkaisu on tyypillisesti yksinkertaisempi ottaa käyttöön, vaatii kevyemmän infrastruktuurin ja on helpompi ylläpitää kuin täysi Kafka-pohjainen ratkaisu. Kafka tarjoaa edelleen erinomaista skaalautuvuutta erittäin suuriin datamääriin, mutta NATS pärjää hyvin monissa käyttötapauksissa ja Debezium Server tarjoaa joustavuutta integroitua myös muihin järjestelmiin.
Arkkitehtuurin Visualisointi
Alla oleva mindmap-kaavio kuvaa PostgreSQL:n, Debezium Serverin ja NATS.io:n välistä arkkitehtuuria ja datavirtaa ilman Kafkaa.
wal_level = logical"]
sub_s1_user["Luo replikointikäyttäjä + oikeudet"]
sub_s1_pub["Luo julkaisu (Publication)"]
id_step2["2. NATS JetStreamin Käynnistys"]
sub_s2_docker["Dockerilla tai natiivisti"]
sub_s2_jsenabled["JetStream aktivoitu"]
id_step3["3. Debezium Serverin Konfigurointi"]
sub_s3_source["Lähde (PostgreSQL-asetukset)"]
sub_s3_sink["Kohde (NATS JetStream -asetukset)"]
sub_s3_offset["Offset-tallennus"]
id_step4["4. Palveluiden Käynnistys"]
sub_s4_compose["docker-compose up"]
id_step5["5. Testaus ja Varmennus"]
sub_s5_dbchanges["Tee tietokantamuutoksia"]
sub_s5_natslistener["Kuuntele NATS-aiheita"]
["Keskeiset Hyödyt"]
id_benefit1["Ei Kafka-riippuvuutta"]
id_benefit2["Yksinkertaisempi arkkitehtuuri"]
id_benefit3["Vähemmän infrastruktuuria"]
id_benefit4["Joustavuus (useita sink-vaihtoehtoja)"]
id_benefit5["Suora kulutus NATS:sta sovelluksissa"]
Tämä kaavio auttaa ymmärtämään, miten eri osat liittyvät toisiinsa ja miten data virtaa järjestelmän läpi reaaliajassa.
Debezium Serverin Avainparametrit
Seuraava taulukko kokoaa yhteen tärkeimpiä Debezium Serverin application.properties-tiedoston konfiguraatioavaimia PostgreSQL-lähteelle ja NATS JetStream -kohteelle.
| Ominaisuus (Property) | Kuvaus | Esimerkkiarvo |
|---|---|---|
debezium.source.connector.class |
Määrittää käytettävän Debezium-liittimen luokan. | io.debezium.connector.postgresql.PostgresConnector |
debezium.source.database.hostname |
PostgreSQL-palvelimen isäntänimi tai IP-osoite. | postgres (Docker-verkossa) tai localhost |
debezium.source.database.port |
PostgreSQL-palvelimen portti. | 5432 |
debezium.source.database.user |
PostgreSQL-replikointikäyttäjän tunnus. | debezium_user |
debezium.source.database.password |
PostgreSQL-replikointikäyttäjän salasana. | your_secure_password |
debezium.source.database.dbname |
Seurattavan tietokannan nimi. | your_database_name |
debezium.source.database.server.name |
Looginen nimi tietokantapalvelimelle. Käytetään NATS-aiheiden etuliitteenä. | pgserver1 |
debezium.source.plugin.name |
Käytettävä PostgreSQL loogisen dekoodauksen plugin (yleensä pgoutput tai wal2json). |
pgoutput |
debezium.source.publication.name |
PostgreSQL:ssä luodun julkaisun (publication) nimi. | dbz_publication |
debezium.source.schema.include.list |
Pilkulla erotettu lista seurattavista skeemoista. | public |
debezium.source.table.include.list |
Pilkulla erotettu lista seurattavista tauluista (muodossa skeema.taulu). |
public.customers,public.orders |
debezium.source.offset.storage.file.filename |
Tiedoston polku, johon Debezium tallentaa lukukohdan (offset). | /debezium/data/offsets.dat |
debezium.sink.type |
Määrittää kohdejärjestelmän tyypin. | nats-jetstream |
debezium.sink.nats-jetstream.url |
NATS-palvelimen URL-osoite. | nats://nats:4222 |
debezium.sink.nats-jetstream.stream.name |
NATS JetStream -streamin nimi, johon viestit julkaistaan. Jos streamia ei ole, Debezium yrittää luoda sen. | DEBEZIUM_EVENTS |
Tämä taulukko ei kata kaikkia mahdollisia asetuksia, mutta antaa hyvän lähtökohdan peruskonfiguraatiolle. Tarkemmat tiedot löytyvät Debeziumin virallisesta dokumentaatiosta.
Video: Debeziumin Perusteet
Vaikka tämä video ei käsittele suoraan NATS-integraatiota, se antaa erinomaisen yleiskuvan Debeziumista ja muutosdatan kaappauksen (CDC) periaatteista. Nämä konseptit ovat keskeisiä myös käytettäessä Debezium Serveriä NATS:n kanssa.
Johdatus Debeziumiin ja CDC-konsepteihin. Lähde: YouTube / Jordan has no life.
Videolla käsitellään Debeziumin arkkitehtuuria, toimintaperiaatteita ja etuja, jotka pätevät laajasti riippumatta siitä, käytetäänkö Kafkaa vai NATS:ia kohdejärjestelmänä. Ymmärtämällä Debeziumin ydinominaisuudet voit paremmin hyödyntää sen potentiaalia datastriimausratkaisuissasi.
Usein Kysytyt Kysymykset (UKK)
Miksi käyttää Debezium Serveriä NATS:n kanssa Kafkan sijaan? +
Pääsyitä ovat yksinkertaisuus ja kevyempi infrastruktuuri. NATS on usein helpompi pystyttää ja hallinnoida kuin täysi Kafka- ja Kafka Connect -klusteri, erityisesti pienemmissä tai keskisuurissa projekteissa. Tämä voi johtaa nopeampaan kehitykseen ja alempiin ylläpitokustannuksiin ilman, että CDC-toiminnallisuudesta tarvitsee tinkiä merkittävästi.
Mitä PostgreSQL-versiota tarvitaan? +
Debezium vaatii PostgreSQL-version, joka tukee loogista replikointia. Yleensä tämä tarkoittaa PostgreSQL 9.6:a tai uudempaa. Suositeltavaa on käyttää PostgreSQL 10:tä tai uudempaa, sillä ne tarjoavat paremman tuen ja suorituskyvyn loogiselle replikoinnille, erityisesti pgoutput-pluginin myötä.
Voinko käyttää NATS Streamingia (STAN) JetStreamin sijaan? +
Kyllä, vanhemmat Debezium Server -versiot tukivat NATS Streamingia (STAN). NATS JetStream on kuitenkin NATS:n uudempi ja kehittyneempi striimausratkaisu, joka on korvannut STAN:in. Debeziumin uudemmat versiot keskittyvät JetStream-tukeen. On suositeltavaa käyttää JetStreamiä sen parempien ominaisuuksien, kuten yksinkertaisemman hallinnan ja paremman suorituskyvyn, vuoksi.
Miten Debezium Server käsittelee skeemamuutoksia? +
Debezium kaappaa myös skeemamuutokset (kuten taulun sarakkeiden lisäykset tai poistot) ja välittää ne eteenpäin. Kohdejärjestelmän ja kuluttajasovellusten on oltava valmiita käsittelemään näitä muutoksia. NATS-viesteissä skeematieto on tyypillisesti osa viestin payloadia, jolloin kuluttajat voivat mukautua muuttuneeseen rakenteeseen.
Miten varmistan tietojen kestävyyden NATS JetStreamissa? +
NATS JetStream on suunniteltu viestien pysyvään tallennukseen ja kestävyyteen. Voit konfiguroida JetStream-streameja eri tallennusvaihtoehdoilla (esim. tiedostopohjainen tai muistipohjainen) ja replikointiasetuksilla. Varmista, että streamisi on konfiguroitu käyttämään pysyvää tallennusta (esim. `storage: file`) ja tarvittaessa replikointia klusteroidussa NATS-ympäristössä, jotta data säilyy myös palvelinongelmien sattuessa.
Suositellut Lisäkysymykset
- Miten NATS JetStream -streamit ja kuluttajat konfiguroidaan parhaiten Debezium-datan käsittelyyn?
- Mitkä ovat PostgreSQL:n loogisen replikoinnin suorituskykyvaikutukset?
- Voiko Debezium Serveriä ajaa Kubernetes-ympäristössä NATS:n kanssa?
- Miten käsitellä virhetilanteita ja datan uudelleenlähetystä Debezium Serverin ja NATS:n välillä?
Viitteet
Last updated May 18, 2025