安装必备软件包
CockroachDB 需要一些软件包,这些软件包通常预装在最小安装的 CentOS 8 操作系统上。
但是,如果尚未安装这些软件包,我们也可以执行 dnf 命令来安装它们。
# dnf install -y glibc ncurses-libs tzdata
在 CentOS/RHEL 8 上设置 CockroachDB 安全集群
CockroachDB 集群可以在安全和不安全模式下进行配置。
在不安全模式下配置 CockroachDB 集群非常简单,但不强制对集群间通信进行加密。
而安全模式使用 SSL/TLS 证书来强制对集群间通信和授权进行加密。
首先,我们需要创建一个证书颁发机构 (CA),它将用于对我们将为 CockroachDB 安全集群生成的任何证书进行数字签名。
我们可以使用以下 cockroach 命令创建证书颁发机构,也可以使用 openssl 命令创建证书颁发机构。
# cockroach cert create-ca \ > --certs-dir=/opt/cockroachdb/certs \ > --ca-key=/opt/cockroachdb/private/ca.key
借助以下命令为我们的第一个 CockroachDB 节点 (crdb-node-01) 生成 SSL/TLS 证书。
# cockroach cert create-node \ > 192.168.1.230 \ > crdb-node-01 \ > localhost \ > --certs-dir=/opt/cockroachdb/certs \ > --ca-key=/opt/cockroachdb/private/ca.key
通过执行以下命令为 CockroachDB 客户端生成 SSL/TLS 证书。
# cockroach cert create-client \ > root \ > --certs-dir=/opt/cockroachdb/certs \ > --ca-key=/opt/cockroachdb/private/ca.key
在数据库集群的其他节点上复制 SSL/TLS 证书。
# scp /opt/cockroachdb/certs/* \ > root@crdb-node-02:/opt/cockroachdb/certs/ root@crdb-node-02's password: ca.crt 100% 1111 27.5KB/s 00:00 client.root.crt 100% 1099 857.5KB/s 00:00 client.root.key 100% 1675 1.5MB/s 00:00 node.crt 100% 1159 1.0MB/s 00:00 node.key 100% 1679 108.7KB/s 00:00
复制其他节点上的证书颁发机构密钥,以便我们可以在这些节点上创建 SSL/TLS。
# scp /opt/cockroachdb/private/* root@crdb-node-02:/opt/cockroachdb/private/ root@crdb-node-02's password: ca.key 100% 1679 81.3KB/s 00:00
使用 ssh 命令以 root 用户身份连接到 crdb-node-02.onitroad.com。
删除我们在 crdb-node-01 节点上生成的节点证书/密钥。
# rm -f /opt/cockroachdb/certs/node.*
为 crdb-node-02 节点生成 SSL/TLS 证书,如下所示。
# cockroach cert create-node \ > 192.168.1.233 \ > crdb-node-02 \ > localhost \ > --certs-dir=/opt/cockroachdb/certs \ > --ca-key=/opt/cockroachdb/private/ca.key
为CockroachDB 配置 Linux 防火墙
CockroachDB 默认服务端口是 8080/tcp 用于 Web Admin UI,26257/tcp 用于 SQL 接口。
我们需要在 Linux 防火墙中允许上述两个服务端口。
# firewall-cmd --permanent --add-port={8080,26257}/tcp success # firewall-cmd --reload success
创建 Systemd 服务单元
要在 Linux 启动期间启用 CockroachDB 服务器的自动启动,我们需要创建一个 systemd 服务单元。
登录到 crdb-node-01.onitroad.com。
使用 vim 编辑器创建 systemd 服务单元文件。
# vi /etc/systemd/system/cockroachdb.service
在此文件中添加以下指令。
[Unit] Description=Cockroach Database cluster node Requires=network.target [Service] Type=notify WorkingDirectory=/opt/cockroachdb ExecStart=/usr/local/bin/cockroach start --certs-dir=/opt/cockroachdb/certs --advertise-addr=crdb-node-01 --join=crdb-node-01,crdb-node-02 TimeoutStopSec=60 Restart=always RestartSec=10 StandardOutput=syslog StandardError=syslog SyslogIdentifier=cockroach User=cockroach [Install] WantedBy=default.target
我们需要将 --advertise-addr 替换为我们在其上创建此 systemd 服务的 CockroachDB 节点的主机名。
启用并启动 CockroachDB 服务。
# systemctl enable --now cockroachdb.service Created symlink /etc/systemd/system/default.target.wants/cockroachdb.service -> /etc/systemd/system/cockroachdb.service.
检查 CockroachDB 服务端口以验证 CockroachDB 服务是否已启动且没有任何错误。
# ss -tulpn | grep cockroach tcp LISTEN 0 128 *:8080 *:* users:(("cockroach",pid=1692,fd=9)) tcp LISTEN 0 128 *:26257 *:* users:(("cockroach",pid=1692,fd=15))
CockroachDB 是一个高度可扩展的分布式数据库管理系统。
在这里,我们将学习如何在 CentOS/RHEL 8 上安装安全的数据库集群。
初始化 CockroachDB 安全集群
CockroachDB 配置完成,现在可以在任意 CockroachDB 节点上执行以下命令来初始化集群。
# cockroach init --certs-dir=/opt/cockroachdb/certs --host=crdb-node-01:26257 Cluster successfully initialized
更新 Linux 服务器包
最好的做法是经常更新 Linux 服务器软件包,尤其是在安装或者配置新软件之前。
借助 dnf 命令,更新 Linux 操作系统中已安装的软件包。
# dnf update -y
检查本安装教程中使用的服务器的 Linux 发行版和内核版本。
# uname -r 4.18.0-193.19.1.el8_2.x86_64 # cat /etc/redhat-release CentOS Linux release 8.2.2004 (Core)
访问 CockroachDB SQL Shell
使用以下命令连接到 crdb-node-01 SQL shell。
# cockroach sql --certs-dir=/opt/cockroachdb/certs --host=crdb-node-01:26257 # # Welcome to the CockroachDB SQL shell. # All statements must be terminated by a semicolon. # To exit, type: \q. # # Server version: CockroachDB CCL v20.1.8 (x86_64-unknown-linux-gnu, built 2020/10/21 15:46:38, go1.13.9) (same version as client) # Cluster ID: 50a8b514-7e6f-4a4a-936e-8a4d68aa1007 # # Enter \? for a brief introduction. # root@crdb-node-01:26257/defaultdb>
列出 CockroachDB 服务器中可用的数据库。
root@crdb-node-01:26257/defaultdb> SHOW DATABASES; database_name ---------------- defaultdb postgres system (3 rows) Time: 1.742219ms
使用 CREATE 语句创建一个新数据库。
root@crdb-node-01:26257/defaultdb> CREATE DATABASE contacts; CREATE DATABASE Time: 11.39776ms
在联系人数据库中创建一个新表。
root@crdb-node-01:26257/defaultdb> USE contacts; SET Time: 661.825µs root@crdb-node-01:26257/contacts> CREATE TABLE emails (id INT PRIMARY KEY, email varchar(40)); CREATE TABLE Time: 164.404539ms
在电子邮件表中插入几行。
root@crdb-node-01:26257/contacts> INSERT INTO emails VALUES (1,'jackli@yahoo.com'); INSERT 1 Time: 2.482089ms root@crdb-node-01:26257/contacts> INSERT INTO emails VALUES (2,'fqyang@gmail.com'); INSERT 1 Time: 2.278789ms root@crdb-node-01:26257/defaultdb> \q
现在连接第二个 CockroachDB 节点,并检查是否已将更改复制到该数据库。
# cockroach sql --certs-dir=/opt/cockroachdb/certs --host=crdb-node-02:26257 # # Welcome to the CockroachDB SQL shell. # All statements must be terminated by a semicolon. # To exit, type: \q. # # Server version: CockroachDB CCL v20.1.8 (x86_64-unknown-linux-gnu, built 2020/10/21 15:46:38, go1.13.9) (same version as client) # Cluster ID: 50a8b514-7e6f-4a4a-936e-8a4d68aa1007 # # Enter \? for a brief introduction. # root@crdb-node-02:26257/defaultdb> SHOW DATABASES; database_name ---------------- contacts defaultdb postgres system (4 rows) Time: 10.066515ms root@crdb-node-02:26257/defaultdb> USE contacts; SET Time: 2.853712ms root@crdb-node-02:26257/contacts> SELECT * FROM emails; id | email -----+------------------- 1 | jackli@yahoo.com 2 | fqyang@gmail.com (2 rows) Time: 123.407227ms root@crdb-node-02:26257/contacts> \q
数据已经复制到第二个节点,说明我们的CockroachDB集群配置成功。
配置环境
我们将创建一个规格最小的集群:
节点 1
- 操作系统 - CentOS 8.2
- 主机名 - crdb-node-01.onitroad.com
- IP 地址 - 192.168.1.230 /24
节点 2
- 操作系统 - CentOS 8.2
- 主机名 - crdb-node-02.onitroad.com
- IP 地址 - 192.168.1.233 /24
在 CentOS/RHEL 8 上安装 CockroachDB 软件
我们可以从 GitHub 或者 Cockroach Labs 网站免费下载 CockroachDB Core 版本。
使用 wget 命令下载 CockroachDB。
# cd /tmp # wget https://binaries.cockroachdb.com/cockroach-v20.1.8.linux-amd64.tgz
使用 tar 命令解压下载的 tar包。
# tar xf cockroach-v20.1.8.linux-amd64.tgz
为 CockroachDB 软件和相关文件创建目录。
# mkdir -p /opt/cockroachdb/{bin,certs,private}
将提取的文件复制到 /opt/cockroachdb/bin 目录中。
# cp -i cockroach-v20.1.8.linux-amd64/cockroach /opt/cockroachdb/bin/
检查cockroachdb文件的文件权限。
# ls -al /opt/cockroachdb/bin/ total 163100 drwxr-xr-x. 2 root root 23 Oct 31 11:12 . drwxr-xr-x. 5 root root 45 Oct 31 11:11 .. -rwxr-xr-x. 1 root root 167014096 Oct 31 11:12 cockroach
创建一个 Linux 用户来拥有 CockroachDB 软件和进程。
还将文件的所有权授予该用户。
# useradd -r cockroach # chown -R cockroach.cockroach /opt/cockroachdb/
为/usr/local/bin/目录下的蟑螂文件创建软链接,使其可以在任何地方执行。
# ln -s /opt/cockroachdb/bin/cockroach /usr/local/bin/cockroach
通过执行以下命令验证 CockroachDB 版本。
# cockroach version Build Tag: v20.1.8 Build Time: 2020/10/21 15:46:38 Distribution: CCL Platform: linux amd64 (x86_64-unknown-linux-gnu) Go Version: go1.13.9 C Compiler: gcc 6.3.0 Build SHA-1: ffd029f51aa134f2bce4a39ef1f3ad095c3856ad Build Type: release
以上步骤(从本文开始)必须在 CockroachDB 集群的每个节点上执行。
然而,后续步骤特定于节点,并且必须仅在提到的节点上执行。
在 Linux 服务器上设置时间同步:
就像任何其他集群设置一样,CockroachDB 集群也需要所有节点之间的时间同步。
如果它无法在任何集群节点上同步时间并导致时间漂移超过 500 毫秒,那么该节点将不会启动,直到它的时间与其他 CockroachDB 节点同步。
在基于 Red Hat 的 Linux 发行版中,Chrony 是自 RHEL 7 以来首选的 NTP 客户端/服务器。
因此,我们可以使用 dnf 命令安装 Chrony。
# dnf install -y chrony
使用以下 Linux 命令启用并启动 Chrony 服务。
# systemctl enable --now chronyd.service
执行以下命令查看NTP源和时间同步状态。
# chronyc sources -v 210 Number of sources = 4 .-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current synced, '+' = combined , '-' = not combined, | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable. || .- xxxx [ yyyy ] +/- zzzz || Reachability register (octal) -. | xxxx = adjusted offset, || Log2(Polling interval) --. | | yyyy = measured offset, || \ | | zzzz = estimated error. || | | \ MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^+ 141.15.176.182.in-addr.a> 2 6 17 2 -3915us[-2554us] +/- 94ms ^+ 1.200.159.162.in-addr.ar> 3 6 17 2 +25ms[ +27ms] +/- 83ms ^+ 197.19.176.182.in-addr.a> 2 6 17 2 -40ms[ -39ms] +/- 134ms ^* 119.159.246.253 2 6 17 2 +3885us[+5131us] +/- 88ms
访问 CockroachDB Web 管理界面
要访问 CockroachDB Web Admin UI,我们需要一个用户帐户。
该用户必须在 CockroachDB 数据库中创建。
因此,连接到任何 CockroachDB 节点的 SQL shell 并创建一个数据库用户。
root@crdb-node-01:26257/defaultdb> CREATE USER jackli WITH PASSWORD 'cockroach'; CREATE ROLE Time: 363.507317ms
我们还需要向 jackli 用户授予管理员权限。
root@crdb-node-01:26257/defaultdb> GRANT admin TO jackli; GRANT Time: 1.425956943s
在 Web 浏览器中打开 URL https://crdb-node-01:8080。
以 jackli 用户身份登录。
配置集群节点的名称解析
名称解析在设置 Linux 集群时非常关键。
因为,如果一个节点无法解析其他节点的主机名,那么集群设置将引发不同类型的错误。
为此,我们可以配置权威 DNS 服务器或者简单地使用本地 DNS 解析器。
在这里,我们正在为集群节点的主机名解析配置本地 DNS 解析器。
使用 vim 编辑器编辑 /etc/hosts 文件。
# vi /etc/hosts
在此文件中添加以下条目。
192.168.1.230 crdb-node-01 crdb-node-01.onitroad.com 192.168.1.233 crdb-node-02 crdb-node-02.onitroad.com
这些条目足够安静以配置集群节点的名称解析。
为 CockroachDB 集群配置负载均衡器
CockroachDB 集群中的每个节点都有自己的 SQL 和 Web Admin UI 服务,可以通过使用节点主机名或者 IP 地址独立访问。
因此,有必要配置一个反向代理负载均衡器,让用户/应用程序可以通过公共地址/端口访问我们的集群,而不是访问具有单独主机名/IP 地址的各个节点。
为此,我们可以使用 HAProxy 来配置软件负载均衡器。
我们可以使用 cockroach 命令轻松生成 HAProxy 配置文件。
# cockroach gen haproxy --certs-dir=/opt/cockroachdb/certs --host=crdb-node-01
检查 haproxy.cfg 文件的内容。
# cat haproxy.cfg global maxconn 4096 defaults mode tcp # Timeout values should be configured for your specific use. # See: https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-timeout%20connect timeout connect 10s timeout client 1m timeout server 1m # TCP keep-alive on client side. Server already enables them. option clitcpka listen psql bind :26257 mode tcp balance roundrobin option httpchk GET /health?ready=1 server cockroach1 $(hostname):26257 check port 8080
这个文件需要稍作调整,然后它就可以完美地在 HAProxy 负载均衡器上工作。
可以参考我们的教程来配置 HAProxy 负载均衡器。