原始网页:https://www.cockroachlabs.com/docs/stable/deploy-cockroachdb-on-aws.html


本小节将展示如何在亚马逊AWS EC2平台部署CockroachDB集群,并使用AWS提供的负载均衡器均衡集群负载。

如果集群只是用做测试环境而非生产环境,对安全性没有要求,可以选择非安全模式。

需求

建议

访问级别 简述
部分开放 设置防火墙规则,允许部分指定的ip地址访问到机器的8080端口
完全开放 设置防火墙规则,允许全部的ip地址访问到机器的8080端口
完全关闭 设置防火墙规则,阻止所有指向8080端口的连接请求。在这种情况下,Admin界面能够通过创建SSH通道去访问。

Step 1: 配置网络

CockroachDB需要以下2个端口供TCP连接访问:

通过Security Groups's Inbound Rules创建规则。

节点之间和节点与负载均衡器之间的通信

配置项 推荐值
Type Custom TCP Rule
Protocol TCP
Port Range 26257
Source 安全组的名称(例如sg-07ab277a)

Admin界面

配置项 推荐值
Type Custom TCP Rule
Protocol TCP
Port Range 8080
Source 用户网络的IP范围

应用数据

配置项 推荐值
Type Custom TCP Rule
Protocol TCP
Port Range 26257
Source 应用程序的IP范围

Step 2: 创建AWS实例

需要为集群的每个节点创建机器,如需对集群进行负载测试,则需要创建一个单独的AWS实例用于模拟业务负载。

更多细节请查看硬件推荐集群拓扑

Step 3: 同步时钟

CockroachDB需要中等强度的时间同步机制以维持数据的一致性时间同步机制以维持数据的一致性。

当一个节点检测到自身的机器时间与集群当中至少50%的节点的机器时间之间的误差值超过集群最大允许时间误差值(默认500ms)的80%的时候,该节点会自动停止。这能够避免违反数据一致性导致读写旧数据的风险。通过在每个节点上运行NTP或其他时钟同步软件,来防止时钟漂移得太远是很重要的。

亚马逊提供Amazon Time Sync Service,通过一系列的卫星连接和原子钟构造一个能够准确提供当前时间的接口,同时提供了闰秒涂抹的功能。

Step 4: 设置负载均衡

集群当中每个CockroachDB节点都是一个平等的SQL访问网关。在负载均衡的时候,需要考虑节点的性能和可靠性:

将流量均衡各个节点,避免当个节点处理过多的访问请求,提高了集群的整体性能。

负载均衡器没有监控集群各个节点健康状况,当一个节点故障时,负载均衡器能够将流量切换到其他正常的节点上。

AWS提供了完整的负载均衡服务,将流量分发到集群节点。

Note: 用户如果不打算使用AWS负载均衡服务,而是使用HAProxy,可以参照本地部署相关内容

Step 5: 生成证书

如果采用非安全模式,请跳过此步骤。 如果采用安全模式,使用cockroach cert命令或是openssl工具,生成以下文件:

TIPS: 在生成证书的时候需要收集集群所有机器的内网或是外网IP地址。

本地安装CockroachDB

可查看:Install CockroachDB

准备CA证书和密钥

mkdir certs
mkdir my-safe-directory
cockroach cert create-ca --certs-dir=certs --ca-key=my-safe-directory/ca.key

为每个节点创建证书和密钥

用于其他节点或是负载均衡器访问该节点。对于每个节点进行如下操作:

cockroach cert create-node \
<node1 internal IP address> \
<node1 external IP address> \
<node1 hostname>  \
<other common names for node1> \
localhost \
127.0.0.1 \
<load balancer IP address> \
<load balancer hostname>  \
<other common names for load balancer instances> \
--certs-dir=certs \
--ca-key=my-safe-directory/ca.key

将证书和密钥传输到对应节点

# Create the certs directory:
ssh <username>@<node address> "mkdir certs"

# Upload the CA certificate and node certificate and key:
scp certs/ca.crt certs/node.crt certs/node.key \
<username>@<node address>:~/certs

删除本地机器的证书和密钥缓存

rm certs/node.crt certs/node.key

TIPS: 考虑为所有节点生成的证书和密钥文件都是同样的文件名,删除证书和密钥文件时有必要的。在默认情况下,只有为cockroach cert create-node命令添加--overwrite标签才会覆盖已有的同名的证书和密钥文件。

root用户创建证书和密钥

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

将证书和密钥传输到某个节点机器

# Create the certs directory:
ssh <username>@<workload address> "mkdir certs"

# Upload the CA certificate and client certificate and key:
scp certs/ca.crt certs/client.root.crt certs/client.root.key <username>@<workload address>:~/certs

拥有证书的机器能够使用root账户执行cockroach命令,通过该节点机器访问集群。

Step 6: 启动节点

可以选择手动方式或是使用systemd工具,对需要加入到集群当中的每个节点执行以下操作:

NOTE: 节点完成启动后需要相互之间构成集群才能被使用。

手动方式

环境搭建

wget -qO- https://binaries.cockroachdb.com/cockroach-v2.0.5.linux-amd64.tgz | tar  xvz
sudo cp -i cockroach-v2.0.5.linux-amd64/cockroach /usr/local/bin

分模式启动节点

#非安全模式
cockroach start \
--insecure \
--advertise-host=<node1 address> \
--join=<node1 address>:26257,<node2 address>:26257,<node3 address>:26257 \
--cache=.25 \
--max-sql-memory=.25 \
--background

#安全模式
cockroach start \
--certs-dir=certs \
--advertise-host=<node1 address> \
--join=<node1 address>:26257,<node2 address>:26257,<node3 address>:26257 \
--cache=.25 \
--max-sql-memory=.25 \
--background

涉及到的flags:

flag 简介
--insecure 指定以非安全模式建立连接
--certs-dir 指定存放ca.crtnode.crtnode.key文件的目录
--advertise-host 指定IP地址或是hostname供集群其他节点访问该节点。具体配置详见Networking
--join 指定集群3-5个初始化节点的地址和端口
--cache
--max-sql-memory
增加节点缓存和临时SQL内存大小到操作系统内存的25%,用于优化读性能和内存中SQL执行,详见Cache and SQL Memory Size
--background 指定后台运行

如果集群部署在多个数据中心或是节点之间网络延迟较高,推荐使用--locality配置拓扑节点位置,这属于enterprise版本的功能,详见:Locality

其他未指定的选项采用默认配置,例如默认--store即数据库文件,为当前目录下已有或新建的cockroach-data;默认--port即节点通信和客户端访问端口,为26257端;更多配置详见:启动节点

使用systemd工具

环境搭建

wget -qO- https://binaries.cockroachdb.com/cockroach-v2.0.5.linux-amd64.tgz | tar  xvz
#复制文件到`PATH`路径下
sudo cp -i cockroach-v2.0.5.linux-amd64/cockroach /usr/local/bin

#创建 `cockroach文件夹
mkdir /var/lib/cockroach

#创建用户
useradd cockroach

#移动`certs`文件夹到`cockroach`文件夹当中
mv certs /var/lib/cockroach/

#修改`cockroach`文件夹权限
chown -R cockroach.cockroach /var/lib/cockroach

准备配置模版

#非安全模式
wget -qO- https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/v2.0/prod-deployment/insecurecockroachdb.service

#安全模式
wget -qO- https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/v2.0/prod-deployment/securecockroachdb.service

非安全模式的配置模版文件内容:

[Unit]
Description=Cockroach Database cluster node
Requires=network.target
[Service]
Type=notify
WorkingDirectory=/var/lib/cockroach
ExecStart=/usr/local/bin/cockroach start --insecure --advertise-host=<node1 address> --join=<node1 address>:26257,<node2 address>:26257,<node3 address>:26257 --cache=.25 --max-sql-memory=.25
TimeoutStopSec=60
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cockroach
User=cockroach
[Install]
WantedBy=default.target

安全模式的配置模版文件内容:

[Unit]
Description=Cockroach Database cluster node
Requires=network.target
[Service]
Type=notify
WorkingDirectory=/var/lib/cockroach
ExecStart=/usr/local/bin/cockroach start --certs-dir=certs --advertise-host=<node1 address> --join=<node1 address>:26257,<node2 address>:26257,<node3 address>:26257 --cache=.25 --max-sql-memory=.25
TimeoutStopSec=60
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cockroach
User=cockroach
[Install]
WantedBy=default.target

关于配置项ExecStart的命令,涉及到的flag:

flag 简介
--advertise-host 指定IP地址或是hostname供其他节点访问该节点。相关的flag有--host,具体配置详见Networking
--join 指定集群3-5个初始化节点的地址和端口

如果集群部署在多个数据中心或是节点之间网络延迟较高,推荐使用--locality配置拓扑节点位置,这属于enterprise版本的功能,详见:Locality

其他未指定的选项采用默认配置,例如默认--store即数据库文件,为当前目录下已有或新建的cockroach-data;默认--port即节点通信和客户端访问端口,为26257端;更多配置详见:启动节点

启动CockroachDB集群

systemctl start securecockroachdb 

NOTE: systemd在节点故障的时候能够重启节点. 如果不需要自动重启,执行run systemctl stop insecurecockroachdb

Step 7: 初始化集群

分模式在本地机器执行cockroach init命令

#非安全模式
cockroach init --insecure --host=<address of any node>

#安全模式
cockroach init --certs-dir=certs --host=<address of any node>

涉及到的flags:

flag 简介
--certs-dir 指定存放ca.crtnode.crtnode.key文件的目录
--host 指定集群当中任意节点的地址

执行命令后,节点会在标准输出里打印详细信息,包括了CockroachDB版本信息、Admin界面的URl地址、供客户端访问的SQL地址。

Step 8: 测试集群

CockroachDB底层自动进行数据冗余和均衡分发,使用Gossip协议能够使每个节点在集群当中能够定位到数据。下面就该功能进行测试:

创建nodetest数据库

#非安全模式
cockroach sql --insecure --host=<address of any node>

#安全模式
cockroach sql --certs-dir=certs --host=<address of any node>

涉及到的flags:

flag 简介
--certs-dir 指定存放ca.crtnode.crtnode.key文件的目录
--host 指定集群当中任意节点的地址
CREATE DATABASE nodetest;

连接另一个节点检查nodetest数据库

#非安全模式
cockroach sql --insecure --host=<address of different node>

#安全模式
cockroach sql --certs-dir=certs --host=<address of different node>
SHOW DATABASES;
+--------------------+
|      Database      |
+--------------------+
| crdb_internal      |
| information_schema |
| nodetest           |
| pg_catalog         |
| system             |
+--------------------+
(5 rows)

Step 9: 生成测试负载

Linux下Cockroach提供了workload程序,能够对集群生成几种客户端负载,此处我们将模拟TPC-C负载。

TIPS: 全面了解CockroachDB生成的TPC-C负载,可阅读:Performance Benchmarking white paper

生成负载

wget https://edge-binaries.cockroachdb.com/cockroach/workload.LATEST | chmod 755 workload.LATEST
cp -i workload.LATEST /usr/local/bin/workload
#非安全模式
workload run tpcc \
--drop \
--init \
--duration=20m \
--tolerate-errors \
"postgresql://root@<IP ADDRESS OF LOAD BALANCER:26257/tpcc?sslmode=disable"

#安全模式
workload run tpcc \
--drop \
--init \
--duration=20m \
--tolerate-errors \
"postgresql://root@<IP ADDRESS OF LOAD BALANCER:26257/tpcc?sslmode=verify-full&sslrootcert=certs/ca.crt&sslcert=certs/client.root.crt&sslkey=certs/client.root.key"

该命令执行20分钟,初始化一个数据仓库,并使用同一个SQL连接有10个并发线程生成查询,总体上每分钟12个查询。

TIPS: 查看更多TPC-C配置,可以执行workload run tpcc --help 查看当前生成器支持的更多负载类型,可以执行workload run --help

查看集群状态

登陆集群的Admin界面,点击左方Metrics,选择SQL仪表盘,查看SQL Connection图,可以查看生成的负载通过负载均衡器均分到各个节点执行处理。

Step 10: 设置监控和报警

尽管CockroachDB有多种保障集群可用性的设计,对于集群健康和性能的持续监控仍然是有必要的,预先针对需要调查和干预的事件创建报警规则,以便出现问题的时候能够第一时间获知并及时处理。 详细的监控选项、监控事件以及警告指标,可以查看:监控和报警

Step 11: 集群扩容

选择手动方式或是使用systemd工具拓展集群。

手动方式

根据业务需要可以拓展集群节点数量,对需要加入集群的节点重复以下步骤:

wget -qO- https://binaries.cockroachdb.com/cockroach-v2.0.5.linux-amd64.tgz | tar  xvz
sudo cp -i cockroach-v2.0.5.linux-amd64/cockroach /usr/local/bin
#非安全模式
cockroach start --insecure \
--host=<node4 address> \
--locality=<key-value pairs> \
--cache=.25 \
--max-sql-memory=.25 \
--join=<node1 address>:26257,<node2 address>:26257,<node3 address>:26257 \
--background

#安全模式
cockroach start \
--certs-dir=certs \
--host=<node4 address> \
--locality=<key-value pairs> \
--cache=.25 \
--max-sql-memory=.25 \
--join=<node1 address>:26257,<node2 address>:26257,<node3 address>:26257 \
--background

使用systemd工具

根据业务需要可以拓展集群节点数量,对需要加入集群的节点重复以下步骤:

环境搭建

wget -qO- https://binaries.cockroachdb.com/cockroach-v2.0.5.linux-amd64.tgz | tar  xvz
#复制文件到`PATH`路径下
sudo cp -i cockroach-v2.0.5.linux-amd64/cockroach /usr/local/bin

#创建 `cockroach文件夹
mkdir /var/lib/cockroach

#创建用户
useradd cockroach

#移动`certs`文件夹到`cockroach`文件夹
mv certs /var/lib/cockroach/

#修改`cockroach`文件夹权限
chown -R cockroach.cockroach /var/lib/cockroach

准备配置模版

#非安全模式
wget -qO- https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/v2.0/prod-deployment/insecurecockroachdb.service

#安全模式
wget -qO- https://raw.githubusercontent.com/cockroachdb/docs/master/_includes/v2.0/prod-deployment/securecockroachdb.service

非安全模式的模版文件内容:

[Unit]
Description=Cockroach Database cluster node
Requires=network.target
[Service]
Type=notify
WorkingDirectory=/var/lib/cockroach
ExecStart=/usr/local/bin/cockroach start --insecure --advertise-host=<node1 address> --join=<node1 address>:26257,<node2 address>:26257,<node3 address>:26257 --cache=.25 --max-sql-memory=.25
TimeoutStopSec=60
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cockroach
User=cockroach
[Install]
WantedBy=default.target

安全模式的模版文件内容:

[Unit]
Description=Cockroach Database cluster node
Requires=network.target
[Service]
Type=notify
WorkingDirectory=/var/lib/cockroach
ExecStart=/usr/local/bin/cockroach start --certs-dir=certs --advertise-host=<node1 address> --join=<node1 address>:26257,<node2 address>:26257,<node3 address>:26257 --cache=.25 --max-sql-memory=.25
TimeoutStopSec=60
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=cockroach
User=cockroach
[Install]
WantedBy=default.target

关于配置项ExecStart的命令,涉及到的flag:

flag 简介
--host 指定IP地址或是hostname供客户端或其他节点访问,同时作为Admin界面里该节点的标识。如果是hostname,需要注意能被所有节点解析,如果是IP地址,需要注意该地址能被所有节点访问到。

默认情况下--host为空是将使用该机器所有网卡的IP地址.

如果需要设置内网地址供集群节点访问,同时对外能够供客户端访问,则设置--host为空,再设置--advertise-host为内网地址。
--join 指定集群3-5个初始化节点的地址和端口

Step 12: 部署业务

集群已经完成部署与测试,可以:

此外,根据业务情况可以调整集群数据冗余的副本数量,默认情况下冗余3份副本。在特定场景下可以针对数据库和表格配置不同的冗余副本数量,详见:配置复制区域