domingo, 16 de abril de 2017

Servidor? Que servidor?

Um colega da faculdade me perguntou se eu tinha algum material sobre configuração de servidores. Eu retruquei perguntando sobre de qual tipo de servidor ele queria informações. A resposta singela foi “Servidor, uai… Linux… Windows… Coisa desse tipo”. Foi então que me dei conta de que os conceitos de servidor não costumam ser apresentados de forma objetiva. Então vamos lá:

Servidor? Que servidor?

Numa definição simples, servidor é um computador rodando um ou mais softwares que disponibiliza(m) recurso(s) ou serviço(s) através de uma rede. Tendo isso em mente, pode-se perguntar: Qual serviço? Com qual protocolo? Com qual software? Com qual sistema operacional? Em que hardware? Like Jack, vamos por partes:

É possível criar servidores com praticamente qualquer computador, de um antigo micro 8-bit da década de 1970 até um poderoso cluster com múltiplas CPUs e hardware hot-swap, passando por smartphones, single board computers, notebooks, computadores desktop, até plataformas microcontroladas como Arduino e ESP8266. Tudo depende do que se pretende oferecer, a que custo e com quais níveis de requisitos não funcionais (desempenho, confiabilidade, disponibilidade, segurança etc.).

Claro, alguns serviços simplesmente exigem algum nível mínimo de requisito que pode não ser atendido por um hardware mais simples ou antigo como, por exemplo, não ser possível fazer um servidor web com JavaEE rodando num microcomputador da década de 1970.

Em outros casos, há serviços que podem ser feitos por hardware simples e dedicado (NAS, servidores de impressão, roteadores, entre outros).

É interessante observar que, dependendo do caso, nem é necessário que um servidor seja um computador dedicado. No caso de redes ponto a ponto, o computador de qualquer um conectado a rede pode prover serviços como servidor de arquivos ou de impressão.

Mas quando o serviço exige níveis mais qualificados de requisitos não funcionais, o hardware começa a ser pensado como um equipamento ou um conjunto dedicado a esse tipo de tarefa. No ambiente profissional, com QoS e SLA exigentes, o hardware para servidores costuma ter características muito específicas como ser hot swap (poder ter partes substituídas sem precisar desligar o equipamento), ser redundante (ter múltiplos dispositivos iguais, que entram em funcionamento quando há falha no dispositivo em uso), ter sistemas de fornecimento de energia ininterrupta (no-breaks, grupos geradores), ter ambiente e instalações controladas (temperatura, fornecimento de energia, acesso físico, equipamento contra incêndio etc.).

Sistema Operacional

O mercado profissional atual é dominado por Windows Server e Linux, mas assim como no caso de hardware, pode-se montar servidores diversos a partir de praticamente qualquer sistema operacional, como CP/M, ProDOS, MS-DOS, FreeDOS, IBM-OS/2, BSDs, OS-X, Unixes, Android, iOS, entre muitos outros.

Uma vez determinado o sistema operacional, diversos detalhes (configurações de protocolo, aplicativos de gerenciamento, configurações de desempenho) passam a ser características muito específicas e seu domínio determina a qualificação do profissional que o administra. Vale notar que é comum que o software servidor (o aplicativo que disponibiliza determinado serviço ou recurso) seja específico para o sistema operacional, apesar de existirem muitos aplicativos multiplataforma.

Protocolo

Apesar de IP, TCP e UDP serem quase hegemônicos, configurá-los sobre a camada física e sob os serviços e aplicações, requer conhecimento específico e aprofundado.

Os serviços também possuem protocolos próprios, em camadas acima do IP/TCP/UDP, tais como compartilhamento de arquivos (SMB, FTP, FTPS, TFTP, NFS), e-mail (pop3, imap, smtp), web (http, https), terminal remoto (SSH, telnet) etc. A maioria exige configurações que se adequam a necessidades diversas.

Serviço

Existe uma quantidade razoavelmente grande de possíveis serviços a serem oferecidos por servidores: Servidor de arquivos, de impressão, de banco de dados, de web estática, de web dinâmica, de e-mail, de aplicação, de jogos, de mensagem instantânea, de comunicação (gateway, roteador, firewall), de processamento, de controle de versionamento, entre outros.

No ambiente profissional, normalmente usa-se uma CPU ou conjunto de CPUs (cluster) dedicados para cada serviço, com o intuito de que a disponibilidade e o desempenho se tornem maiores.

E, o que aparentemente pode parecer um único serviço, na verdade pode ser composto de diversos serviços interdependentes. Um exemplo é o servidor de web dinâmica, tipicamente composto por servidor web propriamente dito, servidor de aplicações, servidor de banco de dados e servidor de arquivos.

Como escolher

Sendo que existe uma quantidade muito grande de serviços e tecnologias para servidores, é necessário definir os objetivos (qual serviço) e os meios (quais tecnologias – protocolo, aplicação, sistema operacional e hardware), para que se possa saber com o que será necessário lidar.

Para determinar serviços e tecnologias, basta responder as perguntas propostas no início deste artigo. A cada pergunta respondida, surge uma nova pesquisa para determinar quais as tecnologias disponíveis e que melhor se adequam as necessidades.

Em alguns casos, nem há pergunta. Você, com o conhecimento que já possui, o cliente, o chefe ou mesmo a tecnologia já adotada na empresa determina qual o conjunto a ser implantado ou utilizado.

Alguns exemplos (considerando apenas software) para prover web dinâmica com:
  • Windows Server 2016 + ASP.NET + MS-SQL Server;
  • Windows + Apache + JavaEE com JBoss (EJB + Hibernate) + Oracle RDBMS;
  • Linux + Apache + Node.js (JavaScript) + PostgreSQL.

Na prática

Um conjunto servidor para web dinâmica muito comum para a disponibilização de sites é o pacote conhecido como LAMP (Linux + Apache + MySQL + PHP). O Linux como sistema operacional com o protocolo TCP/IP. O aplicativo Apache como servidor web (usando os protocolos HTTP e HTTPS), o MySQL como servidor de banco de dados e o PHP como servidor de aplicações.

É possível instalar tudo numa máquina virtual em um computador de uso pessoal. Ou simplesmente (mas pouco aconselhável) instalar tudo no sistema operacional do próprio computador pessoal.

Dependendo das exigências de desempenho, instala-se o pacote ou mesmo cada software num computador separado, Apache em um, PHP em outro, o MySQL em outro e até a base de dados (o arquivo controlado pelo MySQL) em um  computador próprio atuando como servidor de arquivos.

Conclusão

Enfim, um servidor não é apenas um computador rodando determinado sistema operacional, mas sim, um equipamento provendo algum serviço ou recurso através de rede e, para se estudar “servidores”, primeiro precisa-se saber “servidor de quê”. Uma vez determinados serviços e tecnologias, resta se aprofundar em cada um deles… E ai o assunto se torna longo.

domingo, 19 de março de 2017

Painel de LEDs e chaves para o projeto Sofia.

Um dos objetivos do projeto Sofia (em búlgaro, София) é evitar o uso de tecnologias atuais, especialmente emuladores e cross-compilers. A questão é: como colocar alguma coisa na memória de um computador sem ele ter software que permita editar sua memória?

Uma solução é construir um painel de LEDs e chaves controlado apenas com circuitos integrados discretos (nada de processadores, microcontroladores, PLDs ou FPGAs), que acessem a memória do computador, usando DMA de forma concorrente com o processador.

Vou documentar essa etapa do projeto Sofia no site hackaday.io como um projeto específico, uma vez que ele deve servir aos demais computadores homebrew que pretendo montar.