
mod_proxy_balancerを拡張して動的にごにょごにょしてやろうと思ったのに出来なかったからコアダンプ
基本的にLinuxとかの環境ではpreforkしてApacheが動いているはずですが
mod_proxy_balancerの実装がちぐはぐだった。
主なデータとして、balancer://スキームを取り扱っているproxy_balancerと
各クラスタの面倒を見ているproxy_workerってのがあるのさ。
で、バランサ管理画面でApacheの起動中に動的に設定変更出来る機能があるんだけど
proxy_balancerで管理しているstickysessionとか、リクエスト回数/転送サイズでバランシングアルゴリズムを切り替えるフラグを管理してるのね。
httpd.confを読み込むフェーズ中ならまだ良いんだけど、一度サーバが回り始めるとプロセス空間が別々になるのよ。
で、preforkで動いてるのよ。
メモリ空間がバラバラになってるのにproxy_balancerの中身弄ってるのよ。
しかも、ご丁寧にapr_pstrdupまでしちゃって…
変更したこと、他のプロセスから見えないのにね。
でも、proxy_worker系のパラメタは平気。
各ノードの重みとか、stickeysessionの値対応付けとか、クラスタの一時停止フラグとかの結構重要そうなやつ。
何でかって言うと、proxy_worker構造体の中にsっていうメンバがいるんだけど、そのsってのがproxy_worker系パラメータを管理画面から書き換えるときに弄ってるとこなの。
で、このsってのはスコアボード(共有メモリ)の中にいるので別プロセスからでも変更内容が分かるわけ。
balancer系のデータもスコアボードに入れればいいんだろうけど、今のcoreの実装上、改造するのがキツイ、書き換え範囲多すぎ。
そもそも、balancerとworkerの紐付けどうすr?worker新規作成したらどうすりゃいい?
worker用のメモリも前もって確保しなきゃだめじゃね?
てか、pre allocしてたら大規模運用じゃ意味ねえyp!pre allocした数以上の追加があったらどうすんの?
とかとか
struct proxy_balancer {のmutexが気になるけど・・・
apr_array_header_t *workers; /* array of proxy_workers */
const char *name; /* name of the load balancer */
const char *sticky; /* sticky session identifier */
int sticky_force; /* Disable failover for sticky sessions */
apr_interval_time_t timeout; /* Timeout for waiting on free connection */
int max_attempts; /* Number of attempts before failing */
char max_attempts_set;
proxy_balancer_method *lbmethod;/* XXX: Perhaps we will need the proc mutex too.
* Altrough we are only using arithmetic operations
* it may lead to a incorrect calculations.
* For now use only the thread mutex.
*/
#if APR_HAS_THREADS
apr_thread_mutex_t *mutex; /* Thread lock for updating lb params */
#endif
void *context; /* general purpose storage */
};
サーバ追加するだけで、自動的にクラスタ入りできるソリューションがApache 2.2単体で出来たらいいなぁと思ってたけど、もろもろあって実現きついぽ。
追加されたサーバの検知デーモン中にhttpd.confを書き換えてrestartさせる感じかなぁ。
てかmod_perlすりゃいいのか。いやプロセスでか過ぎだろw
preforkやめてworkerにして
ServerLimit 1とかにして、無理やり改造?
StartServers 1
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
mod_proxy系のTODOも見当たらないしワケワカンネ。
なんとなくアーキテクチャの見直しが入る予感。。。
どうすりゃいいんでしょうね。
そうそう
/* The number of dynamic workers that can be added when reconfiguring.こんなのもあるんですよね。httpd.confの設定数+16個分のメモリ確保は出来てる。
* If this limit is reached you must stop and restart the server.
*/
#define PROXY_DYNAMIC_BALANCER_LIMIT 16