您的当前位置:首页正文

PostgreSql + Streaming数据同步

2024-10-18 来源:威能网
PostgreSql + Streaming集群

环境

DB Master DB Slave1 DB Slave2

10.8.12.207 10.8.12.208 10.8.12.209

安装PostgreSql(此处省略)

设置postgres用户可以登录

passwd postgres su postgres

建立SSH信任连接(非必须)

--DB Master ssh-keygen

ssh-copy-id postgres@10.8.12.208 ssh-copy-id postgres@10.8.12.209

--DB Slave ssh-keygen

ssh-copy-id postgres@10.8.12.207 新建数据同步(replication)用户

su postgres createuser repl -s psql

alter role repl password 'repl'

配置Master

新建archive目录

mkdir /var/lib/postgresql/archive 配置postgresql.conf

vim /etc/postgresql/9.1/main/postgresql.conf

修改以下配置项

listen_addresses = '*'

#这个参数决定了有多少内容写入WAL,缺省是minimum,仅保证服务可以在crash或者immediate shutdown后重启。archive会多增加与WAL archive相关的内容,hot_standby会增加备机只读查询的支持信息 wal_level = hot_standby

#开启archive,然后定义文件备份命令 archive_mode = on

archive_command = 'cp -i %p /var/lib/postgresql/archive/%f #数据库会将已经完结的WAL写到archive里面去,具体写法见上面的command。如果traffic太低,那么长时间WAL就都不会写到archive里面,就类似所谓的备份风险。所以设置timeout是说如果到了这个时间WAL还没完结,也一样会写到archive里面去。但是streaming的方式下,由于内容都及时到达了备机,所以觉得没有必要设置太低的timeout。 archive_timeout=86400

#设置备机访问的并发连接数,对streaming的方式建议开高一点以保证数据可以及时同步 max_wal_senders = 5

#设置主机上pg_xlog里面保留的最小段数量。每个段都是16M,在streaming的情况下,如果希望不太依赖文件archive,数量建议设置大一些,以保证某些情况下备机不会由于落后太多导致复制服务停止。(即保证log在被同步到备机前不会被主机替换和删除掉) wal_keep_segments = 32

配置pg_hba.conf

vim /etc/postgresql/9.1/main/pg_hba.conf

修改以下配置项

#保证用户可以基于密码访问 host all all 10.8.12.0/24 md5 #设置replication的访问控制 host replicationrepl 10.8.12.208/32trust host replicationrepl 10.8.12.209/32trust 重启postgresql

/etc/init.d/postgresql restart

配置Slave

新建archive目录

mkdir /var/lib/postgresql/archive 配置postgresql.conf

vim /etc/postgresql/9.1/main/postgresql.conf

修改以下配置项:

listen_addresses = '*' #开启hot standby wal_level = hot_standby hot_standby = on 配置pg_hba.conf

vim /etc/postgresql/9.1/main/pg_hba.conf

修改以下配置项

#保证用户可以基于密码访问 host all all 10.8.12.207/32 md5 #设置replication的访问控制 host replicationrepl 10.8.12.207/32trust 新建recovery.conf

vim /etc/postgresql/9.1/main/recovery.conf

内容如下:

restore_command = 'cp /var/lib/postgresql/archive/%f %p' archive_cleanup_command = '/usr/lib/postgresql/9.1/bin/pg_archivecleanup /var/lib/postgresql/archive/ %r' standby_mode = 'on' primary_conninfo = 'host=10.8.12.207 port=5432 user=repl password=repl' trigger_file = '/var/lib/postgresql/trigger' 做基线备份和streaming 同步

停止DB Slave服务

/etc/init.d/postgresql stop 在DB Master上开始基线备份

psql -c \"select pg_start_backup('label',true)\" 删除DB Salve上的数据

mv /var/lib/postgresql/9.1/main /var/lib/postgresql/9.1/main_bak 或者

rm -r /var/lib/postgresql/9.1/main 在DB Master上执行数据同步

rsync -a /var/lib/postgresql/9.1/main/

postgres@10.8.12.208:/var/lib/postgresql/9.1/main/ --exclude postmaster.pid

rsync -a /var/lib/postgresql/9.1/main/

postgres@10.8.12.209:/var/lib/postgresql/9.1/main/ --exclude postmaster.pid

第一次可以采用这种把目标目录全部清空的方式,以后应该可以采用仅删除server*的方式减少同步数据量。如果机器上无rsync服务,需安装(默认有) DB Slave复制日志

rm /var/lib/postgresql/archive/*

mv/var/lib/postgresql/9.1/main/pg_xlog/* /var/lib/postgresql/archive/

DB Slave创建recovery.conf软链接

ln –s /etc/postgresql/9.1/main/recovery.conf /var/lib/postgresql/9.1/main/recovery.conf 启动DB Slave上的服务

/etc/init.d/postgresql start DB Master上结束基线备份操作

psql -c \"SELECT pg_stop_backup()\"

因篇幅问题不能全部显示,请点此查看更多更全内容