在單機上構建 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 &