¿Cómo limitar las conexiones por host en MongoDB?

8

Estoy ejecutando un servidor mongo que acepta conexiones de otros clientes a través del controlador java. Lo que he notado es que después de un tiempo algunos usuarios abren demasiados puertos, y esto impide que otros usuarios se conecten al mongo. Crean solo 1 mongoClientobjeto, aunque al verificar su IP, se observan cientos de puertos.

Encontré un ejemplo para limitar la conexión por host en el controlador de Java, pero no quiero que el cliente se meta con él. ¿Cómo puedo limitar al cliente desde mi instancia mongod?

La instancia es 1 mongod que se ejecuta en un servidor remoto de Linux.

atrapado
fuente

Respuestas:

12

He enumerado algunas alternativas para la administración de la conexión a continuación, en orden de mayor a menor recomendada.

Aumentar las conexiones permitidas en el servidor

El límite total de conexión entrante en el servidor está determinado por el menor de los límites impuestos por el sistema operativo o maxIncomingConnections(también conocido maxConnsen MongoDB 2.4 y anteriores).

Por lo general, las distribuciones de Linux limitan los descriptores de archivo por proceso a 1024, de los cuales MongoDB usará el 80% para las conexiones entrantes (dejando alrededor de 819 conexiones disponibles).

Puede verificar las conexiones actuales y disponibles en el mongoshell a través de:

db.serverStatus().connections

Para los sistemas de producción, es típico ajustar la ulimitconfiguración en Linux para permitir más conexiones concurrentes. Para obtener más prácticas recomendadas, recomendaría revisar las Notas de producción en el manual de MongoDB.

Proporcionar una API

Si está administrando un servidor compartido con límites de recursos, es común proporcionar su propia API en lugar de acceso directo a la base de datos. Este enfoque le brinda una capa adicional de abstracción para que pueda administrar el uso de recursos y la implementación del servidor independientemente de la configuración del cliente. Por ejemplo, podría mover su servidor de base de datos o reconfigurar de un conjunto independiente a un conjunto de réplica, y los clientes no tendrían que ser conscientes de esto. También puede administrar límites de recursos personalizados (como conexiones por cliente) a través de su API, en función de las credenciales que utiliza el cliente para conectarse.

Reduzca el tamaño del grupo de conexiones en los clientes

MongoDB (como en 2.6) no tiene una opción para limitar las conexiones por cliente. Normalmente, los límites del cliente se impondrían a través del controlador (es decir, establecer el tamaño del grupo de conexiones). Por ejemplo, en el controlador Java, el MongoClienttamaño máximo predeterminado de la agrupación es 100.

Ya ha sugerido que esta no es una opción deseable, ya que no desea que los clientes jueguen con los límites de conexión, pero si va a imponer un límite del lado del servidor, aún sería razonable que establezcan el tamaño del grupo apropiadamente. De lo contrario, sus aplicaciones recibirán excepciones frecuentes a medida que elimine el exceso de conexiones.

Monitoree las operaciones del cliente

Si ajustar los límites en el cliente o servidor no es una opción, una alternativa a considerar es implementar un script para contar las conexiones concurrentes del cliente (por IP) db.currentOp()y eliminar las conexiones en exceso db.killOp(). Tendría que tener mucho cuidado para matar solo las solicitudes de los clientes. El killOp()comando es un comando de superusuario que también le permitirá eliminar subprocesos internos de la base de datos (lo que puede conducir a resultados impredecibles).

NOTA: Este enfoque no tendrá éxito si sus clientes se están conectando a través de una puerta de enlace compartida (es decir, cuando la IP de origen no identifica de forma exclusiva a un cliente).

Stennie
fuente