Balanceamento de Carga no Protheus

Introdução

No ano passado, ajudei um colega que estava concluindo um mestrado, cuja tese envolvia diretamente a eficiência de mecanismos de balanceamento de carga e suas abordagens. E, uma vez absorvido algum conhecimento a mais a respeito, acho que podemos dar um mergulho no assunto, e aproveitar para conhecer mais de perto o balanceamento de conexões nativo Application Server para conexões do SmartClient.

Balanceamento de Carga

Também conhecido por “Load balancing”, é um mecanismo que distribui requisições de processamento para múltiplos recursos computacionais, como computadores, “Cluster” de computadores, links de rede, unidades de processamento ou unidades de disco. O objetivo é otimizar o uso de recursos, maximizando disponibilidade e resultados, minimizando tempos de resposta, e evitar sobrecarga de uso de recursos. A utilização de múltiplos componentes com balanceamento de carga ao invés de um único componente deve aumentar a escalabilidade e disponibilidade através da redundância. Normalmente este recurso envolve software e/ou hardware específicos.

Entre as técnicas mais comuns, podemos citar o Round-Robin de DNS (onde uma URL de um WebSite retorna um IP diferente para cada consulta ao DNS, direcionando as requisições para outros servidores), algoritmos de distribuição (normalmente round-robin ou escolha randômica) são usados para decidir qual servidor irá processar uma chamada qualquer. Algoritmos mais sofisticados de balanceamento podem usar como fatores determinantes informações como tempo médio de resposta, estado do serviço, tráfego atual, etc.). Existe também um outro recurso, chamado “Proxy reverso” (Reverse Proxy), que além de outras funcionalidades, também pode ser utilizado para distribuição de requisições e balanceamento.

Pontos comuns

Cada mecanismo atua sob princípios diferentes, e visando suprir as necessidades dos ambientes onde estão inseridos, mas de uma forma geral, todos aderem aos mesmos princípios de desempenho, escalabilidade e resiliência. Como eu já disse, dentre os vários mecanismos disponíveis, não existe um “melhor de todos”, existem aqueles que melhor atendem as suas necessidades. Um sistema complexo pode usar vários níveis de balanceamento usando abordagens diferentes, para partes diferentes do sistema.

Balanceamento de carga no Protheus

O Protheus Server (ou Application Server) do AdvPL possui um mecanismo de balanceamento de carga nativo para as conexões recebidas das aplicações Smartclient. Basicamente, você provisiona dois ou mais serviços do Application Server, com as mesmas configurações de ambiente, distribuídos em quaisquer máquinas, e configura um novo serviço, chamado de “Master” ou “Balance”, com as configurações de balanceamento de carga das conexões especificados na seção [servernetwork] do arquivo de configuração do servidor (appserver.ini).

Quando iniciamos uma aplicação AdvPL a partir de um SmartClient, normalmente o programa executado é responsável pela montagem das telas de interface e pela execução do processamento. Por exemplo, a inclusão de um pedido de venda pelo SmartClient, quando você finaliza a operação e confirma a inclusão, a função de inclusão de pedido é executada pelo mesmo processo de interface, mantendo a interface em stand-by até a conclusão do processo e o programa devolver uma mensagem para a interface e permitir você prosseguir com a operação.

Neste modelo, como o processamento é realizado pelo mesmo processo que atende a conexão, toda a “carga” do processo está atrelada a esta conexão, e a aplicação foi projetada sob o conceito de persistência de conexão. Logo, em se tratando das conexões de SmartClient, ao balancear uma conexão, automaticamente estamos balanceando a “carga”.

Requisitos e comportamentos

Ao configurar no “Master” todos os serviços “Slave” de balanceamento, devemos enumerar host/ip e porta de conexão TCP de cada serviço. Este IP e porta deve ser visível na rede usada pelos SmartClients para estabelecer a conexão. Se houver um firewall entre os smartclients e os application servers, os IPs e portas dos “Slave’s” também precisam ser “abertos”, não basta abrir o IP e porta do “Master”.

O serviço de balanceamento não atua como um “Proxy Reverso”, as conexões estabelecidas com ele são indiretamente redirecionadas ao “Slave” escolhido no momento que a conexão foi estabelecida. Se ele atuasse como um proxy reverso, ele se tornaria um gargalo de comunicação, e caso ele fosse derrubado, todas as conexões atualmente em uso de todo o ambiente cairiam junto.

Quando o Balance recebe a conexão de um SmartClient, ele decide na hora qual dos serviços cadastrados para balanceamento é o mais adequado a receber esta conexão, e retorna ao SmartClient uma instrução de reconexão, indicando ao SmartClient qual é o Serviço que ele deve se conectar. Logo, o Smartclient conecta com o “Master”, recebe a informação de qual o serviço adequado para conextar-se, desconecta do “Master”, e conecta-se diretamente com este serviço.

Toda a regra e controle de distribuição é realizado pelo “Master”. Como ele já possui pré-configurados os serviços que podem receber conexões, ele próprio mantém com cada serviço “Slave” uma conexão dedicada de monitoramento, através da qual ele “sabe” quantos processos estão em execução em cada um dos serviços, e se cada serviço está apto a receber novas conexões. Como cada conexão pode exercer uma carga variável durante seu uso, a uma métrica utilizada é direcionar a nova conexão ao serviço que têm o menor número de processos em execução no momento.

Cada serviço do Protheus, após a Build 7.00.090818, possui um processo interno dedicado ao monitoramento de memória de sua instância de serviço. Caso um limite de ocupação de memória da instância seja atingido, este serviço torna-se automaticamente bloqueado para aceitar novas conexões de SmartClient e subir novos Jobs. O Serviço “Master” se mantém atualizado sobre este status, e não direciona novas conexões para este “Slave” enquanto seu status for “bloqueado”. Veja as referências no final do artigo para as documentações da TDN que abordam em maior profundidade estes assuntos.

Não seria melhor usar outra regra ?

Muitas pessoas já me perguntaram isso, e a resposta é “neste modelo de processamento, não têm opção melhor”. Como a carga e consumo de memória e CPU depende da rotina que será chamada, e a rotina está atrelada a conexão, qualquer cenário de distribuição está sujeito a desequilíbrios, afinal as rotinas possuem consumo de memória, CPU e rede variáveis durante a sua execução, e mesmo se fosse possível transferir um processo para outro serviço “a quente”, se este processo também apresenta a mesma variabilidade de consumo de recursos, a transferência da conexão seria freqüente, tornando-se ineficiente e pesada.

Assumindo que cada conexão persistente possui características variáveis de consumo, o mais elegante é dividir pelo número de processos por serviço. Mesmo havendo um eventual desequilíbrio no consumo de recursos, uma vez atingida uma quantidade de memória acima do normal em um serviço, ele automaticamente “bloqueia-se” para não aceitar mais conexões. Quando ao consumo de CPU, quando sabe-se que determinadas rotinas vão demandar muito tempo e consumo de recursos, pode-se montar um ambiente de balanceamento secundário, com outros “Slave’s” dedicados, onde os usuários de rotinas mais pesadas pode alocar outros serviços, e alguns deles podem ser colocados em scheduler para serem executados após o expediente.

Configuração de Balanceamento no AdvPL

Basicamente, você deve criar uma nova seção no appserver.ini para cada “Slave” que você quer relacionar no balanceamento. Recomenda-se criar um identificador cujo nome esteja relacionado de alguma forma com a máquina servidora e o número do serviço utilizado. Vamos dar um exemplo de balanceamento de serviços em apenas uma máquina, subindo o servidor “Master” na porta 6000, e quatro outros serviços “Slave” nas portas seguintes ( 6001 a 6004 )

[servernetwork]
servers=SL_1,SL_2,SL_3,SL_4
[SL_1]
Server=172.16.10.201
Port=6001
Connections=20
[SL_2]
Server=172.16.10.201
Port=6002
Connections=20
[SL_3]
Server=172.16.10.201
Port=6003
Connections=20
[SL_4]
Server=172.16.10.201
Port=6004
Connections=20

A configuração acima deve ser inserida no appserver.ini do serviço eleito como “Master”, que neste exemplo está na mesma máquina que os “Slave’s””, mas na porta 6000. Quando o serviço é iniciado, ele verifica se existe a seção [servernetwork], e verifica quais são os serviços enumerados para balanceamento. O “Master” sobe um processo interno dedicado para monitorar cada um dos “Slave’s”, e saber em tempo real quantos processos estão sendo executados em cada um, e se eles não estão bloqueados para aceitar novas conexões. Caso um processo não consiga encontrar um “Slave”, ele fica tentando estabelecer uma conexão, e enquanto ele não sabe se o “Slave” está no ar ou não, ele não redireciona nenhuma conexão para aquele “Slave”.

Cada serviço que nós chamamos de “Slave”, não precisa de nenhuma chave especial, ele precisa apenas refletir as mesmas configurações de ambiente entre os servidores, e o mesmo ambiente tem que apontar para o mesmo RootPath, para o mesmo License Server, e todos os ambientes devem estar usando a mesma cópia do repositório.

Como os IPs e Portas de cada “Slave” precisam estar visíveis para o SmartClient conseguir conectar, todos os arquivos de configuração dos SmartClients do parque de máquinas deve estar configurado para apontar diretamente para o IP e porta do “Master”. Caso algum Smartclient não esteja configurado desta forma, e estiver apontando para um determinado “Slave”, isto não atrapalha o balanceamento, pois mesmo que a conexão não tenha sido redirecionada pelo “Master”, ele vai decidir o balanceamento baseado no número de processos em execução em cada “Slave”. Porém, ao apontar diretamente para um “Slave”, se ele estiver bloqueado ou indisponível, a conexão não será direcionada para nenhum outro “Slave”.

Limitação de Balanceamento

Para cada “Slave”, devemos especificar um número na chave “connections”. Este número por padrão não é um número “absoluto” de conexões, mas sim um número de “peso” de distribuição. Por exemplo, ao configurarmos o número 20 na chave “connections” de todos os “Slave’s” para balanceamento, o “Master” vai entender que a carga deve ser distribuída igualmente entre todos os “Slave’s”. Quando configuramos um dos “Slave’s” com connections=40 e os outros três com connections=20, haverá um percentual de diferença nesta distribuição.

A fórmula é calculada primeiro somando todos os números de conexão:

40+20+20+20 = 100

Agora, calculamos o percentual de conexões a serem desviadas para cada “Slave” dividindo a quantidade de conexões pelo numero total, e multiplicando por 100:

40/100 * 100 = 40 %
20/100 * 100 = 20 %
20/100 * 100 = 20 %
20/100 * 100 = 20 %

Logo, se neste ambiente forem feitas 10 conexões, 4 vão para o “Slave”1, e 2 para cada um dos outros “Slave’s”.

Porém, como a distribuição é feita igualmente, a primeira vai pro “Slave” 1 , a segunda também, a terceira vai pra um dos demais “Slave’s”, a quarta também, a quinta também. Quando o balanceamento atinge uma posição de equilíbrio, a sexta conexão deve ir para o balance 1, a sétima também, e as três últimas serão distribuídas para os demais “Slave’s”.

Normalmente em um ambiente equilibrado, o número é o mesmo. Você pode determinar um comportamento de exceção e priorizar mais os serviços de uma determinada máquina, caso ela tenha mais memória e CPU por exemplo. Porém, o mais saudável neste caso é criar mais de um serviço “Slave” na mesma máquina, para haver uma melhor utilização de recursos. Mesmo que este número originalmente não seja um fator limitante, você deve preenchê-lo com um valor aceitável do número máximo de conexões que realmente é saudável fazer em apenas um serviço.

Existe uma configuração na seção ServerNetwork, chamada BALANCELIMIT. Uma vez habilitada, ela considera que o somatório de conexões ( no nosso exemplo, 100 ) é um fator limitante. Por default, se o ambiente passar de 100 conexões, o balanceamento vai continuar distribuindo as conexões usando a mesma regra para os “Slave’s”, até que os “Slave’s” que atingirem um pico de memória não aceitarem mais conexões. Quando habilitamos esta configuração, o Balance vai parar de distribuir conexões para todos os “Slave’s”, caso a soma do numero de processos rodando em todos os “Slave’s” mapeados atingir ou superar a soma de conexões estipuladas nas chaves “connections” de cada “Slave” mapeado no balanceamento. Quando isso acontece, o Balance não redireciona mais conexões, retornando erros de indisponibilidade de serviços para o Smartclient que tentou se conectar.

Desequilíbrio de balanceamento

Enquanto todas as pessoas estão entrando no sistema, a distribuição de conexões é sempre uniforme. Porém, quando os usuários começam a sair do sistema, os serviços podem ficar desbalanceados, onde coincidentemente os usuários que saíram estavam conectados em alguns serviços específicos. Em condições normais de uso, este desbalanceamento não interfere no poder de processamento dos usuários que ainda estão conectados — exceto se coincidirem vários processos consumindo em excesso um determinado recurso de uma máquina, pois neste caso os demais usuários conectados em serviços naquela máquina podem ser penalizados pelo consumo destes processos. De qualquer modo, mesmo temporariamente desbalanceada a quantidade de conexões, as novas conexões feitas no ambiente vão ser priorizadas pelo “Master”, para entrar justamente nos “Slave’s” com o menor número de processos.

Configurações adicionais

Por default, um servidor “Master” pode aceitar conexões vindas do SmartClient, caso não haja nenhum outro “Slave” disponível para redirecionar a conexão. Este comportamento nem sempre é desejável em um ambiente, e pode ser desligado usando a configuração “Master” Connection=0 na seção [servernetwork].

E, existe uma configuração de diagnóstico, para colocar o mecanismo de balanceamento do “Master” em modo “Verbose”, onde cada conexão recebida por um SmartClient é registrada no log de console do Application Server (console.log), informando sua origem, e para qual “Slave” ela foi encaminhada. Basta colocar na seção ServerNetwork a chave Verbose=1

Balanceamento com SSL

Quando utilizamos SSL entre os SmartClients e o Application Server, cada serviço do Protheus, inclusive o “Master”, deve ser configurados com uma conexão SSL, em uma porta distinta. No momento de configurar cada seção de “Slave” no appserver.ini do serviço “Master”, devemos especificar a porta TCP original de cada serviço, e a porta SSL usando a configuração “SecurePort=nnnn”, onde nnnn é o número da porta reservada para conexão segura (SSL) com aquele “Slave”.

Internet e Intranet

Quando disponibilizamos um balanceamento de carga para SmartClients em um ambiente de Intranet, e queremos expandí-lo para a internet ou outra rede externa, a utilização do balanceamento de carga nativo do Application Server exige que os IPs e portas usadas pelos serviços estejam públicos, e também seja visíveis pelo mecanismo de balanceamento (Serviço “Master”), e criar dois serviços de balanceamento. Um IP e porta do “Master” de “Intranet” para serem usados pelos SmartClients dentro da sua rede interna, e um IP e Porta do “Master” para configurar os Smartclients vindos “de fora”.

Internamente, você pode fazer cada balance apontar para um grupo distinto de servidores dedicados ao acesso interno ou externo, ou colocar 2 IPs nas máquinas onde estão todos os seus serviços “Slave”, e pelo balanceamento apontar para todos os serviços disponíves na sua rede, lembrando que o “Master” de acesso interno precisa enxergar os IPs locais, e o “Master” para acesso externo tem que ser configurado com os IPs externos, e precisam acessar cada um dos serviços por estes IPs.

Posso usar “localhost” ?

Não, não pode. Se o “Master” retorna o IP e porta configurados para um “Slave”, na seção correspondente ao “Slave” no appserver.ini do “Master”, no ini do smartclient você apontou um IP e porta do “Master”, mas ao estabelecer a conexão, o “Master” verificou que o “localhost:6001” é a melhor opção, e vai devolver isso pro SmartClient … Logo, o smartclient vai tentar conectar com um serviço Protheus na própria máquina onde ele está instalado. Você pode usar uma máquina grande e colocar muitos serviços de Protheus nela, e fazer um balanceamento “local”, MAS os IPs e Portas usados na configuração devem ser visíveis aos SmartClients, ok ? Se você usar localhost, seu balanceamento somente vai funcionar para os SmartClients que você iniciar de dentro da própria máquina onde estão os serviços do Protheus.

Posso usar outro mecanismo de balanceamento ?

Sim, pode. Você pode usar um NLB, um Proxy reverso, qualquer outro mecanismo que não interfira no conteúdo dos pacotes trafegados e que mantenha a persistência da conexão com o “Slave” escolhido, sendo assim totalmente transparente para as aplicações envolvidas. Normalmente a única desvantagem deste mecanismo é saber se o “Slave” escolhido está realmente disponível para executar o programa. Quando um “Slave” está bloqueado, a porta TCP de conexão permanece no ar e aceita novas conexões, mas responde a elas com uma mensagem de erro e desconectam. Com este balanceamento, caso seja usada uma métrica qualquer, onde naquele momento este serviço esteja atendendo aquela métrica, uma nova conexão vai ser direcionada para ele, mas ele vai atender e retornar erro. Sem persistir a conexão, e a métrica sendo favorável para este “Slave”, você corre o risco de ninguém mais conseguir entrar no sistema, pois todas as conexões serão direcionadas para um “Slave” que está no ar, mas não está preparado para atender as conexões.

O mundo ideal

Um modelo muito interessante de distribuição de processos seria um MVC com o processamento realizado por um pool de processos dedicados, separados do processo de interface. Deste modo, o processo de interface teria um consumo de CPU e memória relativamente mais baixos, em razão apenas da quantidade de componentes de interface, e as requisições efetivas de processamento e iteração com os dados fossem distribuídos em um pool de serviços distribuídos (SOA – Service Oriented Architecture). Se as implementações de processamento mantivessem uma constante média de consumo de recursos por requisição, o mecanismo de balanceamento das requisições de processamento poderia utilizar métricas mais eficientes, direcionando um processo que consome mais CPU para um serviço onde a CPU não esteja “no gargalo”, e sabendo que um processo vai consumir mais memória que os demais, o mecanismo poderia verificar antes de distribuir quais os serviços disponíveis estão com a melhor ocupação, ou que agüentariam aceitar a requisição sem comprometer os processos em execução.

Isto atenderia tanto o cenário de desempenho quando o de resiliência. Com mais de uma máquina física configurada para atender mais de um tipo de requisição, caso um serviço ou uma máquina inteira apresentasse um problema ou indisponibilidade, até mesmo uma manutenção programada, cada máquina teria o seu próprio “orquestrador” de eventos, que ao perceber que uma máquina saiu fora do circuito, poderia direcionar para outro serviço em outra máquina. A sua alta disponibilidade teria um grau de tolerância de acordo com quantos porcento de máquina você tem de “sobra”.

Ao invés de configurar um cluster ativo-passivo, você determina qual é o mínimo de máquinas que precisam estar no ar para dar conta do recado, e coloca uma ou mais máquinas adicionais. Se o seu dia a dia ocuparia duas máquinas inteiras, com serviços espalhados nelas, você pode colocar uma terceira máquina. Logo, você vai ter uma máquina “de sobra”, mas utilizaria as três juntas para não bater 100% do seu uso de recursos. No pior cenário, se uma máquina inteira sair do ar por uma pane física ou uma janela de manutenção de hardware, o software redirecionaria toda a carga para os dois hardwares disponíveis, que em tese deveriam dar conta do recado enquanto essa terceira máquina não “volta”.

Se você coloca o dobro de poder computacional do que você realmente precisa, você pode “perder” momentaneamente até duas máquinas inteiras, que as duas restantes vão bater “na tampa” mas vão segurar o sistema no ar. Se neste cenário a terceira máquina ir pro vinagre, você tem ainda têm duas saídas de emergência: Priorizar os serviços importantes e tirar tudo que é supérfluo do ar naquele momento, limitando a quantidade de conexões e processos, pra a primeira máquina não sobrecarregar — é melhor alguns trabalhando do que tudo parado — e dependendo da granularidade dos serviços, você pode pegar algum equipamento de “emergência” e colocar alguns “Slave’s” neles para operação de “contingência”, distribuindo os serviços essenciais que a maquina 1 não iria dar conta.

Uma outra vertente no balanceamento de carga seria a utilização dos “Slave’s” encadeados, onde os processos seriam distribuídos somente para um slave, até que um “threshold” (limite) seja atingido, então os novos processos passam a alocar o segundo slave, e assim por diante. Este cenário é muito atrativo quando pensamos em escalabilidade para ambientes “Cloud”, onde seria possível por exemplo determinar um número inicial ou mínimo de máquinas virtuais, e criar uma regra para, quando o último slave começar a receber conexões, uma nova VM é disponibilizada no ambiente, e automaticamente inserida no balanceamento. Estas máquinas virtuais adicionais, assim que todas as conexões forem encerradas, poderia ‘fechar-se’ e ser descartada.

Em um ambiente de processamento de múltiplos hardwares, isto também seria útil para fazer uma janela de manutenção de um Hardware. Por exemplo, alterando a priorização dos slaves, deixamos por último na fila todos os slaves de um determinado equipamento, e bloqueamos as conexões para estes slaves. Conforme os usuários fossem desconectando da interface, no final do dia a máquina não estaria com nenhuma conexão, podendo ser tirada inteira do ar para manutenção, se que nenhum usuário desse falta disso.

Conclusão

A busca por eficiência de processos deve ser sempre uma constante em qualquer sistema com previsão de crescimento. E já existem muitos recursos voltados para isso. Entender como a aplicação funciona é um passo a mais para abrir caminhos para mudanças, com mais certeza de sucesso nas mudanças planejadas. Espero que este post tenha dado alguma luz “a mais” neste mecanismo, e que vocês tenham TERABYTES de sucesso na utilização deles 😀

Até o próximo post, pessoal 😉

Documentação TDN

Balanceamento de carga entre serviços

Seção [ServerNetwork]

Processo de monitoramento e controle de memória

Configuração BALANCELIMIT

Referências

Load balancing (computing). (2015, October 16). In Wikipedia, The Free Encyclopedia. Retrieved 00:49, October 31, 2015, from https://en.wikipedia.org/w/index.php?title=Load_balancing_(computing)&oldid=686092130

Reverse proxy. (2015, October 23). In Wikipedia, The Free Encyclopedia. Retrieved 13:47, October 31, 2015, from https://en.wikipedia.org/w/index.php?title=Reverse_proxy&oldid=687157637

49 respostas em “Balanceamento de Carga no Protheus

  1. Se o master está configurado para redirecionar as conexões para os slaves, o que acontece com novas tentativas de conexão no caso de o master cair ?

    É possível ter uma redundância do master, de forma nativa, com appserver ?

    Curtido por 1 pessoa

  2. Eu já devo ter comentado algum assim em outro post seu, mas se eu configurar os smartclient’s pra usar o o hostname ao invés de IP, e configurar o DNS para fornecer um novo IP a cada nova requisição, eu já estaria fazendo o load, correto ?

    Isso sem nem precisar configurar um master, bastando manter as configurações dos vários appservers sincronizada, eu só perderia na questão do IP:PORTA, que no DNS (até onde sei) eu teria que ter um IP diferente para cada appserver. Caso precisasse subir mais de uma instância de appserver na mesma máquina, teria que configurar para escutar em IPs diferentes (ip alias e tal).

    Curtido por 1 pessoa

    • Ao usar um roteamento de DNS, você já estaria fazendo um balanceamento sem o Master. A desvantagem disso é que, se um slave estiver fora do ar ou impossibilitado de atender novas conexões, o DNS ainda vai direcionar conexões para aquele IP. E o SmartClient vai dar erro de conexão neste caso, tendo o usuário que tentar conectar novamente. Se a máquina fizer cache do DNS na primeira pesquisa, até que seja feito um Refresh no cache local de DNS, as próximas tentativas vão tentar conectar no mesmo host. Um recurso que eu já vi ser usado no lugar do Master é o NLB ( Network Loab Balance), ele permite que você coloque vários serviços em várias portas nas maquinas do Cluster, e o NLB faz a distribuição para você entre as máquinas. Como eu mencionei no artigo, qualquer recurso nativo ou de infra-estrutura “transparente” pode ser usado para balanceamento, a desvantagem é você não obter os benefícios de redundância e decisão de conexão do “Master” 😉

      Curtido por 1 pessoa

    • Sim, claro…

      Quando vamos configurar o balanceamento, para cada serviço que colocamos na configuração SERVERS da seção [servernetwork], podemos usar um IP ou um Nome. Para que o SmartClient consiga conectar neste slave, este IP ou nome precisam ser reconhecidos na rede onde o SmartClient está sendo executado. Para que o Serviço de Load Balance consiga monitorar os serviços configurados como slaves, estes IPs também precisam ser resolvidos dentro da rede onde o serviço do Application Server configurado como “Master/Balance” esteja sendo executado.

      Por exemplo, se o seu SmartClient está no computador da sua casa, e o APPServer está em uma máquina visível na internet, com IP fixo ou com um registro de DNS para um host, por exemplo minhaempresa.com, e você tem serviços slave do Protheus em 3 maquinas, você pode criar os registros de DNS minhaempresa1.com, minhaempresa2.com e minhaempresa3.com, configura estes hosts nas secões do APPServer.ini. Porém, ao fazer isso, a máquina onde está sendo executado o Balance precisa ser capaz de resolver este nome de host, preferencialmente via um IP interno. Existem recursos na própria rede onde você pode trocar a resolução do DNS dentro da sia intranet, para que o host “empresa1.com” aponte para o IP interno da máquina onde está o slave. Um deles é você editar manualmente o arquivo \windows\system32\drivers\etc\hosts, e acrescentar uma entrada manual do host apontando ao IP interno, e fazer isso na máquina onde está o Serviço Protheus de Balanceamento. Desta forma, quando você pingar o host de dentro desta maquina, você vai acessar o endereço interno, e quando você pingar o host de fora (internet), você vai pingar pelo endereço externo (público). Vale lembrar que a máquina onde está o save deve ter um IP público na internet. 😀

      Curtir

  3. Boa Tarde,

    Estou com uma dúvida em relação ao Balance com SSL.

    Ao configurar uma porta TCP e uma Porta Segura (SecurePort) na seção Slave do AppServer do Master, consigo “forçar” que o Master se conecte com os Slaves através de SSL, ou o AppServer Master sempre irá se comunicar via TCP (Porta “Aberta”) entre os AppServer dos Slaves?

    Obrigado.

    Curtido por 1 pessoa

    • Olá Cristian,

      Quando você habilita a porta SSL para conexáo com o smartclient, a porta TCP continua habilitada para conexao de monitoramento, RPC nativo do Advpl, entre outros, inclusive para conexao do Smartclient.

      POREM, quando você conecta com o Smartclient na porta TCP, e o APPServer verifica que ele está configurado com conexão segura SSL, o APPServer informa internamente ao SmartClient que ele deve refazer a conexão no mesmo IP, mas na porta SSL configurada.

      Abraços

      Curtir

  4. Bom dia, estou tentando efetuar uma configuração com IP interno e Externo, no entanto ao tentar efetuar comunicação pelo IP externo, ocorre erros.
    Criei dois máster um Interno e outro Externo:

    No Interno, estou usando o SERVER=ip interno
    No Externos estou usando o SERVER=ip externo

    As portas estão publicadas, se tento acessar cada porta individualmente, eu consigo, se tento pela porta do Master, a conexão chega no servidor, mas não obtenho o retorno, ocorrendo erro de comunicação no Smartclient.

    Poderia me auxiliar nesta parte??

    Atenciosamente

    Curtido por 1 pessoa

    • Fala Junior, beleza ?

      Rapaz, esse assunto está um pouco fora da minha área de expertise … recomendo você abrir um chamado de suporte na Totvs, ou verificar nos fóruns de AdvPL se outros analistas passaram por situações similares, ok ?

      Abraços e sucesso

      Curtir

    • Existem algumas formas de “burlar” isso, mas não sei exatamente como é feita essa configuração. Mas sei que tem um aplicativo chamado “Broker”, da TOTVS, que faz a função de Proxy Reverso, conseguindo fazer o balanceamento de carga entre diversos serviços, mesmo que apenas um IP e porta estejam abertos para tal no Firewall.

      Abraços

      Curtir

  5. Boa noite, Júlio

    Gostaria de saber como posso efetuar um balanceamento de carga para os portais do produto protheus, Recrutamento e seleção, Portal RH…etc estávamos utilizando o broker no entanto não está funcionando, foda hora o serviço do portal cai, ou mesmo não consegue distribuir a carga. Só para esses portais, o uso continua de inscrição no processo de divulgação de vaga é de 500 pessoas cadastrando seus currículos.

    Poderia dar uma luz de como poderíamos seguir e aperfeiçoar essa configuração.

    Obrigado

    Curtir

    • Olá Rogério, como você têm uma necessidade de balanceamento HTTP, do tipo Proxy Reverso, o Broker deveria dar conta do recado. Verifique com o suporte da TOTVS o que pode ser feito, através de abertura de chamado e procedimentos de atendimento. Dê também uma procurada nos fóruns de AdvPL — tem alguns links na entrada do Blog, menu lateral, pode ser que outros colegas já tenham passado por algo assim e possam lhe dar alguma informação adicional. 😉

      Curtir

  6. Olá Julio, tudo bem?

    Não sei se tem outro tópico que fale a respeito, caso tenha, peço desculpa por usar este espaço.

    Mas vamos lá, com a possibilidade de utilizar o NLB para balanceamento de carga, é possível criar ou utilizar algum serviço visualizar e/ou monitorar quais usuários estão conectados em qual slave, igual ao Monitor do Protheus?

    Obrigado.

    Curtido por 1 pessoa

    • Sim, claro. Você configura um Master para balanceamento, e aponta o Protheus monitor para ele. Você apenas nao vai usar esse master para balanceamento, você aponta os seus Smartclients para o seu IP de balanceamento 😉

      Abraços e boa sorte

      Curtir

  7. Julio, alguma configuração diferente no caso de balanceamento com 2 servidores separados fisicamente em máquinas separadas… fiz um cross entre os servidores para questão do Protheus_Data, a principio tive problemas com semaforo, mas após parar tudo e iniciar novamente com a limpeza do semáforo, deu certo, pergunto: Tem alguma alternativa ao compartilhamento?? sem rootpath=\\

    Curtido por 1 pessoa

    • Oi Celso,

      Então, o RootPath do ambiente em máquinas Windows precisa ser compartilhado pelo FileSystem do windows, o mapeamento de unidade de rede não funciona quando você roda o Protheus Server como serviço, pois é um recurso exclusivo do (Windos) Explorer …No linux você usa NFS, não tem como “fugir” disso por enquanto 😉

      Abraços

      Curtir

    • Olá Felipe, bom dia,

      Depende da razão da rejeição da conexão. O serviço de balanceamento distribui as conexões para os serviços configurados como Slave que estão em execução e estão com o aceite de conexão habilitado. Caso um serviço ultrapasse o limite de uso de memória, ele pode deixar de aceitar conexões. Casos assim normalmente envolvem a abertura de um chamado na Totvs, fornecendo no chamado os detalhes da ocorrência, topologia de infraestrutura e os arquivos de configuração e logs dos Application Server envolvidos 😀

      Abraços

      Curtir

  8. Boa noite Júlio. Preciso fazer balanceamento entre dois servidores, e compartilhei a pasta protheus12 inteira. No INI do Slave coloquei o SourcePath=\\10.57.6.11\Protheus12OUT\apo\ e RootPath=\\10.57.6.11\Protheus12OUT\protheus_data\.
    Apareceu uma mensagem que conecto ao server porem ha um erro na validação da conexão.
    Pode me ajudar?

    Curtido por 1 pessoa

    • Opa, beleza ? Eu começaria retirando aquele ultimo “\.” do rootpath, testando novamente, e qual a mensagem de validação que aparece ? O compartilhamento de rede deve ter direitos “full” para o usuário utilizado 😀

      Abraços

      Curtir

  9. Julio. Desculpa reacender uma postagem tão antiga. Mas esse ainda é o material mais completo. Estou montando um ambiente balance com dois servers de aplicação. Mas ainda estou apanhando com relação ao ctreeserver. Subi o ctreeserver em somente um dos servidores (ex: Srv01) e estou usando a chave CtreeRootPath em todos. Ja no Srv02 na chave [ctreeserver] na opção CtsServer=Faircom@ip do Srv01. Mas o Srv02 nao acha o ctreeserver, nao ta faltando passar uma porta ou algo do tipo?

    Curtido por 1 pessoa

    • Opa, confirme o nome da chave usada … na seção [ctreeserver] , para informar onde está o c-tree server, deve ser usada a chave CTSERVERNAME=FAIRCOMS@ip … e não há a necessidade de configurar porta … a porta do c-tree server é calculada automaticamente pelo nome do serviço — que por default é FAIRCOMS — é a porta 5597 😀

      Se voce mudou o nome da sua instancia de c-tree server ( no arquivo ctsrvr.cfg , damos o nome do serviço usando a configuração SERVER_NAME , que por default vem com FAIRCOMS )… o ctreeserver usa outra porta — voce consegue confirmar vendo o arquivo ctstatus.fcs depois de subir o serviço … e somente nesse caso, voce teria que usar esse nome diferente na conexão usando a chave CTSERVERNAME do APPServer 😀

      Curtir

      • Julio, Muito obrigado mesmo pela força!

        Tive que abrir a porta 5597 do servidor onde esta o CtreeServer. (SRV01)

        Com isso os SLAVES do SRV02 agora está acessando normalmente.

        Mas o balance (MASTER) que esta no SRV01 não esta direcionando nenhuma conexão pro SRV02.

        Se eu aponto o smartclient direto um Slave do SRV02 ele funciona normalmente, mas se eu aponto pro MASTER só caio nos SLAVES do SRV01 mesmo que eu abra 20 sessões. Subi somente o MASTER no SRV01 e baixei todos os SLAVES dele deixando somente os SLAVES do SVR02 no ar. E da erro de conexão.

        (ERR0002: Nao foi possível estabelecer conexão com TOTVS Application Server……)

        A configuração da sessão [ServerNetwork] esta certinha, tem mais alguma dica que possa explorar?

        [SERVERNETWORK] — > MASTER NO SRV01 (192.168.2.8:1080)
        servers=slave01,slave02
        masterconnection=0

        [slave01]
        server=192.168.2.8 –> SRV01 (DEIXEI BAIXADO)
        port=1085
        connections=10

        [slave02]
        server=192.168.2.12 –> SRV02 (NO AR)
        port=1085
        connections=20

        Muito Obrigado

        Curtido por 1 pessoa

      • Opa, beleza ? Parece que o master não está achando o Slave… evite usar a faixa baixa de portas ( de 500 pra baixo … ), elas podem ser usadas como portas efêmeras por outras aplicações. E verifique se a porta 1085 est;a aberta no firewall na maquina onde está o slave02 😀

        Curtir

      • Julio, Obrigado pelo retorno. Acabei descobrindo o que era no base da tentativa e erro.

        Só funcionou quando eu desabilitei a chave MultiProtocolPortSecure=0 em todos os slaves e master.

        O que achei estranho é que não tenho SSL configurado em nenhum server/serviço.

        Você acha muito problemático deixar MultiProtocolPortSecure=0?

        Novamente agradeço o seu retorno. Muito Obrigado mesmo.

        Att
        Bruno

        Curtido por 1 pessoa

      • Opa, beleza ? Então, a questão de uso ou não de conexão segura/criptografada entre SmartClients e demais serviços pela porta multiprotocolo é para evitar que seja possível extrair dados trafegados pelo protocolo. Em principio, deixar sem conexão segura possibilita a “garimpagem” de dados transferidos entre as aplicações se alguem “snifar” a rede/conexão. Essa configuração vem ligada por padrão, para atender justamente a quesitos de segurança do software. 😀

        Curtir

      • Muito Obrigado Julio! Já havia acesso esse material. Mas agradeço da mesma forma.

        Acabei abrindo um chamado na TOTVS, pois este comportamento da MultiProtocolPortSecure esta estranho. E foi aberta uma issue para o time de desenvolvimento. Por enquanto vou utilizar com MultiProtocolPortSecure=0 no meu ambiente de homologação.

        Ainda estou medindo os ganhos de fazer o balance entre servidores e não só de serviços como é hoje o meu de ambiente de produção.

        Falando em serviços, é recomendando ter um RPO por serviço? Ou um RPO por servidor já atende bem?

        Tipo no meu caso, tenho um RPO em cada SERVER (RPOs idênticos). Os serviços que rodam dentro de cada SERVER apontam todos para o mesmo RPO. Teria algum ganhao em ter um RPO por Serviço?

        Muito Obrigado novamente!
        Bruno Keniti

        Curtido por 1 pessoa

  10. Boa noite, Júlio. Não manjo nada, mas cai aqui fazendo buscas no Google sobre redundância do Protheus. Usamos apenas um servidor virtualizado no Hyperv e necessito fazer esse serviço ficar em alta disponibilidade, instalando em outro servidor Windows em outra localidade. Você faz ou indicaria alguém? Obrigado!

    Curtido por 1 pessoa

    • Rapaiz … tem um departamento da Totvs que faz sizing e suporte a HA .. (High Availability), se não me engano chama-se TISS …. existe redundância por componente, c-Tree, Banco de dados, License Server, Broker (proxy reverso), etc… e vários níveis de redundância — tudo depende do que exatamente você precisa 😀

      Curtir

  11. Julio, Boa Tarde. Estou com duvida sobre o balanceamento com broker no server linux.

    Pelo que entendi do material da TOTVS, basicamente substituo o MASTER do meu balanceamento atual pelo serviço do broker.

    Mas fiquei na duvida em como configurar o broker.
    Fiz a configuração do serviço do broker seguindo esse link.
    https://centraldeatendimento.totvs.com/hc/pt-br/articles/360040589613-MP-FRAME-Como-realizar-uma-configura%C3%A7%C3%A3o-b%C3%A1sica-de-Broker-

    Porém não estou conseguindo subir o serviço do broker no linux.

    Uma de minhas duvidas é onde colocar -d -balance_smart_client_desktop essa chave na chamada pelo LINUX.

    Obrigado!

    Curtido por 1 pessoa

    • Opa, boa tarde,

      A chamada do Application Server configurado para Broker pode ser feita assim ( testei e funcionou ) — colocando os parâmetros na frente da chamada do executável:

      ./appsrvlinux -balance_smart_client_desktop -d

      Abraços

      Curtir

      • Julio, Valeu pela ajuda deu certo!. Uma coisa engraçada é que tive que alterar o nome do ini de appserver.ini para appsrvlinux.ini pro broker ler as configurações do ini.

        Uma outra duvida do broker que estou um pouco preocupado. No modelo de balanceamento MASTER + SLAVES se o MASTER cai/trava, quem já esta conectado num slave não cai, somente novas conexões que não serão aceitas.

        Com o BROKER se o serviço do broker cai, todo mundo cai, tornando o o serviço do TOTVS Broker um único ponto de falha né?

        Este ponto me preocupado com isso!.

        Abraços
        Bruno

        Curtido por 1 pessoa

      • Fala Bruno, beleza ? Então … o Broker atua como um “proxy reverso”, ele recebe a conexão do SmartClient e abre uma conexão dedicada ao(s) slave(s) a serem usados … isso permite ele colocar uma camada de resiliência e recuperação de conexão para o caso de perda momentânea da conexão de rede entre o SmartClient e o Broker… o Broker aguarda por até 90 segundos ( configurável ) para o SmartClient conseguir reconectar no contexto em uso, de forma transparente… E também permite um balanceamento através de um endpoint único ( voce precisa abrir apenas um IP e uma porta para receber as conexões do SmartClient )… Mas, se o serviço do Broker for derrubado ou “cair” ( maquina desligada, crash no Sistema Operacional, Access Violation do serviço )…. todas as conexões de SmartClient que passam pelo Broker serão derrubadas.

        Espero que estas informações lhe sejam úteis 😀

        Abraços

        Curtir

  12. Fala Júlio,
    Bom dia!

    Tudo bem?

    Montamos um Broker com 2 servidores virtuais, onde cada um possui 5 slaves. A pasta protheus_data mantivemos somente em 1 servidor. Para os slaves do 2º servidor utilizarem o protheus_data, apontamos no appserver.ini, no parâmetro rootpath=\\192.168.135.20\e$\totvs\protheus\protheus_data

    Percebemos que os usuários que conectam nos slaves do 2º servidor (que possui a configuração acima) tem uma lentidão grande e relacionada ao acessos aos SXs.

    Já pegou essa situação?
    Tem uma recomendação de configuração diferente?

    Att,

    Alexsander

    Curtido por 1 pessoa

    • Opa, beleza ?! Então, seu LOCALFILES é CTREE, certo ? E eu imagino que esteja sendo utilizado c-Tree Server.
      Bem, não tem almoço grátis … na máqina onde está o c-Tree Server , onde está fisicamente o protheus_data, os Application Servers dessa maquina falam com o c-Tree Server através de TCP LoopBack, e/ou Shared Memory ( instantâneo ), MAS, em qualquer serviço de AppServer na rede, cada AppServer acessa o c-Tree Server pela rede, e a quantidade de I/Os é bem elevada nesses acessos. A melhor coisa a fazer é iniciar os estudos para migrar o ambiente para usar dicionário (SXS ) no Banco de Dados 😀

      Abraços

      Curtir

Deixe um comentário