Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Dalam tutorial ini, Anda menggunakan Azure Database for PostgreSQL sebagai backend penyimpanan untuk beberapa layanan mikro. Tutorial menunjukkan penyiapan sampel dan operasi dasar kluster tersebut. Pelajari cara:
- Prasyarat
- Membuat peran untuk layanan mikro Anda
- Menggunakan utilitas psql untuk membuat peran dan skema terdistribusi
- Membuat tabel untuk layanan sampel
- Mengonfigurasi layanan
- Menjalankan layanan
- Menjelajahi database
Prasyarat
Buat kluster elastis dengan salah satu cara berikut:
- Membuat kluster elastis menggunakan portal
- Membuat kluster elastis menggunakan Bicep
- Membuat kluster elastis dengan templat ARM
Membuat peran untuk layanan mikro Anda
Anda dapat menempatkan skema terdistribusi secara dinamis dalam kluster elastis. Sistem dapat menyeimbangkannya kembali sebagai seluruh unit di seluruh simpul yang tersedia, sehingga Anda mendapatkan peningkatan efisiensi di seluruh sumber daya kluster Anda tanpa alokasi manual.
Saat Anda menerapkan sharding skema ke pola desain layanan mikro, Anda membuat skema database untuk setiap layanan mikro yang sesuai. Selain itu, gunakan PERAN yang berbeda untuk setiap layanan mikro saat menyambungkan ke database. Saat setiap pengguna terhubung, nama peran mereka ditempatkan pada awal search_path. Jika nama peran cocok dengan nama skema, Anda tidak memerlukan perubahan aplikasi tambahan untuk mengatur search_path yang benar.
Dalam contoh ini, gunakan tiga layanan mikro:
- pengguna
- time
- Ping
Buat peran database untuk setiap layanan:
CREATE USER user_service;
CREATE USER time_service;
CREATE USER ping_service;
Menggunakan utilitas psql untuk membuat skema terdistribusi
Setelah terhubung ke kluster elastis dengan menggunakan psql, Anda dapat menyelesaikan beberapa tugas dasar.
Anda dapat mendistribusikan skema dengan dua cara:
- Secara manual dengan memanggil fungsi
citus_schema_distribute(schema_name):
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');
Metode ini juga memungkinkan Anda untuk mengonversi skema reguler yang ada menjadi skema terdistribusi.
Nota
Anda hanya dapat mendistribusikan skema yang tidak berisi tabel terdistribusi dan referensi.
- Dengan mengaktifkan
citus.enable_schema_based_shardingvariabel konfigurasi. Anda dapat mengubah variabel untuk sesi saat ini atau secara permanen dari parameter simpul koordinator. Saat Anda mengatur parameter ke AKTIF, semua skema yang dibuat didistribusikan secara default.
SET citus.enable_schema_based_sharding TO ON;
CREATE SCHEMA AUTHORIZATION user_service;
CREATE SCHEMA AUTHORIZATION time_service;
CREATE SCHEMA AUTHORIZATION ping_service;
Jalankan perintah berikut untuk mencantumkan skema yang saat ini didistribusikan:
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)
Membuat tabel untuk layanan sampel
Anda sekarang dapat terhubung ke kluster elastis untuk setiap layanan mikro. Dalam contoh berikut, database kluster elastis bernama Citus. Dari sesi psql, Anda dapat menggunakan perintah \c untuk bertukar ke pengguna lain.
\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
);
Mengonfigurasi layanan
Dalam tutorial ini, kami menggunakan serangkaian layanan sederhana. Anda dapat memperolehnya dengan mengkloning repositori publik ini:
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
Namun sebelum Anda menjalankan layanan, edit user/app.py, ping/app.py, dan time/app.py file yang menyediakan konfigurasi koneksi untuk kluster elastis Anda:
# Database configuration
db_config = {
'host': 'EXAMPLE.postgres.database.azure.com',
'database': 'postgres',
'password': 'SECRET',
'user': 'ping_service',
'port': 5432
}
Setelah membuat perubahan, simpan semua file yang dimodifikasi dan lanjutkan ke langkah berikutnya menjalankan layanan.
Menjalankan layanan
Ubah ke setiap direktori aplikasi dan jalankan di python env mereka sendiri.
cd user
pipenv install
pipenv shell
python app.py
Ulangi perintah untuk layanan waktu dan ping, setelah itu Anda dapat menggunakan API.
Buat beberapa pengguna:
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
Daftar pengguna yang telah dibuat
curl http://localhost:5000/users
Dapatkan waktu saat ini:
Get current time:
Jalankan ping terhadap example.com:
curl -X POST -H "Content-Type: application/json" -d '{"host": "example.com"}' http://localhost:5002/ping
Menjelajahi database
Sekarang setelah Anda memanggil beberapa fungsi API, data disimpan dan Anda dapat memeriksa apakah citus_schemas mencerminkan apa yang diharapkan:
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)
Saat Anda membuat skema, Anda tidak menunjukkan mesin mana yang akan membuat skema. Itu dilakukan secara otomatis. Anda dapat melihat di mana setiap skema berada dengan kueri berikut:
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
Demi singkatnya contoh output pada halaman ini, alih-alih menggunakan nodename sebagai alamat IP, kami menggantinya dengan localhost. Asumsikan bahwa localhost:7001 adalah node satu dan localhost:7002 merupakan node dua.
Anda dapat melihat bahwa layanan waktu berada di simpul localhost:7001, sementara layanan pengguna dan layanan ping berada bersama pada simpul kedua localhost:7002. Contoh aplikasi sederhana, dan ukuran data di sini tidak signifikan, tetapi mari kita asumsikan bahwa Anda terpengaruh oleh pemanfaatan ruang penyimpanan yang tidak merata antara simpul. Akan lebih masuk akal untuk menempatkan dua layanan waktu dan ping yang lebih kecil pada satu node, sementara layanan pengguna yang besar berada di node-nya sendiri.
Anda dapat dengan mudah menyeimbangkan kembali kluster berdasarkan ukuran disk:
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)
Setelah selesai, Anda dapat memeriksa tampilan tata letak baru kami:
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)
Sesuai dengan harapan, skema dipindahkan dan kami memiliki kluster yang lebih seimbang. Operasi ini transparan untuk aplikasi. Anda bahkan tidak perlu menghidupkan ulang sistem, mereka terus memproses permintaan.