1. 程式人生 > >在單機上構建 secure 多節點CockroachDB叢集

在單機上構建 secure 多節點CockroachDB叢集

       本文將向大家介紹如何在一臺機器上(可以是物理機,也可以是一臺虛擬機器)建立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://[email protected]: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://[email protected]: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://[email protected]: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[n]

儲存節點資料的目錄

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 &