Настольный кластер

2018-11-08

Свой первый “кластер” из одноплатных компьютеров я построил почти сразу после того, как микрокомпьютер Orange Pi PC начал набирать популярность. “Кластером” это можно было назвать с большой натяжкой, ибо с формальной точки зрения это была всего лишь локальная сеть из четырёх плат, которые “видели” друг друга и могли выходить в Интернет.

http://omahs.tumblr.com/post/135658720534/probably-cheapest-cluster-in-the-world-currently

Устройство участвовало в проекте SETI@home и даже успело что-то насчитать. Но, к сожалению, никто не прилетел забрать меня с этой планеты.
Однако, за всё время возни с проводами, разъёмами и microSD-картами я многому научился. Так, например, я выяснил, что не стоит доверять заявленной мощности блока питания, что было бы неплохо распределять нагрузку в плане потребления, да и сечение провода имеет значение.

И да, пришлось “колхозить” систему управления питанием, ибо одновременный старт пяти одноплатников может потребовать стартовый ток порядка 8-10а (5*2)! Это немало, особенно для БП, сделанных в подвалах страны, где мы так любим заказывать всякие… интересные гаджеты.

Начну, пожалуй, с неё. Задача свелась к относительно простым действиям — через заданный промежуток времени последовательно включить 4 канала, по которым подаётся 5 вольт. Самый простой способ реализовать задуманное — Arduino (коих у каждого уважающего себя гика в избытке) и вот такая чудо-плата с Али с 4мя реле.

Плата реле

И знаете, оно даже заработало.

Плата с реле и микроконтроллером

Кластер с управлением питанием

Однако, “холодильник-style” щелчки при старте вызывали некоторое отторжение. Во-первых при щелчке пробегала помеха по питанию и нужно было ставить конденсаторы, а во вторых вся конструкция была довольно крупной.

Так что в один прекрасный день я просто заменил блок реле на транзисторные ключи на основе IRL520.

Плата управления питанием IRL520

Это решило вопрос с помехами, но поскольку mosfet управляет “нулём”, пришлось отказаться от латунных ножек в стойке, дабы не соединить случайно землю плат.

И вот, решение отлично тиражируется и уже два кластера работают стабильно без всяких сюрпризов. Just as planned.

Одноплатники в кластере

Но, вернёмся к тиражируемости. Зачем покупать блоки питания за ощутимую сумму, когда буквально под ногами есть много доступных ATX ?
Мало того, на них есть все напряжения (5,12,3.3), зачатки самодиагностики и возможность программного управления.

Ну тут я особо распинаться не буду — статья про управление ATX через Ардуино есть вот здесь.

Ну что, все таблетки подъедены, марки тоже наклеены ? Пора объединить это всё воедино.

Диаграмма настольного кластера

Будет один головной узел, который соединяется с внешним миром по WiFi и отдаёт " интернеты" в кластер. Он будет питаться от дежурного напряжения ATX.

Фактически, за раздачу инета отвечает TBNG.
Так что при желании узлы кластера можно спрятать за TOR.

Также, будет хитрая плата, подключенная по i2c к этому головному узлу. Она сможет включать-выключать каждый из 10 рабочих узлов. Плюс, будет уметь управлять тремя вентиляторами 12в для охлаждения всей системы.

Сценарий работы такой — при включении ATX в 220в стартует головной узел. Когда система готова к работе — он последовательно включает все 10 узлов и вентиляторы.
Когда процесс включения закончен — головной узел будет обходить каждый рабочий узел и спрашивать мол, как мы себя чувствуем, какая мол температура. Если одна из стоек греется — увеличим обдув.
Ну и при команде отключения каждый из узлов будет аккуратно погашен и обесточен.

Схему платы я рисовал сам, поэтому выглядит она жутко. Однако, за трассировку и изготовление взялся хорошо обученный человек, за что ему большое спасибо.

Вот она в процессе сборки

Управляющая плата в процессе сборки

Вот один из первых эскизов расположения компонент кластера. Сделан на листке в клетку и увековечен через Office Lens телефоном.

Как все начиналось - эскиз кластера

Вся конструкция помещается на листе текстолита, купленного по случаю.

Примерно так выглядит расположение узлов внутри. Две стойки по пять плат.

Кластер в процессе сборки

Тут проглядывается управляющая Arduino. Она соединена с головной Orange Pi Pc по i2c через конвертер уровней.

Ну а вот финальный (текущий вариант).

Кластер стартует

Итак, все что нужно — это написать несколько утилит на Питоне, которые бы всей этой музыкой дирижировали — включали, включали, регулировали скорость вентилятора.

Не буду утомлять техническими подробностями — выглядит примерно так:

1
2
3
4
5
6
7
8
#!/usr/bin/env sh

echo "Starting ATX board..."
/home/zno/i2creobus/i2catx_tool.py --start
echo "Setting initial fan values..."
/home/zno/i2creobus/i2creobus_tool.py --fan 0 --set 60
/home/zno/i2creobus/i2creobus_tool.py --fan 1 --set 60
/home/zno/i2creobus/i2creobus_tool.py --fan 2 --set 60

Поскольку узлов у нас уже целых 10, берём на вооружение Ansible, который поможет , например, правильно выключить все узлы. Или запустить на каждом монитор температуры.

1
2
3
4
5
6
7
8
---

- hosts: workers
roles:
- webmon_stop
- webmon_remove
- webmon_install
- webmon_start

Меня часто в пренебрежительном тоне обвиняют, мол это просто локальная сеть одноплатников (как я уже упоминал в самом начале). Мне, в целом, насрать на чужое мнение, но пожалуй, добавим гламура и организуем docker swarm cluster.
Задача весьма простая и выполняется меньше чем за 10 минут. Потом запустим на головной ноде экземпляр Portainer, и вуаля!

Portainer 1

Теперь можно реально масштабировать задачи. Так, в данный момент в кластере работает майнер криптовалюты Verium Reserve. И, довольно успешно. Надеюсь, ближайший туземун окупит съеденное электричество ;) Ну или сократить количество вовлеченных узлов и майнить что-нибудь ещё типа Turtle Coin.

Portainer 2

Если хочется полезной нагрузки — в кластер можно закинуть Hadoop или устроить балансировку веб-серверов. Готовых образов в интернете много, да и обучающего материала достаточно. Ну а если образ (docker image) отсутствует — всегда можно собрать свой.

Чему меня это научило ? В целом, “стек” технологий очень широкий. Судите сами - Docker, Ansible, Python, прокачка Arduino (прости господи, ни к ночи будет сказано), ну и шелл конечно же. А так же KiCad и работа с подрядчиком :).

Что можно сделать лучше ? Многое. По софтовой части было бы неплохо переписать управляющие утилиты на Go. По железной — make it more steampunkish — КДПВ в начале отлично задирает планку. Так что есть, над чем работать.

Роли исполняли:

  • Головной узел — Orange Pi PC с usb wifi.
  • Рабочие узлы — Orange Pi PC2 x 10.
  • Сеть — 100 мбит TP-link@16ports.
  • Мозг — Клон Arduino на базе Atmega8 + конвертер уровней.
  • Сердце — контроллер питания АТХ с блоком питания.
  • Софт (душа) — Docker, Ansible, Python 3, немного шелла и чуть чуть лени.
  • Потраченное время — бесценно.

В процессе экспериментов пострадала пара плат Orange Pi PC2 из-за перепутанного питания (очень красиво горят), ещё одна PC2 лишилась Ethernet (это отдельная история, в которой я не понимаю физики процесса).

Вот вроде бы и вся история “по верхам”. Если кто-то считает её интересной — задавайте вопросы в комментариях. И голосуйте там же за вопросы (плюсуйте — у каждого коммента есть кнопка для этого). Наиболее интересные вопросы будут освещены в новых заметках.
Спасибо, что дочитали до конца.


В массы

В трубу