对于CockroachDB,能够很容易地在单物理节点上安装多个CockroachDB节点进行测试。集群可以分为安全模式和非安全模式,安全模式下节点之间网络通信使用TLS加密技术保障安全。

可以在一个物理节点上运行多个CockroachDB节点搭建测试环境,但在实际业务环境下不推荐这么做。将CockroachDB更加灵活地部署到多台物理机上,可以参考阅读:手动部署编排部署

Step 1: 生成安全证书

选择非安全模式则跳过本步骤。

使用cockroach cert命令

# Create a certs directory and safe directory for the CA key.
# If using the default certificate directory (`${HOME}/.cockroach-certs`), make sure it is empty.
mkdir certs

mkdir my-safe-directory

# Create the CA key pair:
cockroach cert create-ca --certs-dir=certs --ca-key=my-safe-directory/ca.key

# Create a client key pair for the root user:
cockroach cert create-client root --certs-dir=certs --ca-key=my-safe-directory/ca.key

# Create a key pair for the nodes:
cockroach cert create-node localhost $(hostname) --certs-dir=certs --ca-key=my-safe-directory/ca.key

Step 2: 启动节点1

# 非安全模式
cockroach start --insecure --host=localhost

# 安全模式:
cockroach start --certs-dir=certs --host=localhost --http-host=localhost
CockroachDB node starting at 2018-08-13 15:10:52.34274101 +0000 UTC
build:      CCL v2.0.5 @ 2018/08/13 14:48:26 (go1.10)
admin:      http://localhost:8080
sql:        postgresql://root@localhost:26257?sslmode=disable
logs:       cockroach-data/logs
store[0]:   path=cockroach-data
status:     initialized new cluster
clusterID:  {dab8130a-d20b-4753-85ba-14d8956a294c}
nodeID:     1

默认当前目录下创建cockroach-data文件夹,CockroachDB在该节点的数据将存放在该文件夹下;

Step 3: 添加节点

现在集群已经运行起来,但是集群只有一个节点,此时用户可以开始连接数据库并进行操作。在实际业务部署中,用户需要部署大于3个节点才能充分利用CockroachDB的自动冗余副本、数据均衡和集群容错的特性。

开启新终端,添加节点2

非安全模式:

cockroach start --insecure --store=node2 --host=localhost --port=26258 --http-port=8081 --join=localhost:26257

安全模式:

cockroach start --certs-dir=certs --store=node2 --host=localhost --port=26258 --http-port=8081 --http-host=localhost --join=localhost:26257

TIPS: --join 代表当前启动节点要加入的节点(地址为localhost:26257)所在的集群。由于所有的节点在同一物理机器上,需要手动地将--port--store--http-port指定为不同端口和地址以避免冲突。

开启另一个新终端,添加节点3

非安全模式:

cockroach start --insecure --store=node3 --host=localhost --port=26259 --http-port=8082 --join=localhost:26257

安全模式:

cockroach start --certs-dir=certs --store=node3 --host=localhost --port=26259 --http-port=8082 --http-host=localhost --join=localhost:26257

Step 4: 验证集群可用性

连接节点1,启动交互式shell

非安全模式:

cockroach sql --insecure

安全模式:

cockroach sql --certs-dir=certs

执行SQL语句:

CREATE DATABASE bank;
CREATE TABLE bank.accounts (id INT PRIMARY KEY, balance DECIMAL);
INSERT INTO bank.accounts VALUES (1, 1000.50);
SELECT * FROM bank.accounts;
+----+---------+
| id | balance |
+----+---------+
|  1 |  1000.5 |
+----+---------+
(1 row)

连接节点2,启动交互式shell

非安全模式:

cockroach sql --insecure --port=26258

安全模式:

cockroach sql --certs-dir=certs --port=26258

执行SQL语句:

SELECT * FROM bank.accounts;
+----+---------+
| id | balance |
+----+---------+
|  1 |  1000.5 |
+----+---------+
(1 row)

可见节点1和节点2同样SQL查询输出的内容一致。

Step 5: 监控集群

通过Admin界面

网页URL:http://localhost:8080

图片

默认情况下,CockroachDB对一份数据自动冗余3份副本到集群当中,均衡分布到各个节点,可在Replicas per Node页查看各节点数据冗余情况。

图片

NOTE: 对于单一物理机部署多个节点,容量指标(Capacity metrics)数值可能不准确,详见:limitation
TIPS: 关于数据冗余、均衡分布、集群容错的更多介绍,可以查看:数据复制自动负载均衡容错及恢复

Step 6: 停止集群

停止节点1

在对应终端使用Ctrl+C

查看集群情况

此时另外两个节点仍然存活。为了验证集群数据的容错性,可以开启交互式shell查看数据情况。 非安全模式:

cockroach sql --insecure --port=26258

安全模式:

cockroach sql --certs-dir=certs --port=26258

执行SQL语句:

SELECT * FROM bank.accounts;
+----+---------+
| id | balance |
+----+---------+
|  1 |  1000.5 |
+----+---------+
(1 row)

停止节点2和节点3

在对应终端使用Ctrl+C

NOTE: 对于节点3,可能需要花大约1min左右的时间去终止程序。原因是最后只剩下一个节点在集群当中的时候,由于已经丧失了集群当中冗余副本的绝大多数(此情况下是2/3),集群不再允许操作。如需加速终止程序的进程,可以尝试多次Ctrl+C操作。

如不进行Step 7 重启集群的操作,不再需要节点数据,可以删除对应的数据库文件夹。

rm -rf cockroach-data node2 node3

Step 7: 重启集群

为了重启集群,需要确保拥有集群2/3节点的数据库文件夹。

重启节点1

非安全模式:

cockroach start --insecure --host=localhost

安全模式:

cockroach start --certs-dir=certs --host=localhost --http-host=localhost

TIPS: 当前集群只有一个节点,集群不可操作直至第二个节点加入集群

重启节点2

非安全模式:

cockroach start --insecure --store=node2 --host=localhost --port=26258 --http-port=8081 --join=localhost:26257

安全模式:

cockroach start --certs-dir=certs --store=node2 --host=localhost --port=26258 --http-port=8081 --http-host=localhost --join=localhost:26257

重启节点3

非安全模式:

cockroach start --insecure --store=node3 --host=localhost --port=26259 --http-port=8082 --join=localhost:26257

安全模式:

cockroach start --certs-dir=certs --store=node3 --host=localhost --port=26259 --http-port=8082 --http-host=localhost --join=localhost:26257