CockroachDB是一个开源的分布式SQL数据库,提供一致性、可伸缩性和生存性。
设置CockroachDB非常简单:将它安装在多个服务器上,每个服务器称为一个节点,并将它们连接在一起,像单独的实体一样,称为集群。然后,群集中的所有节点都是对称的,并且可以访问相同的数据。
通过这种设计,随着数据存储需求的增长,您可以通过创建新节点并将其连接到现有群集来轻松提高系统容量。
注意:在撰写本文时,CockroachDB目前处于测试阶段,因此我们建议您使用本教程作为熟悉该技术的机会,而不是作为任务关键型软件的部署教程。
本教程不保护对群集管理UI的访问权限; 如果知道正确的URL,任何人都可以访问它。
在本教程中,您将通过跨多个服务器(分布式多节点群集)部署CockroachDB来创建分布式容错数据库。您将首先在多个服务器上安装CockroachDB,将它们作为节点启动,然后将它们作为一个集群一起工作。
此外,我们将演示数据分布以及群集如何在失败时幸存下来,并向您展示如何将您的应用程序连接到CockroachDB。
本教程介绍如何在不使用SSL加密的情况下设置不安全的部署,我们不建议将其用于生产。我建议您直接使用腾讯云分布式数据库,分布式数据库(Tencent Distributed MySQL,TDSQL) 是支持自动水平拆分的高性能数据库服务—即业务感受完整的逻辑表,而数据却均匀的拆分到多个物理分片中,可以有效解决超大并发、超高性能、超大容量的 OLTP 类场景;TDSQL 的每个分片默认采用主从高可用架构,提供弹性扩展、备份、恢复、监控等全套解决方案,为您有效解决业务快速发展时的数据库性能瓶颈,让您能更加专注于业务发展。想要了解更多分布式数据库信息可以通过访问腾讯云分布式数据库TDSQL开发指南学习。
在开始之前,您需要以下准备工作:
26257
用于节点间和应用程序通信: sudo ufw allow 26257/tcp
8080
对于Admin UI: sudo ufw allow 8080/tcp
记下所有服务器的公共和私有IP地址。在本教程中,我们将使用代替的主机名和IP地址,比如cockroach-01、cockroach_01_public_ip
以及cockroach_01_public_ip
。
群集中的每个节点都需要具有cockroach
二进制文件的副本(即程序)。我们将在您的第一台服务器上安装CockroachDB,cockroach-01,然后在其他服务器上执行相同操作。
要开始使用,请使用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,您可以设置群集了。
您的第一个CockroachDB节点将启动您的群集。这第一个节点没什么特别之处; 只是你必须从第一个开始,然后让其他的加入它。我们将在本节中使用cockroach-01。
记下你的cockroach-01的私人IP地址。该专用IP位于列出的信息上排。
应该在cockroach-01上执行以下命令来启动集群。此命令启动没有SSL encryption(--insecure
)的节点,返回命令提示符(--background
)的控制权,并将此节点设置为使用其内部IP地址(--advertise-host
)与其他节点通信。将以下突出显示的变量替换为cockroach_01_private_ip
实际的私有IP地址:
$ cockroach start --insecure --background --advertise-host=cockroach_01_private_ip
注意:启动节点时,可以使用许多标志来更改其行为,例如更改存储的目录数据。这些标志记录在cockroach start。
现在您的节点(和群集)处于活动状态,您可以通过转到其管理UI仪表板(与CockroachDB捆绑在一起的工具向您显示有关群集的信息)来查看其详细信息。转到公共IP地址http://cockroach_01_public_ip:8080
。
在这里,您将看到有一个节点正在运行。
你会注意到NODE中有一个警告感叹号(!)。如果将鼠标悬停在警告上,则表示您的群集具有低复制性,这意味着您没有足够的节点。这是正常的,因为我们现在只有一个节点。使用一个节点,您的数据不会出现故障,因为它没有充分复制到其他来源。如果节点发生故障,您的数据将丢失。
我们将在下一步中通过将其他两个服务器作为节点添加到此群集来解决此问题。通过拥有三个节点,CockroachDB可确保至少有三个数据副本,因此就算丢失节点的话也不会无可挽回地丢失数据。
在你的cockroach-02服务器上,使用与cockroach start
在步骤2中所做的命令一起启动CockroachDB节点。这里我们更新命令以指定您希望它通过其专用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
现在,当您从任何节点访问Admin UI时,您将看到该集群有3个节点。
· http://cockroach_03_public_ip:8080
现在所有节点都通过集群连接,它们都可以访问相同的数据。
无论何时将数据写入一个节点,群集中的所有其他节点都可以访问它。最简单的方法是使用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/
。
除了将数据分发到群集中的所有节点之外,CockroachDB还可以在服务器中断时保证数据的可用性和完整性。
CockroachDB对节点故障的容忍度公式为(n - 1)/ 2,其中n是集群中的节点数。因此,在这个三个节点的示例中,我们可以容忍丢失一个节点而不会丢失任何数据。
为了证明这一点,我们将从群集中删除一个节点,并显示所有群集的数据仍然可用。然后,我们将重新加入节点到群集,并看到它收到脱机时发生的所有更新。
从你的第二个节点cockroach-02启动SQL客户端:
$ cockroach sql
计算示例数据库的quotes
表中的行数:
> SELECT COUNT(*) FROM startrek.quotes;
你会看到该表有200行。按下CTRL+C
退出SQL客户端。
现在,我们将从群集中删除此节点,并看到所有数据仍可从其他节点获得。
从您使用的同一节点(cockroach-02),停止cockroach进程:
$ cockroach quit
现在切换到其他节点的终端(例如cockroach-03)并启动SQL客户端:
$ cockroach sql
运行与以前相同的命令来计算quotes
表中的行数:
> SELECT COUNT(*) FROM startrek.quotes;
尽管丢失了集群中的一个节点,但您会看到仍然有200行数据!这意味着CockroachDB已成功接纳系统故障并保持数据的完整性。
我们还可以证明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;
启动并运行群集后,可以将其用作应用程序的数据库。这需要以下两个部分:
本教程显示了一个通用示例; 您需要为自己的应用程序提供详细信息。
从适用于您的应用程序的兼容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文档的链接。
参考文献:《How To Deploy CockroachDB on a Three-Node Cluster on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。