如何搭建一個(gè)可用于生產(chǎn)環(huán)境的 CockroachDB 集群

用于生產(chǎn)環(huán)境的 CockroachDB 集群搭建教程

目錄


本文將介紹如何搭建一個(gè)可用于生產(chǎn)環(huán)境的 CockroachDB 集群惑折,目標(biāo)是盡可能利用服務(wù)器資源匪傍、保證數(shù)據(jù)安全瑟慈,因此搭建過程偏向繁瑣揭芍,并不是一個(gè)簡(jiǎn)明的 demo 教程陆爽。如果讀者只是想快速搭建一個(gè)實(shí)驗(yàn)環(huán)境吟秩,只需要根據(jù)官方文檔介紹的如何快速搭建一個(gè)本地集群來操作即可仆百,并不需要閱讀本文,否則會(huì)把時(shí)間浪費(fèi)在各種與功能無關(guān)的細(xì)節(jié)之中堵腹。此外本教程并沒有采用 Docker炸站,因?yàn)?CockroachDB 采用 golang 開發(fā),沒有環(huán)境依賴的包袱疚顷,使用 Docker 并不會(huì)使得搭建過程簡(jiǎn)化旱易。

關(guān)于 CockroachDB 的介紹這里不做贅述,可參考:

環(huán)境準(zhǔn)備

為了演示搭建過程笆檀,我準(zhǔn)備了如下機(jī)器:

  • 192.168.100.21
  • 192.168.100.22
  • 192.168.100.23
  • 192.168.100.24

每臺(tái)機(jī)器 2 個(gè) CPU 核心忌堂,4G 內(nèi)存,20G 的磁盤酗洒,顯然士修,這些是我用虛擬機(jī)構(gòu)建的機(jī)器妄迁,僅用于演示,實(shí)際生產(chǎn)環(huán)境應(yīng)當(dāng)遠(yuǎn)遠(yuǎn)高于這個(gè)配置李命。機(jī)器安裝了 CentOS 7 操作系統(tǒng),由于 CockroachDB 并沒有環(huán)境依賴箫老,所以理論上任何 Linux 發(fā)行版均可封字。

事實(shí)上 CockroachDB 也支持 Windows 和 Mac,但由于官方強(qiáng)烈不建議在 Windows 系統(tǒng)上部署生產(chǎn)環(huán)境耍鬓,而據(jù)我所知使用 Mac 系統(tǒng)生產(chǎn)環(huán)境的案例很少阔籽,所以這里默認(rèn)讀者是使用 Linux 作為生產(chǎn)環(huán)境的。

各機(jī)器之間網(wǎng)絡(luò)通信正常牲蜀,防火墻開啟了 26257 端口和 8080 端口笆制。不同發(fā)行版的 Linux 防火墻配置方式不同,讀者可根據(jù)實(shí)際使用的 Linux 發(fā)行版進(jìn)行操作涣达。以 CentOS 7 為例:

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=26257/tcp --permanent
firewall-cmd --reload
systemctl restart firewalld

文件準(zhǔn)備

首先我們做個(gè)約定:我們將 CockroachDB 所有的相關(guān)文件放在 /opt/cockroach 下面在辆,該目錄下,我們準(zhǔn)備 bin度苔、etc匆篓、dat、log 四個(gè)文件夾寇窑,分別放置可執(zhí)行文件鸦概、配置文件、數(shù)據(jù)文件甩骏、日志文件窗市。

官方下載頁獲取最新版的 CockroachDB,我得到的是 https://binaries.cockroachdb.com/cockroach-v2.0.0.linux-amd64.tgz饮笛。

登錄各個(gè)機(jī)器咨察,在每臺(tái)機(jī)器上執(zhí)行如下命令:

cd /opt
mkdir cockroach
cd cockroach
mkdir bin etc log dat
wget https://binaries.cockroachdb.com/cockroach-v2.0.0.linux-amd64.tgz
tar xzvf cockroach-v2.0.0.linux-amd64.tgz
mv cockroach-v2.0.0.linux-amd64/cockroach bin/
rm cockroach-v2.0.0.linux-amd64 cockroach-v2.0.0.linux-amd64.tgz -rf

此時(shí) /opt/cockroach 的目錄結(jié)構(gòu)應(yīng)當(dāng)如下:

├── bin
│   └── cockroach
├── dat
├── etc
└── log

生成安全證書

為了開啟各節(jié)點(diǎn)之間的安全傳輸,我們需要生成多個(gè)安全證書缎浇。

首先需要生成一個(gè)根證書扎拣,這個(gè)根證書所有的節(jié)點(diǎn)必須是一樣的,所有我們需要在其中一臺(tái)機(jī)器生成根證書素跺,再拷貝到其他節(jié)點(diǎn)上二蓝。

在其中一臺(tái)機(jī)器上,比如 192.168.100.21 上指厌,執(zhí)行如下命令:

cd /opt/cockroach/
mkdir -p etc/certs etc/my-safe-directory
bin/cockroach cert create-ca --certs-dir=etc/certs --ca-key=etc/my-safe-directory/ca.key

這時(shí)候會(huì)生成根證書的鑰匙對(duì):etc/certs/ca.crtetc/my-safe-directory/ca.key刊愚。這兩個(gè)文件非常重要,需要妥善保管踩验。其中由于 ca.key 是私鑰鸥诽,是需要保密的商玫,所以完成集群搭建后,需要從各個(gè)節(jié)點(diǎn)上刪除 ca.key牡借,避免私鑰泄露拳昌。以后需要擴(kuò)容添加節(jié)點(diǎn)時(shí),再取出保管好的 ca.crt 和 ca.key 進(jìn)行使用钠龙。

將 192.168.100.21 的 /opt/cockroach/etc/ 路徑下的內(nèi)容拷貝到其他節(jié)點(diǎn)相同的位置炬藤,各種手段均可,這里以 scp 為例:

cd /opt/cockroach/etc/
scp -r * root@192.168.100.22:/opt/cockroach/etc/
scp -r * root@192.168.100.23:/opt/cockroach/etc/
scp -r * root@192.168.100.24:/opt/cockroach/etc/

完成后碴里,每臺(tái)機(jī)器的 /opt/cockroach/ 目錄下的結(jié)構(gòu)應(yīng)該是這樣:

├── bin
│   └── cockroach
├── dat
├── etc
│   ├── certs
│   │   └── ca.crt
│   └── my-safe-directory
│       └── ca.key
└── log

接下來要用一點(diǎn) shell 技巧沈矿,為了方便后續(xù)的操作,可以為每個(gè)終端會(huì)話設(shè)置一個(gè)變量咬腋,變量的值為所在機(jī)器的 IP羹膳。網(wǎng)上有很多“一句 shell 命令獲取本機(jī) IP”的方法,但往往不能通用根竿,所以如果找不到用命令獲取主機(jī) IP 的方法陵像,可以手動(dòng)指定。所以我就不在這里強(qiáng)行炫技了犀填,就用笨辦法蠢壹。

在每臺(tái)機(jī)器上執(zhí)行 HOST_IP="機(jī)器的IP"

# 在 192.168.100.21 上
HOST_IP="192.168.100.21"
# 在 192.168.100.22 上
HOST_IP="192.168.100.22"
# 在 192.168.100.23 上
HOST_IP="192.168.100.23"
# 在 192.168.100.24 上
HOST_IP="192.168.100.24"

完成后,開始為每個(gè)節(jié)點(diǎn)頒發(fā)安全證書九巡,生成時(shí)需要指定被授予的主機(jī)的網(wǎng)絡(luò)地址图贸,可以是域名也可以是 IP 地址,這里使用 IP冕广。如果某個(gè)主機(jī)嘗試使用不是為其地址頒發(fā)的證書疏日,那其他主機(jī)會(huì)不承認(rèn)其合法性,拒絕與其通信撒汉。

在每臺(tái)機(jī)器上執(zhí)行:

cd /opt/cockroach/
bin/cockroach cert create-node ${HOST_IP} --certs-dir=etc/certs --ca-key=etc/my-safe-directory/ca.key

上述命令無需修改沟优,可直接在各機(jī)器上運(yùn)行,不同機(jī)器上因?yàn)?HOST_IP 變量值不同睬辐,生成的證書也是不同的挠阁。

成功執(zhí)行后,etc/certs 下會(huì)創(chuàng)建 node.crt溯饵、node.key 兩個(gè)文件侵俗,有了這兩個(gè)文件,節(jié)點(diǎn)之間便可以安全通信了丰刊。

此時(shí)每臺(tái)機(jī)器 /opt/cockroach 的目錄結(jié)構(gòu)應(yīng)當(dāng)如下:

├── bin
│   └── cockroach
├── dat
├── etc
│   ├── certs
│   │   ├── ca.crt
│   │   ├── node.crt
│   │   └── node.key
│   └── my-safe-directory
│       └── ca.key
└── log

啟動(dòng)第一個(gè)節(jié)點(diǎn)

首先隘谣,需要選一臺(tái)機(jī)器起一個(gè)“創(chuàng)世節(jié)點(diǎn)”,該節(jié)點(diǎn)不是加入已有集群啄巧,而是自立門戶寻歧,創(chuàng)建一個(gè)新集群(雖然剛開始只有它自己一個(gè)節(jié)點(diǎn))掌栅。

注意,由于 CockroachDB 是完全去中心化的码泛,節(jié)點(diǎn)之間完全對(duì)等猾封,所以這個(gè)創(chuàng)世節(jié)點(diǎn)并不會(huì)因?yàn)槠洹霸稀鄙矸荻鴵碛惺裁刺厥獾膬?yōu)待或責(zé)任。在其他節(jié)點(diǎn)完成啟動(dòng)后噪珊,創(chuàng)世節(jié)點(diǎn)即使宕機(jī)忘衍,也不會(huì)對(duì)整個(gè)集群造成什么特殊的影響。

隨便選一臺(tái)機(jī)器卿城,執(zhí)行如下命令……

錯(cuò)!我們不可以靠在終端里執(zhí)行命令來啟動(dòng)節(jié)點(diǎn)铅搓,否則當(dāng)節(jié)點(diǎn)宕機(jī)需要重啟時(shí)瑟押,維護(hù)人員(可能已經(jīng)不是你了)很難知道當(dāng)時(shí)啟動(dòng)節(jié)點(diǎn)是執(zhí)行什么命令,指定什么參數(shù)星掰,不方便排查問題和快速重啟多望。

所以,我們應(yīng)當(dāng)將啟動(dòng)命令寫入腳本氢烘,靠執(zhí)行腳本來啟動(dòng)節(jié)點(diǎn)怀偷。

隨便選一臺(tái)機(jī)器,比如 192.168.100.21播玖,執(zhí)行如下命令創(chuàng)建啟動(dòng)腳本:

cd /opt/cockroach/
echo '''
#!/bin/bash
set -e
HOST_IP="192.168.100.21"
/opt/cockroach/bin/cockroach start \
  --background \
  --host=${HOST_IP} \
  --port=26257 \
  --http-host=0.0.0.0 \
  --http-port=8080 \
  --certs-dir=/opt/cockroach/etc/certs \
  --store=/opt/cockroach/dat \
  --log-dir=/opt/cockroach/log \
  --pid-file=/opt/cockroach/pid \
  --cache=.50 \
  --max-sql-memory=.25  
''' > start.sh
chmod +x start.sh

各個(gè)啟動(dòng)參數(shù)的含義詳見 Start a Node 椎工。

這樣以后我們就可以通過執(zhí)行 start.sh 來啟動(dòng)集群了:

cd /opt/cockroach/
./start.sh

稍等幾秒,看到了如下信息便說明啟動(dòng)成功:

CockroachDB node starting at 2018-04-14 05:48:59.784913954 +0000 UTC (took 3.5s)
build:               CCL v2.0.0 @ 2018/04/03 20:56:09 (go1.10)
admin:               https://0.0.0.0:8080
sql:                 postgresql://root@192.168.100.21:26257?sslmode=verify-full&sslrootcert=%2Fopt%2Fcockroach%2Fetc%2Fcerts%2Fca.crt
logs:                /opt/cockroach/log
temp dir:            /opt/cockroach/dat/cockroach-temp482110937
external I/O path:   /opt/cockroach/dat/extern
store[0]:            path=/opt/cockroach/dat
status:              initialized new cluster
clusterID:           3730a81d-2dec-4ef1-92c9-b2a6f636b0b4
nodeID:              1

這個(gè)是否可以用瀏覽器訪問 192.168.100.21 的 8080 端口蜀踏,應(yīng)當(dāng)看到如下界面:

[圖片上傳失敗...(image-febee6-1718951509654)]

注意维蒙,由于使用了自簽發(fā)證書,瀏覽器可能報(bào)“您的連接不是私密連接”的警告果覆,直接忽略即可颅痊。

[圖片上傳失敗...(image-a5ac20-1718951509654)]

啟動(dòng)其他節(jié)點(diǎn)

繼續(xù)啟動(dòng)其他節(jié)點(diǎn),啟動(dòng)命令幾乎一樣局待,只有兩處不同斑响,一是 HOST_IP 變量需要改為所在機(jī)器的 IP,二是啟動(dòng)參數(shù)添加一條 --join钳榨,讓新起的節(jié)點(diǎn)加入已有集群而不是自立門戶舰罚。

在其他機(jī)器上執(zhí)行如下命令創(chuàng)建啟動(dòng)腳本,注意修改HOST_IP="機(jī)器的 IP"

cd /opt/cockroach/
echo '''
#!/bin/bash
set -e
HOST_IP="機(jī)器的 IP"
/opt/cockroach/bin/cockroach start \
  --background \
  --host=${HOST_IP} \
  --port=26257 \
  --http-host=0.0.0.0 \
  --http-port=8080 \
  --certs-dir=/opt/cockroach/etc/certs \
  --store=/opt/cockroach/dat \
  --log-dir=/opt/cockroach/log \
  --pid-file=/opt/cockroach/pid \
  --cache=.50 \
  --max-sql-memory=.25 \
  --join=192.168.100.21:26257
''' > start.sh
chmod +x start.sh

這里有一個(gè)問題:--join 參數(shù)只指定了一個(gè) IP重绷,那么如果該 IP 所指的機(jī)器掛了沸停,其他節(jié)點(diǎn)豈不是不能 join 了?解釋一下昭卓,該參數(shù)指定的 IP 只是在新節(jié)點(diǎn)加入時(shí)充當(dāng)一個(gè)“引路人”的角色愤钾,一旦新節(jié)點(diǎn)成功加入集群瘟滨,將會(huì)獲悉集群中所有節(jié)點(diǎn)的地址,并存入本地能颁,至此杂瘸,--join 參數(shù)的使命也都完成了,“引路人”也成了“陌路人”伙菊,從此生死不再相關(guān)败玉。當(dāng)該新節(jié)點(diǎn)因故宕機(jī),再次啟動(dòng)時(shí)镜硕,會(huì)從保存的數(shù)據(jù)中讀取其他節(jié)點(diǎn)信息运翼,重新加入集群,并不會(huì)受 --join 參數(shù)影響兴枯,即使不寫 --join 參數(shù)血淌,節(jié)點(diǎn)也可以正確加入集群,而不是成為創(chuàng)世節(jié)點(diǎn)(除非清空該節(jié)點(diǎn)的數(shù)據(jù)财剖,位于 dat 下)悠夯。那如果“引路人”宕機(jī)或者退役了,又需要加入新節(jié)點(diǎn)時(shí)怎么辦躺坟,好辦哇沦补,集群中所有活著的節(jié)點(diǎn)就可以是“引路人”,隨便指定一臺(tái)不就得了咪橙。

在其他機(jī)器上執(zhí)行 start.sh 啟動(dòng)節(jié)點(diǎn)夕膀,完成后訪問任意一臺(tái)機(jī)器的 8080 端口,應(yīng)當(dāng)看到如下界面:

[圖片上傳失敗...(image-4bdda1-1718951509654)]

確認(rèn)所有節(jié)點(diǎn)都已經(jīng)正常加入集群美侦,且能正常工作店诗。一個(gè)重要的評(píng)判標(biāo)準(zhǔn)是看每個(gè)節(jié)點(diǎn)是否都擁有了一定量的數(shù)據(jù)備份,見圖中紅框標(biāo)記部分音榜。如果發(fā)現(xiàn)有些節(jié)點(diǎn)的數(shù)據(jù)備份數(shù)為 0庞瘸,說明該節(jié)點(diǎn)與其他節(jié)點(diǎn)的同步操作是有問題的,可以通過排查該節(jié)點(diǎn) /opt/cockroach/log 路徑下的日志文件來確認(rèn)問題赠叼。

此時(shí)每臺(tái)機(jī)器 /opt/cockroach 的目錄結(jié)構(gòu)應(yīng)當(dāng)如下:

├── bin
│   └── cockroach
├── dat
│   ├── 000003.log
│   ├── auxiliary
│   ├── cockroach.advertise-addr
│   ├── COCKROACHDB_VERSION
│   ├── cockroach.http-addr
│   ├── cockroach.listen-addr
│   ├── cockroach-temp155584461
│   │   ├── 000003.log
│   │   ├── auxiliary
│   │   ├── COCKROACHDB_VERSION
│   │   ├── CURRENT
│   │   ├── IDENTITY
│   │   ├── LOCK
│   │   ├── MANIFEST-000001
│   │   ├── OPTIONS-000005
│   │   └── TEMP_DIR.LOCK
│   ├── CURRENT
│   ├── IDENTITY
│   ├── LOCK
│   ├── MANIFEST-000001
│   ├── OPTIONS-000005
│   └── temp-dirs-record.txt
├── etc
│   ├── certs
│   │   ├── ca.crt
│   │   ├── node.crt
│   │   └── node.key
│   └── my-safe-directory
│       └── ca.key
├── log
│   ├── cockroach.log -> cockroach.vm21.root.2018-04-14T06_32_10Z.001748.log
│   ├── cockroach.vm21.root.2018-04-14T06_32_10Z.001740.log
│   └── cockroach.vm21.root.2018-04-14T06_32_10Z.001748.log
├── pid
└── start.sh

生成客戶端安全證書

為了能使用 cockroach sql 命令連接到集群進(jìn)行 SQL 操作擦囊,我們需要生成客戶端安全證書。這里說明一下嘴办,這里的“客戶端”僅指 cockroach sql 命令瞬场。而編寫代碼通過驅(qū)動(dòng)連接數(shù)據(jù)庫,或使用適配 PostgreSQL 的終端訪問數(shù)據(jù)庫時(shí)涧郊,只需要提供用戶名和密碼即可贯被,不需要所謂的客戶端安全證書。

那為什么還要生成客戶端安全證書呢?因?yàn)槟壳跋到y(tǒng)里只用一個(gè) root 用戶(不是 linux 的 root 用戶彤灶,兩者僅名字相同)看幼,而該用戶是沒有密碼的,只能通過安全證書登錄幌陕。所以如果我想新建一個(gè)可以通過用戶名诵姜、密碼登錄的普通用戶,得先通過 root 用戶連接數(shù)據(jù)庫來操作搏熄,這樣一來為 root 用戶創(chuàng)建安全證書就是必要的了棚唆。

不同于節(jié)點(diǎn)的安全證書,客戶端安全證書只需要指定頒發(fā)給的用戶名心例,與主機(jī)無關(guān)宵凌。所以只在某一臺(tái)機(jī)器上創(chuàng)建客戶端安全證書即可,并在該機(jī)器上連接數(shù)據(jù)庫進(jìn)行操作止后,無需拷貝到其他機(jī)器摆寄。且為了安全,完成所需要的操作后坯门,應(yīng)當(dāng)將客戶端安全證書備份到別的安全的地方,并刪除節(jié)點(diǎn)上的客戶端證書逗扒。因?yàn)檫@樣一來古戴,即使節(jié)點(diǎn)被黑客攻入,由于沒有客戶端證書矩肩,黑客也無法登錄數(shù)據(jù)庫现恼,雖然不能阻止黑客摧毀數(shù)據(jù),也至少能避免數(shù)據(jù)庫數(shù)據(jù)泄露黍檩。

隨便選一臺(tái)機(jī)器叉袍,比如 192.168.100.21,執(zhí)行如下命令創(chuàng)建客戶端安全證書:

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

完成后會(huì)在 etc/certs 下生成 client.root.crt 和 client.root.key 兩個(gè)文件刽酱,我們可以將這兩個(gè)文件同之前的 ca.crt 和 ca.key 一起喳逛,保存到安全的位置。

下面我們就可以在 192.168.100.21 上通過 cockroach sql 登錄數(shù)據(jù)庫了:

cd /opt/cockroach/
bin/cockroach sql --certs-dir=etc/certs --host 192.168.100.21 --user=root

應(yīng)該看到如下內(nèi)容:

# Welcome to the cockroach SQL interface.
# All statements must be terminated by a semicolon.
# To exit: CTRL + D.
#
# Server version: CockroachDB CCL v2.0.0 (x86_64-unknown-linux-gnu, built 2018/04/03 20:56:09, go1.10) (same version as client)
# Cluster ID: 3730a81d-2dec-4ef1-92c9-b2a6f636b0b4
#
# Enter \? for a brief introduction.
#
warning: no current database set. Use SET database = <dbname> to change, CREATE DATABASE to make a new database.
root@192.168.100.21:26257/>

這時(shí)候棵里,我們創(chuàng)建一個(gè)數(shù)據(jù)庫 database1润文,并創(chuàng)建一個(gè)用戶 user1。user1 可以只通過用戶名殿怜、密碼來登錄數(shù)據(jù)庫典蝌,且權(quán)限被局限在 database1 中:

CREATE DATABASE database1;
CREATE USER user1 WITH PASSWORD 'user1_123654';
GRANT ALL ON DATABASE database1 TO user1;

可以在 SQL Statements 找到各種 SQL 語句的使用說明。

完成后輸入 \q 退出會(huì)話头谜。

備份骏掀、清理證書私鑰

完成后我們需要備份 192.168.100.21 的根證書秘鑰對(duì)和客戶端證書秘鑰對(duì),保存在安全的地方,以后需要添加新節(jié)點(diǎn)或需要使用 root 用戶操作時(shí)截驮,再取出使用笑陈。

需要備份的文件列表:

  • /opt/cockroach/etc/certs/client.root.crt
  • /opt/cockroach/etc/certs/client.root.key
  • /opt/cockroach/etc/certs/ca.crt
  • /opt/cockroach/etc/my-safe-directory/ca.key

備份完成后,刪除每臺(tái)機(jī)器上的如下文件(如果有的話):

cd /opt/cockroach/etc/
rm -f certs/client.root.crt
rm -f certs/client.root.key
rm -rf my-safe-directory

注意侧纯,/opt/cockroach/etc/certs/ca.crt 是不需要也不可以刪除的新锈。

此時(shí)每臺(tái)機(jī)器 /opt/cockroach 的目錄結(jié)構(gòu)應(yīng)當(dāng)如下:

├── bin
│   └── cockroach
├── dat
│   ├── 000003.log
│   ├── auxiliary
│   ├── cockroach.advertise-addr
│   ├── COCKROACHDB_VERSION
│   ├── cockroach.http-addr
│   ├── cockroach.listen-addr
│   ├── cockroach-temp155584461
│   │   ├── 000003.log
│   │   ├── auxiliary
│   │   ├── COCKROACHDB_VERSION
│   │   ├── CURRENT
│   │   ├── IDENTITY
│   │   ├── LOCK
│   │   ├── MANIFEST-000001
│   │   ├── OPTIONS-000005
│   │   └── TEMP_DIR.LOCK
│   ├── CURRENT
│   ├── IDENTITY
│   ├── LOCK
│   ├── MANIFEST-000001
│   ├── OPTIONS-000005
│   └── temp-dirs-record.txt
├── etc
│   └── certs
│       ├── ca.crt
│       ├── node.crt
│       └── node.key
├── log
│   ├── cockroach.log -> cockroach.vm21.root.2018-04-14T06_32_10Z.001748.log
│   ├── cockroach.vm21.root.2018-04-14T06_32_10Z.001740.log
│   └── cockroach.vm21.root.2018-04-14T06_32_10Z.001748.log
├── pid
└── start.sh

驗(yàn)證數(shù)據(jù)庫

為驗(yàn)證數(shù)據(jù)庫的可用性,我們使用適用于 PostgreSQL 命令行客戶端連接數(shù)據(jù)庫眶熬,創(chuàng)建一個(gè)數(shù)據(jù)表并做一些讀寫操作妹笆。

各個(gè) linux 發(fā)行版的 PostgreSQL 命令行客戶端安裝方式可能不一樣,這里僅以 CentOS 7 為例娜氏。

安裝工具:

yum install postgresql

連接到數(shù)據(jù)庫:

[root@vm21 cockroach]# psql -h 192.168.100.21 -p 26257 -U user1
Password for user user1:
psql (9.2.23, server 9.5.0)
WARNING: psql version 9.2, server version 9.5.
         Some psql features might not work.
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.

user1=>

創(chuàng)建一個(gè)數(shù)據(jù)表并做一些讀寫操作:

USE database1;
CREATE TABLE usertable (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name STRING, age INT);
INSERT INTO usertable (name, age) VALUES ('a', 10), ('b', 20), ('c', 30);
SELECT * FROM usertable;

可以看到如下數(shù)據(jù):

                  id                  | name | age
--------------------------------------+------+-----
 94628e04-23f2-4bdd-83ef-d00a2a56f5fd | b    |  20
 c88ed9df-5ff9-468b-94bf-d9beb197136b | a    |  10
 eedaded5-c99a-4b8e-a7ea-52ef22a15305 | c    |  30
(3 rows)

多地址連接或負(fù)載均衡

至此拳缠,一個(gè)可用與實(shí)際生產(chǎn)的 CockroachDB 集群事實(shí)上已經(jīng)搭建完成了。但仍有一個(gè)小問題贸弥。

客戶端連接集群時(shí)窟坐,只要連接某個(gè)節(jié)點(diǎn),即可對(duì)全量數(shù)據(jù)進(jìn)行操作绵疲。且一般的應(yīng)用于 PostgreSQL 的驅(qū)動(dòng)支持連接到一個(gè)地址哲鸳,但問題來了,代碼中應(yīng)該如何確認(rèn)連接哪一個(gè)節(jié)點(diǎn)呢盔憨?如果程序都連接到某個(gè)一個(gè)節(jié)點(diǎn)上徙菠,勢(shì)必該節(jié)點(diǎn)的壓力會(huì)大于其他節(jié)點(diǎn),這違背了集群平攤壓力的初衷郁岩。

我覺得有兩個(gè)可行的方案婿奔,第一是多地址連接。代碼中通過讀取配置文件或讀 ZooKeeper 這樣的集中配置組件问慎,來獲取 CockroachDB 集群所有節(jié)點(diǎn)的地址萍摊,再構(gòu)建一個(gè)數(shù)據(jù)庫連接池,連接池中的連接均勻地連接到各個(gè)節(jié)點(diǎn)上如叼,保證各個(gè)節(jié)點(diǎn)的壓力均衡冰木。但這個(gè)方法有一定的開發(fā)壓力,可以集中實(shí)現(xiàn)笼恰,再暴露統(tǒng)一的接口片酝,相當(dāng)于對(duì)已有的 PostgreSQL 驅(qū)動(dòng)做一些簡(jiǎn)單的封裝,自研出一個(gè)支持多地址連接的 CockroachDB 驅(qū)動(dòng)挖腰。

第二個(gè)方法是使用 TCP 層的負(fù)載均衡雕沿,使用一個(gè)地址將壓力分?jǐn)偟礁鱾€(gè)節(jié)點(diǎn)上,而客戶端只需要連接負(fù)載均衡地址即可猴仑。官方文檔里介紹了使用 HAProxy 做負(fù)載均衡的示例审轮。我比較推崇這個(gè)方法肥哎,但不推崇使用自搭的 HAProxy。原因是如果該 HAProxy 所在的機(jī)器宕機(jī)了疾渣,數(shù)據(jù)庫將無法連接篡诽,失去可用性,這與 CockroachDB 去中心化榴捡、防單點(diǎn)故障的設(shè)計(jì)理念是相違背的杈女。如果部署多個(gè) HAProxy,某個(gè)宕機(jī)后使用其他的呢吊圾?這就又回到了原本的問題达椰,客戶端哪知道連哪一個(gè)。

所以這里應(yīng)該請(qǐng)專業(yè)的運(yùn)維團(tuán)隊(duì)出場(chǎng)项乒,提供一個(gè)高可用啰劲、高性能的 TCP 層負(fù)載均衡服務(wù),據(jù)我所知檀何,這類服務(wù)甚至不是用服務(wù)器來做的蝇裤,而是有相關(guān)的專用硬件設(shè)備。這就超出了搭建 CockroachDB 的討論范圍了频鉴,故不再這里展開栓辜,也不示例如何利用 HAProxy 搭建負(fù)載均衡。

如果說公司處于初創(chuàng)階段垛孔,運(yùn)維團(tuán)隊(duì)無法提供上述的負(fù)載均衡服務(wù)藕甩,那沒辦法,老老實(shí)實(shí)使用多地址連接的方法吧似炎。

最后

至此,所有工作完成悯姊,下面要做的就是驗(yàn)證羡藐、壓測(cè)、試用悯许、投產(chǎn)仆嗦,并抽時(shí)間仔細(xì)閱讀一下官方文檔,做更深一步的了解先壕。

祝你順利瘩扼,使用愉快~

來源:https://blog.wolfogre.com/posts/setup-of-cockroachdb-cluster/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市垃僚,隨后出現(xiàn)的幾起案子集绰,更是在濱河造成了極大的恐慌,老刑警劉巖谆棺,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殿托,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡尊勿,警方通過查閱死者的電腦和手機(jī)竿音,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寓调,“玉大人,你說我怎么就攤上這事∮芘Γ” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵捏肢,是天一觀的道長(zhǎng)奈籽。 經(jīng)常有香客問我,道長(zhǎng)猛计,這世上最難降的妖魔是什么唠摹? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮奉瘤,結(jié)果婚禮上勾拉,老公的妹妹穿的比我還像新娘。我一直安慰自己盗温,他們只是感情好藕赞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卖局,像睡著了一般斧蜕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砚偶,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天批销,我揣著相機(jī)與錄音,去河邊找鬼染坯。 笑死均芽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的单鹿。 我是一名探鬼主播掀宋,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼仲锄!你這毒婦竟也來了劲妙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤儒喊,失蹤者是張志新(化名)和其女友劉穎镣奋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怀愧,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唆途,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年富雅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肛搬。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡没佑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出温赔,到底是詐尸還是另有隱情蛤奢,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布陶贼,位于F島的核電站啤贩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拜秧。R本人自食惡果不足惜痹屹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枉氮。 院中可真熱鬧志衍,春花似錦、人聲如沸聊替。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惹悄。三九已至春叫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泣港,已是汗流浹背暂殖。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留当纱,地道東北人呛每。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像惫东,于是被迫代替她去往敵國和親莉给。 傳聞我的和親對(duì)象是個(gè)殘疾皇子毙石,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359