Joe
by Joe Leslie

在Docker中运行Nuodb - 第1部分:在Docker容器中部署Nuodb数据库

在Noodb,我们不仅努力改进我们的分布式SQL数据库引擎,还可以更轻松地将NuodB进入CI / CD管道。 NuodB是ANSI标准和酸兼容的SQL数据库,适用于所有常见部署模型,例如裸机,虚拟机,云和混合云,以及最近的基于集装箱的环境,如Red Hat OpenShift容器平台。在其核心,Nuodb旨在具有高度可扩展的和容错能力,具有在分布式架构上加载的能力。

如果您想在Docker中尝试Nuodb的社区版(CE),我们可以提供运行最新版Nuodb的Nuodb Docker容器。容器图像可用 Docker. Hub. ,我们将不断更新更新,以便在每个云和基于集装箱的环境中提高部署。

Nuodb Community Edition(CE)是NOODB的完整功能版本,但仅限于一个存储管理器(SM)和三个事务引擎(TE)流程。社区版是免费的,并允许用户以自己的速度自我评估诺福布。有关更多信息,请参阅 社区版下载 page.

在我们开始之前有关诺博德的更多信息......

如果您不熟悉Nuodb的架构,请阅读我们的阅读 建筑白皮书。您还可以查看我们的电子书 NOODB和Docker. 适合高级架构讨论。

NuodB体系结构跨三个单独的组件分发管理和数据库处理。分离管理员和数据库函数允许Nuodb利用AWS自动缩放组或Kubernetes'自动播放POD等服务,以提高Nuodb的交易引擎(TES)和存储管理器(SMS)进程的吞吐量和高可用性。因此,在云本机环境中,我们建议您在自己的容器中运行每个Nuodb进程。

每个Noodb容器不必位于同一主机上,但需要在同一叠加网络上才能彼此通信。或者,您可以将主机端口映射到容器以连接到较大的网络上。我们还建议将TE容器放在同一主机上作为申请。这允许您的应用程序与缓存的数据库一起在本地通信,并且之间没有网络跳跃。

NOODB流程:

  • 管理员服务 负责管理域和数据库状态。管理服务还负责将客户端应用程序连接到Nuodb TE进程的负载平衡功能。
     
  • 存储管理器(SMS) 负责确保磁盘数据持久性并将更改复制到新的启动SMS。每个SM由单个管理服务管理。
     
  • 交易引擎(TES) 负责将客户端应用程序连接到数据库并处理SQL事务。它们还执行数据表的内存数据缓存以优化SQL性能。每个TE由单个管理员服务管理。

在Docker中使用NOODB开始

既然您对NOODB架构有很大的根本性理解,让我们继续在Docker中部署第一个NOODB数据库  Docker运行  这将展示如何部署NOODB数据库的实际基础。 

笔记: 如果您已经使用Docker撰写并希望快速追踪,以了解如何使用诺福布使用  Docker. 撰写请跳到 在Docker中运行Nuodb - 第4部分:使用Docker Compose 并重新访问Docker博客2和3以后了解有关视觉监控的更多信息以及如何使用NuodB使用公共SQL执行GUI工具。

第1步:将Docker安装到Rhel / CentOS,Ubuntu或MacOS环境中

该演示旨在将Nuodb CE运行在单个服务器或台式计算机上,以演示使用Nuodb的值和优点。我正在使用MacBook并从中安装了Docker 麦克斯的Docker.

笔记: 您可能需要配置Docker以允许您的用户帐户运行 Docker. 未要求的命令 苏达 pre-fix.

第2步:拉动Nuodb容器图像的副本

安装Docker后,将Nuodb CE容器图像拉到本地Docker Repo中。此命令需要几分钟才能完成。

 Docker.  pull nuodb/nuodb-ce:latest

第3步:创建Docker网络

 Docker.  network create nuodb-net 

第4步:启动管理服务

让我们通过启动几个诺福德管理员服务来获得Nuodb。管理服务(及其对等体)是Nuodb及其域管理层的单个固定点。当SM和TE进程开始时,他们需要知道他们开始的管理程序的名称。

从命令行中,运行以下命令:

 Docker运行  -d --name nuoadmin1 \
   --hostname nuoadmin1 \
   --network nuodb-net \
   --publish 8888:8888 \
   --volume nuoadmin-raft-1:/var/opt/nuodb \
   --env nuodb_domain_entrypoint.=nuoadmin1 \
   nuodb/nuodb-ce:latest nuoadmin

要创建一个容错管理员管理层,通过运行以下命令创建两个管理员服务:

 Docker运行  -d --name nuoadmin2 \
    --hostname nuoadmin2 \
    --network nuodb-net \
    --publish 8889:8888 \
    --volume nuoadmin-raft-2:/var/opt/nuodb \
    --env nuodb_domain_entrypoint.=nuoadmin1 \
    nuodb/nuodb-ce:latest nuoadmin

docker run -d --name nuoadmin3 \
    --hostname nuoadmin3 \
    --network nuodb-net \
    --publish 8890:8888 \
    --volume nuoadmin-raft-3:/var/opt/nuodb \
    --env nuodb_domain_entrypoint.=nuoadmin1 \
    nuodb/nuodb-ce:latest nuoadmin

笔记: 创建其他管理员服务时,--Publish参数中的第一个端口号为递增1.按示例您的第二个管理员服务将具有该值 8889:8888 。 此外, nuodb_domain_entrypoint. 变量必须仍然存在 nuoadmin1. !!此值表示其他管理员服务将对等待加入NOODB域的Leader管理服务。

以下示例,请继续创建第三个管理员服务。要确认NuodB管理服务,请成功创建并激活和连接,键入以粗体文本突出显示的命令。

$  Docker.  exec -it nuoadmin1 nuocmd show domain
server version: 4.0.4-2-019a14f800, server license: Community
server time: 2020-01-22T19:33:24.566, client token: bd4dafec9dff90867aa61c73a55b6b32d4013868
Servers:
  [Nuoadmin1] Nuoadmin1:48005(Leader,Leader = Nuoadmin1)活动:连接*
  [Nuoadmin2] Nuoadmin2:48005(追随者,Leader = Nuoadmin1)有效:连接
  [Nuoadmin3] Nuoadmin3:48005(追随者,Leader = Nuoadmin1)有效:连接
Databases:

第5步:启动数据库存储管理器(SM)

要启动Nuodb数据库,请通过运行以下命令启动Storage Manager(SM)进程。此命令将创建一个名为的数据库 测试 使用数据库登录凭据 DBA. 和密码 守门员 .

 Docker运行  -d --name test-sm-1 \
      --hostname test-sm-1 \
      --network nuodb-net \
      --volume test-arch-vol-1:/var/opt/nuodb \
      nuodb/nuodb-ce:latest nuodocker \
           --api-server nuoadmin1:8888 \
           start sm --db-name test \
                --server-id nuoadmin1 \
                --dba-user dba \
                --dba-password goalie

笔记: 我们使用使用持久存储卷创建了我们的管理员服务和SM流程 - 体积 关于我们的码头的论点 跑步 命令。我们强烈建议使用持久存储卷来确保如果删除或删除容器(出于任何原因),则下次替换容器启动它将找到已存在的存储卷并重用它 - 拾取它的位置最后的。在NOODB的情况下,新启动的管理员或Storage Manager容器将与其相同类型的已存在过程同步;如果可用,则在Nuodb积极地再次使用之前。

第6步:启动数据库事务引擎(TE)

通过运行以下命令启动事务引擎(TE)进程。使用 - 标签 参数是可选的。使用数据库进程标签允许Nuodb管理流程为客户端用户应用程序分配与所需标签名称匹配的TE。

 Docker运行  -d --name test-te-1 \
   --hostname test-te-1 \
   --network nuodb-net \
   nuodb/nuodb-ce:latest nuodocker \
       --api-server nuoadmin1:8888 \
       start te --db-name test \
                --server-id nuoadmin1 \
                --labels "te te1"

通过重新运行上面的命令替换突出显示,通过启动另一个te来缩减数据库 1 价值 2。在这个例子之后,继续创建第三个te。

要确认NuodB数据库已正确创建,请键入:

$  Docker.  exec -it nuoadmin1 nuocmd show domain
server version: 4.0.4-2-019a14f800, server license: Community
server time: 2020-01-22T19:43:05.116, client token: 131e645a39b2be1535f51d043db0aaa4d5435a47
Servers:
  [Nuoadmin1] Nuoadmin1:48005(Leader,Leader = Nuoadmin1)活动:连接*
  [Nuoadmin2] Nuoadmin2:48005(追随者,Leader = Nuoadmin1)有效:连接
  [Nuoadmin3] Nuoadmin3:48005(追随者,Leader = Nuoadmin1)有效:连接
Databases:
  test [RUNNING]
    [SM] Test-SM-1 / 192.168.0.5:48006(默认)[start_id = 0] [server_id = nuoadmin1] [pid = 42] [node_id = 1]监视:运行
    [te] test-te-3 / 192.168.0.8:48006(默认)[start_id = 1] [server_id = nuoadmin3] [pid = 42] [node_id = 4]监视:运行
    [TE] test-te-1/192.168.0.6:48006(默认)[start_id = 2] [server_id = nuoadmin1] [pid = 41] [node_id = 2] MONITORED:RUNNING
    [te] test-te-2 / 192.168.0.7:48006(默认)[start_id = 3] [server_id = nuoadmin2] [pid = 42] [node_id = 3]监视:运行

运行SQL.

现在您有一个运行的Nuodb数据库,让我们运行一些SQL语句!您可以通过安装Nuodb Sample“Hockey”数据库轻松实现此操作。

将终端窗口打开到NuoDmin1容器:

 Docker.  exec -it nuoadmin1 bash

您现在已连接到Nuodmin1容器。您的命令提示符将改为以下内容:

Bash-4.2 $

然后,运行以下命令:

     
nuosql [email protected] --schema hockey --user dba --password goalie </opt/nuodb/samples/quickstart/sql/create-db.sql >& /dev/null
nuosql [email protected] --schema hockey --user dba --password goalie </opt/nuodb/samples/quickstart/sql/Players.sql >& /dev/null
nuosql [email protected] --schema hockey --user dba --password goalie </opt/nuodb/samples/quickstart/sql/Teams.sql >& /dev/null
nuosql [email protected] --schema hockey --user dba --password goalie </opt/nuodb/samples/quickstart/sql/Scoring.sql >& /dev/null 

完毕。您现在有一个样本曲棍球播放器和团队数据库!您可以对曲棍球架构运行您想要的任何SQL。

这里有一些例子。首先,使用nuodb sql运行工具nuosql登录数据库。

SQL练习1。

 Bash-4.2 $   nuosql.  [email protected] --schema hockey --user dba --password goalie
SQL> use hockey;
SQL> show tables;

Tables in schema HOCKEY
        HOCKEY
        PLAYERS
        SCORING
        TEAMS
        VW_PLAYER_STATS is a view

SQL> select /* top 10 goal scorers in single season */
  firstname, lastname, birthyear, s.year "YEAR PLAYED", t.name "TEAM", s.goals
from scoring s, players p, teams t
where s.playerid = p.playerid
and   s.year     = t.year
and   s.teamid   = t.teamid
order by s.goals desc
limit 10;

FIRSTNAME  LASTNAME  BIRTHYEAR      YEAR         PLAYED TEAM     GOALS  

---------- --------- ---------- ------------ ------------------- ------ 
Wayne      Gretzky      1961        1981     Edmonton Oilers       92   
Wayne      Gretzky      1961        1983     Edmonton Oilers       87   
Brett      Hull         1964        1990     St. Louis Blues       86   
Mario      Lemieux      1965        1988     Pittsburgh Penguins   85   
Bobby      Hull         1939        1974     Winnipeg Jets         77   
Phil       Esposito     1942        1970     Boston Bruins         76   
Alexander  Mogilny      1969        1992     Buffalo Sabres        76   
Teemu      Selanne      1970        1992     Winnipeg Jets         76   
Real       Cloutier     1956        1978     Quebec Nordiques      75   
Wayne      Gretzky      1961        1984     Edmonton Oilers       73   

SQL> select /* top all-time cummulative goal scorers */
  firstname, lastname, birthyear,
  count(s.year) "YEARS PLAYED", round(avg(s.goals),2) "AVG GOALS/YR", sum(s.goals) "TOT GOALS"
from scoring s, players p, teams t
where s.playerid = p.playerid
and   s.year     = t.year
and   s.teamid   = t.teamid
group by firstname, lastname, birthyear
order by sum(s.goals) desc
limit 10;

FIRSTNAME  LASTNAME  BIRTHYEAR  YEARS PLAYED  AVG GOALS/YR  TOT GOALS
---------- --------- ---------- ------------- ------------- ----------
Gordie     Howe        1928          32           30.47        975
Wayne      Gretzky     1961          23           40.87        940
Bobby      Hull        1939          24           38.04        913
Brett      Hull        1964          21           35.29        741
Mike       Gartner     1959          23           31.96        735
Marcel     Dionne      1951          19           38.47        731
Phil       Esposito    1942          19           37.74        717
Mark       Messier     1961          27           25.74        695
Steve      Yzerman     1965          22           31.45        692
Mario      Lemieux     1965          17           40.59        690

SQL>

SQL练习2。

Nuodb支持ANSI标准SQL,另外,在其他供应商的SQL RDBMS产品中发现的许多字符串,日期和算术函数。玩得开心,尝试一些自己的SQL。

以下是上面使用ANSI SQL 92语法重写的第一个SQL语句的示例。运行此SQL语句以确认SQL结果与第一个SQL语句完全相同。

SQL> select /* top goal scorers in single season */
  firstname, lastname, birthyear, s.year "YEAR PLAYED", t.name "TEAM", s.goals
from scoring s
join players using (playerid)
join teams t using (year,teamid)
order by s.goals desc

Limit 10;

SQL练习3。

使用时连接到数据库时 nuosql. 命令,默认情况下,通过默认的循环负载均衡器进行连接以获取事务引擎(TE)。以下是,如果您想根据标签值连接到特定TE,您如何覆盖。回想一下,当我们创建我们的TES时,我们为他们分配了每个特定的标签!

尝试此命令:

 Bash-4.2 $   nuosql.  [email protected] --user dba --password goalie --connection-property "LBQuery=round_robin(first(label(te te1) any))"

SQL> select nodeid, clientinfo, created from system.connections;

NODEID   CLIENTINFO           CREATED           

------- ----------- --------------------------

   2      nuosql   2018-12-07 18:37:02.671364

SQL>

通知 nuosql. 命令指定首先连接到标记为TE1的TE,如果它找不到一个,则只需连接到“任何”TE。

SELECT查询显示NUOSQL会话连接到NodeID 2.如果您运行 Nuocmd显示领域 命令,您将在下面演示的数据库进程的NOODB域中看到(在此示例中)TE1在数据库进程的域中,请参阅蓝色亮点。

Bash-4.2 $ Nuocmd显示领域
服务器版本:3.3-1-14DF3B390,服务器许可证:社区
服务器时间:2018-12-07T19:06:58.749,客户端令牌:7B51AF9937F32EFBDBC1E800E04251276751ACD5
服务器:
  [Nuoadmin1] Nuoadmin1:48005(Leader,Leader = Nuoadmin1)活动:连接*
  [Nuoadmin2] Nuoadmin2:48005(追随者,Leader = Nuoadmin1)有效:连接
  [Nuoadmin3] Nuoadmin3:48005(追随者,Leader = Nuoadmin1)有效:连接
数据库:
  test [RUNNING]
    [SM] Test-SM-1 / 192.168.0.5:48006(默认)[start_id = 0] [server_id = nuoadmin1] [pid = 42] [node_id = 1]监视:运行
    [te] test-te-3 / 192.168.0.8:48006(默认)[start_id = 1] [server_id = nuoadmin3] [pid = 42] [node_id = 4]监视:运行
    [TE] TEST-TE-1 /192.168.0.6:48006(默认)[start_id = 2] [server_id = nuoadmin1] [pid = 41] [node_id = 2] MONITORED:RUNNING
    [te] test-te-2 / 192.168.0.7:48006(默认)[start_id = 3] [server_id = nuoadmin2] [pid = 42] [node_id = 3]监视:运行

你可以自己尝试使用相同的 nuosql. 命令,而是直接连接到te TEST-TE-2 或者 TEST-TE-3 使用正确的标签规范 te2 or te3.

完成后,键入 出口 退出 nuoadmin1. container.

 Bash-4.2 $  exit

如何关闭并重新启动nuodb

要关闭并重新启动数据库,请刚发出Nuodb Shutdown Database命令,删除数据库SM和TE容器,并重新创建它们。此命令将删除数据库容器。

 Docker.  exec -it nuoadmin1 nuocmd shutdown database --db-name test
docker rm -f test-sm-1 test-te-1 test-te-2 test-te-3

要证明数据库已关闭,现在处于非运行状态,运行:

 Docker.  exec -it nuoadmin1 nuocmd show domain 

要再次启动数据库,请重新运行前面列出的相同Docker运行命令以创建新的SM容器和三个新TE容器。当新的SM进程开始时,它将发现已存在的存储卷 Test-Arch-Vol-1 并安装它。因此,您的数据库将从最后离开的位置开始。要演示此问题,请登录Nuodb SQL工具 nuosql. 正如你之前的那样。您会注意到您的样本 曲棍球 架构及其数据仍将存在。

清理 - 删除数据库

使用容器时,清理很容易。您可以通过删除Nuodb容器,存储卷和Docker网络来简单地删除数据库, NOODB-NET. .

 Docker.  rm -f nuoadmin1 nuoadmin2 nuoadmin3
docker rm -f test-sm-1 test-te-1 test-te-2 test-te-3
docker volume rm -f nuoadmin-raft-1 nuoadmin-raft-2 nuoadmin-raft-3
docker volume rm -f test-arch-vol-1
docker network rm nuodb-net

下一步

从这个系列开始准备更多?查看Docker博客中的诺福布的其余部分:

从2019年1月7日的原始出版日期更新