Gần đây, chúng tôi đã thông báo về việc phát hành ClusterControl 1.7.3 bao gồm nhiều cải tiến và các tính năng mới được bổ sung. Một trong những tính năng mới này là việc bổ sung hỗ trợ trong ClusterControl để cho phép người dùng thiết lập và quản lý nhiều phiên bản PostgreSQL trên cùng một máy chủ. Tính năng mới này là những gì chúng ta sẽ thảo luận trong blog dưới đây, bao gồm các lý do tại sao kiểu thiết lập này có thể giúp bạn tiết kiệm tài nguyên cũng như cung cấp hướng dẫn từng bước về cách đạt được kiểu cài đặt này trong ClusterControl.
Tại sao bạn cần cài đặt nhiều PostgreSQL trên một máy chủ duy nhất?
Với sự phát triển và cải tiến nhanh chóng của công nghệ ngày nay từ phần cứng đến phần mềm, phạm vi yêu cầu đã trở nên thích ứng, linh hoạt và có thể mở rộng hơn. Một số tổ chức thậm chí còn thích tận dụng nền tảng công nghệ vì việc mở rộng quy mô nó dễ dàng hơn. Ngoài ra, có những tình huống mà bạn có thể muốn triển khai một máy chủ cơ sở dữ liệu trên một máy chủ cao cấp, mạnh mẽ có chứa CPU lớn, nhiều bộ nhớ và các thiết bị lưu trữ nhanh, mạnh và không dễ bay hơi như SSD / Fusion IO / NVMe. Tuy nhiên, điều này đôi khi có thể gây lãng phí tài nguyên nếu bạn đang tìm cách chạy tài nguyên được chia sẻ của máy chủ cơ sở dữ liệu (chẳng hạn như sử dụng nó như một máy chủ, một máy sao lưu nóng hoặc thậm chí là một máy chủ xác minh dự phòng). Trong một số thiết lập nhất định, bạn có thể muốn sử dụng các tài nguyên có sẵn trong máy chủ mạnh mẽ của mình làm cả máy chủ phát triển và máy chủ QA để tránh chi phí phần cứng không mong muốn (thay vì mua một máy chuyên dụng hoặc tạo một phiên bản máy tính mới trên đám mây).
Cách thiết lập cài đặt nhiều PostgreSQL
Đối với ví dụ này, chúng tôi sẽ tạo một cụm có cài đặt nhiều PostgreSQL cùng với các phiên bản chạy nhiều PostgreSQL trong một máy chủ duy nhất bằng cách sử dụng ClusterControl.
Lưu ý:kể từ phiên bản hiện tại (tức là ClusterControl 1.7.3), ClusterControl không cho phép bạn tạo một cụm hoặc khởi tạo một cụm nếu bạn chỉ định thông tin chính và phụ với một phiên bản nhiều phiên bản được cài đặt PostgreSQL hoặc với nhiều -các động cơ của PostgreSQL chạy trong một máy chủ duy nhất. Tuy nhiên, bạn có thể nhập một nút được cài đặt nhiều phiên bản hoặc nhiều phiên bản PostgreSQL đang chạy trong một máy chủ duy nhất.
Chi tiết và Thông tin Máy chủ
Vì chúng tôi hiện không thể khởi tạo hoặc tạo một cụm khi có nhiều phiên bản được cài đặt của PostgreSQL, chúng tôi sẽ nhập một phiên bản hiện có hoặc đang chạy của PostgreSQL. Dưới đây là thông tin máy chủ.
IP: 192.168.30.10
Người dùng hệ điều hành: vagrant
Loại và phiên bản hệ điều hành: Ubuntu 16.04.6 LTS (xenial)
và một số thông tin từ /etc/postgresql/9.6/multi_pg/postgresql.conf của tôi,
data_directory = '/data/pgsql/master/data'
hba_file = '/etc/postgresql/9.6/multi_pg/pg_hba.conf'
ident_file = '/etc/postgresql/9.6/multi_pg/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.6-main.pid'
listen_addresses = '*'
port = 7654
max_connections = 100
shared_buffers = 511995kB
work_mem = 10239kB
maintenance_work_mem = 127998kB
dynamic_shared_memory_type = posix
wal_level = hot_standby
full_page_writes = on
wal_log_hints = on
checkpoint_completion_target = 0.9
max_wal_senders = 16
wal_keep_segments = 32
hot_standby = on
effective_cache_size = 1535985kB
logging_collector = on
log_timezone = 'Etc/UTC'
cluster_name = '9.6/multi_pg'
stats_temp_directory = '/var/run/postgresql/9.6-main.pg_stat_tmp'
datestyle = 'iso, mdy'
timezone = 'Etc/UTC'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
Trong đó một phiên bản hiện có đã được cài đặt:
[email protected]:/home/vagrant# dpkg -l | grep 'object-relational'
ii postgresql-11 11.4-1.pgdg16.04+1 amd64 object-relational SQL database, version 11 server
ii postgresql-9.2 9.2.24-1.pgdg16.04+1 amd64 object-relational SQL database, version 9.2 server
ii postgresql-9.6 9.6.14-1.pgdg16.04+1 amd64 object-relational SQL database, version 9.6 server
Ngoài ra, đối với thiết lập này, có các phiên bản bổ sung đang chạy ...
[email protected]:/data/pgsql/master# ps axufwww | grep 'postgre[s]'
postgres 1243 0.0 0.8 186064 17916 ? S 15:59 0:00 /usr/lib/postgresql/9.2/bin/postgres -D /var/lib/postgresql/9.2/main -c config_file=/etc/postgresql/9.2/main/postgresql.conf
postgres 1285 0.0 0.1 186064 3860 ? Ss 15:59 0:00 \_ postgres: checkpointer process
postgres 1286 0.0 0.2 186064 4620 ? Ss 15:59 0:00 \_ postgres: writer process
postgres 1287 0.0 0.1 186064 3860 ? Ss 15:59 0:00 \_ postgres: wal writer process
postgres 1288 0.0 0.2 186808 6008 ? Ss 15:59 0:00 \_ postgres: autovacuum launcher process
postgres 1289 0.0 0.1 145808 3736 ? Ss 15:59 0:00 \_ postgres: stats collector process
postgres 1246 0.0 1.2 309600 25884 ? S 15:59 0:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/main/postgresql.conf
postgres 1279 0.0 0.1 309600 4028 ? Ss 15:59 0:00 \_ postgres: 11/main: checkpointer
postgres 1280 0.0 0.1 309600 4028 ? Ss 15:59 0:00 \_ postgres: 11/main: background writer
postgres 1281 0.0 0.4 309600 9072 ? Ss 15:59 0:00 \_ postgres: 11/main: walwriter
postgres 1282 0.0 0.3 310012 6496 ? Ss 15:59 0:00 \_ postgres: 11/main: autovacuum launcher
postgres 1283 0.0 0.1 164516 3528 ? Ss 15:59 0:00 \_ postgres: 11/main: stats collector
postgres 1284 0.0 0.3 309892 6596 ? Ss 15:59 0:00 \_ postgres: 11/main: logical replication launcher
Đối với ví dụ này, chúng tôi sẽ sử dụng PostgreSQL 9.6.
Xây dựng Cụm PostgreSQL Master-Slave
Để tạo một cụm, chúng ta cần thiết lập cá thể PostgreSQL theo cách thủ công và sau đó nhập cá thể đó vào ClusterControl sau đó. Ngoài ra, chúng ta có thể tạo một cụm chỉ với một nút chính và để ClusterControl xử lý nó nhưng để làm điều này, chúng ta sẽ cần phải tắt tất cả các nút đang chạy khác. Điều này sẽ không lý tưởng nếu bạn đang hoạt động trên các máy chủ cơ sở dữ liệu PostgreSQL bận rộn.
Bây giờ, hãy thực hiện thiết lập thủ công ...
[email protected]:/etc/postgresql/9.6/multi_pg# sudo -iu postgres /usr/lib/postgresql/9.6/bin/pg_ctl -D /data/pgsql/master/data initdb
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.
creating directory /data/pgsql/master/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... Etc/UTC
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
/usr/lib/postgresql/9.6/bin/pg_ctl -D /data/pgsql/master/data -l logfile start
Sau đó, khởi động cơ sở dữ liệu bằng cách chạy lệnh dưới đây,
[email protected]:/etc/postgresql/9.6/multi_pg# sudo -iu postgres /usr/lib/postgresql/9.6/bin/pg_ctl -D /data/pgsql/master/data -o "-c config_file=/etc/postgresql/9.6/multi_pg/postgresql.conf" -l /var/log/postgresql/postgresql-9.6-master.log start
server starting
Bây giờ, hãy xác minh xem phiên bản có chạy và sử dụng cổng mong muốn mà chúng tôi đã sử dụng hay không:
[email protected]:/etc/postgresql/9.6/multi_pg# netstat -ntlvp46|grep postgres
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 1246/postgres
tcp 0 0 127.0.0.1:5433 0.0.0.0:* LISTEN 1243/postgres
tcp 0 0 0.0.0.0:7654 0.0.0.0:* LISTEN 18403/postgres
tcp6 0 0 :::7654 :::*
Bây giờ, nó có vẻ chính xác. Pid của 18403 cho thấy rằng chúng tôi có thể chạy nó và mở cả IPv4 và IPv6.
Bây giờ, hãy nhập nó vào ClusterControl. Đi tới Triển khai → Nhập máy chủ / cơ sở dữ liệu hiện có , để nhập nút chính mong muốn mà chúng tôi vừa thiết lập.
Sau khi bạn nhấn nút Nhập, bạn sẽ có thể có một cụm với một nút chính giống như bên dưới:
Bây giờ, hãy tạo một nô lệ trong cùng một máy chủ (tức là với IP 192.168.30.10).
Và đừng lo lắng, ClusterControl sẽ xử lý việc đó cho bạn như một nhật ký hoạt động công việc mẫu hiển thị bên dưới.
Bạn có thể thấy rằng nó đã được thiết lập và cài đặt thành công. Về mặt kỹ thuật, ClusterControl sẽ tạo một thư mục trong / etc / postgresql /
Bây giờ, hãy xác nhận với pg_lsclusters và xem liệu cá thể nhiều PostgreSQL có đang chạy song song trong một máy chủ lưu trữ hay không. Xem bên dưới:
[email protected]:/var/log/postgresql# pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
9.2 main 5433 online postgres /var/lib/postgresql/9.2/main /var/log/postgresql/postgresql-9.2-main.log
9.6 multi_pg 7654 online postgres /data/pgsql/master/data /var/log/postgresql/postgresql-9.6-master.log
9.6 pg_7653 7653 online,recovery postgres /data/pgsql/slave/data pg_log/postgresql-%Y-%m-%d_%H%M%S.log
11 main 5432 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
Ngoài ra, các chỉ số đối với các cụm Sao chép lôgic được xem bên dưới:
Thúc đẩy Slave trong một phiên bản chạy nhiều PostgreSQL trong một máy chủ duy nhất
Quảng cáo Slave rất dễ dàng cho một phiên bản chạy nhiều PostgreSQL trong một máy chủ duy nhất. Như bạn có thể thấy bên dưới, loại môi trường này hoạt động hoàn hảo khi nó được xử lý bởi ClusterControl.
Bây giờ, chúng ta hãy xem những gì xảy ra trong nền trong khi ClusterControl thúc đẩy nô lệ. Xem thông số và chi tiết công việc đầy đủ
[09:01:02]:Successfully promoted a new master.
[09:01:02]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: promote finished (this is the new master).
[09:01:02]:Servers after promote:
<em style='color: #1abc9c;'>192.168.30.10</em>:7653:
• Role: master (slaves: 1)
• Status: CmonHostOnline (NODE_CONNECTED)
• Receive/replay: 0/30020C0; 0/30020C0
<em style='color: #1abc9c;'>192.168.30.10</em>:7654:
• Role: slave (slaves: 0)
• Status: CmonHostOnline (NODE_CONNECTED)
• Receive/replay: 0/30020C0; 0/30020C0
• Master: 192.168.30.10:7653
[09:01:02]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Restarted with new master.
[09:01:02]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Started PostgreSQL.
[09:00:53]:<em style='color: #1abc9c;'>192.168.30.10</em>: done
server started
[09:00:53]:<em style='color: #1abc9c;'>192.168.30.10</em>: waiting for server to start....
[09:00:52]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Executing: su - postgres -c '/usr/lib/postgresql/9.6/bin/pg_ctl start -w -o "-p 7654" --pgdata=/etc/postgresql/9.6/multi_pg/ --log /var/log/postgresql/postgresql-11-main.log'
[09:00:51]:192.168.30.10:7654: Start postgreSQL node.
[09:00:51]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Starting PostgreSQL.
[09:00:51]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Successfully created '<em style='color: #109602;'>/data/pgsql/master/data/recovery.conf</em>'.
[09:00:50]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Creating '<em style='color: #109602;'>/data/pgsql/master/data/recovery.conf</em>': Setting <em style='color: #1abc9c;'>192.168.30.10</em>:7653 as master.
[09:00:50]:<em style='color: #1abc9c;'>192.168.30.10</em>: servers diverged at WAL position 0/3001890 on timeline 1
no rewind required
[09:00:49]:Running /usr/lib/postgresql/9.6/bin/pg_rewind --target-pgdata=/data/pgsql/master/data --source-server="host=192.168.30.10 port=7653 user=dbapgadmin password=***** dbname=postgres"
[09:00:47]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Granting host (<em style='color: #1abc9c;'>192.168.30.10</em>:7654).
[09:00:45]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Stopped PostgreSQL.
[09:00:38]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Waiting to stop.
[09:00:38]:192.168.30.10:7654: node is already stopped. No need to stop it.
[09:00:38]:192.168.30.10:7654: Stop postgreSQL node.
[09:00:38]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Stopping PostgreSQL.
[09:00:38]:Switching slaves to the new master.
[09:00:38]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Became master, ok.
[09:00:37]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Waiting to become a master.
[09:00:37]:<em style='color: #1abc9c;'>192.168.30.10</em>: server promoting
[09:00:36]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Attempting to promote using <strong style='color: #59a449;'>pg_ctl</strong>.
[09:00:36]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Promoting host.
[09:00:35]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Stopped PostgreSQL.
[09:00:28]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Waiting to stop.
[09:00:28]:<em style='color: #1abc9c;'>192.168.30.10</em>: done
server stopped
[09:00:28]:<em style='color: #1abc9c;'>192.168.30.10</em>: waiting for server to shut down....
[09:00:27]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Executing: su - postgres -c '/usr/lib/postgresql/9.6/bin/pg_ctl stop --pgdata=/etc/postgresql/9.6/multi_pg/'
[09:00:26]:192.168.30.10:7654: Stop postgreSQL node.
[09:00:26]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Stopping PostgreSQL.
[09:00:26]:<em style='color: #1abc9c;'>192.168.30.10</em>:7654: Stopping the current master.
[09:00:26]:Switching over to <em style='color: #1abc9c;'>192.168.30.10</em>:7653 (previous master is <em style='color: #1abc9c;'>192.168.30.10</em>:7654)
[09:00:26]:Servers:
<em style='color: #1abc9c;'>192.168.30.10</em>:7653:
• Role: slave (slaves: 0)
• Status: CmonHostOnline (NODE_CONNECTED)
• Receive/replay: 0/3001820; 0/3001820
• Master: 192.168.30.10:7654
<em style='color: #1abc9c;'>192.168.30.10</em>:7654:
• Role: master (slaves: 1)
• Status: CmonHostOnline (NODE_CONNECTED)
• Receive/replay: 0/3001820; 0/3001820
[09:00:26]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Current master is <em style='color: #1abc9c;'>192.168.30.10</em>:7654.
[09:00:26]:<em style='color: #1abc9c;'>192.168.30.10</em>:7653: Promoting server to master.
Job spec: {
"command": "promote_replication_slave",
"group_id": 1,
"group_name": "admins",
"job_data":
{
"clusterId": "6",
"slave_address": "192.168.30.10:7653"
},
"user_id": 1,
"user_name": "[email protected]"
}
Như bạn thấy, nó đã được xử lý trơn tru ngay cả trên cùng một máy chủ. Kết quả cấu trúc liên kết cho thấy rằng nó đã được xúc tiến thành công.
Kết luận
Chúng tôi rất vui mừng về việc phát hành ClusterControl 1.7.3 và nghĩ rằng nó có rất nhiều thứ để cung cấp. Chúng tôi cũng nghĩ rằng phiên bản Multi-PostgreSQL mới này chạy trên cùng một tính năng máy chủ lưu trữ là một bước tiến tuyệt vời khác trong việc cải thiện hỗ trợ tổng thể của chúng tôi cho PostgreSQL. Hãy dùng thử và cho chúng tôi biết suy nghĩ của bạn bên dưới về tính năng mới này.