维特星团的生活

2020-12-21 11:18:35

这篇文章详细介绍了启动群集时幕后发生的事情,例如使用头盔或本地安装指南。这既可以用作学习工具,也可以用作故障排除指南。我们假设您已下载并安装了所有必需的二进制文件,然后再继续进行。

Vitess是一个非常灵活的系统,能够在各种环境中运行。本地示例确实有点简化了事情。但是,将Vitess投入生产时,您需要考虑更多因素。

了解各种组件之间如何相互作用也很重要。如果群集未按预期启动,则此知识将有助于进行故障排除。

需要提出的第一个组件实际上不是Vitess组件。拓扑服务器可以是ZooKeper,etcd,领事或Kubernetes。 Vitess需要一个topo服务器才能启动并运行。此处未介绍启动每种拓扑服务器所需的步骤。

启用TopoServer后,请确保可以使用其客户端之一连接到它。

您可能需要运行多个独立的Vitess群集。例如,您可能想将测试和暂存群集与生产群集分开。但是,您可能仍想对所有这些重用相同的TopoServer。

因此,Vitess允许您在Topo中为每个群集选择一个根目录。该目录称为topo_global_root,将为每个启动的Vitess二进制文件提供该目录。

注意:对于ZooKeeper,实际上需要在服务器中创建此目录。 在本地示例中,我们将其选择为/ vitess / global。 这是启动etcd的示例命令: vtctld的最重要标志是连接到TopoServer和-topo_global_root所需的参数。 这是一个示例vtctld调用: 如果无法访问TopoServer,或者未指定topo_global_root,则vtctld将无法启动。 您应该在日志中看到以下错误消息: F0426 11:11:40.363545 14833 server.go:223]无法打开topo服务器(etcd2,localhost:2379,/ vitess / global):拨打tcp 127.0.0.1:2379:connect:连接被拒绝 通过service_map标志,您可以配置Vitess服务器公开为gRPC的grpc API。 如果未将grpc-vtctl指定为vtctld的service_map,则将无法使用vtctlclient访问它。 下一步是创建一个单元。 可以通过发出以下命令来完成:

注意:vtctlclient不需要拓扑全局根,因为它仅与vtctld通信,并且vtctld已经具有该值。

“ -root”标志与topo_global_root不同。特定于该单元格的所有信息将存储在/ vitess / zone1下。有关单元的元数据(zone1数据位于/ vitess / zone1中的事实)存储在全局topo中。 Vitess二进制文件在切换为使用单元拓扑之前从全局拓扑获取此信息。

为了获得更高的容错能力,您可以设置并指定其他TopoServer来服务本地单元。如果隔离故障区域并不重要,则只要确保根路径不冲突,就可以重新使用主TopoServer。

为了获得最佳的容错能力,您需要设置全局topo服务器,使其节点分布在多个区域中。本地topo服务器的节点应位于单元本身内。

最后一个参数“ zone1”是单元的名称,后续工具需要该名称。

注意:在本地示例中,我们使用vtctl工具创建本地单元。这是因为我们在启动vtctld之前创建了本地单元。但是,这不是必需的。您可以在启动vtctld之后创建本地单元。

尽管本地示例最后显示了vtgate,但这不是必需的。您可以在创建任何键空间或启动vttablets之前启动vtgate。 VTGate在成长过程中会发现它们。

除了topo参数外,vtgate还需要一个单元来进行操作。vtgate的主要工作是将请求转发到本地单元中的vttablets。但是,vtgate在两种情况下可以跨单元使用:

vtgate接收到对主服务器的查询,并且该主服务器不在当前单元中。

如果没有本地vttablet可用,则将vtgate配置为转到其他单元。

要跨单元发送主查询,必须指定一个附加的cells_to_watch标志。这将使vtgate监视那些额外的单元,并帮助他们跟踪这些单元中的主节点。

cells_to_watch标志是必需参数,并且必须至少包括当前单元格。我们很快会解决此问题:https://github.com/vitessio/vitess/issues/6126。

跨单元处理非主请求是一个高级用例,它需要设置单元别名,在此不做介绍。

对于那些希望使用Java或Go grpc客户端进行vtgate的用户,还必须配置grpc_port并将服务映射指定为service_map =' grpc-vtgateservice'。

对于那些希望使用mysql协议的用户,必须指定mysql_server_port和mysql_auth_server_impl来配置身份验证。

vtgate \ -topo_implementation = etcd2 \ -topo_global_server_address = localhost:2379 \ -topo_global_root = / vitess / global \ -cell = zone1 \ -cells_to_watch = zone1 \ -port = 15001 \ -grpc_port = 15991 \ -service_map =' grpc -vtgateservice' \ -mysql_server_port = $ mysql_server_port \ -mysql_auth_server_impl =无

本地示例最后启动vtgate的原因是因为vtgate轮询TopoServer进行更改。最后启动它可以使vtgate找到所有已启动的vttablet,并立即准备好向其发送请求。该轮询频率由tablet_refresh_interval控制,其默认值为一分钟。这意味着vtgate最多可能需要一分钟才能发现新的vttablet。此间隔可以降低。但是,必须小心以确保过多的vtgate不会压倒TopoServer。

VTGate使用全局拓扑获取其必须监视的单元的拓扑地址。因此,您无需为各个单元指定拓扑地址。

成功启动的vtgate将在“运行状况检查缓存”部分下的/ debug / status页中显示其发现的所有vttablet。

如果vtgates无法从拓扑连接到发现的其中一个vttablet,或者vttablet运行不正常,则它将在Health Check Cache中显示为红色,并在其旁边显示相应的错误消息:

您可以使用vtctlclient命令创建键空间和碎片。但是,它们不是必需的,因为它们是在您启动vttablets时隐式创建的。

重要的是要了解全局拓扑和特定于细胞的拓扑之间的关系。密钥空间和分片的规范信息在全局topo中创建。然后,通过诸如RebuildKeyspaceGraph和RebuildVSchemaGraph之类的重建命令,将该信息推送到特定于单元的主题。这些命令将在适用时代您隐式发出。但是在某些情况下,您必须手动发布它们。例如,如果您创建一个新的单元格,则必须发出以下命令才能将数据复制到新的单元格中。

在某些用例中,您可能希望将更改仅实验性地部署到某些单元。将信息与全局拓扑和局部单元分开可以使这些实验成为可能,而不会影响整个部署。

未分片的键空间通常只有一个名为0或-的分片。分片键空间具有以分配给它的键范围命名的分片,例如-80和80-。以下部分描述了为单个分片启动vttablets的过程。

为了持久起见,我们通常建议您提出一定数量的vttablets及其MySQL实例。建议您至少启用三个vttablet,并启用半同步复制。要启动每个节点,请执行以下步骤:

为了启动mysql,可以使用mysqlctl便捷包装器。该工具能够在一台计算机上启动多个隔离的mysql实例,并对其进行预配置以方便从vttablet进行连接。

mysqlctl的必要参数是tablet_uid和mysql_port。调用vttablet时,应将此平板电脑UID作为平板电脑路径提供。这是一个示例调用:

有一个常见的陷阱需要提防:如果在mysqlctl日志中看到类似这样的错误,则可能需要禁用AppArmor:

I0429 01:16:25.648506 1 mysqld.go:454]等待mysqld套接字文件(/vtdataroot/tabletdata/mysql.sock)准备就绪... I0429 01:16:25.656153 1 mysqld.go:399] Mysqld.Start (1588122985)stderr:mysqld:[错误]无法打开所需的默认文件:/vtdataroot/tabletdata/my.cnfI0429 01:16:25.656180 1 mysqld.go:399] Mysqld.Start(1588122985)stderr:mysqld:[错误]默认处理中的致命错误。程序中止了!I0429 01:16:25.657249 1 mysqld.go:418] Mysqld.Start(1588122985)exit:退出状态1

请注意,一次禁用AppArmor可能不会。许多软件安装或升级会自动将其重新安装。如果发生这种情况,您可能必须再次禁用它。

确保MySQL成功启动。因为将在vttablets出现后完成MySQL的完全初始化,所以希望在日志文件中看到类似以下的错误:

2020-04-27T00:38:02.040081Z 2 [注意]与db的连接2中止:' unconnected'用户:' root'主机:' localhost' (读取通信数据包时出错)

此时启动的MySQL实例没有与密钥空间或碎片相关的标识。这些将在以下步骤中分配。

tablet-path:这应该与提供给mysqlctl命令的tablet-uid相同。

init_keyspace:平板电脑将要提供的键空间。如果不存在,这将导致创建一个密钥空间。

init_shard:平板电脑将要使用的分片。如果一个碎片不存在,这将导致创建碎片。

init_tablet_type:通常为REPLICA。您可以使用其他平板电脑类型,例如“ RDONLY”。那些平板电脑类型将被弃用,而采用更新的方式来实现其功能。请注意,您不允许将平板电脑作为主机启动。

enable_semi_sync:推荐值为TRUE。您至少需要启动三个vttablet才能使此设置正常工作。

通常,您将需要其他参数来设置备份和自动还原,此处将不介绍这些参数。这是一个典型的例子:

vttablet \ -topo_implementation = etcd2 \ -topo_global_server_address = localhost:2379 \ -topo_global_root = / vitess / global \ -cell = zone1 \ -tablet-path = zone1-100 \ -init_keyspace = commerce \ -init_shard = 0 \ -init_tablet_type = replica \ -enable_semi_sync = true \ -port = 15100 \ -grpc_port = 16100 \ -service_map' grpc-queryservice,grpc-tabletmanager'

调出第一个vttablet将导致在全局topo中创建键空间和碎片。同样,此操作将导致拓扑重建,该拓扑将确保将此信息传播到当前单元。

此外,vttablet会在单元格的拓扑中创建“平板电脑记录”,vtgate会观察到。然后,vtgate将连接到vttablet,并将建立运行状况检查流。这就是导致平板电脑显示在vtgates Health Check Cache部分中的原因。

但是,此时访问vtgate页面将显示所有这些平板电脑都不健康: InitShardMaster步骤通过选择母版并为副本设置复制来初始化仲裁。 另外,创建一个数据库来存储键空间碎片的数据。 命令如下: 注意:如果启用了半同步,并且没有设置至少三个副本,则InitiShardMaster可能会无限期挂起。 即使成功,将来执行故障转移的操作也可能导致此碎片进入死锁状态。 本地示例仅设置两个副本,主要是为了最大程度地减少资源使用。 完成此步骤后,访问vtgate上的/ debug / status页面应将这些平板电脑显示为绿色。 上面的步骤详细说明了示例的“ 101”步骤。 之后,您将需要上传一个架构和一个VSchema。 这将在其他用户指南中介绍。