PostgresXC:从源码编译、安装、配置数据库集群以及用pg_basebackup配置Datanode的热备份
来源:互联网 发布:阿里云服务器遭到攻击 编辑:程序博客网 时间:2024/05/16 11:00
1.集群编译、安装、配置
1.1.下载源码
首先下载源码,下载命令为:
git clone http://git.code.sf.net/p/postgres-xc/postgres-xc postgres-xc-postgres-xc
或
https://sourceforge.net/projects/postgres-xc/
1.2.编译安装
下载完成后,开始编绎。进入到源码目录,执行命令:
$ ./configure --prefix=/home/wslu/pgsql --enable-debug #其中--prefix指定编绎完成后将要安装的路径,必须使用全路径,wslu为使用者。$ make #执行编绎$ make install #执行安装如果没有编绎错误的话,那么Postgres-xc已经成功安装到你指定的/home/wslu/pgsql目录。
请弄清configure,make,make install的具体作用。
1.3.初始化、配置及启动
Postgres-xc的配置和启动(以本机安装为例):
1.3.1.初始化gtm
进入到/home/wslu/pgsql/目录,
#设置PTAH变量$ export PATH=/home/user/pgsql/bin:$PATH#使用初始化gtm命令initgtm$ ./bin/initgtm -Z gtm -D data/gtm/请弄清export的作用,设置PATH的作用,initgtm的作用及用法(使用initgtm --help)。
1.3.2.初始化各数据节点数据库,依次执行
#使用初始化db命令initdb$ ./bin/initdb -U wslu -A trust --locale=C -D data/co1 // -U 使用者 -D 数据目录/节点$ ./bin/initdb -U wslu -A trust --locale=C -D data/co2$ ./bin/initdb -U wslu -A trust --locale=C -D data/dn1$ ./bin/initdb -U wslu -A trust --locale=C -D data/dn2$ ./bin/initdb -U wslu -A trust --locale=C -D data/dn3请弄清initdb的作用及用法(使用initdb --help)。
1.3.3.编辑各节点的配置文件
编辑data/co1/postgresql.conf: gtm_port = 6666 //为默认值 pgxc_node_name = co1 //pgxc_node_name不能重复编辑data/co2/postgresql.conf: gtm_port = 6666 pgxc_node_name = co2编辑data/dn1/postgresql.conf: gtm_port = 6666 pgxc_node_name = dn1 编辑data/dn2/postgresql.conf: gtm_port = 6666 pgxc_node_name = dn2编辑data/dn2/postgresql.conf: gtm_port = 6666 pgxc_node_name = dn3请弄清为何要修改这些配置文件。
1.3.4.依次启动gtm、datanode、coordinator:
#./bin/gtm_ctl start -S gtm -D data/gtm -l data/gtm/gtm.log //启动gtm(由于切换为相对路径后找不到对应的文件夹,所以创建日志会失败)$ ./bin/gtm_ctl start -Z gtm -D data/gtm -l gtm.log //启动gtm#vim data/gtm/gtm.log //可使用日志查看gtm是否启动 $ ./bin/pg_ctl start -Z datanode -D data/dn1 -l data/dn1/postgresql.log -o "-p 24071" //启动datanode dn1, DN1_PORT=24071 根据需要自由设置#vim data/dn1/postgresql.log //同样使用日志查看是否启动$ ./bin/pg_ctl start -Z datanode -D data/dn2 -l data/dn2/postgresql.log -o "-p 24072" //启动 dn2, DN2_PORT=24072$ ./bin/pg_ctl start -Z datanode -D data/dn3 -l data/dn3/postgresql.log -o "-p 24073" //启动 dn3, DN3_PORT=24073$ ./bin/pg_ctl start -Z coordinator -D data/co1 -l data/co1/postgresql.log -o "-p 24076" //启动 coordinator co1, CO1_PORT=24076$ ./bin/pg_ctl start -Z coordinator -D data/co2 -l data/co2/postgresql.log -o "-p 24077" //启动 co2, CO2_PORT= 24077请弄清gtm_ctl, pg_ctl的作用及用法(使用gtm_ctl --help, pg_ctl --help)
1.3.5.配置集群节点:
$ export LD_LIBRARY_PATH=/home/wslu/pgsql/lib:$LD_LIBRARY_PATH //指定动态库位置
$ ./bin/psql -p 24076 postgres postgres //进入co1创建节点,co1_port=24076 CREATE NODE dn1 WITH (HOST = 'localhost', type = 'datanode', PORT = 24071, id = 1, content = 1); //在协调器上注册节点,各端口号与上面一致 CREATE NODE dn2 WITH (HOST = 'localhost', type = 'datanode', PORT = 24072, id = 2, content = 2); CREATE NODE dn3 WITH (HOST = 'localhost', type = 'datanode', PORT = 24073, id = 3, content = 3); CREATE NODE co1 WITH (HOST = 'localhost', type = 'coordinator', PORT = 24076, id = 4, content = 4); CREATE NODE co2 WITH (HOST = 'localhost', type = 'coordinator', PORT = 24077, id = 5, content = 5); SELECT pgxc_pool_reload();
此时,集群是处于启动状态的。
请弄清LD_LIBRARY_PATH的作用。
请弄清LD_LIBRARY_PATH的作用。
1.3.6.停止集群:
$ ./bin/pg_ctl stop -D data/co1 -m immediate$ ./bin/pg_ctl stop -D data/co2 -m immediate$ ./bin/pg_ctl stop -D data/dn1 -m immediate$ ./bin/pg_ctl stop -D data/dn2 -m immediate$ ./bin/pg_ctl stop -D data/dn3 -m immediate$ ./bin/gtm_ctl stop -Z gtm -D data/gtm $ rm -f data/gtm/register.node
1.3.7.启动集群:
$ ./bin/gtm_ctl start -Z gtm -D data/gtm -p ./bin -l data/gtm/gtm.log $ ./bin/pg_ctl start -l data/dn1/postgresql.log -Z datanode -D data/dn1 -o "-p 24071"$ ./bin/pg_ctl start -l data/dn2/postgresql.log -Z datanode -D data/dn2 -o "-p 24072"$ ./bin/pg_ctl start -l data/dn3/postgresql.log -Z datanode -D data/dn3 -o "-p 24073"$ ./bin/pg_ctl start -l data/co1/postgresql.log -Z coordinator -D data/co1 -o "-p 24076"$ ./bin/pg_ctl start -l data/co2/postgresql.log -Z coordinator -D data/co2 -o "-p 24077"
1.3.8.如需清除数据,请先停止服务器集群,然后清除数据存储目录:
$ ./bin/pg_ctl stop -D data/co1 -m immediate$ ./bin/pg_ctl stop -D data/co2 -m immediate$ ./bin/pg_ctl stop -D data/dn1 -m immediate$ ./bin/pg_ctl stop -D data/dn2 -m immediate$ ./bin/pg_ctl stop -D data/dn3 -m immediate$ ./bin/gtm_ctl stop -Z gtm -D data/gtm $ rm -f data/gtm/register.node $ rm -rf data
2.利用pg_basebackup建立Datanode的实时备份或热备份
2.1.修改所有CO和DN,将下面两行的注释去掉:
$ vi data/co1/pg_hba.confhost replication wslu 127.0.0.1/32 trusthost replication wslu ::1/128 trust$ vi data/co2/pg_hba.confhost replication wslu 127.0.0.1/32 trusthost replication wslu ::1/128 trust$ vi data/dn1/pg_hba.confhost replication wslu 127.0.0.1/32 trusthost replication wslu ::1/128 trust$ vi data/dn2/pg_hba.confhost replication wslu 127.0.0.1/32 trusthost replication wslu ::1/128 trust$ vi data/dn3/pg_hba.confhost replication wslu 127.0.0.1/32 trusthost replication wslu ::1/128 trust这是为了测试所有才设为trust,可以改为md5,即根据账户密码验证。
2.2.修改CO和DN的postgresql.conf,添加以下内容:
$ vi data/co1/postgresql.conflisten_addresses = '*' log_line_prefix = '%t:%r:%u@%d:[%p]: '#logging_collector = on port = 24076wal_level = archive$ vi data/co2/postgresql.conflisten_addresses = '*' log_line_prefix = '%t:%r:%u@%d:[%p]: '#logging_collector = on port = 24077wal_level = archive$ vi data/dn1/postgresql.confhot_standby = on#logging_collector = onlisten_addresses = '*' log_line_prefix = '%t:%r:%u@%d:[%p]: 'wal_keep_segments = 10wal_level = hot_standbymax_wal_senders = 5 include_if_exists = 'synchronous_standby_names.conf'port = 24071$ vi data/dn2/postgresql.confhot_standby = on#logging_collector = onlisten_addresses = '*' log_line_prefix = '%t:%r:%u@%d:[%p]: 'wal_keep_segments = 10wal_level = hot_standbymax_wal_senders = 5 include_if_exists = 'synchronous_standby_names.conf'port = 24072$ vi data/dn3/postgresql.confhot_standby = on#logging_collector = onlisten_addresses = '*' log_line_prefix = '%t:%r:%u@%d:[%p]: 'wal_keep_segments = 10wal_level = hot_standbymax_wal_senders = 5 include_if_exists = 'synchronous_standby_names.conf'port = 24073
2.3.在数据库集群开启的前提下执行下列指令,以创建备Datanode目录
$ pg_basebackup -D data/dn1s -Fp -Xs -v -P -h localhost -p 24071 -U wslu$ pg_basebackup -D data/dn2s -Fp -Xs -v -P -h localhost -p 24072 -U wslu$ pg_basebackup -D data/dn3s -Fp -Xs -v -P -h localhost -p 24073 -U wslu
2.4.在所有dn备节点新建recovery.conf文件
$ vi dn1s/recovery.conf standby_mode = 'on'primary_conninfo = 'user=wslu host=localhost port=24071 sslmode=disable sslcompression=1'$ vi dn2s/recovery.conf standby_mode = 'on'primary_conninfo = 'user=wslu host=localhost port=24072 sslmode=disable sslcompression=1'$ vi dn3s/recovery.conf standby_mode = 'on'primary_conninfo = 'user=wslu host=localhost port=24073 sslmode=disable sslcompression=1'
2.5.在所有主dn节点新建synchronous_standby_names.conf
vi data/dn1/synchronous_standby_names.conf synchronous_standby_names='*'
2.6.在所有CO创建备dn节点
这里以co1为例,co2也要执行同样操作(对于支持热备的其他pg商用数据库,类型不是datanode而是standby):
$ ./bin/psql -p 24076 postgres postgres //进入co1创建节点,co1_port=24076 CREATE NODE dn1s WITH (HOST = 'localhost', type = 'datanode', PORT = 34071, id = 6, content = 1); //在协调器上注册节点,各端口号与上面一致 CREATE NODE dn2s WITH (HOST = 'localhost', type = 'datanode', PORT = 34072, id = 7, content = 2); CREATE NODE dn3s WITH (HOST = 'localhost', type = 'datanode', PORT = 34073, id = 8, content = 3);
2.7.启动所有备dn节点服务
./bin/pg_ctl start -D data/dn1s -l data/dn1s/postgresql.log -o "-p 34071"./bin/pg_ctl start -D data/dn2s -l data/dn2s/postgresql.log -o "-p 34072"./bin/pg_ctl start -D data/dn3s -l data/dn3s/postgresql.log -o "-p 34073"
-p后面的端口号是备dn要绑定的端口。由于dn1s的配置文件时从dn1拷贝而来的,所以如果想不指定端口,就要将dn1s的postgresql.conf文件中的port修改为34071,dn2s、dn3s类似。
至此,所有备dn搭建启动成功。
2.8.相应的,停止所有备dn节点服务
./bin/pg_ctl stop -D data/dn1s -m immediate./bin/pg_ctl stop -D data/dn2s -m immediate./bin/pg_ctl stop -D data/dn3s -m immediate
2.9.如何激活备dn
我并未实现成功,但参照其他postgresql的分布式数据库,步骤如下:
(1)杀掉主DN进程,在备DN的目录下创建一个触发文件(例如:promote)文件。
(2)通过 kill -SIGUSR1 备DN进程号 指令给备DN的postmaster进程发送一个SIGUSR1信号。
(3)在主CO执行类似 alter node dn1s with(promote); 的指令。
(4)退出psql,再重新连入psql。
(5)此时,备DN就作为主DN运行了,可执行DDL、DML等所有操作。
2.10.当备DN挂掉时,可能要关闭主备DN之间的数据同步
即关闭walsender和walreciever。
这就涉及到源码级别了,一般做两部:
(1)将主DN状态改为OutSync(别的数据库的做法)。
(2)在代码中将SyncRepStandbyNames设为""。
备注:
本教程关于配置备DN的描述只能对各个DN的数据做备份,并未成功实现某个DN挂掉了自动切换到备DN。
另外,我并未在postgres-xc(现在其github改名为了postgres-x2)源码中的回归测试中看到如何在pgxc_nodes系统表创建备DN节点。如果你知道,欢迎回复共同探讨一下。
不过,很多以postgresql为基础的商用数据库(例如Greenplum)有此功能。
参考pg手册 : http://www.postgres.cn/docs/9.3/high-availability.html
0 0
- PostgresXC:从源码编译、安装、配置数据库集群以及用pg_basebackup配置Datanode的热备份
- mysql热备份的配置
- 怎样配置MySQL数据库双机热备份
- Mongodb安装配置及热备集群
- Ubuntu与Centos的Hadoop安装以及编译运行MapReduce,Hadoop集群安装配置教程
- CentOS和Ubuntu下安装配置Greenplum数据库集群(包括安装包和源码编译安装)
- Mysql升级以及主从备份集群配置
- 配置热备份
- hadoop集群配置以及安装
- 安装rabbitmq以及集群配置
- hadoop集群配置datanode无法启动的原因
- 安装KVM以及配置热迁移环境
- redis安装配置以及集群配置
- Ubuntu下从源码手工编译安装及配置PHP5
- Ubuntu下从源码手工编译安装及配置PHP5
- 配置MySQL数据库双机热备份(转)
- 教你怎样配置MySQL数据库双机热备份
- hadoop1.x配置 - 集群增加datanode
- BZOJ_P1076 [SCOI2008]奖励关(概率期望DP+状态压缩DP)
- iOS小技巧18-如何打包Ad Hoc ipa文件
- 怒刷蓝桥杯
- 28335学习笔记:asm(" RPT #N || NOP")
- 获取心率带的心率值,介绍核心蓝牙:构建一个心率监视器。
- PostgresXC:从源码编译、安装、配置数据库集群以及用pg_basebackup配置Datanode的热备份
- Android Runnable 运行在那个线程
- iOS中的事件传递和响应者链条
- POJ 1001
- SiteMesh简单引入demo
- 自学微信二次开发(1)
- POJ 3522
- bzoj2154: Crash的数字表格
- HDU 1045.Fire Net【DFS暴力搜索】【3月15】