用于生產(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 的介紹這里不做贅述,可參考:
- CockroachDB 官方文檔腿堤;
- CockroachDB GitHub 倉庫的 README 頁阀坏;
- 我之前寫的《評(píng)測(cè)分布式 SQL 數(shù)據(jù)庫 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.crt
和 etc/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/