本页内容
- 先决条件
- 设置 FQDN
- 下载并安装 CockroachDB
- 配置 Firewalld
- 生成 SSL/TLS 证书 生成 CA 证书 生成客户端证书 生成节点证书
- 以 Systemd 服务方式运行 CockroachDB
- 初始化 CockroachDB 集群
- 在 CockroachDB 上创建管理员用户
- CockroachDB 上的基本操作
- 检查 CockroachDB 集群中的数据库复制
- 结论
- 生成 CA 证书
- 生成客户端证书
- 生成节点证书
CockroachDB 是一款开源的、分布式且可扩展的 SQL 数据库,适用于云应用。CockroachDB 提供更高层次的一致性、可复制的 SQL 数据库以及事务性数据存储。CockroachDB 将你的数据存储在多个位置,从而加快数据传送速度。此外,它易于扩展,并为你的应用提供高可用性和容错能力。
本指南向你展示如何在多台 AlmaLinux 9 服务器上安装并创建 CockroachDB 集群。你还将学习使用 CockroachDB 的基本查询,以及验证数据库的自动复制。
先决条件
在开始之前,请确保你具备以下条件:
- 两台或更多 AlmaLinux 9 服务器 - 在本演示中,我们将使用两台服务器:srv1,IP 地址为 192.168.10.20;以及 srv2,IP 地址为 192.168.10.21。
- 一个可以执行 sudo 命令以获取 root 权限的非 root 用户。
设置 FQDN
你要做的第一步是为你所有的服务器设置 fqdn(完全限定域名),并确保每个 fqdn 都指向正确的本地 IP 地址。
在 srv1 上,运行以下命令将 fqdn 设置为 srv1.hwdomain.lan。
sudo hostnamectl set-hostname srv1.hwdomain.lan
对于 srv2,运行以下命令将 fqdn 设置为 srv2.hwdomain.lan。
sudo hostnamectl set-hostname srv2.hwdomain.lan
现在使用以下 nano 编辑器命令打开 /etc/hosts 文件。
sudo nano /etc/hosts
将以下配置插入到该行的末尾。
```ini 192.168.10.20 srv1.hwdomain.lan srv1 192.168.10.21 srv2.hwdomain.lan srv2 ```
完成后保存并退出该文件。
最后,运行以下命令来验证每台服务器的 fqdn,并执行 ping 命令以确保每个 fqdn 都指向正确的内部 IP 地址。
sudo hostname -f
ping -c3 srv1.hwdomain.lan
ping -c3 srv2.hwdomain.lan
srv1 服务器应具有 fqdn srv1.hwdomain.lan,并指向 IP 地址 192.168.10.20;而 srv2 服务器配置的 fqdn 为 srv2.hwdomain.lan,IP 地址为 192.168.10.21。

下载并安装 CockroachDB
CockroachDB 可以安装在多种环境中,你可以传统地通过下载 CockroachDB 的预编译二进制包来安装,也可以将其安装在 Kubernetes 等容器化环境中。
在本节中,你将通过预编译二进制包将 CockroachDB 安装到你的 AlmaLinux 9 服务器上。
首先,使用以下 dnf 命令安装 curl。
sudo dnf install curl -y

现在运行以下命令下载 CockroachDB 二进制包,并通过 tar 命令解压它。
curl https://binaries.cockroachdb.com/cockroach-v23.1.3.linux-amd64.tgz --output cockroach-v23.1.3.linux-amd64.tgz
tar -xzf cockroach-v23.1.3.linux-amd64.tgz
使用以下命令将 CockroachDB 二进制文件 cockroach-v23.1.3.linux-amd64/cockroach 移动到 /usr/bin/ 目录。
sudo cp -i cockroach-v23.1.3.linux-amd64/cockroach /usr/bin/

最后,输入以下命令来验证 cockroach 二进制文件的完整路径以及 CockroachDB 版本。
which cockroach
cockroach version

配置 Firewalld
在安装 CockroachDB 之后,你将配置 firewalld,并为 CockroachDB Web 管理面板开放端口 8080,为集群连接开放端口 26257。
运行以下 firewall-cmd 命令,将端口 8080 和 26257 添加到 firewalld 中。然后重新加载 firewalld 以应用更改。
sudo firewall-cmd --add-port={8080/tcp,26257/tcp} --permanent
sudo firewall-cmd --reload
现在使用以下命令验证 firewalld 规则列表。你应该能看到端口 8080 和 26257 已添加到 firewalld 中。
sudo firewall-cmd --list-all

生成 SSL/TLS 证书
在接下来的部分中,你将生成多个用于 CockroachDB 集群的证书。这可以通过 OpenSSL 实现,但你也可以使用 cockroach 命令行工具。
以下是你将生成的一些 SSL/TLS 证书:
- CA 证书:这将用于签署你所有的证书。
- 客户端证书:这可用于连接到 CockroachDB 集群。
- 节点证书:你必须为每个服务器创建节点证书,以创建安全的 CockroachDB 集群。
生成 CA 证书
在 srv1 和 srv2 两台服务器上运行以下命令,创建一个新目录 /opt/cockroachdb/。在该目录中,你还将创建 certs 和 private 两个目录。
mkdir -p /opt/cockroachdb/{certs,private}
在 srv1 上,运行以下 cockroach 命令来生成 CA 证书。这将生成 CA 证书 ca.crt 和 ca.key。
cockroach cert create-ca \
--certs-dir=/opt/cockroachdb/certs \
--ca-key=/opt/cockroachdb/private/ca.key

现在运行以下 scp 命令,将 CA 证书 ca.crt 和 ca.key 复制到 srv2 服务器。
scp /opt/cockroachdb/private/ca.key
[email protected]
:/opt/cockroachdb/private/
scp /opt/cockroachdb/certs/ca.crt
[email protected]
:/opt/cockroachdb/certs/

生成客户端证书
在 srv1 服务器上,运行以下命令为默认用户 root 生成客户端证书。这将生成两个证书 client.root.crt 和 client.root.key,可用于登录 CockroachDB 集群。
cockroach cert create-client \
root \
--certs-dir=/opt/cockroachdb/certs \
--ca-key=/opt/cockroachdb/private/ca.key

生成节点证书
在生成 CA 证书并将其上传到 srv2 服务器后,你将在 srv1 和 srv2 两台服务器上生成节点证书。
在 srv1 服务器上运行以下命令以生成节点证书。请务必更改 srv1 服务器的 fqdn 和 IP 地址。
cockroach cert create-node \
srv1.hwdomain.lan \
192.168.10.20 \
localhost \
--certs-dir=/opt/cockroachdb/certs \
--ca-key=/opt/cockroachdb/private/ca.key
命令执行后,节点证书 node.crt 和 node.key 将可用。

现在在 srv2 服务器上运行以下命令以生成节点证书。请务必更改 srv2 服务器的 fqdn 和 IP 地址。
cockroach cert create-node \
srv2.hwdomain.lan \
192.168.10.21 \
localhost \
--certs-dir=/opt/cockroachdb/certs \
--ca-key=/opt/cockroachdb/private/ca.key
你应该能看到已生成节点证书 node.crt 和 node.key。

以 Systemd 服务方式运行 CockroachDB
在生成 SSL/TLS 证书之后,接下来你将启动 CockroachDB 服务。你可以通过命令行手动启动 CockroachDB,但推荐的方法是使用 systemd 服务。
首先,在 srv1 和 srv2 两台服务器上运行以下命令,创建一个新用户 cockroach,并将 /opt/cockroachdb 目录的所有权更改为用户 cockroach。
sudo adduser -d /opt/cockroachdb -r -U cockroach
sudo chown -R cockroach:cockroach /opt/cockroachdb
在 srv1 服务器上,运行以下 nano 命令,创建一个新 systemd 服务文件 /etc/systemd/system/cockroachdb.service。
sudo nano /etc/systemd/system/cockroachdb.service
插入以下配置,并务必将 --advertise-addr 参数更改为 srv1 服务器的 IP 地址。
[Unit] Description=Cockroach Database cluster node Requires=network.target [Service] Type=notify WorkingDirectory=/opt/cockroachdb ExecStart=/usr/bin/cockroach start --certs-dir=/opt/cockroachdb/certs --advertise-addr=192.168.10.20 --join=192.168.10.20,192.168.10.21 TimeoutStopSec=60 Restart=always RestartSec=10 StandardOutput=syslog StandardError=syslog SyslogIdentifier=cockroach User=cockroach [Install] WantedBy=default.target
完成后保存文件并退出编辑器。
现在切换到 srv2 服务器,使用 nano 编辑器创建一个新 systemd 服务文件 /etc/systemd/system/cockroachdb.service。
sudo nano /etc/systemd/system/cockroachdb.service
将以下配置添加到该文件中,并务必将 --advertise-addr 参数更改为 srv2 服务器的 IP 地址。
[Unit] Description=Cockroach Database cluster node Requires=network.target [Service] Type=notify WorkingDirectory=/opt/cockroachdb ExecStart=/usr/bin/cockroach start --certs-dir=/opt/cockroachdb/certs --advertise-addr=192.168.10.21 --join=192.168.10.20,192.168.10.21 TimeoutStopSec=60 Restart=always RestartSec=10 StandardOutput=syslog StandardError=syslog SyslogIdentifier=cockroach User=cockroach [Install] WantedBy=default.target
完成后保存文件并退出编辑器。
接下来,运行以下 systemctl 命令以重新加载 systemd 管理器并应用新的 systemd 服务。
sudo systemctl daemon-reload
然后,使用以下 systemctl 命令启动并启用 cockroachdb 服务。
sudo systemctl start cockroachdb
sudo systemctl enable cockroachdb

最后,验证 cockroachdb 服务,以确保其正在运行。
sudo systemctl status cockroachdb
如果配置成功,你应该会看到 cockroachdb 服务状态为 active (running)。
srv1 服务器上的 cockroachdb 服务状态。

srv2 服务器上的 cockroachdb 服务状态。

初始化 CockroachDB 集群
在 srv1 和 srv2 服务器上将 CockroachDB 作为 systemd 服务启动后,你就可以初始化 CockroachDB 集群了。
在 srv1 服务器上运行以下 cockroach 命令,以初始化 CockroachDB 集群。
cockroach init --certs-dir=/opt/cockroachdb/certs --host=192.168.10.20:26257
如果初始化成功,你应该会看到输出 "Cluster successfully initialized"。
现在运行以下命令,检查 CockroachDB 数据目录 /opt/cockroachdb/cockroach-data/ 中的 CockroachDB 日志。
grep 'node starting' /opt/cockroachdb/cockroach-data/logs/cockroach.log -A 11
如果你看到类似 "CockroachDB node starting.." 的输出,这意味着 CockroachDB 集群已成功初始化。

最后,运行以下命令来检查 CockroachDB 集群中的节点列表以及每个节点的详细状态。
cockroach node --certs-dir=/opt/cockroachdb/certs --host=192.168.10.20 ls
cockroach node --certs-dir=/opt/cockroachdb/certs --host=192.168.10.20 status
你应该能看到集群中有两台 CockroachDB 服务器,状态为 alive 且可用。

在 CockroachDB 上创建管理员用户
在 CockroachDB 集群运行后,下一步是为 CockroachDB 集群创建一个管理员用户。
首先,运行以下 cockroach 命令,使用默认用户 root 以及 /opt/cockroachdb/certs 目录中的证书,连接到 CockroachDB 服务器 srv1.hwdomain.lan。
cockroach sql --certs-dir=/opt/cockroachdb/certs --host=srv1.hwdomain.lan:26257
在下面的 CockroachDB 提示符中,确认你已以默认 root 用户身份连接到 CockroachDB 服务器 srv1.hwdomain.lan 以及数据库 defaultdb。

现在运行以下查询,列出 CockroachDB 集群上可用的数据库。
SHOW DATABASES;
你应该能在你的 CockroachDB 集群上看到数据库 defaultdb、postgres 和 system。

接下来,运行以下查询创建一个新用户 alice。然后,授予 alice 用户 admin 权限。不要忘记在下面的查询中更改密码。
CREATE USER alice WITH PASSWORD 'password';
GRANT admin TO alice;
现在输入 quit 或按 Ctrl+d 退出 CockroachDB shell。

最后,启动你的 Web 浏览器,访问 srv1 的 IP 地址加上端口 8080(即:http://192.168.10.20:8080/),以进入 CockroachDB Web 管理面板。系统应该会提示你进行 CockroachDB 身份验证。
输入用户 alice 和密码,然后点击 Log in。

如果你拥有正确的用户和密码,你应该会进入 CockroachDB 管理面板。你应该能看到 CockroachDB 集群拥有两台服务器:192.168.10.20 和 192.168.10.21。

CockroachDB 上的基本操作
在接下来的部分中,你将学习如何在 CockroachDB 上创建新数据库和表,以及插入和检索数据。以下命令将在 srv1 服务器上运行。
首先,运行以下命令,以用户 alice 身份登录到 CockroachDB 集群。
cockroach sql --user=alice --certs-dir=/opt/cockroachdb/certs --host=srv1.hwdomain.lan:26257
当提示输入密码时,输入用户 alice 的密码。

登录后,运行以下查询,创建一个包含表 users 的新数据库 testdb。
CREATE DATABASE testdb;
CREATE TABLE testdb.users (
id INT PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
age INT NOT NULL,
address CHAR(50),
salary REAL
);

现在运行 USE 查询切换到数据库 testdb,并运行下面的一些 INSERT 查询,向表 users 中添加新数据。
USE testdb;
INSERT INTO users (id,name,age,address,salary) VALUES (1, 'Paul', 32, 'California', 20000.00);
INSERT INTO users (id,name,age,address,salary) VALUES (2, 'Jesse', 35, 'Mexico', 30000.00);
INSERT INTO users (id,name,age,address,salary) VALUES (3, 'Linda', 27, 'Canada', 40000.00);

最后,执行下面的 SELECT 查询,从表 users 中检索你的数据。
SELECT * FROM users;
你的数据应该会打印在你的终端屏幕上。

检查 CockroachDB 集群中的数据库复制
在创建新数据库并插入新数据后,你现在将从 srv2 服务器验证 CockroachDB 集群中的数据库复制,因此请务必在 srv2 服务器上运行这些命令。
在 srv2 服务器上,运行以下命令,以用户 alice 身份连接到 CockroachDB 服务器。
cockroach sql --user=alice --certs-dir=/opt/cockroachdb/certs --host=srv2.hwdomain.lan:26257
当提示时,输入用户 alice 的密码。
登录后,运行以下查询,检查 CockroachDB 集群上可用的数据库列表。
SHOW DATABASES;
如果数据库复制成功,你应该能在 srv2 服务器上看到可用的数据库 testdb。

现在运行以下查询,切换到数据库 testdb,并从表 users 中检索可用的数据。
USE testdb;
SELECT * FROM users;
如果复制成功,你应该能在 srv2 服务器上看到你的数据。

结论
恭喜,做得好!你已在你的 AlmaLinux 9 服务器上完成了 CockroachDB 集群的安装。你已创建了一个带有 SSL/TLS 证书的安全 CockroachDB 集群,并在后台以 systemd 服务方式运行 CockroachDB。此外,你还学习了一些用于创建管理员用户、创建数据库以及在 CockroachDB 上插入和检索数据的基本查询。
鉴于此,你现在可以开始迁移到 CockroachDB 集群,并且你的数据库将自动复制到多个节点。