Failover automático com Keepalived

Alta disponibilidade é um assunto sempre discutido entre as rodas de nerds e pela alta cúpula das corporações. Afinal, garantir que sua aplicação esteja disponível mesmo em caso de uma presente falha, é algo que chama muito a atenção, e claro, isso faz com que o pessoal da área estratégica e negócio das corporações fiquem fascinados e motivados a implementar essas soluções em seu ambiente de tecnologia.

Porém quando esse assunto é discutido, são envolvidas muitas teorias que fazem desse tipo de solução algo extremamente complexo ou mesmo místico, chegando beirar o nebuloso entre alguns profissionais da área.

Antes de iniciarmos a parte prática é importante entendermos que alta disponibilidade é um conceito, não um serviço, então logicamente existem dezenas de ferramentas que oferecem essa solução.

Resumindo, de forma breve, a alta disponibilidade é garantir que minha aplicação ou serviço fique no ar mesmo em caso de falha. E esse serviço ou aplicação tem um IP que é popularmente conhecido como VIP (Virtual IP), esse VIP é um endereço IP flutuante, que fica no servidor ativo, ou seja, o mestre do cluster, isso quando estamos trabalhando com o modelo failover (passivo/ativo), onde você tem um mestre e um escravo. Quando você trabalha com o modelo de balanceamento de carga, o endereço VIP, é o IP flutuante do seu servidor e/ou balanceador de carga, que tem o papel de distribuir as requisições para o pool de servidores que esta atrás dele. Caso você queira saber mais sobre alta disponibilidade, segue o link onde esse assunto foi abordado em seu conceito de forma mais extensa: Link de HA

No post de hoje não só vamos esclarecer como funciona o faliover como vamos implementá-lo na prática. Importante salientar que o keepalived também pode trabalhar em balanceamento de carga em conjunto com ipvsadm, que usa o recurso de IPVS do kernel Linux, que nada mais é que um balanceador de carga sob camada 4 do modelo OSI (Camada de transporte).

A solução open source que vamos adotar neste post como já esclarecido acima é o keepalived, uma solução extremamente eficiente e digna de respeito, apresentando-se uma alternativa a altura do “falecido” projeto heartbeat, antiga solução de failover que foi muito adotada pela comunidade open source no passado.

Obviamente existem outras soluções que atendem esse propósito e que são até mais populares que o próprio keepalived, como o Pacemaker por exemplo, porém aqui no post foquei no objetivo de exemplificar e praticar o assunto de alta disponibilidade passivo/ativo de forma simples. Obviamente uma solução como o pacemaker é excelente, e atende diversos requisitos que provavelmente o keepalived não atenda, enquanto o pacemaker é uma ferramenta completa de alta disponibilidade, focada totalmente em prover tolerância a falha e gerenciamento de cluster.

Já deu né? Agora bora por a mão na massa! Como de praxe, faremos nas duas principais famílias de distribuições Linux do mercado: Debian (8) e CentOS (7).

Primeiramente vamos definir nosso ambiente. Para esse laboratório você precisa de 2 servidores no mínimo, sendo um mestre e um escravo (independente da distro que você escolher).

Então vamos para provavelmente o passo mais importante, instalar o keepalived. O keepalived esta disponível através do repositório da distribuição, com exceção da família Red Hat, onde o mesmo esta disponível via repositório EPEL (Extras Packages Enterprise Linux), caso você use o Red Hat puro, acionar o suporte da Red Hat para habilitar o repositório correto conforme orientação do suporte da mesma.

O failover que faremos aqui será em cima do serviço nginx, apenas porque optei por fazê-lo com esse serviço, por mera conveniência, caso você opte por outro serviço em seu laboratório, não vejo problema algum.

A instalação abaixo se aplica nos dois nós do cluster, ok?

# yum install epel-release -y
# yum install keepalived nginx -y

# apt-get update
# apt-get install keepalived nginx -y

Feita a instalação precisamos ajustar o arquivo de configuração do keepalived para que o serviço tenha declarado qual o endereço IP flutuante (VIP, lembre-se desse cara!) e para saber qual seu papel dentro do cluster, além disso, nele também consta qual o serviço que ele vai monitorar, no nosso laboratório, será o nginx.

No seu servidor mestre, você irá adicionar o arquivo de configuração abaixo. Nesse arquivo consta o nome do seu script de checagem, que pode ser qualquer nome, o script propriamente dito define qual serviço ele ira verificar se esta no ar ou não, o pidof como a maioria já sabe verifica se existem processos daquele serviço pesquisado, caso exista o retorno será sempre 0, caso não encontre, o retorno é diferente de 0 e portanto o cluster promove o escravo, nomeando como mestre e adicionando o IP flutuante nele.

O failover do keepalived trabalha com o protocolo VRRP, um protocolo que trabalha em multicast, onde não é necessário informar quem é mestre e quem é escravo, porque ele vai se basear no estado (estate) que foi definido e no nome que você determinou pra instância VRRP na configuração, aqui no Lab coloquei o nome de VRRP1, porque eu quis, simples.

Outro fator importante, a interface de rede onde será configurado o IP flutuante, esse IP flutuante fica como um IP secundário, então se preocupe que ele não vai remover o IP setado nesta interface de rede. No caso do Red Hat e CentOS em suas versões recentes ele segue padrões parecidos com os BSD’s, adotando esse nome feio pras interfaces de rede, enquanto para o Debian permanece com o padrão antigo (ethX).

Na cláusula virtual_ipaddress é onde é declarado o endereço VIP (Flutuante), o IP a qual será o ponto único de acesso do cliente. E por fim temos a cláusula track_script onde você precisa chamar o vrrp_script que você definiu, onde foi passado os passos que o keepalived ira conferir se o serviço nginx esta no ar.

Por razões de segurança você pode definir critérios de segurança para o protocolo VRRP baseado em autenticação. Nesse modelo adotado estamos seguindo o modelo PASS, que basicamente transita em texto puro a senha, em produção não é recomendável, caso você queira um tipo de autenticação mais eficiente, recomendo a leitura a seguir: http://louwrentius.com/configuring-attacking-and-securing-vrrp-on-linux.html

# vim /etc/keepalived/keepalived.conf
vrrp_script linuxsysadmin {
        script "pidof nginx"
        interval 2
        weight 2
}
 
vrrp_instance VRRP1 {
    state MASTER
    interface enp0s3
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 9999
    }
    virtual_ipaddress {
        10.100.0.135/24
    }
    track_script {
        linuxsysadmin
    }
 
}

# vim /etc/keepalived/keepalived.conf
vrrp_script linuxsysadmin {
        script "pidof nginx"
        interval 2
        weight 2
}
 
vrrp_instance VRRP1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 9999
    }
    virtual_ipaddress {
        10.100.0.135/24
    }
    track_script {
        linuxsysadmin
    }
 
}

No escravo configure como no modelo abaixo, basicamente idêntico ao modelo do mestre, com exceção de que o estado aqui ficado definido como BACKUP, ao invés de MASTER.

# vim /etc/keepalived/keepalived.conf
vrrp_script linuxsysadmin {
        script "pidof nginx"
        interval 2
        weight 2
}
 
vrrp_instance VRRP1 {
    state BACKUP
    interface enp0s3
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 9999
    }
    virtual_ipaddress {
        10.100.0.135/24
    }
    track_script {
        linuxsysadmin
    }
 
}

# vim /etc/keepalived/keepalived.conf
vrrp_script linuxsysadmin {
        script "pidof nginx"
        interval 2
        weight 2
}
 
vrrp_instance VRRP1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 9999
    }
    virtual_ipaddress {
        10.100.0.135/24
    }
    track_script {
        linuxsysadmin
    }
 
}

Antes de testar o failover, não se esqueça de incluir os serviços que serão monitorados para subirem durante o boot do sistema operacional.

# systemctl enable keepalived
# systemctl enable nginx
# systemctl start nginx

Nos servidor mestre inicie o serviço do keepalived. Aguarde alguns instantes e confira se o VIP subiu.

# systemctl start keepalived
# echo MASTER > /var/www/html/index.html
# ip addr show
ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:ae:d6:54 brd ff:ff:ff:ff:ff:ff
    inet 10.100.0.68/8 brd 10.255.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.100.0.135/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:feae:d654/64 scope link 
       valid_lft forever preferred_lft forever

# /etc/init.d/keepalived start
# echo MASTER > /var/www/html/index.html
# ip addr show
ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:ae:d6:54 brd ff:ff:ff:ff:ff:ff
    inet 10.100.0.68/8 brd 10.255.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.100.0.135/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:feae:d654/64 scope link 
       valid_lft forever preferred_lft forever

Com o mestre no ar, podemos iniciar o slave e efetuar os testes para validar a nossa alta disponibilidade.

# systemctl start keepalived
# echo SLAVE > /var/www/html/index.html

# /etc/init.d/keepalived restart
# echo SLAVE > /var/www/html/index.html

Em seguida abra seu navegador e acesse o VIP pelo seu navegador, a janela será semelhante a imagem abaixo. Você ra notar que ele esta apontando pro servidor mestre.

Agora faremos o teste propriamente dito, forçaremos o encerramento do processo do serviço nginx. Feito esse procedimento, o keepalived vai entrar no processo de eleição, onde ele precisa promover o servidor escravo (BACKUP) para mestre.

# pkill nginx

Pelos logs do keepalived também é possível acompanhar essa mudança. No serviço mestre execute o tail em messages e será possível verificar que houve falhe, e que ele passa se declarar como backup (escravo).

# tail -f /var/log/messages
Mar  9 14:59:43 master Keepalived_vrrp[5769]: VRRP_Script(linuxsysadmin) failed
Mar  9 14:59:44 master Keepalived_vrrp[5769]: VRRP_Instance(VRRP1) Received higher prio advert
Mar  9 14:59:44 master Keepalived_vrrp[5769]: VRRP_Instance(VRRP1) Entering BACKUP STATE

No servidor escravo também fica evidência de que o servidor corrente foi eleito (promovido) a mestre, devido a indisponibilidade do mestre primário.

# tail -f /var/log/messages
Mar  9 14:59:44 slave Keepalived_vrrp[5238]: VRRP_Instance(VRRP1) forcing a new MASTER election
Mar  9 14:59:45 slave Keepalived_vrrp[5238]: VRRP_Instance(VRRP1) Transition to MASTER STATE
Mar  9 14:59:46 slave Keepalived_vrrp[5238]: VRRP_Instance(VRRP1) Entering MASTER STATE

Essa eleição é feita, porque no keepalived é possível ter mais de um escravo, por isso o keepalived suporta trabalhar com níveis de prioridade, onde ele pode eleger o servidor escravo com maior prioridade.

Bem, acho que de failover é isso, e não tem muito o que falar sobre o assunto. Quem se interessou sobre o assunto, já escrevi um artigo sobre Alta Disponibilidade (Failover) com Heartbeat, dando como exemplo o Zabbix, caso tenha interesse no assunto, recomendo a leitura: http://www.linuxsysadmin.com.br/index.php/2015/08/05/zabbix-em-alta-disponibilidade-com-heartbeat/

Fico por aqui caros amigos e colegas, forte abraço e sucesso nessa empreitada!

See ya!

Bora entender o que é Piwik! Piwioque?!?

Não, o Piwik não é uma fruta derivada do Kiwi e nem o aplicativo de perguntas e respostas! Brincadeiras a parte, no post de hoje falaremos sobre o Piwik, uma solução de web analytics open source disponível sob a licença GPL versão 3. Mas oras, o que tem de interessante nesse Piwik? Piwik é uma ferramenta madura e eficiente para medir a audiência em sites e blogs. Com o Piwik é possível monitorar desde a navegação de seus visitantes e clientes, qual os dispositivos que eles usaram para acessar seu site ou qual o navegador que eles utilizaram, até mesmo saber de qual região do mundo ou do país esse visitante esta através de geolocalização,, ajudando sua equipe de marketing ter uma visão mais abrangente sobre o perfil do seu público-alvo. Mas ele se limita a isso? Não!

Atualmente ainda muitas pessoas fazem uso do Google Analytics para análise de tráfego em seus web sites, no entanto o Piwik vem gradativamente ganhando seu merecido espaço e tendo se mostrado um concorrente a altura da ferramenta da gigante Google. Atualmente a ferramenta já possui mais de 3 milhões de downloads, isso quer dizer que cada vez mais profissionais vem adotando o Piwik e tendo um ótimo feedback sobre ele, além disso, empresas como a Forbes por exemplo, já a utilizam em seu ambiente, o que fica evidente o quanto a solução pode atender diversos nichos de mercado e empresas de diversos tamanhos.

Chega de ladainha! Vamos agora para a tela preta e por a mão na massa, entender de uma vez por todas como implementá-la em seu ambiente. Aqui neste post procuro explicar como implantar a solução nas duas famílias de distribuições Linux mais populares do mercado no segmento de servidores, ou seja, Debian e CentOS, atendendo tanto a “galera” Debian e a “Galera” Red Hat Enterprise Linux, sem deixar ninguém de fora dessa, afinal, existe um vasto público para as ambas as distribuições. Além disso, eu sei o quanto é sofrer para tirar aquela dúvida sobre uma determinada solução e durante a instalação dela, tem aquele pacote danado que muda de nome para cada distribuição, o que atrapalha e dificulta padronizar a instalação da maioria das soluções em todo o ecossistema Linux. rs

A instalação que faremos é em single-server, ou seja, faremos uma instalação do servidor web, aplicação piwik e a base de dados em um único servidor. Porque o intuito é esclarecer como funciona a instalação. No dia a dia você tem a liberdade de segmentar esse ambiente entre camada de aplicação e dados, até porque as boa prática recomendam esse tipo de implementação em um ambiente de produção.

Let’s go!

Primeiramente precisamos preparar o ambiente, no caso do CentOS por exemplo, precisamos instalar o repositório webtatic, porque ele possui o pacote php 5.5.38, compatível com a versão requerida pelo Piwik. Atualmente o Piwik exige a versão superior ao php 5.5.9 para seu perfeito funcionamento.

# yum install epel-release wget unzip -y
# wget https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
# rpm -ivh webtatic-release.rpm

Enquanto no Debian precisamos fazer o update para que o apt faça a ressincronização dos índices dos pacotes do repositório remoto e minimizar a possibilidade de ter algum erro no momento que o apt procurar pelo pacote no repositório.


No Debian, execute os passos:

# apt-get update
# apt-get install wget unzip -y

Com a preparação do ambiente iniciada, já podemos preparar o backend da nossa infraestrutura, ou seja, vamos instalar e configurar a nossa base de dados, onde será armazenados os dados dos visitantes e toda as funcionalidades necessárias para sustentar a aplicação piwik.

No CentOS faremos a instalação do mariadb, que nada mais é do que um fork do mysql criado pelo próprio fundador do projeto após sua aquisição pela Oracle. Apesar da mudança de nome, o mariadb é 100% compatível com as funcionalidades do mysql.

# yum install mariadb-server -y
# systemctl enable mariadb
# systemctl start mariadb
# mysql
mariadb> CREATE DATABASE piwikdb;
mariadb> GRANT ALL PRIVILEGES ON piwikdb.* To 'piwik'@'localhost' IDENTIFIED BY '4linux';

No Debian é necessário ficar atento após a instalação, porque o debconf vai questionar qual a senha você deseja configurar para o root (administrador da base de dados), sinta-se livre para escolher a senha.

Instalado o mysql com sucesso, precisamos iniciá-lo e incluí-lo na inicialização do sistema operacional em caso de reboot. E obviamente precisamos criar a base de dados e as credenciais de acesso do usuário da aplicação piwik.

# apt-get install mysql-server -y # Forneça a senha de root do mysql
# systemctl enable mysql
# systemctl start mysql
# mysql
mysql> CREATE DATABASE piwikdb;
mysql> GRANT ALL PRIVILEGES ON piwikdb.* To 'piwik'@'localhost' IDENTIFIED BY '4linux';

Com a nossa infraestrutura de backend configurada e pronta para uso, agora precisamos configurar o servidor http que irá sustentar a aplicação web Piwik atuando dentro da camada de apresentação, no caso iremos instalar o mito, a lenda, o clássico… O bom e velho apache. Uma solução de servidor http que ganhou seu reconhecimento e se mantém até os dias atuais no topo da cadeia alimentar dos servidores http mais populares e estáveis do mundo.

Em conjunto precisamos instalar também o pacote php, afinal, é a linguagem nativa da aplicação piwik, e obviamente também precisamos instalar todos as bibliotecas e extensões para que a aplicação piwik funcione corretamente.

# yum install httpd php55w php55w-cli php55w-common php55w-gd php55w-mysql php55w-xml php55w-mbstring -y

# apt-get install apache2 libapache2-mod-php5 php5 php5-curl php5-gd php5-cli php5-mysql php-xml php-mbstring -y

Agora precisamos fazer o download da versão mais recente do piwik através do site oficial da solução. Após a conclusão do download extraia o arquivo dentro do diretório raiz web do servidor web,, conforme o comando abaixo, este mesmo comando e aplica a ambas as distribuições.

# wget https://builds.piwik.org/piwik.zip
# unzip piwik.zip -d /var/www/html/

Agora que a aplicação piwik já esta disponível para o servidor web, precisamos configurar o Virtual Host para o piwik , mas pera lá, o que é Virtual Host? Virtual Host é um recurso padrão dos servidores web que fornece a possibilidade de hospedar mais do que um web site ou aplicação num único servidor, com um endereço IP ou mais. Mas poxa, por que fazer Virtual Host sendo que este servidor não terá nenhum outro site ou aplicação, além do próprio Piwik? Porque é uma boa prática, simples assim.

# vim /etc/httpd/conf.d/piwik.conf
<VirtualHost *:80>
ServerAdmin admin@linuxsysadmin.com.br
DocumentRoot "/var/www/html/piwik"
ServerName piwik.linuxsysadmin.com.br
ErrorLog "/var/log/httpd/piwik.linuxsysadmin.com-error_log"
CustomLog "/var/log/httpd/piwik.linuxsysadmin.com-access_log" common
</VirtualHost>

Note que existe uma diferença sútil em relação aos diretórios do apache nas duas distribuição, mas em suma, o serviço é o mesmo, então faça com confiança, sem medo de ser feliz!

# vim /etc/apache2/sites-available/piwik.conf
<VirtualHost *:80>
ServerAdmin admin@linuxsysadmin.com.br
DocumentRoot "/var/www/html/piwik"
ServerName piwik.linuxsysadmin.com.br
ErrorLog "/var/log/apache2/piwik.linuxsysadmin.com-error_log"
CustomLog "/var/log/apache2/piwik.linuxsysadmin.com-access_log" common
</VirtualHost>

Neste ponto a aplicação já estaria disponível para acessarmos e terminarmos a instalação. Mas existem alguns pontos cruciais, a permissão do diretório piwik, é necessário que o usuário do serviço apache seja proprietário deste diretório, afinal durante a instalação o piwik precisa escrever suas configurações em um arquivo dentro deste diretório, e sem elas, não seria possível prosseguir com a instalação.

# chown -R apache:apache /var/www/html/piwik

No Debian temos dois diferenciais, um que o Virtual Host precisa ser habilitado através do comando a2ensite, caso contrário nosso piwik ainda não estara disponível para uso. Além disso, o arquivo php.ini precisa ser editado, alterando o parâmetro always_populate_raw_post_data, este parâmetro já esta obsoleto no php, por essa razão precisamos passar o valor -1, assim o php mantém este recurso funcionando mas sem as implementações novas feitas nele a partir das novas versões do php.

# chown -R www-data:www-data /var/www/html/piwik
# a2ensite piwik.conf
# vim /etc/php5/apache2/php.ini
always_populate_raw_post_data = -1

E por fim, mas não menos importantes, podemos reiniciar o serviço do apache e obviamente adicionar o serviço na inicialização do sistema operacional.

# systemctl enable httpd
# systemctl restart httpd

# systemctl enable apache2
# systemctl reload apache2

Agora abra seu navegador favorito e acesse o endereço http://piwik.linuxsysadmin.com.br e vamos concluir a instalação via web. Ao acessar você será recebido com boas vindas, clique em “seguinte” para avançar na instalação.

Nessa tela será apresentada todas dependências do piwik, caso todas estejam instaladas corretamente o piwik informa um checkbox verde confirmando que aquela dependência esta ok.

 

Prosseguindo com a instalação será necessário informar as credenciais de acesso ao banco conforme fizemos na etapa de instalação e configuração do mysql/mariadb.

Ao avançar o piwik faz a carga inicial do banco e dados piwikdb, populando a base com os dados e as estruturas iniciais para seu funcionamento inicial.

Em seguida crie as credenciais do usuário administrador da ferramenta para que você possa acessa-la após a conclusão da instalação.

Nesta etapa é obrigatória a configuração do primeiro site que o piwik ira monitorar. Passe todas as informações corretamente, como nome, o endereço, localidade e a informe se é um blog, site ou e-commerce.

Após configurar o seu site o piwik gera o código Javascript que você irá adicionar dentro do cabeçalho html do seu site. Esse código javascript deve ficar dentro das tags head da sua página. Caso você tenha dificuldade, por favor contate sua equipe de desenvolvimento responsável pelo seu web site para te dar o apoio necessário. Caso você não faça esta etapa, após concluir a instalação e se autenticar na ferramenta, o piwik não vai te direcionar para o dashboard principal, já que ele não possui estatísticas de visitantes para exibir.

Abaixo, segue um exemplo de como seria em uma página html simples com a inclusão do código javascript.

		<!-- Piwik -->
		<script type="text/javascript">
  			var _paq = _paq || [];
  			// tracker methods like "setCustomDimension" should be called before "trackPageView"
			_paq.push(['trackPageView']);
			_paq.push(['enableLinkTracking']);
			(function() {
			var u="//piwik.linuxsysadmin.com.br/";
			_paq.push(['setTrackerUrl', u+'piwik.php']);
			_paq.push(['setSiteId', '1']);
			var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
			g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
  			})();
		</script>
		<!-- End Piwik Code -->
 
 
		Página de teste

Editado o cabeçalho html da sua página, avance a instalação e você sera parabenizado pelo piwik por concluí-la.

Você sera direcionado para a página de autenticação do piwik, informe as credenciais e clique no botão entrar.

Parabéns, você acabou de concluir a instalação do Piwik com sucesso. Você provavelmente esta no dashboard principal da ferramenta, agora você pode desfrutar de todos os recursos que a ferramenta oferece. Sua tela de apresentação é extremamente linda e muito simples, com todos os detalhes necessários para tornar a ferramenta atrativa aos profissionais não só técnicos mas principalmente da área de negócios da sua empresa.

Pessoal, fico por aqui, agradeço pela atenção e a paciência em ler todo esse artigo em conjunto com um leve “how-to” focado para quem deseja ter o primeiro contato com a ferramente. Em breve pretendo escrever mais sobre o Piwik, e quem sabe não criamos num outro artigo, algo mais focado em uma arquitetura piwik de alto tráfego para portais web com grande volume de acessos. Enfim, forte abraço a todos e sucesso!

See ya!