在使用doris的时候,由于一些极端情况的出现或者doris本身bug的原因,会出现一些tablet损坏的情况,导致数据的插入和查询受到影响,下面总结一下doris副本出现损坏时进行修复的一些情况。
目录
2.2 使用meta_tool 删除tablet副本的元数据
在大多数情况下,如果tablet配置的是多个副本,如果某个副本发生损坏,Doris 都可以自动的进行副本修复和集群均衡,但在某些情况下,Doris 可能无法自动检测某些损坏的副本,从而导致查询或导入在损坏的副本上频繁报错。此时我们需要手动删除已损坏的副本。该方法可以适用于:删除版本数过高导致 -235 错误的副本、删除文件已损坏的副本等等。
首先,找到副本对应的 tablet id,假设为: 11032, 执行命令: show tablet 11032 ,然后再执行返回结果中DetailCmd一列的 show proc语句来查看副本的详情,如下图所示:

然后通过执行show proc语句返回的结果中,查看要修复的副本所在的BackendId,如下图所示:

此时,就可以得到此副本所在的tabletId是11302,backendId是10002,然后执行一下命令将副本标记为bad
ADMIN SET REPLICA STATUS PROPERTIES("tablet_id" = "11032", "backend_id" = "10002", "status" = "bad");
此时,再次通过 show proc 语句可以看到对应的副本的 IsBad 列值为 true,如下图所示:

这样,被标记为 bad 的副本不会再参与导入和查询。同时副本修复逻辑会自动补充一个新的副本。
如果tablet只配置了1个副本,或者某些极端特殊情况下,如代码BUG,突然停电,人为误操作等,可能导致部分tablet的全部副本都丢失,这种情况下,数据已经实质性的丢失。一般的表现情况就是在查询和导入数据时报错:
查询报错: ERROR 1064 (HY000): errCode = 2, detailMessage = Failed to get scan range, no queryable replica found in tablet: 11032
导入数据报错: errCode=2,detailMessage= Failed to commit txn 115471185 Tablet [11032] success replica num 0 is less than quorum replica num 1 while error backends
查询fe的日志,可以看到类似的日志:backend [10002] invalid situation. tablet[11032] has few replica[1], replica num setting is [3]
这个日志表示,Tablet 11032的所有副本已损坏或丢失。
但是在某些场景下,业务依然希望能够在即使有数据丢失的情况下,保证查询正常不报错,此时,我们可以通过使用空白Tablet填充丢失副本的功能,来保证查询能够正常执行。
注:该操作仅用于规避查询因无法找到可查询副本导致报错的问题,无法恢复已经实质性丢失的数据。
当确认数据已经无法恢复后,可以通过执行以下命令,生成空白副本。
ADMIN SET FRONTEND CONFIG ("recover_with_empty_tablet" = "true");
设置完成几分钟后,应该会在 Master FE 日志 fe.log 中看到如下日志:
tablet 11032 has only one replica 11033 on backend 10002 and it is lost. create an empty replica to recover it
该日志表示系统已经创建了一个空白 Tablet 用于填补缺失副本。
此时,通过查询来判断是否已经修复成功,如果能正常查询,则说明修复成功,通过以下命令关闭 recover_with_empty_tablet 参数:
ADMIN SET FRONTEND CONFIG ("recover_with_empty_tablet" = "false");
如果修复未成功,则需要借助Tablet 元数据管理工具 meta_tool 来删除tablet的元数据。
meta_tool 工具存放在 BE 的 lib/ 目录下,用于离线的各类元数据管理操作,使用前必须先停止BE进程!!!
还是以tablet 11032为例,说明删除的具体步骤。
还是首先执行 show tablet 11032 ,然后再执行返回结果中DetailCmd一列的 show proc语句来查看副本的详情,如下图所示:

此时需要记录一下各个副本所对应的BackendId,SchemaHash,PathHash 这三列的值。
以ReplicaId为11033的副本为例,其BackendId为10002,SchemaHash为566420086,PathHash为4267264358573635410
然后执行命令: SHOW PROC '/backends'; 来查看backendId为10002的服务器ip地址,如下图所示:

然后再执行命令: SHOW PROC '/backends/10002'; 来查询此backend所配置的存储信息,并找到PathHash为4267264358573635410所对应的数据目录RootPath,如下图所示:

此时,就可得到副本11033的信息tabletId为 11032,SchemaHash为566420086,rootPath为/bigdata/bigdata1/dorisData.HDD
然后,登录到BackendId为10002的服务器,切换到be的目录,然后执行命令:./bin/stop_be.sh 停止be进程。
然后执行元数据删除命令: ./lib/meta_tool --operation=delete_meta --root_path=/bigdata/bigdata1/dorisData.HDD --tablet_id=11032 --schema_hash=566420086
命令成功执行后,再执行命令: ./bin/start_be.sh --daemon 启动be即可。
然后,按照删除11033这个副本同样的步骤去删除tablet下剩下的副本即可。
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
我正在学习Rails,对Sinatra和Merb知之甚少。我想知道您会在哪些情况下使用Merb/Sinatra。感谢您的反馈! 最佳答案 Sinatra是一个比Rails更小、更轻的框架。如果你想让一些东西快速运行,只需发送几个URL并返回一些简单的内容,就可以使用它。看看Sinatrahomepage;这就是启动和运行“Hello,World”所需的全部内容,而在Rails中,您需要生成整个项目结构、设置Controller和View、设置路由等等(我还没有有一段时间写了一个Rails应用程序,所以我不知道“Hello,World
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成
假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实