运维打铁: PostgreSQL 数据库性能优化与高可用方案

文章目录

思维导图

PostgreSQL 性能优化与高可用方案 性能优化 高可用方案 查询优化 配置参数调优 存储优化 索引优化 查询语句优化 内存参数 并发参数 磁盘 I/O 优化 表空间管理 主从复制 流复制 集群方案 PgPool-II PgBouncer

一、性能优化

1. 查询优化

索引优化

索引可以加快查询速度,下面是创建索引的示例代码:

sql 复制代码
-- 创建单列索引
CREATE INDEX idx_users_name ON users (name);

-- 创建多列索引
CREATE INDEX idx_orders_customer_product ON orders (customer_id, product_id);
查询语句优化

避免使用 SELECT *,尽量指定需要的列。

sql 复制代码
-- 不推荐
SELECT * FROM users;

-- 推荐
SELECT id, name, email FROM users;

2. 配置参数调优

内存参数

修改 postgresql.conf 文件中的 shared_buffers 参数,增加共享缓冲区的大小。

plaintext 复制代码
# 修改前
shared_buffers = '128MB'

# 修改后
shared_buffers = '512MB'
并发参数

调整 max_connections 参数,增加最大连接数。

plaintext 复制代码
# 修改前
max_connections = 100

# 修改后
max_connections = 200

3. 存储优化

磁盘 I/O 优化

使用高速磁盘,如 SSD,并调整 fsync 参数。

plaintext 复制代码
# 修改前
fsync = on

# 修改后
fsync = off

注意fsync = off 会提高性能,但在系统崩溃时可能会丢失数据。

表空间管理

创建新的表空间并将大表移动到该表空间。

sql 复制代码
-- 创建表空间
CREATE TABLESPACE large_data_tbs LOCATION '/data/large_data';

-- 将表移动到新的表空间
ALTER TABLE large_table SET TABLESPACE large_data_tbs;

二、高可用方案

1. 主从复制

主从复制是一种基本的高可用方案,以下是配置主从复制的步骤:

主库配置

修改 postgresql.conf 文件:

plaintext 复制代码
wal_level = replica
max_wal_senders = 10
wal_keep_segments = 32

修改 pg_hba.conf 文件,允许从库连接:

plaintext 复制代码
host    replication     replica_user    192.168.1.0/24    md5
从库配置

使用 pg_basebackup 命令从主库复制数据:

bash 复制代码
pg_basebackup -h 192.168.1.100 -D /var/lib/postgresql/13/main -U replica_user -P

修改 postgresql.conf 文件:

plaintext 复制代码
hot_standby = on

创建 recovery.conf 文件:

plaintext 复制代码
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.100 port=5432 user=replica_user password=password'

2. 流复制

流复制是一种实时复制方案,配置步骤与主从复制类似,但需要在主库和从库上进行更多的配置。

主库配置

修改 postgresql.conf 文件:

plaintext 复制代码
wal_level = logical
max_wal_senders = 10
wal_keep_segments = 32
从库配置

使用 pg_basebackup 命令从主库复制数据,然后修改 postgresql.conf 文件:

plaintext 复制代码
hot_standby = on

创建 recovery.conf 文件:

plaintext 复制代码
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.100 port=5432 user=replica_user password=password'

3. 集群方案

PgPool-II

PgPool-II 是一个 PostgreSQL 的中间件,用于实现负载均衡和高可用。以下是简单的配置示例:

plaintext 复制代码
# pgpool.conf
listen_addresses = '*'
port = 9999
backend_hostname0 = '192.168.1.100'
backend_port0 = 5432
backend_weight0 = 1
backend_hostname1 = '192.168.1.101'
backend_port1 = 5432
backend_weight1 = 1
PgBouncer

PgBouncer 是一个轻量级的 PostgreSQL 连接池,以下是简单的配置示例:

plaintext 复制代码
# pgbouncer.ini
[databases]
* = host=192.168.1.100 port=5432

[pgbouncer]
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = users.txt

总结

PostgreSQL 数据库的性能优化和高可用方案是运维工作中的重要内容。通过查询优化、配置参数调优等方法可以提高数据库的性能,而主从复制、流复制和集群方案可以保证数据库的高可用性。在实际应用中,需要根据具体的业务需求和环境选择合适的优化和高可用方案。同时,定期监控数据库的性能和状态,及时调整配置参数,以确保数据库的稳定运行。