安装必备软件包

CockroachDB 需要一些软件包,这些软件包通常预装在最小安装的 CentOS 8 操作系统上。

但是,如果尚未安装这些软件包,我们也可以执行 dnf 命令来安装它们。

# dnf install -y glibc ncurses-libs tzdata
欢迎来到之路教程(on itroad-com)

在 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))
在 CentOS/RHEL 8 上安装 CockroachDB 安全集群

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 负载均衡器

日期:2020-09-17 00:11:05 来源:oir作者:oir