راهنمای جامع Ceph
Englishشروع کنید

مسیر نوشتن BlueStore

در کتاب: فصل ۱۲

آزمایشگاه

مسیر نوشتن BlueStore

دستگاه، offset و طول یک نوشتن را انتخاب کنید و ببینید BlueStore چطور آن را تکه می‌کند و تصمیم می‌گیرد چه چیزی از WAL (deferred) و چه چیزی مستقیم نوشته شود.

۱تکه
۴ KiBبایت‌هایی که از WAL می‌گذرند
–بایت‌هایی که مستقیم نوشته می‌شوند
۶۴ KiBprefer_deferred_size
big ۴ KiB۰ B۴ KiBmin_alloc_size = 4 KiB
نوشتن روی واحدهای تخصیص ۴ KiB: سبز مستقیم نوشته می‌شود و کهربایی از WAL می‌گذرد.
تکهبازهمسیرشیوهخواندن پیشینتخصیص
big۰ B + ۴ KiBبازنویسی بزرگ در blobهای موجودdeferred (WAL)––
OSDBlueStoreallocatorblock deviceRocksDB / WAL۱. queue_transactions۲. بُرش در min_alloc۳. عملیات deferred۴. commit در KV همراه داده۵. تأیید۶. نوشتن deferred۷. پاک‌سازی
  1. queue_transactions OSD تراکنشی به BlueStore می‌دهد؛ یک TransContext در حالت PREPARE ساخته می‌شود. BlueStore::queue_transactions, _txc_create
  2. بُرش در min_alloc _do_write_data نوشتن را به ۱ تکه می‌بُرد و هر تکه را به _do_write_small یا _do_write_big می‌فرستد. BlueStore::_do_write_data, _do_write_small, _do_write_big
  3. عملیات deferred بایت‌هایی که باید در جا نوشته شوند در یک bluestore_deferred_op_t درون همان تراکنش RocksDB قرار می‌گیرند. bluestore_deferred_op_t, BlueStore::_txc_add_transaction
  4. commit در KV همراه داده _kv_sync_thread، metadata و دادهٔ deferred را با یک sync در RocksDB commit می‌کند؛ نوشتن WAL تنها نوشتن هم‌زمان روی دیسک است. BlueStore::_kv_sync_thread, _txc_apply_kv
  5. تأیید پس از commit نوشتن ماندگار است؛ _txc_committed_kv callbackهای OSD را کامل می‌کند و کلاینت می‌تواند تأییدش را بگیرد. BlueStore::_txc_committed_kv, _txc_state_proc
  6. نوشتن deferred بعداً و دسته‌دسته (bluestore_deferred_batch_ops)، بایت‌های deferred سر جایشان روی block device نوشته می‌شوند. BlueStore::_deferred_queue, _deferred_submit_unlock
  7. پاک‌سازی وقتی آن نوشتن روی دیسک رفت، _deferred_aio_finish رکورد deferred را از RocksDB پاک می‌کند. BlueStore::_deferred_aio_finish
new data: deferred ⇔ data_size < prefer_deferred_size (۶۴ KiB) · small overwrite: always deferred · big overwrite: deferred ⇔ len ≤ 2 × prefer_deferred_size

مطابق با:

  • src/os/bluestore/BlueStore.cc :: _do_write, _do_write_data بریدن نوشتن به سر، میانه و دُم
  • BlueStore.cc :: _do_write_small, _do_write_big مسیرهای نوشتن کوچک و بزرگ
  • BlueStore.cc :: _do_alloc_write (prefer_deferred_size) تخصیص و تصمیم deferred یا مستقیم
  • BlueStore.cc :: _txc_state_proc, _kv_sync_thread, _deferred_queue ماشین حالت تراکنش، commit در KV و صف deferred
  • src/os/bluestore/BlueStore_components.h :: TransContext::state_t حالت‌های TransContext
  • src/common/options/global.yaml.in :: bluestore_min_alloc_size_hdd/ssd (4K), bluestore_prefer_deferred_size_hdd (64K) / _ssd (0) اندازه‌های پیش‌فرضی که این‌جا به کار رفته
تصویری ثابت از شبیه‌ساز؛ نسخهٔ تعاملی در آزمایشگاه نسخهٔ وب است. آزمایشگاه تعاملی: مسیر نوشتن BlueStore