міграція mongodb shard chunk 500GB займає 13 днів - це повільно чи нормально?


9

У мене є кластерний фрагмент mongodb, штриховий ключ є хешованим. У ній є 2 набори реплік. Кожен набір реплік має 2 машини.

Я здійснив експеримент, додавши ще два набори реплік, і він починає вновлювати баланс.

Однак через деякий час я з’ясував, що міграція шматок має бути повільною. Для переміщення 1,4 ГБ даних потрібно 1 година.

Мене це хвилює, це означає, що мені доведеться чекати 13 днів, щоб завершити 500 Гб міграції шматка!

Я новачок у цьому матеріалі, і я не маю бога відчути, повільно це, швидко чи нормально. Але все-таки ця кількість мене не переконує.

Додаткові зауваження щодо експерименту: - використання машин середньої кількості Aws - не працює жоден інший процес, лише міграція шматка - встановлення за замовчуванням mongodb без додаткової конфігурації - shardkey використовує хеш-код об'єкта id (_id) - максимальний розмір шматка 64MB

Відповіді:


10

Оновлення: квітень 2018 року

Ця відповідь була правильною на момент запитання, але з того часу все пішло. З моменту введення версії 3.4 паралелізм, і квиток, на який я посилався, спочатку був закритий. Для отримання додаткової інформації я висвітлюю деякі деталі цієї останньої відповіді . Решту відповіді я залишу так, тому що вона залишається хорошим посиланням на загальні питання / обмеження, а також є дійсною для будь-кого на старій версії.

Оригінальний відповідь

Я даю повне пояснення того, що відбувається з міграцією шматка в курсі M202 Advanced, якщо вас цікавить. Загалом кажучи, скажімо, що міграція не дуже швидка, навіть для порожніх шматок, через ведення господарства, щоб переконатися, що міграції працюють в активній системі (вони все одно трапляються, навіть якщо нічого, крім балансування, не відбувається).

Крім того, є лише одна міграція, яка відбувається одночасно на всьому кластері - паралелізму немає. Отже, незважаючи на те, що у вас є два "повних" вузла та два "порожніх" вузла, в будь-який момент часу відбувається максимум одна міграція (між осколком з найбільшими шматками та осколком з найменшим). Отже, додавши 2 черепки, ви нічого не отримуєте з точки зору швидкості врівноваження і просто збільшуєте кількість шматочків, які потрібно перемістити.

Що стосується самих міграцій, шматки, ймовірно, мають розмір приблизно 30 Мб (залежить від того, як ви заселили дані, але загалом це буде ваш середній розмір за типовим розміром максимуму). Ви можете побігти db.collection.getShardDistribution()за деякою цією інформацією і подивитися тут мою відповідь щодо способів отримати ще більше інформації про ваші шматки.

Оскільки ніякої іншої активності не відбувається, для міграції трапиться цільовий осколок (одна з недавно доданих черепків) повинен прочитати ~ 30MiB даних з вихідних фрагментів (одна з оригінальних 2) та оновити конфігураційні сервери на відобразити нове місце, коли це буде зроблено. Переміщення 30 Мбіт даних не повинно бути великим місцем для звичайної системи без навантаження.

Якщо це повільно, є кілька можливих причин, чому це так, але найбільш поширеними для не зайнятої системи є:

  • Джерело вводу / виводу диска - якщо дані не знаходяться в активній пам'яті під час їх читання, вони повинні бути підключені з диска
  • Мережа - якщо є затримка, обмеження швидкості, втрата пакету тощо, то читання може зайняти досить багато часу
  • Цільовий диск вводу-виводу - дані та індекси повинні бути записані на диск, багато індексів можуть погіршити це, але зазвичай це не проблема в мало завантаженій системі
  • Проблеми з міграціями, що спричиняють перебої та невдалі міграції (проблеми з конфігураційними серверами, проблеми з делетами на праймери)
  • Затримка реплікації - для міграцій для реплікації наборів, записує занепокоєння w:2або w:majorityвикористовується за замовчуванням і для її задоволення потрібні актуальні вторинні пристрої.

Якщо система була зайнята тоді суперечками з пам'яттю, суперечки щодо блокування, як правило, і тут були підозрюваними.

Щоб отримати більше інформації про тривалість міграції, якщо вони провалюються тощо, подивіться записи у вашому config.changelog:

// connect to mongos
use config
db.changelog.find()

Як ви бачили, і як я зазвичай кажу людям, коли я займаюся тренуванням / навчанням, якщо ви знаєте, що вам знадобляться 4 осколки, то зазвичай краще починати з 4, а не нарощувати. Якщо це так, то вам потрібно знати, що додавання осколка може зайняти багато часу, і спочатку це чистий мінус на ресурси, а не на прибуток (див. Частину II мого ряду підводних каменів для більш детального обговорення цього питання).

Нарешті, для відстеження / оновлення / коментування запиту на функцію для покращення паралелізму міграційних фрагментів, перегляньте SERVER-4355


Дякую, цей механізм міграції фрагментів пояснює набагато більше, ніж документація mongodb.
rendybjunior

Я точно приєднаюся до вашого курсу. :) Що ви думаєте про швидкість, про яку я згадував раніше? Це нормально чи повільно? Я знаю, що це питання є відносним на основі багатьох аспектів. Але я прошу вашої власної думки
rendybjunior

Це здається трохи повільним на основі вашого опису, але мені доведеться порівняти середні екземпляри, щоб бути впевненим. Ваша поточна ставка може бути все, на що вони здатні, або у вас може бути одна з проблем, про які я згадував у відповіді. Один елемент управління, який ви можете спробувати, - це ручний рубіжний рух - вимкніть балансир і, по суті, зробіть це самостійно, щоб побачити, чи є проблеми і який вплив має рух на джерело / цільові системи. Інформацію про moveChunk ви можете знайти тут: docs.mongodb.org/manual/reference/method/sh.moveChunk
Adam C

Додамо лише, що у монгоДБ низька пріоритетність, навіть у високоефективних системах може зайняти деякий час, якщо вони зайняті.
Антоніос

@Antonis - не впевнений, що ви маєте на увазі під пріоритетом, міграція шматка - це зчитування з вихідного фрагмента (те саме, що і будь-яке інше читання) і запис на цільовому фрагменті (з вищезгаданим питанням запису), немає пріоритетності цих операцій. проти інших. Вони будуть повільними у зайнятих системах, але не через якусь властиву різниці пріоритетів.
Адам С
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.