0

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ình postgres đang ngốn nhiều RAM nhất.

  • Hậu quả: Khi 1 tiến trình postgres trê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 = 2 và 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ỗi Out of memory trả 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ặc relatime). Nếu không có noatime, mỗi lần Greenplum đọc một file dữ liệu để chạy lệnh SELECT, 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ị readahead của ổ đĩa lên 16384 (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:

  1. File hostfile_all (chứa tất cả các máy trong cụm):

    Plaintext

    mdw
    smdw
    sdw1
    sdw2
    
    
  2. 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êng gpadmin.

  • 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ình postgres gâ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 noatime và tăng blockdev readahead lên 16384.

  • 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí