Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
- Rugalmas fürt létrehozása a portál használatával
- Hozzon létre egy rugalmas klasztert Bicep használatával
- Hozzon létre rugalmas fürtöt ARM-sablonnal
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_shardingkonfigurá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.