Menu

Configure Solr Cloud cluster on docker

This module configures the servers to be able to run different solrCloud cluster in docker containers. The configuration is made in two steps:

  • The first is to create host level configuration as we would do without docker The host level configuration will be shared by the different containers running on the same host.
  • The second step consists to configure each SolrCloud cluster on the container level by looping through each on of it and configuring the different properties. These properties are unique to each container, depending on the cluster/host it belongs to. For now we supports only (at the cluster level) only one container by host.

Solr accepts differents sources:

  • HDP to use HDP lucidworks repos
ryba:
  solr:
    source: 'HDP'
    jre_home: '/usr/java/jdk1.8.0_91/jre'
    env:
      'SOLR_JAVA_HOME': '/usr/java/jdk1.8.0_91'
  • apache community edition to use the official release:
    in this case you can choose the version
ryba:
  solr:
    jre_home: '/usr/java/jdk1.8.0_91/jre'
    env:
      'SOLR_JAVA_HOME': '/usr/java/jdk1.8.0_91'
    version: '6.0.0'
    source: 'http://mirrors.ircam.fr/pub/apache/lucene/solr/6.0.0/solr-6.0.0.tgz'
module.exports =  (service) ->
  options = service.options

Identities

  # Group
  options.group ?= {}
  options.group = name: options.group if typeof options.group is 'string'
  options.group.name ?= 'solr'
  options.group.system ?= true
  # User
  options.user ?= {}
  options.user = name: options.user if typeof options.user is 'string'
  options.user.name ?= 'solr'
  options.user.home ?= "/var/#{options.user.name}/data"
  options.user.system ?= true
  options.user.comment ?= 'Solr User'
  options.user.groups ?= 'hadoop'
  options.user.gid ?= options.group.name
  options.user.limits ?= {}
  options.user.limits.nofile ?= 64000
  options.user.limits.nproc ?= true
  options.java_home ?= service.deps.java.options.java_home
  options.hadoop_group = merge {}, service.deps.hadoop_core?.options.hadoop_group, options.hadoop_group

Environment

  options ?= {}
  options.version ?= '6.6.1'
  options.source ?= "http://apache.mirrors.ovh.net/ftp.apache.org/dist/lucene/solr/#{options.version}/solr-#{options.version}.tgz"
  options.root_dir ?= '/usr'
  options.install_dir ?= "#{options.root_dir}/solr-cloud/#{options.version}"
  options.latest_dir ?= "#{options.root_dir}/solr-cloud/current"
  options.latest_dir = '/opt/lucidworks-hdpsearch/solr' if options.source is 'HDP'
  options.pid_dir ?= '/var/run/solr'
  options.log_dir ?= '/var/log/solr'
  options.conf_dir ?= '/etc/solr-cloud-docker/conf'
  options.build ?= {}
  options.build.dir ?= "#{options.cache_dir}/solr"
  options.build.image ?= "ryba/solr"
  options.build.tar ?= "solr_image.tar"
  options.build.source ?= "#{options.build.dir}/#{options.build.tar}"
  options.docker_compose_version ?= '2'

Docker Daemon

  options.docker ?= {}
  options.docker[opt] ?= service.deps.docker.options[opt] for opt in [
    'host'
    'default_port'
    'tlscacert'
    'tlscert'
    'tlskey'
    'tlsverify'
    'conf_dir'
  ]

Configuration

  # Layout
  options.log_dir ?= '/var/log/solr'
  options.pid_dir ?= '/var/run/solr'
  options.zk_hosts = if service.deps.zookeeper_server
  then service.deps.zookeeper_server?.filter( (srv) -> srv.options.config['peerType'] is 'participant')
  else null
  options.zk_connect = if service.deps.zookeeper_server
  then options.zk_hosts.map( (srv) -> "#{srv.node.fqdn}:#{srv.options.config['clientPort']}").join ','
  else options.zk_connect
  throw Error 'missing options.zk_connect' unless options.zk_connect
  options.zkhosts = "#{options.zk_connect}/solr"
  options.zk_node = "/solr"
  options.dir_factory ?= "${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"
  options.lock_type = 'native'
  # Misc
  options.clean_logs ?= false
  options.iptables ?= service.deps.iptables and service.deps.iptables.options.action is 'start'
  options.fqdn ?= service.node.fqdn
  options.jaas_path ?= "#{options.conf_dir}/solr-server.jaas"

Version Fix

Before 6.0 version, solr.xml'<solrCloud> section has a mistake: The property zkCredentialsProvider was named zkCredientialsProvider

  options.conf_source = if (options.version.split('.')[0] < 6) or (options.source is 'HDP')
  then "#{__dirname}/../resources/cloud/solr_5.xml.j2"
  else "#{__dirname}/../resources/cloud/solr_6.xml.j2"

Security

  options.krb5 ?= {}
  options.krb5.realm ?= service.deps.krb5_client.options.etc_krb5_conf?.libdefaults?.default_realm
  throw Error 'Required Options: "realm"' unless options.krb5.realm
  options.krb5.admin ?= service.deps.krb5_client.options.admin[options.krb5.realm]
  #solr configurations
  options.authentication_type ?= service.deps.hadoop_core?.options.core_site['hadoop.security.authentication']
  options.security ?= {}
  options.security["authentication"] ?= {}
  throw 'Missing authentication type options.authentication_type : simple,kerberos' unless options.authentication_type
  options.security["authentication"]['class'] ?=  if options.authentication_type is 'kerberos'
  then 'org.apache.solr.security.KerberosPlugin'
  else 'solr.BasicAuthPlugin'
  if options.authentication_type is 'kerberos'
    # Kerberos
    options.admin_principal ?= "#{options.user.name}@#{options.krb5.realm}"
    throw Error 'Missing Keberos Admin Principal Password (solr.cloud_docker.admin_password)' unless options.admin_password?
    options.admin_principal ?= solr.admin_principal
    options.admin_password ?= solr.admin_password
    options.principal ?= "#{options.user.name}/#{service.node.fqdn}@#{options.krb5.realm}"
    options.keytab ?= '/etc/security/keytabs/solr.service.keytab'
    options.spnego ?= {}
    options.spnego.principal ?= "HTTP/#{service.node.fqdn}@#{options.krb5.realm}"
    options.spnego.keytab ?= '/etc/security/keytabs/spnego.service.keytab'
    options.auth_opts ?= {}
    options.auth_opts['solr.kerberos.cookie.domain'] ?= "#{service.node.fqdn}"
    options.auth_opts['java.security.auth.login.config'] ?= "#{options.conf_dir}/solr-server.jaas"
    options.auth_opts['solr.kerberos.principal'] ?= options.spnego.principal
    options.auth_opts['solr.kerberos.keytab'] ?= options.spnego.keytab
    options.auth_opts['solr.kerberos.name.rules'] ?= "RULE:[1:\\$1]RULE:[2:\\$1]"
    # Authentication

SSL

  options.port ?= 8893
  options.ssl = merge {}, service.deps.ssl?.options, options.ssl
  options.ssl.enabled ?= !!service.deps.ssl
  options.truststore ?= {}
  options.keystore ?= {}
  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
    options.truststore.target ?= "#{options.conf_dir}/truststore"
    throw Error "Required Property: truststore.password" if not options.truststore.password
    options.keystore.target ?= "#{options.conf_dir}/keystore"
    throw Error "Required Property: keystore.password" if not options.keystore.password
    options.truststore.caname ?= 'hadoop_root_ca'

Docker Daemon config

  if service.deps.swarm_agent?
    options.swarm_conf ?=
      host: "tcp://#{service.deps.swarm_agent.options.advertise_host}:#{service.deps.swarm_agent.options.advertise_port ? 2376}"
      tlsverify:" "
      tlscacert: "/etc/docker/certs.d/ca.pem"
      tlscert: "/etc/docker/certs.d/cert.pem"
      tlskey: "/etc/docker/certs.d/key.pem"
  else
    options.swarm_conf = null
  options.docker ?= {}
  options.docker[opt] ?= service.deps.docker.options[opt] for opt in [
    'host'
    'default_port'
    'tlscacert'
    'tlscert'
    'tlskey'
    'tlsverify'
    'conf_dir'
  ]
  options.fqdn ?= service.node.fqdn

Environment

  options.env ?= {}
  options.env['SOLR_JAVA_HOME'] ?= options.java_home
  options.env['SOLR_HOST'] ?= service.node.fqdn
  options.env['SOLR_PID_DIR'] ?= options.pid_dir
  options.env['SOLR_HEAP'] ?= "512m"
  # options.env['SOLR_AUTH_TYPE'] ?= service.deps.hadoop_core.options.core_site['hadoop.security.authentication']
  options.env['ENABLE_REMOTE_JMX_OPTS'] ?= 'false'
  if options.ssl.enabled
    options.env['SOLR_SSL_KEY_STORE'] ?= options.keystore.target
    options.env['SOLR_SSL_KEY_STORE_PASSWORD'] ?= options.keystore.password
    options.env['SOLR_SSL_TRUST_STORE'] ?= options.truststore.target
    options.env['SOLR_SSL_TRUST_STORE_PASSWORD'] ?= options.truststore.password
    options.env['SOLR_SSL_NEED_CLIENT_AUTH'] ?= 'false'#require client authentication  by using cert

  # configure all cluster present in conf/config.coffee solr configuration
  options.hosts = service.deps.solr_cloud_docker.map (srv) -> srv.node.fqdn
  #need
  # - options (to have global solr/cloud_docker configuration)
  # - cluster_name ( to name configs respectively to clusters)
  # - cluster_config (to override default values like master nodes)
  options.clusters ?= {}
  for cluster_name, cluster_config of options.clusters
    cluster = configure_solr_cluster options, cluster_name, cluster_config
  #https://community.hortonworks.com/articles/15159/securing-solr-collections-with-ranger-kerberos.html

Wait

  options.wait_krb5_client = service.deps.krb5_client.options.wait
  options.wait_zookeeper_server = if service.deps.zookeeper_server
  then service.deps.zookeeper_server?[0].options.wait
  else tcp: options.zk_connect.split(',').map (config) ->
    [server,port] = config.split(':')
    host: server
    port : port or 2181

Dependencies

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