第一次在Linux上部署PolarDB时,我踩过不少坑。记得有次因为没检查THP配置,数据库性能直接腰斩。下面这些步骤都是我用血泪教训换来的经验,跟着做能少走弯路。
透明大页(THP)是个双刃剑,对PolarDB来说更需要精细控制。先看看系统当前状态:
bash复制cat /sys/kernel/mm/transparent_hugepage/enabled
如果输出是[always] madvise never,说明THP处于全开状态。阿里云专家建议调整为madvise模式:
bash复制echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
为了让配置永久生效,记得在/etc/rc.local里加上这行命令。我遇到过服务器重启后配置丢失的情况,导致数据库突然变慢,排查了半天才发现是THP恢复默认值了。
sysctl.conf的配置直接影响数据库的吞吐量。有次压测时发现连接数超过500就崩,后来发现是net.core.somaxconn值太小。完整配置应该这样:
bash复制# /etc/sysctl.conf
fs.aio-max-nr=1048576
net.core.somaxconn=4096
vm.swappiness=0 # 禁用swap,避免性能抖动
重点说下vm.swappiness=0这个参数。有次客户反映查询时快时慢,最后发现是系统在频繁使用swap。设置为0后性能立刻稳定了,特别是对于大内存机器特别重要。
执行sysctl -p生效后,建议用sysctl -a | grep somaxconn验证。我就遇到过配置文件写错参数名导致不生效的情况。
Linux默认的文件描述符限制根本撑不住高并发场景。新建/etc/security/limits.d/polardb_limits.conf文件:
bash复制* soft nofile 655360
* hard memlock unlimited # 重要!避免内存锁导致OOM
这里有个坑:修改后需要重新登录才生效。我有次改完直接测试发现没变化,还以为配置错了,其实只是没退出当前会话。
千万别用root直接跑数据库!创建专用用户更安全:
bash复制groupadd -g 2000 polardb
useradd -u 2000 -g polardb -m -s /bin/bash polardb
密码建议用openssl rand -base64 12生成随机字符串。曾经有客户用简单密码被爆破,数据全被加密勒索,血淋淋的教训。
拿到安装包后别急着执行,先做完整性校验:
bash复制rpm -K PolarDB-O-0200-2.0.0-20201023165925.alios7.x86_64.rpm
安装时加上-v -h参数能看到进度条:
bash复制rpm -ivh PolarDB*.rpm --nodeps
注意--nodeps参数仅在确认依赖已满足时使用。我有次漏装libicu导致安装失败,又得从头开始。
~/.bash_profile的配置直接影响日常使用体验:
bash复制export PGDATA=/polardb/data # 建议用独立分区
export PGHOME=/usr/local/polardb
export PATH=$PGHOME/bin:$PATH
重点说下PGDATA路径:一定要确保目录为空且权限正确。有次初始化失败就是因为之前测试留下的lost+found目录。
执行初始化前先确认磁盘空间:
bash复制df -h /polardb
初始化命令要带上校验参数:
bash复制initdb -D $PGDATA --data-checksums -W
-W参数会提示设置密码,比后期改密码更安全。遇到过没设密码被入侵的案例,数据全被清空。
postgresql.conf的这几个参数必须改:
bash复制max_connections = 1024 # 根据内存调整,每个连接约10MB
shared_buffers = 8GB # 建议内存的25%
work_mem = 16MB # 复杂查询用更多内存
修改配置后别急着重启,先检查语法:
bash复制pg_ctl -D $PGDATA reload
有次我把shared_buffers设成80GB(其实内存才16G),导致服务起不来,排查了半天。
启动时建议记录日志:
bash复制pg_ctl start -D $PGDATA -l /polardb/log/start.log
检查状态的小技巧:
bash复制pg_isready -h localhost -p 5432
遇到过服务显示running却无法连接的情况,其实是端口冲突,用netstat -tulnp一看就明白了。
高并发场景一定要配连接池:
bash复制max_connections = 200
pool_size = 50 # 每个worker的连接数
reserve_pool = 10 # 应急连接
有次618大促,连接数暴涨把数据库打挂,加了连接池后稳定支撑5000QPS。
开启慢查询日志:
bash复制log_min_duration_statement = 1000 # 记录1秒以上查询
log_checkpoints = on
配置完记得创建日志目录并授权:
bash复制mkdir -p /polardb/log/pg_log
chown -R polardb:polardb /polardb/log
曾经有个慢查询把IO打满,就是靠这个日志找出的元凶。
遇到"could not connect to server"时:
pg_hba.conf是否允许当前IP连接/polardb/log/postgresql.log找线索有次改完配置死活连不上,最后发现是防火墙没开5432端口,现在我都先systemctl stop firewalld测试了。
用pgbench快速验证:
bash复制pgbench -i -s 100 polardb # 初始化100倍数据
pgbench -c 50 -j 2 -T 60 polardb
重点关注TPS和latency指标。有次测试发现性能不达标,最后发现是磁盘IOPS被其他服务占满。
电商业务典型配置:
bash复制random_page_cost = 1.1 # SSD磁盘设低些
effective_cache_size = 24GB # 可用内存的70%
maintenance_work_mem = 1GB # 加速VACUUM
双11前我们把这些参数调优后,高峰期性能提升了40%。