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=/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 单实例之间的主从同步就确认完毕了。

时间: 2024-12-16 11:29:19

postgresql多实例创建与Slony-I复制配置的相关文章

postgresql 多实例运行

创建新的实例, (下面所用到的9.1版本,如果为其他版本,可以用版本号替换9.1) sudo /usr/bin/pg_createcluster -U postgres                                  ##系统用户 -d /var/lib/postgresql /9.1/D1        ##实例目录,版本 -s /var/run/pgD1                          ## --local zh_CN.UTF-8 -e utf8    

php简单实用的操作文件工具类(创建、移动、复制、删除)

php简单实用好用的文件及文件夹复制函数和工具类(创建.移动.复制.删除) function recurse_copy($src,$dst) {  // 原目录,复制到的目录 $dir = opendir($src); @mkdir($dst); while(false !== ( $file = readdir($dir)) ) { if (( $file != '.' ) && ( $file != '..' )) { if ( is_dir($src . '/' . $file) )

[Java] 实例创建的步骤

创建类的一个实例时,按照下面步骤进行创建: 1. 给当前类及其父.祖类的所有成员字段分配空间,并给它们赋予默认值 2. 开始执行当前类的构造器 3. 如果当前类有父类,则对父类创建一个实例:从第 2 步开始并把父类当作新的当前类 4. 给当前实例.当前实例的字段进行初始化 5. 执行当前类的构造器的剩余部分代码. 上面的步骤包含一个递归算法.假设类 C 有父类,实例化 C 到第 3 步的时候,需要先创建父类的一个实例,即父类要经历完第 2.3.4.5 步骤之后,才到类 C 继续第 4 步.如果父

iOS——文件操作NSFileManager (创建、删除,复制,粘贴)

iOS——文件操作NSFileManager (创建.删除,复制,粘贴) iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容.iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内.默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp.Library包含Caches.Preferences目录.               上面的完整路径为:用户->资源库->Applicat

Oracle 实例创建脚本

遥想刚入职时,一台服务器就挂了,所以就是在"危难"中有机会学习.在夜深人静时,我想去回忆一下Oracle实例的创建.一种方法,DBCA,图形界面,但是需要依赖xming或xmanager这类软件:另一种方法就是脚本创建Oracle数据库实例.第一种方法简单,易上手,但是对初学者,不能学习到更多数据库知识:第二种方法用脚本就能更了然数据库的各种文件以及参数.本文只介绍脚本创建Oracle实例. 记得2010年,还是用Oracle10g,如今用11g,他们的差异在于dump 目录略不同.我

oracle实例创建,删除,开机启动与添加listener

都是在网上找的,最后集合在一起,网址忘了是哪个了,抱歉 创建实例部分本想写成脚本,先这样,脚本实验成功再放上来. 删除 oracle实例 1. 实例: instance, 是一个内存区域和一堆后台进程, oracle shutdown, 实例就删除了.2. 数据库: 你说的实际上是如何删除一个数据库. shutdown后,将与些数据库相关的文件与目录删除即可 ------------------------------------- 实例创建后的部署相关 此时,一个新的oracle实例就添加完毕

Python利用元类来控制实例创建

问题: 改变实例创建方式,以此来实现单例模式,缓存或者其他类似的特性. 解决方法: 如果想定制化创建实例的过程,可以通过定制一个元类并以某种方式重新实现它的__call__()方法. 单例模式实现: class Singleton(type): def __init__(self, *args, **kwargs): self.__instance = None super().__init__(*args, **kwargs) def __call__(self, *args, **kwarg

5.7 并行复制配置 基于GTID 搭建中从 基于GTID的备份与恢复,同步中断处理

5.7 并行复制配置 基于GTID 搭建中从 基于GTID的备份与恢复,同步中断处理 这个文章包含三个部分 1:gtid的多线程复制2:同步中断处理3:GTID的备份与恢复 下面文字相关的东西 大部分都比较重要,可以看一下master: 192.168.17.21slave: 192.168.17.22salve: 192.168.17.23 分别在这三个机器上面安装 编译安装mysql 5.7 不会安装的话 这有安装脚本 https://www.cnblogs.com/noel/p/10314

【OGG】OGG的单向DML复制配置(一)

[OGG]OGG的单向DML复制配置(一) BLOG文档结构图 前言部分 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① OGG的单向DML实时复制功能 ② 数据库的静默安装 ③ OGG的安装 ④ OGG下数据的初始化工作 注意:本篇BLOG中代码部分需要特别关注的地方我都用***背景和红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方. Lis