Oktatóanyag: Mikroszolgáltatások tervezése rugalmas fürtökkel

Ebben az oktatóanyagban az Azure Database for PostgreSQL-t használja több mikroszolgáltatás tárolási háttérrendszereként. Az oktatóanyag egy ilyen fürt mintabeállítását és alapvető működését mutatja be. Tanulja meg, hogyan:

  • Előfeltételek
  • Szerepkörök létrehozása a mikroszolgáltatásokhoz
  • Szerepkörök és elosztott sémák létrehozása a psql segédprogrammal
  • Táblák létrehozása a mintaszolgáltatásokhoz
  • Szolgáltatások konfigurálása
  • Szolgáltatások futtatása
  • Az adatbázis felfedezése

Előfeltételek

Hozzon létre egy rugalmas fürtöt az alábbi módszerek egyikével:

Szerepkörök létrehozása a mikroszolgáltatásokhoz

Az elosztott sémákat dinamikusan helyezheti el egy rugalmas fürtben. A rendszer teljes egységként kiegyensúlyozhatja őket az elérhető csomópontok között, így manuális kiosztás nélkül jobb hatékonyságot érhet el a fürterőforrások között.

Ha sémahardingot alkalmaz egy mikroszolgáltatás-tervezési mintára, minden megfelelő mikroszolgáltatáshoz létre kell hoznia egy adatbázissémát. Emellett az adatbázishoz való csatlakozáskor minden mikroszolgáltatáshoz használjon külön SZEREPKÖRt. Amikor minden felhasználó csatlakozik, a szerepkör neve a search_path elején lesz. Ha a szerepkör neve megegyezik a séma nevével, nincs szükség további alkalmazásmódosításra a megfelelő search_path beállításához.

Ebben a példában három mikroszolgáltatást használjon:

  • felhasználó
  • time
  • ping

Hozza létre az adatbázis-szerepköröket az egyes szolgáltatásokhoz:

CREATE USER user_service;
CREATE USER time_service;
CREATE USER ping_service;

Elosztott sémák létrehozása a psql segédprogrammal

Miután psql használatával csatlakozott a rugalmas fürthöz, elvégezhet néhány alapvető feladatot.

A sémákat kétféleképpen terjesztheti:

  • A citus_schema_distribute(schema_name) függvény manuális meghívásával:
CREATE SCHEMA AUTHORIZATION user_service;
CREATE SCHEMA AUTHORIZATION time_service;
CREATE SCHEMA AUTHORIZATION ping_service;

SELECT citus_schema_distribute('user_service');
SELECT citus_schema_distribute('time_service');
SELECT citus_schema_distribute('ping_service');

Ezzel a módszerrel a meglévő normál sémákat elosztott sémákká is konvertálhatja.

Megjegyzés:

Csak olyan sémákat oszthat ki, amelyek nem tartalmaznak elosztott és referenciatáblákat.

  • citus.enable_schema_based_sharding konfigurációs változó engedélyezésével. Módosíthatja az aktuális munkamenet változóit, vagy véglegesen a koordinátor csomópontparamétereit. Ha a paramétert ON értékre állítja, az összes létrehozott séma alapértelmezés szerint el lesz osztva.
SET citus.enable_schema_based_sharding TO ON;

CREATE SCHEMA AUTHORIZATION user_service;
CREATE SCHEMA AUTHORIZATION time_service;
CREATE SCHEMA AUTHORIZATION ping_service;

Futtassa a következő parancsot az aktuálisan elosztott sémák listázásához:

SELECT * FROM citus_schemas;
 schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
 user_service |             5 | 0 bytes     | user_service
 time_service |             6 | 0 bytes     | time_service
 ping_service |             7 | 0 bytes     | ping_service
(3 rows)

Táblák létrehozása a mintaszolgáltatásokhoz

Mostantól minden mikroszolgáltatáshoz csatlakozhat az elasztikus fürthöz. Az alábbi példában a rugalmas fürtadatbázis neve Citus. A psql-munkamenetben a \c paranccsal válthat másik felhasználóra.

\c citus user_service
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL
);
\c citus time_service
CREATE TABLE query_details (
    id SERIAL PRIMARY KEY,
    ip_address INET NOT NULL,
    query_time TIMESTAMP NOT NULL
);
\c citus ping_service
CREATE TABLE ping_results (
    id SERIAL PRIMARY KEY,
    host VARCHAR(255) NOT NULL,
    result TEXT NOT NULL
);

Szolgáltatások konfigurálása

Ebben az oktatóanyagban egy egyszerű szolgáltatáskészletet használunk. Ezeket a nyilvános adattár klónozásával szerezheti be:

git clone https://github.com/citusdata/citus-example-microservices.git
$ tree
.
├── LICENSE
├── README.md
├── ping
│   ├── app.py
│   ├── ping.sql
│   └── requirements.txt
├── time
│   ├── app.py
│   ├── requirements.txt
│   └── time.sql
└── user
    ├── app.py
    ├── requirements.txt
    └── user.sql

A szolgáltatások futtatása előtt azonban szerkessze user/app.py, ping/app.py, és time/app.py fájlokat, amelyek az Ön Elasticsearch fürtjének kapcsolatkonfigurációját biztosítják:

# Database configuration
db_config = {
    'host': 'EXAMPLE.postgres.database.azure.com',
    'database': 'postgres',
    'password': 'SECRET',
    'user': 'ping_service',
    'port': 5432
}

A módosítások elvégzése után mentse az összes módosított fájlt, és lépjen tovább a szolgáltatások futtatásának következő lépésére.

Szolgáltatások futtatása

Váltson át minden alkalmazáskönyvtárra, és futtassa őket a saját Python-envben.

cd user
pipenv install
pipenv shell
python app.py

Ismételje meg a parancsokat az idő- és pingelési szolgáltatáshoz, amely után használhatja az API-t.

Hozzon létre néhány felhasználót:

curl -X POST -H "Content-Type: application/json" -d '[
  {"name": "John Doe", "email": "john@example.com"},
  {"name": "Jane Smith", "email": "jane@example.com"},
  {"name": "Mike Johnson", "email": "mike@example.com"},
  {"name": "Emily Davis", "email": "emily@example.com"},
  {"name": "David Wilson", "email": "david@example.com"},
  {"name": "Sarah Thompson", "email": "sarah@example.com"},
  {"name": "Alex Miller", "email": "alex@example.com"},
  {"name": "Olivia Anderson", "email": "olivia@example.com"},
  {"name": "Daniel Martin", "email": "daniel@example.com"},
  {"name": "Sophia White", "email": "sophia@example.com"}
]' http://localhost:5000/users

A létrehozott felhasználók listázása:

curl http://localhost:5000/users

Aktuális idő lekérése:

Get current time:

Futtassa a pingetést az example.com ellen.

curl -X POST -H "Content-Type: application/json" -d '{"host": "example.com"}' http://localhost:5002/ping

Az adatbázis felfedezése

Most, hogy meghívott néhány API-függvényt, az adatok tárolódnak, és ellenőrizheti, hogy a várt értéket tükrözi-e citus_schemas :

SELECT * FROM citus_schemas;
 schema_name | colocation_id | schema_size | schema_owner
-------------+---------------+-------------+--------------
 user_service |             1 | 112 kB      | user_service
 time_service |             2 | 32 kB       | time_service
 ping_service |             3 | 32 kB       | ping_service
(3 rows)

A sémák létrehozásakor nem jelezte, hogy mely gépeken hozza létre a sémákat. Ez automatikusan megtörtént. Az alábbi lekérdezéssel láthatja, hogy hol találhatók az egyes sémák:

  SELECT nodename,nodeport, table_name, pg_size_pretty(sum(shard_size))
  FROM citus_shards
  GROUP BY nodename,nodeport, table_name;
nodename  | nodeport |         table_name         | pg_size_pretty
-----------+----------+---------------------------+----------------
 localhost |     7001 | time_service.query_details | 32 kB
 localhost |     7002 | user_service.users         | 112 kB
 localhost |     7002 | ping_service.ping_results  | 32 kB

Az oldalon található példakimenet rövidsége érdekében ahelyett, hogy IP-címként használnánk nodename , a localhostra cseréljük. Tegyük fel, hogy localhost:7001 ez az első csomópont, és localhost:7002 a második csomópont.

Láthatja, hogy az időszolgáltatás a csomóponton localhost:7001 landolt, míg a felhasználó és a pingelési szolgáltatás megosztott helyet a második csomóponton localhost:7002. A példaalkalmazások egyszerűek, és az adatméretek itt jelentéktelenek, de tegyük fel, hogy a csomópontok közötti egyenetlen tárterület-kihasználtság hatással van magára. Célszerűbb, ha a két kisebb idő és pingelési szolgáltatás egy csomóponton található, míg a nagy felhasználói szolgáltatás a saját csomópontján található.

A fürt könnyen kiegyensúlyozható a lemezméret alapján.

SELECT citus_rebalance_start();
NOTICE:  Scheduled 1 moves as job 1
DETAIL:  Rebalance scheduled as background job
HINT:  To monitor progress, run: SELECT * FROM citus_rebalance_status();
 citus_rebalance_start
-----------------------
                     1
(1 row)

Ha elkészült, ellenőrizheti az új elrendezés megjelenését:

  SELECT nodename,nodeport, table_name, pg_size_pretty(sum(shard_size))
  FROM citus_shards
  GROUP BY nodename,nodeport, table_name;
 nodename  | nodeport |         table_name        | pg_size_pretty
-----------+----------+---------------------------+----------------
 localhost |     7001 | time_service.query_details | 32 kB
 localhost |     7001 | ping_service.ping_results  | 32 kB
 localhost |     7002 | user_service.users         | 112 kB
(3 rows)

Az elvárásoknak megfelelően a sémák áthelyezésre kerülnek, és kiegyensúlyozottabb fürtünk van. Ez a művelet transzparens az alkalmazások számára. Még csak nem is kell újraindítania őket, továbbra is kiszolgálják a lekérdezéseket.

Következő lépés