Balanceamento de carga

Quando o limite de processamento de uma instância do Servidor de Reconhecimento de Fala é atingido e não é suficiente para atender a demanda das aplicações clientes, é necessário aumentar a capacidade do sistema, adicionando novas instâncias ao ambiente de execução. Com isso, é necessário utilizar um software para realizar a distribuição e balanceamento de carga das aplicações clientes entre as instâncias do servidor de reconhecimento.

Este manual considera uma topologia bastante simples para criar um cluster de Reconhecimento de Fala, utilizando o Apache HTTP Server como balanceador de carga. A figura abaixo ilustra essa topologia. Ela pode ser alterada, utilizando esquemas mais complexos de balanceamento, a fim de prover alta disponibilidade, eliminando pontos de falha (single point of failure).

../_images/arquitetura-balanceador-carga.png

Topologia do cluster de reconhecimento de fala.

Requisitos de instalação

A instalação do Apache HTTP Server em uma máquina dedicada para fazer o balanceamento de carga requer a seguinte configuração mínima:

  • Hardware:

    • 1 GB livres de RAM
    • 100 MB livres de HD
    • 2 vCPU’s @ 2.20 GHz
    • Interface de rede 100 Mbps
  • Software:

    • Linux Red Hat 7.2 ou CentOS 7.2

    • Pacotes do Linux:

      • Group «Development Tools»
      • OpenSSL-Devel
      • PCRE-Devel (Perl-Compatible Regular Expressions Library)
      • APR e APR-Util
      • Apache HTTP Server 2.4.5 ou superior

Instalação

  1. Abra o terminal e instale as dependências.

    $ sudo yum groupinstall "Development Tools"
    $ sudo yum install openssl-devel
    $ sudo yum install pcre-devel
    
  2. Baixe o Apache e descompacte o arquivo.

    $ tar -zxvf httpd-2.4.<V>.tar.gz -C /tmp/
    
  3. Baixe o Apache Portable RuntimeAPR e APR-Util – e descompacte os arquivos junto aos arquivos fonte do Apache.

    $ tar -zxvf apr-1.5.<V>.tar.gz -C /tmp/
    $ tar -zxvf apr-util-1.5.<V>.tar.gz -C /tmp/
    $ cd /tmp/
    $ mv apr-1.5.<V> /tmp/httpd-2.4.<V>/srclib/apr
    $ mv apr-util-1.5.<V> /tmp/httpd-2.4.<V>/srclib/apr-util
    
  4. Compile o código fonte com suporte a SSL.

    $ cd /tmp/httpd-2.4.<V>
    $ ./configure --enable-so --enable-ssl --with-included-apr
    $ make
    $ sudo make install
    
  5. Adicione o diretório bin à variável PATH.

    $ echo 'export PATH=$PATH:/usr/local/apache2/bin' > /etc/profile.d/httpd.sh
    
  6. Execute o arquivo recém criado, para que os binários do Apache estejam disponíveis sem necessidade de referência ao caminho absoluto.

    $ chmod +x /etc/profile.d/httpd.sh
    $ . /etc/profile
    

Configuração

Acesso

  1. Edite o arquivo de configuração /usr/local/apache2/conf/httpd.conf. Localize e descomente as linhas abaixo, para habilitar os respectivos módulos:

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
    LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
    LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
    LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
    LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
    
  2. Configure o cluster de balanceamento de carga, adicionando o trecho abaixo no final do arquivo /usr/local/apache2/conf/httpd.conf:

    <Proxy balancer://asrcluster>
      BalancerMember ws://<IP do host1>:8025
      BalancerMember ws://<IP do host2>:8025
      ProxySet lbmethod=bybusyness
    </Proxy>
    
    ProxyPass /asr-server balancer://asrcluster/asr-server/asr
    
    <Location "/asr-balancer">
        SetHandler balancer-manager
    </Location>
    

Criptografia SSL (opcional)

Caso seja necessário configurar uma conexão Websocket com criptografia SSL, descomente as seguintes linhas do arquivo /usr/local/apache2/conf/httpd.conf:

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf

Nota

A configuração padrão do SSL definida no arquivo httpd-ssl.conf habilita a porta 443 para conexões seguras, utilizando os arquivos server.key e server.crt como certificados auto-assinados.

Para gerar um certificado auto-assinado, utilize a ferramenta OpenSSL e copie os arquivos gerados para o diretório do Apache:

$ openssl genrsa -des3 -out server.key 1024
$ openssl req -new -key server.key -out server.csr
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
$ sudo cp server.key /usr/local/apache2/conf/
$ sudo cp server.crt /usr/local/apache2/conf/

Certificado auto-assinado em clientes Java

Truststore, obrigatória para clientes Java:

$ keytool -import -trustcacerts -file /usr/local/apache2/conf/server.crt -alias  CPqD_ASR -keystore /tmp/cpqd-asr.truststore

Keystore, opcional para clientes Java:

$ keytool -import -alias CPqD_ASR -file /tmp/server.crt -keystore /tmp/client.keystore

Depois, mova os arquivos keystore e truststore para um diretório mais adequado para seu cliente Java e indique-os ao cliente da forma adequada.

Autenticação com SSL (opcional)

Para habilitar a Autenticação Básica de usuário (conexão WSS), adicione o trecho abaixo ao final do arquivo /usr/local/apache2/conf/extra/httpd-ssl.conf dentro da tag <VirtualHost>:

<Location "/asr-server">
  AuthType Basic
  AuthName "CPqD ASR"
  AuthUserFile "/usr/local/apache2/conf/htpasswd/.htpasswd"
  Require valid-user
</Location>

Nota

A definição das credenciais de acesso é feita pelo arquivo /usr/local/apache2/conf/htpasswd/.htpasswd.

Para adicionar um novo usuário no arquivo de credenciais, utilize o comando:

$ sudo /usr/local/apache2/bin/htpasswd -b /usr/local/apache2/conf/htpasswd/.htpasswd  <usuário> <senha>

Caso o arquivo não exista, ele pode ser criado com os comandos abaixo:

$ sudo mkdir -p /usr/local/apache2/conf/htpasswd
$ sudo touch /usr/local/apache2/conf/htpasswd/.htpasswd

Autenticação sem SSL (opcional)

Caso se deseje incluir autenticação de usuário sem o uso de SSL, no final do arquivo /usr/local/apache2/conf/httpd.conf, inclua o seguinte trecho:

<Location "/asr-server">
  AuthType Basic
  AuthName "CPqD ASR"
  AuthUserFile "/usr/local/apache2/conf/htpasswd/.htpasswd"
  Require valid-user
</Location>

A inclusão de novos usuários se dá por meio do procedimento descrito no passo 6.

Execução

Para iniciar o Apache HTTP Server:

$ sudo /usr/local/apache2/bin/apachectl -k start

Para parar o Apache HTTP Server:

$ sudo /usr/local/apache2/bin/apachectl -k stop

Endereçamento

O Servidor Balanceador de Carga deve ser endereçado da seguinte forma:

  1. Endereço do Servidor de Balanceamento:

    • Para configuração sem criptografia (porta padrão é a 80):

      ws:<IP_Balanceador>/asr-server
      
    • Para configuração com criptografia (porta padrão é a 443):

      wss:<IP_Balanceador>/asr-server
      
  2. Endereço da página Web do Monitor de Balanceamento (porta padrão é a 80), que está mostrado na figura abaixo:

    http://<IP_Balanceador>/asr-balancer
    
    ../_images/balanceador-carga.png

    Exemplo de página do Gerenciador de Balanceamento.