1. 环境准备与基础概念扫盲
大家好,我是老张,在数据库运维这个坑里摸爬滚打了十几年,今天想和大家聊聊 PostgreSQL 主备同步那点事儿。很多朋友一听到“主备同步”、“高可用”就觉得头大,感觉是大型互联网公司才玩得转的高级货。其实不然,哪怕你手里只有两台普通的云服务器,花上一个下午的时间,也能亲手搭建出一套具备故障切换能力的数据库环境。这就像给家里的贵重物品上个保险,平时用不上,关键时刻能救命。咱们今天不谈那些晦涩难懂的理论,就聊怎么一步步把它做出来,过程中会遇到哪些坑,以及怎么填平这些坑。
首先得搞清楚,PostgreSQL 的主备同步,核心靠的是一个叫“流复制”的技术。你可以把它想象成主库有一支笔,在写日记(WAL日志),而备库则实时地拿着一个复写纸,同步抄写这份日记。主库上所有的数据增删改操作,都会被记录成日记条目,然后几乎实时地“流”向备库。这样,一旦主库因为硬件故障或者维护需要停机,备库就能立刻顶上,因为它手里的日记和主库几乎一样新。这里有个关键点,流复制分为“同步”和“异步”两种模式。异步模式就像主库写完日记后,把日记本往备库方向一扔就不管了,备库自己慢慢抄,这中间可能会有毫秒级的延迟,但对主库的性能影响最小,是生产环境最常用的方式。同步模式则要求主库必须等备库确认“我抄好了”,自己才能提交事务,这保证了数据的零丢失,但会牺牲一些响应时间。我们今天实战的,就是最主流的异步流复制。
为了让大家能无障碍地跟着操作,我选择用 Docker 来部署。这能省去很多在物理机上安装、配置依赖的麻烦,环境隔离也干净。你需要准备两台安装了 Docker 和 Docker Compose 的服务器(虚拟机或云主机都行),网络要能互通。我实验的环境如下,你可以用自己的 IP 替换:
| 节点角色 | IP地址 | PostgreSQL版本 | 宿主机系统 |
|---|---|---|---|
| 主库 | 172.27.1.11 | PostgreSQL 14 | CentOS 7.9 |
| 备库 | 172.27.1.12 | PostgreSQL 14 | CentOS 7.9 |
为什么选 PostgreSQL 14?因为它足够稳定,且一些管理命令比老版本更友好。当然,用 11、12、13 或者更新的 15、16 版本,整体流程也大同小异。记住,主备库的 PostgreSQL 大版本必须严格一致,否则复制会失败。好了,基础概念和准备工作就绪,咱们挽起袖子开始干。
2. 主库配置:打好地基
配置主库,就像是给整个复制体系定下规矩。这一步的细节决定了后续流程是否顺畅。咱们从编写 Docker Compose 文件开始。
2.1 编写主库的 Docker Compose 文件
首先,在主库服务器上创建一个工作目录,比如 pg-master,然后创建 docker-compose.yml 文件。这个文件定义了我们的 PostgreSQL 容器如何运行。
version: '3.8'
services:
postgres:
image: postgres:14-alpine
container_name: postgres-master
restart: unless-stopped
ports:
- "5432:5432"
volumes:
- "./pgdata:/var/lib/postgresql/data"
- "./postgresql.conf:/var/lib/postgresql/data/postgresql.conf:ro"
- "./pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf:ro"
environment:
POSTGRES_PASSWORD: "YourStrongPassword123!"
POSTGRES_USER: "dbadmin"
POSTGRES_DB: "mydb"
TZ: "Asia/Shanghai"
我来解释几个关键点:第一,我用了 postgres:14-alpine 镜像,Alpine 版本体积小,安全补丁更新及时。第二,我把本地的 postgresql.conf 和 pg_hba.conf 配置文件以只读方式挂载进容器。这样做的好处是,修改配置无需进入容器,直接在宿主机上改,改完重启容器就生效,非常方便管理。第三,restart: unless-stopped 保证了容器异常退出时会自动重启,增加了一层可靠性。
文件写好后,在目录下执行 docker-compose up -d,PostgreSQL 主库容器就跑起来了。你可以用 docker-compose logs -f 看看启动日志,确保没有报错。
2.2 配置核心参数:postgresql.conf
现在来配置最重要的 postgresql.conf 文件。这个文件控制着数据库的各种行为,对于流复制,我们需要关注其中几个核心参数。在你刚才的工作目录下创建这个文件。
# 连接与监听
listen_addresses = '*' # 监听所有


1万+

被折叠的 条评论
为什么被折叠?



