跳转至

快速入门

什么是OpenTenBase

OpenTenBase 是一个提供写可靠性,多主节点数据同步的关系数据库集群平台。你可以将 OpenTenBase 配置一台或者多台主机上, OpenTenBase 数据存储在多台物理主机上面。数据表的存储有两种方式, 分别是 distributed 或者 replicated ,当向OpenTenBase发送查询 SQL时, OpenTenBase 会自动向数据节点发出查询语句并获取最终结果。

OpenTenBase 采用分布式集群架构(如下图), 该架构分布式为无共享(share nothing)模式,节点之间相应独立,各自处理自己的数据,处理后的结果可能向上层汇总或在节点间流转,各处理单元之间通过网络协议进行通信,并行处理和扩展能力更好,这也意味着只需要简单的x86服务器就可以部署 OpenTenBase 数据库集群

OpenTenBase架构图

下面简单解读一下OpenTenBase的三大模块

  • Coordinator:协调节点(简称CN)

    业务访问入口,负责数据的分发和查询规划,多个节点位置对等,每个节点都提供相同的数据库视图;在功能上CN上只存储系统的全局元数据,并不存储实际的业务数据。

  • Datanode:数据节点(简称DN)

    每个节点还存储业务数据的分片在功能上,DN节点负责完成执行协调节点分发的执行请求。

  • GTM:全局事务管理器(Global Transaction Manager)

    负责管理集群事务信息,同时管理集群的全局对象,比如序列等。

接下来,让我们来看看如何从源码开始,完成到OpenTenBase集群环境的搭建。

OpenTenBase源码编译安装

系统要求

内存: 最小 8G RAM

操作系统: TencentOS 2, TencentOS 3, OpenCloudOS 8.x, CentOS 7, CentOS 8, Ubuntu 18.04

依赖

yum -y install git sudo gcc make readline-devel zlib-devel openssl-devel uuid-devel bison flex cmake postgresql-devel libssh2-devel sshpass libcurl-devel libxml2-devel

或者

apt install -y git sudo gcc make libreadline-dev zlib1g-dev libssl-dev libossp-uuid-dev bison flex cmake libssh2-1-dev sshpass libxml2-dev language-pack-zh-hans

创建用户 'opentenbase'

# 1. 创建目录 /data
mkdir -p /data

# 2. 添加用户
useradd -d /data/opentenbase -s /bin/bash -m opentenbase # 添加用户 opentenbase

# 3. 设置密码
passwd opentenbase # 设置密码

# 4. 将用户添加到 wheel 组
# 对于 RedHat
usermod -aG wheel opentenbase
# 对于 Debian
usermod -aG sudo opentenbase

# 5. 为 wheel 组启用 sudo 权限(通过 visudo)
visudo 
# 然后取消注释 "% wheel" 行,保存并退出

编译

su - opentenbase
cd /data/opentenbase/
git clone https://github.com/OpenTenBase/OpenTenBase

export SOURCECODE_PATH=/data/opentenbase/OpenTenBase
export INSTALL_PATH=/data/opentenbase/install/

cd ${SOURCECODE_PATH}
rm -rf ${INSTALL_PATH}/opentenbase_bin_v5.0
chmod +x configure*
./configure --prefix=${INSTALL_PATH}/opentenbase_bin_v5.0 --enable-user-switch --with-libxml --disable-license --with-openssl --with-ossp-uuid CFLAGS="-g"
make clean
make -sj
make install
chmod +x contrib/pgxc_ctl/make_signature
cd contrib
make -sj
make install

安装

使用 OPENTENBASE_CTL 工具来搭建一个集群,例如:搭建一个具有1个全局事务管理节点(GTM)、1个协调器节点(COORDINATOR)以及2个数据节点(DATANODE)的集群。 OpenTenBase部署示意图

准备工作

1. 安装 opentenbase 并将 opentenbase 安装包的路径导入到环境变量中。

PG_HOME=${INSTALL_PATH}/opentenbase_bin_v5.0
export PATH="$PATH:$PG_HOME/bin"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$PG_HOME/lib"
export LC_ALL=C

2. 禁用 SELinux 和防火墙(可选)

vi /etc/selinux/config 
set SELINUX=disabled

# 禁用防火墙
sudo systemctl disable firewalld
sudo systemctl stop firewalld

3. 创建用于初始化实例的 *.tar.gz 包。

cd ${PG_HOME}
tar -zcf ${INSTALL_PATH}/opentenbase-5.21.8-i.x86_64.tar.gz *
cd ${INSTALL_PATH}

集群启动步骤

生成并填写配置文件

opentenbase_config.opentenbase_ctl 工具可以生成配置文件的模板。您需要在模板中填写集群节点信息。启动 opentenbase_ctl 工具后,将在当前用户的主目录中生成 opentenbase_ctl 目录。输入 "prepare config" 命令后,将在 opentenbase_ctl 目录中生成可直接修改的配置文件模板。

  • opentenbase_config.ini 中各字段说明
| 配置类别        | 配置项            | 说明                                                                      |
|----------------|------------------|---------------------------------------------------------------------------||
| instance       | name             | 实例名称,可用字符:字母、数字、下划线,例如:opentenbase_instance01        |
|                | type             | distributed 表示分布式模式,需要 gtm、coordinator 和 data 节点;centralized 表示集中式模式 |
|                | package          | 软件包。完整路径(推荐)或相对于 opentenbase_ctl 的相对路径                  |
| gtm            | master           | 主节点,只有一个 IP                                                        |
|                | slave            | 从节点。如果需要 n 个从节点,在此配置 n 个 IP,用逗号分隔                    |
| coordinators   | master           | 主节点 IP,自动生成节点名称,在每个 IP 上部署 nodes-per-server 个节点        |
|                | slave            | 从节点 IP,数量是主节点的整数倍                                             |
|                |                  | 示例:如果 1 主 1 从,IP 数量与主节点相同;如果 1 主 2 从,IP 数量是主节点的两倍 |
|                | nodes-per-server | 可选,默认 1。每个 IP 上部署的节点数。示例:主节点有 3 个 IP,配置为 2,则有 6 个节点 |
|                |                  | cn001-cn006 共 6 个节点,每个服务器分布 2 个节点                            |
| datanodes      | master           | 主节点 IP,自动生成节点名称,在每个 IP 上部署 nodes-per-server 个节点        |
|                | slave            | 从节点 IP,数量是主节点的整数倍                                             |
|                |                  | 示例:如果 1 主 1 从,IP 数量与主节点相同;如果 1 主 2 从,IP 数量是主节点的两倍 |
|                | nodes-per-server | 可选,默认 1。每个 IP 上部署的节点数。示例:主节点有 3 个 IP,配置为 2,则有 6 个节点 |
|                |                  | dn001-dn006 共 6 个节点,每个服务器分布 2 个节点                            |
| server         | ssh-user         | 远程命令执行用户名,需要提前创建,所有服务器应有相同账户以简化配置管理          |
|                | ssh-password     | 远程命令执行密码,需要提前创建,所有服务器应有相同密码以简化配置管理            |
|                | ssh-port         | SSH 端口,所有服务器应保持一致以简化配置管理                                 |
| log            | level            | opentenbase_ctl 工具执行的日志级别(不是 opentenbase 节点的日志级别)        |

1. 为实例创建配置文件 opentenbase_config.ini

mkdir -p ./logs
touch opentenbase_config.ini
vim opentenbase_config.ini
  • 例如,如果我有两台服务器 172.16.16.49 和 172.16.16.131,分布在两台服务器上的典型分布式实例配置如下。您可以复制此配置信息并根据您的部署要求进行修改。不要忘记填写 ssh 密码配置。
# 实例配置
[instance]
name=opentenbase01
type=distributed
package=/data/opentenbase/install/opentenbase-5.21.8-i.x86_64.tar.gz

# GTM 节点
[gtm]
master=172.16.16.49
slave=172.16.16.50,172.16.16.131

# 协调器节点
[coordinators]
master=172.16.16.49
slave= 172.16.16.131
nodes-per-server=1

# 数据节点
[datanodes]
master=172.16.16.49,172.16.16.131
slave=172.16.16.131,172.16.16.49
nodes-per-server=1

# 登录和部署账户
[server]
ssh-user=opentenbase
ssh-password=
ssh-port=36000

# 日志配置
[log]
level=DEBUG
  • 同样,典型集中式实例的配置如下。不要忘记填写 ssh 密码配置。
# 实例配置
[instance]
name=opentenbase02
type=centralized
package=/data/opentenbase/install/opentenbase-5.21.8-i.x86_64.tar.gz

# 数据节点
[datanodes]
master=172.16.16.49
slave=172.16.16.131
nodes-per-server=1

# 登录和部署账户
[server]
ssh-user=opentenbase
ssh-password=
ssh-port=36000

# 日志配置
[log]
level=DEBUG

2. 执行实例安装命令。

export LD_LIBRARY_PATH=/data/opentenbase/install/opentenbase_bin_v5.0/lib
./opentenbase_bin_v5.0/bin/opentenbase_ctl install  -c opentenbase_config.ini

====== Start to Install Opentenbase 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_ctl/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.16.16.49) ...
    Install gtm0001(172.16.16.49) successfully
    Success to install  gtm master node. 

step 4: Install cn/dn master node ...
    Install cn0001(172.16.16.49) ...
    Install dn0001(172.16.16.49) ...
    Install dn0002(172.16.16.131) ...
    Install cn0001(172.16.16.49) successfully
    Install dn0001(172.16.16.49) successfully
    Install dn0002(172.16.16.131) successfully
    Success to install all cn/dn master nodes. 

step 5: Install slave nodes ...
    Install gtm0002(172.16.16.131) ...
    Install cn0001(172.16.16.131) ...
    Install dn0001(172.16.16.131) ...
    Install dn0002(172.16.16.49) ...
    Install gtm0002(172.16.16.131) successfully
    Install dn0002(172.16.16.49) successfully
    Install dn0001(172.16.16.131) successfully
    Install cn0001(172.16.16.131) successfully
    Success to install all slave nodes. 

step 6: Create node group ...
    Create node group successfully. 

====== Installation completed successfully  ====== 
  • 当您看到 'Installation completed successfully' 字样时,表示安装已完成。尽情享受您的 opentenbase 之旅吧。
  • 您可以检查实例的状态
[opentenbase@VM-16-49-tencentos opentenbase_ctl]$ ./opentenbase_bin_v5.0/bin/opentenbase_ctl status -c opentenbase_config.ini

------------- Instance status -----------  
Instance name: test_cluster01
Version: 5.21.8

-------------- Node status --------------  
Node gtm0001(172.16.16.49) is Running 
Node dn0001(172.16.16.49) is Running 
Node dn0002(172.16.16.49) is Running 
Node cn0001(172.16.16.49) is Running 
Node dn0002(172.16.16.131) is Running 
Node cn0001(172.16.16.131) is Running 
Node gtm0002(172.16.16.131) is Running 
Node dn0001(172.16.16.131) is Running 
[Result] Total: 8, Running: 8, Stopped: 0, Unknown: 0

------- Master CN Connection Info -------  
[1] cn0001(172.16.16.49)  
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.16.16.49 -p 11000 -U opentenbase postgres 

使用

  • 连接到 CN 主节点执行 SQL
export LD_LIBRARY_PATH=/home/opentenbase/install/opentenbase/5.21.8/lib  && export PATH=/home/opentenbase/install/opentenbase/5.21.8/bin:${PATH} 
$ psql -h ${CoordinateNode_IP} -p ${CoordinateNode_PORT} -U opentenbase -d postgres

postgres=# create database test;
CREATE DATABASE
postgres=# create user test with password 'test';
CREATE ROLE
postgres=# alter database test owner to test;
ALTER DATABASE
postgres=# \c test test
You are now connected to database "test" as user "test".
test=> create table foo(id bigint, str text) distribute by shard(id);
CREATE TABLE
test=> insert into foo values(1, 'tencent'), (2, 'shenzhen');
COPY 2
test=> select * from foo;
 id |   str    
----+----------
  1 | tencent
  2 | shenzhen
(2 rows)

  • 结语
    本文档只是给用户一个简单的指引,演示如何从源码开始,一步一步搭建一个完整的OpenTenBase集群,后续会有更多的文章来介绍OpenTenBase的特性使用,优化,问题定位等内容。