nebula集群版本在写入数据的时候经常有问题,nebula-storage无法启动,经常需要删除数据才能启动,基本上集群活不过一个星期。历史数据怎么办?

  • nebula 版本:2.6.1
  • 部署方式:分布式
  • 安装方式: RPM
  • 是否为线上版本:Y
  • 硬件信息
    • 磁盘( 推荐使用 SSD)

image

两个10.9T磁盘
- CPU、内存信息
CPU 56 +32
内存


两个都为512G

  • 问题的具体描述
    问题:nebula集群版本在写入数据的时候经常有问题,nebula-storage无法启动,经常需要删除数据才能启动,基本上集群活不过一个星期。历史数据怎么办?
    请问使用方法哪里不对?还是nebula集群不支持大数据量的写入?

  • 相关的 meta / storage / graph info 日志信息
    日志信息:

配置文件:
nebula-storaged.conf (4.3 KB)
nebula-graphd.conf (3.2 KB)
nebula-metad.conf (1.9 KB)

代码 / 终端输出 / 日志…
代码: 循环写入边千亿条在写入到几十亿的时候集群就不行了。
def main(args: Array[String]): Unit = {
val params = new CommandLineArgs(args)
val configFileName = if (StringUtils.isEmpty(params.configFileName)) “archive-test.properties” else params.configFileName

val time1 = System.currentTimeMillis()

val conf = new SparkConf()
  .setIfMissing("spark.master", "local[*]")
  .set("spark.io.compression.codec", "snappy")
  .set("spark.rpc.message.maxSize", "2046")

val spark = SparkSession.builder()
  .config(conf)
  .appName(getClass.getName)
  .getOrCreate()

spark.sparkContext.setLogLevel("INFO")

val config = new Config(configFileName)

val numPartitions = config.numPartitions.toInt
val start = config.startNums.toLong
val end = config.endNums.toLong
val initNums = config.initNums.toLong
val part = config.part.toInt
val size = (end - start + 1) / part

// 写入到nebula中
val configNebula = NebulaConnectionConfig
  .builder()
  .withMetaAddress(config.meta)
  .withGraphAddress(config.graph)
  .withConenctionRetry(2)
  .build()

val nebulaWriteEdgeConfig = WriteNebulaEdgeConfig
  .builder()
  .withSpace("matrix")
  .withEdge("peer")
  .withSrcIdField("source_aid")
  .withDstIdField("target_aid")
  .withSrcAsProperty(false)
  .withDstAsProperty(false)
  .withBatch(1000)
  .build()

var playerList = ListBuffer[(String, String, Double)]()
for (i <- start to end) {
  val source_aid = i + initNums
  for (j <- 1 to 20) {
    val target_aid = initNums + initNums - i - j
    val weight = Random.nextInt(100) / 100.0
    playerList.append((source_aid.toString, target_aid.toString, weight))
  }

  if (i % size == 0) {
    import spark.implicits._
    val edgeDF = spark.sparkContext.makeRDD(playerList).toDF("source_aid", "target_aid", "weight")
      .repartition(numPartitions)
    edgeDF.write.nebula(configNebula, nebulaWriteEdgeConfig).writeEdges()
    playerList.clear()
  }
}


val time2 = System.currentTimeMillis()

val timeDiff = (time2 - time1)
println("耗时 :" + timeDiff + "毫秒")
spark.close()

}

1 个赞

能否提供更多的Storage日志?最好是完整的INFO日志

以及方便的话把,用gdb把core文件老爹RocksEngine.cpp:376那个位置的key的内容打印一下

有些日志被删除了,拿了最新启动报错的日志。

现在是无法启动。

emmm 最新的启动日志没有用。。。最好能提供出故障之前一段时间的日志。这个问题很诡异,我需要知道出故障之前发生了啥才能进一步排查,从代码上看没有看出任何问题。

#0 0x00007f84e8280e97 in __GI_raise (sig=) at …/sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007f84e8282801 in __GI_abort () at abort.c:81
#2 0x00000000021632dd in google::LogMessage::Fail() ()
#3 0x00000000021680be in google::LogMessage::SendToLog() ()
#4 0x0000000002162fae in google::LogMessage::Flush() ()
#5 0x0000000002163809 in google::LogMessageFatal::~LogMessageFatal() ()
#6 0x00000000018d6f57 in nebula::kvstore::RocksEngine::allParts() ()
#7 0x00000000018d858f in nebula::kvstore::RocksEngine::RocksEngine(int, int, std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&, std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&, std::shared_ptrrocksdb::MergeOperator, std::shared_ptrrocksdb::CompactionFilterFactory, bool) ()
#8 0x0000000000f5d539 in nebula::storage::StorageServer::getAdminStoreInstance() ()
#9 0x0000000000f61525 in nebula::storage::StorageServer::start() ()
#10 0x0000000000f2067b in main ()

出故障是昨天晚上在写入边的从30亿数据写入到40亿数据之间报错的,今天上午来的时候把日志删除了。现在怎么样才能在不删除数据的情况下,然后启动又能正常使用?而且这个问题我之前遇到过许多次,前几次是把storeaged与meta目录下的数据删除,然后就得到一个新的集群一样。

大概知道问题了,你把storage目录下有个space为0的那个删掉 应该就能启动起来

请问是存储路径下的storeage下的为0的目录删除?两个节点的都要删除吗?
image

删除0目录后启动还是无法连接,且还是报错中。

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。