Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğreticide, birden çok mikro hizmetin depolama arka ucu olarak PostgreSQL için Azure Veritabanı'nı kullanacaksınız. Öğreticide, bu tür bir kümenin örnek kurulumu ve temel işlemi gösterilmektedir. Nasıl yapılacağını öğrenin:
- Önkoşullar
- Mikro hizmetleriniz için roller oluşturma
- Rolleri ve dağıtılmış şemaları oluşturmak için psql yardımcı programını kullanma
- Örnek hizmetler için tablolar oluşturma
- Hizmetleri yapılandırma
- Hizmetleri çalıştırma
- Veritabanını keşfetme
Önkoşullar
Aşağıdaki yollardan biriyle elastik küme oluşturun:
- Portalı kullanarak elastik küme oluşturma
- Bicep kullanarak elastik küme oluşturma
- ARM şablonuyla elastik küme oluşturma
Mikro hizmetleriniz için roller oluşturma
Dağıtılmış şemaları elastik bir kümeye dinamik olarak yerleştirebilirsiniz. Sistem bunları kullanılabilir düğümler arasında tüm birim olarak yeniden dengeleyebilir, böylece el ile ayırma olmadan küme kaynaklarınız arasında daha iyi verimlilik elde edersiniz.
Bir mikro hizmet tasarım desenine şema parçalama uyguladığınızda, ilgili her mikro hizmet için bir veritabanı şeması oluşturursunuz. Ayrıca, veritabanına bağlanırken her mikro hizmet için ayrı bir ROLE kullanın. Her kullanıcı bağlandığında, rollerinin adı search_path'in başına eklenir. Rol adı şema adıyla eşleşiyorsa, doğru search_path ayarlamak için ek uygulama değişikliğine ihtiyacınız yoktur.
Bu örnekte üç mikro hizmet kullanın:
- user
- time
- Ping gönderme
Her hizmet için veritabanı rollerini oluşturun:
CREATE USER user_service;
CREATE USER time_service;
CREATE USER ping_service;
Dağıtılmış şemalar oluşturmak için psql yardımcı programını kullanma
Psql kullanarak elastik kümeye bağlandıktan sonra bazı temel görevleri tamamlayabilirsiniz.
Şemayı iki yolla dağıtabilirsiniz:
- El ile
citus_schema_distribute(schema_name)işlevini çağırarak:
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');
Bu yöntem, mevcut normal şemaları dağıtılmış şemalara dönüştürmenize de olanak tanır.
Uyarı
Yalnızca dağıtılmış ve başvuru tabloları içermeyen şemaları dağıtabilirsiniz.
- Yapılandırma değişkenini
citus.enable_schema_based_shardingetkinleştirerek. Geçerli oturum için değişkeni değiştirebilir veya koordinatör düğümü parametrelerinden kalıcı olarak değiştirebilirsiniz. Parametresini ON olarak ayarladığınızda, oluşturulan tüm şemalar varsayılan olarak dağıtılır.
SET citus.enable_schema_based_sharding TO ON;
CREATE SCHEMA AUTHORIZATION user_service;
CREATE SCHEMA AUTHORIZATION time_service;
CREATE SCHEMA AUTHORIZATION ping_service;
Şu anda dağıtılmış olan şemaları listelemek için aşağıdaki komutu çalıştırın:
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)
Örnek hizmetler için tablolar oluşturma
Artık her mikro hizmet için elastik kümeye bağlanabilirsiniz. Aşağıdaki örnekte elastik küme veritabanı Citus olarak adlandırılmıştır. Psql oturumunda, \c komutunu kullanarak başka bir kullanıcıyla değiştirebilirsiniz.
\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
);
Hizmetleri yapılandırma
Bu öğreticide basit bir hizmet kümesi kullanacağız. Bu genel deposunu kopyalayarak bunları alabilirsiniz:
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
Ancak hizmetleri çalıştırmadan önce elastik kümeniz için user/app.py sağlayan , ping/app.pyve time/app.py dosyalarını düzenleyin:
# Database configuration
db_config = {
'host': 'EXAMPLE.postgres.database.azure.com',
'database': 'postgres',
'password': 'SECRET',
'user': 'ping_service',
'port': 5432
}
Değişiklikleri yaptıktan sonra, değiştirilen tüm dosyaları kaydedin ve hizmetleri çalıştırmanın sonraki adımına geçin.
Hizmetleri çalıştırma
Her uygulama dizinine geçin ve bunları kendi python env'lerinde çalıştırın.
cd user
pipenv install
pipenv shell
python app.py
Zaman ve ping hizmeti için komutları yineleyin; bundan sonra API'yi kullanabilirsiniz.
Bazı kullanıcılar oluşturun:
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
Oluşturulan kullanıcıları listeleyin:
curl http://localhost:5000/users
Geçerli saati alma:
Get current time:
ping komutunu example.com karşı çalıştırın:
curl -X POST -H "Content-Type: application/json" -d '{"host": "example.com"}' http://localhost:5002/ping
Veritabanını keşfetme
Artık bazı API işlevlerini çağırdığınıza göre veriler depolanır ve beklenenin yansıtılıp yansıtılamadığını citus_schemas kontrol edebilirsiniz:
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)
Şemaları oluşturduğunuzda, şemaların hangi makinelerde oluşturulacağını belirtmemişsinizdir. Otomatik olarak yapıldı. Aşağıdaki sorguyla her şemanın nerede olduğunu görebilirsiniz:
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
Bu sayfadaki örnek çıktının kısa olması için, IP adresi olarak kullanmak nodename yerine localhost ile değiştiririz.
localhost:7001 Düğüm bir ve localhost:7002 düğüm iki olduğunu varsayalım.
Zaman hizmetinin localhost:7001 düğümüne yerleştiğini, kullanıcı ve ping hizmetinin ise ikinci düğüm olan localhost:7002 üzerinde aynı alanı paylaştığını görebilirsiniz. Örnek uygulamalar basittir ve buradaki veri boyutları önemsizdir, ancak düğümler arasındaki eşit olmayan depolama alanı kullanımından etkilendiğinizi varsayalım. Büyük kullanıcı hizmeti kendi düğümünde yer alırken, iki küçük zaman ve ping hizmetinin tek bir düğümde yer alması daha mantıklı olacaktır.
Kümeyi disk boyutuna göre kolayca yeniden dengeleyebilirsiniz:
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)
İşiniz bittiğinde, yeni düzenimizin nasıl göründüğünü de kontrol edebilirsiniz:
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)
Beklentilere göre şemalar taşınır ve daha dengeli bir kümemiz olur. Bu işlem uygulamalar için saydamdır. Bunları yeniden başlatmanız gerekmez, sorgu sunmaya devam ederler.