本教程适用于以下操作系统版本

  • Ubuntu 24.04(Noble Numbat)
  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 20.04(Focal Fossa)
  • Ubuntu 18.04(Bionic Beaver)

本页内容

  • 先决条件
  • 更新系统
  • 设置时间同步
  • 在所有节点上安装 CockroachDB
  • 创建证书 创建 CA 证书 创建客户端证书 创建服务器证书
  • 启动 CockroachDB 集群
  • 将剩余节点加入集群
  • 访问 CockroachDB 仪表盘
  • 验证集群中的数据库复制
  • 结论
  • 创建 CA 证书
  • 创建客户端证书
  • 创建服务器证书

CockroachDB 是一个免费、云原生的分布式 SQL 数据库,用于构建和管理现代化的、可扩展的云服务。它可帮助您在软件和硬件发生故障时仍可正常运行。它在多个位置存储数据副本,以提供快速的访问速度。它构建于事务性、强一致性的键值存储之上,能够在磁盘、机器和数据中心发生故障时以近乎零延迟中断且无人工干预的方式继续提供服务。

本教程将讲解如何在 Ubuntu 22.04 服务器上搭建一个三节点的 CockroachDB 集群。

先决条件

  • 三台运行 Ubuntu 22.04 的服务器。
  • 每台服务器均已配置 root 密码。

在本教程中,我们将使用以下环境配置:

主机名 IP 地址

node1 192.168.10.10

node2 192.168.10.11

node3 192.168.10.12

更新系统

在开始之前,强烈建议将所有节点更新并升级到最新版本。您可以逐个节点运行以下命令进行更新:

apt update -y
apt upgrade -y

所有节点更新完成后,重启它们以使更改生效。

设置时间同步

在开始之前,您需要在所有节点之间设置时间同步。您可以使用 chrony 来实现。

首先,使用以下命令安装 chrony:

apt install chrony -y

安装完成后,使用以下命令编辑 chrony 配置文件:

nano /etc/chrony/chrony.conf

找到默认的 pool,并将其替换为以下行:

pool 0.id.pool.ntp.org iburst maxsources 4
pool 1.id.pool.ntp.org iburst maxsources 1
pool 2.id.pool.ntp.org iburst maxsources 1
pool 3.id.pool.ntp.org iburst maxsources 2

保存并关闭文件,然后使用以下命令重启 chrony 服务并设置为开机自启:

systemctl restart chrony
systemctl enable chrony

完成后,您可以继续进行下一步。

在所有节点上安装 CockroachDB

在本节中,我们将在所有节点上安装 CockroachDB。请在所有节点上运行以下命令来安装 CockroachDB。

首先,使用以下命令从其官网下载最新版本的 CockroachDB:

wget https://binaries.cockroachdb.com/cockroach-latest.linux-amd64.tgz

下载完成后,使用以下命令解压下载的文件:

tar -xvzf cockroach-latest.linux-amd64.tgz

接下来,使用以下命令将 CockroachDB 二进制文件复制到 /usr/local/bin 目录:

cp cockroach-*/cockroach /usr/local/bin/

接下来,使用以下命令验证 CockroachDB 版本:

cockroach version

您应看到类似以下输出:

Build Tag:        v22.2.2
Build Time:       2023/01/04 17:23:00
Distribution:     CCL
Platform:         linux amd64 (x86_64-pc-linux-gnu)
Go Version:       go1.19.1
C Compiler:       gcc 6.5.0
Build Commit ID:  07a53a36601e9ca5fcffcff55f69b43c6dfbf1c1
Build Type:       release

至此,CockroachDB 已在所有节点上安装完成。您现在可以继续进行下一步。

创建证书

CockroachDB 还需要服务器证书和客户端证书以建立安全连接。首先,在所有节点上创建一个用于存储证书文件的目录。在所有节点上运行以下命令来创建 certs 目录:

mkdir ~/certs

接下来,您需要创建 CA 证书、根证书和客户端证书。

创建 CA 证书

在 node1 上,使用以下命令创建 CA 证书:

cockroach cert create-ca --certs-dir=certs --ca-key=certs/ca.key

该命令将在 ~/certs 目录中生成 ca.key 和 ca.crt。

然后,使用以下命令将生成的 CA 复制到另外两个节点:

scp ~/certs/ca.crt ~/certs/ca.key 
[email protected]
:~/certs/
scp ~/certs/ca.crt ~/certs/ca.key 
[email protected]
:~/certs/

创建客户端证书

接下来,您需要生成客户端证书,以保护 SQL 与集群之间的通信。

在所有节点上运行以下命令来生成客户端证书:

cockroach cert create-client root --certs-dir=certs --ca-key=certs/ca.key

完成后,您可以继续创建服务器证书。

创建服务器证书

接下来,您需要生成服务器证书,以保护 CockroachDB 集群中各服务器之间的通信。

在 node1 上,运行以下命令生成服务器证书:

cockroach cert create-node localhost $(hostname) 192.168.10.10 --certs-dir=certs --ca-key=certs/ca.key

在 node2 上,运行以下命令生成服务器证书:

cockroach cert create-node localhost $(hostname) 192.168.10.11 --certs-dir=certs --ca-key=certs/ca.key

在 node3 上,运行以下命令生成服务器证书:

cockroach cert create-node localhost $(hostname) 192.168.10.12 --certs-dir=certs --ca-key=certs/ca.key

这将在 ~/certs 目录中生成 node.key 和 node.crt 文件。

您可以使用以下命令列出所有证书:

cockroach --certs-dir=certs cert list

您应看到类似以下输出:

Certificate directory: certs
  Usage  | Certificate File |    Key File     |  Expires   |                   Notes                    | Error
---------+------------------+-----------------+------------+--------------------------------------------+--------
  CA     | ca.crt           |                 | 2033/01/17 | num certs: 1                               |
  Node   | node.crt         | node.key        | 2028/01/14 | addresses: localhost,vultr,192.168.10.10 |
  Client | client.root.crt  | client.root.key | 2028/01/14 | user: root                                 |
(3 rows)

完成后,您可以继续进行下一步。

启动 CockroachDB 集群

至此,所有证书已准备就绪,可以启动 CockroachDB 集群。

在 node1 上,运行以下命令来发布安全的 CockroachDB 集群:

cockroach start --background --certs-dir=certs --advertise-host=192.168.10.10 --join=192.168.10.10,192.168.10.11,192.168.10.12 --background

您应看到类似以下输出。

* WARNING: Running a server without --sql-addr, with a combined RPC/SQL listener, is deprecated.
* This feature will be removed in the next version of CockroachDB.
*
*
* INFO: initial startup completed.
* Node will now attempt to join a running cluster, or wait for `cockroach init`.
* Client connections will be accepted after this completes successfully.
* Check the log file(s) for progress. 

接下来,使用以下命令初始化集群。

cockroach init --certs-dir=certs --host=192.168.10.10

默认情况下,CockroachDB 集群监听 26257 端口。您可以使用以下命令进行检查。

ss -antpl | grep 26257

您将看到类似以下输出。

LISTEN 0      4096               *:26257            *:*    users:(("cockroach",pid=86868,fd=25))

您还可以使用以下命令检查集群的状态:

cockroach node status --certs-dir=certs --host=192.168.10.10

您应看到类似以下输出:

  id |        address        |      sql_address      |  build  |              started_at              |              updated_at              | locality | is_available | is_live
-----+-----------------------+-----------------------+---------+--------------------------------------+--------------------------------------+----------+--------------+----------
   1 | 192.168.10.10:26257 | 192.168.10.10:26257 | v22.2.2 | 2023-01-10 07:19:44.009519 +0000 UTC | 2023-01-10 07:20:24.521341 +0000 UTC |          | true         | true
(1 row)

完成后,您可以继续进行下一步。

将剩余节点加入集群

接下来,您需要将这两个节点都加入 CockroachDB 集群。

在 node2 上,运行以下命令将其加入 CockroachDB 集群。

cockroach start --background --certs-dir=certs --advertise-host=192.168.10.11 --listen-addr=192.168.10.11 --join=192.168.10.10:26257

在 node3 上,运行以下命令将其加入 CockroachDB 集群。

cockroach start --background --certs-dir=certs --advertise-host=192.168.10.12 --listen-addr=192.168.10.12 --join=192.168.10.10:26257

接下来,返回 node1,使用以下命令检查集群的状态:

cockroach node status --certs-dir=certs --host=192.168.10.10

您应看到所有节点均已加入集群。

  id |        address        |      sql_address      |  build  |              started_at              |              updated_at              | locality | is_available | is_live
-----+-----------------------+-----------------------+---------+--------------------------------------+--------------------------------------+----------+--------------+----------
   1 | 192.168.10.10:26257 | 192.168.10.10:26257 | v22.2.2 | 2023-01-10 07:19:44.009519 +0000 UTC | 2023-01-10 07:21:27.529911 +0000 UTC |          | true         | true
   2 | 192.168.10.11:26257  | 192.168.10.11:26257  | v22.2.2 | 2023-01-10 07:21:04.206015 +0000 UTC | 2023-01-10 07:21:26.718227 +0000 UTC |          | true         | true
   3 | 192.168.10.12:26257 | 192.168.10.12:26257 | v22.2.2 | 2023-01-10 07:21:17.704146 +0000 UTC | 2023-01-10 07:21:26.718768 +0000 UTC |          | true         | true

至此,CockroachDB 集群已启动并监听 8080 端口。您现在可以继续进行下一步。

访问 CockroachDB 仪表盘

CockroachDB 提供了一个简单易用的 Web 界面来监控集群。在访问 CockroachDB Web 界面之前,您需要创建一个管理员用户并为其设置密码。

在 node1 上,使用以下命令登录 cockroachdb SQL shell:

cockroach sql --certs-dir=certs --host=192.168.10.10

接下来,创建一个名为 user1 的用户并使用以下命令设置密码:

[email protected]
:26257/defaultdb> CREATE USER user1 WITH PASSWORD 'securepassword';

接下来,使用以下命令退出 SQL shell。

[email protected]
:26257/defaultdb> exit;

现在,打开您的 Web 浏览器,使用 URL https://node1-ip-address:8080 访问 CockroachDB Web 界面。您应看到如下页面:

在 Ubuntu 22.04 上安装 CockroachDB 分布式数据库

输入您的管理员用户名和密码,然后点击 LOG IN 按钮。您应在以下页面上看到 CockroachDB 仪表盘:

在 Ubuntu 22.04 上安装 CockroachDB 分布式数据库

验证集群中的数据库复制

接下来,您需要验证数据库是否已在所有节点间完成复制。

在 node1 上,使用以下命令登录 SQL shell:

cockroach sql --certs-dir=certs --host=192.168.10.10

接下来,使用以下命令创建名为 wpdb1 和 wpdb2 的数据库:

create database wpdb1;
create database wpdb2;

接下来,使用以下命令验证数据库:

show databases;

您应在以下输出中看到所有数据库:

  database_name | owner | primary_region | secondary_region | regions | survival_goal
----------------+-------+----------------+------------------+---------+----------------
  defaultdb     | root  | NULL           | NULL             | {}      | NULL
  postgres      | root  | NULL           | NULL             | {}      | NULL
  system        | node  | NULL           | NULL             | {}      | NULL
  wpdb1         | root  | NULL           | NULL             | {}      | NULL
  wpdb2         | root  | NULL           | NULL             | {}      | NULL
(5 rows)


Time: 3ms total (execution 3ms / network 1ms)

接下来,转到 node2 并验证数据库是否已复制。

在 node2 上,使用以下命令登录 SQL shell:

cockroach sql --certs-dir=certs --host=192.168.10.11

运行以下命令以显示数据库:

show databases;

您应在以下输出中看到 wpdb1 和 wpdb2:

  database_name | owner | primary_region | secondary_region | regions | survival_goal
----------------+-------+----------------+------------------+---------+----------------
  defaultdb     | root  | NULL           | NULL             | {}      | NULL
  postgres      | root  | NULL           | NULL             | {}      | NULL
  system        | node  | NULL           | NULL             | {}      | NULL
  wpdb1         | root  | NULL           | NULL             | {}      | NULL
  wpdb2         | root  | NULL           | NULL             | {}      | NULL
(5 rows)


Time: 7ms total (execution 6ms / network 1ms)

以上输出表明数据库复制正在 CockroachDB 集群中正常工作。

结论

本指南讲解了如何在 Ubuntu 22.04 服务器上安装并搭建一个安全的 CockroachDB 集群。您现在可以通过向集群添加更多节点来轻松扩展集群。如果您有任何问题,欢迎随时提问。如需了解更多信息,您可以访问 CockroachDB 官方文档。