Menu

Configure

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.hadoop_group ?= service.deps.hadoop_core[0].options.hadoop_group

Environment

  options.version ?= '6.6.1'
  options.host ?= service.node.fqdn # need for rendering xml
  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/conf'

Configuration

Ryba installs solrcloud with a single instance (one core). However, once installed, the user can start easily several instances for differents cores ( and so with different ports).

  # 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.shards ?= service.deps.solr_cloud.length
  options.clean_logs ?= false
  # Layout
  options.port ?= 8983
  options.env ?= {}
  zk_hosts = service.deps.zookeeper_server.filter( (srv) -> srv.options.config['peerType'] is 'participant')
  options.zk_connect = zk_hosts.map( (srv) -> "#{srv.node.fqdn}:#{srv.options.config['clientPort']}").join ','
  options.zk_node ?= 'solr'
  options.zkhosts = "#{options.zk_connect}/#{options.zk_node}"
  options.dir_factory ?= "${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"
  options.lock_type = 'native'
  options.jaas_path ?= "#{options.conf_dir}/solr-server.jaas"

Fix Conf

Before 6.0 version, solr.xml'<solrCloud> section has a mistake: The property zkCredentialsProvider is 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]
  options.security ?= {}
  options.security["authentication"] ?= {}
  options.security["authentication"]['class'] ?= if  service.deps.hadoop_core[0].options.core_site['hadoop.security.authentication'] is 'kerberos'
  then 'org.apache.solr.security.KerberosPlugin'
  else 'solr.BasicAuthPlugin'
  if service.deps.hadoop_core[0].options.core_site['hadoop.security.authentication'] is 'kerberos'
    options.admin_principal ?= "#{options.user.name}@#{options.krb5.realm}"
    options.admin_password ?= 'solr123'
    options.admin_principal ?= options.admin_principal
    options.admin_password ?= options.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
    #Acls
    #https://cwiki.apache.org/confluence/display/solr/Rule-Based+Authorization+Plugin
    # ACL are available from solr 5.3 version (HDP verseion has 5.2 (June-2016))
    # Configure roles & acl only on one host
    if service.deps.solr_cloud[0].node.fqdn is service.node.fqdn
      if options.source isnt 'HDP'
        unless /^[0-5].[0-2]/.test options.version # version < 5.3
          options.security["authorization"] ?= {}
          options.security["authorization"]['class'] ?= 'solr.RuleBasedAuthorizationPlugin'
          options.security["authorization"]['permissions'] ?= []
          # options.security["authorization"]['permissions'].push name: 'security-edit' , role: 'admin' #define new role
          # options.security["authorization"]['permissions'].push name: 'read' , role: 'reader' #define new role
          options.security["authorization"]['permissions'].push name: 'all' , role: 'manager' #define new role
          options.security["authorization"]['user-role'] ?= {}
          options.security["authorization"]['user-role']["#{options.admin_principal}"] ?= 'manager'
          for host in service.deps.solr_cloud.map( (srv)-> srv.node.fqdn)
            options.security["authorization"]['user-role']["#{options.user.name}/#{host}@#{options.krb5.realm}"] ?= 'manager'
            options.security["authorization"]['user-role']["HTTP/#{host}@#{options.krb5.realm}"] ?= 'manager'

Environment and Zookeeper ACL

  options.zk_opts ?= {}
  options.env['SOLR_JAVA_HOME'] ?= service.deps.java.options.java_home if service.deps.java
  options.env['SOLR_HOST'] ?= service.node.fqdn
  options.env['ZK_HOST'] ?= options.zkhosts
  options.env['SOLR_HEAP'] ?= "512m"
  options.env['ENABLE_REMOTE_JMX_OPTS'] ?= 'false'
  if service.deps.hadoop_core[0].options.core_site['hadoop.security.authentication'] is 'kerberos'
    # options.env['SOLR_AUTHENTICATION_CLIENT_CONFIGURER'] ?= 'org.apache.options.client.solrj.impl.Krb5HttpClientConfigurer'
    options.env['SOLR_AUTH_TYPE'] ?= 'kerberos'
    # Zookeeper ACLs
    # https://cwiki.apache.org/confluence/display/solr/ZooKeeper+Access+Control
    # options.zk_opts['zkCredentialsProvider'] ?= 'org.apache.solr.common.cloud.DefaultZkCredentialsProvider'
    # options.zk_opts['zkACLProvider'] ?= 'org.apache.solr.common.cloud.SaslZkACLProvider'
    # options.zk_opts['solr.authorization.superuser'] ?= solr.user.name #default to solr
    # options.env['SOLR_ZK_CREDS_AND_ACLS'] ?= 'org.apache.solr.common.cloud.SaslZkACLProvider'
  else
    #d
  options.zk_opts['zkCredentialsProvider'] ?= 'org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider'
  options.zk_opts['zkACLProvider'] ?= 'org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider'
  options.zk_opts['zkDigestUsername'] ?= options.user.name
  options.zk_opts['zkDigestPassword'] ?= 'solr123'
    # options.zk_opts['zkDigestReadonlyUsername'] ?= auser
    # options.zk_opts['zkDigestReadonlyPassword'] ?= 'solr123'

SSL

  options.ssl = merge {}, service.deps.ssl?.options, ssl:
    truststore: target: "#{options.conf_dir}/truststore"
    keystore: target: "#{options.conf_dir}/keystore"
  , options.ssl
  options.ssl.enabled ?= !!service.deps.ssl
  if options.ssl.enabled
    throw Error "Required Option: ssl.cert" unless options.ssl.cert
    throw Error "Required Option: ssl.key" unless options.ssl.key
    throw Error "Required Option: ssl.cacert" unless options.ssl.cacert
    throw Error "Required Property: ssl.truststore.password" unless options.ssl.truststore.password
    throw Error "Required Property: keystore.password" unless options.ssl.keystore.password
    options.env['SOLR_SSL_KEY_STORE'] ?= options.ssl.keystore.target
    options.env['SOLR_SSL_KEY_STORE_PASSWORD'] ?= options.ssl.keystore.password
    options.env['SOLR_SSL_TRUST_STORE'] ?= options.ssl.truststore.target
    options.env['SOLR_SSL_TRUST_STORE_PASSWORD'] ?= options.ssl.truststore.password
    options.env['SOLR_SSL_NEED_CLIENT_AUTH'] ?= 'false'

Java version

Solr 6.0 is compiled with java 1.8. So it must be run with jdk 1.8. The options.jre_home configuration allow a specific java version to be used by solr zkCli script

  options.jre_home ?= service.deps.java.options.java_home if service.deps.java

Configure HDFS

Configure Solr to index document using hdfs, and document stored in HDFS.

  if service.deps.hdfs_client?
    options.hdfs ?= {}
    options.hdfs.user ?= service.deps.hadoop_core[0].options.hdfs.krb5_user
    options.hdfs.home ?=  "hdfs://#{service.deps.hadoop_core[0].options.core_site['fs.defaultFS']}/user/#{options.user.name}"
    options.hdfs.blockcache_enabled ?= 'true'
    options.hdfs.blockcache_slab_count ?= '1'
    options.hdfs.blockcache_direct_memory_allocation ?= 'false'
    options.hdfs.blockcache_blocksperbank ?= 16384
    options.hdfs.blockcache_read_enabled ?= 'true'
    options.hdfs.blockcache_write_enabled ?= false
    options.hdfs.nrtcachingdirectory_enable ?= true
    options.hdfs.nrtcachingdirectory_maxmergesizemb ?= '16'
    options.hdfs.nrtcachingdirectory_maxcachedmb ?= '192'
    options.hdfs.security_kerberos_enabled ?= if service.deps.hadoop_core[0].options.core_site['hadoop.security.authentication'] is 'kerberos' then 'true' else 'false'
    options.hdfs.security_kerberos_keytabfile ?= options.keytab
    options.hdfs.security_kerberos_principal ?= options.principal
    # instruct solr to use hdfs as home dir
    options.dir_factory = 'options.HdfsDirectoryFactory'
    options.lock_type = 'hdfs'

Wait

  options.wait_krb5_client = service.deps.krb5_client.options.wait
  options.wait_zookeeper_server = service.deps.zookeeper_server[0].options.wait
  options.wait ?= {}
  options.wait.tcp ?= for srv in service.deps.solr_cloud
    host: srv.node.fqdn
    port: srv.options.port or '8983'

Dependencies

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