首页 > 代码库 > postgresql多实例创建与Slony-I复制配置

postgresql多实例创建与Slony-I复制配置

第一部分 在一个主机上创建多个 postgresql实例

步骤一:安装postgresql软件

安装 postgresql实例,从postgresql官网上  https://www.postgresql.org/ 下载postgresql安装软件,解压缩,创建postgres用户和组,添加环境变量。

我这里下载的版本是 pgsql9.5.1。

创建postgresql实例

安装了postgresql软件后,创建postgresql实例有三个步骤:创建实例目录,创建数据库簇初始化数据库(命令为 initdb),启动实例服务(用 pg_ctl命令)并进行相关配置。

步骤一:创建目录和文件:

su - postgres

mkdir -p /data/pgsql/{data,data02}

步骤二:初始化实例1:

export PGDATA=http://www.mamicode.com/data/pgsql/data

initdb

步骤三:启动postgresql实例1

pg_ctl  -D /data/pgsql/data -l /data/pgsql/data/postgres.log start

实例2也可用按照上面的三个步骤进行创建:

初始实例2:

export PGDATA=http://www.mamicode.com/data/pgsql/data02

env | grep PGDATA

initdb

启动实例2:

pg_ctl  -D /data/pgsql/data02 -l /data/pgsql/data/postgres02.log start

如果要关闭数据库,可用用羡慕的命令停止数据库:

pg_ctl stop -D /data/pgsql/data02 -m fast

步骤二:配置实例监听和外部访问

修改实例2的启动文件和端口,如果一个服务器上有多个实例,每个实例的端口都要不同,为了能够让客户端访问,需要在配置文件添加监听,在pg_hba.conf中添加梵文权限:

修改postgresql实例,启动配置参数文件:

vim postgresql.conf

listen_addresses = ‘*‘      # what IP address(es) to listen on;

port = 5433             # (change requires restart)

max_connections = 100           # (change requires restart)

这些参数修改后,重启postgresql实例才能生效,postgresql实例重启后会监听本服务器上所有IP的5433端口。

重启postgresql实例的命令为:

pg_ctl stop -D /data/pgsql/data02 -m fast

pg_ctl  -D /data/pgsql/data02 -l /data/pgsql/data/postgres02.log start

修改postgresql实例访问权限文件:

vim pg_hba.conf

# IPv4 local connections:

host    all             all             192.168.1.0/24            trust

上面的参数添加后,postgresql实例,就可以允许 192.168.1.0/24 网段的主机通过各个用户以有密码认证的方式访问实例中存在的库。

如果要进行严格限定,可以对应修改相关部分。文件修改后,需要重新加载配置文件才能生效:

pg_ctl reload

实例启动并修改了访问权限后,连接postgresql 实例的格式为:

psql -h <IP地址> -p <端口> [数据库名称] [用户名称]

示例:

psql -h 192.168.10.119 -p 5432 testdb postgres

psql -h 192.168.10.119 -p 5433 postgres postgres

这样从安装postgresql软件,到创建、配置并使用postgresql多实例,就完成了。

############################

第二部分 在Linux系统下安装 Slony-I 软件

一般Linux的各种发行版本中会自带 slony-I ,但自带的版本比较旧,可以从slony的官网下载最新的版本安装。

编译安装 slony-I 软件

在 slony 官方网站 http://www.slony.info/ ,点击 Dowload 进入下载页面(注意:由于我的postgresql版本是比较新的 9.5,一开始使用 slony1-2.1.3版本有报错,于是安装了最新的 slony1-2.2.5 版本);

选择合适的版本,这里选择 2.2 ;

弹出的界面选择直接下载源码,还是使用cvs界面,这里选择“直接下载源码”;

选择要下载的小版本,这里选择 2.2.5 ,文件名称为 slony1-2.2.5.tar.br2

下载完成后,把下载得来的源码包放到一个目录下,使用命令解压缩:

cd /usr/local/src

rz slony1-2.2.5.tar.bz2

tar xvf slony1-2.2.5.tar.bz2

解压生成目录 slony1-2.2.5 ,进入此目录,用Linux编译三板斧进行编译安装:

cd slony-2.2.5

./configure --with-perltools -with-pgconfigdir=/usr/local/pgsql/bin

make

make install

注意编译时,需要找到 pg_config可执行程序,如果在pgsql的目录中,可以直接指定config;如果不在bin目录下,需要指定 with-pgconfigdir参数的目录;

另外 slony-I 中有一套Perl脚本工具,名称为 altperl scripts,可以简化slony-I的配置,默认编译不会带上该脚本,需要编译时,带上 --with perltools进行编译;

编译三板斧完成后,就完成了 slony-I的安装,一般slony-I是安装到 postgresql 数据库所在的目录中。

which postgres

which slon

which slonik


安装过程为:

结果验证为:

############################

第三部分  配置和验证Slony-I复制

步骤一:规划和创建复制环境:

进行复制的两个postgresql的实例端口和库名分别如下:

192.168.10.119 : 5432  master

192.168.10.119 : 5433  slave

在两台数据库中,都创建一个名为 slony 的超级用户,给 slony-I 使用,命令如下:

create user slony superuser password ‘slonytest‘;

在主库上创建一个名称为  master 的数据库,作为复制的源数据库,命令为:

psql -h 192.168.10.119 -p 5432 postgres postgres

create database master;

alter database master owner to slony;

在备库上创建一个名称为 slave 的目标数据库,作为复制的目标数据库,命令为:

psql -h 192.168.10.119 -p 5433 postgres postgres

create database slave;

alter database slave owner to slony;

后面的复制,就是在 master 数据库和slave 数据库之间进行;为了演示复制,在master库和slave库中建一个测试表,命令如下:

create table synctab01(id int primary key, note text);

为了能够让机器相互付昂文,在 pg_hba.conf 文件中加入以下内容:

host all all 192.168.1.0/24 md5

为了让备注生效,运行如下命令:

pg_ctl reload

确认数据库监听,已经监听到本机的IP中,可以修改 postgresql.conf 文件中的监听选项:

listen_addresses = ‘*‘

测试在两台机器上,分别能够用slony用户进行数据库访问:

psql -h 192.168.10.119 -p 5432 -U slony -d master

psql -h 192.168.10.119 -p 5433 -U slony -d slave

如果验证都能够正常访问,则到此,复制前的postgresql环境准备就结束了。

接下来使用 altperl scripts 脚本完成Slony数据同步的配置工作。

步骤二:编辑 slon_tools.conf 配置文件

首先要配置好一个名为 slon_tools.conf 的配置文件,这个文件要放在 /usr/local/etc 目录下。

安装完 slony-I后,这个目录下会有一个示例文件 slon_tools.conf-sample ,把这个文件拷贝成 slon_tools.conf ,然后修改。

cd /usr/local/etc

ls

cp slon_tools.conf-sample slon_tools.conf

修改文件,把文件中集群的名称改成配置的名称,这里修改为 cluster01 , 命令为:

if ($ENV{"SLONYNODES"}) {

    require $ENV{"SLONYNODES"};

} else {

    #$CLUSTER_NAME = ‘replication‘;

    $CLUSTER_NAME = ‘cluster01‘;

    #$PIDFILE_DIR = ‘/var/run/slony1‘;

    $PIDFILE_DIR = ‘/usr/local/pgsql/log‘;   

    #$LOGDIR = ‘/var/log/slony1‘;

    $LOGDIR = ‘/usr/local/pgsql/log‘;   

#目前只有两个主从复制,只需要配置两个服务器即可

    add_node(node     => 1,

         host     => ‘192.168.10.119‘,

         dbname   => ‘master‘,

         port     => 5432,

         user     => ‘slony‘,

         password => ‘slonytest‘);

    add_node(node     => 2,

         host     => ‘192.168.10.119‘,

         dbname   => ‘slave‘,

         port     => 5433,

         user     => ‘slony‘,

             password => ‘slonytest‘);

}

# 设置复制集的配置项,主要配置要同步那些表和序列。

$SLONY_SETS = {

    "set1_name" => {

   "set_id"       => 1,

   "table_id"     => 1,

   "sequence_id"  => 1,

   "pkeyedtables" => ["synctab01"],

   "keyedtables"  => {},

   "sequences"    => [],

   },

};

# 上面的集群名称、日志路径、复制集中的同步主键表、唯一键表、序列等配置完成后,将 slon_tools.conf 文件拷贝到其他机器上。初始化集群。

在一个节点配置完成后,将配置好的 slon_tools.conf 文件拷贝到其他 slony机器。

scp slon_tools.conf 192.168.10.119:`pwd`/.

步骤三:启动同步服务

slony配置文件配置完毕,并拷贝到集群中各个节点后,需要初始化和启动同步服务。

初始化集群,执行 slonik_init_cluster | slonik 命令如下:

[postgres@MySQL193 etc]$ slonik_init_cluster | slonik

<stdin>:10: Set up replication nodes

<stdin>:13: Next: configure paths for each node/origin

<stdin>:16: Replication nodes prepared

<stdin>:17: Please start a slon replication daemon for each node

[postgres@MySQL193 etc]$

命令 slonik_init_cluster 会读取配置文件 slon_tools.conf 中的内容,自动初始化 slony集群在数据库中的同步配置。后面一些 slony脚本也会读取配置文件 slon_tools.conf。

在master节点上,启动 slony 守护进程,命令后的序号对应配置文件中master节点的节点号。

[postgres@MySQL193 etc]$ slon_start 1

Invoke slon for node 1 - /usr/local/pgsql9.5.1/bin//slon -p /var/run/slony1/cluster01_node1.pid -s 1000 -d2  cluster01 ‘host=192.168.10.119 dbname=master user=slony port=5432 password=slonytest‘ > /usr/local/pgsql/log/node1/master-2016-11-19.log 2>&1 &

Slon failed to start for cluster cluster01, node node1

如果上面启动错误,需要根据日志提示,解决错误后,再次启动:

[postgres@MySQL193 etc]$ slon_start 1

Invoke slon for node 1 - /usr/local/pgsql9.5.1/bin//slon -p /usr/local/pgsql/log/cluster01_node1.pid -s 1000 -d2  cluster01 ‘host=192.168.10.119 dbname=master user=slony port=5432 password=slonytest‘ > /usr/local/pgsql/log/node1/master-2016-11-19.log 2>&1 &

Slon successfully started for cluster cluster01, node node1

PID [11298]

Start the watchdog process as well...

在slave节点上,启动 slony守护进程,命令后的序号对应配置文件中 slave 节点的节点号。

[postgres@MySQL193 etc]$ slon_start 2

Invoke slon for node 2 - /usr/local/pgsql9.5.1/bin//slon -p /var/run/slony1/cluster01_node2.pid -s 1000 -d2  cluster01 ‘host=192.168.10.119 dbname=slave user=slony port=5433 password=slonytest‘ > /usr/local/pgsql/log/node2/slave-2016-11-19.log 2>&1 &

Slon failed to start for cluster cluster01, node node2

再次启动:

[postgres@MySQL193 etc]$ slon_start 2

Invoke slon for node 2 - /usr/local/pgsql9.5.1/bin//slon -p /usr/local/pgsql/log/cluster01_node2.pid -s 1000 -d2  cluster01 ‘host=192.168.10.119 dbname=slave user=slony port=5433 password=slonytest‘ > /usr/local/pgsql/log/node2/slave-2016-11-19.log 2>&1 &

Slon successfully started for cluster cluster01, node node2

PID [11323]

Start the watchdog process as well...

启动slony守护进程时的错误处理:

第一次启动时报错,不能打开pid文件,修改文件路径:

[postgres@MySQL193 etc]$ cat /usr/local/pgsql/log/node1/master-2016-11-19.log

2016-11-19 11:51:41 CST CONFIG main: slon version 2.2.5 starting up

2016-11-19 11:51:41 CST FATAL  Cannot open pid_file "/var/run/slony1/cluster01_node1.pid"

再次启动,就可以正常启动了。

使用命令 “ slonik_create_set 1 | slonik ” 创建数据集,如下:

[postgres@MySQL193 etc]$ slonik_create_set 1 | slonik

<stdin>:11: Subscription set 1 (set1_name) created

<stdin>:12: Adding tables to the subscription set

<stdin>:16: Add primary keyed table public.synctab01

<stdin>:19: Adding sequences to the subscription set

<stdin>:20: All tables added

[postgres@MySQL193 etc]$

使用命令 “ slonik_subscribe_set 1 2 | slonik  ” 增加数据订阅者,其中命令的第一个数字 1 代表同步集号,第二个数字2代表数据订阅者的节点号,如下:

[postgres@MySQL193 etc]$ slonik_subscribe_set 1 2 | slonik

<stdin>:6: Subscribed nodes to set 1

到此,同步就配置完了。

步骤四:验证同步效果

下面测试同步效果。

在master主库上添加一条记录:

postgres=# \c master

You are now connected to database "master" as user "postgres".

master=# \d

           List of relations

Schema |   Name    | Type  |  Owner  

--------+-----------+-------+----------

public | synctab01 | table | postgres

(1 row)

master=#

master=# select * from synctab01;

id | note

----+------

(0 rows)

master=#

master=# insert into synctab01 values(1,‘111‘);

INSERT 0 1

master=#

master=# select * from synctab01;             

id | note

----+------

  1 | 111

(1 row)

在slave从库上确认数据状态:

postgres=# \c slave

You are now connected to database "slave" as user "postgres".

slave=#

slave=# \d

           List of relations

Schema |   Name    | Type  |  Owner  

--------+-----------+-------+----------

public | synctab01 | table | postgres

(1 row)

slave=#

slave=# select * from synctab01;

id | note

----+------

(0 rows)

slave=# select * from synctab01;

id | note

----+------

  1 | 111

(1 row)

至此两个 postgresql 单实例之间的主从同步就确认完毕了。







本文出自 “yumushui的专栏” 博客,请务必保留此出处http://yumushui.blog.51cto.com/6300893/1874598

postgresql多实例创建与Slony-I复制配置