Skip to content

PostgreSQL 配置

PostgreSQL 是 DNS-Go 推荐使用的数据库,提供优秀的性能和可靠性。

安装 PostgreSQL

Linux 安装

Ubuntu/Debian:

bash
# 更新包列表
sudo apt-get update

# 安装 PostgreSQL
sudo apt-get install -y postgresql postgresql-contrib

# 启动服务
sudo systemctl start postgresql
sudo systemctl enable postgresql

# 验证安装
psql --version

CentOS/RHEL:

bash
# 安装 PostgreSQL 仓库
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 禁用默认 PostgreSQL 模块
sudo dnf -qy module disable postgresql

# 安装 PostgreSQL 16
sudo dnf install -y postgresql16-server postgresql16-contrib

# 初始化数据库
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb

# 启动服务
sudo systemctl start postgresql-16
sudo systemctl enable postgresql-16

macOS 安装

bash
# 使用 Homebrew 安装
brew install postgresql@16

# 启动服务
brew services start postgresql@16

# 验证安装
psql --version

Windows 安装

  1. 下载安装程序:PostgreSQL 官方下载
  2. 运行安装向导
  3. 设置超级用户密码
  4. 保持默认端口 5432
  5. 完成安装

数据库配置

创建数据库和用户

使用 postgres 用户:

bash
# 切换到 postgres 用户
sudo -u postgres psql

在 psql 中执行:

sql
-- 创建用户
CREATE USER dnsgo WITH PASSWORD 'your_secure_password';

-- 创建数据库
CREATE DATABASE dns_go OWNER dnsgo;

-- 授权
GRANT ALL PRIVILEGES ON DATABASE dns_go TO dnsgo;

-- 退出
\q

配置远程访问(可选)

如果 PostgreSQL 和 DNS-Go 不在同一台服务器,需要配置远程访问。

编辑 postgresql.conf:

bash
# 找到配置文件位置
sudo -u postgres psql -c "SHOW config_file;"

# 编辑配置文件
sudo vim /etc/postgresql/16/main/postgresql.conf

修改监听地址:

conf
# 监听所有接口
listen_addresses = '*'

# 或指定 IP
listen_addresses = 'localhost,192.168.1.100'

编辑 pg_hba.conf:

bash
sudo vim /etc/postgresql/16/main/pg_hba.conf

添加访问规则:

conf
# 允许本地连接
local   all             all                                     scram-sha-256

# 允许指定网段访问
host    dns_go          dnsgo           192.168.1.0/24          scram-sha-256

# 或允许所有 IP(不推荐用于生产环境)
host    all             all             0.0.0.0/0               scram-sha-256

重启 PostgreSQL:

bash
sudo systemctl restart postgresql

DNS-Go 配置

配置文件

编辑 config/config.toml

toml
[database]
driver = "postgres"
host = "127.0.0.1"       # PostgreSQL 主机地址
port = 5432              # PostgreSQL 端口
username = "dnsgo"       # 数据库用户名
password = "your_secure_password"  # 数据库密码
database = "dns_go"      # 数据库名称
sslmode = "disable"      # SSL 模式:disable, require, verify-ca, verify-full

[postgres]
max_idle_conns = 10      # 最大空闲连接数
max_open_conns = 100     # 最大打开连接数
conn_max_lifetime = 1    # 连接最大生命周期(小时)

SSL 模式说明

模式说明适用场景
disable不使用 SSL本地开发、内网部署
require必须使用 SSL,但不验证证书公网部署
verify-ca使用 SSL 并验证 CA 证书高安全要求
verify-full使用 SSL 并验证证书和主机名最高安全要求

环境变量

也可以通过环境变量配置:

bash
export DB_HOST=localhost
export DB_PORT=5432
export DB_USER=dnsgo
export DB_PASSWORD=your_password
export DB_NAME=dns_go

性能优化

数据库参数调优

编辑 postgresql.conf

bash
sudo vim /etc/postgresql/16/main/postgresql.conf

推荐配置(根据内存调整):

conf
# 共享内存缓冲区(推荐设置为内存的 25%)
shared_buffers = 256MB

# 有效缓存大小(推荐设置为内存的 50-75%)
effective_cache_size = 1GB

# 工作内存(复杂查询使用)
work_mem = 16MB

# 维护工作内存(VACUUM、CREATE INDEX 等)
maintenance_work_mem = 128MB

# 并发连接数
max_connections = 200

# WAL 缓冲区
wal_buffers = 16MB

# 检查点配置
checkpoint_completion_target = 0.9
checkpoint_timeout = 10min
max_wal_size = 2GB
min_wal_size = 512MB

# 随机页面成本(SSD 设置为 1.1)
random_page_cost = 1.1

# 日志配置
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_min_duration_statement = 1000  # 记录慢查询(毫秒)

重启生效:

bash
sudo systemctl restart postgresql

连接池配置

在 DNS-Go 配置中调整连接池参数:

toml
[postgres]
max_idle_conns = 10      # 根据并发量调整
max_open_conns = 100     # 不超过 PostgreSQL 的 max_connections
conn_max_lifetime = 1    # 防止连接过期

备份与恢复

自动备份脚本

创建备份脚本:

bash
sudo tee /opt/backup/backup-dns-go.sh > /dev/null <<'EOF'
#!/bin/bash

# 配置
DB_NAME="dns_go"
DB_USER="dnsgo"
BACKUP_DIR="/opt/backup/dns-go"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30

# 创建备份目录
mkdir -p ${BACKUP_DIR}

# 执行备份
pg_dump -h localhost -U ${DB_USER} -d ${DB_NAME} \
  -F custom -f ${BACKUP_DIR}/dns_go_${DATE}.dump

# 压缩备份文件
gzip ${BACKUP_DIR}/dns_go_${DATE}.dump

# 删除旧备份
find ${BACKUP_DIR} -name "dns_go_*.dump.gz" -mtime +${RETENTION_DAYS} -delete

# 记录日志
echo "[$(date)] Backup completed: dns_go_${DATE}.dump.gz" >> ${BACKUP_DIR}/backup.log
EOF

chmod +x /opt/backup/backup-dns-go.sh

配置定时任务:

bash
# 编辑 crontab
crontab -e

# 每天凌晨 2 点备份
0 2 * * * /opt/backup/backup-dns-go.sh

手动备份

bash
# 使用 pg_dump 备份
pg_dump -h localhost -U dnsgo -d dns_go \
  -F custom -f dns_go_backup.dump

# 压缩备份
gzip dns_go_backup.dump

恢复数据

bash
# 解压备份文件
gunzip dns_go_backup.dump.gz

# 恢复数据
pg_restore -h localhost -U dnsgo -d dns_go \
  --clean --if-exists dns_go_backup.dump

# 或直接使用 psql
psql -h localhost -U dnsgo -d dns_go < dns_go_backup.sql

监控与维护

查看数据库状态

bash
# 查看活动连接
sudo -u postgres psql -c "SELECT * FROM pg_stat_activity;"

# 查看数据库大小
sudo -u postgres psql -c "SELECT pg_size_pretty(pg_database_size('dns_go'));"

# 查看表统计信息
sudo -u postgres psql -d dns_go -c "
SELECT schemaname, tablename, n_tup_ins, n_tup_upd, n_tup_del
FROM pg_stat_user_tables
ORDER BY n_tup_ins DESC;
"

定期维护

bash
# VACUUM(回收空间)
sudo -u postgres psql -d dns_go -c "VACUUM ANALYZE;"

# REINDEX(重建索引)
sudo -u postgres psql -d dns_go -c "REINDEX DATABASE dns_go;"

故障排查

连接失败

bash
# 检查 PostgreSQL 状态
sudo systemctl status postgresql

# 检查监听地址
sudo netstat -tlnp | grep 5432

# 查看连接日志
sudo tail -f /var/log/postgresql/postgresql-16-main.log

性能问题

bash
# 查看慢查询
sudo -u postgres psql -c "
SELECT query, calls, mean_time, total_time
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;
"

# 查看锁等待
sudo -u postgres psql -c "
SELECT blocked_locks.pid AS blocked_pid,
       blocked_activity.usename AS blocked_user,
       blocking_locks.pid AS blocking_pid,
       blocking_activity.usename AS blocking_user
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;
"

相关文档

基于 MIT 许可发布