FreeSWITCH中文网,电话机器人开发网 ,微信订阅号:

FreeSWITCH及VOIP,Openser,电话机器人等产品中文技术资讯、交流、沟通、培训、咨询、服务一体化网络。QQ群:293697898

PostgresSQL主从备份


tags:PostgresSQL 主从备份 创建时间:2016-10-31 08:56:47

老李

    一直只写些VoIP方面的,但很少写其他 方面的,开完PG 2016 Conference后,有做通信的哥们问我,说不知道你一直用PG啊,我们想实现PG数据库的实时热备,按网上找到的材料,总不成功。也许是平时我们整理的文档真的是从cd 到make 到vi全写的太细致,以致于换个稍粗的文档就搞不来了 .

 我在之前就发过一个使用PostgreSQL和FreeSwitch结合,用于使用FreeSwitch的原生的PG支持。可以参考: http://freeswitch.net.cn/27.html  .实际如果只是实时数据热备,前期的方式还是这样,这是前两天用9.6.1搭建的流程,为了更直白明了,所以尽可能重复,让很多步骤看上去即使一致,也尽可能写清楚,避免很多人架不起来。

   # 一、 测试硬件环境
thinkpad t440p 笔记本,16G内存,128ssd + 1T机械,测试环境中不用愁空间了
Oracle Virtual Box 虚拟机
由虚拟机安装的Debian 8操作系统,ip地址为: 192.168.1.203     ------主
由虚拟机安装的Centos 7操作系统,ip地址为:192.168.1.210     ------从
由于测试且虚拟环境下,把iptables之类关掉,或者把相应的资源放开,这里就不多说了

   # 二、安装主PG
# 新增用户组
groupadd postgres

# 新增用户
useradd postgres -g postgres

# 新建数据库执行文件目录
mkdir -p /usr/local/pgsql

# 新建数据库数据文件目录
mkdir -p /db/pgsql/data

# 修改目录拥有者
chown -R postgres /usr/local/pgsql/.
chown -R postgres /db/pgsql/data
chown -R postgres /db/pgsql/data/.

# 编辑PATH搜索路径
vi /etc/profile
Append these 2 lines to the end of the file:
PATH=/usr/local/pgsql/bin:$PATH
export PATH

# 生效PATH搜索路径
source /etc/profile

# 安装编译源码所需的工具和库
#Centos 下
#yum -y install wget gcc readline-devel zlib-devel make

#debian 
 apt-get install zlibc libghc-zlib-dev libzlcore-dev gcc make git automake libreadline-dev

# 进入源码压缩包下载目录
cd /usr/src

# 下载源码压缩包
wget http://ftp.postgresql.org/pub/source/v9.6.1/postgresql-9.6.1.tar.gz


# 解压缩源码包
tar zxvf ./postgresql-9.6.1.tar.gz

# 进入解压缩源码目录
cd ./postgresql-9.6.1

# 执行源码编译配置脚本
./configure

# 编译源码
make

# 安装
make install

# 变更登录用户
su - postgres

# 执行数据库初始化脚本
/usr/local/pgsql/bin/initdb --encoding=utf8 -D /db/pgsql/data

# 退出变更登录
exit

# 复制PostgreSQL执行脚本
cp /usr/src/postgresql-9.3.5/contrib/start-scripts/linux /etc/init.d/postgresql

# 增加执行权限
chmod +x /etc/init.d/postgresql

# 编辑PostgreSQL执行脚本,指定数据库文件目录
vi /etc/init.d/postgresql
PGDATA="/db/pgsql/data"

# 编辑配置文件,配置可访问数据库的网络地址
(注意别忘了去掉#listen_addresses=前面的#)

vi /db/pgsql/data/postgresql.conf
//////////////////////////////////////////////////////////////////////////////////////////////////
//注意
/////////////////////////////////////////////////////////////////////////////////////////////////
listen_addresses = '*'
wal_level = hot_standby
synchronous_commit = on
max_wal_senders = 2                                
wal_keep_segments = 32  
synchronous_standby_names = '*'

# 启动PostgreSQL服务
service postgresql start
#或用 su - postgres 后, pg_ctl -D /db/pgsql/data start,后续的类似的问题都可以适用


# 以postgres用户登录数据库,创建replication 用户
psql -U postgres
postgres=# Create user repl superuser password ‘123456’;
postgres=# \q

#退出pg登录
exit

# 编辑配置文件,设置密码md5验证
//////////////////////////////////////////////////////////////////////////////////////////////////
//注意
//真正用,不用要host all all 0.0.0.0/0,毕竟不安全
/////////////////////////////////////////////////////////////////////////////////////////////////
vi /db/pgsql/data/pg_hba.conf
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
#host all all 127.0.0.1/32 trust
host all all 0.0.0.0/0 md5   
host  replication       repl          192.168.1.0/24        md5

# 重启数据库服务
service postgresql restart

#debian下需要安装 chkconfig工具

# 设置开机自动启动服务
chkconfig postgresql on


#配置LD_LIBRARY_PATH
vi /etc/profile

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib
export LD_LIBRARY_PATH

C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/pgsql/include
export C_INCLUDE_PATH


source /etc/profile

    三、 从库

安装和主库类似,还是写全些

# 新增用户组
groupadd postgres

# 新增用户
useradd postgres -g postgres

# 新建数据库执行文件目录
mkdir -p /usr/local/pgsql

# 新建数据库数据文件目录
mkdir -p /db/pgsql/data

# 修改目录拥有者
chown -R postgres /usr/local/pgsql/.
chown -R postgres /db/pgsql/data
chown -R postgres /db/pgsql/data/.

# 编辑PATH搜索路径
vi /etc/profile
Append these 2 lines to the end of the file:
PATH=/usr/local/pgsql/bin:$PATH
export PATH

# 生效PATH搜索路径
source /etc/profile

# 安装编译源码所需的工具和库
#Centos 下
#yum -y install wget gcc readline-devel zlib-devel make

#debian 
 apt-get install zlibc libghc-zlib-dev libzlcore-dev gcc make git automake libreadline-dev

# 进入源码压缩包下载目录
cd /usr/src

# 下载源码压缩包
wget http://ftp.postgresql.org/pub/source/v9.6.1/postgresql-9.6.1.tar.gz


# 解压缩源码包
tar zxvf ./postgresql-9.6.1.tar.gz

# 进入解压缩源码目录
cd ./postgresql-9.6.1

# 执行源码编译配置脚本
./configure

# 编译源码
make

# 安装
make install

#接下来就和主库的有区别了

su - postgres

#使用pg_basebackup从主库获取配置文件
pg_basebackup -F p --progress -D /db/pgsql/data -h 192.168.1.203 -p 5432 -U repl --password

#复制recovery文件并进行配置

cp /usr/local/postgres94/share/recovery.conf.sample /db/pgsql/data/recovery.conf

vim  /db/pgsql/data/recovery.conf

standby_mode = on  
primary_conninfo = 'host=192.168.1.203 port=5432 user=repl password=123456'

recovery_target_timeline = 'latest'

#配置postgresql.conf
vim postgresql.conf 
max_connections = 1000

hot_standby = on   
max_standby_streaming_delay = 30s  
wal_receiver_status_interval = 1s  
hot_standby_feedback = on

 pg_hba.conf 同主库一样配置 
#在这里需要注意,由于这里算是从主库强拉过来的配置,所以一定要修改一下它的mod,否则它会出现不是700的错误
su - postgres
chmod 700 /db/pgsql/data
pgctl -D /db/pgsql/data

这时,主库启动,从库也启动的话,就会源源不断地把一些write的数据由主实时同步到从库了。

按时说,到了这里的时候,我们应结束了,可是还有一个东西没结束,就是当主库宕机了后,要让从库自动转为可读写状态,怎么办?

在recovery.conf中配置一个触发文件
trigger_file = ‘/db/pgsql/data/trigger.ping’ 
touch /db/pgsql/data/trigger.ping

重启从库
su - postgres 
pg_ctl -D /db/pgsql/data restart

这样当主库宕机时,从库会迅速地转为主库





这次的文档先整理到这,以后再进一步完善,毕竟从成主,主也得成从


上海老李,QQ:1354608370,FreeSWITCH QQ群: