Tencent / Tendis

Tendis is a high-performance distributed storage system fully compatible with the Redis protocol.
http://tendis.cn
Other
2.92k stars 319 forks source link

使用tendis遇到的一些问题 #188

Closed masayil closed 2 years ago

masayil commented 2 years ago

我搭建了一个三主三从的集群,在往集群中写入数据时遇到了一些问题。

  1. jeprof.3019982.10.m10.heap 有生成这种文件,这种文件的作用是什么?

  2. 从节点生成的WARN日志反应了什么问题? image

  3. 从节点 dump文件夹里的binlog日志并不会按照我设置的值进行清理(已经超过最小保留时间了),是我设置的问题吗? image

我的配置文件 bind 0.0.0.0 port 51001 loglevel notice cluster-enabled on storage rocks pidfile /run/var/tendisplus.pid daemon off logdir /tendis/log dir /tendis/db dumpdir /tendis/dump slowlog-log-slower-than 20000 maxbinlogkeepnum 200 truncateBinlogIntervalMs 100 truncateBinlogNum 50 binlogDelRange 50 netiothreadnum 6 executorthreadnum 32 rocks.blockcachemb 49152 rocks.cache_index_and_filter_blocks 0 rocks.max_open_files -1 rocks.compress_type snappy rocks.level_compaction_dynamic_level_bytes 1 rocks.max_background_compactions 24 rocks.write_buffer_size 67108864 rocks.target_file_size_base 67108864 rocks.max_bytes_for_level_base 536870912 cluster-migration-slots-num-per-task 10 cluster-migration-rate-limit 500 cluster-migration-binlog-iters 20 cluster-migration-distance 10000

raffertyyu commented 2 years ago
  1. 这个是tendisplus使用到的一个jemalloc附带的功能,内存画像,用来检测内存泄漏的。tendisplus日常使用的话可以忽略或者删除。使用细节可以参考jemalloc jeprof。tendisplus默认内存增长1g以上会生成一次当前的内存画像,如果heap文件增长特别快的话,就说明存在内存泄漏。
  2. 这里是一个正常的warning信息,就是cursor游标读到了过多的notfound标记。这里结合代码,这个计数代码存在逻辑问题,第一次出现not found就打印日志了,导致日志过多。代码逻辑应该是每1000次打印一次日志的。后续会安排修复的。
  3. binlog是tendisplus为了保存每次操作而生成的日志数据,以kv的形式存放在rocksdb中,也就是tendisplus目录下的db目录中的多个rocksdb里。另一方面,tendisplus后台会周期性的从rocksdb中导出binlog再以二进制的格式写入到dump目录下的特殊文件中,用于像回档冷备等场景。如果这些dump文件用不到的话,可以手动删除,或者设置一个cron任务或者shell脚本。配置中的keepsec和keepnum参数都只是用来控制rocksdb中保存的binlog条数的。dump目录下的文件是用户手动控制的。
masayil commented 2 years ago
  1. 这个是tendisplus使用到的一个jemalloc附带的功能,内存画像,用来检测内存泄漏的。tendisplus日常使用的话可以忽略或者删除。使用细节可以参考jemalloc jeprof。tendisplus默认内存增长1g以上会生成一次当前的内存画像,如果heap文件增长特别快的话,就说明存在内存泄漏。
  2. 这里是一个正常的warning信息,就是cursor游标读到了过多的notfound标记。这里结合代码,这个计数代码存在逻辑问题,第一次出现not found就打印日志了,导致日志过多。代码逻辑应该是每1000次打印一次日志的。后续会安排修复的。
  3. binlog是tendisplus为了保存每次操作而生成的日志数据,以kv的形式存放在rocksdb中,也就是tendisplus目录下的db目录中的多个rocksdb里。另一方面,tendisplus后台会周期性的从rocksdb中导出binlog再以二进制的格式写入到dump目录下的特殊文件中,用于像回档冷备等场景。如果这些dump文件用不到的话,可以手动删除,或者设置一个cron任务或者shell脚本。配置中的keepsec和keepnum参数都只是用来控制rocksdb中保存的binlog条数的。dump目录下的文件是用户手动控制的。

1.也就是说binlog是会依据我的配置文件进行清理的。 2.是不是只有从节点会导出binlog再以二进制的格式写入到dump目录下的特殊文件中? 3.从节点的dump目录直接设置脚本定时清空的。需要先执行BINLOGFLUSH,保留最新的一份.log文件,然后才把之前的.log文件删掉? 还是直接rm删掉?

raffertyyu commented 2 years ago
  1. 这个是tendisplus使用到的一个jemalloc附带的功能,内存画像,用来检测内存泄漏的。tendisplus日常使用的话可以忽略或者删除。使用细节可以参考jemalloc jeprof。tendisplus默认内存增长1g以上会生成一次当前的内存画像,如果heap文件增长特别快的话,就说明存在内存泄漏。
  2. 这里是一个正常的warning信息,就是cursor游标读到了过多的notfound标记。这里结合代码,这个计数代码存在逻辑问题,第一次出现not found就打印日志了,导致日志过多。代码逻辑应该是每1000次打印一次日志的。后续会安排修复的。
  3. binlog是tendisplus为了保存每次操作而生成的日志数据,以kv的形式存放在rocksdb中,也就是tendisplus目录下的db目录中的多个rocksdb里。另一方面,tendisplus后台会周期性的从rocksdb中导出binlog再以二进制的格式写入到dump目录下的特殊文件中,用于像回档冷备等场景。如果这些dump文件用不到的话,可以手动删除,或者设置一个cron任务或者shell脚本。配置中的keepsec和keepnum参数都只是用来控制rocksdb中保存的binlog条数的。dump目录下的文件是用户手动控制的。

1.也就是说binlog是会依据我的配置文件进行清理的。 2.是不是只有从节点会导出binlog再以二进制的格式写入到dump目录下的特殊文件中? 3.从节点的dump目录直接设置脚本定时清空的。需要先执行BINLOGFLUSH,保留最新的一份.log文件,然后才把之前的.log文件删掉? 还是直接rm删掉?

  1. 是的。rocksdb中保存的会,dump目录下的不会。需要手动清理。
  2. 主从都会导出,有两个keepnum参数分别控制主节点与从节点上保存的binlog条数。
  3. 主从节点都需要清理,rm直接删除就行,注意不要删除正在被写的文件即可。所以如果不需要dump文件的话,比如每隔一天,删除昨天的dump导出文件即可。
  4. 有slave的master节点不会主动导出binlog。
masayil commented 2 years ago
  1. 这个是tendisplus使用到的一个jemalloc附带的功能,内存画像,用来检测内存泄漏的。tendisplus日常使用的话可以忽略或者删除。使用细节可以参考jemalloc jeprof。tendisplus默认内存增长1g以上会生成一次当前的内存画像,如果heap文件增长特别快的话,就说明存在内存泄漏。
  2. 这里是一个正常的warning信息,就是cursor游标读到了过多的notfound标记。这里结合代码,这个计数代码存在逻辑问题,第一次出现not found就打印日志了,导致日志过多。代码逻辑应该是每1000次打印一次日志的。后续会安排修复的。
  3. binlog是tendisplus为了保存每次操作而生成的日志数据,以kv的形式存放在rocksdb中,也就是tendisplus目录下的db目录中的多个rocksdb里。另一方面,tendisplus后台会周期性的从rocksdb中导出binlog再以二进制的格式写入到dump目录下的特殊文件中,用于像回档冷备等场景。如果这些dump文件用不到的话,可以手动删除,或者设置一个cron任务或者shell脚本。配置中的keepsec和keepnum参数都只是用来控制rocksdb中保存的binlog条数的。dump目录下的文件是用户手动控制的。

1.也就是说binlog是会依据我的配置文件进行清理的。 2.是不是只有从节点会导出binlog再以二进制的格式写入到dump目录下的特殊文件中? 3.从节点的dump目录直接设置脚本定时清空的。需要先执行BINLOGFLUSH,保留最新的一份.log文件,然后才把之前的.log文件删掉? 还是直接rm删掉?

  1. 是的。rocksdb中保存的会,dump目录下的不会。需要手动清理。
  2. 主从都会导出,有两个keepnum参数分别控制主节点与从节点上保存的binlog条数。
  3. 主从节点都需要清理,rm直接删除就行,注意不要删除正在被写的文件即可。所以如果不需要dump文件的话,比如每隔一天,删除昨天的dump导出文件即可。

集群模式下是只有slave节点才会导出的吗?我搭建了3主3从的集群,只有slave会导出

masayil commented 2 years ago

好的。理解了,谢谢