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 --versionCentOS/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-16macOS 安装
bash
# 使用 Homebrew 安装
brew install postgresql@16
# 启动服务
brew services start postgresql@16
# 验证安装
psql --versionWindows 安装
- 下载安装程序:PostgreSQL 官方下载
- 运行安装向导
- 设置超级用户密码
- 保持默认端口 5432
- 完成安装
数据库配置
创建数据库和用户
使用 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 postgresqlDNS-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;
"