Cyrus IMAP 2.5.0: Um horizonte promissor para o projeto !

Olá ! É com muito prazer que escrevo sobre a restruturação do projeto Cyrus IMAP. O Cyrus é um dos servidores POP/IMAP livres mais bem conceituados e seu ambiente Aggregator, que permite a distribuição de caixas em múltiplos servidores, é um dos grandes diferenciais desta solução.

Mas de fato o projeto encontrava-se parado, a última versão (2.4.17) havia sido lançada em Dezembro de 2012 e desde então apenas versões beta da integração do Caldav com esta versão foram lançadas.

Porém, no dia 19 de Fevereiro, Bron Gondwana (um dos principais desenvolvedores do projeto) anunciou a reformulação do projeto, com a formação da Cyrus Foundation, que captou recursos (financeiros e desenvolvedores) para levar o projeto a uma nova era ! As metas principais são: lançar o Cyrus 2.5.0 em Março de 2015 e a versão 3.0 em Julho do mesmo ano. Foi notória a empolgação da comunidade com este anuncio.

E cumprindo o cronograma, Jeroen van Meeuwen anunciou a liberação da versão 2.5 no dia 03 de Março :

https://docs.cyrus.foundation/imap/release-notes/2.5-current.html

Escreverei muito sobre o Cyrus este ano ! Por enquanto, seguem algumas das melhorias da versão 2.5.0:

  • AUTOCREATE
  • Suporte Caldav e Carddav
  • Suporte estendido de quotas: Número de pastas, mensagens e annotations
  • RFC 5464: METADADOS IMAP
  • Notificações de eventos
  • Melhorias da distribuição de partições: Mais opções para distribuição entre Backends e partições
  • Novo formato para o arquivo mailboxes.db
  • Suporte a bases twoskip: Mais segura, rápida do que o formato skiplist
  • Conta “Catchall” para o protocolo LMTP

Cyrus Aggegator: IMAP com escalabilidade

Em um artigo anterior, eu apresentei o Cyrus Imap e suas principais funcionalidades:

https://respirandolinux.wordpress.com/2013/03/20/sobre-o-cyrus-imap/

Agora apresento o Cyrus Aggregator, recurso nativo para escalabilidade do Cyrus. O ambiente Aggregator (muito vezes chamado também de Murder, devido a um artigo que foi publico com o título “Cyrus Aggregator: The Imap Murder”), permitir distribuir as caixas postais IMAP e POP entre diversos servidores de forma transparente aos usuários, isto é, sendo apresentado como único ambiente.

 A solução possui três classes de servidores: Frontend, Backend e Mupdate. Os clientes IMAP/POP se conectam aos servidores Fontends que por sua vez realizam a consulta no servidor Mupdate obtendo a localização da caixa postal do cliente conectado e o servidor Mupdate informa aos Fontends que estabelecem a comunicação com o Backend trazendo a caixa postal do usuário. Os servidores Backend armazenam as caixas postais e informam ao servidor Mupdate a sua localização, permissões e mudanças, o Mupdate sincroniza com os Frontends a posição das caixa postais e controla para que não haja conflitos.

Nesta arquitetura, os servidores Frontend recebem a relação de caixas postais do ambiente do servidor Mupdate, esta classe de servidor não possui dados, portanto é redundante em todos os aspectos. Se a relação de caixas postais corromper em algum servidor Frontend, basta remover essa base e sincronizar com o Mupdate novamente. É possível adicionar novos servidores Frontend e Backend a qualquer momento, sem impacto no ambiente.

 

 

Resolvendo inconsistências entre servidores Backend e Mupdate Master (Murder)

É possível que a relação de caixas postais do servidor Mupdate (Murder) perca a consistência com os servidores Backend do ambiente, como por exemplo uma caixa postal não estar mais listada no Backend e o Mupdate ainda a mantenha em sua lista. Isso pode ocorrer por falhas de comunicação (rede) entre os servidores ou erros de I/O no Mupdate. Como o servidor Mupdate é autoritativo no ambiente do Cyrus Aggregator, isto é, sua relação é considerada mandatória, não é possivel forçar novamente a criação de uma caixa no Backend que erroneamente esteja sendo listada no Mupdate.

No caso de ocorrer muitas inconsistências, o procedimento recomendado é:

  1. Parar o serviço do Cyrus no servidor Mupdate
  2. Parar o serviço do Cyrus no Backend
  3. Remover a relação de caixas posais (mailboxes.db) no servidor Mupdate
  4. Executar o comando ctl_mboxlist -m -a -w no servidor Backend como usuário Cyrus e com o serviço parado, o -w irá simular a operação, caso esteja de acordo, basta executar novamente sem esta opção.

Porém, não é viável parar o serviço caso ocorram pequenas inconsistências, para isso o utilitário cyr_dbtool do Cyrus, pode ser utilizado, ele consegue manipular o arquivo mailboxes.db, que geralmente fica no formato skiplist, sem a necessidade parar o serviço. Vejamos sua utilização:

/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist show

Informamos o caminho do arquivo (não é permitido utilizar caminhos relativos), seu formato, e por último, a operação a ser executada. Neste caso irá listar todos os registros presentes no arquivo.

Exemplo com o resultado do comando executado em um servidor Mupdate:

user.fabio            1 nome_do_backend!default fabio    lrswipkxtecda
user.fabio.Drafts    1 nome_do_backend!default fabio    lrswipkxtecda    
user.fabio.Sent     1 nome_do_backend!default fabio    lrswipkxtecda        
user.fabio.Trash    1 nome_do_backend!default fabio    lrswipkxtecda

Para remover um registro, utilizamos a operação delete:

/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio
/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio.Drafts
/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio.Sent
/usr/lib/cyrus/bin/cyr_dbtool /caminho/mailboxes.db skiplist delete user.fabio.Trash

Desta forma, os registros serão removidos imediatamente da base, sendo possível criar as caixas novamente no servidor Backend. O comando não permite o uso de caracteres coringas.

Cyrus Imap: Eliminar mensagens “fetching user deny” no código

Olá ! Anteriormente, eu havia publicado uma dica para remover as mensagens “fetching user_deny” geradas pelo cyrus dos logs criando um filtro no Rsyslog (https://respirandolinux.wordpress.com/2013/01/16/cyrus-imap-muitas-mensagens-fetching-user_deny-no-log/), caso esteja compilando o Cyrus, segue o link com o patch para eliminar essas mensagens direto no código:

github.com/fsschmidt/cyrusimap/blob/master/Patches/user_deny_silence.patch

Obs.: Testado com a última versão até o momento, 2.4.17.

Scripts para o Cyrus Imap: Criar caixas postais e definir quota

Em um post anterior, compartilhei dois scripts, para definir permissão para o usuário admin e remover caixas postais no Cyrus Imap, agora compartilho com vocês os scripts para criar caixas postais e definir quota, também criei um script maior que além de criar a caixa postal já define a permissão e aplica a quota.

Os scripts estão disponibilizados em https://github.com/fsschmidt/cyrusimap conforme abaixo:

Criar caixa postal:

https://github.com/fsschmidt/cyrusimap/blob/master/Scripts/criar_caixas.pl

Definir quota:

https://github.com/fsschmidt/cyrusimap/blob/master/Scripts/setarquota.pl

Criar a caixa postal definindo permissão e quota:

https://github.com/fsschmidt/cyrusimap/blob/master/Scripts/criar_caixas_completo.pl

Sobre o Cyrus IMAP

Compartilho com vocês um pequeno trecho do conteúdo de treinamento baśico de Cyrus Imap, que irei oferecer gratuitamente:

O Cyrus IMAP (http://www.cyrusimap.org) é um servidor POP/IMAP de alta performance e altamente escalável, desenvolvido pela Carnegie Mellon University (CMU), ele possibilita acessos simultâneos (leitura/escrita) a uma mesma caixa postal e quotas e regras de acesso (ACL) a qualquer caixa da hierarquia.

Nos repositórios estáveis das distribuições (Red Hat, Suse, Debian,etc…) até o momento a versão disponibilizada do Cyrus Imap é bastante antiga (2.2.13), que não é mais atualizada, recebendo somente atualizaçõs de segurança. Portanto, recomenda-se a utilização da versão atual, 2.4 , que possibilita o uso de replicação nativa e diversas melhorias para o ambiente Aggregator, além diversas melhorias no código para estabilidade, performance e segurança.

O Cyrus Imap opera somente com seu formato de armazenamento, não sendo possível utilizar os formatos Maildir, Mailbox ou qualquer outra configuração. Por padrão, o Cyrus Imap armazena as mensagens e meta-arquivos na mesma estrutura de diretório, o armazenamento de mensagens é constituído por diversos arquivos pequenos que não são acessados tão frequentemente, uma mensagem é acionada somente quando o usuário abre a mesma, os meta-arquivos são separados em arquivos por caixa postal (pasta): header, index, cache, expunge e squat, sendo os três primeiros para indexação e recuperação dos cabeçalhos das mensagens, o expunge para controle de remoção atrasada se essa opção estiver habilitada e o arquivo squat contém uma indexação específica para pesquisa de mensagens, com ganho de 20 a 30% em relação a indexação padrão para operações que envolvam pesquisa, sendo o maior dos meta-arquivos, se a mensagem não estiver referenciada neste arquivo será recuperada através da indexação normal, porém com desempenho inferior.

Sabendo que os meta-arquivos são acessados com mais frequência e ocupam um espaço relativamente pequeno, cerca de 10% para toda a estrutura de caixas postais do usuário (esse resultado foi obtido a partir de estudos com implementações reais até 1000 usuários), é uma boa estratégia configurar o Cyrus Imap para separar esses arquivos em meta-partições que utilizam discos mais rápidos para obter um melhor desempenho das operações de I/O no servidor IMAP.

A partir da versão 2.3 essa configuração é possível utilizando os parâmetros metadata no arquivo de parametrização do Cyrus Imap. Como conceito, cada partição pode ter somente uma meta-partição e a definição de quais arquivos serão separados é global, ou seja, é definido quais meta-arquivos ficarão separados em meta-partição e essa configuração é compartilhada para todas as partições.