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

Нужно написать один высоконагруженный проект, для БД выбираем 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
Высоконагруженный проект (MongoDB)
    #37850213
Фотография 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.
...
Рейтинг: 0 / 0
Высоконагруженный проект (MongoDB)
    #37850218
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по MongoDB: я с ней вообще не работал, но подозреваю, что заливка данных в 500 потоках наоборот, замедляет вставку. "С одного сервера на другой" - здесь влияет сеть, однозначно. Ну и еще - генерация рандомных значений в php, подозреваю что основное время тратится именно на это (на php).
...
Рейтинг: 0 / 0
Высоконагруженный проект (MongoDB)
    #37850265
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvНу и еще - генерация рандомных значений в php, подозреваю что основное время тратится именно на это (на php).

явно дело не в пхп.
В начале процесса в секунду в БД инсертилось около 20-30 тыщ строк, а в конце всего 2-3 тыщ строк.
...
Рейтинг: 0 / 0
Высоконагруженный проект (MongoDB)
    #37850278
max aka max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Высоконагруженный проект (MongoDB)
    #37850281
max aka max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yo.!kdvНу и еще - генерация рандомных значений в php, подозреваю что основное время тратится именно на это (на php).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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


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