Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9005
  • 博文数量: 2
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 31
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-15 21:34
文章分类
文章存档

2014年(2)

我的朋友

分类: Mysql/postgreSQL

2014-01-04 17:05:00

1. 流复制原理:
   postgresql的流复制原理类似于Mysql的master-slave同步,它是基于WAL(预写日志)进行同步。
Streaming replication allows a standby server to stay more up-to-date than is possible with file-based log shipping. The standby connects to the primary, which streams WAL records to the standby as they're generated, without waiting for the WAL file to be filled.
   Streaming replication is asynchronous by default, in which case there is a small delay between committing a transaction in the primary and the changes becoming visible in the standby. This delay is however much smaller than with file-based log shipping, typically under one second assuming the standby is powerful enough to keep up with the load. With streaming replication。

2. 流复制的结构。

注意,master 接收read/write请求,但standby只接受用户的read请求,从这一点出发,可以通过分离程序的方法,来降低主数据库的负载。

3. 流复制配置步骤
3.1主数据库操作:
Step1:安装PG数据库
./configure --prefix=/usr/local/postgresql915
gmake
su
gmake install
adduser postgres
mkdir /usr/local/pgsql915/data -p
chown postgres /usr/local/pgsql915/data
3.2 初始化系统数据库。
su - postgres
locale 改成LANG="zh_CN.utf8"
/usr/local/postgresql915/bin/initdb  --encoding=utf8   -D /usr/local/pgsql915/data
# 创建数据库日志
[root@localhost ~]# mkdir  /usr/local/postgresql915/logs
[root@terra_test postgresql-9.1.5]#  chown postgres /usr/local/postgresql915/logs/
## 启动主数据库
su - postgres -c '/usr/local/postgresql915/bin/pg_ctl -D /usr/local/pgsql915/data -l /usr/local/postgresql915/logs/postgre.log  start'
# 附加停止数据库的方法
#su - postgres -c '/usr/local/postgresql/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/postgresql/logs/postgre.log  stop -m immediate '
3.3 创建流复制用户
master端执行:
postgres=# CREATE USER repl replication LOGIN CONNECTION LIMIT 2  ENCRYPTED PASSWORD 'repl';
3.4:配置Master端的访问文件pg_hba.conf
增加一行:
host replication repl 192.168.10.0/16 md5
3.5:配置MASTER端配置文件
[root@localhost data]# vi postgresql.conf
listen_addresses = '*'    # what IP address(es) to listen on;
max_wal_senders = 10    # max number of walsender processes,slave 节点数
wal_level = hot_standby  # minimal, archive, or hot_standby ,采用流复制。
archive_mode = on       # allows archiving to be done
archive_command = 'cd ./'  # command to use to archive a logfile segment
wal_keep_segments = 64   # in logfile segments, 16MB each; 0 disables


max_wal_senders是Slave库的节点数,有多少个slave库就设多少
wal_level是write ahead log参数值,设置流复制务必将此值更新hot_standby
wal_keep_segments默认值是16,是PG_XLOG下的日志文件大小

3.6:主库备份(Master端)
select pg_start_backup('Replication work'); 
会在主数据库服务器上生成backup_label  ,拷贝到从库后,从库对这个文件来确定同步文件及同步点:

START WAL LOCATION: 2/F000020 (file 00000001000000020000000F)
CHECKPOINT LOCATION: 2/F000058
BACKUP METHOD: pg_start_backup
START TIME: 2013-08-22 15:27:38 CST
LABEL: Replication work



3.7:拷贝$PGDATA文件,并复制到Slave服务器上,排除pg_xlog内容,因为在slave还是要被清掉的.
$PGDATA=/usr/local/pgsql915/data
[root@terra_test data]# rsync -atuvzrp --exclude="pg_xlog" backup@192.168.10.202::master-pgsql-data  /usr/local/pgsql915/data/


# 插曲
在主库上再执行一条写记录,在向从库拷贝之前执行。观察从库恢复后有无这条记录。
create database test01;  在主库stop_backup前,主库是允许插入,另一台从库已经创建了这个库;
在主库stop_backup()后,启动从库,从库上也有test01 库。
总结: backup_label中的检查点很重要,从库根据backup_lable中的检查点顺序往后执行;
start_backup(),开始后,主库数据文件不变,但binlog记录改变,故从DB1可以继续读binlog,但从DB2拷贝的数据文件与主库此时一致,后来根据检查点做日志同步。


3.8 :结束master端的备份
select pg_stop_backup(), current_timestamp;
总结:执行完结束备份后,主库上会出现新备份的日志文件,并且$PGDATA下的backup_label文件被删除:
 


3.9:修改Slave端配置信息,postgresql.conf 基本采用默认。

[root@terra_test postgresql-9.1.5]# cp /usr/local/src/postgresql-9.1.5/src/backend/utils/misc/postgresql.conf.sample /usr/local/pgsql915/data/postgresql.conf
hot_standby = on   # "on" allows queries during recovery
listen_addresses = '*'  # what IP address(es) to listen on;
max_connections = 1000  # 修改成与主库一致

3.10:从库上生成recovery.conf文件,
PGHOME=/usr/local/postgresql915
PGDATA=/usr/local/pgsql915/data
$ cp $PGHOME/share/recovery.conf.sample $PGDATA/recovery.conf
$ vi recovery.conf  --新增以下三行 。
standby_mode = 'on'
trigger_file = '/usr/local/pgsql915/data/postgresql.trigger.5432'
primary_conninfo = 'host=192.168.10.202 port=5432 user=repl password=repl keepalives_idle=60'  # 同步的IP 、端口、用户名、密码验证。
  

3.11:删除slave端(从master端拷过来的)的pid文件和pg_xlog
$ rm -rf  $PGDATA/pg_xlog
$ rm -f $PGDATA/postmaster.pid   # 主库的pid
$ mkdir  $PGDATA/pg_xlog        # pg_xlog为归档的日志,做恢复时用。
chown  postgres:root  /usr/local/pgsql -R
$PGDATA/postmaster.pid 这几个文件需要研究。

3.12 :启动standby 数据库
修改从库的postgresql.conf : max_connections 与主库上的参数一致。
重点:
正常启动备库(pg_ctl -D $PGDATA -l pg.log start)。
从库启动正常。

观察: 从库启动成功后,backup_label被重命名成backup_label.old

3.13: 流复制服务监控
 a.  查看从库是否处于恢复模式:

主库上执行这条命令:

postgres=# SELECT pg_is_in_recovery();

 pg_is_in_recovery

-------------------

 f

(1 row)

从库上执行这条命令

gps_201303=# select pg_is_in_recovery();

 pg_is_in_recovery

-------------------

 t

(1 row)
b.查看当前的快照
 gps_201303=# SELECT txid_current_snapshot();
 txid_current_snapshot
-----------------------
 58109:58109:   主库记录点:从库记录点,主库没增加一条写入,该值就会加1 .
(1 row)
c. 显示同步状态
postgres=# SELECT * FROM pg_stat_replication ;
procpid|667
usesysid|73729
usename|repl                       # 同步用户名
application_name|walreceiver  # 同步应用名
client_addr|192.168.66.170    #客户端地址
client_hostname|           
client_port|59986              
backend_start|2013-08-23 11:56:56.863113+08  # 上次从库启动同步日期
state|streaming                                    #状态
sent_location|2/1AF1C648                     #该值等于从库
pg_last_xlog_receive_location()
write_location|2/1AF1C648
flush_location|2/1AF1C648
replay_location|2/1AF1C1D0    
sync_priority|0
sync_state|async 

4.参考文献


http://dev.mysql.com/doc/refman/5.5/en/replication.html





阅读(5556) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~