原始网页:https://www.cockroachlabs.com/docs/stable/cluster-setup-troubleshooting.html


开始之前

术语

使用本教程之前需要了解一些CockroachDB的术语:

使用本教程

为方便诊断问题所在,我们推荐首先从最简单的场景开始并逐步增加复杂度直至发现问题。基于以上考虑,用户需要按顺序执行本教程的步骤进行故障追踪。

我们也推荐用户在想要部署CockroachDB集群的环境里执行本教程的步骤。一旦遇到无法解决的问题,可尝试在更简单的环境下执行同样的步骤。例如,用户若无法在Docker当中启动集群,可以尝试在同样的环境下不使用容器来部署CockroachDB。

定位问题

执行以下步骤启动或拓展集群,直至发现问题所在。

启动单节点集群

停止运行中的cockroach进程并移除旧数据

pkill -9 cockroach
rm -r testStore

以非安全模式启动单节点

同时将所有日志信息输出到终端。

cockroach start --insecure --logtostderr --store=testStore

在此阶段,可能的错误包括:

执行SQL语句

如果节点正常启动,开启一个新的终端,执行以下SQL语句:

cockroach sql --insecure -e "SHOW DATABASES"

预期输出:

+--------------------+
|      Database      |
+--------------------+
| system             |
+--------------------+

在此阶段,可能的错误包括:

如果用户能够成功启动单节点集群,则尝试启动多节点集群。

启动多节点集群

将单节点集群启动的节点作为第一个节点,在其他机器上:

停止运行中的cockroach进程并移除旧数据

pkill -9 cockroach
rm -r testStore

NOTE: 如果用户在同一台机器上运行所有节点,请跳过此步骤。执行此命令将终止第一个节点,此时无法启动集群。

启动CockroachDB节点并连接到第一个节点

cockroach start --insecure --logtostderr --store=testStore \
--join=[first node's host]

NOTE: 如果用户在同一台机器上运行所有节点,需要修改--port--http-port--storeFlags的值,详见启动本地节点

在此阶段,可能的错误包括:

访问Admin界面

访问http://[node host]:8080,点击左侧导航栏的Metrics。集群的所有节点将显示在此处,集群的所有数据将冗余分布到这些节点当中。

在此阶段,可能的错误包括:

如果用户成功启动多节点集群,则尝试以安全模式部署(相关文档后续将补充),或是查看其他帮助资源

故障追踪信息

根据用户在上述启动和拓展集群的步骤当中遇到的错误信息,采取以下相应的方式解决问题。

网络故障追踪

大多数网络相关的问题由以下两个方面导致:

为更好地定位问题,需要理解问题出现的原因。我们推荐检查以下网络相关的配置:

总结来说,防火墙和hostname的问题都可能导致以上的问题出现。

节点无法连接集群

当节点尝试连接集群的时候,可能会接收到以下错误:

no resolvers found; use --join to specify a connected node
node belongs to cluster {"cluster hash"} but is attempting to connect to a gossip network for cluster {"another cluster hash"}

解决方式:

取消节点与现有的存储CockroachDB数据的文件夹的关联。例如:

# Store this node's data in [new directory]
cockroach start [flags] --store=[new directory] --join=[cluster host]:26257
# Remove the directory
rm -r cockroach-data/

# Start a node joining the cluster
cockroach start [flags] --join=[cluster host]:26257

问题分析:

启动节点时,用户选择的数据文件夹包含了用于识别集群的元数据。如果一个节点已经在服务器上启动并退出,再尝试连接另一个集群,该节点可能会与连接的另一个集群产生冲突。因为该节点的数据文件夹里保存的集群ID与另一个集群的ID不一致,所以导致节点无法加入另一个集群。

副本冗余错误(多节点集群)

如果数据无法复制到集群的部分节点,我们推荐进行如下的检查: