第一部分 在一个主机上创建多个 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=/data/pgsql/data
initdb
步骤三:启动postgresql实例1
pg_ctl -D /data/pgsql/data -l /data/pgsql/data/postgres.log start
实例2也可用按照上面的三个步骤进行创建:
初始实例2:
export PGDATA=/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 命令如下:
[[email protected] 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
[[email protected] etc]$
命令 slonik_init_cluster 会读取配置文件 slon_tools.conf 中的内容,自动初始化 slony集群在数据库中的同步配置。后面一些 slony脚本也会读取配置文件 slon_tools.conf。
在master节点上,启动 slony 守护进程,命令后的序号对应配置文件中master节点的节点号。
[[email protected] 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
如果上面启动错误,需要根据日志提示,解决错误后,再次启动:
[[email protected] 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 节点的节点号。
[[email protected] 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
再次启动:
[[email protected] 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文件,修改文件路径:
[[email protected] 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 ” 创建数据集,如下:
[[email protected] 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
[[email protected] etc]$
使用命令 “ slonik_subscribe_set 1 2 | slonik ” 增加数据订阅者,其中命令的第一个数字 1 代表同步集号,第二个数字2代表数据订阅者的节点号,如下:
[[email protected] 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 单实例之间的主从同步就确认完毕了。