云服务器内容精选

  • 处理步骤 在Kibana的“Dev Tools”页面,执行命令GET _cluster/allocation/explain?pretty查看索引分片未分配的原因。 返回结果中显示索引名称“index” 和未分配解释“explanation” : “primary shard for this replica is not yet active”,表示分片副本未激活。 图1 索引分片未分配 尝试修改该索引的配置,执行命令将其副本数置为0。 PUT /index_name/_settings { "number_of_replicas": 0 } 返回信息“reason”中表示在恢复的数据中存在CSS集群不支持的数据类型。 图2 数据不兼容 根据问题根因,将数据中CSS集群不支持的数据类型删除或选择支持该数据类型的CSS集群版本,再进行备份恢复或数据迁移。
  • 集群一直处于快照中 集群一直处于快照中,有三个比较常见的原因: 集群数据量大或者集群压力大,备份快照耗时长。 单个节点的快照速度默认是40MB/s,同时,快照的性能还受集群情况影响,如果此时集群负载较高,耗时将会更久。可以通过上述章节的查询单个快照信息查询正在执行的快照情况。 执行GET _snapshot/repo_auto/snapshot-name,可以看到剩余还需要完成的shard个数,也可以通过删除快照接口提前终止。 解决方法:等待或者提前终止。 快照信息更新失败。 Elasticsearch将进行中的快照信息保存在cluster state中,快照完成后需要更新快照状态,由于Elasticsearch更新快照状态的接口没有加入重试或者容错机制,比如由于当时集群内存压力大,更新快照动作被熔断,那么这个快照将会一直处于快照中。 解决方法:调用快照删除接口。 临时AK、SK过期。 CSS通过委托将Elasticsearch中的数据写入到用户的OBS中,快照仓库创建的时候,需要去使用委托获取临时的AK 、SK设置到仓库中。由于临时的AK、SK是有时效性的(24小时过期),如果一个快照超过24小时还未完成,那么这个快照将会失败。这种情况会有一个比较大的风险,因为此时仓库的AK、SK过期,无法对这个仓库进行更新、查询、删除操作,这种情况下cluster state信息将会无法清除,只能通过普通重启(滚动重启无法生效)集群来清除cluster state里面残留的快照信息。 解决方法:暂时只能通过普通重启集群来消除,后期CSS会提供终止接口,可以来解决这种无法消除状态的现象。 父主题: 功能使用类
  • 处理步骤 当出现9200端口访问失败错误时,且CSS集群状态为可用状态。执行步骤如下所示: 进入CSS服务管理控制台,在集群列表中,单击集群名称进入集群详情页面,查看此集群使用的VPC和子网。 进入VPC服务管理控制台,在虚拟私有云列表中,单击CSS集群使用的VPC名称,进入VPC详情页面。查看VPC和子网的网段信息。 如图1所示,VPC的网段信息,与子网的网段信息一致。在使用VPN专线访问或使用VPC对等连接访问时,会导致9200端口访问失败。 图1 查看网段信息 如果出现上述错误,请重新创建集群,并选择一个网段与VPC不同的子网,如不存在这样的子网,请在VPC管理控制台重新创建一个子网。 创建新的CSS集群后,将旧集群的数据迁移至新集群中,然后再通过VPN专线访问或使用VPC对等连接访问使用。 如果需要VPN专线访问或使用VPC对等连接访问CSS集群时,请务必保证,新创建的CSS集群,其VPC与子网,具备不同的网段信息。
  • 原因分析 在“使用VPN专线访问CSS集群”或“通过VPC的对等连接访问CSS集群”场景下,其所在的客户端与CSS不在同一VPC下。因此,要求CSS集群的子网与其VPC具有不同的网段。 例如,某一CSS集群,选用的VPC为vpc-8e28,其网络配置为192.168.0.0/16。选用了此VPC下的子网subnet-4a81,subnet-4a81子网的网段与vpc-8e28一致,均为192.168.0.0/16。此时,如果使用VPN专线访问CSS集群或通过VPC的对等连接访问CSS集群,会导致此子网创建的机器内没有该VPC对应的网关,从而影响CSS服务的默认路由的设置,最终导致9200端口访问失败。
  • I/O Reactor STOPPED是什么问题? 首先根据调用栈可以定位到报错来自CloseableHttpAsyncClientBase中的90行,如下图所示: ensureRunning()方法是在每次请求执行开始的时候调用,用来确认client状态是否为ACTIVE,如果不是ACTIVE,则会报错。然后观察CloseableHttpAsyncClientBase中的status何时会变成STOPPED,发现有且仅有两处会set为STOPPED,如下图所示: 图1 第一处STOPPED 图2 第二处STOPPED 由于客户不会手动关闭客户端之后再调用接口,所以有且仅有第一处会导致status切换为STOPPED状态。 对于第一处STOPPED,reactorThread线程是用来在io events发生时调度io events,当内部抛出异常时,最终会将status改为STOPPED状态。然后在bulkAsync请求的回调中抛出异常验证status的状态切换,如下图所示: 当请求失败,status会切换为STOPPED且I/O Reactor将关闭,并使HLRC实例卡住。后续使用该HLRC实例调用任何请求都会失败。此处手动抛出异常是为了复现问题,生产环境中很难分辨是什么原因导致I/O Reactor关闭。
  • 原因分析 导致出现I/O Reactor STOPPED的原因,大致可以分为以下3类: 回调中抛出异常导致。 客户端并发太高导致。 在日志中发现异常后,查看ElasticSearch集群监控指标,如CPU使用率、网络连接数等。 当用户集群配置为5台16U128G的i3.4xlarge.8节点时,且每天上午5点左右会做大量bulk操作,写入大概100G-200G的数据,根据集群监控指标的CPU使用率、网络流入流出速率来看对ElasticSearch节点造成不了压力,网络连接数较高,其它节点情况也相同。但是,有的节点网络连接数高达近9000,5个节点瞬间有将近5万连接数,用户的代码大致是用同一个Rest Client多个线程并发且调用HLRC的bulkAsync接口。客户端一个节点,单是ES的连接就消耗了4-5万个连接数,这种情况很容易造成客户端节点句柄数耗尽,或者连接数耗尽。 ElasticSearch的Rest client导致。建议ElasticSearch完善Rest client,添加exception handler。 Apache(HLRC和LLRC都使用了Apache HTTPComponents Async Client)手册中提到,在与会话通道交互过程中有些I/O异常是可以预料的,这些异常可能会导致单个session终止,但不会影响I/O Reactor和其他session。但某些情况下,当I/O Reactor本身遇到内部问题是,例如底层NIO的一些类中的I/O异常或者没被handle的一些Runtime Exception。这些异常是致命的,会使I/O Reactor关闭。Apache官方建议重写IOReactorExceptionHandler接口。 图3 重写IOReactorExceptionHandler接口 但是尝试了重写ExceptionHandler并放到HLRC的配置中,并通过在回调中抛出异常来模拟异常场景,最后发现这种回调的异常并不会被IOReactorExceptionHandler捕获,运行脚本后也没有异常抛出,所以此处IOReactorExceptionHandler的实现并不好验证。通过ElasticSearch社区issue中其他开发者的验证,添加了IOReactorExceptionHandler后跑很久也不会有问题。所以建议添加IOReactorExceptionHandler,但是注意不要忽略所有异常。 Elasticsearch Rest Client需要有一个exception handler,而不是让用户通过设置IOReactorExceptionHandler来处理异常,且这种方式也不会解决所有的异常。
  • 修订记录 发布日期 修改说明 2024-06-11 合入走读评审意见。 2023-07-04 更新处理步骤:Spring Boot使用Elasticsearch出现Connection reset by peer问题 2023-05-30 新增集群不可用的故障排除:集群负载过高导致集群不可用 更新集群不可用的原因分析和处理方法:集群不可用排查指导 2023-02-03 更新接入集群的参考链接:TransportClient客户端连接css报错 2023-01-31 新增案例: 安全组策略设置不合理导致集群不可用 插件不兼容导致集群不可用 分片未正常分配导致集群不可用 数据类型不兼容导致集群不可用 2023-01-20 新增: Elasticsearch集群报错:unassigned shards all indices es-head插件连接Elasticsearch集群报跨域错误 单节点集群打开Cerebro界面显示告警 ES-Hadoop导数据时报"Could not write all entries"异常 Kibana中删除index pattern报错Forbidden 执行命令update-by-query报错“Trying to create too many scroll contexts” Elasticsearch集群无法创建pattern 2022-12-02 新增: Elasticsearch集群出现写入拒绝“Bulk Reject”,如何解决? Elasticsearch集群创建index pattern卡住,如何解决? 云搜索控制台页面提示系统繁忙 集群冻结状态导致集群不可用 X-pack参数配置导致集群不可用 Elasticsearch集群更改规格失败 安全集群索引只读状态修改报错 Elasticsearch集群某一节点分配不到shard 集群索引插入数据失败 CSS创建索引报错maximum shards open 删除索引报错“403 Forbidden”是什么原因? 2022-08-25 新增: 集群突现load高的故障排查 使用ElasticSearch的HLRC(High Level Rest Client)时,报出I/O Reactor STOPPED Elasticsearch集群最大堆内存持续过高(超过90%) 2022-06-30 界面更新涉及操作步骤更新: 集群不可用排查指导 无法备份索引 无法使用自定义词库功能 快照仓库找不到 2021-10-11 第五次正式发布。 新增 Spring Boot使用Elasticsearch出现Connection reset by peer问题 2021-09-23 第四次正式发布。 新增 快照仓库找不到 2020-11-19 第三次正式发布。 新增 集群不可用排查指导 2020-08-10 第二次正式发布。 新增 TransportClient客户端连接css报错 ECS服务器部署Logstash推送数据到CSS服务报错 2020-04-26 第一次正式发布。
  • 数据量很大,如何进行快照备份? 如果快照数据量极大,快照备份要超过一天时,可参考如下方法进行优化。 快照备份的时候指定索引,比如先分批,默认是*,将会备份所有的索引。 使用自定义快照仓库。 创建自定义仓库。 除了使用云搜索服务提供的repo_auto之外,客户也可以自己创建一个仓库,接口见如下: PUT _snapshot/my_backup { "type" : "obs", "settings" : { "bucket" : "css-backup-name", //桶名 "base_path" : "css_backup/711/", //备份路径 "chunk_size" : "2g", "endpoint" : "obs.xxx.com:443", //OBS域名地址 "region" : "xxx", //Region名称 "compress" : "true", "access_key": "xxxxx", //AK "secret_key": "xxxxxxxxxxxxxxxxx" //SK "max_restore_bytes_per_sec": "100mb", //OBS速度,默认是40MB,可以根据实际性能调大 "max_snapshot_bytes_per_sec": "100mb" } } 使用自定义仓库创建快照。 PUT _snapshot/my_backup/snapshot_name(快照名称) { "indices": "*", //备份的索引,*表示索引,逗号分隔 "ignore_unavailable": true, //是否忽略单个index是否可用,true表示忽略 "include_global_state": false //默认false表示cluster state和其他的一些state不会保存下来 } 查询快照状态。 GET _snapshot/my_backup/snapshot_name/_status 恢复自定义仓库中的索引。 POST /_snapshot/my_backup/snapshot_name/_restore { "indices": "test-00000000000", "ignore_unavailable": true, "include_global_state": false, "rename_pattern": "(.+)", "rename_replacement": "$1" } 父主题: 功能使用类
  • 问题现象 “集群状态”为“不可用”。 单击集群名称进入集群基本信息页面,选择“日志管理”,单击“日志查询”页签,可见日志内容存在警告“master not discovered or elected yet, an election requires at least 2 nodes with ids [xxx, xxx, xxx, ...], have discovered [xxx...] which is not a quorum”。 图1 节点报错日志示例
  • 处理步骤 在集群管理页面,单击不可用的集群名称,进入集群基本信息页面。 单击“配置信息”中的安全组名称,进入当前集群所选安全组的基本信息页面。 分别查看“入方向规则”和“出方向规则”页签下,是否存在“策略”为“允许”,“协议端口”为“TCP : 9300”,“类型”为“IPv4”的安全组规则。 是,联系技术支持定位集群不可用问题。 否,执行下一步。 修改集群当前所选安全组信息,放通9300通信端口。 在当前集群所选安全组基本信息界面,选择“入方向规则”页签。 单击“添加规则”,在添加入方向规则对话框设置“优先级”为“100”,“策略”选择“允许”,“协议端口”选择“基本协议/自定义TCP”,端口填写“9300”,“类型”选择“IPv4”,“源地址”选择“安全组”下的集群当前安全组名称,即同安全组内放通。 图2 添加安全组规则 单击“确定”即可完成放通9300端口的设置。 同样的步骤,在“出方向规则”页签添加放通9300端口的设置。 安全组放通9300端口后,等待集群自动恢复可用状态。
  • 问题现象 ECS服务器部署logstash,然后推送数据到云搜索服务CSS,出现错误信息如下: LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError: Got response code '500' contacting Elasticsearch at URL 'https://192.168.xx.xx:9200/_xpack'。
  • 处理步骤 登录云搜索服务管理控制台。 在左侧导航栏,单击“集群管理”。 在集群对应的“操作”列,单击“Kibana”,打开Kibana界面。 如果您开启了安全模式,登录时候需要输入用户名和密码。用户名默认为admin,密码为创建集群时设置的密码。 如果忘记密码,可以在集群详情页面的“配置信息”区域,单击“重置密码”后的“重置”,设置并确认新的管理员密码。 在kibana页面按F12。 单击“Network”,选中“data:image”,右键选择“clear browser cache”,弹出对话弹框,单击确定,关闭Kibana界面。 图1 关闭Kibana界面 在集群对应的“操作”列,单击“Kibana”即可访问。
  • 参考 TCP长连接和短连接 TCP协议中有长连接和短连接之分。短连接在数据包发送完成后会自己断开,长连接在发包完成后, 会在一定的时间内保持连接,即通常所说的Keepalive(存活定时器)功能。 TCP保活机制 保活机制是由一个保活计时器实现的。当计时器被激发,连接一端将发送一个保活探测报文, 另一端接收报文的同时会发送一个ACK作为响应。 如果客户端无响应,服务器将中断连接,否则会重置保活计时器。 服务器端Keepalive设置时间30m,Linux有三个参数可以控制保活时间: tcp_keepalive_time(开启Keepalive的闲置时长)、 tcp_keepalive_intvl(Keepalive探测包的发送间隔)、tcp_keepalive_probes (如果对方不予应答,探测包的发送次数)。 http-keepalive http-keepalive是保证一个TCP连接尽可能传递多的报文,每次交互一个报文后就会更新http-keepalive时间。如果http-keepalive时间超时,意味这个这段时间client和server没有报文交互,本端会主动关闭释放连接。 tcp-keepalive是一种探测TCP连接状态的保活机制,TCP连接建立后如果不主动关闭,client和server没有发生异常,这个连接理论上是一直存在的,http-keepalive是保证一个TCP连接上尽可能传递更多的报文,如果http-keepalive时间内没有报文交互则会主动关闭连接。
  • 问题现象 安装自定义插件后重启集群,“集群状态”变为“不可用”。 单击集群名称进入集群基本信息页面,选择“日志管理”,单击“日志查询”页签,可见日志内容存在明显的关于插件的报错“fatal error in thread [main], exitingjava.lang. NoClassDefFoundError: xxx/xxx/.../xxxPlugin at ...”。 图1 节点报错日志示例 CSS服务已下线自定义插件功能,但历史版本的集群可能还装有自定义插件,只有这类集群可能出现该故障。
  • 处理步骤 如果集群长期处于高负载状态,则集群会存在写入、查询缓慢等情形,建议根据业务需要升级节点规格或者对集群节点的数量和存储容量进行扩容,使集群更好的满足业务需求。升级节点规格的指导请参见变更规格,扩容节点数量和节点存储容量的指导请参见扩容。 查询集群是否存在任务堆积。 方式一:在Kibana的“Dev Tools”页面,分别执行以下命令查询是否存在任务堆积。 GET /_cat/thread_pool/write?v GET /_cat/thread_pool/search?v 如下所示“queue”的值为非0,表示存在任务堆积。 node_name name active queue rejected css-0323-ess-esn-2-1 write 2 200 7662 css-0323-ess-esn-1-1 write 2 188 7660 css-0323-ess-esn-5-1 write 2 200 7350 css-0323-ess-esn-3-1 write 2 196 8000 css-0323-ess-esn-4-1 write 2 189 7753 方式二:在集群管理列表,单击集群操作列的“监控信息”查看监控指标,在集群监控信息页面查看集群的“Search队列中总排队任务数”和“Write队列中总排队任务数”,如果排队任务数值非0表示存在任务堆积。 图2 Write队列中总排队任务数示例 如果集群存在大量的任务堆积,则参考如下步骤优化集群。 在集群的“日志管理”页面查看节点日志,查看节点在OOM前是否存在大量慢查询日志记录,分析查询是否会对节点造成压力导致节点内存不足,如果存在则根据业务实际情况优化查询语句。 在集群的“日志管理”页面查看节点日志,查看节点日志是否有“Inflight circuit break”或“segment can't keep up”的报错信息,如果存在则可能是写入压力过大,对集群造成较大的压力导致熔断。需要查看监控信息,排查近期数据写入量(写入速率)是否存在激增,如果存在则根据业务实际情况合理安排写入高峰时间窗。 如果集群不存在任务堆积或者集群优化完依旧不可用,则执行下一步,查看集群是否压力过大。 查看集群是否压力过大。 在集群管理列表,单击集群操作列的“监控信息”查看监控指标,在监控信息页面查看CPU和堆内存相关指标,如“平均CPU使用率”和“平均JVM堆使用率”。如“平均CPU使用率”超过80%或“平均JVM堆使用率”高于70%,则说明集群当前压力较大。 图3 “平均CPU使用率”示例 如果集群压力过大,请降低客户端的请求发送速率或扩容集群。 如果集群压力正常或降低发送请求速率后集群依旧不可用,则执行下一步,查看集群是否存在大量缓存。 在Kibana的“Dev Tools”页面,执行以下命令查询集群是否存在大量缓存。 GET /_cat/nodes?v&h=name,queryCacheMemory,fielddataMemory,requestCacheMemory 如果返回结果中queryCacheMemory、fielddataMemory或requestCacheMemory的数值超过堆内存的20%,则表示缓存过大,可执行命令POST _cache/clear清除缓存。这些缓存数据是在数据查询时生成的,目的是为了加快查询速度,当缓存清除则可能使查询时延增加。 name queryCacheMemory fielddataMemory requestCacheMemory css-0323-ess-esn-1-1 200mb 1.6gb 200mb 每个节点的最大堆内存可以执行如下命令查询: GET _cat/nodes?v&h=name,ip,heapMax 其中,name为节点名称,ip为节点的IP地址。 如果排查优化后,集群依旧负载过高,则联系技术支持。