Avatar billede dsj Nybegynder
24. marts 2003 - 21:57 Der er 33 kommentarer og
1 løsning

Rerouting af socket-connections mellem servere i cluster

Jeg arbejder pt. på et clusteret server-system, som ret naturligt består af en master-server og et antal slave-servere. Broen mellem master/slave er endnu ikke realiseret men foretrækkes laved med RMI. Klienterne connecter til master-serveren via Socket-ServerSocket.

Spørgsmålet ligger så i: hvordan kan jeg, når master-serveren modtager en klient med ServerSocket.accept() reroute/redirecte (kald det hvad du vil) denne forbindelse til en anden slave-server, som sandsynligvis kører på en anden fysisk maskine?
Avatar billede arne_v Ekspert
24. marts 2003 - 22:07 #1
Normalt bruger man cluster betegnelsen om et system af
ligeværdige servere.

Og den traditionelle måde at implementere det på (lige
fra J2EE app-server cluster til OpenVMS cluster) er at
clusteret har et navn om man connecter til cluster-navnet
og får så den server med mindst load. Og hvis det er en god
cluster-løsning så bliver man automatisk flyttet til
en anden server, hvis den man er forbundet til fejler.
Avatar billede arne_v Ekspert
24. marts 2003 - 22:08 #2
Men til dit konkrete spørgsmål.

Der er ikke noget i Socket/ServerSocket til at redirecte
til en anden server.

Det skal laves på et niveau højere.

Hvis du f.eks. bruger HTTP, så kan man i HTTP protokollen
lave en redirect (som du uden tvivl ved alt om).
Avatar billede arne_v Ekspert
24. marts 2003 - 22:09 #3
Så du skal lave en protokol client-master der tillader redirect
til client-slave.
Avatar billede arne_v Ekspert
24. marts 2003 - 22:16 #4
Hvis det er en specifik opgave du har fået, så tjener det jo selvfølgelig
ikke noget formål at diskutere alternativer.

Men det kun er et specifikt problem der skal løses, så kan du overveje
at forklare lidt om det og så kan vi komme med input til det.
Avatar billede dsj Nybegynder
24. marts 2003 - 22:18 #5
Det er en multiplayer spilleserver jeg udvikler, som skal kunne håndtere flre tusinde klienter, lidt for mange til alle at kunne køre på samme maskine. Når en klient logger på er det serveren der bestemmer hvilken slave-server klienten skal sendes videre til, f.eks. ud fra hvor der er andre klienter (i en abstrakt verden). Grundet nogle runtime administrationsfunktioner er der nødt til at være en master-server som indeholder bla. en cache med fælles data.
Avatar billede dsj Nybegynder
24. marts 2003 - 22:20 #6
En verden er opdelt i flere rum, som køre på forskellige servere, bestemt manuelt. Serveren husker f.eks. hvilket rum klienten var i sidst denne disconnectede og derved skal "smide" klienten ind i samme rum ved næste connct. Pt. ved de forskellige servere ikke hvilke rum der kører på de andre servere, så hvis ikke en master-server som tager imod klienterne er løsningen, hvordan kan man så gøre?
Avatar billede arne_v Ekspert
24. marts 2003 - 22:22 #7
Du kan bygge det ind i protkollen:

client connect to master
client send "LOGIN user pass" to master
cleint receive "OK slavex" from master
client connect to slavex

[lidt primitivt, men du forstå hvad jeg mener]
Avatar billede dsj Nybegynder
24. marts 2003 - 22:23 #8
Nu er Socket ikke serializble, men kan man ikke sende et andet objekt med forbindelse over en RMI-bro til en maskine som kan overtage forbindelsen?
Avatar billede dsj Nybegynder
24. marts 2003 - 22:24 #9
Ja, jeg har allerede overvejet den med protokollen, men ville helst hvis det var muligt have det løst server-side only.
Avatar billede arne_v Ekspert
24. marts 2003 - 22:25 #10
Må jeg have lov til at nævne et af e slemme ord: EJB !

En entity bean kan cache administrations data på alle servere.

Et "rum" kan være ensession bean som kun deployes på et
cluster member. Så sørger app-serveren selv for at requests
til den EJB ryger til den rigtige server.
Avatar billede dsj Nybegynder
24. marts 2003 - 22:28 #11
Kunne man virkelig godt tillade sig at blande en socket-server sammen med EJB'er ?? Er det ikke ufint og en genvej, eller?

Og hvordan med performance. Nu kommer der til at være rigtig mange rum da der kun må være 20 klienter i samme rum :)
Avatar billede arne_v Ekspert
24. marts 2003 - 22:28 #12
Nej en Socket kan ikke sendes over med RMI.

Sockets er en af de ting der absolut ikke er serializable.
Avatar billede arne_v Ekspert
24. marts 2003 - 22:30 #13
Nej med EJB skulle klienterne naturligvis connecte direkte til
EJB'erne og ikke til en socket server.
Avatar billede dsj Nybegynder
24. marts 2003 - 22:32 #14
Det er flash-klienter... :-/
Avatar billede dsj Nybegynder
24. marts 2003 - 22:34 #15
Jeg troede du tænkte noget i retningen af at selve socket-serveren skulle benytte EJB'er som backend... men jeg kunne da godt have fortalt lidt før at vi snakkede Flash :)
Avatar billede arne_v Ekspert
24. marts 2003 - 22:34 #16
Performance vil næppe være noget problem i forhold til
antal rum (lidt ekstra RAM løser det problem).

Men antallet af kalde der komem rind vil naturligvis
ligge en vis load på serveren.


Du skal ikke forvente at kommer over 1000 kald/sekund per server.
Avatar billede arne_v Ekspert
24. marts 2003 - 22:35 #17
Flash klienter ?

Hm. De kan jo sikkert ikke kalde EJB'er.

:-(
Avatar billede arne_v Ekspert
24. marts 2003 - 22:36 #18
Men så er der jo muligheden af:

client---serversocket-master---EJB-slave
Avatar billede arne_v Ekspert
24. marts 2003 - 22:37 #19
Fordi så er master'en jo ren passthrough og det burde den nok kunne klare.
Avatar billede dsj Nybegynder
24. marts 2003 - 22:37 #20
Næææh man ville nok påstå at jeg levede i en drømeverden hvis jeg regnede med det ;)

Jeg tykker lidt på det. Har også taget forskud på sorgerne, serveren skal ikke kunne clustres før om et par måneder højst :D
Avatar billede arne_v Ekspert
24. marts 2003 - 22:38 #21
Men nu vi er ved passthrough.

Har du overvejet:

client---servesocket-master-socket---serversocket-client

også passthrough og kunmed sockets.
Avatar billede dsj Nybegynder
24. marts 2003 - 22:38 #22
Og så kom jeg sandlig også til accaptere dit svar, ville ellers have ventet lige lidt, nåh men jeg har da i hvert fald fået klarhed over at man ikke automatisk kan redirecte en forbindelse. Er det sådan noget smart man har lavet her på eksperten, at den selv accepterer svar random ? :)
Avatar billede arne_v Ekspert
24. marts 2003 - 22:40 #23
Det ville være en noget speciel feature.
Avatar billede dsj Nybegynder
24. marts 2003 - 22:40 #24
Kan du uddybe hvad du mener. Tænker du på at masteren skal holde på alle connections og blot sende data videre til en slave? Vil det ikke medføre et pokkers til load på masteren?
Avatar billede dsj Nybegynder
24. marts 2003 - 22:43 #25
Hvis nu der er 10.000 klienter skal masteren holde på 10.000 sockets og vil nærmest få behov for selv at blive clusteret eller hvad?
Avatar billede arne_v Ekspert
24. marts 2003 - 22:45 #26
Ja.

Det tror jeg faktisk ikke.

Den gemmer ikke mange data, så RAM forbruget må være beskedent.

Den beregner ikke på data, så CPU forbruget må være beskedent.

Net-kortet får lov at bestille noget. Men net-kort i X Mbit er
betydeligt billigere end X Mbit internet-forbindelser, så jeg
regner med at det også går.

Men det kræver noget snedigt multi-threaded programmering at få det
til at køre smooth.

[men det gør din applikation nok under alle omstændigheder]
Avatar billede arne_v Ekspert
24. marts 2003 - 22:47 #27
10000 sockets vil være en hård belastning. Og jeg vil bl.a.
tror at du skal have tweaket operativ-systemet lidt for at
understøtte så mange samtidige sockets.

[husk at 64K er absolut max. !]
Avatar billede arne_v Ekspert
24. marts 2003 - 22:49 #28
Men hvad med at have X master'ere + Y slave's.

Master'ne deler deres admin database f.eks. via EJB's
og forwarder til slave's.

SÅ skal du bare have load balancet mellem master'ne.

Det kan gøres på flere måder:
  - DNS round robin
  - layer 3 switch (hardware)
  - noget coorperativt
Avatar billede dsj Nybegynder
24. marts 2003 - 22:51 #29
10.000 sockets og dermed 10.000 tråde ville være i overkanten ikke for passthrough-modellen ikke?
Avatar billede dsj Nybegynder
24. marts 2003 - 22:54 #30
Jeg kan godt se at clustrede master-servere ville være en god løsning men også mere kompliceret for lille mig, der samtidig skal have tid til at lave selve spil-delen :)
Avatar billede arne_v Ekspert
24. marts 2003 - 22:55 #31
Jo.

Det kan gøres.

Men det vil formentlig kræve noget stort isenkram (a la dual CPU med 4 GB RAM)
og et tweaket OS f.eks. en Linux med en special bygget kernel.
Avatar billede arne_v Ekspert
24. marts 2003 - 22:56 #32
Men 4000 clients på 4 master'e => 1000 connectiosn per server bør kunne
køre på noget mere standard.
Avatar billede arne_v Ekspert
24. marts 2003 - 22:57 #33
Iøvrigt tror jeg ikke at 1 tråd per connection er optimalt !
Avatar billede arne_v Ekspert
24. marts 2003 - 22:58 #34
ALt tager jo tid at lave, men hvis du vælger standard løsninger, så skal
du jo ikke lave så meget.

load balancing med DNS round robin kræver ikke noget.

J2EE app-server clustering for admin data kræver ikke ret meget.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester