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

介绍

CockroachDB是一个开源的分布式SQL数据库,提供一致性、可伸缩性和生存性。

设置CockroachDB非常简单:将它安装在多个服务器上,每个服务器称为一个节点,并将它们连接在一起,像单独的实体一样,称为集群。然后,群集中的所有节点都是对称的,并且可以访问相同的数据。

通过这种设计,随着数据存储需求的增长,您可以通过创建新节点并将其连接到现有群集来轻松提高系统容量。

注意:在撰写本文时,CockroachDB目前处于测试阶段,因此我们建议您使用本教程作为熟悉该技术的机会,而不是作为任务关键型软件的部署教程。

本教程不保护对群集管理UI的访问权限; 如果知道正确的URL,任何人都可以访问它。

目标

在本教程中,您将通过跨多个服务器(分布式多节点群集)部署CockroachDB来创建分布式容错数据库。您将首先在多个服务器上安装CockroachDB,将它们作为节点启动,然后将它们作为一个集群一起工作。

此外,我们将演示数据分布以及群集如何在失败时幸存下来,并向您展示如何将您的应用程序连接到CockroachDB。

本教程介绍如何在不使用SSL加密的情况下设置不安全的部署,我们不建议将其用于生产。我建议您直接使用腾讯云分布式数据库,分布式数据库(Tencent Distributed MySQL,TDSQL) 是支持自动水平拆分的高性能数据库服务—即业务感受完整的逻辑表,而数据却均匀的拆分到多个物理分片中,可以有效解决超大并发、超高性能、超大容量的 OLTP 类场景;TDSQL 的每个分片默认采用主从高可用架构,提供弹性扩展、备份、恢复、监控等全套解决方案,为您有效解决业务快速发展时的数据库性能瓶颈,让您能更加专注于业务发展。想要了解更多分布式数据库信息可以通过访问腾讯云分布式数据库TDSQL开发指南学习。

准备

在开始之前,您需要以下准备工作:

  • 3个Ubuntu 16.04服务器,至少2GB的RAM ,并启用了专用网络。他们都应该在同一个地区。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 在本教程中,我们将使用以下主机名:
    • cockroach-01
    • cockroach-02
    • cockroach-03
  • 在每台服务器上,添加具有sudo权限的非root用户。
  • 确保以下端口允许TCP通信。如果您已将UFW设置为防火墙,则需要在每台服务器上允许这两个端口 :
    • 26257 用于节点间和应用程序通信: sudo ufw allow 26257/tcp
    • 8080 对于Admin UI: sudo ufw allow 8080/tcp
  • 可选:在每台服务器上,安装并配置NTP。(对于简短的测试,这不是一个确定的要求)

记下所有服务器的公共和私有IP地址。在本教程中,我们将使用代替的主机名和IP地址,比如cockroach-01cockroach_01_public_ip以及cockroach_01_public_ip

第一步 - 安装CockroachDB

群集中的每个节点都需要具有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-02cockroach-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可确保至少有三个数据副本,因此就算丢失节点的话也不会无可挽回地丢失数据。

第三步 - 向群集添加节点2和3

在你的cockroach-02服务器上,使用与cockroach start在步骤2中所做的命令一起启动CockroachDB节点。这里我们更新命令以指定您希望它通过其专用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

现在,当您从任何节点访问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 sqlCLI):

> DROP TABLE quotes;
​
> DROP TABLE episodes;
​
> DROP DATABASE startrek;

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

启动并运行群集后,可以将其用作应用程序的数据库。这需要以下两个部分:

  • 与您的应用程序一起使用的驱动程序(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文档的链接。


参考文献:《How To Deploy CockroachDB on a Three-Node Cluster on Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏坚毅的PHP

my linux FAQ

用命令查询系统是32位还是64位 getconf LONG_BIT or getconf WORD_BIT 例如: [root@sy02 /]# getconf...

3313
来自专栏陈满iOS

iOS下载报错:App Transport Security has blocked a cleartext HTTP

以上方法虽然解决了HTTP不能正常使用的问题,但是苹果提供的安全保障也被关闭了,对于不支持HTTPS协议的网站,可以考虑白名单:

3664
来自专栏Laoqi's Linux运维专列

KVM虚拟主机管理篇

5053
来自专栏Java编程技术

MySQL 中基于 XA 实现的分布式事务

Xa主要规定了RM与TM之间的交互,下面来看下XA规范中定义的RM 和 TM交互的接口:

1063
来自专栏张善友的专栏

Mongo Database 性能优化

SQL Server有工具进行数据库的优化,Mongo Database Profiler.不仅有,而且功能更强大。 MongoDB 自带 Profiler,可...

32910
来自专栏乐沙弥的世界

使用mysqlbinlog提取二进制日志

    MySQL binlog日志记录了MySQL数据库从启用日志以来所有对当前数据库的变更。binlog日志属于二进制文件,我们可以从binlog提取出来生...

1612
来自专栏FreeBuf

代码审计 | HDWiki v6.0最新版referer注入漏洞

近期在审计HDWiki 6.0最新版cms的时候发现由referer导致的sql注入问题。SQL注入我们知道是由于代码与数据没有严格区别限制分离而导致的问题,O...

1552
来自专栏小二的折腾日记

面试总结-链接

https://blog.csdn.net/CCUTwangning/article/details/70153589 天下无难试之Redis面试题刁难大全 h...

671
来自专栏乐沙弥的世界

system sys,sysoper sysdba 的区别

Oracle 中sys,system帐户以及登陆时的normal,sysoper,sysdba是经常容易混淆的几个概念,下面详细讲述了

713
来自专栏不止思考

架构师带你玩转分布式锁

当某个资源在多系统之间,具有共享性的时候,为了保证大家访问这个资源数据是一致的,那么就必须要求在同一时刻只能被一个客户端处理,不能并发的执行,否者就会出现同一时...

841

扫码关注云+社区