Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto kurzu použijete Azure Database for PostgreSQL jako back-end úložiště pro více mikroslužeb. Tento kurz ukazuje ukázkové nastavení a základní provoz takového clusteru. Naučte se jak:
- Požadavky
- Vytváření rolí pro mikroslužby
- Použití nástroje psql k vytvoření rolí a distribuovaných schémat
- Vytvoření tabulek pro ukázkové služby
- Konfigurace služeb
- Provoz služeb
- Prozkoumání databáze
Požadavky
Vytvořte elastický cluster jedním z následujících způsobů:
- Vytvoření elastického clusteru pomocí portálu
- Vytvoření elastického clusteru pomocí Bicep
- Vytvoření elastického clusteru pomocí šablony ARM
Vytváření rolí pro mikroslužby
V elastickém clusteru můžete dynamicky umístit distribuovaná schémata. Systém je může vyrovnávat jako celek napříč dostupnými uzly, takže získáte lepší efektivitu napříč prostředky clusteru bez ručního přidělení.
Při použití horizontálního dělení schématu na vzor návrhu mikroslužeb vytvoříte schéma databáze pro každou odpovídající mikroslužbu. Při připojování k databázi také použijte samostatnou ROLI pro každou mikroslužbu. Když se každý uživatel připojí, název role se umístí na začátek search_path. Pokud název role odpovídá názvu schématu, nepotřebujete k nastavení správných search_path žádné další změny aplikace.
V tomto příkladu použijte tři mikroslužby:
- uživatel
- time
- Ping
Vytvořte databázové role pro každou službu:
CREATE USER user_service;
CREATE USER time_service;
CREATE USER ping_service;
Použití nástroje psql k vytvoření distribuovaných schémat
Po připojení k elastickému clusteru pomocí psql můžete dokončit některé základní úlohy.
Schéma můžete distribuovat dvěma způsoby:
- Ručně zavoláním
citus_schema_distribute(schema_name)funkce:
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');
Tato metoda také umožňuje převést existující běžná schémata na distribuovaná schémata.
Poznámka:
Můžete distribuovat pouze schémata, která neobsahují distribuované a referenční tabulky.
- Povolením konfigurační proměnné
citus.enable_schema_based_sharding. Proměnnou můžete změnit z parametrů koordinačního uzlu pro aktuální relaci nebo trvale. Při nastavení parametru ON se ve výchozím nastavení distribuují všechna vytvořená schémata.
SET citus.enable_schema_based_sharding TO ON;
CREATE SCHEMA AUTHORIZATION user_service;
CREATE SCHEMA AUTHORIZATION time_service;
CREATE SCHEMA AUTHORIZATION ping_service;
Spuštěním následujícího příkazu zobrazte seznam aktuálně distribuovaných schémat:
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)
Vytvoření tabulek pro ukázkové služby
Teď se můžete připojit k elastickému clusteru pro každou mikroslužbu. V následujícím příkladu má databáze elastického clusteru název Citus. Z relace psql můžete použít příkaz \c k přepnutí na jiného uživatele.
\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
);
Konfigurace služeb
V tomto kurzu používáme jednoduchou sadu služeb. Můžete je získat klonováním tohoto veřejného úložiště:
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
Než však spustíte služby, upravte user/app.pyping/app.pya time/app.py soubory, které poskytují konfiguraci připojení pro váš elastický cluster:
# Database configuration
db_config = {
'host': 'EXAMPLE.postgres.database.azure.com',
'database': 'postgres',
'password': 'SECRET',
'user': 'ping_service',
'port': 5432
}
Po provedení změn uložte všechny upravené soubory a přejděte k dalšímu kroku spuštění služeb.
Provoz služeb
Přejděte do každého adresáře aplikace a spusťte je ve vlastním prostředí Python env.
cd user
pipenv install
pipenv shell
python app.py
Opakujte příkazy pro službu time a ping, po které můžete použít rozhraní API.
Vytvořte některé uživatele:
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
Vytvořte seznam vytvořených uživatelů:
curl http://localhost:5000/users
Získání aktuálního času:
Get current time:
Spusťte příkaz ping proti example.com:
curl -X POST -H "Content-Type: application/json" -d '{"host": "example.com"}' http://localhost:5002/ping
Prozkoumání databáze
Teď, když jste volali některé funkce rozhraní API, se ukládají data a můžete zkontrolovat, jestli citus_schemas odpovídají očekávání:
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)
Při vytváření schémat jste nezoznačili, na kterých počítačích se mají schémata vytvářet. Bylo to provedeno automaticky. Pomocí následujícího dotazu můžete zjistit, kde se nachází každé schéma:
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
Pro stručnost ukázkového výstupu na této stránce místo použití nodename jako IP adresy ji nahradíme místním hostitelem. Předpokládejme, že localhost:7001 je to uzel jeden a localhost:7002 je to uzel dva.
Uvidíte, že časová služba přistála na uzlu localhost:7001 , zatímco uživatel a služba ping sdílejí prostor na druhém uzlu localhost:7002. Ukázkové aplikace jsou zjednodušené a zde uvedené velikosti dat jsou zanedbatelné, ale předpokládejme, že jste ovlivněni nerovnoměrným využitím prostoru úložiště mezi uzly. Mělo by větší smysl mít dvě menší služby pro čas a ping běžící na jednom uzlu, zatímco velká uživatelská služba běží na vlastním uzlu.
Snadno vyrovnáváte cluster podle velikosti disku:
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)
Až budete hotovi, můžete zkontrolovat, jak vypadá nové rozložení:
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)
Podle očekávání se schémata přesunou a máme vyváženější cluster. Tato operace je pro aplikace transparentní. Nemusíte je ani restartovat, ale budou dál obsluhovat dotazy.