Lesson 2 - Load balancing và Replication

24/02/2024 - 4 phút

Follow  on Google News

Cấu hình PGpool-II là một bước quan trọng trong quá trình triển khai cụm cơ sở dữ liệu PostgreSQL. Trong hướng dẫn này, chúng ta sẽ đi qua các bước để cấu hình PGpool-II trên hệ điều hành Ubuntu Linux, giúp bạn khai thác tối đa hiệu suất và tính sẵn sàng cao của cơ sở dữ liệu của mình.

Kiến trúc cài đặt

Trước khi bắt đầu ta cần chuẩn bị 4 máy chủ

IPHostnamevCPURAMDISKOS
192.168.50.10pgpool22 core4G60GUbuntu 22.04
192.168.50.11pg-master2 core4G60GUbuntu 22.04
192.168.50.12pg-slave-012 core4G60GUbuntu 22.04
192.168.50.13pg-slave-022 core4G60GUbuntu 22.04

Bước 3: Cấu hình Load Balancing và Replication

Bạn cần phải cấu hình Replication trước, nếu bạn chưa cấu hình thì tham khảo Cài đặt PostgreSQL 16 Replication

Thêm user replicator vào

Tạo tệp pcp.conf:

password_hash=$(pg_md5 PassKhongChilaPasss) && echo "postgre:$password_hash" >> /etc/pgpool2/pcp.conf

Tiếp theo, cấu hình tệp pgpool.conf trên máy chủ pgpool2:

sudo chown pgpool:pgpool /etc/pgpool2/pgpool.conf
sudo chmod 0600 /etc/pgpool2/pgpool.conf

Sau đó, mở tệp pgpool.conf bằng trình soạn thảo văn bản nano:

sudo nano /etc/pgpool2/pgpool.conf

Thêm cấu hình sau vào tệp pgpool.conf:

listen_addresses = '*' 
port = 9999 

backend_hostname0 = '192.168.56.11'
backend_port0 = 5432
backend_weight0 = 0
backend_data_directory0 = '/home/ubuntu/postgresql/master'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'postgresql-master'

backend_hostname1 = '192.168.56.12'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/home/ubuntu/postgresql/slave-01'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'postgresql-slave-01'

backend_hostname2 = '192.168.56.13'
backend_port2 = 5432
backend_weight2 = 2
backend_data_directory2 = '/home/ubuntu/postgresql/slave-02'
backend_flag2 = 'ALLOW_TO_FAILOVER'
backend_application_name2 = 'postgresql-slave-02'

log_statement = on
log_per_node_statement = on

sr_check_user = 'replicator'
health_check_user = 'replicator'
health_check_period = 10


# Cấu hình quản lý process 
process_management_mode = static
process_management_strategy = lazy
num_init_children = 320
min_spare_children = 1000
max_spare_children = 5000
max_pool = 1000

Trong đó listen_addresses là địa chỉ IP mà PGpool-II sẽ lắng nghe, port là cổng mà PGpool-II sẽ lắng nghe.

  • backend_hostname0, backend_port0, backend_weight0, backend_data_directory0, backend_flag0, backend_application_name0 là thông tin kết nối đến máy chủ postgresql-master.

  • backend_hostname1, backend_port1, backend_weight1, backend_data_directory1, backend_flag1, backend_application_name1 là thông tin kết nối đến máy chủ postgresql-slave-01.

  • backend_hostname2, backend_port2, backend_weight2, backend_data_directory2, backend_flag2, backend_application_name2 là thông tin kết nối đến máy chủ postgresql-slave-02.

  • log_statementlog_per_node_statement là cấu hình ghi log truy vấn.

  • sr_check_userhealth_check_user là tên người dùng kiểm tra sức khỏe của máy chủ cơ sở dữ liệu. replicator là user mà chúng ta đã tạo ở bước Cài đặt PostgreSQL 16 Replication

  • backend_flag là cờ cho phép FAILOVER khi máy chủ postgresql-master bị lỗi, ALLOW_TO_FAILOVER là cờ cho phép FAILOVER khi máy chủ postgresql-slave-01postgresql-slave-02 bị lỗi. Các cờ khác:

  • DISALLOW_TO_FAILOVER : không cho phép FAILOVER

  • ALWAYS_MASTER : luôn là máy chủ postgresql-master

  • process_management_mode là chế độ quản lý process, static là chế độ tĩnh, dynamic là chế độ động.

    • static : Số lượng process sẽ được quản lý tĩnh, không thay đổi.
    • dynamic : Số lượng process sẽ được quản lý động, tùy thuộc vào tải của hệ thống.
  • process_management_strategy là chiến lược quản lý process, lazy là chế độ lười biếng, smart là chế độ thông minh.

    • lazy : Chỉ tạo process khi cần thiết.
    • smart : Tạo process trước, tránh tình trạng chậm trễ khi cần thiết.
  • num_init_children là số lượng process ban đầu, nếu dưới sẽ tạo thêm process.

  • min_spare_children là số lượng process tối thiểu, nếu dưới sẽ tạo thêm process.

  • max_spare_children là số lượng process tối đa, nếu vượt quá sẽ bị kill.

  • max_pool là số lượng kết nối tối đa, nếu vượt quá sẽ bị từ chối kết nối.

Bước 4: Chạy kiểm tra cấu hình PGpool-II

Cuối cùng, chạy kiểm tra cấu hình PGpool-II:

sudo /usr/sbin/pgpool -n -f /etc/pgpool2/pgpool.conf -F /etc/pgpool2/pcp.conf

Sau khi cấu hình xong, bạn có thể kiểm tra trạng thái của PGpool-II bằng các truy cập vào bằng pg4admin :

  • ip_address là địa chỉ IP (192.168.56.5) của máy chủ pgpool2.
  • username mặc định là postgresql.
  • password là mật khẩu của tài khoản postgresql.

Bước 5: Tạo dữ liệu test

Ở đây mình sẽ tạo một cơ sở dữ liệu student10000 dữ liệu test :


# Tạo cơ sở dữ liệu student
CREATE TABLE student (
    student_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    date_of_birth DATE,
    grade_level INT CHECK (grade_level BETWEEN 1 AND 12)
);



WITH generated_data AS (
       SELECT 
           substring(md5(random()::text) from 1 for 8) AS first_name,
           substring(md5(random()::text) from 1 for 8) AS last_name,
           concat(substring(md5(random()::text) from 1 for 6), '@example.com') AS email,
           '1990-01-01'::date + random() * (age(now(), '1990-01-01'::date)) AS date_of_birth,
           (random() * 11 + 1)::int AS grade_level
       FROM generate_series(1,1000000) -- Generate 100 rows
   )
   INSERT INTO student (first_name, last_name, email, date_of_birth, grade_level)
   SELECT * FROM generated_data; 
  

Như ảnh ta thấy dữ liệu INSERT đã được thực hiện trên máy chủ postgresql-master.

Tiếp tục ta Query bằng lệnh SELECT trên PG4Admin:

SELECT * FROM student;

Sau đó ta quay lại xem log của máy chủ pgpool2

Như ảnh ta thấy SELECT đã được thực hiện trên máy chủ postgresql-slave-01 thông qua máy chủ pgpool2.

Như vậy chúng ta đã cấu hình thành công PGpool-II để thực hiện Load Balancing và Replication.