PostgreSql双机热备,数据库部署零基础的福音从这里开始
1.前言
长久以来数据在企业发展中都起着至关重要的作用,在网络科技高度发达的今天,系统业务复杂度与日俱增,数据量也成几何式增长,那么数据灾备方案显得越来越重要,PostgreSql主从复制是一种高可用解决方案,可以实现读写分离,实时备份,PostgreSql主从复制是基于xlog来实现的,主库开启日志功能,从库根据主库xlog来完成数据的同步。本篇就和大家一起分享一下PostgreSql双机热备的部署全过程。
开始之前大家请记先住主从复制需要注意的几个地方:
启动从库之前,不能执行初始化,若已经初始化了需要删掉对应的data文件。
启动从库之前,需要通过base_backup从主服务器上同步配置与数据。
启动从库之前,需要对同步之后的配置文件进行修改。
启动从库之前,需要设置一个恢复的配置文件。
从库只能读,不能写。
2.postgreSql编译安装
2.1 去官网选择一个合适的版本下载源码包:
https://www.postgresql.org/ftp/source/
2.2 我们在/usr/local/下创建一个pgsql目录 并将源码包上传到这个目录下面:
cd usr/local/
mkdir pgsql
rz
tar -zxvf postgresql-10.16.tar.gz
2.3 解压完成后进入进入源码解压后的目录,然后进行检查安装环境,当初出现"GNUmakefile"时表示成功了,若期间出现报错可能是有些插件没有安装导致的,安装对对应插件即可。
cd postgresql-10.16/
./configure --prefix=/usr/local/pgsql(检查安装环境,后面是安装路径)
我在检查后出现过报错,通过安装以下工具处理的,你要是没有报错请忽略(安装:yum install gcc,yum -y install -y readline-devel,yum install zlib-devel)
2.4 执行make命令编译源码
make(当出以下一段话时表示编译成功)
2.4 安装
make install (当出现下面这段话时表示安装完成)
2.5 创建一个普通用户,因为默认超级用户(root)不能启动postgresql,所以需要创建一个普通用户来启动数据库
groupadd postgres
useradd -g postgres postgres
passwd postgres
在/usr/local/pgsql下创建数据目录data:
mkdir -p data
赋予postgres用户整个pgsql目录的权限
chown -R postgres:postgres usr/local/pgsql
2.6 以postgres用户来初始化pgsql数据库(后面相关操作都用postgres 用户)
su - postgres
/usr/local/pgsql/bin/initdb -D usr/local/pgsql/data start (第一个路径是pgsql的初始化指令initdb的路径 第二个路劲是我们创建data目录用于存放pgsql的相关配置和数据)
当出现一下这段话时表示初始化成功,并可根据最后一句命名启动数据库
2.7 修改配置文件实现账号远程连接
vi usr/local/pgsql/data/postgres.conf(配置数据库监听的ip * 表示所有 ,开启端口5432,若端口被占用修改成其他的即可)
vi usr/local/pgsql/data/pg_hba.conf(在ipv4 里新增一条配置进行客户端认证)
上面两配置文件修改好了之后执行下面的命令就可以启动pgsql了,出现server started时表时启动成功
/usr/local/pgsql/bin/pg_ctl -D usr/local/pgsql/data start
接下来我们还需要一个创建一个账号用于远程登陆
su - postgres (切换到我们创建的postgres用户,已postgres身份进行后续的数据库操作)
psql(执行该命令 进入数据库)
alter user postgres with password ‘postgres’;(修改数据库用户postgres的密码,改好了之后就可以用navicat进行登陆了)
=============================================
至此pgsql的安装已经完成了,主库按照以上步骤完成安装启动,从库只需执行到步骤2.5即可,从库后续步骤依赖主库的配置=============================================
3.配置主从关系(主机:10.0.23.199 备机:10.0.42.38)
3.1 修改主库配置文件/user/local/pgsql/data/postgresql.conf ,添加以下参数,修改完后重启数据库
su - postgres
vi postgresql.conf
listen_addresses="*"
wal_level=hot_standby #wal归档复制级别为hot_standby异步流复制
max_wal_senders=2 #主库可以最多有多少个并发的standby数据库
wal_keep_segments=64 #指定pg_xlog目录保存的wal log的最小数量。每个文件一般是 16M。
max_connections=500
/usr/local/pgsql/bin/pg_ctl -D -D usr/local/pgsql/data restart
3.2 重启好了之后我们需要在主库创建一个用户做主从复制
su - postgres
psql(执行该命令 进入数据库)
create role data_backup login replication encrypted password '123456';
用户创建好了之后修改主库配置文件/use/local/pgsql/pg_hba.conf添加一条从库的ip,user使用我们刚创建的data_backup,修改完后重启主库
vi pg_hba.conf
/usr/local/pgsql/bin/pg_ctl -D -D usr/local/pgsql/data restart
========至此主库的相关配置已经完成,下面开始配置从库========
3.3 修改主库配置文件postgresql.conf添加一下参数,修改完后重启数据库
前面注意事项里面提到,不能初始化从库,因为我们需要首先从主库备份数据,备份之后,从库的data里面的数据和配置信息就和主库一致了
切换到postgres用户,进行数据备份和启动操作
通过base_backup命令将主库的数据备份到从库
/usr/local/pgsql/bin/pg_basebackup -h 10.0.23.199 -p 5432 -U data_backup -F p -P -D usr/local/pgsql/data
(注:pg_basebackup命令路径 -h 主机ip -p 主库端口 -U 主库用户名 -F p -P -D 从库data路径)
3.4 postgresql.conf是从主库同步过来的,这里需要修改一些配置,改为从库的配置
vi usr/local/pgsql/data/postgresql.conf
#wal_level=hot_standby #从库不需要这个配置 下面两个参数也注释掉
#max_wal_senders=2
#wal_keep_segments=64
hot_standby=on #开启hot_standby模式
max_standby_streaming_delay=30s #可选,流复制最大延迟
wal_receiver_status_interval=10s #可选,向主库报告状态的最大间隔时间
hot_standby_feedback=on #可选,查询冲突时向主库反馈
max_connections=1000 #最大连接数一般大于主库就行
3.5 创建恢复配置recovery.conf文件
这个文件在安装postgresql时,会生到/usr/local/pgsql/share/postgresql目录下,名字是recovery.conf.sample。我们复制并修改名称recovery.conf并放置在/usr/local/pgsql/data目录下,并修改添加其配置:recovery_target_timeline = 'latest' #从主库恢复最新的数据
standby_mode = on #开启备库
primary_conninfo = 'host=10.0.23.199 port=5432 user=data_backup password=123456' #连接主库
3.6 启动从库
/usr/local/pgsql/bin/initdb -D usr/local/pgsql/data start
========至此主库和从库的相关配置已经完,下面进行验证========
4.主从复制验证
ps -ef | grep 'postgres'
主机会增加一个wal sender进程 并连接着备机的ip
备机会增加一个wal receiver进程
最后在主库中验证对数据进行增删改操作时,看从库中的数据是否已同步过来,若有问题则需要重新重点检测一下主库和从库的postgresql.conf pg_hba.conf recovery.conf 这几个配置文件是否配置有问题,至此PostgreSql双机热备全部完成