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,解压压缩包

[root@postgres]# 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

[root@postgres 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

安装完毕后重新编译即可

重新编译:

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

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

[root@postgres postgresql-9.2.10]# make
All of PostgreSQL successfully made. Ready to install.

[root@postgres 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文件:

[postgres@postgres ~]$ 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

[postgres@postgres ~]$ source .bash_profile

5.初始postgresql并启动postgresql

初始化:
[postgres@postgres ~]$ /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

启动:

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

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

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

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

二,编译安装slony-i

1、解压软件包:

[root@postgres local]# tar -xjvf /var/local/slony1-1.2.6.tar.bz2

2、编译安装软件包

[root@postgres ~]# cd /var/local/slony1-1.2.6
[root@postgres slony1-1.2.6]# ./configure --with-pgsourcetree=/usr/local/pgsql/bin

[root@postgres slony1-1.2.6]# make
All of Slony-I is successfully made. Ready to install

[root@postgres slony1-1.2.6]# make install
All of Slony-I is successfully installed

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

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

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

三,主从配置

1.postgresql添加复制用户

su - postgres 用户下

[postgres@mysql ~]$ 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服务:

[postgres@localhost ~]$/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

创建后查看:
[postgres@postgres ~]$ 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_

[postgres@mysql2 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

[postgres@mysql2 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

修改数据前:
主库端:
[postgres@postgres ~]$ 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)

备库端:
[postgres@mysql2 ~]$ 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)

同步成功。

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

  1. PostgreSQL CentOS 7 安装配置

    https://www.postgresql.org/download/ 选择相应的版本 安装完成后,稍微配置下,否则无法远程访问: cd /var/lib/pgsql/11/data vi post ...

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

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

  3. redis:安装配置主从

    1.安装依赖包 yum install gcc gcc-c++ -y 2.下载安装包,解压 cd /usr/local/src/wget http://download.redis.io/releas ...

  4. DNS安装配置主从

    准备环境  关闭防火墙 挂载一下 更改配置文件 安装dns服务 更改配置文件  先复制保存一份

  5. Linux下apache+phppgadmin+postgresql安装配置

    Linux下apache+phppgadmin+postgresql安装配置 操作系统:CentOS 安装包:httpd(首选yum), php(包括php以及php-pgsql,php-mbstri ...

  6. postgresql安装配置

    一,什么是postgresql PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES 版本 4.2 为基础的对象关系型数据库管理系统(ORDBMS),简称pgsql,它支持大部分 ...

  7. DNS服务器:主要介绍DNS的服务原理以及安装及其主从配置

    DNS服务器:主要介绍DNS的服务原理以及安装及其主从配置 一.DNS简介 1.DNS    DNS是域名系统(Domain Name System)的简称,它是一个将域名和IP相互映射的分布式数据库 ...

  8. Centos 7.3 安装配置 PostgreSQL 9.x

    一.安装 PostgresSQL Centos 7 自带的 PostgresSQL 是 9.2 版的.因为,yum 已经做了国内源,速度飞快,所以直接就用 yum 安装了.依次执行以下命令即可,非常简 ...

  9. centos DNS服务搭建 DNS原理 使用bind搭建DNS服务器 配置DNS转发 配置主从 安装dig工具 DHCP dhclient 各种域名解析记录 mydns DNS动态更新 第三十节课

    centos  DNS服务搭建  DNS原理  使用bind搭建DNS服务器 配置DNS转发 配置主从  安装dig工具  DHCP  dhclient  各种域名解析记录  mydns DNS动态更 ...

随机推荐

  1. 2o_TwoTips

    ∮Linux 使用的两个小技巧 开启启动脚本 和 环境变量问题 §1.开机启动脚本 && 周期任务 环境 CentOS7:3.10.0-327.el7.x86_64 # head /e ...

  2. Windows程序设再读笔记03-窗口与消息

    1.关于LoadIcon/LoadCursor,这两个函数,第一个参数为实例句柄,如果是从保存在磁盘中的可执行文件中加载资源,则需要则需要指定可执行文件的hInstance,如果是系统资源,该句柄为N ...

  3. SDH误码仪MP1570A的自动化

    MP1570A是日本安立公司的用于SDH测试的误码仪. 1.MP1570A的自动化测试场景和原理 任意测试PC--(telnet)-->测试PC(Tcl Interrupt)-->SIG_ ...

  4. springMVC和mybatis整合,jsp对时间进行格式化

    发现jsp显示的时间,是java Date类型的默认格式,一串鸡肠.... 可在jsp对输出进行格式化: 1.加入taglib <%@ taglib prefix="fmt" ...

  5. Oracle数据库导入导出命令

    在建立oracle客户端的前提下,Net Manager中配置了数据库的连接,使用此命令 导出数据 pauseecho 正在备份老数据库...pauseexp user/pwd@配置名称 file=d ...

  6. 在centos配置nginx+php的环境

    环境版本:centos6.8/nginx1.10.2/php5.6.29 ====================安装nginx1.10.2==================== #根据centos ...

  7. css 去除点击之后的虚线

    链接在被点击时会出现虚线框,即使松开了也仍然存在,在有的时候显得不美观.既然不好看,那就不要它.怎样去掉呢? 方法一 IE下可使用其私有的html属性:hideFoucs,在标签的结构中加入hidef ...

  8. Perl语言

    Perl是高级.通用.直译式.动态的程序语言家族.最初设计者拉里·沃尔(Larry Wall)为了让在UNIX上进行报表处理的工作变得更方便,决定开发一个通用的脚本语言,而在1987年12月18日发表 ...

  9. HashMap、HashTable、LinkedHashMap和TreeMap用法和区别

    Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap.HashTable.LinkedHashMap和TreeMap.本节实例主要介绍这4中实例的用 ...

  10. Python 无限循环

    import threading import time class CountDownTimer(threading.Thread): def __init__(self, seconds, act ...