postgresql 数据同步 slonyI 1.1.5

来源:互联网 发布:信捷plc编程视频 编辑:程序博客网 时间:2024/05/09 04:18

                                         postgresql 数据同步
1. 总体需求
1.1. 当前情况
随着软件系统复杂度的提高,分布式部署成为软件部署流行的方式。对于系统的结构,
程序和数据是支撑系统的两大要素。程序的分布式部署已经有很多很好的方案,在这里
我说一下数据的分布式部署。数据的分布式部署其实就是数据库的分布式部署。

1.2. 系统环境
在这里,我以下面的环境详细讲部署的过程。
主数据库服务器 (master)
OS     : SuSe linux 9.0 for X86
ip     : 10.73.132.201
mask   : 255.255.254.0


从数据库服务器 (slave)
OS     : SuSe linux 9.0 for X86
ip     : 10.73.133.222
mask   : 255.255.254.0
需要保证两台机器互连互通.

请到指定目的地下载指定的软件包:
db     : postgresql 8.1.2.tar.gz(http://www.postgresql.org/download/)
slony1 : slony1-1.1.5.tar(http://www.postgresql.org/download/)
以上的网址是一个入口地址,请选择合适的正确的源程序包。

使用  root 用户在两台主备机器上分别建立工作目录:
/home/hzh/share
并拷贝 postgresql 8.1.2.tar.gz 和 slony1-1.1.5.tar 到工组目录下。
以下如果没有明确的指定用户,一般都是  root 用户。

1.3. 系统安装
1.3.1 主数据库服务器
1.3.1.1 安装数据库
解压,命令 : tar -xvzf postgresql 8.1.2.tar.gz
进入对应的 postgresql-8.1.2 目录 ,命令 :cd postgresql-8.1.2
检查,命令 : ./configure
检查可能失败,一般是缺少相应的包,请自己安装。
gmake,命令: gmake
注意,是  gmake
安装,命令 : gmake install

以下对于没有  postgres 用户的操作系统适用
建立 postgres 组,命令: groupadd -g 26 postgres
建立  postgres 用户,命令 : useradd -c "postgressql admin user" -d /usr/loca/pgsql -g 26 -G root -u 26 -s /bn/bash

配置环境变量,修改  /etc/profile 文件
vi /etc/profile ,修改  INFODIR=/usr/local/info:/usr/share/info:/usr/info:。。。
为类似如下设置  INFODIR=/usr/local/info:/usr/share/info:/usr/info:。。。/usr/local/pgsql/man
使用 postgres/root 用户修改, /usr/local/pgsql/.bashrc 文件,为 postgres 用户增加环境参数如下:
PGLIB=/usr/local/pgsql/lib
PGDATA=/test/spescso/data
PATH=$PATH:/usr/local/pgsql/bin
MANPATH=$MANPATH:/usr/local/pgsql/man
export PGLIB PGDATA PATH MANPATH

使用  root 用户,建立数据库集群目录,命令如下(如由不明,请参考  linux online help 和  postgresql online help):
mkdir /test
mkdir /test/spescso/
mkdir /test/spescso/data
chown postgres /test/spescso/data/
chmod 700 /test/spescso/data/

使用 postgres 创建 数据库集群
/usr/local/pgsql/bin/initdb -E UTF-8 /test/spescso/data/


使用  root 用户,配置 数据库集群参数
su -c "/usr/local/pgsql/bin/createuser -a -d ssuser" -l postgres
su -c "/usr/local/pgsql/bin/createlang plpgsql template1" -l postgresql

使用 postgres 创建 log 目录
mkdir /test/spescso/data/log

修改   /test/spescso/data/postgresql.conf 文件
主要配置日志文件
log_destination = 'stderr'
redirect_stderr = true
log_directory = '/test/spescso/data/log/'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

修改  /test/spescso/data/pg_hba.conf,主要搞定双机相互认证问题,否则不能相互访问
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "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         10.73.132.0/24        trust
host    all         all         10.73.133.0/24        trust
# IPv6 local connections:
host    all         all         ::1/128               trust
如果不能理解上面的意思,请仔细阅读 postgresql 数据库安全认证文档。


使用 postgres 用户后台启动  postmaser 数据库主进程
/usr/local/pgsql/bin/postmaster -i -D /test/spescso/data/ -p 5432 &


1.3.1.2 安装 slony1 数据同步工具(主从都需要安装)
解压,命令 : tar -xvjf slony1-1.1.5.tar
注意,使用  -j  参数,该网站压缩包有点不一致。
进入对应的 slony1-1.1.5 目录 ,命令 :cd slony1-1.1.5
检查,命令 : ./configure
检查可能失败,一般是缺少相应的包,请自己安装。可能还要带 --with 参数指定
 postgresql 8.1.2 的安装目录,默认是 /usr/local/pgsql/postgresql-8.1.2
gmake,命令: gmake
注意,是  gmake
安装,命令 : gmake install


1.3.2 从数据库服务器
和主数据库服务器的安装方式一致。

1.3.3 建立数据库和数据表
以下以在 主数据库服务器上建立主数据库和数据表  test 为例见解,其他数据库和数据表请参考建立.
su -c "/usr/local/pgsql/bin/createdb -U ssuser -E UTF-8 test -p 5432" -l postgres

su -c "/usr/local/pgsql/bin/psql -f /home/hzh/share/sql.txt -p 5432 -dtest -Ussuser" -l postgres
(注意,sql.txt 是创建数据表的命令,请自行编写。sql.txt 文件最好是 UTF-8 格式,特别是存在中文字符时)


在主数据库机器上依次建立 testslave1,testslave2.
在从数据库机器上 5431 端口建立 testslave3

1.4 配置同步
1.4.1. 主机配置
编写 configmaster sheul 脚本文件,设置其可执行属性 ,命令 : chmod a+x+w+r configmaster,文件内容如下:
#!/bin/bash
basebin=/usr/local/pgsql/bin

#集群名称
CLUSTER=slony_test1

# 参与同步的数据库名称,master db 是test,其他三个是slave
DBSERVER=test
DBSLAVE1=testslave1
DBSLAVE2=testslave2
DBSLAVE3=testslave3

# 参与同步的机器地址
HOSTSERVER=10.73.132.201
HOSTSLAVE1=10.73.132.201
HOSTSLAVE2=10.73.132.201
HOSTSLAVE3=10.73.133.222

# 参与同步的数据库用户名
DBSERVER_USER=ssuser
DBSLAVE1_USER=ssuser
DBSLAVE2_USER=ssuser
DBSLAVE3_USER=ssuser

# 同步发布配置,以下是命令 slonik 的参数
$basebin/slonik<<_EOF_

cluster name=$CLUSTER;

# 定义复制节点
node 1 admin conninfo='dbname=$DBSERVER host=$HOSTSERVER user=$DBSERVER_USER port=5432';
node 2 admin conninfo='dbname=$DBSLAVE1 host=$HOSTSLAVE1 user=$DBSLAVE1_USER port=5432';
node 3 admin conninfo='dbname=$DBSLAVE2 host=$HOSTSLAVE2 user=$DBSLAVE2_USER port=5432';
node 4 admin conninfo='dbname=$DBSLAVE3 host=$HOSTSLAVE3 user=$DBSLAVE3_USER port=5431';

# 初始化集群,id从1开始
init cluster ( id=1, comment='Node 1' );

# 设置参与同步的数据表
#先创建一个复制集,id也是从1开始
#向自己的复制集种添加表,每个需要复制的表一条set命令
#id从1开始,逐次递加,步进为1;
#fully qualified name是表的全称:模式名.表名
#这里的复制集id需要和前面创建的复制集id一致
create set ( id=1, origin=1, comment='All test tables' );
set add table ( set id=1, origin=1,id=1, fully qualified name='public.tb_depart',comment='Table tb_depart' );
set add table ( set id=1, origin=1,id=2, fully qualified name='public.tb_user',comment='Table tb_user' );
set add table ( set id=1, origin=1,id=3, fully qualified name='public.tb_manager',comment='Table tb_manager' );

#假如某个表没有主键,但是有唯一键字,那么可以用key关键字
#指定其为复制键字,如下面的key参数
#set add table ( set id = 1, origin = 1,id = 4, fully qualified name = 'public.history',key = "column",comment = 'Table history' );
#对于没有唯一列的表,需要这样处理,这一句放在 create set  的前面
#table add key (node id = 1, fully qualified name = 'public.history');
# 这样设置结果集
#set add table (set id=1, origin=1, id=4, fully qualified name = 'public.history', comment='history table', key = serial);

# 设置存储节点
store node ( id=2, comment='Node 2' );
store node ( id=3, comment='Node 3' );
store node ( id=4, comment='Node 4' );

# 设置存储路径
store path ( server=1, client=2,conninfo='dbname=$DBSERVER host=$HOSTSERVER user=$DBSERVER_USER port=5432');
store path ( server=2, client=1,conninfo='dbname=$DBSLAVE1 host=$HOSTSLAVE1 user=$DBSLAVE1_USER port=5432');
store path ( server=1, client=3,conninfo='dbname=$DBSERVER host=$HOSTSERVER user=$DBSERVER_USER port=5432');
store path ( server=3, client=1,conninfo='dbname=$DBSLAVE2 host=$HOSTSLAVE2 user=$DBSLAVE2_USER port=5432');
store path ( server=1, client=4,conninfo='dbname=$DBSERVER host=$HOSTSERVER user=$DBSERVER_USER port=5432');
store path ( server=4, client=1,conninfo='dbname=$DBSLAVE3 host=$HOSTSLAVE3 user=$DBSLAVE3_USER port=5431');

#设置侦听事件和订阅方向,复制中角色,主节点是原始提供者,从节点是接受者
store listen ( origin=1, provider=1, receiver=2 );
store listen ( origin=2, provider=2, receiver=1 );
store listen ( origin=1, provider=1, receiver=3 );
store listen ( origin=3, provider=3, receiver=1 );
store listen ( origin=1, provider=1, receiveR=4 );
store listen ( origin=4, provider=4, receiver=1 );

_EOF_

1.4.2.  提交数据集合
编写 commitdata shell 脚本文件,赋予可执行权限,内容如下:

#!/bin/bash
basebin=/usr/local/pgsql/bin

CLUSTER=slony_test1

DBSERVER=test
DBSLAVE1=testslave1
DBSLAVE2=testslave2
DBSLAVE3=testslave3

HOSTSERVER=10.73.132.201
HOSTSLAVE1=10.73.132.201
HOSTSLAVE2=10.73.132.201
HOSTSLAVE3=10.73.133.222

DBSERVER_USER=ssuser
DBSLAVE1_USER=ssuser
DBSLAVE2_USER=ssuser
DBSLAVE3_USER=ssuser

$basebin/slonik<<_EOF_

cluster name=$CLUSTER;

#提供连接参数
node 1 admin conninfo='dbname=$DBSERVER host=$HOSTSERVER user=$DBSERVER_USER port=5432';
node 2 admin conninfo='dbname=$DBSLAVE1 host=$HOSTSLAVE1 user=$DBSLAVE1_USER port=5432';
node 3 admin conninfo='dbname=$DBSLAVE2 host=$HOSTSLAVE2 user=$DBSLAVE2_USER port=5432';
node 4 admin conninfo='dbname=$DBSLAVE3 host=$HOSTSLAVE3 user=$DBSLAVE3_USER port=5431';

# 提交订阅复制集
subscribe set ( id=1, provider=1, receiver=2, forward=no);
subscribe set ( id=1, provider=1, receiver=3, forward=no);
subscribe set ( id=1, provider=1, receiver=4, forward=no);
_EOF_

1.4.3. 配置同步过程
在主机上执行配置命令 : ./configmaster
在主机上开启slon 后台进程,启动主数据库复制,命令 :
/usr/local/pgsql/bin/slon slony_test1 "dbname=test host=10.73.132.201 user=ssuser port=5432" &

在主机上开启slon 后台进程,启动第一个从数据库复制,命令 :
/usr/local/pgsql/bin/slon slony_test1 "dbname=testslave1 host=10.73.132.201 user=ssuser port=5432" &

在主机上开启slon 后台进程,启动第二个从数据库复制,命令 :
/usr/local/pgsql/bin/slon slony_test1 "dbname=testslave2 host=10.73.132.201 user=ssuser port=5432" &

在从机上开启slon 后台进程,启动第三个从数据库复制,命令 :
/usr/local/pgsql/bin/slon slony_test1 "dbname=testslave3 host=10.73.133.222 user=ssuser port=5431" &

在主机上执行提交命令 : ./commitdata

至此,配置全部技术。你可以修改主数据库对应表的数据,看数据是否同步到其他的三个从数据库上。
感谢你阅读,预祝你好运!

原创粉丝点击