Налаштування

Коли оновлювати налаштування інтервалу тактів та тайм-ауту виборів

Типові налаштування в etcd повинні добре працювати для встановлень у локальній мережі, де середня затримка мережі низька. Однак, при використанні etcd між кількома дата-центрами або в мережах з високою затримкою, налаштування інтервалу такту та тайм-ауту виборів можуть потребувати налаштування.

Мережа не є єдиним джерелом затримки. На кожен запит і відповідь можуть впливати повільні диски як на лідері, так і на послідовнику. Кожен з цих тайм-аутів представляє загальний час від запиту до успішної відповіді від іншої машини.

Параметри часу

Основний протокол розподіленого консенсусу покладається на два окремі параметри часу, щоб забезпечити можливість вузлів передавати лідерство, якщо один з них зупиняється або виходить з ладу. Перший параметр називається Інтервал такту. Це частота, з якою лідер повідомляє послідовників, що він все ще є лідером. Для найкращих практик параметр повинен бути встановлений навколо часу кругового проходження між учасниками. Стандартно, etcd використовує інтервал такту 100мс.

Другий параметр — це Тайм-аут виборів. Цей тайм-аут визначає, як довго вузол-послідовник буде обходитися без отримання такту, перш ніж спробувати стати лідером самостійно. Стандартно, etcd використовує тайм-аут виборів 1000мс.

Налаштування цих значень є компромісом. Значення інтервалу такту рекомендується встановлювати навколо максимуму середнього часу кругового проходження (RTT) між учасниками, зазвичай близько 0.5-1.5x часу кругового проходження. Якщо інтервал такту занадто низький, etcd буде надсилати непотрібні повідомлення, що збільшує використання ресурсів ЦП та мережі. З іншого боку, занадто високий інтервал такту призводить до високого тайм-ауту виборів. Вищий тайм-аут виборів займає більше часу для виявлення збою лідера. Найпростіший спосіб виміряти час кругового проходження (RTT) — це використати утиліту PING.

Тайм-аут виборів повинен бути встановлений на основі інтервалу такту та середнього часу кругового проходження між учасниками. Тайм-аути виборів повинні бути принаймні в 10 разів більше часу кругового проходження, щоб врахувати варіації в мережі. Наприклад, якщо час кругового проходження між учасниками становить 10мс, то тайм-аут виборів повинен бути принаймні 100мс.

Верхня межа тайм-ауту виборів становить 50000мс (50с), що повинно використовуватися лише при розгортанні глобально розподіленого кластера etcd. Розумний час кругового проходження для континентальних Сполучених Штатів становить 130мс, а час між США та Японією — близько 350-400мс. Якщо мережа має нерівномірну продуктивність або регулярні затримки/втрати пакетів, то можливо, що кілька повторних спроб можуть бути необхідні для успішної відправки пакета. Тому 5с є безпечною верхньою межею глобального часу кругового проходження. Оскільки тайм-аут виборів повинен бути на порядок більше часу передачі, у випадку ~5с для глобально розподіленого кластера, то 50 секунд стає розумним максимумом.

Значення інтервалу такту та тайм-ауту виборів повинні бути однаковими для всіх учасників в одному кластері. Встановлення різних значень для учасників etcd може порушити стабільність кластера.

Типові значення можуть бути перевизначені в командному рядку:

# Аргументи командного рядка:
$ etcd --heartbeat-interval=100 --election-timeout=500

# Змінні середовища:
$ ETCD_HEARTBEAT_INTERVAL=100 ETCD_ELECTION_TIMEOUT=500 etcd

Значення вказуються в мілісекундах.

Знімки

etcd додає всі зміни ключів до файлу журналу. Цей журнал зростає безкінечно і є повною лінійною історією кожної зміни, зробленої до ключів. Повна історія добре працює для кластерів з невеликим навантаженням, але кластери з великим навантаженням будуть нести великий журнал.

Щоб уникнути наявності величезного журналу, etcd робить періодичні знімки. Ці знімки надають спосіб для etcd стиснути журнал, зберігаючи поточний стан системи та видаляючи старі журнали.

Налаштування знімків

Створення знімків з бекендом V2 може бути дорогим, тому знімки створюються лише після певної кількості змін в etcd. Стандартно, знімки будуть створюватися після кожних 10,000 змін. Якщо використання памʼяті та диска в etcd занадто високе, спробуйте знизити поріг знімків, встановивши наступне на командному рядку:

# Аргументи командного рядка:
$ etcd --snapshot-count=5000

# Змінні середовища:
$ ETCD_SNAPSHOT_COUNT=5000 etcd

Диск

Кластер etcd дуже чутливий до затримок диска. Оскільки etcd повинен зберігати пропозиції до свого журналу, активність диска від інших процесів може викликати довгі затримки fsync. Результатом є те, що etcd може пропустити такт, викликаючи тайм-аути запитів та тимчасову втрату лідера. Сервер etcd іноді може стабільно працювати поряд з цими процесами, якщо йому надати високий пріоритет диска.

На Linux пріоритет диска для etcd можна налаштувати за допомогою ionice:

# найкраще зусилля, найвищий пріоритет
$ sudo ionice -c2 -n0 -p `pgrep etcd`

Мережа

Якщо лідер etcd обслуговує велику кількість одночасних клієнтських запитів, це може затримати обробку запитів від послідовників через мережеві затори. Це проявляється як повідомлення про помилки буфера відправки на вузлах-послідовниках:

dropped MsgProp to 247ae21ff9436b2d since streamMsg's sending buffer is full
dropped MsgAppResp to 247ae21ff9436b2d since streamMsg's sending buffer is full

Ці помилки можуть бути вирішені шляхом пріоритизації трафіку між вузлами etcd над клієнтським трафіком. На Linux трафік між вузлами можна пріоритизувати за допомогою механізму контролю трафіку:

tc qdisc add dev eth0 root handle 1: prio bands 3
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip sport 2379 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dport 2379 0xffff flowid 1:1

Щоб скасувати tc, виконайте:

tc qdisc del dev eth0 root

CPU

Оскільки etcd дуже чутливий до затримок, продуктивність можна додатково оптимізувати на системах Linux, встановивши режим керування ЦП на продуктивний або консервативний режим.

На Linux режим керування ЦП можна налаштувати на продуктивний режим:

echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor