4. Потоки данных
Какими они бывают?
• Лог в локальной FS
18 мая 2009 г.
5. Потоки данных
Какими они бывают?
• Лог в локальной FS
• Таблица в БД
18 мая 2009 г.
6. Потоки данных
Какими они бывают?
• Лог в локальной FS
• Таблица в БД
• HTTP-поток
18 мая 2009 г.
7. Потоки данных
Как обрабатывать?
cron VS Демоны
- асинхронность - синхронность
- простота написания - init-скрипт, pid-файл, watchdog
- надежность - утечки памяти
- интеграция с unix-утилитами
18 мая 2009 г.
13. Логи
Особенности
• Надежность
• Простота чтения
18 мая 2009 г.
14. Логи
Особенности
• Надежность
• Простота чтения
• Ротация!
18 мая 2009 г.
15. Пример
Scheduler
Будем выкачивать rss.
Шедулер будет вести лог /var/spool/scheduler.log:
1000 http://dolboeb.livejournal.com/data/rss
1017 http://avva.livejournal.com/data/rss
1018 http://drugoi.livejournal.com/data/rss
...
18 мая 2009 г.
16. Пример
Scheduler
scheduler.pl /var/spool/scheduler.log
18 мая 2009 г.
25. Yandex::Unrotate
Возможности
• CheckInode
• CheckLastline
18 мая 2009 г.
26. Yandex::Unrotate
Возможности
• CheckInode
• CheckLastline
• ->commit(); ->commit($position);
18 мая 2009 г.
27. Yandex::Unrotate
Возможности
• CheckInode
• CheckLastline
• ->commit(); ->commit($position);
• ->lag();
18 мая 2009 г.
28. Yandex::Unrotate
Возможности
• CheckInode
• CheckLastline
• ->commit(); ->commit($position);
• ->lag();
Ближайший аналог: File::LogReader
18 мая 2009 г.
29. Yandex::Unrotate
Файл состояния
file: /var/spool/scheduler.log
position: 120000
inode: 4815162342
lastline: 21903 http://tema.livejournal.com/data/rss
18 мая 2009 г.
30. Yandex::Unrotate
Файл состояния
file: /var/spool/scheduler.log
position: 120000
inode: 4815162342
lastline: 21903 http://tema.livejournal.com/data/rss
$ unrotate -n 10 robot.pos
$ unrotate -n 10 --commit robot.pos
18 мая 2009 г.
31. Yandex::Unrotate
А распараллелить?
$reader = Yandex::Unrotate::Chunk->new(
LogFile => “/var/spool/scheduler.log”,
PosFile => “/var/lib/robot.pos”,
ChunkDir => “/var/lib/robot/chunks/”,
ChunkCount => 5,
ChunkSize => 5000,
); # откусить новый chunk или взять свободный существующий
while ($reader->readline) {
...
}
$reader->commit; # стереть chunk
18 мая 2009 г.
32. Пример
Робот с chunk’ами
robot.ya.ru
scheduler.pl /var/spool/scheduler.log
robot.pl /var/spool/robot/chunks/chunk1
robot.pl /var/spool/robot/chunks/chunk2
robot.pl /var/spool/robot/chunks/chunk3
18 мая 2009 г.
33. Yandex::Unrotate
Мониторинг
• Да здравствует Log::Log4perl!
18 мая 2009 г.
34. Yandex::Unrotate
Мониторинг
• Да здравствует Log::Log4perl!
• /var/log/unrotate/failures.log
18 мая 2009 г.
35. Yandex::Unrotate
Мониторинг
• Да здравствует Log::Log4perl!
• /var/log/unrotate/failures.log
• ...и /var/log/unrotate/failures.pos
18 мая 2009 г.
37. Расссылка данных
propagate
system(qq{cat $tmpfile | ssh robot1 ‘accept scheduler.log’});
# или:
system(q{tar c index | ssh search-host ‘accept index.tar});
18 мая 2009 г.
38. Рассылка данных
accept
my $fname = shift @ARGV or die quot;missing fnamequot;;
@modules = (
(grep { ! m#.[^/]*$# } glob quot;/etc/accept.d/*quot;),
);
for (@modules) {
my $object = do ($_);
warn $@ if $@;
push @objects, $object if $object;
}
for my $object (@objects) {
exit(0) if $object->process($fname);
}
die quot;no module to process $fnamequot;;
18 мая 2009 г.
39. Расссылка данных
propagate.d
$ cat /etc/propagate.d/scheduler
{
LogFile => “/var/spool/scheduler.log”,
PosFile => “/var/lib/propagate.pos”,
Acceptors => [
{
Host => “robot1”,
Key => “/var/lib/ppb_key.rsa”,
User => “ppb”,
},
{
Host => “robot2”,
Key => “/var/lib/ppb_key.rsa”,
User => “ppb”,
},
],
Limit => 5000,
}
18 мая 2009 г.
40. Расссылка данных
propagate.d
Или так:
$ cat /etc/propagate.d/scheduler
{
LogFile => “/var/spool/scheduler.log”,
PosFile => “/var/lib/propagate.pos”,
Acceptors => connectdb(“meta”)->selectall_arrayref(q{
SELECT
host AS Host,
“ppb” AS User,
“/var/lib/ppb-key.rsa” AS Key
FROM RobotHosts
}, { Slice => {} }),
Limit => 5000,
}
18 мая 2009 г.
41. Пример
Много роботов
scheduler.ya.ru
scheduler.pl
/var/spool/scheduler.log
robot1.ya.ru robot2.ya.ru robot3.ya.ru
/var/spool/scheduler.log /var/spool/scheduler.log /var/spool/scheduler.log
robot.pl robot.pl robot.pl
18 мая 2009 г.