• 検索結果がありません。

mod_perl_jobworker

N/A
N/A
Protected

Academic year: 2021

シェア "mod_perl_jobworker"

Copied!
41
0
0

読み込み中.... (全文を見る)

全文

(1)

mod_perlをjob workerとして使う理由

~RSSクローラの設計から~

株式会社ミクシィ

開発部 長野雅広

(2)

自己紹介

所属 株式会社ミクシィ

開発部 システム運用グループ

アプリケーション運用チーム

Blog

http://blog.nomadscafe.jp/

CPANID kazeburo

(3)

アジェンダ

mixiのRSSクローラができるまで

(4)
(5)

mixiでのRSS取得・表示

最新日記に表示

最新日記に表示

外部

外部

外部

外部の

のブログ

ブログ

ブログ等

ブログ

タイトル・URL・更新日付を取得しmixi上に表示

(6)

mixiのRSSクローラ

User-Agent

– “

mixi-crawler/2.00 (

http://mixi.jp/

)

(7)

取得するRSSの数

22万件(2008年5月現在)

19万3千件が正常に取得完了

(8)

現在の構成

インターネット

kicker kicker

manager

script server

kicker kicker

manager

script server

LVS

Apache

(mod_perl)

Apache

(mod_perl)

RSS DB

Diary DB

memcached

(9)

Member DB

以前の設計

fetcher

controller

fetcher

インターネット

RSS DB

Diary DB

cron

fetcher

controller

fetcher

cron

fetcher

controller

fetcher

cron

fetcher

controller

fetcher

cron

(10)

以前の設計の問題点

Fetcherサーバの耐障害性、Scalability

Fetcherサーバの障害時

Fetcherサーバの増設

処理速度

都度のプロセス起動

古いライブラリ

DBへの長い接続時間

運用上好ましくない

(11)

Fetcherサーバの障害時

IDが固定なので、手作業でそのIDを別のサー

バや新規サーバに振り替えないとRSSの取得

が停止する

controller

fetcher

cron

controller

fetcher

cron

controller

fetcher

cron

controller

fetcher

cron

ID:0/Max:4 ID:1/Max:4

ID:2/Max:4 ID:3/Max:4

member ID

の剰余が

「2」のユーザの

RSS

(12)

Fetcherサーバの増設

すべてのサーバで「全体の台数」の設定の変更

が必要

controller

fetcher

cron

controller

fetcher

cron

fetcher

cron

controller

fetcher

cron

ID:0/Max:

5

ID:1/Max:

5

ID:2/Max:

5

ID:3/Max:

5

controller

controller

fetcher

cron

ID:3/Max:5

NEW

全体の台数を

全台で設定する

(13)

処理速度

都度のプロセス起動

DBI、XML系のライブラリを毎回読み込み直し

Perlのプロセス起動自体重い

古いライブラリ

XML::Parserベースのライブラリは処理速度が遅い

(14)

新規に作成するにあたり

クロール時間の短縮

member idを全部なめることをやめる

2時間以内に1周する

XML::LibXMLベース

対応するフォーマット

Atom 1.0への対応

耐障害性とスケーラビリティ

(15)

それPla

(16)

「それPla」構想

SubscriptionとPublish

(17)

非同期のAggregator

XangoやGunghoよりも軽い実装として

HTTP::Async

を使う

Aggregator::Asyncの誕生

(18)

HTTP::Asyncとは

Net::HTTP::NB(LWP同梱)を利用して非同期

にHTTPアクセスする

use HTTP::Async;

my $async = HTTP::Async->new;

$async->

add

( HTTP::Request->new( GET => 'http://mixi.jp/' ) );

$async->

add

( HTTP::Request->new( GET => 'http://yapcasia.org/' ) );

while ( my $response = $async->

wait_for_next_response

) {

# Do some processing with $response

ref $response ## HTTP::Response

}

(19)

HTTP::Asyncの問題点

オンメモリ処理

RSSのURLが数GBのファイルだったら?

connectは同期処理

つながらないサーバがあるとブロックされてしまう

不特定多数のURLへのリクエストには使いにくい

HTTP::Asyncが適用しやすい場所

1. アクセス先のコンテンツのサイズが確認できる

2. connectが一瞬で完了するローカル接続

(20)
(21)
(22)

mod_perlを使うアイディア

(23)

メルマガ「コミュニティニュース」

1通1通ユーザ毎に異なる内容のメルマガ

mixiのホームの内容が主

DBやmemcachedを参照しながら本文を作成して

(24)

メルマガの効率化

mod_perlで通常のページを作るように作る

HTMLを書き出す代わりにメールを送る

そのアプリケーションサーバにRequestを

HTTP::Asyncで送る

mod_perl1台でもMaxClientsの設定まで並行処理

が可能

Scalabilityについては、アプリケーションサーバ

(mod_perlサーバ)を増やすだけ

(25)

メルマガ「コミュニティニュース」

Apache

(mod_perl)

Apache

(mod_perl)

Apache

(mod_perl)

HTTP::Async

script server

SMTP

SMTP

インターネット

(26)

RSSクローラへの展開

リクエストを受けると、1つのFeedを取得し、解

析、DBへの格納を行う

シンプルな1つのjobに

そのサーバに対して、HTTP::Asyncを使いリク

エストを行う

リクエストを行うプログラムをkickerと呼んでいる

(27)

kickerの設計

kickerの耐障害性をあげる

冗長性を確保

Scalability

サーバを足すだけを目指す

DBへの長時間の接続はしない

運用上の理由

動作速度

(28)

kickerとkicker manager

一定数処理したら終了するkicker

動作速度とDBとの接続時間の短縮の両立

DBとの接続は行わずkickerを管理するだけの

manager

kicker kicker

manager

script server

RSS DB

(29)

kicker managerの設計

POE

Wheel::Run

Component::Server::TCP

PoCo::Server::TCPで任意のportをlisten

簡単に状況を確認できる

nagiosで外部から監視

(30)

kicker manager(一部ソースコード)

sub wheel_init {

my ($kernel, $heap) = @_[KERNEL, HEAP]; $kernel->alias_set('wheel_ctl');

$kernel->post('wheel_ctl','wheel_settimeout'); }

sub wheel_settimeout {

my ($kernel, $heap) = @_[KERNEL, HEAP]; my $procs = $STASH->{procs};

my $time = time() - 10*60; #10min my @freezed_procs;

foreach my $id ( keys %$procs ) { push @freezed_procs,$id if $procs->{$id}->[0] < $time; } foreach (@freezed_procs) { $procs->{$_}->[1]->kill(9); }

if ( keys %$procs < $OPT{MAX_PROCS} ) { $kernel->post('wheel_ctl','wheel_start'); }

$kernel->delay( 'wheel_settimeout', 1 ); }

sub wheel_start {

my ($kernel, $heap) = @_[KERNEL, HEAP]; my $wheel = POE::Wheel::Run->new(

Program => [qw/perl kicker.pl/],

ErrorEvent => 'wheel_error', CloseEvent => 'wheel_close', StdoutEvent => 'wheel_stderr', StderrEvent => 'wheel_stderr', ); my $pid = $wheel->PID; $kernel->sig( 'CHLD', 'wheel_sigchld' ); $STASH->{procs}->{$wheel->ID} = [time(), $wheel]; }

(31)

kicker managerの冗長性

2台以上のサーバで動く

(32)

処理が2重にならない工夫

CREATE TABLE `rss_data` (

member_id int(10) unsigned NOT NULL default '0',

url varchar(255) NOT NULL default '',

last_crawl datetime NOT NULL default '1970-01-01 00:00:00',

fetcher_seed tinyint(3) unsigned NOT NULL default '0',

PRIMARY KEY (`member_id`),

KEY `last_crawl` (`last_crawl`,`fetcher_seed`),

) TYPE=InnoDB;

DBの設計

(33)

処理が2重にならない工夫(2)

SELECT * FROM rss_data

WHERE fetcher_seed=? AND

last_crawl < ?

ORDER BY last_crawl LIMIT 1000

取得対象URLのSELECT

fetcher_seedはmemcachedのincrementで生成

my $incr = $memcached->incr( 'fetcher_seed' );

my $seed = $incr % 60;

$sth->execute(

$seed

,

DateTime->now->substract(hour=>2)->format(‘MySQL’),

)

(34)

kickerのScalability

kicker managerで複数個のkickerを同時起動

kickerおよびkicker managerが動作するマシ

ンを増やすことでrequestの回数を増やし続け

ていくことができる

(35)

完成

インターネット

kicker kicker

manager

script server

kicker kicker

manager

script server

LVS

Apache

(mod_perl)

Apache

(mod_perl)

RSS DB

Diary DB

memcached

(36)

mod_perlをjob workerとして使う

(兼まとめ)

(37)

mod_perlを使った利点

Apacheで並列処理をみてくる

Apacheでメモリの管理もできる

MaxRequestPerChild

startup.plでのメモリ効率化

Web Application Frameworkをそのまま活用できる

デプロイツールがそのまま使える

監視も行いやすい

サーバを足せばスケールする

APIとしてもつかえる

(38)

mod_perlを使うTips

jobを細かく分割する

並行処理度を高める

障害時の範囲を狭くすることができる

Requestを非同期に行うクライアントを用意

HTTP::Asyncはお勧め

(39)
(40)

エンジニア募集してます

mixiでは一緒に働くウェブアプリケーション・エ

ンジニア、システム・エンジニアを募集していま

(41)

参照

関連したドキュメント

Recently, the concept of &#34;Third Place&#34; has become widespread. Third place is another place than home and work, and it was proposed in 1989 to reduce issues such as

学術関係者だけでなく、ヘリウム供給に関わる企業や 報道関係などの幅広い参加者を交えてヘリウム供給 の現状と今後の方策についての

Amortized efficiency of list update and paging rules.. On the

SUSE® Linux Enterprise Server 15 for AMD64 &amp; Intel64 15S SLES SUSE® Linux Enterprise Server 12 for AMD64 &amp; Intel64 12S. VMware vSphere® 7

ESET Server Security for Windows Server、ESET Mail/File/Gateway Security for Linux は

Another new aspect of our proof lies in Section 9, where a certain uniform integrability is used to prove convergence of normalized cost functions associated with the sequence

Adaptive image approximation by linear splines over locally optimal Delaunay triangulations.. IEEE Signal Processing Letters

また適切な音量で音が聞 こえる音響設備を常設設 備として備えている なお、常設設備の効果が適 切に得られない場合、クラ