8

Giới thiệu

Những DBA là chuyên gia trong một hệ thống cơ sở dữ liệu sẽ tìm kiếm các hệ thống cơ sở dữ liệu khác có "các tính năng tương tự". Xu hướng của con người là nhìn vào bất kỳ công nghệ mới nào và so sánh nó với một thế giới mà họ đã quen thuộc.

Hầu hết thời gian, tôi liên tục giải quyết các DBA Oracle đang tìm kiếm các tính năng hoặc thiết lập tương tự trong PostgreSQL, nhưng lần này là cho MySQL DBA. Trong lịch sử, MySQL vận chuyển mysqld_multi để quản lý nhiều phiên bản MySQL trên một máy chủ. Mặc dù đây không phải là một tính năng cốt lõi trong MySQL, mà là một tính năng bao bọc, tôi hiểu rằng nó là một thứ được sử dụng rộng rãi và đồng nghiệp của tôi là Fernando đã viết blog về nó .

Trong một cuộc thảo luận của tôi cách đây vài tháng, một người bạn của tôi đã hỏi cách PostgreSQL quản lý nhiều phiên bản và tôi đã đồng ý viết về điều đó vì nó sẽ hữu ích cho bất kỳ ai đang tìm kiếm một thiết lập tương tự. Tóm lại, câu trả lời là cộng đồng PostgreSQL quản lý nó bằng cách sử dụng các tập lệnh trình bao bọc và trình quản lý dịch vụ Linux. Trong thời gian này, systemd bắt đầu trở thành một tiêu chuẩn giữa các bản phân phối Linux và mọi gói Linux bắt đầu dựa vào nó để quản lý dịch vụ.

Trước sự ngạc nhiên của tôi, một số gói MySQL bắt đầu xóa mysqld_multi khỏi gói và bắt đầu chuyển sang systemd như một cách để quản lý nhiều phiên bản . Vì vậy, mọi thứ đang được hội tụ vào systemd trong thế giới mới.

Trong bài viết này, tôi muốn chỉ ra cách điều này có thể được thực hiện trên Ubuntu / Debian Linux vì tất cả các tập lệnh trình bao bọc cần thiết đã tồn tại trên các bản phân phối đó như một phần của gói postgres-common , được cài đặt theo mặc định với mọi cài đặt PostgreSQL. Không có gì ngăn cản chúng tôi thực hiện một trình bao bọc tương tự trên các bản phân phối Linux khác.

$ dpkg -l | grep postgresql-common
ii postgresql-common 201.pgdg18.10+1 all PostgreSQL database-cluster manager

Cài đặt mặc định

Cài đặt mặc định của PostgreSQL từ apt repo của postgresql.org sẽ chứa postgresql-phổ biến cho Debian / Ubuntu.

$ sudo apt install postgresql-11
Reading package lists... Done
...
The following additional packages will be installed:
  libllvm7 libpq5 libsensors4 pgdg-keyring postgresql-client-11 postgresql-client-common postgresql-common ssl-cert sysstat
Suggested packages:
...

Theo mặc định, một phiên bản / cụm PostgreSQL sẽ được tạo với tên "main" sử dụng cổng mặc định của PostgreSQL 5432.

$ pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
11  main    5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log

Tất cả các tệp cấu hình bao gồm tệp tham số PostgreSQL nằm trong thư mục / etc / postgresql.

$ ls -R /etc/postgresql
/etc/postgresql:
11

/etc/postgresql/11:
main

/etc/postgresql/11/main:
conf.d  environment  pg_ctl.conf  pg_hba.conf  pg_ident.conf  postgresql.conf  start.conf

/etc/postgresql/11/main/conf.d:

postgres-common cung cấp một trình bao bọc pg_ctlcluster là trình bao bọc trên đầu pg_ctl

$ pg_ctlcluster 11 main status
pg_ctl: server is running (PID: 15544)
/usr/lib/postgresql/11/bin/postgres "-D" "/var/lib/postgresql/11/main" "-c" "config_file=/etc/postgresql/11/main/postgresql.conf"

Tuy nhiên, nhiều tệp bao gồm chứng chỉ bảo mật chỉ người dùng root mới có thể truy cập được. Việc tích hợp với systemd cho phép một giải pháp dễ dàng bắt đầu và dừng như sau:

$ sudo systemctl start postgresql@11-main
$ sudo systemctl stop postgresql@11-main

Nhiều phiên bản

Thêm một PostgreSQL mới cũng đơn giản như thực thi pg_createcluster với phiên bản của PostgreSQL và tên cụm.

$ pg_createcluster 11 standby1
Creating new PostgreSQL cluster 11/standby1 ...
/usr/lib/postgresql/11/bin/initdb -D /var/lib/postgresql/11/standby1 --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/11/standby1 ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 11 standby1 start

Warning: systemd does not know about the new cluster yet. Operations like "service postgresql start" will not handle it. To fix, run:
  sudo systemctl daemon-reload
Ver Cluster  Port Status Owner    Data directory                  Log file
11  standby1 5433 down   postgres /var/lib/postgresql/11/standby1 /var/log/postgresql/postgresql-11-standby1.log

Bây giờ chúng ta hãy kiểm tra đầu ra ở trên và hiểu điều gì đang xảy ra:

  1. Thư mục dữ liệu mới: / var / lib / postgresql / 11 / standby1 được khởi tạo. Hãy nhớ rằng phiên bản mặc định có thư mục dữ liệu tại / var / lib / postgresql / 11 / main
  2. Initdb được gọi với hầu hết các giá trị tham số mặc định
  3. Bây giờ trở đi pg_ctlcluster có thể được sử dụng để khởi động và dừng Instance / Cluster như pg_ctlcluster 11 standby1 start
  4. Nên thực hiện tải lại daemon systemctl sudo để đảm bảo đăng ký dịch vụ thích hợp với systemd
  5. Cổng khả dụng tiếp theo: 5433 được tự động chọn cho phiên bản mới

Các giá trị tự động do pg_clustercreate lấy có thể được ghi đè bằng cách chỉ định các giá trị rõ ràng dưới dạng một tham số như sau:

$ pg_createcluster 11 anotherdb -d /home/postgres/adb -p 5439

Lệnh trên sẽ tạo một cá thể PostgreSQL 11 với tên "anotherdb" với thư mục dữ liệu tại / home / postgres / adb và lắng nghe tại cổng TCP / IP 5439.

Lệnh start cho pg_ctlcluster cho thấy một cách đáng tin cậy hơn để bắt đầu cùng một phiên bản bằng cách sử dụng systemd.

$ pg_ctlcluster 11 anotherdb start
Warning: the cluster will not be running as a systemd service. Consider using systemctl:
  sudo systemctl start postgresql@11-anotherdb

Việc dừng phiên bản cũng có thể được thực hiện theo một trong hai cách. Ví dụ:

pg_ctlcluster 11 anotherdb stop

hoặc là

sudo systemctl stop postgresql@11-anotherdb

Cho đến nay, chúng tôi đã thấy các trường hợp của cùng một phiên bản, nhưng chúng tôi không giới hạn ở cùng một phiên bản. Nếu chúng ta cần tạo một phiên bản của phiên bản PostgreSQL khác, chúng tôi chỉ cần cài đặt các tệp nhị phân PostgreSQL cho phiên bản tương tự.

$ sudo apt install postgresql-10

Cũng giống như phiên bản PostgreSQL 11 đã thảo luận, điều này cũng sẽ tạo một phiên bản / cụm "chính" theo mặc định.

Ver Cluster   Port Status Owner    Data directory                  Log file
10  main      5434 online postgres /var/lib/postgresql/10/main     /var/log/postgresql/postgresql-10-main.log

Chúng tôi có thể thêm các cụm khác bằng cách sử dụng phiên bản mới:

$ pg_createcluster 10 pg10test

Bây giờ chạy pg_lscluster sẽ hiển thị tất cả các phiên bản postgresql đang chạy:

$ pg_lsclusters
Ver Cluster   Port Status Owner    Data directory                  Log file
10  main      5434 online postgres /var/lib/postgresql/10/main     /var/log/postgresql/postgresql-10-main.log
10  pg10test  5435 online postgres /var/lib/postgresql/10/pg10test /var/log/postgresql/postgresql-10-pg10test.log
11  anotherdb 5439 online postgres /home/postgres/adb              /var/log/postgresql/postgresql-11-anotherdb.log
11  main      5432 online postgres /var/lib/postgresql/11/main     /var/log/postgresql/postgresql-11-main.log
11  standby1  5433 online postgres /var/lib/postgresql/11/standby1 /var/log/postgresql/postgresql-11-standby1.log

Tóm lược

Sự khác biệt chính là các công cụ postgres-common giữ tất cả các cấu hình trong cấu trúc thư mục dưới / etc / postgres, trong khi thế giới MySQL xử lý các tệp cấu hình đơn với nhiều phần như được ghi lại . Ví dụ: tất cả các tệp cấu hình cho phiên bản PostgreSQL 11 "anotherdb" sẽ nằm dưới: / etc / postgresql / 11 / anotherdb. Chủ yếu có 3 tệp cấu hình quyết định hành vi của dịch vụ:

  • Tệp môi trường chứa các biến môi trường có thể áp dụng cho phiên bản PostgreSQL
  • pg_ctl.conf chứa các tùy chọn cụ thể của cụm, cần được chuyển cho pg_ctl
  • start.conf quyết định hành vi khởi động cho dù khởi động tự động hay khởi động thủ công là bắt buộc
|