Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
 Высоконагруженный проект (MongoDB)  [new]
max aka max
Member

Откуда:
Сообщений: 204
Здравствуйте!

Нужно написать один высоконагруженный проект, для БД выбираем MongoDB, прочитал много чего оптимистичного про него.
Скачал и установил MongoDB на Linux Debian (ОЗУ: 4 гига, процессор: Intel Xeon двухядерный)

Чтобы залить в БД 31 КК записей пришлось потратить около 4 часа, в 500 потоках, каждый поток за раз сгенерирует от 500 до 1000 строк рандомом в цикле и инсертить их в БД, и идет на следующий цикл. В начале процесса в секунду в БД инсертилось около 20-30 тыщ строк, а в конце всего 2-3 тыщ строк.
Заливаю php скриптом с одного сервера на другой соседний сервер:
function _addRow($sParam) 
{
	//while (TRUE) {
		$conn = new Mongo('192.168.5.240:27017');

		$db = $conn->analitika;
		$collection = $db->toprating;
		 $start1=gettimeofday();
			for ($i=0;$i<$sParam;$i++) {
				$value = NULL;
				$value = json_decode(getRandomRow($i));
				$kk = $collection->insert($value);
			}
		print_r ( $kk ); echo " -inserted<br/>";
		$end1=gettimeofday();
		$totaltime1 = (float)($end1['sec'] - $start1['sec']) + ((float)($end1['usec'] - $start1['usec'])/1000000);
		$tName = floatval(	substr(microtime(),0,5).
							substr(strrev(microtime()),0,5)
						)*100000000;
		logger('insert_log.txt',
					'Thread:'.$tName.
					': ->Inserted records:' . 
					$sParam . 
					' for time: ' . 
					$totaltime1 );
		sleep(1);
	//}
}

function getRandomRow($fParam) {
	$row = array();
	$providers = array('Uznet','TPS','Sarkor','Beeline','Comnet','Uzonline','undefined');
	$paths = array('torg.uz','zor.uz','tas-ix.net','dchub.ws','lan.uz','shaxzoda.uz','mp3.uz','player.uz');
	$pathRef = array ('','google.ru','','','yandex.ru','zor.uz','www.uz','px.uz','sir.uz','bot');
	$browsers = array('Firefox','Chrome','Netscape','Safari','IE','Opera');
	$mobiles = array ('Sony Ericsson','Nokia','Motorola','Iphone','Samsung','','','','','','');
	$OSs = array( 'Windows','Linux','Mac');
	
	$row['Resourse_Id'] = rand(1,10000);
	$row['iData'] = 1330409741 + $fParam*rand(3000,6000);
	$row['iIp'] = long2ip ( $row['iData'] );
	$row['iProvider'] = $providers[rand(0,6)];
	$row['iPath'] = 'http://www.' . $paths[rand(0,7)] . '/index.php';
	$row['iPathReal'] = $row['iPath'] . '?action=post&postdata=23sfssdf3434fsd23fsdDF32sdSAa453s';
	$row['iPathReferrer'] = $pathRef[rand(0,9)];
	
				$k=(rand(0,1) == 0)?false:true;
				$m=(rand(0,1) == 0)?false:true;
	$row['iBrowser'] = array (	'isDetected' => $k ,
								'Name' => ($k)?$browsers[rand(0,5)]:'',
								'Version' => ($k)?(rand(4,11) . '.'.rand(0,4) . '.' . rand(0,11)):'',
								'Mobile' => ($m && $k)?$mobiles[rand(0,10)]:'');
				$k=(rand(0,1) == 0)?false:true;
	$row['iOS'] = array (	'isDetected' => $k ,
							'Name' => ($k)?$OSs[rand(0,2)]:'',
							'Version' => ($k)?(rand(4,8) . '.'.rand(0,4) . '.' . rand(0,11)):'',
							'Mobile' => ($m && $k)?$mobiles[rand(0,10)]:''		);
	$row['iCookie'] = (rand(0,1) == 0)?false:true;
				$k=(rand(0,1) == 0)?false:true;
	$row['iJavascript'] = array('isEnabled' => $k, 'Version' => ($k)?(rand(0,2).'.'.rand(0,1)):'' );
	$row['iFlash'] = (rand(0,1) == 1)?(rand(10,12).'.'.rand(0,1).'.'.rand(0,14)):'';
	$row['iSilverlight'] = (rand(0,1) == 1)?(rand(4,6).'.'.rand(1,3).'.'.rand(9,11)):'';
		$k = (in_array($row['iPathReferrer'],array('google.ru','yandex.ru','www.uz')))?true:false;
	$row['iSearcher'] = array('Name' => ($k)?$row['iPathReferrer']:'', 'Word' => ($k)?'Поисковое слово за которое посещали сайт':'');
	$row['iSpider'] = ($row['iPathReferrer'] == 'bot')?'bot':'';
	$row['iNet'] = (rand(0,1) == 1)?(rand(2,4).'.'.rand(0,5)):'';
	$row['iColor'] = (rand(0,1) == 1)?16:32;
	$row['iMonitor'] = array ( 'xWidth' => rand(800,1600), 'yHeight' => rand(600,1080));
	$row['iRowHash'] = md5(	$row['Resourse_Id'] .$row['iData'] .	$row['iIp'] .	$row['iPathReal'] .$row['iPathReferrer'] .
	$row['iBrowser']['Name'] .$row['iBrowser']['Version'] .	$row['iBrowser']['Mobile'] .$row['iOS']['Name'] .$row['iOS']['Version'].
	$row['iOS']['Mobile'] .$row['iCookie'] .$row['iJavascript'] .$row['iFlash'] .	$row['iSilverlight'] .$row['iSearcher'] .
	$row['iSpider'] .	$row['iNet'] .$row['iColor'] .	$row['iMonitor']	);
	$row['iCount'] = 1;
	return json_encode( $row );
}	


Скорость инсерта уменьшилось почти в 10 раз (
А также, при обычном выборе БД вообще зависает и выдает ошибку Fatal error: Uncaught exception 'MongoCursorTimeoutException' with message 'cursor timed out (30000 ms) (не законченный вопрос за 30 сек завершается сервером принудительно)

$minTime = mktime (23,59,00,   2,28,2012);
$maxTime = mktime (23,59,59,   2,28,2012);

echo "Filter for iData: min->".date("d.m.Y G:i:s ",$minTime) . ", max->".date("d.m.Y G:i:s ",$maxTime);
echo "<br/>Filter for iData: min->".$minTime . ", max->".$maxTime."<hr />";

$query = array( "iData" => array( "\$gt" => $minTime, "\$lt" => $maxTime ) );

	$collection->ensureIndex(array("iData"=>1));
	$cursor = $collection->find( $query );
	echo "
 count:".$cursor->count() . "<hr/>";


Неужели МонгоДБ не сумеет работать с таким большим количеством данных ? я думал там хранить более 3,5 миллиардов строк и вытащить оттуда нужных строк (обращение в многопоточном режиме, в каждом потоке разные запросы), вообще такое возможно ?

Если Вам знакомо такая ситуация, какие имеются пути для решения данной проблемы ? или отказаться от Монго ?
22 июн 12, 13:17    [12759664]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30261
max aka max,

я на Firebird 2.1 на машинке с Athlon 64 x2 5200 залил 1 терабайт данных за 3 дня (70 часов, при этом я еще на ней работал в дневное время). Правда, заливал в таблицы без индексов, иначе получилось бы не меньше недели, а то и две-три.
Всего записей было залито 6187651796, т.е. 6.2 миллиарда. Средняя скорость вставки - 24.5к записей в секунду. TPC-C.
Диски - одиночные sata за 50-70 баксов, никаких raid.
22 июн 12, 13:32    [12759838]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30261
по MongoDB: я с ней вообще не работал, но подозреваю, что заливка данных в 500 потоках наоборот, замедляет вставку. "С одного сервера на другой" - здесь влияет сеть, однозначно. Ну и еще - генерация рандомных значений в php, подозреваю что основное время тратится именно на это (на php).
22 июн 12, 13:34    [12759865]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
Yo.!
Guest
kdv
Ну и еще - генерация рандомных значений в php, подозреваю что основное время тратится именно на это (на php).


явно дело не в пхп.
В начале процесса в секунду в БД инсертилось около 20-30 тыщ строк, а в конце всего 2-3 тыщ строк.
22 июн 12, 13:58    [12760066]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
max aka max
Member

Откуда:
Сообщений: 204
kdv
max aka max,

я на Firebird 2.1 на машинке с Athlon 64 x2 5200 залил 1 терабайт данных за 3 дня (70 часов, при этом я еще на ней работал в дневное время). Правда, заливал в таблицы без индексов, иначе получилось бы не меньше недели, а то и две-три.
Всего записей было залито 6187651796, т.е. 6.2 миллиарда. Средняя скорость вставки - 24.5к записей в секунду. TPC-C.
Диски - одиночные sata за 50-70 баксов, никаких raid.


впечатляет.

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

а у меня главный вопрос : Как быть с выбором данных ? как оптимизировать ?
22 июн 12, 14:04    [12760114]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
max aka max
Member

Откуда:
Сообщений: 204
Yo.!
kdv
Ну и еще - генерация рандомных значений в php, подозреваю что основное время тратится именно на это (на php).


явно дело не в пхп.
В начале процесса в секунду в БД инсертилось около 20-30 тыщ строк, а в конце всего 2-3 тыщ строк.


да дело не пхп, дело в том что запросы на инсерт сначала быстро быстро отрабатываются на стороне сервера, но потом уже некоторые время начинает зависать запросы...
а вот как быть с селектами пока незнаю (
22 июн 12, 14:06    [12760141]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
DPH3
Member

Откуда:
Сообщений: 456
А какие требования к результирующей системе?
Размер понятен, а сколько и каких операций?
22 июн 12, 15:04    [12760747]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
max aka max
Member

Откуда:
Сообщений: 204
DPH3
А какие требования к результирующей системе?
Размер понятен, а сколько и каких операций?


Итак: Пишем систему топрейтинга и аналитики посещений сайтах ( примерно 15 тысячи сайтов), кроме IP посетителей сайтов, будут еще куча полезных информаций, версия флеша, Net Framework, Разрешение экрана, Бразуер , ОС и т.д. Владелец сайта может узнать как всю информацию о посетителях своего сайта, так и информацию по всем 15 тыщ сайтам.

Аналог Яндекс Метрики :)

Годится ли под такую задачу использовать MongoDB, и как правильно создать структуру данных ?
22 июн 12, 19:02    [12762581]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
max aka max
DPH3
А какие требования к результирующей системе?
Размер понятен, а сколько и каких операций?


Итак: Пишем систему топрейтинга и аналитики посещений сайтах ( примерно 15 тысячи сайтов), кроме IP посетителей сайтов, будут еще куча полезных информаций, версия флеша, Net Framework, Разрешение экрана, Бразуер , ОС и т.д. Владелец сайта может узнать как всю информацию о посетителях своего сайта, так и информацию по всем 15 тыщ сайтам.

Аналог Яндекс Метрики :)

Годится ли под такую задачу использовать MongoDB, и как правильно создать структуру данных ?

Вы же небось захотите потом статистику сколько заходило под каким браузером, когда, еще по куче полезной информации
если б только хранить персональную информацию пользователя то еще можно подумать, а так мне кажется задача чисто для реляционных субд
может даже олап какой нужен
22 июн 12, 23:53    [12763328]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
max aka max
Итак: Пишем систему топрейтинга и аналитики посещений сайтах


Русский Omniture? Ну, ну...
23 июн 12, 00:17    [12763427]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
mikron
Member

Откуда:
Сообщений: 888
max aka max
Итак: Пишем систему топрейтинга и аналитики посещений сайтах ( примерно 15 тысячи сайтов), кроме IP посетителей сайтов, будут еще куча полезных информаций, версия флеша, Net Framework, Разрешение экрана, Бразуер , ОС и т.д. Владелец сайта может узнать как всю информацию о посетителях своего сайта, так и информацию по всем 15 тыщ сайтам.

Аналог Яндекс Метрики :)

Годится ли под такую задачу использовать MongoDB, и как правильно создать структуру данных ?


Всё дальше сказанное оффтоп и ИМХО.

Вы решаете проблемы вчерашнего дня методами десятилетней давности.
Это конечно полезно в учебных целях и возможно даже имеет теоретический интерес,
но с практической точки зрения малоефективно.
Вам нужен OLAP, BI, data mining и соответсвующие подходы, методы и средства.
Подобные задачи имеют много известных поставщиков рещений.

А вот ковыряние со скоростю вставки в какую-то модную/новую базу данных
совсем не преближает к рещению проблемы а только показывает как далеко вы от её понимания.

Хотя можно конечно флейма ради и Монго ковырять.
23 июн 12, 01:15    [12763593]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
DPH3
Member

Откуда:
Сообщений: 456
max aka max
Итак: Пишем систему топрейтинга и аналитики посещений сайтах ( примерно 15 тысячи сайтов), кроме IP посетителей сайтов, будут еще куча полезных информаций, версия флеша, Net Framework, Разрешение экрана, Бразуер , ОС и т.д. Владелец сайта может узнать как всю информацию о посетителях своего сайта, так и информацию по всем 15 тыщ сайтам.


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

Но как тут правильно пишут, сначала определитесь с типами запросов и аналитики, а потом уже тестируйте на скорость вставки (которая во многих случаях вообще не важна, так как первичку сохранять необходимости нет).
23 июн 12, 16:24    [12764281]     Ответить | Цитировать Сообщить модератору
 Re: Высоконагруженный проект (MongoDB)  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
Интересно на счетчики дисковой подсистемы посмотреть во время этого безобразия


ПО поводу таймаута, есть вроде рекомендации:

http://us.php.net/manual/en/mongocursor.timeout.php
23 июн 12, 21:45    [12765017]     Ответить | Цитировать Сообщить модератору
Все форумы / Сравнение СУБД Ответить