安装与slony配置



安装与slony配置以前在贴子里说要发的,但居然忘了发了。今天翻以前的贴子才看到。发一个完整版的。

功能:安装数据库,脚本实现自动建立、删除、重建slony.

postgresql 数据同步

slony1是基于postgresql的异步通知机制做的复制技术,其同步速度非常快。  采用这个复制技术来做备份,呵呵,除了配置稍微复杂点,非常好用!   
   
1. 总体需求
1.1. 当前情况
随着软件系统复杂度的提高,分布式部署成为软件部署流行的方式。对于系统的结构,
程序和数据是支撑系统的两大要素。程序的分布式部署已经有很多很好的方案,在这里
我说一下数据的分布式部署。数据的分布式部署其实就是数据库的分布式部署。

1.2. 系统环境
在这里,我以下面的环境详细讲部署的过程。
主数据库服务器 (master)
RHEL3
ip 192.168.30.101
mask 255.255.255.0

从数据库服务器 (slave)
RHEL3
ip 192.168.30.102
mask 255.255.255.0
需要保证两台机器互连互通.

请到指定目的地下载指定的软件包:
db postgresql 8.2.4.tar.gz(http://www.postgresql.org/download/)
slony1 slony1-1.2.6.tar(http://www.postgresql.org/download/)
以上的网址是一个入口地址,请选择合适的正确的源程序包。

1.3. 系统安装
1.3.1 主数据库服务器
1.3.1.1 安装数据库
Groupadd postgres
Useradd postgres –g postgres –d /home/postgres
解压,命令 tar -xvzf postgresql 8.2.4.tar.gz
进入对应的 postgresql-8.2.4 目录 ,命令 :cd postgresql-8.2.4
./configure  –prefix=/usr/local/pgsql –localstatedir=/home/postgres/data
gmake,命令: gmake
注意,是 gmake
安装,命令 gmake install

为 postgres 用户增加环境参数如下:
Vi /home/postgres/.bash_profile

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

chown postgres.postgres /usr/local/pgsql –R

Su – postgres
Mkdir data

修改postgres配置文档
vi /home/postgre/data/postgresql.conf

listen_addresses = ‘*’     //配置监听地址

使用 postgres 创建 数据库集群
/usr/local/pgsql/bin/initdb  /home/postgres/data/
/usr/local/pgsql/bin/pg_ctl -D /home/postgres/data/  start
/usr/local/pgsql/bin/createuser  ssuser
/usr/local/pgsql/bin/createlang plpgsql template1

使用 postgres 创建 log 目录
mkdir /home/postgres/data/log

修改 /home/postgres/data/postgresql.conf 文件
主要配置日志文件
log_destination = ‘stderr’
redirect_stderr = true
log_directory = ‘/test/spescso/data/log/’
log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log’

修改 /test/spescso/data/pg_hba.conf,主要搞定双机相互认证问题,否则不能相互访问
# TYPE DATABASE USER CIDR-ADDRESS METHOD

# “local” is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 192.168.0.0/24 trust
# IPv6 local connections:
host all all ::1/128 trust
如果不能理解上面的意思,请仔细阅读 postgresql 数据库安全认证文档。


使用 postgres 用户后台启动 postmaser 数据库主进程
/usr/local/pgsql/bin/pg_ctl -D /home/postgres/data/ start

1.3.1.2 安装 slony1 数据同步工具(主从都需要安装)
解压,命令 tar -xvjf slony1-1.2.6.tar
注意,使用 -j 参数,该网站压缩包有点不一致。
进入对应的 slony1-1.2.6 目录 ,命令 :cd slony1-1.2.6
./configure  –with-pgsourcetree=<postgresql   源代码目录>
gmake,命令: gmake
注意,是 gmake
安装,命令 gmake install

1.3.2 从数据库服务器
和主数据库服务器的安装方式一致。(其实将主的直接COPY过来就可以的)

1.3.3 建立数据库和数据表
以下以在主数据库服务器上建立主数据库和数据表 test 为例见解,其他数据库和数据表请参考建立.
/usr/local/pgsql/bin/createdb  test
/usr/local/pgsql/bin/psql -f /home/hzh/share/sql.txt  -dtest -Ussuser 

sql.txt 文件最好是 UTF-8 格式,特别是存在中文字符时)
例:sql.txt
CREATE TABLE tb_depart(Id int primary key,Name char();

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

1.4 配置同步
1.4.1. 主机配置
以下脚本都是在slave上的。
slony_0.sh文件内容如下:

  1. #!/bin/sh
  2. /usr/local/pgsql/bin/slonik << _END_
  3. #
  4. # Define cluster namespace and node connection information
  5. #
  6. #集群名称
  7. cluster name = testdb;
  8. # 定义复制节点
  9. node 1 admin conninfo = ‘dbname=test host=192.168.30.101 port=5432 user=ssuser’;
  10. node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=ssuser’;
  11. DROP SET (id=1, origin=1);
  12. uninstall node (id=1);
  13. uninstall node (id=2);
  14. echo ‘Drop testdb set’;
  15. _END_

复制代码

slony_1.sh文件内容如下:

  1. #!/bin/sh
  2. /usr/local/pgsql/bin/slonik << _END_
  3. cluster name = testdb;
  4. # 定义复制节点
  5. node 1 admin conninfo = ‘dbname=test host=192.168.30.101 port=5432 user=ssuser’;
  6. node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=ssuser’;
  7. echo ‘Cluster defined, nodes identified’;
  8. # 初始化集群,id从1开始
  9. init cluster (id=1, comment=’Master Node’);
  10. # 设置存储节点
  11. store node (id=2, comment=’Slave Node’);
  12. echo ‘Nodes defined’;
  13. # 设置存储路径
  14. store path (server=1, client=2, conninfo=’dbname=test host=192.168.30.101 port=5432 user=ssuser’);
  15. store path (server=2, client=1, conninfo=’dbname=test host=localhost port=5432 user=ssuser’);
  16. #设置侦听事件和订阅方向,复制中角色,主节点是原始提供者,从节点是接受者
  17. store listen (origin=1, provider = 1, receiver =2);
  18. store listen (origin=2, provider = 2, receiver =1);
  19. _END_

复制代码

slony_2.sh文件内容如下:

  1. #!/bin/sh
  2. /usr/local/pgsql/bin/slonik << _END_
  3. #
  4. # Define cluster namespace and node connection information
  5. #
  6. cluster name = testdb;
  7. node 1 admin conninfo = ‘dbname=test host=192.168.30.101 port=5432 user=ssuser’;
  8. node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=ssuser’;
  9. # 设置参与同步的数据表
  10. #先创建一个复制集,id也是从1开始
  11. #向自己的复制集种添加表,每个需要复制的表一条set命令
  12. #id从1开始,逐次递加,步进为1;
  13. #fully qualified name是表的全称:模式名.表名
  14. #这里的复制集id需要和前面创建的复制集id一致
  15. #假如某个表没有主键,但是有唯一键字,那么可以用key关键字
  16. #指定其为复制键字,如下面的key参数
  17. #set add table ( set id = 1, origin = 1,id = 4, fully qualified name = ‘public.history’,key = “column”,comment = ‘Table history’ );
  18. #对于没有唯一列的表,需要这样处理,这一句放在 create set 的前面
  19. #table add key (node id = 1, fully qualified name = ‘public.history’);
  20. # 这样设置结果集
  21. #set add table (set id=1, origin=1, id=4, fully qualified name = ‘public.history’, #comment=’history table’, key = serial);
  22. create set (id=1, origin=1, comment=’testdb tables’);
  23. set add table ( set id=1, origin=1,id=1, fully qualified name=’public.tb_depart’,comment=’Table tb_depart’ );
  24. set add table ( set id=1, origin=1,id=2, fully qualified name=’public.tb_user’,comment=’Table tb_user’ );
  25. set add table ( set id=1, origin=1,id=3, fully qualified name=’public.tb_manager’,comment=’Table tb_manager’ );
  26. set add table ( set id=1, origin=1,id=4, fully qualified name=’public.tb_test’,comment=’Table tb_test’ );
  27. echo ‘set 1 of testdb tables created’;
  28. _END_

复制代码

slony_3.sh文件内容如下:

  1. #/bin/sh
  2. /usr/local/pgsql/bin/slon testdb “dbname=test host=192.168.30.101 port=5432 user=ssuser” > ~/slon_gb_1.out 2>&1 &
  3. /usr/local/pgsql/bin/slon testdb “dbname=test host=localhost port=5432 user=ssuser” > ~/slon_gb_2.out 2>&1 &
  4. /usr/local/pgsql/bin/slonik << _END_
  5. #
  6. # Define cluster namespace and node connection information
  7. #
  8. cluster name = testdb;
  9. #提供连接参数
  10. node 1 admin conninfo = ‘dbname=test host=192.168.30.101 port=5432 user=ssuser’;
  11. node 2 admin conninfo = ‘dbname=test host=localhost port=5432 user=ssuser’;
  12. # 提交订阅复制集
  13. subscribe set (id=1, provider=1, receiver=2, forward=no);
  14. echo ‘set 1 of gb tables subscribed by node 2′;
  15. _END_

复制代码

slony_main.sh文件内容如下:

  1. #!/bin/sh
  2. case $1 in
  3.         start)
  4.                 cd /home/postgre/slony
  5.                 sh slony_3.sh
  6.                 ;;
  7.         stop)
  8.                 killall -KILL slon
  9.                 ;;
  10.         rebuild) 
  11.                 cd /home/postgre/slony
  12.                 killall -KILL slon
  13.                 sh slony_0.sh >> /dev/null 2>&1
  14.                 sh slony_1.sh
  15.                 sh slony_2.sh
  16.                 sh slony_3.sh
  17.                 ;;
  18.         *)
  19.                 echo “Please input start or stop or rebuild!!”
  20.                 ;;
  21. esac

复制代码

在从数据库服务器上执行slony_main.sh
可以建立同步,数据库更改后重建同步。
Rebuild错误处理
错误
[postgre@exper2 slony]$ ./slony_main.sh rebuild
<stdin>:4: Cluster defined, nodes identified
<stdin>:6: Error: namespace “_testdb” already exists in database of node 1
<stdin>:6: ERROR: no admin conninfo for node 158941536
<stdin>:8: PGRES_FATAL_ERROR select “_testdb”.storeSet(1, ‘testdb tables’);  - ERROR:  duplicate key violates unique constraint “sl_set-pkey”
CONTEXT:  SQL statement “insert into “_testdb”.sl_set (set_id, set_origin, set_comment) values ( $1 ,  $2 ,  $3 )”
PL/pgSQL function “storeset” line 13 at SQL statement
<stdin>:9: set 1 of gb tables subscribed by node 2

处理

#psql test
test=# drop SCHEMA _testdb CASCADE ;
VACUUM ANALYZE