Greenplum Database - Bài học 7: Cài đặt Greenplum Cluster chuẩn Production trên Linux: Tinh chỉnh Kernel, OS parameters và SSH Keys
Ở Bài học 6, chúng ta đã dùng Docker Compose để dựng nhanh một cụm Greenplum phục vụ việc học tập. Tuy nhiên, khi triển khai một hệ thống Data Warehouse thực tế tại doanh nghiệp (trên máy chủ Bare-metal hoặc Cloud VMs với hàng chục Terabyte dữ liệu), bạn không thể bê nguyên cấu hình mặc định của hệ điều hành Linux vào sử dụng.
Một hệ điều hành Linux nguyên bản được thiết kế cho các tác vụ đa dụng nhẹ nhàng. Trong khi đó, Greenplum là một "quái vật" MPP: mỗi máy chủ vật lý chạy hàng chục tiến trình PostgreSQL độc lập, mở hàng vạn kết nối mạng UDP cùng lúc và ngấu nghiến toàn bộ băng thông RAM/Disk. Nếu không tinh chỉnh hệ điều hành trước khi cài đặt, cụm Greenplum của bạn sẽ thường xuyên bị sập ngẫu nhiên do lỗi Out of Memory (OOM Killer), rớt gói tin Interconnect hoặc cạn kiệt File Descriptors.
Trong bài học này, chúng ta sẽ đi qua quy trình chuẩn mực từng bước để thiết lập và khởi tạo một cụm Greenplum Production trên hệ điều hành Linux (RHEL / Rocky Linux / AlmaLinux / Ubuntu).
1. Kiến trúc cụm chuẩn bị triển khai
Trong bài thực hành chuẩn Production này, giả sử chúng ta có 4 máy chủ Linux đã kết nối chung một mạng nội bộ tốc độ cao (10GbE):
┌─────────────────────────────────────────────────────────────────────────┐
│ MẠNG INTERCONNECT (10.10.10.0/24) │
└───┬───────────────────────┬───────────────────────┬─────────────────┬───┘
│ │ │ │
▼ ▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ mdw │ │ smdw │ │ sdw1 │ │ sdw2 │
│ 10.10.10.10 │ │ 10.10.10.11 │ │ 10.10.10.12 │ │ 10.10.10.13 │
├──────────────┤ ├──────────────┤ ├──────────────┤ ├──────────────┤
│ Master Node │ │Standby Master│ │• Primary 0,1 │ │• Primary 2,3 │
│ (Coordinator)│ │ (Dự phòng) │ │• Mirror 2,3 │ │• Mirror 0,1 │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
-
mdw(10.10.10.10): Master Host (Coordinator). -
smdw(10.10.10.11): Standby Master Host. -
sdw1(10.10.10.12): Segment Host 1 (Chứa 2 Primary Segments + 2 Mirror Segments). -
sdw2(10.10.10.13): Segment Host 2 (Chứa 2 Primary Segments + 2 Mirror Segments).
2. Bước 1: Chuẩn bị Hệ điều hành, User và Mạng (Thực hiện trên TẤT CẢ các Nodes)
Mọi thao tác ở Bước 1, Bước 2 và Bước 3 đều phải được cấu hình đồng nhất trên cả 4 máy chủ (mdw, smdw, sdw1, sdw2) dưới quyền root.
2.1. Khai báo /etc/hosts
Greenplum giao tiếp nội bộ hoàn toàn dựa vào Hostname. Để tránh phụ thuộc vào DNS bên ngoài có thể bị trễ, hãy khai báo cứng IP và Hostname vào file /etc/hosts trên tất cả các máy:
Bash
cat << 'EOF' >> /etc/hosts
10.10.10.10 mdw
10.10.10.11 smdw
10.10.10.12 sdw1
10.10.10.13 sdw2
EOF
2.2. Tạo nhóm và tài khoản quản trị gpadmin
Greenplum cấm chạy dưới quyền root vì lý do bảo mật. Toàn bộ cụm phải được quản lý bởi một tài khoản chuyên biệt (thường đặt tên là gpadmin):
Bash
groupadd gpadmin
useradd -g gpadmin -m -s /bin/bash gpadmin
echo "gpadmin:MatKhauManh@2026" | chpasswd
2.3. Tắt SELinux, Firewall nội bộ và đồng bộ thời gian (NTP/Chrony)
-
Firewall & SELinux: Giữa các Node trong cụm sẽ mở hàng ngàn cổng động (Dynamic Ports) cho Interconnect. Nếu Firewall chặn bất kỳ cổng nào, câu truy vấn sẽ bị treo vô thời hạn.
-
Đồng bộ thời gian (
chronyd): Trong hệ thống phân tán dùng cơ chế Two-Phase Commit và nhật ký WAL, lệch đồng hồ giữa các máy chủ sẽ gây lỗi sai lệch dữ liệu nghiêm trọng.
Bash
# Tắt SELinux (trên RHEL/Rocky Linux)
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
# Tắt Firewall nội bộ (hoặc mở toàn bộ dải mạng 10.10.10.0/24)
systemctl stop firewalld && systemctl disable firewalld
# Bật đồng bộ thời gian tự động
systemctl enable --now chronyd
3. Bước 2: Tinh chỉnh Linux Kernel (/etc/sysctl.conf) — Trái tim của sự ổn định
Đây là phần quan trọng nhất phân biệt một hệ thống Production ổn định với một hệ thống nghiệp dư. Hãy mở file /etc/sysctl.conf (hoặc tạo file /etc/sysctl.d/99-greenplum.conf) trên tất cả các máy chủ và thiết lập các thông số sau:
Ini, TOML
# 1. QUẢN LÝ BỘ NHỚ (MEMORY OVERCOMMIT) - QUAN TRỌNG SỐ 1!
vm.overcommit_memory = 2
vm.overcommit_ratio = 90
# 2. BỘ NHỚ CHIA SẺ (SHARED MEMORY CHO CÁC TIẾN TRÌNH POSTGRES)
kernel.shmmax = 500000000000
kernel.shmall = 4000000000
kernel.shmmni = 4096
# 3. SEMAPHORES (ĐỒNG BỘ KHÓA GIỮA HÀNG NGÀN TIẾN TRÌNH)
kernel.sem = 500 2048000 200 40960
# 4. TỐI ƯU MẠNG INTERCONNECT (UDP & TCP BUFFERS)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 4194304
net.core.wmem_default = 4194304
net.core.netdev_max_backlog = 250000
net.ipv4.ip_local_port_range = 10000 65535
# 5. TỐI ƯU GHI ĐĨA NỀN (DISK FLUSH & SWAPPINESS)
vm.swappiness = 10
vm.dirty_background_ratio = 3
vm.dirty_ratio = 10
Sau khi lưu file, chạy lệnh sysctl -p để áp dụng ngay lập tức.
Giải thích chuyên sâu: Tại sao vm.overcommit_memory = 2 lại mang tính sống còn?
-
Mặc định trên Linux,
vm.overcommit_memory = 0. Hệ điều hành cho phép các ứng dụng "xin khống" lượng RAM nhiều hơn tổng dung lượng RAM vật lý đang có. Khi các câu truy vấn lớn chạy đồng thời và dùng hết sạch RAM thật, nhân Linux sẽ kích hoạt OOM Killer (Out-Of-Memory Killer) đi bắn chết ngẫu nhiên một tiến trìnhpostgresđang ngốn nhiều RAM nhất. -
Hậu quả: Khi 1 tiến trình
postgrestrên Segment bị hệ điều hành giết đột ngột (SIGKILL), toàn bộ Segment đó bị sập (Panic) và phải khởi động lại từ đầu để đọc lại WAL, làm đứt gãy toàn bộ các câu truy vấn của cả công ty! -
Khi đặt
vm.overcommit_memory = 2vàvm.overcommit_ratio = 90: Linux tuyệt đối không cho phép cấp phát lố quá 90% RAM vật lý (+ Swap). Nếu một câu truy vấn đòi thêm RAM vượt ngưỡng này, Greenplum chỉ đơn giản là từ chối riêng câu truy vấn đó một cách êm đẹp với thông báo lỗiOut of memorytrả về cho người dùng, còn toàn bộ cụm cơ sở dữ liệu vẫn sống khỏe mạnh 100%!
4. Bước 3: Mở giới hạn tài nguyên (limits.conf) và Tối ưu Ổ cứng (Disk I/O)
4.1. Cấu hình /etc/security/limits.conf
Mỗi khi có 1 câu truy vấn chạy, mỗi Segment sẽ đẻ ra hàng loạt tiến trình con (QE) và mở hàng ngàn file vật lý (bảng Partition, bảng Columnar tạo ra rất nhiều file trên đĩa). Giới hạn mặc định 1024 của Linux sẽ bị chạm trần ngay lập tức.
Thêm vào cuối file /etc/security/limits.conf trên tất cả các máy:
Ini, TOML
* soft nofile 524288
* hard nofile 524288
* soft nproc 131072
* hard nproc 131072
4.2. Chuẩn bị Ổ cứng (Filesystem XFS & Read-Ahead)
-
Hệ thống tệp tin (Filesystem): Greenplum khuyến nghị bắt buộc dùng định dạng XFS (thay vì
ext4) cho các phân vùng chứa dữ liệu vì XFS xử lý các file dung lượng lớn và truy xuất song song tốt hơn vượt trội. -
Tùy chọn Mount (
/etc/fstab): Luôn mount ổ đĩa dữ liệu với tham sốnoatime(hoặcrelatime). Nếu không cónoatime, mỗi lần Greenplum đọc một file dữ liệu để chạy lệnhSELECT, hệ điều hành lại phải tốn một thao tác ghi xuống đĩa để cập nhật "thời gian truy cập cuối cùng", làm giảm tốc độ đọc đi đáng kể!
Đoạn mã
# Ví dụ cấu hình chuẩn trong /etc/fstab
/dev/nvme0n1p1 /data xfs rw,noatime,inode64,allocsize=16m 0 0
-
Tăng bộ đệm đọc trước (Blockdev Read-Ahead): Vì OLAP chủ yếu là quét tuần tự (Sequential Scan), hãy tăng giá trị
readaheadcủa ổ đĩa lên16384(8MB):Bash
blockdev --setra 16384 /dev/nvme0n1
5. Bước 4: Cài đặt Binary và Thiết lập SSH Không mật khẩu (Passwordless SSH)
Từ bước này trở đi, sau khi cài gói phần mềm Greenplum (RPM/DEB) lên tất cả các máy chủ và tạo thư mục dữ liệu thuộc quyền sở hữu của gpadmin:
Bash
# Tạo thư mục trên Master & Standby (mdw, smdw)
mkdir -p /data/master && chown -R gpadmin:gpadmin /data
# Tạo thư mục trên các Segment Hosts (sdw1, sdw2)
mkdir -p /data/primary /data/mirror && chown -R gpadmin:gpadmin /data
Chúng ta chuyển sang đăng nhập bằng tài khoản gpadmin trên máy chủ Master (mdw):
Bash
su - gpadmin
source /usr/local/greenplum-db/greenplum_path.sh
Tạo danh sách Hostfiles trên Master (mdw)
Tạo 2 file văn bản liệt kê danh sách máy chủ để các công cụ của Greenplum đọc:
-
File
hostfile_all(chứa tất cả các máy trong cụm):Plaintext
mdw smdw sdw1 sdw2 -
File
hostfile_segs(chỉ chứa các máy Segment Hosts):Plaintext
sdw1 sdw2
Trao đổi SSH Keys chéo toàn cụm với gpssh-exkeys
Master cần gửi lệnh điều khiển xuống các Segment Hosts và các Segment Hosts cũng cần nói chuyện với nhau mà không bị hỏi mật khẩu SSH. Thay vì phải tự gõ ssh-keygen và ssh-copy-id thủ công từng máy, Greenplum cung cấp công cụ tự động gpssh-exkeys:
Bash
# Chạy 1 lệnh duy nhất trên Master (nhập mật khẩu gpadmin khi được hỏi 1 lần đầu)
gpssh-exkeys -f hostfile_all
Kiểm tra xem Master đã có thể điều khiển toàn bộ cụm đồng loạt chưa bằng tiện ích gpssh:
Bash
gpssh -f hostfile_all -e "hostname && uptime"
(Nếu cả 4 máy chủ cùng trả về kết quả ngay lập tức mà không hỏi mật khẩu, tầng giao tiếp SSH đã hoàn tất!)
6. Bước 5: Kiểm tra phần cứng (gpcheckperf) và Khởi tạo cụm (gpinitsystem)
6.1. Đo kiểm hiệu năng phần cứng trước khi chạy (gpcheckperf)
Đừng bao giờ khởi tạo cụm mà chưa đo tốc độ thật của ổ cứng và mạng giữa các máy chủ. Hãy chạy lệnh sau trên Master:
Bash
gpcheckperf -f hostfile_segs -r dsN -d /data/primary
- Công cụ sẽ tự động ghi/đọc file hàng chục GB trên tất cả các Segment Hosts để đo băng thông Disk Write/Read (
d), băng thông RAM Stream (s) và bắn dữ liệu qua lại để đo tốc độ Network Interconnect (N). Nếu phát hiện máy chủ nào có ổ cứng lỗi hoặc cổng mạng chỉ nhận 1Gbps thay vì 10Gbps, bạn sẽ thấy ngay lập tức!
6.2. Tạo file cấu hình khởi tạo cụm (gpinitsystem_config)
Trên máy Master (mdw), tạo file cấu hình gpinitsystem_config để định nghĩa kiến trúc cụm:
Ini, TOML
# Tên định danh của cụm
ARRAY_NAME="Greenplum Production Cluster"
# Tiền tố tên thư mục của từng Segment (sẽ tạo ra gpseg0, gpseg1...)
SEG_PREFIX=gpseg
# Cổng của Master Node
MASTER_PORT=5432
MASTER_HOSTNAME=mdw
MASTER_DIRECTORY=/data/master
# Cấu hình Primary Segments (Khai báo 2 lần /data/primary nghĩa là tạo 2 Primary Segments trên mỗi máy)
PORT_BASE=6000
declare -a DATA_DIRECTORY=(/data/primary /data/primary)
# Cấu hình Mirror Segments (Bật dự phòng tự động)
MIRROR_PORT_BASE=7000
declare -a MIRROR_DATA_DIRECTORY=(/data/mirror /data/mirror)
# Bảng mã mặc định và Database khởi tạo đầu tiên
ENCODING=UNICODE
DATABASE_NAME=analytics_dw
6.3. Chạy lệnh khởi tạo cụm (gpinitsystem)
Gõ lệnh sau trên Master để Greenplum tự động tạo Master, rải đều các Primary Segments, thiết lập các Mirror Segments theo kiểu Spread Mirroring (-S) và cấu hình luôn Standby Master (-s smdw):
Bash
gpinitsystem -c gpinitsystem_config -h hostfile_segs -s smdw -S
Quá trình này diễn ra hoàn toàn tự động trong khoảng 2–5 phút. Khi màn hình hiện thông báo: Greenplum Database instance successfully created — xin chúc mừng, bạn đã chính thức dựng xong một cụm Data Warehouse MPP chuẩn Production!
Cuối cùng, thêm các biến môi trường vào file ~/.bashrc của gpadmin trên Master để sử dụng lâu dài:
Bash
cat << 'EOF' >> ~/.bashrc
source /usr/local/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/data/master/gpseg-1
export PGPORT=5432
export PGDATABASE=analytics_dw
EOF
source ~/.bashrc
Tóm tắt Bài học 7
-
Cài đặt Greenplum chuẩn Production đòi hỏi sự chuẩn bị kỹ lưỡng ở tầng hệ điều hành Linux: đồng bộ
/etc/hosts, tắt Firewall nội bộ/SELinux, bật đồng bộ thời gian Chrony/NTP và chạy dưới tài khoản riênggpadmin. -
Tham số Kernel sống còn là
vm.overcommit_memory = 2để ngăn chặn Linux OOM Killer bắn chết tiến trìnhpostgresgây sập toàn cụm khi truy vấn ngốn nhiều RAM. -
Ổ đĩa lưu trữ dữ liệu nên định dạng XFS, mount với tùy chọn
noatimevà tăngblockdev readaheadlên16384. -
Bộ 3 công cụ cốt lõi khi triển khai cụm:
gpssh-exkeys(trao đổi SSH không mật khẩu),gpcheckperf(đo tốc độ Disk/RAM/Network trước khi cài) vàgpinitsystem(khởi tạo đồng loạt Master, Standby Master, Primary & Mirror Segments).
Ở bài học tiếp theo (Bài học 8 — bài cuối cùng của Học phần 1), chúng ta sẽ làm chủ Hệ sinh thái công cụ quản trị: gpstart, gpstop, gpstate và gpconfig để biết cách bật/tắt cụm an toàn, kiểm tra trạng thái hệ thống và thay đổi tham số cấu hình cho hàng trăm PostgreSQL instances chỉ bằng 1 dòng lệnh duy nhất.
All rights reserved