1.服务器准备及组件规划
1.1 资源准备
操作系统:CentOS 7.8
服务器配置:CVM:2台, CPU:4c, Memory:8G, Disk:100G
IP分别为: 172.17.0.2,172.17.0.6
1.2 安装配置拓扑结构说明
|-------|------------|-----------------------------|
| 节点名称 | IP | 目录 |
| gtm主 | 172.17.0.2 | /data/opentenbase/data/gtm |
| gtm备 | 172.17.0.6 | /data/opentenbase/data/gtm |
| cn01主 | 172.17.0.2 | /data/opentenbase/data/cn01 |
| cn02备 | 172.17.0.6 | /data/opentenbase/data/cn02 |
| dn01主 | 172.17.0.2 | /data/opentenbase/data/dn01 |
| dn01备 | 172.17.0.6 | /data/opentenbase/data/dn01 |
| dn02主 | 172.17.0.6 | /data/opentenbase/data/dn02 |
| dn02备 | 172.17.0.2 | /data/opentenbase/data/dn02 |
2.设置
2.1 设置主机名
2.1.1 在OpenTenBase01节点上设置主机名为OpenTenBase01
hostnamectl set-hostname OpenTenBase01
2.1.2 在OpenTenBase02节点上设置主机名为OpenTenBase02
hostnamectl set-hostname OpenTenBase02
2.2 创建用户
2.2.1 在OpenTenBase01节点上创建用户为opentenbase
[root@opentenbase01 ~]# useradd -d /data/opentenbase -s /bin/bash -m opentenbase
2.2.2 在OpenTenBase02节点上创建用户为opentenbase
[root@opentenbase02 ~]# useradd -d /data/opentenbase -s /bin/bash -m opentenbase
2.3 设置密码
2.3.1 在OpenTenBase01节点上设置密码为opentenbase
[root@opentenbase01 ~]# echo opentenbase | passwd --stdin opentenbase
Changing password for user opentenbase.
2.3.2 在OpenTenBase02节点上设置密码为opentenbase
[root@opentenbase02 ~]# echo opentenbase | passwd --stdin opentenbase
Changing password for user opentenbase.
2.4 将用户添加到wheel组
2.4.1 在OpenTenBase01节点上将opentenbase用户添加到wheel组
[root@opentenbase01 ~]# usermod -aG wheel opentenbase
2.4.2 在OpenTenBase02节点上将opentenbase用户添加到wheel组
[root@opentenbase02 ~]# usermod -aG wheel opentenbase
2.5 为wheel组启用sudo权限(通过visudo)
2.5.1 在OpenTenBase01节点上为wheel组启用sudo权限
[root@opentenbase01 ~]# visudo
Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
2.5.2 在OpenTenBase02节点上为wheel组启用sudo权限
[root@opentenbase02 ~]# visudo
Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
3.安装OpenTenBase集群
3.1 在OpenTenBase01节点上,从root切到opentenbase
[root@opentenbase01 ~]# su - opentenbase
[opentenbase@opentenbase01 ~]$
3.2 在OpenTenBase01节点上,下载opentenbase软件包
[opentenbase@opentenbase01 ~]$ wget https://opentenbase-1302252972.cos.ap-nanjing.myqcloud.com/opentenbase-5.21.8-i.x86_64.tar.gz
3.3 在OpenTenBase01节点上,下载opentenbase部署工具包
[opentenbase@opentenbase01 ~]$ wget https://opentenbase-1302252972.cos.ap-nanjing.myqcloud.com/opentenbase_ctl
3.4 在OpenTenBase01节点上,给opentenbase_ctl工具添加执行权限
[opentenbase@opentenbase01 ~]$ chmod a+x opentenbase_ctl
3.5 在OpenTenBase01节点上,安装sshpass工具
opentenbase@opentenbase01 ~]$ sudo yum install -y sshpass
3.6 在OpenTenBase01节点上,创建一个空的postgres.conf参数文件
[opentenbase@opentenbase01 ~]$ mkdir config
[opentenbase@opentenbase01 ~]$ cd config
[opentenbase@opentenbase01 config]$ touch postgres.conf
3.7 在OpenTenBase01节点上,编辑config.ini配置文件
[opentenbase@opentenbase01 config]$ cat >> /data/opentenbase/config/config.ini <<EOF
# 实例配置
[instance]
name=test_cluster01
type=distributed
package=/data/opentenbase/opentenbase-5.21.8-i.x86_64.tar.gz
# gtm节点
[gtm]
master=172.17.0.2
slave=172.17.0.6
# 协调节点
[coordinators]
master=172.17.0.2
slave= 172.17.0.6
nodes-per-server=1
conf=/data/opentenbase/config/postgres.conf
# 数据节点
[datanodes]
master=172.17.0.2,172.17.0.6
slave=172.17.0.6,172.17.0.2
nodes-per-server=1
conf=/data/opentenbase/config/postgres.conf
# 登录和部署账号
[server]
ssh-user=opentenbase
ssh-password=opentenbase
ssh-port=22
# 日志配置
[log]
level=DEBUG
EOF
3.8 查看opentenbase_ctl工具的帮助命令
[opentenbase@opentenbase01 config]$ cd ..
[opentenbase@opentenbase01 ~]$ ./opentenbase_ctl -h
Opentenbase cluster management tool
Usage: opentenbase_ctl [OPTIONS] [SUBCOMMAND]
Options:
-h,--help Print this help message and exit
Subcommands:
install Install a new instance
delete Delete an existing instance
start Start a Instance
stop Stop a instance
status Show instance status
scp scp files to cluster nodes
shell Execute shell command
sql Execute sql command
guc Display or set GUC parameters
3.9 OpenTenBase实例初始化
[opentenbase@opentenbase01 ~]$ ./opentenbase_ctl install -c config/config.ini
====== Start to Install Instance test_cluster01 ======
step 1: Make *.tar.gz pkg ...
Make opentenbase-5.21.8-i.x86_64.tar.gz successfully.
step 2: Transfer and extract pkg to servers ...
Package_path: /data/opentenbase/opentenbase-5.21.8-i.x86_64.tar.gz
Transfer and extract pkg to servers successfully.
step 3: Install gtm master node ...
Install gtm0001(172.17.0.2) ...
Install gtm0001(172.17.0.2) successfully
Success to install gtm master node.
step 4: Install cn/dn master node ...
Install dn0001(172.17.0.2) ...
Install dn0002(172.17.0.6) ...
Install cn0001(172.17.0.2) ...
Install dn0002(172.17.0.6) successfully
Install cn0001(172.17.0.2) successfully
Install dn0001(172.17.0.2) successfully
Success to install all cn/dn master nodes.
step 5: Install slave nodes ...
Install cn0001(172.17.0.6) ...
Install dn0001(172.17.0.6) ...
Install dn0002(172.17.0.2) ...
Install gtm0002(172.17.0.6) ...
Install gtm0002(172.17.0.6) successfully
Install dn0002(172.17.0.2) successfully
Install dn0001(172.17.0.6) successfully
Install cn0001(172.17.0.6) successfully
Success to install all slave nodes.
step 6:Create node group ...
Create node group successfully.
====== Installation completed successfully ======
3.10 OpenTenBase实例状态查看
[opentenbase@opentenbase01 ~]$ ./opentenbase_ctl status
------------- Instance status -----------
Instance name: test_cluster01
Version: v5.21.8
-------------- Node status --------------
Node gtm0001(172.17.0.2:11000) is Running
Node cn0001(172.17.0.6:11003) is Running
Node dn0002(172.17.0.6:11006) is Running
Node gtm0002(172.17.0.6:11000) is Running
Node dn0002(172.17.0.2:11009) is Running
Node cn0001(172.17.0.2:11003) is Running
Node dn0001(172.17.0.6:11009) is Running
Node dn0001(172.17.0.2:11006) is Running
[Result] Total: 8, Running: 8, Stopped: 0, Unknown: 0
------- Master CN Connection Info -------
[1] cn0001(172.17.0.2)
Environment variable: export LD_LIBRARY_PATH=/data/opentenbase/install/opentenbase/5.21.8/lib && export PATH=/data/opentenbase/install/opentenbase/5.21.8/bin:${PATH}
PSQL connection: psql -h 172.17.0.2 -p 11003 -U opentenbase postgres
3.11 配置opentenbase用户环境变量
[opentenbase@opentenbase01 ~]$ cat >> ~/.bash_profile <<EOF
export LD_LIBRARY_PATH=/data/opentenbase/install/opentenbase/5.21.8/lib
export PATH=/data/opentenbase/install/opentenbase/5.21.8/bin:${PATH}
EOF
3.12 opentenbase用户环境变量生效
[opentenbase@opentenbase01 ~]$ source ~/.bash_profile
3.13 拷贝opentenbase_ctl工具到bin目录下,并查看OpenTenBase实例状态
[opentenbase@opentenbase01 ~]$ mv opentenbase_ctl /data/opentenbase/install/opentenbase/5.21.8/bin
[opentenbase@opentenbase01 ~]$ opentenbase_ctl status
4.OpenTenBase基础使用
4.1 登录OpenTenBase数据库
[opentenbase@opentenbase01 ~]$ psql -h 172.17.0.2 -p 11003 -U opentenbase postgres
psql (PostgreSQL 10.0 @ OpenTenBase_v5.0 (commit: ac54d240f) 2025-11-05 11:57:13)
Type "help" for help.
postgres=#
4.2 创建数据库为yunbeedb
postgres=# create database yunbeedb;
CREATE DATABASE
4.3 创建用户为YUNBEE
postgres=# \c yunbeedb opentenbase
You are now connected to database "yunbeedb" as user "opentenbase".
yunbeedb=# create user YUNBEE with password 'yunbee' superuser;
CREATE ROLE
4.4 新用户yunbee登录
yunbeedb=# \q
[opentenbase@opentenbase01 ~]$ psql -h 172.17.0.2 -p 11003 -U yunbee yunbeedb
psql (PostgreSQL 10.0 @ OpenTenBase_v5.0 (commit: ac54d240f) 2025-11-05 11:57:13)
Type "help" for help.
yunbeedb=#
4.5 创建模式为YUNBEE
yunbeedb=# create schema AUTHORIZATION YUNBEE;
yunbeedb=# create schema AUTHORIZATION YUNBEE;
CREATE SCHEMA
yunbeedb-# \dn
List of schemas
Name | Owner
-----------------+-------------
dbms_random | opentenbase
opentenbase_ora | opentenbase
public | opentenbase
yunbee | yunbee
(4 rows)
yunbeedb=# show search_path;
search_path
-----------------
"$user", public
(1 row)
4.6 分布式表
4.6.1 查看组
yunbeedb=# select * from pgxc_group;
group_name | default_group | group_members
---------------+---------------+---------------
default_group | 1 | 16384 16385
(1 row)
4.6.2 查看节点
yunbeedb=# select oid,node_name,node_type,node_port,node_host,nodeis_primary,nodeis_preferred,node_id,node_plane_name from pgxc_node;
oid | node_name | node_type | node_port | node_host | nodeis_primary | nodeis_preferred | node_id | node_plane_name
-------+-----------+-----------+-----------+------------+----------------+------------------+-------------+---------------------
13554 | gtm0001 | G | 11000 | 172.17.0.2 | t | f | -1729643325 | opentenbase_cluster
13553 | cn0001 | C | 11003 | 172.17.0.2 | f | f | 828637238 | opentenbase_cluster
16384 | dn0001 | D | 11006 | 172.17.0.2 | f | f | 277862793 | opentenbase_cluster
16385 | dn0002 | D | 11006 | 172.17.0.6 | f | f | -815738300 | opentenbase_cluster
(4 rows)
4.6.3 切换到yunbee模式
yunbeedb=# set search_path=yunbee;
SET
4.6.4 创建分布式表
yunbeedb=# create table yunbee.employee(empno int not null,name varchar(20),deptno int,primary key(empno)) distribute by shard(empno) to group default_group;
CREATE TABLE
4.6.5 创建索引
yunbeedb=# create index idx_name on yunbee.employee(name);
CREATE INDEX
4.6.6 插入数据
yunbeedb=# insert into yunbee.employee values(1,'zhangsan',1),(2,'lishi',2),(3,'wangwu',3),(4,'zhaoliu',4);
COPY 4
4.6.7 查看表数据
yunbeedb=# select * from employee;
yunbeedb=# execute direct on (dn0001) 'select * from employee';
yunbeedb=# execute direct on (dn0002) 'select * from employee';
4.7 复制表
4.7.1 创建复制表
yunbeedb=# create table yunbee.department(deptno int not null,dept_name varchar(20),primary key(deptno)) distribute by replication to group default_group;
CREATE TABLE
4.7.2 插入数据
yunbeedb=# insert into yunbee.department values(1,'sales'),(2,'Operations'),(3,'Marketing'),(4,'Technology');
COPY 4
4.7.3 查看数据
yunbeedb=# select * from yunbee.department;
yunbeedb=# execute direct on (dn0001) 'select * from yunbee.department';
yunbeedb=# execute direct on (dn0002) 'select * from yunbee.department';
4.8 多表连接
yunbeedb=# select e.empno,e.name,d.dept_name from employee e,department d where e.deptno=d.deptno;
empno | name | dept_name
-------+----------+------------
1 | zhangsan | sales
2 | lishi | Operations
3 | wangwu | Marketing
4 | xiaogang | tech
(4 rows)
4.9 查看执行计划
yunbeedb=# explain select e.empno,e.name,d.dept_name from employee e,department d where e.deptno=d.deptno;
QUERY PLAN
----------------------------------------------------------------------------------
Remote Fast Query Execution
Node/s: dn0001, dn0002
-> Hash Join (cost=25.98..44.70 rows=690 width=120)
Hash Cond: (e.deptno = d.deptno)
-> Seq Scan on employee e (cost=0.00..16.90 rows=690 width=66)
-> Hash (cost=17.10..17.10 rows=710 width=62)
-> Seq Scan on department d (cost=0.00..17.10 rows=710 width=62)
(7 rows)
4.10 自定义函数
4.10.1 创建函数
yunbeedb=# create or replace function add_num(a int default 1,b int default 1)
yunbeedb-# returns integer as $$
yunbeedb$# declare
yunbeedb$# res integer;
yunbeedb$# begin
yunbeedb$# res = a+b;
yunbeedb$# return res;
yunbeedb$# raise notice '%d + %d = %d',a,b,res;
yunbeedb$# end;
yunbeedb$# $$ language plpgsql;
CREATE FUNCTION
4.10.2 调用函数
yunbeedb=# select add_num(2);
add_num
---------
3
(1 row)
yunbeedb=# select add_num(2,4);
add_num
---------
6
(1 row)
4.10.3 查看函数
yunbeedb=# select prosrc from pg_proc where proname='add_num';
prosrc
-----------------------------------------
+
declare +
res integer; +
begin +
res = a+b; +
return res; +
raise notice '%d + %d = %d',a,b,res;+
end; +
(1 row)
4.11 存储过程
4.11.1 创建表
yunbeedb=# create table t_proc(id int);
CREATE TABLE
4.11.2 创建存储过程
yunbeedb=# yunbeedb=# create or replace procedure p_test()
yunbeedb-# language plpgsql
yunbeedb-# as $$
yunbeedb$# begin
yunbeedb$# for i in 0..10 loop
yunbeedb$# insert into t_proc(id) values (i);
yunbeedb$# if i % 2 = 0 then
yunbeedb$# commit;
yunbeedb$# else
yunbeedb$# rollback;
yunbeedb$# end if;
yunbeedb$# end loop;
yunbeedb$# end
yunbeedb$# $$;
CREATE PROCEDURE
4.11.3 执行存储过程
yunbeedb=# call p_test();
CALL
4.11.4 查看表数据
yunbeedb=# select * from t_proc;
id
----
2
6
8
0
4
10
(6 rows)
4.11.5 查看存储过程
yunbeedb=# select prosrc from pg_proc where proname='p_test';
prosrc
------------------------------------------
+
begin +
for i in 0..10 loop +
insert into t_proc(id) values (i);+
if i % 2 = 0 then +
commit; +
else +
rollback; +
end if; +
end loop; +
end +
(1 row)