postgresql+slony-i安装配置主从

slon软件下载地址:
slony1-1.2.6

http://slony.info/downloads/1.2/source/

postgresql下载地址:

http://www.postgresql.org/download/
http://www.postgresql.org/ftp/source/v8.1.23/

一、postgresql安装

方法1.rpm包安装postfresql:
所需软件包:
postgresql92-9.2.10-1PGDG.rhel5.i386.rpm
postgresql92-server-9.2.10-1PGDG.rhel5.i386.rpm
postgresql92-contrib-9.2.10-1PGDG.rhel5.i386.rpm
postgresql92-devel-9.2.10-1PGDG.rhel5.i386.rpm
postgresql92-libs-9.2.10-1PGDG.rhel5.i386.rpm
uuid-1.5.1-3.el5.i386.rpm

硬件IP:192.168.30.121(主)
    192.168.20.122(从)

主、从服务器安装方法相同:

1,linux创建postgres用户及用户组
groupadd postgres
useradd -g postgres postgres

2.安装包安装顺序:
rpm -ivh postgresql92-libs-9.2.10-1PGDG.rhel5.i386.rpm
rpm -ivh postgresql92-9.2.10-1PGDG.rhel5.i386.rpm
rpm -ivh uuid-1.5.1-3.el5.i386.rpm #安装contrib所依赖包
rpm -ivh postgresql92-devel-9.2.10-1PGDG.rhel5.i386.rpm #主从同步所依赖包
rpm -ivh postgresql92-server-9.2.10-1PGDG.rhel5.i386.rpm
rpm -ivh postgresql92-contrib-9.2.10-1PGDG.rhel5.i386.rpm

3.初始化PostgreSQL 数据库:
service postgresql-9.2 initdb

4.启动
service postgresql-9.2 start

5.把PostgreSQL 服务加入到启动列表
chkconfig postgresql-9.2 on
chkconfig --list|grep postgres

方法2.源码安装:

1,linux创建postgres用户及用户组
groupadd postgres
useradd -g postgres postgres

2,解压压缩包

[[email protected]]# tar -xzvf /var/local/pgsql/postgresql-9.2.10.tar.gz

进入解压目录: cd /var/local/pgsql/postgresql-9.2.10
3,编译安装:

创建安装目录和数据目录

mkdir /usr/local/pgsql 
mkdir /home/postgres/data

[[email protected] postgresql-9.2.10]# ./configure --prefix=/usr/local/pgsql -localstatedir=/home/postgres/data

处理报错信息:
checking for readline... no
configure: error: readline library not found
If you have readline already installed, see config.log for details on the
failure. It is possible the compiler isn‘t looking in the proper directory.
Use --without-readline to disable readline support.

解决:

缺少readline-devel依赖包

安装 readline-devel包

我这里选择的是yum安装,大家可以去网上下载一个适合自己的版本去安装
yum install readline-devel-5.1-3.el5

安装完毕后重新编译即可

重新编译:

[[email protected] postgresql-9.2.10]# ./configure --prefix=/usr/local/pgsql -localstatedir=/home/postgres/data

没有error即编译正常可以安装

[[email protected] postgresql-9.2.10]# make
All of PostgreSQL successfully made. Ready to install.

[[email protected] postgresql-9.2.10]# make install
PostgreSQL installation complete.

4.安装完毕修改数据目录权限
chown -R postgres:postgres /usr/local/pgsql/
chown -R postgres:postgres /home/postgres/data/

修改postgres用户的.bash_profile文件:

[[email protected] ~]$ vi .bash_profile
添加:

PGLIB=/usr/local/pgsql/lib
PGDATA=/home/postgres/data
PATH=$PATH:/usr/local/pgsql/bin
MANPATH=$MANPATH:/usr/local/pgsql/man
export PGLIB PGDATA PATH MANPATH

[[email protected] ~]$ source .bash_profile

5.初始postgresql并启动postgresql

初始化:
[[email protected] ~]$ /usr/local/pgsql/bin/initdb /home/postgres/data
Success. You can now start the database server using:

/usr/local/pgsql/bin/postmaster -D /home/postgres/data
or
/usr/local/pgsql/bin/pg_ctl -D /home/postgres/data -l logfile start

启动:

[[email protected] ~]$ /usr/local/pgsql/bin/pg_ctl -D /home/postgres/data start

============================================================================================

从库安装方式和主库postgresql安装一样

============================================================================================

二,编译安装slony-i

1、解压软件包:

[[email protected] local]# tar -xjvf /var/local/slony1-1.2.6.tar.bz2

2、编译安装软件包

[[email protected] ~]# cd /var/local/slony1-1.2.6
[[email protected] slony1-1.2.6]# ./configure --with-pgsourcetree=/usr/local/pgsql/bin

[[email protected] slony1-1.2.6]# make
All of Slony-I is successfully made. Ready to install

[[email protected] slony1-1.2.6]# make install
All of Slony-I is successfully installed

============================================================================================

在主库从库均要安装slony,安装方式同上

====================================================================================

三,主从配置

1.postgresql添加复制用户

su - postgres 用户下

[[email protected] ~]$ psql
psql (9.2.10)
Type "help" for help.

postgres=#create role repl password ‘123456‘ login superuser replication;

主从都执行此语句

2.postgresql配置文件

postgresql.conf

主从都改:

vi /home/postgres/data/postgresql.conf

添加: listen_addresses = ‘*‘

主库pg_hba.conf

vi /home/postgres/data/pg_hba.conf
添加:
host all repl 192.168.30.122/32 md5

从库pg_hba.conf

vi /home/postgres/data/pg_hba.conf 
添加:
host all repl 192.168.30.121/32 md5

修改配置后重启主从服务器都重启postgresql服务:

[[email protected] ~]$/usr/local/pgsql/bin/pg_ctl -D /home/postgres/data restart

3.建立测试数据库和测试表

主从库均需要创建数据库和表,slony不能同步DDL语句。

以下以在主数据库服务器上建立主数据库和数据表 test 为例见解,其他数据库和数据表请参考建立.

/usr/local/pgsql/bin/createdb test

cat sql.txt |psql -Urepl test  -W123456  
sql.txt 文件最好是 UTF-8 格式,特别是存在中文字符时) 例:sql.txt
CREATE TABLE tb_depart(Id int primary key,Name char(8));
在从数据库服务器上建立与主数据库服务器上相同的数据库test

创建后查看:
[[email protected] ~]$ psql -Urepl test

test=# \d
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+--------
public | tb_depart | table | repl
(1 row)

test=# \d tb_depart;
Table "public.tb_depart"
Column | Type | Modifiers
--------+--------------+-----------
id | integer | not null
name | character(8) |
Indexes:
"tb_depart_pkey" PRIMARY KEY, btree (id)

test=#\q

在从数据库服务器上建立与主数据库服务器上相同的数据库test,同样的表

4.slony-i配置主从同步

只需要在从库配置只需即可:
在/home/postgres/目录下创建脚本文件:

slony_0.sh文件内容如下:

#!/bin/sh
/usr/local/pgsql/bin/slonik << _END_
#
# Define cluster namespace and node connection information #
#集群名称
cluster name = testdb;
# 定义复制节点
node 1 admin conninfo = ‘dbname=test host=192.168.30.121 port=5432 user=repl‘;
node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=repl‘;
DROP SET (id=1, origin=1);
uninstall node (id=1);
uninstall node (id=2);
echo ‘Drop testdb set‘;
_END_

slony_1.sh文件内容如下:

#!/bin/sh
/usr/local/pgsql/bin/slonik << _END_
cluster name = testdb;
# 定义复制节点
node 1 admin conninfo = ‘dbname=test host=192.168.30.121 port=5432 user=repl‘;
node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=repl‘;
echo ‘Cluster defined, nodes identified‘;
# 初始化集群,id从1开始
init cluster (id=1, comment=‘Master Node‘);
# 设置存储节点
store node (id=2, comment=‘Slave Node‘);
echo ‘Nodes defined‘;
# 设置存储路径
store path (server=1, client=2, conninfo=‘dbname=test host=192.168.30.121 port=5432 user=repl‘);
store path (server=2, client=1, conninfo=‘dbname=test host=localhost port=5432 user=repl‘);
#设置侦听事件和订阅方向,复制中角色,主节点是原始提供者,从节点是接受者
store listen (origin=1, provider = 1, receiver =2);
store listen (origin=2, provider = 2, receiver =1);
_END_

slony_2.sh文件内容如下:

#!/bin/sh
/usr/local/pgsql/bin/slonik << _END_ #
# Define cluster namespace and node connection information #
cluster name = testdb;
node 1 admin conninfo = ‘dbname=test host=192.168.30.121 port=5432 user=repl‘;
node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=repl‘;
# 设置参与同步的数据表
#先创建一个复制集,id也是从1开始
#向自己的复制集种添加表,每个需要复制的表一条set命令
#id从1开始,逐次递加,步进为1;
#fully qualified name是表的全称:模式名.表名
#这里的复制集id需要和前面创建的复制集id一致
#假如某个表没有主键,但是有唯一键字,那么可以用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);

create set (id=1, origin=1, comment=‘testdb 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‘ );
set add table ( set id=1, origin=1,id=4, fully qualified name=‘public.tb_test‘,comment=‘Table tb_test‘ );
echo ‘set 1 of testdb tables created‘;
_END_

slony_3.sh文件内容如下:

#/bin/sh
/usr/local/pgsql/bin/slon testdb "dbname=test host=192.168.30.121 port=5432 user=repl" > ~/slon_gb_1.out 2>&1 &
/usr/local/pgsql/bin/slon testdb "dbname=test host=localhost port=5432 user=repl" > ~/slon_gb_2.out 2>&1 &

/usr/local/pgsql/bin/slonik << _END_
# Define cluster namespace and node connection information #
cluster name = testdb; #提供连接参数
node 1 admin conninfo = ‘dbname=test host=192.168.30.121 port=5432 user=repl‘;
node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=repl‘;

# 提交订阅复制集
subscribe set (id=1, provider=1, receiver=2, forward=no);
echo ‘set 1 of gb tables subscribed by node 2‘;
_END_

[[email protected] cluster_shells]$ chmod u+x slony_*.sh

slony_main.sh文件内容如下:

#!/bin/sh
case $1 in
start)
cd /home/postgres/
sh slony_3.sh
;;
stop)
killall -KILL slon
;;
rebuild)
cd /home/postgres
killall -KILL slon
sh slony_0.sh >> /dev/null 2>&1
sh slony_1.sh
sh slony_2.sh
sh slony_3.sh
;;
*)
echo "Please input start or stop or rebuild!!"
;;
esac

[[email protected] cluster_shells]$ chmod u+x slony_main.sh

测试同步:

在从库端执行:

按照下面执行顺序

./slony_0.sh

./slony_1.sh
<stdin>:5: Cluster defined, nodes identified
<stdin>:10: Nodes defined

./slony_2.sh
<stdin>:8: set 1 of testdb tables created

./slony_3.sh
<stdin>:7: set 1 of gb tables subscribed by node 2

修改数据前:
主库端:
[[email protected] ~]$ psql test

test=# \d
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+--------
public | tb_depart | table | repl
(1 row)

test=# \d tb_depart
Table "public.tb_depart"
Column | Type | Modifiers
--------+--------------+-----------
id | integer | not null
name | character(8) |
Indexes:
"tb_depart_pkey" PRIMARY KEY, btree (id)
Triggers:
_testdb_logtrigger_1 AFTER INSERT OR DELETE OR UPDATE ON tb_depart FOR EACH ROW EXECUTE PROCEDURE _testdb.logtrigger(‘_testdb‘, ‘1‘, ‘kv‘)

已创建触发器,用于同步。

暂时无数据;
test=# select * from tb_depart;
id | name
----+------
(0 rows)

备库端:
[[email protected] ~]$ psql test
Welcome to psql 8.1.23, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

test=# \d
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+--------
public | tb_depart | table | repl
(1 row)

test=# \d tb_depart
Table "public.tb_depart"
Column | Type | Modifiers
--------+--------------+-----------
id | integer | not null
name | character(8) |
Indexes:
"tb_depart_pkey" PRIMARY KEY, btree (id)
Triggers:
_testdb_denyaccess_1 BEFORE INSERT OR DELETE OR UPDATE ON tb_depart FOR EACH ROW EXECUTE PROCEDURE _testdb.denyaccess(‘_testdb‘)
slony创建了触发器---双向同步;

暂时无数据
test=# select * from tb_depart;
id | name
----+------
(0 rows)

test=#

主库端添加数据:

test=# insert into tb_depart values(1,‘aaa‘);
INSERT 0 1

test=# select * from tb_depart;
id | name
----+----------
1 | aaa
(1 row)

test=#

备库端查看:
test=# select * from tb_depart;
id | name
----+----------
1 | aaa
(1 row)

同步成功。

时间: 2024-09-14 09:39:23

postgresql+slony-i安装配置主从的相关文章

[原创]mysql 5.6安装配置,主从分离,读写分离简单教程

文章中参考使用了多个博客的资料,汇总而成!其流程准确性被人亦本人实践! https://blog.csdn.net/qq_35206261/article/details/81321201 https://www.cnblogs.com/qianniao12/p/8011222.html https://blog.csdn.net/qq_35206261/article/details/81321201 https://blog.csdn.net/why15732625998/article/d

DNS2之bind安装、主从配置同步、子域创建、view配置

主DNS配置从服务器: 我们知道,DNS服务器在网络服务中可能出现故障当机等状况,会导致DNS服务瘫痪,显然在实际的网络应用中我们不希望出现这种状况,所有我们就要配置从服务器来在主DNS服务器出现故障时代替他来工作,然而作为价格昂贵的服务器本身你又不希望出现这种极大的浪费,所有从服务器在实际工作中是和主服务器共同分担DNS解析任务的,这样既解决了服务器故障导致的问题,还可以缓解DNS服务器的压力. 那么要配置一个从服务器我们又该怎么做呢? 前提:我们要为本地配置一个从服务器aolens2.从服务

fedora22用rpm包安装配置postgresql数据库

严格内网环境,无网络连接,新装fedora 22系统,无任何其他配置. 安装 1.安装环境: 操作系统:fedora 22 数据库:postgresql-9.4 安装过程使用root用户 2.安装包: postgresql94-libs-9.4.4-1PGDG.f22.x86_64.rpm postgresql94-9.4.4-1PGDG.f22.x86_64.rpm postgresql94-server-9.4.4-1PGDG.f22.x86_64.rpm 3.严格按照顺序安装: rpm -

mongodb的安装配置与主从配置

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引. MongoDB是NoSQL中的一种,随着越来越多公司产品使用,已经开始逐步取代一些高性能查询的地位了. 它的特点是高性能.易部署.易使用,存

Linux服务器集群架构部署搭建(六)数据库服务器MySQL编译安装及主从同步配置(1)

命运是大海,当你能够畅游时,你就要纵情游向你的所爱,因为你不知道狂流什么会到来,卷走一切希望与梦想. 作者:燁未央_Estelle声明:测试学习,不足之处,欢迎指正. 第一章 数据库企业应用场景 1.1 数据库的企业应用 MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言.MySQL软件采用了双授权政策,它分为社区版和商业版,由于其体积小.速度快.总

Keepalived+Mysql互为主从高可用安装配置

Keepalived+Mysql互为主从高可用安装配置环境介绍:keepalived_vip=192.168.1.210    (写虚拟ip)mysql_master01      eth0:192.168.1.211  eth1:172.20.27.211 (1核1G)mysql_master02      eth0:192.168.1.212  eth1:172.20.27.212 (1核1G) 1.安装mysql数据库(所有节点安装)  //此处省略安装mysql服务2.编辑my.cnf配

CentOS7安装配置Postgresql

执行命令 Yum install postgresql-server Yum install postgresql-contrib 安装完成后,检查postgresql的服务状态 Systemctl status postgresql 服务未启动 执行systemctl start postgresql启动服务 执行过程有可能会报错 Job for postgresql.service failed because the control process exited with error co

Windows上PostgreSQL安装配置教程

Windows上PostgreSQL安装配置教程 这篇文章主要为大家详细介绍了Windows上PostgreSQL安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 PostgreSQL的扩展PostGIS是最著名的开源GIS数据库. 安装PostgreSQL是第一步. 1.下载PostgreSQL的二进制安装文件. PostgreSQL官网–>Download–>Windows 64位,如图所示: (1)官网: https://www.postgresql.org/ (2)Dow

MYSQL-5.7.20的安装和主从配置(rpm安装包)

一,下载解压(包含全部的rpm包) 如果防火墙有屏蔽,先安装rz yum install lrzsz -y 再在本地下载,再上传 https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20-1.el7.x86_64.rpm-bundle.tar 二,安装 安装的过程如果和mariadb包有冲突,如果要有先卸载 rpm -qa|grep mariadb 查看已安装的mariadb包 rpm -e --nodeps mariadb-libs-