您的位置:首页 > 其它

在单机上构建 secure 多节点CockroachDB集群

2018-10-06 16:15 423 查看

       本文将向大家介绍如何在一台机器上(可以是物理机,也可以是一台虚拟机)创建secure多节点CockroachDB集群(在示例中我们将创建一个具有3节点的CRDB数据库集群)。这里所说的secure是指集群的各节点之间以及client与集群节点之间使用TLS证书对通信进行加密。在生产环境下建议创建secure多节点CockroachDB集群。

环境说明

一个虚拟机:8G Mem 、4 VCores

操作系统:CentOS 7.4

操作系统用户: crdb  用户组:newsql 该用户具有sudo权限(假设读者已经掌握在Linux上创建用户和组以及设置权限的方法,本文不进行描述)

CockroachDB版本:2.0.6

 

下面开始介绍具体的创建方法

      1. 创建目录

我们需要在操作系统的文件系统中创建一个目录,用于存放CRDB使用的文件

$ sudo mkdir /data/crdb

$ sudo chown crdb:newsql -R /data/crdb

 

     2. 安装CRDB

$ cd /tmp

$ wget https://binaries.cockroachdb.com/cockroach-v2.0.6.linux-amd64.tgz

$ tar xvfz cockroach-v2.0.6.linux-amd64.tgz

$ sudo mv cockroach-v2.0.6.linux-amd64/cockroach  /usr/local/bin

$ rm -Rf cockroach-v2.0.6.linux-amd64

 

      3. 创建安全证书

         (1) 创建CA证书和key

     $ mkdir /data/crdb/certs /data/crdb/my-safe-directory

     $ cockroach cert create-ca --certs-dir=/data/crdb/certs --ca-key=/data/crdb/my-safe-directory/ca.key

         (2) 为root用户(CockroachDB自动具有的一个数据库用户) 创建一个client key对

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

         (3)为集群中的每个节点创建一个key对

               由于这个示例的所有节点都在一台机器上,所以只需要为一个节点生成证书。

       $ cockroach cert create-node \
     localhost \
     0.0.0.0 \
     --certs-dir=/data/crdb/certs \
     --ca-key=/data/crdb/my-safe-directory/ca.key

 

      4. 启动第一个节点

         使用cockroach start命令启动第一个节点:

$ cockroach start --certs-dir=/data/crdb/certs --store="/data/crdb/node1" --host=0.0.0.0 --port=26257 \

       --http-port=8080 --join=0.0.0.0:26257,0.0.0.0:26258,0.0.0.0:26259 &

命令参数说明:

参  数

描 述

--certs-dir

指定TLS证书的目录位置,cockroach命令将会查找安全证书以加密通讯。

--store

指定本地目录,用于存储节点的数据和日志

--host

指定节点的主机名或IP地址,这个地址用于节点间通讯或者客户端访问节点时使用。

--port

指定节点的通讯端口,这个端口用于节点间通讯或者客户端访问节点时使用。

这个参数的缺省值是26257。

--http-port

指定CockroachDB admin UI监听的端口。这个参数的缺省值是8080。

--join

创建CockroachDB集群时,所有初始节点的地址和TCP端口。

在启动所有初始节点时,都需要加上这个参数,并且参数值应当相同。

 

 

 

注意:

       可以执行cockroach start --help查看命令的参数描述,也可以执行cockroach --help查看查看所有的命令参数描述。

 

      5. 启动另两个节点

         使用cockroach start命令能够再启动多个节点,这些节点是第1个节点启动时--join参数中指定的初始节点(除第1个节点之外的节点)。

--启动第2个节点

$ cockroach start --certs-dir=/data/crdb/certs --store="/data/crdb/node2" --host=0.0.0.0 --port=26258 \

       --http-port=8081 --join=0.0.0.0:26257,0.0.0.0:26258,0.0.0.0:26259 &

--启动第3个节点

$ cockroach start --certs-dir=/data/crdb/certs --store="/data/crdb/node3" --host=0.0.0.0 --port=26259\

  --http-port=8082 --join=0.0.0.0:26257,0.0.0.0:26258,0.0.0.0:26259 &

 

      6. 初始化CockroachDB集群

      在前面的步骤中,我们执行带有--jon参数的cockroach start只是启动了节点,但是这些节点还不能正常工作,需要执行初始化后CRDB集群才完成创建,对外正常工作。

       (1) 执行cockroach init命令初始化集群

  $ cockroach init --certs-dir=/data/crdb/certs 

  你将会看到输出的信息中如果出现如下信息,表示集群初始化成功:

Cluster successfully initialized

       (2)下面是初始化时3个节点显示的完整输出:

  $ CockroachDB node starting at 2018-10-06 08:06:12.445002685 +0000 UTC (took 79.4s)
build:               CCL v2.0.6 @ 2018/10/01 13:59:40 (go1.10)
admin:               https://0.0.0.0:8080
sql:                 postgresql://root@0.0.0.0:26257?sslcert=%2Fdata%2Fcrdb%2Fcerts%2Fclient.root.crt&sslkey=%2Fdata%2Fcrdb%2Fcerts%2Fclient.root.key&sslmode=verify-full&sslrootcert=%2Fdata%2Fcrdb%2Fcerts%2Fca.crt
logs:                /data/crdb/node1/logs
temp dir:            /data/crdb/node1/cockroach-temp076844517
external I/O path:   /data/crdb/node1/extern
store[0]:            path=/data/crdb/node1
status:              initialized new cluster
clusterID:           33a31243-a960-438f-8fd4-62ebb9646437
nodeID:              1

 

CockroachDB node starting at 2018-10-06 08:06:12.863116011 +0000 UTC (took 40.3s)
build:               CCL v2.0.6 @ 2018/10/01 13:59:40 (go1.10)
admin:               https://0.0.0.0:8082
sql:                 postgresql://root@0.0.0.0:26259?sslcert=%2Fdata%2Fcrdb%2Fcerts%2Fclient.root.crt&sslkey=%2Fdata%2Fcrdb%2Fcerts%2Fclient.root.key&sslmode=verify-full&sslrootcert=%2Fdata%2Fcrdb%2Fcerts%2Fca.crt
logs:                /data/crdb/node3/logs
temp dir:            /data/crdb/node3/cockroach-temp185379391
external I/O path:   /data/crdb/node3/extern
store[0]:            path=/data/crdb/node3
status:              initialized new node, joined pre-existing cluster
clusterID:           33a31243-a960-438f-8fd4-62ebb9646437
nodeID:              2

 

CockroachDB node starting at 2018-10-06 08:06:12.954463437 +0000 UTC (took 58.4s)
build:               CCL v2.0.6 @ 2018/10/01 13:59:40 (go1.10)
admin:               https://0.0.0.0:8081
sql:                 postgresql://root@0.0.0.0:26258?sslcert=%2Fdata%2Fcrdb%2Fcerts%2Fclient.root.crt&sslkey=%2Fdata%2Fcrdb%2Fcerts%2Fclient.root.key&sslmode=verify-full&sslrootcert=%2Fdata%2Fcrdb%2Fcerts%2Fca.crt
logs:                /data/crdb/node2/logs
temp dir:            /data/crdb/node2/cockroach-temp813995751
external I/O path:   /data/crdb/node2/extern
store[0]:            path=/data/crdb/node2
status:              initialized new node, joined pre-existing cluster
clusterID:           33a31243-a960-438f-8fd4-62ebb9646437
nodeID:              3

 

下表是输出字段的描述:

字段

描述

build

运行的CockroachDB版本号

admin

Admin UI访问的URL地址

sql

客户端连接CockroachDB的URL

logs

包含日志文件的文件系统目录

store

存储节点数据的目录

status

节点的状态。可能的状态有:

(1) “initialized new cluster”:集群中头一个节点(在执行init 之前启动的第一个节点)。例如:上面输出的nodeID为1的节点。

(2) “initialized new node, joined pre-existing cluster”:第一次加入集群的节点,--join参数指定的除头一个启动的接节点之外的节点都是这个状态。例如:上面输出的节点2和3.

(3) “restarted pre-existing node”:重新加入集群的节点会显示这个状态。

clusterID

集群的唯一标识

nodeID

节点的唯一标识

 

  7. 检验数据库集群状态

  (1)使用cockroach node status命令检查集群中节点的状态(本示例crdb数据库集群 是由3个节点组成):

 $ cockroach node status --certs-dir=/data/crdb/certs

 

  (2)使用cockroach sql命令查询数据库情况:

$ cockroach sql --certs-dir=/data/crdb/certs --port=26257 --execute="SHOW DATABASES;"

 

  (3)访问Admin UI

        通过访问CRDB集群中的任何一个节点的http port端口(在启动节点时--http-port参数制定),我们可以看到用于管理和监控CRDB的web页面。例如:

        https://192.168.1.171:8081  

  下图是显示的Admin UI的界面:

       

 

   到此,我们就在一台机器上构建好具有3个节点的CockroachDB集群了。最后介绍一下停止和启动CRDB集群的方法:

## 停止CRDB集群

$ pkill cockroach

## 启动CRDB集群

编写一个sh脚本(假设叫做start-crdb-3-secure.sh),方便以后每次启动创建好的这个集群。脚本内容如下:

#!/bin/bash

#start first node
cockroach start \
--certs-dir=/data/crdb/certs \
--store="/data/crdb/node1" \
--host=0.0.0.0 \
--port=26257 \
--http-port=8080 \
--join=0.0.0.0:26257,0.0.0.0:26258,0.0.0.0:26259 &

#start second node
cockroach start \
--certs-dir=/data/crdb/certs \
--store="/data/crdb/node2" \
--host=0.0.0.0 \
--port=26258 \
--http-port=8081 \
--join=0.0.0.0:26257,0.0.0.0:26258,0.0.0.0:26259 &

#start third node
cockroach start \
--certs-dir=/data/crdb/certs \
--store="/data/crdb/node3" \
--host=0.0.0.0 \
--port=26259 \
--http-port=8082 \
--join=0.0.0.0:26257,0.0.0.0:26258,0.0.0.0:26259 &

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: