Эффективный макет для распределенного сервера Python?

Если бы я хотел, чтобы Python был распределен между несколькими процессорами на нескольких компьютерах, какой был бы мой лучший подход? Если бы у меня было 3 восьмиъядерных сервера, это означало бы, что мне пришлось бы запускать 24 процесса Python. Я бы использовал многопроцессорная библиотека, и для обмена объектами, похоже, лучшей идеей было бы использование менеджера. Я хочу, чтобы все узлы работали вместе как один большой процесс, поэтому один менеджер был бы идеальным, но это дало бы моему серверу единую точку отказа. Есть ли лучшее решение? Будет ли хорошей идеей репликация хранилища объектов менеджера?

Кроме того, если менеджер будет выполнять все запросы к базе данных, имеет ли смысл разместить его на том же компьютере, что и база данных?

Вы должны запускать программу с одного сервера. Как вы планируете запустить процесс на другом сервере?

David Locke 14.01.2009 01:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
922
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, было бы полезно больше информации о том, что вы обслуживаете, какую базу данных вы бы использовали, какие у вас требования к задержке / пропускной способности и т. д. Многое зависит от ваших требований: например. если ваша система является типичным сервером, на котором много операций чтения и не так много записей, и у вас нет проблем с чтением слегка устаревших данных, вы можете выполнять локальные чтения из кеша для каждого процесса и отправлять записи только в база данных, транслируя результаты обратно в кеши.

Для начала, я думаю, это зависит от того, что должен делать менеджер. В конце концов, беспокоиться об отдельных точках отказа может быть бессмысленно, если ваша система настолько тривиальна, что отказ не произойдет, если не произойдет катастрофический отказ оборудования. Но если у вас есть только один, имеет смысл разместить его на том же компьютере, что и база данных. Вы уменьшаете задержку, и ваша система не сможет выжить, если одна выйдет из строя без другой.

Ответ принят как подходящий

У вас есть две основные проблемы при распределении процессов:

  1. Координация работы, которая разделяется, распределяется и повторно собирается (можно сказать, отображена и сокращена)
  2. Обмен правильными данными в реальном времени между зависимыми процессами

Ответ на первый вопрос во многом будет зависеть от того, какую обработку вы выполняете. Если его легко разделить по горизонтали (т.е. вы можете разделить большую задачу на несколько меньших задач независимый), балансировщик нагрузки, такой как HAProxy, может быть удобным способом распределения нагрузки.

Если задача не является тривиально горизонтально разбиваемой, я сначала посмотрю, подойдут ли мне существующие инструменты, такие как Hadoop. Распределенное управление задачами - сложная задача, и колесо уже изобретено.

Что касается № 2, совместного использования состояния между процессами, ваша жизнь будет намного проще, если вы поделитесь абсолютным минимумом, а затем поделитесь им только явно и четко определенным образом. Я бы лично использовал SQLAlchemy, поддерживаемый выбранной вами РСУБД, даже для самых небольших задач. Интерфейс запросов достаточно мощный и удобный как для небольших, так и для крупных проектов.

После факта сейчас, но, возможно, не помешает упомянуть Параллельный Python

David Kierans 22.05.2011 03:50

Кажется, суть вашего вопроса заключается в том, как делиться объектами и состоянием. Было бы очень полезно получить дополнительную информацию, в частности размер, частоту, скорость изменений и источник данных.

Для разделяемой памяти между машинами вы, вероятно, захотите посмотреть memcached. Вы можете хранить свои данные и быстро и легко получать к ним доступ из любого рабочего процесса.

Если ваш сценарий представляет собой более простую модель распределения заданий, вы можете захотеть взглянуть на сервер очередей - поместите свои задания и связанные с ними данные в очередь и попросите рабочих забирать задания из очереди. Beanstalkd, вероятно, хороший выбор для очереди, и вот учебник начиная.

Другие вопросы по теме