如何在Ubuntu16.04上的三节点集群上部署CockroachDB
CockroachDB的一篇文章
介绍
CockroachDB 是一个开源的分布式 SQL 数据库,它提供了一致性、可扩展性和可生存性。
设置 CockroachDB 很简单:您将它安装在多个服务器上,每个服务器称为 节点 ,然后将它们连接在一起,就好像它们是一个单独的实体一样,称为 集群 。 然后,集群中的所有节点都会对称运行并可以访问相同的数据。
通过这种设计,随着数据存储需求的增长,您可以通过创建新节点并将它们加入现有集群来轻松增加系统容量。 有关更多详细信息,您可以阅读 CockroachDB 的可扩展性模型 。
注意:在撰写本文时,CockroachDB 目前处于 beta,因此我们建议您使用本指南作为熟悉该技术的机会,而不是作为一个部署指南的关键任务软件。
本指南不保护对集群管理 UI 的访问; 如果知道正确的 URL,任何人都可以访问它。 如果您打算将其留在生产中,请考虑使用 防火墙规则 控制对端口 8080
的访问。
目标
在本指南中,您将通过跨多个服务器部署 CockroachDB 创建一个分布式容错数据库,一个 分布式多节点集群 。 您将首先在多台服务器上安装 CockroachDB,将它们作为节点启动,然后让它们作为一个集群一起工作。
此外,我们将演示数据分布以及集群如何在故障中幸存下来,并向您展示如何将您的应用程序连接到 CockroachDB。
本指南介绍了在没有 SSL 加密的情况下设置不安全的部署,我们不建议将其用于生产。 但是,CockroachDB 也为 DigitalOcean 提供 安全部署说明。 (尽管链接的第一段说的是,文章的 Secure 版本被选中。)
先决条件
在开始之前,您需要以下内容:
- 3 台 Ubuntu 16.04 服务器,至少 2GB RAM 启用私有网络 。 他们都应该在同一个地区。 在本指南中,我们将使用以下主机名:
- 在每台服务器上,添加一个具有sudo权限的非root用户
- 确保以下端口允许 TCP 流量。 如果您 已将 UFW 设置为防火墙 ,则需要在每台服务器上允许这两个端口:
- 可选:在每台服务器上,安装和配置NTP。 (对于简短的测试,这不是硬性要求)
记下所有服务器的公共和私有 IP 地址。 在本指南中,我们将为三台服务器中的每台使用替代主机名和 IP 地址,例如 cockroach-01、cockroach_01_public_ip
和 cockroach_01_public_ip
。 要查找您的私有 IP,请从 DigitalOcean 控制面板单击服务器。 私有 IP 列在信息的第一行。
第 1 步 — 安装 CockroachDB
集群中的每个节点都需要有一份 cockroach
二进制文件(即程序)的副本。 我们将在您的第一台服务器 cockroach-01 上安装 CockroachDB,然后在其他服务器上执行相同操作。
要开始使用,请使用 SSH 登录到 cockroach-01。
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-02 和 cockroach-03。
现在 CockroachDB 在您的所有机器上都可用,您可以设置集群。
第 2 步 — 启动您的第一个节点
您的第一个 CockroachDB 节点将启动您的集群。 第一个节点没有什么特别之处。 只是你必须从一个开始,然后让其他人加入。 我们将在本节中使用 cockroach-01。
记下 cockroach-01 的私有 IP 地址。 在 DigitalOcean 控制面板中,单击此主机。 私有 IP 列在信息的第一行。
应在 cockroach-01 上执行以下启动集群的命令。 此命令启动没有 SSL 加密的节点 (--insecure
),返回对命令提示符的控制 (--background
),并设置该节点以使用其内部 IP 地址与其他节点通信 ([X199X ])。 将下面突出显示的变量 cockroach_01_private_ip
替换为实际的私有 IP 地址:
cockroach start --insecure --background --advertise-host=cockroach_01_private_ip
注意:当你启动你的节点时,你可以使用一些标志来改变它的行为,比如改变数据存储在的目录。 这些标志记录在 cockroach start 中。
现在您的节点(和集群)已上线,您可以通过转到其管理 UI 仪表板(与 CockroachDB 捆绑在一起的工具来显示有关集群的信息)来查看其详细信息。 转到 http://cockroach_01_public_ip:8080
。 这次是公网IP。
在这里,您会看到有一个节点正在运行。
您会注意到 NODE 磁贴中的警告感叹号 (!)。 如果将鼠标悬停在警告上,则表明您的集群有 Low Replication,这意味着您没有足够的节点。 这是可以理解的,因为我们现在只有一个节点。 使用一个节点,您的数据无法抗故障,因为它没有充分复制到其他来源。 如果节点出现故障,您的数据将丢失。
我们将在下一步中通过将您的其他两台服务器作为节点添加到此集群来解决此问题。 通过拥有三个节点,CockroachDB 可确保您的数据至少有三个副本,因此有可能丢失一个节点而不会造成无法挽回的数据丢失。
第 3 步 - 将节点 2 和 3 添加到集群
在您的 cockroach-02 服务器上,使用 cockroach start
命令启动 CockroachDB 节点,就像在步骤 2 中所做的那样。 在这里,我们更新命令以指定您希望它通过其私有 IP 地址加入第一台服务器的集群。 您将需要 cockroach-02 和 cockroach-01 的私有 IP 地址来替换下面突出显示的变量 cockroach_02_private_ip
和 cockroach_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 个节点。
现在您的所有节点都通过集群连接,它们都可以访问相同的数据。
(可选)第 4 步 - 演示数据分发
每当您将数据写入一个节点时,集群中的所有其他节点都可以访问它。 演示这一点的最简单方法是使用 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
数据库。
您还可以从任何节点上的 Admin UI 的 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 行。 按 CTRL+C
退出 SQL 客户端。
现在,我们将从集群中删除该节点,并查看所有数据仍可从其他节点获得。
从您使用的同一节点(cockroach-02),停止蟑螂进程:
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
连接到 localhost
上的数据库 bank
:
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 的文档 的一般链接。