Criando um Balanceamento de carga (load balance) no Protheus 10

Load balance ou balanceamento de carga é um serviço feito para “desafogar” o servidor principal e distribuir os usuários em outros servidores.  Funciona assim: um servidor principal que trabalha com mais de 40 conexões acessando relatórios, input de informações etc, faz com que o serviço utilize em média   1.700.00K de memória, (esse valor pode variar dependendo da quantidade de usuários e rotinas que estão acessando). Com o passar do tempo o serviço começa a ficar lento e as vezes até cai.

Uma das formas sugeridas pela Totvs de melhorar a velocidade do serviço Protheus e sanar esses travamentos é criar um balanceamento de carga, assim os usuários serão distribuídos em vários servidores e não em apenas um.

Pergunta interessante. – Mas do que adianta separar vários serviços no mesmo servidor se o consumo de memória é o mesmo? “Reza a lenda” que quando o serviço Protheus passa de 1.900.00K o sistema começa a dar problemas, travando, caindo e comprometendo o desempenho. Sendo assim é melhor criar vários serviços no mesmo servidor e cada um consumindo em média 900.00K do que deixar apenas 1 com 1.900.00K.

Mas chega de papo vamos a prática:

Obs.: Este post irá mostrar como criar um balanceamento de carga no mesmo servidor, com isso só iremos separar o diretório bin. A Totvs recomenda que se tenha separado RPO e Build, mas nesse caso não iremos separar. http://tdn.totvs.com/kbm#30583

Para criar um balanceamento de carga no mesmo servidor segue os passos:

1º Passo: Pare o serviço que deseja ser o balanceador de carga; (no meu caso chama-se bin_val)

2º Passo: Faça uma ou quantas cópias da pasta bin_val (estou utilizando val como exemplo), no meu caso criei 2, ficando assim: bin_val (serviço de balance), bin_val2(slave1) e  bin_val3 (slave2);

3º passo: abra o arquivo bin_val/appserver/appserver.ini e adicione em qualquer lugar as seguintes configurações:

[ServerNetWork]
Servers=SLAVE1,SLAVE2
MasterConnection=0

[SLAVE1]
TYPE=TCPIP
Server=coloque o ip do slave1 (caso seja no mesmo server, coloque o ip do server)
Port=3331
Connections=1

[SLAVE2]
TYPE=TCPIP
Server=coloque o ip do slave2 (caso seja no mesmo server, coloque o ip do server)
Port=3332
Connections=1

Salve e feche o appserver.ini

4º Passo: abra o arquivo bin_val2/appserver/appserver.ini e altere a porta para 3331 e DISPLAYNAME=TOTVS_VAL2

[TCP]
TYPE=TCPIP
Port=3331
[SERVICE]
NAME=P10_VAL2
DISPLAYNAME=TOTVS_VAL2

5º Passo: Abra o arquivo bin_val3/appserver/appserver.ini e altere a porta para 3332 e DISPLAYNAME=TOTVS_VAL3

[TCP]
TYPE=TCPIP
Port=3332

6º Passo: Crie os serviços clicando com o botão auxiliar em cima do ícone totvsappserver.exe e vá na opção criar atalho.

Nesse atalho coloque na linha o comando -console. (Caso já queira instalar o serviço substitua o -console por -install).

Assim o serviço estará startado e funcionando.

Agora é só startar o serviço bin_val, bin_val2, bin_val3 (caso ainda não estejam) abrir o Protheus e conectar normalmente como antes (na porta do balance, nesse contexto é 1235) e pronto. Seu load balance esta funcionando 100%.

Agradecimentos:

À jbpc2001 que me alertou sobre a principal funcionalidade do balance.

À Silvio Coelho pela atenção e disposição em me ajudar a corrigir.

Sobre Gilberto Furtado
Graduado em Analise e Desenvolvimento de sistema, pós-graduado em Desenvolvimento de Sistemas para Web, trabalha como analista de TI no Grupo Açonobre.

10 Responses to Criando um Balanceamento de carga (load balance) no Protheus 10

  1. jbpc2001 says:

    Gilberto, muito boa sua iniciativa.

    Mas da maneira que voce colocou, a principal utilidade do balance nao vai funcionar.

    O correto seria todos os clients conectarem ao balance e nao ter que configurar no remote em qual servidor o usuario deve se conectar.

    como nao sei a porta que o balance esta usando vou supor que seja:

    No Balance:

    [ServerNetWork]
    Servers=SLAVE1,SLAVE2
    MasterConnection=0

    [SLAVE1]
    TYPE=TCPIP
    Server=localhost
    Port=3331
    Connections=50

    [SLAVE2]
    TYPE=TCPIP
    Server=localhost
    Port=3332
    Connections=50
    ;alterei: Connections trata como percentual e ;nao como quantidade embora funcione.

    ;AQUI EU INCLUI, PARA FACILITAR A VISUALIZACAO.
    [TCP]
    TYPE=TCPIP
    Port=3330

    No Remote:

    [server]
    server=10.1.1.50
    port=3330

  2. Silvio Coelho says:

    Olá amigos!!

    Parabéns pela iniciativa, muito bom o material, só precisamos realizar duas correções para ficar ainda melhor:

    1 – No SmartClient devemos apontar para o master, uma vez que ele recebe a informação e repassa para os Slaves.

    2 – A opção “Connections” indica o numero de conexões que o Slave vai receber antes de passar para o próximo Slave e não o percentual de carga, se vocês forem ver no link postado a totvs recomenda usar 1, ou seja, a cada nova conexão o usuário é jogado para um server diferente.

    Exemplo: A empresa XYZ possui 45 usuários, se for realizado o balanceamento de carga com um Master e dois Slaves, estando o “Connections = 50” um dos Slaves não receberá nenhuma conexão, pois o Connections = 50 indica que o sistema receberá 50 conexões antes de passar para o próximo server.

  3. guilherme hermann says:

    Aconselho tambem a criar as dependencias dos serviços na respeciva chave utilizando a ferramenta regedit.exe para não startar os serviços na ordem errada e ficar sem as devidas licenças.

  4. Azevedo says:

    O balanceamento de carga está sendo tratado de forma leiga nesse artigo. A maioria das pessoas acha que essa limitação de 2gb de memória é um problema da Totvs (e não é). O “reza a lenda” parece descrever algo nunca realmente vivido pelo autor. A sessão “CONNECTIONS = 50” não deve ser utilizada com esse valor. Enfim, vários pontos que ficaram sem explicação ou onde não foi dada devida atenção. Seguindo os passos, poderá até funcionar muito precariamente, podendo não resolver o problema, ou pior, multiplicando o problema pelo numero de serviços novos criados.

    • Olá Azevedo,
      Obrigado por comentar meu blog.
      Não sei se você percebeu, mas esse blog descreve bem no topo: Anotações pessoais sobre tecnologias em geral. Ou seja, esse blog foi criado para anotações próprias, pequenas anotações, como um bloco de notas, coisas corriqueiras, que não demandam tempo para revisão ou algo do gênero. Infelizmente sua crítica não é construtiva, ao contrário dos outros colegas que postaram acima, sugerindo melhorias e alterações. Que melhora ainda mais o conteúdo. Bom essa limitação de 2gb de consumo de memória não tirei isso da minha cabeça e sim por experiência própria, que inclusive abri um chamado na Totvs SCU047 onde os analistas recomendam criar o balanceamento de carga para solucionar o problema. A sessão “CONNECTIONS = 50″ esta descrita em comentário e não no meu texto, (que antes estava, mas já foi corrigido a 2 meses). Caso queira adicionar ou contribuir para melhorar o texto, terei a pronta disposição para alterar.
      Abraço.

  5. Azevedo says:

    É sempre bom seguir a documentação oficial:

    Consumo de memória de aplicações de 32 bits:
    http://tdn.totvs.com.br/kbm#29631

    Balanceamento de carga entre serviços (LoadBalance):
    http://tdn.totvs.com.br/kbm#30677

    Grid de processamento AdvPL – Configuração:
    http://tdn.totvs.com.br/kbm#30760

    Uma breve explicação sobre a sessão “CONNECTIONS = X”:
    O balanceamento de carga “percorre” os serviços, redirecionando as conexões de acordo com o numero de acessos de cada um. Somente irá redirecionar para o próximo serviço caso o anterior estiver totalmente ocupado. O interessante é colocar CONNECTIONS = 1 para que todas as conexões sejam uniformemente distribuídas, sem que o sistema espere o primeiro serviço atingir 50 conexões para redirecionar para o próximo. Não precisa se preocupar com relação ao numero total de acessos / numero de serviços, pois quando o ultimo serviço estiver totalmente ocupado, o balanceamento irá retornar para o primeiro serviço (ele atua de forma contínua, não acumula usuários no ultimo serviço).
    Caso você estiver configurando o balanceamento em mais de uma máquina e essas maquinas possuírem capacidades de hardware diferentes, você poderá configurar proporcionalmente, deixando CONNECTIONS = 1 pra uma máquina mais lenta e CONNECTIONS = 2 pra uma máquina melhor, por exemplo.

  6. Michael Silva Lopes says:

    Amigo, estou com uma duvida sobre protheus e acho que voce pode me ajudar.

    Você sabe como faço para acessar a tabela do banco de dados do protheus ? Onde ficam todos os itens cadastrados como se fosse uma tabela do excel.

    No meu sistema atual eu uso o IBexpert e o IBCONSOLE quando tenho que alterar alguma coisa no banco de dados, porem no protheus nao achei como fazer isso.

  7. Wesley Andrade says:

    Módulo Configurador -> Base de Dados -> Dicionario -> Base de dados …

  8. Paulo Maciel says:

    Boa noite amigo, parabéns pela iniciativa de compartilhar suas experiências.

    Estou configurando aqui o balanceamento no mesmo servidor, fiz como vc orientou porém estou com dúvidas com relação aos parâmetros que devem ficar no serviço balance e nos slaves, abaixo segue parte de meu ini e peço que se possível me indique o que deve ficar no server balance e o que deve ficar nos slaves. Agradeço desde já sua atenção.

    Drivers]
    Active=TCP

    [TCP]
    TYPE=TCPIP
    Port=1234

    [General]
    InstallPath=D:\Totvs\Protheus10
    enablenumber=0
    Segmento=3nyUMnd2=bmV
    Serie===AV

    [LICENSESERVER]
    enable=1
    port=5555
    ShowStatus=1
    enablenumber=0

    [LICENSECLIENT]
    server=192.168.15.200
    port=5555

    [http]
    enable=1
    path=D:\Totvs\Protheus10Help
    port=1240

    [MAIL]
    Protocol=POP3

    [ONSTART]
    Jobs=Schedjob,JOB_WS01_0101

    [Schedjob]
    Main=Schedjob
    Environment=MOABE
    nParms=2
    Parm1=01
    Parm2=01

    [UPDATE]
    Enable=1
    PathWindows=D:\Totvs\Protheus10\bin\smartclient

    [servertotvs:9094/ws01]
    ENABLE=1
    PATH=D:\Totvs\Protheus_Data\web\WS01
    ENVIRONMENT=MOABE
    INSTANCENAME=WS01
    RESPONSEJOB=JOB_WS01_0101
    DEFAULTPAGE=wsindex.apw

    [JOB_WS01_0101]
    TYPE=WEBEX
    ENVIRONMENT=MOABE
    INSTANCES=1,1
    SIGAWEB=WS
    INSTANCENAME=WS01
    ONSTART=__WSSTART
    ONCONNECT=__WSCONNECT
    PREPAREIN=01,01

    [ServerNetWork]
    Servers=SLAVE1,SLAVE2
    MasterConnection=0

    [SLAVE1]
    TYPE=TCPIP
    Server=servertotvs
    Port=3331
    Connections=1

    [SLAVE2]
    TYPE=TCPIP
    Server=servertotvs
    Port=3332
    Connections=1

  9. Diego Amaral says:

    Bom dia amigos, tenho uma duvida!

    Nos appserver.ini dos slaves, temos que apagar todos os ambientes ou temos que deixar tipo um espelho do ambiente de produção?

    Ex:

    [PRODUCAO]
    SourcePath=D:\TOTVS\Protheus11\APO
    RootPath=D:\TOTVS\Protheus11\Protheus_Data
    StartPath=\system\
    x2_path=
    RpoDb=Top
    RpoLanguage=portuguese
    RpoVersion=110
    LocalFiles=ads
    Trace=0
    localdbextension=.dbf
    PictFormat=DEFAULT
    DateFormat=DEFAULT
    RegionalLanguage=BRA
    helpserver=help.outsourcing.com.br:/p11
    InactiveTimeout=1800
    consolelog=1

    Este ponto do ini cria o ambiente de produção!

    Eu mudo o nome do mesmo? onde esta produção eu coloco SLAVE? Ai embaixo eu coloco as configurações das portas e name?

Deixe um comentário