|
|
Re: Writing hooks for Perlbal: msg#00013
web.server.perlbal.general
|
Subject: |
Re: Writing hooks for Perlbal |
Raistlin,
I could swear that perlbal already has a health check in place, but the
other place you would do health checking would be during the callback
that you registered (that would fire every N seconds.) Or are you
looking for something else?
Elliot
Raistlin Majere wrote:
Elliot,
Well, I think I'm onto something. I've been hacking on Service.pm
and the code that spawns new servers. Around line 1162 I've added a
subroutine which verifies that the server is available on the specified
ip and port it receives from $self->{pool}->get_backend_endpoint. If
the server isn't there, then I execute a lot of code and return a new
$ip and $port, and then let the subroutine continue.
I'm a little concerned that this gets executed only when new
backends are created, and that if an existing backend with a persistent
connection goes down this code won't be executed. I'd like to find a
better place for it and write a 'hook' for it. Essentially a 'verify'
server hook. Any ideas or suggestions would be appreciated.
-=Raistlin
On 8-Oct-06, at 12:11 PM, Elliot F wrote:
I would suggest taking a look at the code around the
backend_client_assigned hook. If you haven't already, take a look at
the doc/hacking/hooks.txt file.
I'm not sure, but your problem may quickly get much more complex. I
would not be surprised if you have to make your own hook somewhere, or
modify perlbal.
If the 'backend_client_assigned' hook isn't enough, I'm assuming you
would want to look at './lib/Perlbal/BackendHTTP.pm', and specifically
the 'assign_client' sub around line 159. I'm not saying this is the
answer, but it would be where I would start looking.
Hope that helps,
Elliot
Raistlin Majere wrote:
Alright, I have the plugin/callback being called. Looks like I just
needed to add "plugins = MyPlugin" (where MyPlugin is the package in
the Perlbal/Plugin directory).
The callback functionality looks useful for polling things and
reacting accordingly, I've implemented this, however I am curious how
to rewrite a request to a different backend server.
Ideally I'd like to be able to be able to:
Accept a request to a virtualhost
Verify that the backend server is up and running
if it's not then hold the request while I either:
a) bring the backend server up
b) rewrite the request to a different server
Any ideas how to redirect the request, POST data, etc to a different
machine?
Raistlin,
Take a look at registering a callback that perlbal will trigger
every N seconds. AtomStream.pm has it being used. It's called
'Perlbal::Socket::register_callback'. You would be able to do
whatever check(s) you want, and react accordingly (mark it as down
somehow, reconfigure perlbal, etc.) And it wouldn't be doing it for
every request.
Just make sure you don't block. :)
Elliot
Raistlin Majere wrote:
I've installed and configured perlbal and have run into some
difficulties. I've setup perlbal to be a reverse proxy so that it
correctly proxies virtualhosts to the appropriate servers. (i.e.
vhost1.example.com, vhost2.example.com correctly reverse proxies
for vhost1.com and vhost2.com respectively) This is working
perfectly, and wasn't too difficult to configure.
However now I want to write some code that will:
First verify that the backend server is alive
Second that the backend server can answer requests on the port I'm
trying to talk to
And if it's NOT alive and able to respond to requests that I can
redirect requests to a different server, or execute some code to
bring the downed server up, before retrying.
I've tried to use the Perlbal::ClientProxy "start_proxy_request"
hook, however that seems to affect each and every request (i.e.
each html page, graphic, etc.)
I need to be able to check to see if the backend server is alive,
and if it's not, tell Perlbal: "Whoa hold your horeses" long enough
for me to bring a server up (I can do this with some scripts I
have), and then redirect the request to the new server.
Any help or advice would be greatly appreciated.
|
|