如何在Ubuntu 16.04三个节点群集上部署CockroachDB

在本指南中,您将通过在多个服务器(一个*分布式多节点集群*)上部署CockroachDB来创建一个分布式容错数据库。您将首先在多个服务器上安装CockroachDB,将它们作为节点启动,然后将它们作为一个集群一起工作。 此外,我们将演示数据分布以及集群如何保持故障,并向您展示如何将应用程序连接到CockroachDB。

介绍

CockroachDB是一个开源的、分布式SQL数据库,提供一致性,可扩展性和生存性。 设置CockroachDB很简单:你在多台服务器,每台服务器称为一个节点安装它,并加入他们的行列,共同采取行动,好像他们是一个单一的实体,被称为集群 。然后,集群中的所有节点都对称地运行,并且可以访问相同的数据。 通过这种设计,随着数据存储需求的增长,可以通过创建新节点并将其加入现有集群来轻松增加系统容量。对于更详细的,你可以在阅读了CockroachDB的可扩展性模型 :在写作的时候,CockroachDB目前处于测试阶段 ,因此,我们建议使用本指南为契机随着技术的发展,而不是熟悉作为一块关键任务软件部署指南。 如果您知道正确的URL,本指南不会安全访问集群的信息仪表板。

目标

在本指南中,您将通过在多个服务器上部署CockroachDB创建一个分布式和容错数据库, 分布式多节点集群 。您将首先在多个服务器上安装CockroachDB,将它们作为节点启动,然后将它们作为一个集群一起工作。 此外,我们将演示数据分布以及集群如何保持故障,并向您展示如何将应用程序连接到CockroachDB。 本指南涵盖设置不使用SSL加密的不安全部署,我们不建议您进行生产。然而,CockroachDB还提供了DigitalOcean安全部署的说明 。 (尽管什么在链路第一段称,制品的安全版本被选择。)

先决条件

开始之前,您需要具备以下条件:
  • 3个Ubuntu 16.04服务器的RAM至少2GB 与专用网络启用 。 他们都应该在同一地区。 在本指南中,我们将使用以下主机名:
    • cockroach-01
    • cockroach-02
    • cockroach-03
  • 在每个服务器上, 添加使用sudo特权的非root用户
  • 确保在以下端口上允许TCP流量。如果你已经设置了UFW作为防火墙 ,你需要让每台服务器上这两个端口:
    • 26257为节点间和应用程序通信: sudo ufw allow 26257/tcp
    • 8080为管理用户界面: sudo ufw allow 8080/tcp
  • 可选:在每个服务器上安装和配置NTP 。 (对于简短的测试,这不是一个坚定的要求)
记下所有服务器的公共和专用IP地址。在本指南中,我们将使用替身的主机名和IP地址就像cockroach-01, cockroach_01_public_ipcockroach_01_public_ip为三个服务器。 要找到您的私人IP,请从DigitalOcean控制面板中单击服务器。 私有IP列出的信息上面一行。

第1步 - 安装CockroachDB

集群中的每个节点都需要有副本cockroach二进制文件(即程序)。 我们会将您的第一台服务器, cockroach-01上安装CockroachDB,然后做同样的其他服务器上。 要开始使用,请登录cockroach-01使用SSH。
ssh sammy@cockroach_01_public_ip
接下来,从你的sudo用户的主目录,下载并安装最新的cockroach二进制文件:
wget https://binaries.cockroachdb.com/cockroach-latest.linux-amd64.tgz?s=do
提取二进制:
tar -xf cockroach-latest.linux-amd64.tgz?s=do --strip=1 cockroach-latest.linux-amd64/cockroach
移动二进制文件,以便从命令行轻松访问:
sudo mv cockroach /usr/local/bin
确保二进制文件可以通过检查其版本:
cockroach version
如果你的系统无法找到cockroach命令,请再次查看本节,以确保您下载并解压缩程序。 最后,对于计划用作节点的其他两台服务器重复这些命令。在我们的例子,这就是cockroach-02cockroach-03。 现在CockroachDB在所有的机器上都可用,你可以设置你的集群。

第2步 - 启动您的第一个节点

您的第一个CockroachDB节点将启动您的群集。这个第一个节点没有什么特别的;它只是你必须从一个开始,然后让别人加入它。我们将使用cockroach-01本节。 记下你的私有IP地址为cockroach-01。 从DigitalOcean控制面板,单击此主机。 私有IP列出的信息上面一行。 下面的命令来启动群集应cockroach-01执行。 该命令没有启动SSL加密(节点--insecure ),返回命令提示符(控制--background ),并将该节点与使用它的内部IP地址(其他节点通信--advertise-host )。 替换下面的高亮显示的变量, cockroach_01_private_ip ,与实际的私有IP地址:
cockroach start --insecure --background --advertise-host=cockroach_01_private_ip
注意:当您启动节点,你可以使用一些标志来改变它的行为,如更改目录数据存储在这些标志中都记录在案。 cockroach start 现在您的节点(和集群)已经上线,您可以通过转到其管理界面仪表板(与CockroachDB捆绑在一起的工具来显示您的集群信息)查看其详细信息。转到http:// cockroach_01_public_ip :8080 。这次是公共IP地址。 在这里你会看到你有一个节点运行。 CockroachDB管理UI显示一个集群运行1个节点 你会注意到一个警告感叹号(!)在节点瓷砖。 如果鼠标移到警告,则表明你的群集具有低复制 ,这意味着你没有足够的节点。这是可行的,因为我们现在只有一个节点。使用一个节点,您的数据不会失效,因为它没有充分复制到其他来源。如果节点关闭,您的数据将丢失。 我们将在下一步中通过将其他两个服务器作为节点添加到此群集来解决此问题。通过拥有三个节点,CockroachDB确保您的数据至少有三个副本,因此可能丢失一个节点,而不会不可恢复地丢失数据。

第3步 - 将节点2和节点3添加到您的群集

在您的cockroach-02服务器,开始与该CockroachDB节点cockroach start就像你在第2步中那样在这里,我们更新命令指定您希望它通过其私有IP地址加入到第一台服务器的集群命令。 您将需要分别为cockroach-02cockroach-01的私有IP地址替换以下突出显示的变量, cockroach_02_private_ipcockroach_01_private_ip
cockroach start --insecure --background \
--advertise-host=cockroach_02_private_ip \
--join=cockroach_01_private_ip:26257
你的第三个机器cockroach-03上重复此命令,其私有IP地址。它也加入第一个节点。
cockroach start --insecure --background \
--advertise-host=cockroach_03_private_ip \
--join=cockroach_01_private_ip:26257
现在,当您从任何节点访问管理UI时,您将看到集群有3个节点。
  • http:// cockroach_03_public_ip :8080
CockroachDB管理UI显示一个集群运行3个节点 现在所有的节点都通过集群连接,他们都可以访问相同的数据。

(可选)第4步 - 演示数据Distrubtion

每当将数据写入一个节点时,集群中的所有其他节点都可以访问它。证明这一点的最简单的方法是使用CockroachDB的样本数据,然后从查看它内置的SQL客户端 。 从你的第一个节点, cockroach-01,生成示例数据:
cockroach gen example-data | cockroach sql
这将创建一个名为样本数据库startrek 。 您现在可以启动SQL客户端并查看集群中的哪些数据库:
cockroach sql
SHOW DATABASES;
你会看到startrek上市的数据库,其中包含我们的例子中的数据。
+--------------------+
|      Database      |
+--------------------+
| information_schema |
| pg_catalog         |
| startrek           |
| system             |
+--------------------+
注:CockroachDB支持它自己的SQL方言 ,提供SQL标准的扩展名不同比其他一些数据库提供的。 现在,移动到第二个节点的终端, cockroach-02,并运行相同的命令:
cockroach sql
SHOW DATABASES;
你会看到,即使你产生另一个节点上的数据。例如,它已经分布和startrek数据库是从所有其他服务器的访问。 您还可以查看数据库的任何节点上管理用户界面的侧边栏DATABASES存在; 例如,在http:// cockroach_01_public_ip :8080/#/databases/

(可选)第5步 - 从群集中删除节点

除了将数据分发到集群中的所有节点之外,CockroachDB还在服务器中断的情况下保证数据的可用性和完整性。 对于CockroachDB的容忍节点故障的公式为(n - 1)/ 2,其中n是群集节点的数量。因此,在这个三个节点的示例中,我们可以容忍丢失一个节点而不丢失任何数据。 为了演示这一点,我们将从集群中删除一个节点,并显示所有集群的数据仍然可用。然后,我们将重新加入节点到群集,并看到它接收离线时发生的所有更新。 从你的第二个节点, cockroach-02,启动SQL客户端,如果你是不是还在呢:
cockroach sql
算中的行的数目quotes的示例数据库的表中:
SELECT COUNT(*) FROM startrek.quotes;
您会看到该表有200行。按退出SQL客户端CTRL+C 。 现在,我们将从集群中删除此节点,并查看所有数据仍然可从其他节点获取。 从您正在使用( cockroach-02)同一个节点,停止cockroach过程:
cockroach quit
现在切换到其他节点之一的终端( cockroach-03为例)并启动SQL客户端:
cockroach sql
运行相同的命令前计数的行数quotes表:
SELECT COUNT(*) FROM startrek.quotes;
尽管丢失了集群中的一个节点,您会看到仍有200行数据!这意味着CockroachDB已成功地容忍系统故障,并保持数据的完整性。

(可选)第6步 - 将节点重新加入群集

我们还可以证明CockroachDB正常处理服务器恢复在线。首先,我们将删除一些数据,然后将我们删除的节点重新加入集群。一旦它重新加入,我们将能够看到CockroachDB自动从复活的节点删除相同的数据。 从当前正在运行的节点之一,说cockroach-03,删除所有的报价,其中的episode大于50。
DELETE FROM startrek.quotes WHERE episode > 50;
SELECT COUNT(*) FROM startrek.quotes;
您将看到现在有133行数据。 现在,回到我们从集群( cockroach-02)删除的节点的终端,并将它重新加入群集:
cockroach start --insecure --background \
--advertise-host=cockroach_02_private_ip \
--join=cockroach_01_private_ip:26257
启动内置的SQL客户端:
cockroach sql
现在,算上行数quotes表包含:
SELECT COUNT(*) FROM startrek.quotes;
它应该是133。 因此,尽管在更新发生时脱机,节点在重新加入群集后立即更新。 如果你愿意,你现在可以卸下示例数据(仍在使用的cockroach sql CLI):
DROP TABLE quotes;
DROP TABLE episodes;
DROP DATABASE startrek;

(可选)第7步 - 连接应用程序

在群集启动并运行后,您可以将其用作应用程序的数据库。这需要两个部分:
  • 一个驱动程序用于您的应用程序(CockroachDB使用PostgreSQL驱动程序)
  • 适当的连接字符串
本指南显示了一个通用示例;您需要提供您自己的应用程序的详细信息。 选择并安装相应的驱动程序从兼容的PostgreSQL客户端驱动程序列表中的应用程序。 注:虽然CockroachDB支持PostgreSQL的有线协议,它的SQL语法不同,不是一个简易替换PostgreSQL的。 然后,在任何需要应用程序连接到数据库的点使用适当的连接字符串。 连接字符串应该连接到端口26257 ,并且可以使用任何节点的IP地址。 这意味着你的防火墙还必须允许端口的连接26257 (正如我们在先决条件设置)。 例如,下面的用户连接一个PHP / PDO连接字符串sammy到数据库banklocalhost
PDO('pgsql:host=localhost;port=26257;dbname=bank;sslmode=disable',
    'sammy', null, array(
      PDO::ATTR_ERRMODE          => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_EMULATE_PREPARES => true,
  ));
对于使用PostgreSQL客户端驱动程序的更多帮助,CockroachDB有许多可用的代码示例

结论

此时,您创建了一个三节点群集,看到了CockroachDB的分布式和可存活功能,并了解了如何将群集连接到应用程序。 由于CockroachDB是快速移动的项目,你会偶尔会看到你的仪表盘上显示有CockroachDB可用较新版本的消息使用更新按钮来查看链接到更新的二进制文件,这在写作的时候,你将有手动下载和安装。 如果你想通过增加更多的节点横向扩展部署,按照上述第二和第三个节点的步骤第四个节点等,所有你需要做的是安装cockroach二进制文件,并有新的网络节点加入您的现有集群。 如果检查出来后,你想在生产中运行CockroachDB,请仔细阅读其推荐的产品设置 。 最后,这里是一个一般的链接CockroachDB的文档