Инженеры Tencent научат вас играть в RocksDB

база данных MySQL

Приветствую всех вОблако + сообщество, получить больше крупной технической практики Tencent по галантерее ~

автор:Основная команда облачной базы данных Tencent

Оригинальное название: [Tencent Cloud CDB] Научите играть с MyRocks/RocksDB — СТАТИСТИКА и фоновые темы

0. Intro

на Фейсбукеверсия MySQL(далее именуемый MyRocks), RockSDB — это дополнительный механизм хранения. Важным преимуществом Rocksdb является меньше места на диске по сравнению с движком INNODB. В производственной системе, особенно в Интернет-приложениях уровня выше миллиарда, дисковое пространство является одной из относительно больших затрат, в то время как RockSDB, способный использовать меньше дискового пространства, несомненно, привлекателен. Однако в производственной системе использование новых механизмов хранения, естественно, имеет свои потенциальные риски, за исключением различных инструментов BenchMark для тестирования различных данных о производительности, всесторонние внутренние индикаторы могут помочь нам действительно понять, что происходит в базе данных, для настройки производительности. и развитие имеют руководящее значение. MYROCKS предоставляет более полные внутренние индикаторы с помощью Show Engine Rocksdb Status и нескольких information_schema.

В этой статье будет представлен принцип реализации статистики STATISTICS и фоновых потоков в SHOW ENGINE ROCKSDB STATUS. На основе понимания принципа реализации легче расширить функцию, чтобы она служила нам лучше.

Вызов команды SHOW ENGINE ROCKSDB STATUS возвращает несколько строк данных, включая:

  • СТАТИСТИКА: Накопление различного количества/времени всех операций всех потоков движка RocksDB, таких как rockdb.block.cache.hit и rockdb.db.write.micros.
  • BG_THREADS: статус фоновых потоков.
  • DBSTATS: Статистика операций с базой данных.
  • CF_COMPACTION: статистика, связанная с уплотнением каждого семейства столбцов.
  • MEMORY_STATS: Использование памяти.

Вызов SHOW ENGINE ROCKSDB STATUS вернет несколько строк данных, но эти данные не сохраняются в таблице заранее, а соответствующие значения в памяти возвращаются пользователю путем вызова функции rockdb_show_status, расположенной в файле rockdb/ha_rocksdb.cc. файл.

1. STATISTICS

Согласно официальным документам RocksDBSTATISTICS, включение СТАТИСТИКИ увеличит дополнительную стоимость на 5%-10%.

Статистика STATISTICS записывает накопление различного количества/времени всех операций всех потоков движка RocksDB. Движок RocksDB создал множество скрытых точек в коде в своих различных операциях, таких как Поместить/Получить/Удалить.

Возьмем в качестве примера функцию GetEntryFromCache, ее функция заключается в возврате доступного кэша блоков. В частности, вы можете видеть, что статистика является параметром GetEntryFromCache и block_cache->Lookup. Правильно, собирает данные отовсюду, опираясь на статистику параметров. Когда доступен блочный кеш, RecordTick вызывается три раза, чтобы увеличить счетчик для трех статистических значений; если блочный кеш недоступен, он также увеличивает счетчик для BLOCK_CACHE_MISS и block_cache_miss_ticker.

Cache::Handle* GetEntryFromCache(Cache* block_cache, const Slice& key,
                                 Tickers block_cache_miss_ticker,
                                 Tickers block_cache_hit_ticker,
                                 Statistics* statistics) {
  auto cache_handle = block_cache->Lookup(key, statistics);
  if (cache_handle != nullptr) {
    PERF_COUNTER_ADD(block_cache_hit_count, 1);
    // overall cache hit
    RecordTick(statistics, BLOCK_CACHE_HIT);
    // total bytes read from cache
    RecordTick(statistics, BLOCK_CACHE_BYTES_READ,
               block_cache->GetUsage(cache_handle));
    // block-type specific cache hit
    RecordTick(statistics, block_cache_hit_ticker);
  } else {
    // overall cache miss
    RecordTick(statistics, BLOCK_CACHE_MISS);
    // block-type specific cache miss
    RecordTick(statistics, block_cache_miss_ticker);
  }

  return cache_handle;
}

1.1 Интерфейс СТАТИСТИКА RocksDB

Способ использования СТАТИСТИКИ также прост.

Его заголовочные файлы расположены по адресу:

include/rocksdb/statistics.h
monitoring/statistics.h

Инструкции:

Options options;
options.statistics = rocksdb::CreateDBStatistics();

Дополнительные уровни статистики:

  • kExceptDetailedTimers: удалить тайминги ожидания и уплотнения мьютекса
  • kExceptTimeForMutex: удалить время ожидания мьютекса
  • kВсе: все

Существует два типа статистики:

  • ticker: count, тип — 64-битное целое число без знака. Используется для измерения счетчиков (например, «rocksdb.block.cache.hit»), суммарных байтов (например, «rocksdb.bytes.writing») или времени (например, «rocksdb.l0.slowdown.micros»).
  • гистограмма: Статистическое распределение статистических данных, включая максимум, минимум, среднее значение, медиану и стандартное отклонение.

Интерфейс для статистических функций:

  • MeasureTime: имя функции неоднозначно. Фактически значение записывается на гистограмме.
  • RecordTick: накопление тикера.

Интерфейс для получения результата:

  • Statistics::getTickerCount: укажите тип тикера для получения подсчета.
  • Statistics::histogramData: укажите тип Histograms и верните структуру HistogramData, элементами которой являются статистические значения, включая максимальное, минимальное, среднее, медиану и стандартное отклонение.
  • Statistics::getHistogramString: задает тип гистограммы и возвращает читаемую строку гистограммы.
  • Statistics::ToString(): возвращает удобочитаемую строку, включая все тикеры и гистограммы.

1.2 СТАТИСТИКА реализации RocksDB

RocksDB реализует класс StatisticsImpl и наследует интерфейс Statistics.

Основной интерфейс:

  • getTickerCount
  • histogramData
  • getHistogramString
  • getAndResetTickerCount
  • recordTick
  • measureTime
  • ToString

Переменные-члены:

  • TickerInfo tickers_[INTERNAL_TICKER_ENUM_MAX];
  • HistogramInfo histograms_[INTERNAL_HISTOGRAM_ENUM_MAX];

Структуры данных типов TickerInfo и HistogramInfo здесь аналогичны: локальный счетчик потока или время плюс нелокальная статистика для накопления счетчика или времени.

Тип TickerInfo содержит два параметра:

thread_value типа ThreadLocalPtr (истинный тип ThreadTickerInfo), в том числе:

  • значение типа целое число
  • Указатель на merged_sum
  • merged_sum целочисленного типа
  • Тип HistogramInfo содержит два параметра:

thread_value типа ThreadLocalPtr (истинный тип ThreadHistogramInfo), в том числе:

  • значение типа HistogramImpl
  • указатель на merged_hist
  • указатель на merge_lock
  • merged_hist типа HistogramImpl
  • merge_lock типа Mutex

На самом деле реализация, связанная со СТАТИСТИКОЙ, относительно оригинальна, и это ключ к тому, чтобы использовать СТАТИСТИКУ для увеличения только на 5%-10%. Во избежание частых сбоев кэша ЦП из-за совместного использования данных между потоками, функции merged_sum и merged_hist пусты при инициализации, и тогда и только тогда, когда поток завершается, вызывается функция mergeThreadValue для накопления локальных переменных потока в TickerInfo и HistogreamInfo для merged_sum и merged_hist.

1.3 Использование MyRocks

MyRocks использует интерфейс, предоставляемый RocksDB, для статистики данных. Объявив переменную rockdb_stats и инициализировав ее функцией rockdb_init_func при запуске движка RocksDB.

rocksdb_stats = rocksdb::CreateDBStatistics();
rocksdb_db_options->statistics = rocksdb_stats;

Помимо использования статистики со всех слоев движка RocksDB, MyRocks также определяет

commit_latency_stats = new rocksdb::HistogramImpl();

В двух функциях rockdb_commit_by_xid и rockdb_commit время, потраченное на каждую фиксацию, подсчитывается по времени.

rocksdb::StopWatchNano timer(rocksdb::Env::Default(), true);
...
commit_latency_stats->Add(timer.ElapsedNanos() / 1000);

В функции rockdb_show_status процесс вывода статистики выглядит следующим образом:

  1. Если задана rockdb_stats, вызовите rockdb_stats->ToString(), чтобы преобразовать статистическое значение в удобочитаемую строку;
  2. commit_latency_stats — это тип гистограммы, которая выводит соответствующие значения четырех позиций, соответствующих 50%, 95%, 99% и 100%.
  3. Если определены переменные свойств, такие как is-write-stopped или fact-delayed-write-rate, они также будут выведены.

2 фоновые темы

Результаты, относящиеся к BG_THREADS, можно получить, вызвав SHOW ENGINE ROCKSDB STATUS, и его вывод аналогичен:

Type: BG_THREADS
Name: 140173379593984
Status:
thread_type: Low Pri##
cf_name: default
operation_type: Compaction
operation_stage: CompactionJob::ProcessKeyValueCompaction
elapsed_time_ms: 6172.244 ms
BaseInputLevel: 0
BytesRead: 992806363
BytesWritten: 992071408
IsDeletion: 0
IsManual: 0
IsTrivialMove: 0
JobID: 1936
OutputLevel: 5
TotalInputBytes: 1586832446
state_type:

Вы можете увидеть много информации: этот поток проходит уплотнение, на этапе CompactJob::ProcessKeyValueCompaction это заняло 6172,244 мс, количество прочитанных байтов — 992806363, количество записанных байтов — 992071408. Однако он не включает такую ​​информацию, как исходные и целевые файлы, которые могут представлять интерес для выполняемого сжатия. Как упоминалось в начале статьи, знание того, как работает реализация, позволяет нам лучше масштабироваться.

2.1 Интерфейс и реализация статуса потока

Команда SHOW ENGINE ROCKSDB STATUS в MyRocks показывает, что механизм BG_THREAD использует интерфейс статуса потока в RocksDB.

Его заголовочные файлы расположены по адресу:

include/rocksdb/env.h
include/rocksdb/thread_status.h
util/thread_operation.h
monitoring/thread_status_updater.h
monitoring/thread_status_util.h

ключевой класс:

ThreadStatusUpdater: сохраняет статус соответствующих фоновых потоков и указатели на статус всех фоновых потоков. ThreadStatusUtil: Этот класс имеет только статические переменные и статические методы.Рекомендуется обновлять статус в ThreadStatusUpdater через методы этого класса.

Инструкции:

  • Добавьте статистику потока в ThreadStatusUpdater: вызовите ThreadStatusUtil::RegisterThread
  • Удалите статистику потока из ThreadStatusUpdater: вызовите ThreadStatusUtil::UnregisterThread
  • Другие функции для изменения состояния потока: см. Monitoring/thread_status_util.h

Состояние текущего фонового потока можно получить, вызвав функцию GetThreadList() env, а значение состояния сохраняется в векторе. Отобразите в нем содержимое, подобное следующему изображению:

Как видно из кода, целью реализации состояния потока является отображение текущего состояния очистки и сжатия. Конечно, мы также можем сохранить статус пользовательского потока в статусе потока, который можно отобразить, вызвав команду SHOW ENGINE ROCKSDB STATUS.

В частности, вы можете видеть, что значения состояния, специфичные для уплотнения, следующие:

enum CompactionPropertyType : int {
    COMPACTION_JOB_ID = 0,
    COMPACTION_INPUT_OUTPUT_LEVEL,
    COMPACTION_PROP_FLAGS,
    COMPACTION_TOTAL_INPUT_BYTES,
    COMPACTION_BYTES_READ,
    COMPACTION_BYTES_WRITTEN,
    NUM_COMPACTION_PROPERTIES
  };

Значения статуса для сброса:

  enum FlushPropertyType : int {
    FLUSH_JOB_ID = 0,
    FLUSH_BYTES_MEMTABLES,
    FLUSH_BYTES_WRITTEN,
    NUM_FLUSH_PROPERTIES
  };

2.2 Использование MyRocks/RocksDB

В реализации пула потоков RocksDB каждый запущенный фоновый поток добавляется к набору наблюдаемых фоновых потоков путем вызова ThreadStatusUtil::RegisterThread.

ThreadPoolImpl::Impl::StartBGThreads-->BGThreadWrapper-->ThreadStatusUtil::RegisterThread

В функции rockdb_show_status процесс вывода BG_THREAD выглядит следующим образом:

  1. Получите коллекцию ThreadStatus для всех фоновых потоков, вызвав GetThreadList(&thread_list).
  2. Состояние каждого фонового потока выводится по очереди путем обхода коллекции ThreadStatus.

3. Резюме

В этой статье представлено связанное содержимое STATISTICS и BG_THREAD в инструкции SHOW ENGINE ROCKSDB STATUS.

Связанное Чтение

Глубокая оптимизация ядра MySQL

[Tencent Cloud CDB] Углубленный анализ бинарного журнала MySQL

[Tencent Cloud CDB] Анализ исходного кода · Отправка группы бинарных журналов MySQL и Multi-Threaded-Slave

Эта статья была разрешена автором для публикации в сообществе Yunjia, пожалуйста, укажите при перепечаткеИсточник статьи;