Linux Duda: balanceador en linux. Apache, Oracle Web Server, lo que sea

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.768
Muchachos, necesito una consultoría express. La situación es la siguiente:

Estoy instalando la SOA Suite de Oracle en cluster. Esto se compone de dos servidores servidores Linux (Oracle Linux 7).

servidor1
servidor2

Correrán varios servicios

Administración. Puerto 7001, Activo/Pasivo, sólo corre en un servidor a la vez. Puede ser cualquier servidor, pero corre en uno solo a la vez.

WLS Server. Puerto 7010. Activo/Activo, puede correr en ambos servidores a la vez. Necesita balanceo de carga y persistencia de sesiones.

SOA Server. Puerto 7003. Activo/Activo, puede correr en ambos servidores a la vez. Necesita balanceo de carga y persistencia de sesiones.

BAM Server. Puerto 7004. Activo/Activo, puede correr en ambos servidores a la vez. Necesita balanceo de carga y persistencia de sesiones.

https://docs.oracle.com/middleware/1221/core/SOEDG.pdf
Ver página 22.

La cosa es que necesito llegar a los distintos servicios por el puerto accediendo desde un único host name virtual llamado SOAServer. Por ejemplo:

SOAServer:7001 -> Accede al servicio de Administración. Tiene que saber que servidor está dando el servicio, preguntar por el puerto 7001 del el servidor1 o el servidor2 y derivarme al que esté activo.

SOAServer:7010 -> Accede al servicio de WLS Server. Tiene que saber que servidor está dando el servicio, preguntar por el puerto 7010 del el servidor1 o el servidor2, y derivarme a alguno de ellos.

SOAServer:7003 -> Accede al servicio de SOA Server. Tiene que saber que servidor está dando el servicio, preguntar por el puerto 7003 del el servidor1 o el servidor2, y derivarme a alguno de ellos.

SOAServer:7004 -> Accede al servicio de BAM Server. Tiene que saber que servidor está dando el servicio, preguntar por el puerto 7004 del el servidor1 o el servidor2, y derivarme a alguno de ellos.


Eventualmente la solución del balanceador también puede ser en cluster Apache, un cluster Web Server Oracle, lo que sea. Lo importante es que el usuario final conozca sólo un hostname y por ahí llegue a los distintos servicios.

Acá tenemos soluciones de balanceo de carga en hardware, pero no tiene la ductilidad de una configuración Linux. De hecho creo que no es capaz de cubrir todos los requerimientos utilizando un solo hostname.


Cualquier idea se agradece.
 
Última modificación:

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.467
Nosotros balanceamos carga con nginx, mediante los módulos que vienen incorporados, upstream se llama si mal no recuerdo. La versión gratuita permite bastante, pero la versión pagada (nginx plus, carísimo btw) obviamente desbloquea muchas de las características más avanzadas. Para lo que quieres, la edición básica te servirá.

Saludos.


Sent from my iPhone using Tapatalk
 
Upvote 0

LagParty

Pro
Se incorporó
25 Enero 2005
Mensajes
633
Se me ocurren tres alternativas:

1- Nginx es lo más fácil yo creo. Si son servicios HTTP es directo, y si no lo compilas con el módulo stream que viene en la versión gratuita.
2- HAProxy, que es más rápido que Nginx y tiene unos logs impecables. Balancea sólo TCP y HTTP (no UDP).
3- Linux IPVS es lo más complejo, pero funciona a nivel de kernel y anda bastante rápido también. Tendrías que manejarlo con algo como keepalived.
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.467
Ahora toi en la pega, así que puedo acceder a los servidores para que te hagas una idea de la configuración que tenemos acá:

Código:
upstream frontendeu {
  ip_hash;

  #server XX.YY.169.5:4431 weight=9; # frontend 1
  server XX.YY.241.61:4432 max_fails=10 fail_timeout=5s; # frontend 2
  server XX.YY.241.63:4433 down; # frontend 3
}

Explicación:

Definimos un balanceador llamado frontendeu, tiene 3 variables que explicaré:
- El primero está comentado, pero tiene weight 9, significa que 9 de cada 10 requests lo va a tirar a ese server
- El segundo puede fallar hasta 10 veces, dp de eso dará error. Fail_timeout habla por si solo.
- El tercero está activo, pero con la variable "down", con lo cual le decimos a nginx que ese nodo está inactivo y que nunca debería elegirlo.

Más adelante en el server block:

Código:
  set $proxyId frontendeu;
  # Allow override if a specific frontend is chosen
  if ($http_cookie ~* "frontendid1") {
      set $proxyId XX.YY.169.5:4431;
  }
(...)

  location / {
      access_log off;

      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $host;
      proxy_read_timeout 30;
      proxy_pass https://$proxyId;
  }

El segundo bloque de código es el sitio en sí: podemos crear una cookie nombrada frontendid1 para forzar que toda la comunicación la haga con el primer proxy que tenemos definido. Una idea similar tenemos con el segundo y tercer proxy. Predeterminadamente, la ponemos de forma automática, para que tome en cuenta las variables definidas en el primer bloque.

Luego, en la location, decimos que toda la comunicación hacia el servidor la tiene que hacer bajo el proxyId que hayamos definido o sobre-escrito, y listo, mucha más ciencia que eso no tiene.

nginx por si solo resuelve (bastante rápido) cuáles nodos están arriba o abajo y devuelve automáticamente el server que corresponde.

Saludos.
 
Upvote 0

yakko

pingüino mal genio
Se incorporó
24 Agosto 2004
Mensajes
16.883
el problema es que los balanceadores web como apache o nginx no chequean si los servicios están vivos o respondiendo, simplemente redirigen las conexiones (normalmente usando round robin).

puedes usar un ldirector en conjunto con apache o nginx para mantener las cookies.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.768
Al final voy a utilizar netscaler.

Estoy armando un cluster de Oracle SOA BPM pero me falta una pata para dejarlo terrible de pro, y es que necesito que cada server pueda ver el directorio del otro server, Es decir, que ambos servers puedan compartir su respectivo directorio /u01/app/oracle/shared/ . ¿Alguna idea, que no sea tener que utilizar un tercer servidor?
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.401
unison podría servirte, siempre y cuando ambos no escriban al mismo tiempo en el mismo archivosu funcionamiento es similar al rsync pero es bidireccional
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.768
Rsync es bidireccional? Mi preocupación es que no quiero tener que agregar una tercera maquina que haga las veces de servidor de archivos porque eso significa agregarle un nuevo punto de fallos a la solución.

Enviado desde mi 7055A mediante Tapatalk
 
Upvote 0

yakko

pingüino mal genio
Se incorporó
24 Agosto 2004
Mensajes
16.883
rsync no es bidireccional.

lo más conocido para hacer eso en activo/activo y tiempo real es drbd, pero es bien delicado.
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.401
unison es bidireccional, rsync no. El cacho de unison es cuando ambos servidores deben escribir en el mismo archivo al mismo tiempo.
 
Upvote 0

Koji Nanjo

Sushiman
Se incorporó
21 Marzo 2006
Mensajes
1.725
En un balanceador, vamos a levantar un servidor tomcat con una base de datos mysql con Jena SDB triple store (una wea muy marciana). Y acá al parecer no tienen arquitecto de plataforma y las primeras pruebas de carga se cae con 50 usuarios, así que obligados a armar y configurar nosotros :uy
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.768
En un balanceador, vamos a levantar un servidor tomcat con una base de datos mysql con Jena SDB triple store (una wea muy marciana). Y acá al parecer no tienen arquitecto de plataforma y las primeras pruebas de carga se cae con 50 usuarios, así que obligados a armar y configurar nosotros :uy

50 usuarios simultáneos y se cae... Yo no soy muy entendido en Linux, ¿pero es idea mía o 50 usuarios es un moco como para botar una instalación así?
 
Upvote 0

Koji Nanjo

Sushiman
Se incorporó
21 Marzo 2006
Mensajes
1.725
50 usuarios simultáneos y se cae... Yo no soy muy entendido en Linux, ¿pero es idea mía o 50 usuarios es un moco como para botar una instalación así?

Una mierda, creemos que no cachan ni una y ni siquiera miraron las configuraciones de tomcat. Veremos que ondis y iré reportando por acá
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.401
Tomcat, tomcat, tomcat, ¿por que siempre usan tomcat? Esa cosa solo devora recursos, ocupa memoria hasta por si acaso.
 
Upvote 0

yakko

pingüino mal genio
Se incorporó
24 Agosto 2004
Mensajes
16.883
Tomcat, tomcat, tomcat, ¿por que siempre usan tomcat? Esa cosa solo devora recursos, ocupa memoria hasta por si acaso.
eso es problema de Java, no de tomcat.

súmale a eso un Java mal hecho en un servidor mal instalado y sin ningún tuning. más lento que funcionario público con fatiga.

Enviado desde mi HTC One M9 mediante Tapatalk
 
Upvote 0

Soujiro

Fanático
Se incorporó
14 Enero 2008
Mensajes
1.401
Aca al pobre desarrollador de java lo tengo bajo "control" a garrotaso limpio, para que el tomcat no se arranque consumiendo memoria, dado que hace algunos meses cuando hicieron un release nuevo con la version "actualizada" del framework el maldito gato comenzo a lekear memoria y threads por todos lados provocando caidas del servidor a full carga.
Eso me recuerda... ¿existe alguna manera de "simular" carga en un webserver con soporte javascript? por que claro en las "pruebas" no tuvieron ningun drama... pero 10 o 20 usuarios concurrentes no se equiparan a 1000 o 2000
 
Upvote 0
Subir