范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

ClickhouseAlter操作造成zk连接丢失的问题分析

  背景
  业务方数据在出现错误后需要重跑数据,由于业务方没有使用MergeTree的折叠表,需要删除旧的数据后,再重新跑数据写入新的正确的数据。
  之前这种模式一直运转的比较好,没有出现过问题,不过近期发现,对该表发起Alter语句时,出现了ZK Connection Loss的错误,但是对其他的表发起Alter语句没有出现相同的错误。
  本文主要分析一下定位问题的过程以及确定问题所在,也希望大家就该问题进行讨论提供更好的解决方案。 问题现象分析问题描述
  Clickhouse版本:20.9.3.45
  表结构: CREATE TABLE default.business_table (     createTime DateTime,     appid int ,     totalCount  bigint ) ENGINE = ReplicatedMergeTree("/clickhouse/tables/{shard}/business_table", "{replica}");
  Alter语句以及响应的报错信息:  alter table default.business_table delete where toYYYYMMDDHH(createTime) =2022012020 and appid=1;  ERROR 999 (00000): Code: 999, e.displayText() = Coordination::Exception: Connection loss (version 20.9.3.45 (official build))问题定位
  首先查看了一下clickhouse的错误日志,错误日志中有相关的堆栈信息 2022.02.10 11:17:51.706169 [ 34045 ] {}  executeQuery: Code: 999, e.displayText() = Coordination::Exception: Connection loss (version 20.9.3.45 (official build)) (from 12 7.0.0.1:48554) (in query: alter table yylive_indicator.player_firstaccess_core_indicator_percentile delete where formatDateTime(_date_,"%Y%m%d%H")="2022012020" and time_type="1h "), Stack trace (when copying this message, always include the lines below):  0. Poco::Exception::Exception(std::__1::basic_string, std::__1::allocator > const&, int) @ 0x18e1b360 in /usr/bin/clickhouse 1. DB::Exception::Exception(std::__1::basic_string, std::__1::allocator > const&, int) @ 0xe736dad in /usr/bin/clickhouse 2. Coordination::Exception::Exception(Coordination::Error) @ 0x16887dad in /usr/bin/clickhouse 3. ? @ 0x168991b0 in /usr/bin/clickhouse 4. DB::EphemeralLocksInAllPartitions::EphemeralLocksInAllPartitions(std::__1::basic_string, std::__1::allocator > const&, std::__1::basic _string, std::__1::allocator > const&, std::__1::basic_string, std::__1::allocator > const&, zkut il::ZooKeeper&) @ 0x161dca16 in /usr/bin/clickhouse 5. DB::StorageReplicatedMergeTree::EphemeralLocksInAllPartitions(DB::MutationCommands const&, DB::Context const&) @ 0x1609c636 in /usr/bin/clickhouse 6. DB::InterpreterAlterQuery::execute() @ 0x15ab5126 in /usr/bin/clickhouse
  再查看了一下zk的错误日志 2022-02-10 11:17:51,680 [myid:90] - WARN  [NIOWorkerThread-30:NIOServerCnxn@373] - Close of session 0x5a02260902470005 java.io.IOException: Len error 1190892     at org.apache.zookeeper.server.NIOServerCnxn.readLength(NIOServerCnxn.java:541)     at org.apache.zookeeper.server.NIOServerCnxn.doIO(NIOServerCnxn.java:332)     at org.apache.zookeeper.server.NIOServerCnxnFactory$IOWorkRequest.doWork(NIOServerCnxnFactory.java:522)     at org.apache.zookeeper.server.WorkerService$ScheduledWorkRequest.run(WorkerService.java:154)     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)     at java.lang.Thread.run(Thread.java:748)
  然后大致对比了一下系统的表的大小,目前出问题的表是最大的。 mysql> select count() from system.parts where table="business_table" and active =1 ;  +---------+ | count() | +---------+ |    8108 | +---------+ 1 row in set (0.04 sec)
  从上面可以看出表的数据分片很多。
  分析ZK的日志发现,ZK认为客户端发送的消息格式不正确,从而主动断开了clickhouse的连接。从clickhouse的异常日志有可以看出正在执行zk操作时出现了连接断开的错误。
  现在我们从代码层面去看看问题的根因,当clickhouse执行alter操作时,如果对应的mutation如果涉及到分片数据的变更时,就需要对分片进行锁定,而分片的锁定操作是在对应的分片对应的zk子目录下面创建一个临时节点,如下面代码所示: EphemeralLocksInAllPartitions::EphemeralLocksInAllPartitions(     const String & block_numbers_path, const String & path_prefix, const String & temp_path,     zkutil::ZooKeeper & zookeeper_)     : zookeeper(&zookeeper_) {     std::vector holders;     while (true)     {         ......          Coordination::Requests lock_ops;         // 这里没有         for (size_t i = 0; i < partitions.size(); ++i)         {             String partition_path_prefix = block_numbers_path + "/" + partitions[i] + "/" + path_prefix;             lock_ops.push_back(zkutil::makeCreateRequest(                     partition_path_prefix, holders[i], zkutil::CreateMode::EphemeralSequential));         }         lock_ops.push_back(zkutil::makeCheckRequest(block_numbers_path, partitions_stat.version));          Coordination::Responses lock_responses;         // 问题出在这里         Coordination::Error rc = zookeeper->tryMulti(lock_ops, lock_responses);         if (rc == Coordination::Error::ZBADVERSION)         {             LOG_TRACE(&Poco::Logger::get("EphemeralLocksInAllPartitions"), "Someone has inserted a block in a new partition while we were creating locks. Retry.");             continue;         }         else if (rc != Coordination::Error::ZOK)             throw Coordination::Exception(rc);
  clickhouse在zk的访问中,采用了大量批量操作,在上面的分片锁定操作中,它针对所有影响到的分片的锁定批量一次性提交命令到zk中,而zk的传输使用了jute,jute缺省最大的包大小为1M,具体细节可以参考一下关于zookeeper写入数据超过1M大小的踩坑记。
  这里clickhouse的问题在于它没有做分包,而是对所有影响的分片合并请求后,批量向zk发起请求,从而造成了超过zk最大的传输包大小,从而造成连接断开。
  为什么这里需要一次性的批量提交呢?具体的原因有朋友了解的可以分享一下,我理解可能clickhouse需要做类似事务级别的保证。 问题解决
  知道了问题的根因首先考虑到增加zk的jute缺省的最大包大小,zookeeper本身,我们可以在配置上实现。但是我们查看了一下clickhouse的zk配置相关参数,能够调整的主要是ip、port和会话时长,没有看到jute大小的控制参数,所以这条路基本上行不通,经过只修改zk的参数重启后,测试也发现不能成功。
  控制Alter DELETE影响的数据范围,从原来的Alter语句来看我们已经制定了时间的范围,但是看起来Clickhouse不会主动根据条件来做分区裁剪。查看源码也发现没有这块逻辑,但是从最新的clickhouse的文档中,我们可以看到Delete语句支持分区操作。 ALTER TABLE [db.]table DELETE [IN PARTITION partition_id] WHERE filter_expr
  但是这个语法在20.9.3.45版本中并没有得到支持,所以最后我们对clickhouse做了升级到21.X.X.X,并让业务方采用DELETE IN PARTITION,问题暂时得到解决。如果读者有更好的解决方案,希望留言探讨

最新,一加Ace(天玑8100)发布时间定了新机一加Ace发布会要来了,时间定于4月21日19点,届时会在线上举行,有兴趣的小伙伴们可以去看看。一加Ace将会提供开黑以及回蓝这两个配色,后置三摄模组,直角金属中框(其实跟之前狗狗币(DOGE)价格因埃隆马斯克的推特提案而上涨在教父埃隆马斯克提出以430亿美元收购Twitter之后,世界上最大的meme加密货币狗狗币(DOGE)周四在短短几分钟内飙升了5以上。马斯克最近成为Twitter的最大股东,持有新能源3月月报新能源汽车渗透率超25汽车新能源3月月报新能源汽车渗透率超25投资要点行业景气度跟踪疫情因素影响下,3月批发同比1。6。乘联会口径3月狭义乘用车产量实现182。3万辆(同比0。3,环比22。0),批发销智慧能源新赛道哪吒汽车走得很稳!1月8日,哪吒汽车第10万台量产车下线仪式在浙江桐乡举行,中国科学院院士欧阳明高受邀出席并发表了以智慧能源为主题的宣讲。欧阳明高院士从动力电池整车平台车网互动与智慧能源三个方面,分从德国开到法国梅赛德斯电动汽车EQXX电池续航能力突破1000公里今年一月,华尔街见闻文章提及,德国高端汽车制造商梅赛德斯宣布其VISIONEQXX原型汽车每次充电的续航里程将突破1000公里关口,当时金融时报引援公司的评价迄今为止最高效的电动汽新能源汽车成长的烦恼如何解专家访谈新能源汽车成长的烦恼如何解光明日报记者姚亚奇今年以来,新能源汽车呈高速增长态势。然而,新能源汽车发展中还面临一些成长的烦恼。哪些短板亟须补齐?如何稳定发展态势?对此,记者专iPhoneSE3在中国销量惨淡,而日本市场却卖爆,这是什么现象?2022年4月6日,日本调研公司BCN发布统计数据,3月18日开售的iPhoneSE3因价格低廉,成功地提振了苹果手机在日本销量,初期销售表现远优于前两代iPhoneSE机型。可是长安汽车欲以新能源车换道超车朱华荣称要做国际化品牌本报记者龚梦泽中国品牌迎来最佳换道并行甚至超车机遇,中国品牌不是旁观者或跟随者,而是并跑者,甚至是引领者。未来十年,全球一定会诞生世界级的中国品牌。在4月13日长安汽车全球伙伴大会有性能有颜值,这样的iPhone14Pro,iPhone6s用户心动吗?2022年,还在用iPhone6s的朋友们,会面临着一个换新机的问题。哪怕主观上觉得iPhone6s仍能继续用,但从客观角度来说iPhone6s这款手机确实已经到了该退休的阶段。比销量反超头部造车新势力,传统车企突围新能源赛道以特斯拉和造车新势力主导的新能源汽车市场格局,似乎正在被传统车企旗下的纯电新品牌搅局。进入4月以来,自主车企纷纷发布一季度产销数据,广汽埃安新能源汽车销量首次突破两万辆,上汽通用五消费者投诉倍思充电器不符合苹果协议无法正常使用,且产品质量出现问题客服不理会DoNews4月15日消息(张佳)日前,有消费者在黑猫投诉平台投诉称,倍思充电器因系统升级导致充电协议无法匹配手机无法充电,产品无法使用,另有消费者称,倍思产品存在质量问题,客服未
交换机中Vlan通信的几种情况一同一交换机相同vlan间通讯(1)创建vlan(2)划分链路类型(3)vlan划分对应接口二跨交换机间相同vlan的通讯(1)创建所需vlan(2)设置链路类型,把创建好的vla官宣!华为发布全球首款石墨烯电池手机昨天,有外媒报道称华为将在明年第一季度发布的P40系列上使用石墨烯电池,这意味着华为手机将拥有更强更持久更小的电池,以及更快的充电。P40电池容量将高达5000mAh,同时可使电池努比亚磁吸充电宝手机的第二块电池随着iPhone12发布,MagSafe又复活了,并成为iPhone12的主打功能。所谓MagSafe,就是手机通过和特定的配件连接使用,实现一贴即合。在去年购入iPhone12后外贸企业日常可操作的7个SEO内容技巧很多的外贸企业刚接触SEO,会对相关的知识感到非常的陌生,仅仅知道要为独立站创建优质原创的内容,但却不知道如何使用一些小技巧让SEO的排名上升的更快,以下将为大家介绍7种SEO小技网络营销的绝杀武器,内容营销做起来有句话说得好,线上营销若有十分惊艳,八分在内容营销。当下风靡的独立站SEO网络营销中,随着谷歌不断打击过度优化和堆积垃圾外链的行为,给创造优质内容的网站越来越多曝光的机会,可见内容手机存储已满,几乎不能运行了,怎么样能把存储内容全部清理掉?随着时间的流逝使用移动电话,通常会出现存储空间不足的情况。不要忽略这个问题。存储空间不足也会对我们的手机性能产生重大影响。在现实生活中举一个例子,我的一位同事长时间使用他的手机,从2020年中国数字音乐用户春节收听内容洞察白皮书核心摘要概念定义春节收听行为指从春运(指春节期间出于回家探亲外出旅游等目的发生的县级范围以上地理位置变化)开始到整个春节假期用户发生的收听音乐以及音频内容的行为。样本条件使用移动端四大古镇及四大古城中国四大古镇一般指广东的佛山镇,江西的景德镇,湖北的汉口镇,河南的朱仙镇。这四个城镇都具有浓厚的民族风格和地方特色,是灿烂的中国文化遗产的一部分。分别代表了地域的特色和一定历史时期使用谷歌地图获客的教程来啦起获客途径,除了外贸人普遍悉知的通过海关数据展会数据搜索引擎数据等跨境贸易数据进行获客外,新兴的社媒获客也掀起热潮。但是在多元化多渠道进行获客的当下,有一个方便且高效的获客工具却容想买高性能笔记本但要抢购?可以看看这款,大品牌不缺货纵观游戏本发展史,没有一年是像2021年这样卖得如此火热的,各大品牌的游戏本基本上都缺货,想要就得预约抢购,还要忍受涨价。虽然现在因为挖矿潮不是购买游戏本的最好时机,但对某些人来说北美求职指北E周报美国对外旅行禁令将于11月解除美国对外旅行禁令将于11月解除Google创纪录重金收购纽约办公楼美股餐饮业科技独角兽上市表现亮眼美国对外旅行禁令将于11月解除9月20日(上周一),白宫高级官员杰夫齐恩茨(Jef