> basically, you need persistence :) Well, I only need persistence to optimize traffic flow so the correct sessionDB is used (eliminating a network hop). But, the system will still function without persistence (in HAProxy) as the PHP code will know which sessionDB it needs to use for a given user. In this case, persistence can be ensured by the PHP code even if HAProxy routes to a suboptimal initial backend.
In the multiple DC case, I will lose persistence if one DC fails. The forwarded requests to the other DC will have to establish a new session in a new sessionDB, but DC failure should be rare enough that I don't care about this. My site doesn't need 100% availability, just minimized user perceived downtime of minutes rather than hours. On Jan 3, 2013, at 3:49 AM, Baptiste <[email protected]> wrote: > basically, you need persistence :) > > On Thu, Jan 3, 2013 at 9:45 AM, KT Walrus <[email protected]> wrote: >> One more tweak… I think the frontend LBs could be made to distribute the >> load so that requests go to the backend that has the sessionDB that will be >> used for the request rather than simple RR (by using cookies). This would >> keep most requests handled entirely by a single backend server. I kind of >> like this, from an efficiency and simplicity point of view. >> >> Most setups seem to want you to place each individual component of the >> backend (HAProxy, Nginx/Varnish, PHP, and MySQL) in separate VPSs (in a >> "cloud" architecture). But, I'm thinking that it will simplify things if I >> don't use virtualization and have each backend capable of handling the >> entire request. If I need more capacity in the backend, I simply add >> another backend server that functions independently of the other backends >> (except for handling HA in times of high load where one backend forwards the >> excess requests to its next neighbor backend). >> >> I do have one problem in my proposed architecture. A sessionDB could, >> theoretically, get much more than MAXCONN connections (up to and including >> all current requests could use a single sessionDB). This is because once a >> sessionDB is selected for an individual user, all subsequent request from >> that user must be handled using this sessionDB. This means I have to keep >> MAXCONN low enough that if the sessionDB in the backend does have to handle >> all requests to all backends, the server will still function and not be >> overloaded. It would be nice if this wasn't the case, but I can't think of >> how to avoid this possibility. If I could, I could probably set MAXCONN to >> utilize 80% of the backend rather than a more conservative 50%, eventually, >> saving significant money in scale out. >> >> On Jan 3, 2013, at 2:56 AM, KT Walrus <[email protected]> wrote: >> >>> Thanks for the reply. >>> >>>> Why installing 2 layers of HAProxy??? >>>> A single one (on the 2 servers is enough). >>> >>> My thought was that the second layer of HAProxy would ensure that the >>> individual backend server would never have more than MAXCONN requests so I >>> know the server will never be overloaded possibly leading to the server >>> going down or taking too long to process a request. >>> >>> I want multiple active frontend lbs so that my architecture will scale >>> infinitely to many more frontends if necessary. If I eventually needed >>> more than 6 servers, I would set up another 6 servers (using the same setup >>> at 2 data centers for additional HA. >>> >>>> Since you're doing SSL, try >>>> to make it start multiple processes, a single one dedicated to HTTP >>>> and all other one for cyphering/deciphering processing… >>> >>> Yes. I planned on doing that. My 2 frontend servers are UP (4 cores) >>> while the 4 backend servers can be upgraded to DP (16 cores) and huge RAM >>> (256GBs). I've already purchased these servers. I expect that 1 frontend >>> server would be sufficient for a long time, but I want HA by having the two >>> frontends on separate independent power/ethernet connections within the >>> datacenter. >>> >>>> I'm not a fan of first algo, unless you pay the resource per number of >>>> backend server, which is not your case. >>> >>> I just thought "first" load balancing was perfect for "guarding" that an >>> individual backend server never exceeded MAXCONN concurrent requests. The >>> overhead should be minimal since this "guard" HAProxy almost always will >>> pass the request to localhost nginx/varnish. I need this "guard" because >>> there are multiple frontend LBs doing simple round robin to the backends >>> independently. This might become more of a possibility when and if I need >>> more LBs independently distributing requests to the backends. >>> >>>> Prefer using a hash in your case (even multiple hash with different >>>> backends and content switching), that way, your hit rate would be much >>>> better. >>> >>> I'm not so concerned about individual hit rate as I am about HA and >>> infinite scalability. It is relatively cheap to add a new server to handle >>> more backend or frontend load or split to placing some servers in a new >>> datacenter. I'd rather have my servers run at 50% capacity (purchasing >>> twice the hardware) if that means increased HA from having the guard >>> HAProxy's and never coming close to pushing them too hard that individual >>> pieces of the software/hardware stack start to fail. >>> >>>> no need to host a sorry page on a far away server, host it on your >>>> frontend LBs and HAProxy can deliver it once your server farm is >>>> full… >>> >>> That is true. I was really thinking that maybe the first Amazon "overflow" >>> server might be set up to actually have a full backend server if the sorry >>> page ever starts to be served by Amazon, I would simply create one or more >>> EC2 servers to take the temporary load. I actually plan on implementing >>> the website as EC2 instances (using this architecture) until my Amazon bill >>> goes over $500 a month at which time I would go colo. >>> >>>> An other remark, it may be hard to troubleshoot such infra with 2 >>>> Active/active LBs. >>> >>> I think I have to deal with this, but since each LB is handling unique VIPs >>> (unless keepalived kicks in due to failure), I don't think there is going >>> to be that much trouble. >>> >>>> And using DNS rr does not prevent you from using keepalived to ensure >>>> HA between your 2 HAProxys. >>> >>> Yes. I am hoping this is the case. I eventually want at least two >>> geographic locations (east and west coast data centers) so 4 IPs in the DNS >>> to distribute to the closest datacenter. I use DNSMadeEasy which can >>> support both DNS Global Traffic Director (east coast and west coast IP >>> Anycast) and DNS Failover (incase one datacenter goes offline). >>> >>>> >>>> cheers >>>> >>>> >>>> On Thu, Jan 3, 2013 at 12:20 AM, KT Walrus <[email protected]> wrote: >>>>> I'm setting up a new website in the next month or two. Even though the >>>>> traffic won't require a scalable HA website, I'm going to start out as if >>>>> the website needs to support huge traffic so I can get some experience >>>>> running such a website. >>>>> >>>>> I'd like any feedback on what I am thinking of doing… >>>>> >>>>> As for hardware, I am colocating 6 servers at this time and plan to use >>>>> Amazon S3 to host the static files (which should grow quickly to 1TB or >>>>> 2TB of mostly images). 2 of the servers are going to be my frontend load >>>>> balancers running haproxy. The remaining 4 servers with be nginx/varnish >>>>> servers (nginx for the PHP/MySQL part of the site and varnish to cache >>>>> the Amazon S3 files to save bandwidth charges by Amazon). >>>>> >>>>> I plan on doing DNS load balancing using pairs of A records for each >>>>> hosted domain that will point to each of my frontend haproxy load >>>>> balancers. Most traffic will be HTTPS, so I plan on having the frontend >>>>> load balancers to handle the SSL (using the new haproxy support for SSL). >>>>> >>>>> The two load balancers will proxy to the 4 backend servers. These 4 >>>>> backend servers will run haproxy in front of nginx/varnish with load >>>>> balancing of "first" and a suitable MAXCONN. Server 1 haproxy will first >>>>> route to the localhost nginx/varnish and when MAXCONN connections are >>>>> active to the localhost, will forward the connection to Server 2 haproxy. >>>>> Server 2 and 3 will be set up similarly to first route requests to >>>>> localhost and when full, route subsequent requests to the next server. >>>>> Server 4 will route excess requests to a small Amazon EC2 instance to >>>>> return a "servers are all busy" page. Hopefully, I will be able to add a >>>>> 5th backend server at Amazon to handle the overload if it looks like I >>>>> really do have traffic that will fill all 4 backend servers that I am >>>>> colo'ing (I don't really expect this to ever be necessary). >>>>> >>>>> Nginx will proxy to PHP on localhost and each localhost (of my 4 backend >>>>> servers) will have 2 MySQL instances - one for the main Read-Only DB and >>>>> one for a Read-Write SessionDB. PHP will go directly to the main DB (not >>>>> through HAProxy) and will use HAProxy to select the proper SessionDB to >>>>> use (each user session must use the same SessionDB so the one a request >>>>> needs might be on any of the backend servers). Each SessionDB will be >>>>> the master of one slave SessionDB on a different backend server for >>>>> handling the failure of the master (haproxy will send requests to the >>>>> slave SessionDB if the master is down or failing). >>>>> >>>>> So, each backend server will have haproxy to "first" balance HTTP to >>>>> nginx/varnish. The backends also have PHP and 3 instances of MySQL (one >>>>> for mainDB, one for master sessionDB, and one for another backend's slave >>>>> sessionDB). >>>>> >>>>> Also, the 2 frontend servers will be running separate instances of >>>>> haproxy. I hope to use keepalived to route the VIPs for one frontend to >>>>> the other frontend in case of failure. Or, should I use heartbeat? >>>>> There seems to be two HA solutions here. >>>>> >>>>> I know this is a very long description of what I am thinking of doing and >>>>> I thank you if you have read this far. I'm looking for any comments on >>>>> this setup. Especially, any comments on using "first" load >>>>> balancing/MAXCONN on the backend servers so that a request load balanced >>>>> from the frontend will keep the backend servers from overloading >>>>> (possibly bouncing a request from server 1 to server 2 to server 3 to >>>>> server 4 to EC2 "server busy" server) are especially appreciated. Also, >>>>> any comments on using pairs of master/slave sessionDBs to provide high >>>>> availability but still have session data saved/retrieved for a given user >>>>> from the same DB are appreciated. I believe this setup will allow the >>>>> load to be distributed evenly over the 4 backends and only have the front >>>>> end load balancers do simple round robin without session stickiness. >>>>> >>>>> Kevin >>>>> >>>>> >>> >>

