CockroachDB是基于事务性和高度一致的键值存储构建的分布式SQL数据库。它水平缩放; 在磁盘,机器,机架甚至数据中心故障中幸存下来,从而将延迟中断降到最低,并且无需人工干预;支持 高度一致的 ACID交易;并提供了熟悉的 SQL API,用于结构化,操作和查询数据。
由于将在单个主机上运行多个Docker容器,每个容器一个CockroachDB节点,因此需要创建Docker所指的桥接网络。桥接网络将使容器能够作为单个群集进行通信,同时使它们与外部网络隔离。
docker network create -d bridge roachnet
docker run -d \
--name=roach1 \
--hostname=roach1 \
--net=roachnet \
-p 26257:26257 -p 8080:8080 \
-v "${PWD}/cockroach-data/roach1:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.1.5 start --insecure
此命令创建一个容器并启动其中的第一个CockroachDB节点。让我们看一下每个部分:
docker run:用于启动新容器的Docker命令。
-d:此标志在后台运行容器,因此可以在同一shell中继续执行后续步骤。
--name:容器的名称。这是可选的,但是自定义名称可以大大简化在其他命令中引用容器的操作,例如,在容器中打开Bash会话或停止容器时。
--hostname:容器的主机名。将使用它来将其他容器/节点加入集群。
--net:容器要加入的桥接网络。有关更多详细信息,请参见步骤1。
-p 26257:26257 -p 8080:8080:这些标志将节点间和客户端节点通信26257的默认端口()以及8080从容器到主机到Admin UI()的HTTP请求的默认端口映射。这样可以进行容器间通信,并可以从浏览器调用管理界面。
-v "${PWD}/cockroach-data/roach1:/cockroach/cockroach-data":此标志将主机目录挂载为数据卷。这意味着该节点的数据和日志将存储在${PWD}/cockroach-data/roach1主机上,并且在容器停止或删除后仍将保留。有关更多详细信息,请参阅Docker的Bind Mounts主题。
cockroachdb/cockroach:v19.1.5 start --insecure:CockroachDB命令以不安全模式启动容器中的节点。
至此,集群已经处于运行状态。仅使用一个节点,就可以连接SQL客户端并开始构建数据库。但是,在实际部署中,总是希望3个或更多节点能够利用CockroachDB的自动复制,重新平衡和容错功能。
要模拟实际部署,请通过添加两个以上的节点来扩展集群:
节点2
docker run -d \
--name=roach2 \
--hostname=roach2 \
--net=roachnet \
-v "${PWD}/cockroach-data/roach2:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.1.5 start --insecure --join=roach1
节点3
docker run -d \
--name=roach3 \
--hostname=roach3 \
--net=roachnet \
-v "${PWD}/cockroach-data/roach3:/cockroach/cockroach-data" \
cockroachdb/cockroach:v19.1.5 start --insecure --join=roach1
这些命令再添加两个容器,并在其中启动CockroachDB节点,将它们连接到第一个节点。与步骤2相比,只有几处需要注意:
-v:此标志将主机目录挂载为数据卷。数据和日志这些节点将被存储在${PWD}/cockroach-data/roach2与${PWD}/cockroach-data/roach3主机上和容器停止或删除之后将继续存在。
--join:此标志使用第一个容器的将新节点加入群集hostname。否则,cockroach start将接受所有默认设置。请注意,由于每个节点都在唯一的容器中,因此使用相同的默认端口不会引起冲突。
现在,已扩展到3个节点,可以将任何节点用作群集的SQL网关。为了说明这一点,请使用以下docker exec命令在第一个容器中启动内置SQL Shell:
docker exec -it roach1 ./cockroach sql --insecure
运行一些基本的CockroachDB SQL语句:
CREATE DATABASE bank;
CREATE TABLE bank.accounts (id INT PRIMARY KEY, balance DECIMAL);
INSERT INTO bank.accounts VALUES (1, 1000.50);
SELECT * FROM bank.accounts;
\q
然后在第二个容器中启动SQL Shell:
docker exec -it roach2 ./cockroach sql --insecure
现在运行相同的SELECT查询:
SELECT * FROM bank.accounts;
完成后,退出节点2上的SQL Shell:
\q
启动第一个容器/节点时,已将节点的默认HTTP端口映射8080到8080主机上的端口。要查看集群的Admin UI指标,请将浏览器指向上的该端口localhost,即http://localhost:8080,然后单击左侧导航栏上的Metrics。
如前所述,CockroachDB自动在后台复制数据。要验证成功复制了上一步中写入的数据,请向下滚动到“ 每个节点的副本数”图,然后将鼠标悬停在该行上:
CockroachDB管理界面
每个节点上的副本数相同,表明群集中的所有数据已被复制3次(默认值)。
步骤6.停止集群
使用docker stop和docker rm命令停止并删除容器(以及集群):
docker stop roach1 roach2 roach3
docker rm roach1 roach2 roach3
如果不打算重新启动群集,则可能要删除节点的数据存储:
rm -rf cockroach-data