Кластеризация done right
От: Аноним  
Дата: 19.01.11 11:32
Оценка:
Добрый день.
Я работаю над приложением, которое должно хорошо масштабироваться горизонтально. При этом, я хочу добиться того, что-бы развертывание и настройка моей системы были очень простыми. Желательно, что-бы конфигурирование вообще не требовалось. Предполагается, что все будет работать в рамках одного датацентра, все узлы будут в одной подсети или вообще на одной машине. Поэтому, я думаю сделать так: приложение состоит их одинаковых нодов, каждый нод, после старта начинает рассылку multicast пакетов, а также их чтение. Пакет содержит ip-адрес нода, а также служебную информацию. Помимо этого, пакет рассылается не открытым текстом, он зашифрован и подписан (secret key у всех нодов один и тот же). В общем, это должно привести к тому, что каждый узел будет знать обо всех остальных узлах.
Каждый узел — однопоточное приложение(по большей части, в один момент времени выполняется один запрос, но узел держит много подключений), после запуска читает данные с диска и больше туда не лезет. В дальнейшем, весь ввод/вывод, это обмен данными с клиентом а данные хранятся в памяти и меняются очень редко(такова специфика задачи), для того, что-бы использовать все процессоры можно запустить на машине несколько копий приложения, так я хочу избавиться от возможных проблем с многопоточностью.
Запрос выполняется следующим образом, клиент подключается к одному из узлов(сервер выбирается тупо, по round robin, правда я пока не решил, откуда он может получить список адресов, по которым можно подключаться, к тому же, я еще не знаю, будет подключение постоянным или нет), отправляет запрос. Этот запрос пушится другим узлам, которые выполняют обработку, и отправляют исходному узлу результаты. Исходный узел собирает их и отправляет результат клиенту. В общем, что-то вроде map reduce.
Не нравится мне то, что данная схема плохо масштабируется, в общей сложности нам потребуется N*N соединений между нодами. Быть может стоит ввести мастер ноды, к которым будут подключаться клиенты и которые будут просить данные у простых нодов и выполнять reduce стадию запроса. Но это усложнит конфигурацию.
Хочется добиться самоорганизации, что-бы избавиться от явного описания связей между нодами. Как быть?
Re: Кластеризация done right
От: Мишень-сан  
Дата: 19.01.11 12:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>Я работаю над приложением, которое должно хорошо масштабироваться горизонтально. При этом, я хочу добиться того, что-бы развертывание и настройка моей системы были очень простыми. Желательно, что-бы конфигурирование вообще не требовалось. Предполагается, что все будет работать в рамках одного датацентра, все узлы будут в одной подсети или вообще на одной машине. Поэтому, я думаю сделать так: приложение состоит их одинаковых нодов, каждый нод, после старта начинает рассылку multicast пакетов, а также их чтение. Пакет содержит ip-адрес нода, а также служебную информацию. Помимо этого, пакет рассылается не открытым текстом, он зашифрован и подписан (secret key у всех нодов один и тот же). В общем, это должно привести к тому, что каждый узел будет знать обо всех остальных узлах.
А>Каждый узел — однопоточное приложение(по большей части, в один момент времени выполняется один запрос, но узел держит много подключений), после запуска читает данные с диска и больше туда не лезет. В дальнейшем, весь ввод/вывод, это обмен данными с клиентом а данные хранятся в памяти и меняются очень редко(такова специфика задачи), для того, что-бы использовать все процессоры можно запустить на машине несколько копий приложения, так я хочу избавиться от возможных проблем с многопоточностью.
А>Запрос выполняется следующим образом, клиент подключается к одному из узлов(сервер выбирается тупо, по round robin, правда я пока не решил, откуда он может получить список адресов, по которым можно подключаться, к тому же, я еще не знаю, будет подключение постоянным или нет), отправляет запрос. Этот запрос пушится другим узлам, которые выполняют обработку, и отправляют исходному узлу результаты. Исходный узел собирает их и отправляет результат клиенту. В общем, что-то вроде map reduce.
А>Не нравится мне то, что данная схема плохо масштабируется, в общей сложности нам потребуется N*N соединений между нодами. Быть может стоит ввести мастер ноды, к которым будут подключаться клиенты и которые будут просить данные у простых нодов и выполнять reduce стадию запроса. Но это усложнит конфигурацию.
А>Хочется добиться самоорганизации, что-бы избавиться от явного описания связей между нодами. Как быть?

Поглядите в сторону Erlang.
Re: Кластеризация done right
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 19.01.11 13:01
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Хочется добиться самоорганизации, что-бы избавиться от явного описания связей между нодами. Как быть?

Вероятно, почитать про кластеры балансировки сетевой нагрузки. Но там узлы (прикладное ПО, работающее на физическом сервере) не знают друг о друге; просто совсем непонятно по сообщению, зачем вашим узлам знать друг о друге.
Re[2]: Кластеризация done right
От: Аноним  
Дата: 19.01.11 13:12
Оценка:
Здравствуйте, rsn81, Вы писали:

R>Здравствуйте, <Аноним>, Вы писали:


А>>Хочется добиться самоорганизации, что-бы избавиться от явного описания связей между нодами. Как быть?

R>Вероятно, почитать про кластеры балансировки сетевой нагрузки. Но там узлы (прикладное ПО, работающее на физическом сервере) не знают друг о друге; просто совсем непонятно по сообщению, зачем вашим узлам знать друг о друге.

Им и не нужно знать. Попробую описать задачу. Есть большой набор данных, он делится между узлами, каждый из них может обрабатывать только свою часть. О других ему ничего не нужно знать. Для выполнения запроса, нужно, что-бы каждый узел выполнил часть работы, а затем собрать их этих частей единый результат. Разделить данные и выполнить запрос на одном сервере я могу, а разбить это все на части — нет. Можно конечно использовать hadoop + zookeeper, но это как мне кажется overkill. Все ноды будут выполнять только одну задачу и знать им особо ничего не нужно.
Re[3]: Кластеризация done right
От: rsn81 Россия http://rsn81.wordpress.com
Дата: 19.01.11 13:22
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Им и не нужно знать. Попробую описать задачу. Есть большой набор данных, он делится между узлами, каждый из них может обрабатывать только свою часть. О других ему ничего не нужно знать. Для выполнения запроса, нужно, что-бы каждый узел выполнил часть работы, а затем собрать их этих частей единый результат. Разделить данные и выполнить запрос на одном сервере я могу, а разбить это все на части — нет. Можно конечно использовать hadoop + zookeeper, но это как мне кажется overkill. Все ноды будут выполнять только одну задачу и знать им особо ничего не нужно.

В такой постановке мой совет выше не в дугу.
Re: Кластеризация done right
От: mselez  
Дата: 19.01.11 13:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Хочется добиться самоорганизации, что-бы избавиться от явного описания связей между нодами. Как быть?


Взгляните на http://www.hazelcast.com/(самое простое), http://www.terracotta.org/, http://www.gridgain.com/. Это java. Или что-то подобное по ключевым словам distributed cache, data grid. Там должен быть реализован автоматический поиск нодов через мультикаст и их синхронизация.
Re[2]: Кластеризация done right
От: Аноним  
Дата: 19.01.11 14:30
Оценка:
Здравствуйте, mselez, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>Хочется добиться самоорганизации, что-бы избавиться от явного описания связей между нодами. Как быть?


M>Взгляните на http://www.hazelcast.com/(самое простое), http://www.terracotta.org/, http://www.gridgain.com/. Это java. Или что-то подобное по ключевым словам distributed cache, data grid. Там должен быть реализован автоматический поиск нодов через мультикаст и их синхронизация.


Да, кажется это именно то что мне нужно. Буду грызть исходники и добиваться, для начала, нормальной работы одного нода, без всяких наворотов.
Спасибо за ссылки.
Re[2]: Кластеризация done right
От: Аноним  
Дата: 19.01.11 14:38
Оценка:
Здравствуйте, Мишень-сан, Вы писали:

МС>Поглядите в сторону Erlang.


Проект написан на С++ и использует 0MQ, erlang слишком тормоз для нас да и особых преимуществ от его использования не будет, так как все будет строиться на простых как 5копеек, одно-поточных узлах/нодах. Основной цикл программы будет читать очередное сообщение из сокета, делать "особую магию" с тем, что узел хранит в памяти и отдавать результат приемнику. Ни асинхронности, ни многопоточности там не будет(по крайней мере в явном виде, 0MQ, внутри себя, использует многопоточность), это сознательный выбор
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.