Menu

Configure

Mongodb Config servers have physically no dependances on other mongodb services. They can be installed and configured on their own.

module.exports = (service) ->
  options = service.options

Identities

  # Group
  options.group = name: options.group if typeof options.group is 'string'
  options.group ?= {}
  options.group.name ?= 'mongod'
  options.group.system ?= true
  # User
  options.user = name: options.user if typeof options.user is 'string'
  options.user ?= {}
  options.user.name ?= 'mongod'
  options.user.gid = options.group.name
  options.user.system ?= true
  options.user.comment ?= 'MongoDB User'
  options.user.home ?= '/var/lib/mongod'
  options.user.limits ?= {}
  options.user.limits.nofile ?= 64000
  options.user.limits.nproc ?= true

Configuration

  options.conf_dir ?= '/etc/mongod-config-server/conf'
  options.pid_dir ?= '/var/run/mongod'
  # MongoDB admin user
  options.admin ?= {}
  options.admin.name ?= 'admin'
  options.admin.password ?= 'admin123'
  options.root ?= {}
  options.root.name ?= 'root_admin'
  options.root.password ?= 'root123'
  # Misc
  options.fqdn ?= service.node.fqdn
  options.hostname = service.node.hostname
  options.iptables ?= service.deps.iptables and service.deps.iptables.options.action is 'start'
  options.clean_logs ?= false
  # Setting the role of mongod process as a mongodb config server
  options.config ?= {}
  options.config.sharding ?= {}
  options.config.sharding.clusterRole ?= 'configsvr'

Logs

  options.config.systemLog ?= {}
  options.config.systemLog.destination ?= 'file'
  options.config.systemLog.logAppend ?= true
  options.config.systemLog.path ?= "/var/log/mongodb/mongod-config-server-#{service.node.hostname}.log"

Storage

From 3.2, config servers for sharded clusters can be deployed as a replica set. The replica set config servers must run the WiredTiger storage engine

  options.config.storage ?= {}
  options.config.storage.dbPath ?= "#{options.user.home}/configsrv/db"
  options.config.storage.journal ?= {}
  options.config.storage.journal.enabled ?= true
  options.config.storage.engine ?= 'wiredTiger'
  options.config.storage.repairPath ?= "#{options.config.storage.dbPath}/repair" unless options.config.storage.engine is 'wiredTiger'
  throw Error 'Need WiredTiger Storage for config server as replica set' unless options.config.storage.engine is 'wiredTiger'
  if options.config.storage.repairPath?.indexOf(options.config.storage.dbPath) is -1
    throw Error 'Must use a repairpath that is a subdirectory of dbpath when using journaling' if options.config.storage.journal.enabled

Process

  options.config.processManagement ?= {}
  options.config.processManagement.fork ?= true
  options.config.processManagement.pidFilePath ?= "#{options.pid_dir}/mongod-config-server-#{service.node.hostname}.pid"

Network

Configuring ssl for the mongod process.

  options.config.net ?= {}
  options.config.net.port ?= 27017
  options.config.net.bindIp ?= '0.0.0.0'

Security

  # Disables the apis
  options.config.net.http ?= {}
  options.config.net.http.enabled ?= false
  options.config.net.http.JSONPEnabled ?= false
  options.config.net.http.RESTInterfaceEnabled ?= false
  options.config.net.unixDomainSocket ?= {}
  options.config.net.unixDomainSocket.pathPrefix ?= "#{options.pid_dir}"
  options.config.security ?= {}
  options.config.security.clusterAuthMode ?= 'x509'

SSL

  options.ssl = merge {}, service.deps.ssl?.options, options.ssl
  options.ssl.enabled = !!service.deps.ssl
  if options.ssl.enabled
    throw Error "Required Option: ssl.cert" if  not options.ssl.cert
    throw Error "Required Option: ssl.key" if not options.ssl.key
    throw Error "Required Option: ssl.cacert" if not options.ssl.cacert
  switch options.config.security.clusterAuthMode
    when 'x509'
      throw Error 'can not use x509' unless options.ssl.enabled
      options.config.net.ssl ?= {}
      options.config.net.ssl.mode ?= 'preferSSL'
      options.config.net.ssl.PEMKeyFile ?= "#{options.conf_dir}/key.pem"
      options.config.net.ssl.PEMKeyPassword ?= "mongodb123"
      # use PEMkeyfile by default for membership authentication
      # options.config.net.ssl.clusterFile ?= "#{mongodb.configsrv.conf_dir}/cluster.pem" # this is the mongodb version of java truststore
      # options.config.net.ssl.clusterPassword ?= "mongodb123"
      options.config.net.ssl.CAFile ?= "#{options.conf_dir}/cacert.pem"
      options.config.net.ssl.allowConnectionsWithoutCertificates ?= false
      options.config.net.ssl.allowInvalidCertificates ?= false
      options.config.net.ssl.allowInvalidHostnames ?= false
    when 'keyFile'
      options.sharedsecret ?= 'sharedSecretForMongodbCluster'
    else
      throw Error ' unsupported cluster authentication Mode'

ACL's

  options.config.security.authorization ?= 'enabled'

Kerberos

Kerberos authentication is only avaiable in enterprise edition.

  options.krb5 ?= {}
  options.krb5.realm ?= service.deps.krb5_client.options.etc_krb5_conf?.libdefaults?.default_realm
  # Admin Information
  options.krb5.admin ?= service.deps.krb5_client.options.admin[options.krb5.realm]
  options.config.security.sasl ?= {}
  options.config.security.sasl.hostName ?= service.node.fqdn
  options.config.security.sasl.serviceName ?= 'mongodb' # Can override only on enterprise edition
  options.sasl_password ?= 'mongodb123'

Replicat Set Discovery

Custom layout is mandatory, ryba does not create replicaset automatically anymore. The property ryba.mongodb.configsrv.replicaset contains the replicaset name whom the config server belongs to. Ryba will go through every ryba/mongodb/configsrv to compute the replica sets and check the layout.

Ryba user must provide the replica set master by set the boolean property ryba.mongodb.configsrv.is_master.

  throw Error 'Missing Replica Set Name ryba.mongodb.configsrv.replicaset' unless options.replicaset?
  options.replicasets = {}
  options.is_master ?= false
  for srv in service.deps.config_servers
    options.replicasets[srv.options.replicaset] ?= {}
    options.replicasets[srv.options.replicaset]['hosts'] ?= []
    options.replicasets[srv.options.replicaset]['hosts'].push srv.node.fqdn
    options.replicaset_master = srv.node.fqdn if srv.options.is_master and (srv.options.replicaset is options.replicaset)
  options.config.replication ?= {}
  options.config.replication.replSetName ?= options.replicaset
  throw Error 'No master defined for replica' unless options.replicaset_master

Wait

  options.wait_krb5_client = service.deps.krb5_client.options.wait
  options.wait = {}
  options.wait.tcp = for srv in service.deps.config_servers
    host: srv.node.fqdn
    port: options.config.net.port
  options.wait.local =
    host: service.node.fqdn
    port: options.config.net.port

Dependencies

{merge} = require '@nikitajs/core/lib/misc'