2012-02-20 3 views
0

Я застрял между камнем и твердым местом с приложением, которое я делал. В основном программа генерирует очень большой набор данных (более 10 гигабайт и превышает память на сервере, и его трудно переносить этот набор данных из словаря на другие серверы позже). Я решил использовать базу данных для хранения данных, но я столкнулся с проблемой, в которой, когда я создаю больше процессов, они не используют более 10% своего ядра, но служба mysql всегда составляет около 60-100%.Есть ли способ заставить mysql обрабатывать большое количество одновременных записей?

Ядро, использующее mysql, работает от 60 до 100%. Я взял базовые курсы mysql, но я не эксперт в этом, и я действительно использую его для хранения/распространения локальных переменных программы. Любые предложения о том, как я могу устранить неполадки или даже решить эту проблему? Одна из моих идей заключалась в том, что хотя моя память не может хранить всю базу данных, которую я планирую написать, мне бы хотелось, чтобы сервер использовал некоторую память для обработки некоторых запросов, а затем, возможно, записывал их по мере заполнения памяти (сейчас mysql использует меньше 1 % от памяти сервера).

Как вы знаете мою цель, я не верю в какой-либо конкретный тип системы, поэтому, если mysql не является хорошим решением, я с удовольствием попробую другой инструмент (я собирался использовать hbase, но пошел по дороге mysql первый). Если что-нибудь еще лучше, сообщите мне.

ответ

1

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

Что вы подразумеваете под большим количеством писем? 10? 100? 1000? в секунду?

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

У вас есть тяжелые чтения для написания или все это пишет?

Что вы делаете во время своей записи? Это одна строка, которую вы пишете, или это целый ряд операций, заключенных в транзакцию?

Что такое конфигурация сервера? Память? Диск? Версия mySQL.

Вы используете Innodb для базы данных?

Теперь одна вещь, которую вы можете попробовать - запустить ПОКАЗАТЬ ПОЛНЫЙ ПРОЦЕССИСТ ;. Это покажет вам, есть ли какой-либо тип блокировки - если вы видите много процессов в состоянии блокировки, затем найдите один из процессов, которые не заблокированы, и посмотрите, может ли это вызвать блокировку. См. http://dev.mysql.com/doc/refman/5.0/en/show-processlist.html для получения дополнительной информации об этой команде.

+0

Я нерест 8 процессов, поэтому я думаю, 8 пишет второй. В таблице в настоящее время имеется только один столбец (он должен быть уникальным). У него нет индексов (мысль, которая помогала с чтениями, не пишет, так ничего не делала). Его действительно две операции, их чтение и если они не существуют для записи в базу данных. версия 5.1.61. Я не уверен в настройке, ее значение по умолчанию - centos 6, и я использую Innodb. есть 11 строк результатов, когда я смотрю на заблокированные процессы и 2 из них не заблокированы (один проверяет разрешения, а другой записывает в сеть). – Lostsoul

+0

Я должен добавить, приложение работает на том же сервере, что и база данных. Я могу двигаться, если это необходимо.Сервер имел 8 ядер, но SQL maxing только 1, а приложение занимает меньше 10%, поэтому каждое ядро ​​имеет 90 для MySQL. – Lostsoul

+0

Это действительно ничего не стоит в плане объема. MySQL может справиться с этим во сне на простом переносном компьютере. Отсутствие индексов не очень хорошо, особенно если вы читаете перед записью - без этого индекса mysql выполнит полное сканирование таблицы для каждой вставки (со связанными блокировками во время этого сканирования) - x6 в секунду на огромном наборе данных может действительно пережевывать ваши процессы. Я бы рекомендовал сначала добавить индекс в поля, которые вы просматриваете, и посмотреть, помогает ли это уменьшить конкуренцию. – AlexGad

1

Кажется, вы просто хотите сохранить много данных, которые генерируются (или получены) вашим кодом, и вы не хотите часто их выбирать (в этой части кода). Если это так, и скорость генерации данных настолько высока, я рекомендую использовать базу данных NoSQL, такую ​​как MongoDB вместо MySQL. Они созданы только для большого количества наборов данных, они готовы к кластеру и ... (просто перейдите к их документам).

+0

Я бы не согласился с предположением, что NoSQL db - это путь, если у вас есть много данных, которые нужно сохранить. Посмотрим правде в глаза, Facebook не добрался до места, где он получил, не сохранив много данных на mySQL. По моему опыту, mySQL может обрабатывать тонну данных, но, как и все остальное, его нужно использовать правильно. Я использовал MongoDB и Redis, и оба они преуспевают в определенных областях, но если mySQL уже введен в действие, не лучше ли понять, что происходит, прежде чем перейти к чему-то другому, у которого будут свои проблемы ? – AlexGad

+0

Я бы также добавил, что упомянутые данные не были вписаны в память. Весьма вероятно, что рабочий набор не поместится в память и в MongoDB.Если это так, то у него будет еще худшая производительность, поскольку Монго действительно сосет ветер, если все не может попасть в память. Кроме того, высокая запись может быть затронута глобальной блокировкой записи Mongo. Способ обойти это с помощью sharding, но теперь все усложняется. Как я уже упоминал, лучше сначала выяснить, какова реальная проблема с реализацией mySQL, прежде чем искать в другом месте. – AlexGad

+0

Спасибо за ваш совет. Я очень ценю это (не пытаюсь начать войну пламени или что-то еще), но у меня действительно нет привязанности к какому-либо конкретному решению, просто нужно что-то, что соответствует моим потребностям. Я собирался дать hbase попробовать, но не был уверен, что есть что-то исправить в mysql или если что-то еще лучше. Я буду смотреть на moogodb и отвечать на вопросы @ AlexGad, когда я просматриваю базу данных mysql и вычисляю их. – Lostsoul

Смежные вопросы