Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Высоконагруженный проект (MongoDB) / 13 сообщений из 13, страница 1 из 1
22.06.2012, 13:17
    #37850186
max aka max
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
Здравствуйте!

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

Чтобы залить в БД 31 КК записей пришлось потратить около 4 часа, в 500 потоках, каждый поток за раз сгенерирует от 500 до 1000 строк рандомом в цикле и инсертить их в БД, и идет на следующий цикл. В начале процесса в секунду в БД инсертилось около 20-30 тыщ строк, а в конце всего 2-3 тыщ строк.
Заливаю php скриптом с одного сервера на другой соседний сервер:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
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 сек завершается сервером принудительно)

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$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 миллиардов строк и вытащить оттуда нужных строк (обращение в многопоточном режиме, в каждом потоке разные запросы), вообще такое возможно ?

Если Вам знакомо такая ситуация, какие имеются пути для решения данной проблемы ? или отказаться от Монго ?
...
Рейтинг: 0 / 0
22.06.2012, 13:32
    #37850213
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
max aka max,

я на Firebird 2.1 на машинке с Athlon 64 x2 5200 залил 1 терабайт данных за 3 дня (70 часов, при этом я еще на ней работал в дневное время). Правда, заливал в таблицы без индексов, иначе получилось бы не меньше недели, а то и две-три.
Всего записей было залито 6187651796, т.е. 6.2 миллиарда. Средняя скорость вставки - 24.5к записей в секунду. TPC-C.
Диски - одиночные sata за 50-70 баксов, никаких raid.
...
Рейтинг: 0 / 0
22.06.2012, 13:34
    #37850218
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
по MongoDB: я с ней вообще не работал, но подозреваю, что заливка данных в 500 потоках наоборот, замедляет вставку. "С одного сервера на другой" - здесь влияет сеть, однозначно. Ну и еще - генерация рандомных значений в php, подозреваю что основное время тратится именно на это (на php).
...
Рейтинг: 0 / 0
22.06.2012, 13:58
    #37850265
Yo.!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
kdvНу и еще - генерация рандомных значений в php, подозреваю что основное время тратится именно на это (на php).

явно дело не в пхп.
В начале процесса в секунду в БД инсертилось около 20-30 тыщ строк, а в конце всего 2-3 тыщ строк.
...
Рейтинг: 0 / 0
22.06.2012, 14:04
    #37850278
max aka max
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
kdvmax aka max,

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

впечатляет.

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

а у меня главный вопрос : Как быть с выбором данных ? как оптимизировать ?
...
Рейтинг: 0 / 0
22.06.2012, 14:06
    #37850281
max aka max
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
Yo.!kdvНу и еще - генерация рандомных значений в php, подозреваю что основное время тратится именно на это (на php).

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

да дело не пхп, дело в том что запросы на инсерт сначала быстро быстро отрабатываются на стороне сервера, но потом уже некоторые время начинает зависать запросы...
а вот как быть с селектами пока незнаю (
...
Рейтинг: 0 / 0
22.06.2012, 15:04
    #37850414
DPH3
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
А какие требования к результирующей системе?
Размер понятен, а сколько и каких операций?
...
Рейтинг: 0 / 0
22.06.2012, 19:02
    #37850965
max aka max
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
DPH3А какие требования к результирующей системе?
Размер понятен, а сколько и каких операций?

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

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

Годится ли под такую задачу использовать MongoDB, и как правильно создать структуру данных ?
...
Рейтинг: 0 / 0
22.06.2012, 23:53
    #37851168
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
max aka maxDPH3А какие требования к результирующей системе?
Размер понятен, а сколько и каких операций?

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

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

Годится ли под такую задачу использовать MongoDB, и как правильно создать структуру данных ?
Вы же небось захотите потом статистику сколько заходило под каким браузером, когда, еще по куче полезной информации
если б только хранить персональную информацию пользователя то еще можно подумать, а так мне кажется задача чисто для реляционных субд
может даже олап какой нужен
...
Рейтинг: 0 / 0
23.06.2012, 00:17
    #37851179
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
max aka maxИтак: Пишем систему топрейтинга и аналитики посещений сайтах

Русский Omniture? Ну, ну...
...
Рейтинг: 0 / 0
23.06.2012, 01:15
    #37851216
mikron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
max aka maxИтак: Пишем систему топрейтинга и аналитики посещений сайтах ( примерно 15 тысячи сайтов), кроме IP посетителей сайтов, будут еще куча полезных информаций, версия флеша, Net Framework, Разрешение экрана, Бразуер , ОС и т.д. Владелец сайта может узнать как всю информацию о посетителях своего сайта, так и информацию по всем 15 тыщ сайтам.

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

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

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

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

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

Хотя можно конечно флейма ради и Монго ковырять.
...
Рейтинг: 0 / 0
23.06.2012, 16:24
    #37851528
DPH3
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
max aka maxИтак: Пишем систему топрейтинга и аналитики посещений сайтах ( примерно 15 тысячи сайтов), кроме IP посетителей сайтов, будут еще куча полезных информаций, версия флеша, Net Framework, Разрешение экрана, Бразуер , ОС и т.д. Владелец сайта может узнать как всю информацию о посетителях своего сайта, так и информацию по всем 15 тыщ сайтам.


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

Но как тут правильно пишут, сначала определитесь с типами запросов и аналитики, а потом уже тестируйте на скорость вставки (которая во многих случаях вообще не важна, так как первичку сохранять необходимости нет).
...
Рейтинг: 0 / 0
23.06.2012, 21:45
    #37851789
Andrey Sribnyak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Высоконагруженный проект (MongoDB)
Интересно на счетчики дисковой подсистемы посмотреть во время этого безобразия


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

http://us.php.net/manual/en/mongocursor.timeout.php
...
Рейтинг: 0 / 0
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Высоконагруженный проект (MongoDB) / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]