部署greenplum7.2双节点集群
1.环境:
1.一台keylin10的服务器,部署两个docker容器,实现双节点集群部署;
2.创建Docker 网络
为Greenplum 容器创建一个自定义的 Docker 网络,这样可以方便地进行容器间的通信。
docker network create --subnet=172.19.0.0/16 gpnet
3.创建四个 Docker 卷,对应两个docker容器的数据挂载
docker volume create gpdata_a
docker volume create gpmaster_a
docker volume create gpdata_b
docker volume create gpmaster_b
4.启动两个Docker容器
4.1a容器
docker run --privileged=true -itd \
--name gpdb_a \
--hostname gpdb_a \
--network gpnet \
--ip 172.19.0.2 \
-v gpmaster_a:/opt/greenplum/data \
-v gpdata_a:/data \
-v /sys/fs/cgroup:/sys/fs/cgroup \
-p 5433:5432 \
-p 2222:22 \
-p 28080:28080 \
-e TZ=Asia/Shanghai \
lhrbest/greenplum:7.2.0 \
bash -c "systemctl disable systemd-modules-load.service dnf-makecache.service && /usr/sbin/sshd && tail -f /dev/null"
4.2b容器
docker run --privileged=true -itd \
--name gpdb_b \
--hostname gpdb_b \
--network gpnet \
--ip 172.19.0.3 \
-v gpdata_b:/data \
-v gpmaster_b:/opt/greenplum/data \
-v /sys/fs/cgroup:/sys/fs/cgroup \
-p 5434:5432 \
-p 2224:22 \
-p 28081:28080 \
-e TZ=Asia/Shanghai \
lhrbest/greenplum:7.2.0 \
bash -c "systemctl disable systemd-modules-load.service dnf-makecache.service && /usr/sbin/sshd && tail -f /dev/null"
5.更新 /etc/hosts 文件
进入每个容器内部更新 /etc/hosts 文件,添加其他节点的信息。例如,在 gpdb_a 和 gpdb_b 中都执行以下命令:
echo "172.19.0.2 gpdb_a" >> /etc/hosts
echo "172.19.0.3 gpdb_b" >> /etc/hosts
echo "172.19.0.2 gpdb7" >> /etc/hosts
6.修改sshd_config 配置
#vi /etc/ssh/sshd_config
# 启用 root 登录(默认可能被禁用)
PermitRootLogin yes
# AllowUsers 是白名单机制:只有列出的用户才能通过 SSH 登录。用户名之间用 空格 分隔。
AllowUsers gpadmin root
PasswordAuthentication yes
ChallengeResponseAuthentication yes
# 使用 PAM 进行认证(通常保持开启)
UsePAM yes
6.1重新启动
pkill -f /usr/sbin/sshd
/usr/sbin/sshd
6.2测试本地登录
ssh gpadmin@gpdb_a
7.修改/etc/pam.d/sshd
检查 /etc/pam.d/sshd 文件
注释掉或删除以下行(如果存在):
auth required pam_nologin.so
8.修改sysctl.conf
Linux 内核需要开启以下参数以支持容器间的通信:
#vi /etc/sysctl.conf
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-arptables = 0
再执行
sysctl -p
9.设置 SSH 密钥认证
为了使 Greenplum 可以跨节点操作,需要设置 SSH 无密码登录。可以在 gpdb_a 上生成密钥对,并将其公钥复制到所有节点(包括自身)。
在 gpdb_a:
ssh-keygen -t rsa -b 4096 -N '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
for host in gpdb_a gpdb_b; do ssh-copy-id gpadmin@$host; done
命令解析
cat ~/.ssh/id_rsa.pub: 这部分命令读取 ~/.ssh/id_rsa.pub 文件的内容,并将其输出到标准输出(通常是终端屏幕)。
>> ~/.ssh/authorized_keys: 这里使用了重定向操作符 >>。它将前面命令的标准输出追加(append)到指定的文件中,而不是覆盖该文件。如果目标文件不存在,则会创建该文件。因此,这条命令的作用是将当前用户的 SSH 公钥添加到 authorized_keys 文件的末尾。
10.创建主机列表文件(例如:hostfile)
echo "gpdb_a" > ~/hostfile_exkeys
echo "gpdb_b" >> ~/hostfile_exkeys
注:
使用 > 操作符会覆盖文件中的原有内容。
使用 >> 操作符会在文件末尾追加内容,而不会删除已有的数据。
11.手动创建两个节点配置文件
有两个 Segment 主机,每个3个,配置如下:
seg1 上运行 3 个 Primary Segment 实例
seg2 上运行 3 个 Primary Segment 实例
ARRAY_NAME="Greenplum Data Platform"
SEG_PREFIX=gpsne
PORT_BASE=40000
declare -a DATA_DIRECTORY=(
/data/primary
/data/primary
/data/primary
/data/primary
/data/primary
/data/primary )
declare -a MIRROR_DATA_DIRECTORY=(
/data/mirror
/data/mirror
/data/mirror
/data/mirror
/data/mirror
/data/mirror
)
MASTER_HOSTNAME=gpdb_a
MASTER_DIRECTORY=/opt/greenplum/data/master
MASTER_PORT=5432
TRUSTED_SHELL=ssh
CHECK_POINT_SEGMENTS=8
ENCODING=UNICODE
DATABASE_NAME=czpgdb
11.1Segment 的主要作用包括:
作用 | 描述 |
存储数据 | 每个 Segment 实例负责存储一部分数据(按分布键划分) |
执行查询 | 查询会被分发到各个 Segment 并行执行,提升整体性能 |
提供高可用性(可选) | 可为每个 Primary Segment 配置 Mirror Segment 来实现故障转移 |
负载均衡 | 多个 Segment 可以分散 I/O 和 CPU 压力,提高并发处理能力 |
11.2Segment 多的优点:
更高的并行度:更多的 Segment 可以同时处理更多数据块,加快查询速度。
更好的负载均衡:避免某些节点成为瓶颈。
更灵活的数据分布:适合大规模数据集的管理。
11.3Segment 多的缺点:
缺点 | 原因 |
资源消耗增加 | 每个 Segment 实例都需要一定的内存、CPU 和磁盘开销 |
管理复杂度上升 | Segment 越多,维护、监控、扩容等操作越复杂 |
元数据负担加重 | 系统表和目录信息会变得更大,影响启动和恢复速度 |
通信开销变大 | Segment 之间通信(Interconnect)会随着数量增加而变慢或不稳定 |
11.4最佳实践建议
场景 | 建议 |
小型测试环境 | 每台主机 1~2 个 Segment |
中小型生产环境 | 每台主机 2~4 个 Segment |
大型生产环境 | 每台主机 4~8 个 Segment(需高性能服务器支持) |
启用 Mirroring | Segment 数量翻倍,Mirror 分布在不同主机上 |
使用 SSD 或 NVMe 磁盘 | 可适当增加 Segment 数量以充分利用 I/O 能力 |
问题 | 答案 |
Segment 是什么? | 是 Greenplum 中存储数据和执行查询的基本单元 |
Segment 越多越好吗? | 不是,要根据硬件、数据量、查询负载综合考虑 |
如何选择合适数量? | 每台主机 2~8 个,总数量根据集群规模决定 |
Segment 对性能有何影响? | 多则并行能力强,但资源消耗和通信开销也更高 |
11.5Primary vs Mirror Segment
类型 | 作用 | 是否必须 |
Primary Segment | 存储实际数据并参与查询处理 | ✅ 必须 |
Mirror Segment | 提供数据冗余,用于故障切换 | ❌ 可选(但推荐) |
12.初始化 Greenplum 数据库
使用 gpinitsystem 命令初始化数据库系统。在 gpdb_a 上运行:
#su - gpadmin
gpinitsystem -c /home/gpadmin/gpinitsystem_config -h /home/gpadmin/hostfile_exkeys