Archive for março \23\-02:00 2012

Replicação Master-Master no MySQL

Posted on março 23, 2012. Filed under: Linux, MySQL | Tags:, , , |

Introdução

Neste artigo vamos demonstrar como configurar replicação Master-Master entre dois servidores MySQL. Este tipo de replicação normalmente é usado em um sistema de failover/cluster.

Preparando

O primeiro passo é sincronizar os bancos de dados, utilizados na replicação, entre os dois servidores do MySQL. Podemos usar o mysqldump nesta tarefa.

No servidor A:
# mysqldump -u root -p --databases base1 base2 > servidorA-dump.sql

No servidor B:
# mysql -u root -p < servidorA-dump.sql

Vamos assumir os seguintes endereços IPs para os servidores:

Servidor A: 192.168.0.1
Servidor B: 192.168.0.2

Configurando Permissões de Usuário

O processo de replicação do MySQL exige uma conexão ativa entre os dois servidores em ambos os lados. É preciso definir um usuário/senha para essa conexão.

No servidor A:
GRANT ALL PRIVILEGES ON *.* TO replicacao@192.168.0.2 IDENTIFIED BY 'repl123' WITH GRANT OPTION;

No servidor B:
GRANT ALL PRIVILEGES ON *.* TO replicacao@192.168.0.1 IDENTIFIED BY 'repl123' WITH GRANT OPTION;

Perceba que setamos os pervilégios do usuário replicacao para todos os bancos de dados no MySQL. Porém você pode definir somente as bases que serão incluídas na replicação ao invés de incluir todas bases.

Configurando o MySQL

As configurações abaixo devem ser incluídas na seção [mysqld] do my.cnf

Servidor A:

server-id = 1
auto-increment-increment = 2
auto-increment-offset = 1

log-bin
binlog-do-db = base1

master-host = 192.168.0.2
master-user = replicacao
master-password = repl123
master-port = 3306
master-connect-retry = 60

Servidor B:

server-id = 2
auto-increment-increment = 2
auto-increment-offset = 2

log-bin
binlog-do-db = base1

master-host = 192.168.0.1
master-user = replicacao
master-password = repl123
master-port = 3306
master-connect-retry = 60

A definição dos parâmetros auto-increment-increment e auto-increment-offset evitam colisão entre campos auto_increment. Mantenha o mesmo valor no campo auto-increment-increment para os dois servidores. O campo auto-increment-offset mantenha sequencialmente entre os servidores. No caso, 1 e 2.

O campo server-id também deve ser único entre os dois servidores. No caso, 1 e 2.

No exemplo de configuração acima estamos replicando somente o banco chamado base1. Caso precise replicar mais de uma base de dados, você pode inserir quantas linhas do parâmetro binlog-do-db forem necessárias:

binlog-do-db = base1
binlog-do-db = base2
binlog-do-db = base3
...

Caso você não especifique nenhum parâmetro binlog-do-db, todas as base de dados serão replicadas. Você tem também a opção de especificar o parâmetro binlog-ignore-db para ignorar quais base de dados não serão replicadas. É o processo inverso ao do parâmetro binlog-do-db:

binlog-ignore-db = mysql
binlog-ignore-db = information_schema

Iniciando a replicação

Reinicie o MySQL nos dois serviores:
# /etc/init.d/mysql restart

Neste momento a replicação deve ter iniciado. Se por algum motivo não tiver sido iniciado (Verificar erro no arquivo de log do mysql). Entre nos dois servidores e execute o comando:

mysql> start slave

Testando

Entre no MySQL nos dois servidores e execute o comando:
mysql> show slave status\G

Verifique os parâmetros Slave_IO_Running e Slave_SQL_Running. Ambos devem estar com o valor “YES”. Caso não esteja, refaça o processo.

Outro teste importante, é fazer alterações na base de um servidor e verificar se a mudança foi replicada para o outro servidor e vice-cversa.

Conclusão

Configurar uma replicação master-master no mysql é relativamente simples conforme demonstrado neste artigo. Outros ambientes de replicação também não são complicados. Com poucos ajustes na configuração acima você consegue adicionar mais que 2 servidores na replicação de master para master. Espero que tenha ajudado. Obrigado.

Ler Post Completo | Make a Comment ( 13 so far )

Linux, Instalando um novo Kernel através de Livecd

Posted on março 16, 2012. Filed under: Linux, Tips | Tags:, , , , |

Introdução

Existem certas situações que precisamos atualizar o kernel do sistema devido à problemas no boot. No meu caso, após restaurar um sistema de uma máquina antiga para um servidor mais novo, através de uma imagem dd, tive problemas para bootar o sistema no novo servidor devido ao kernel do sistema antigo não identificar o novo hardware.

Para solucionar essa questão, tive que instalar um novo kernel do Linux no servidor novo. Para ajudar utilizei um Livecd do Ubuntu. Segue abaixo o procedimento que usei para instalar o novo kernel.

Procedimento

  • Bootar o Livecd do Ubuntu.
  • Instalação de um novo kernel no livecd.
  • $ sudo apt-get update
    $ sudo apt-get install linux-image

    Somente com o boot do livecd não temos todos os arquivos do kernel disponíveis em /boot. Para isso instalamos um novo kernel dentro do livecd. Após a instalação acima, o importante é verificar que o arquivo vmlinuz-<versao kernel> existe no diretório /boot e os módulos do kernel dentro de /lib/modules/<versao kernel>.

    Pode ser que ocorra um erro nesse processo de instalação do kernel no livecd. Ignore o erro e continue o processo, pois o que interessa são os arquivos vmlinuz e os módulos do kernel. (Mesmo com o erro eles são instalados corretamente).

  • Montando a partição de boot.
  • $ sudo mkdir /mnt/boot
    $ sudo mount /dev/sda1 /mnt/boot

    No caso acima o /dev/sda1 é a partição onde estão os arquivos de kernel do seu servidor e do gerenciador de boot do grub. É nesse diretório que vamos instalar o novo kernel.
    Lembre-se que o acesso às partições variam de acordo como esta instalado o seu Linux.

  • Montando a partição raiz.
  • $ sudo mkdir /mnt/raiz
    $ sudo mount /dev/sda2 /mnt/raiz

    No caso acima o /dev/sda2 é a partição root do seu sistema. Precisamos montar essa partição para copiar os módulos do novo kernel.
    Lembre-se que o acesso às partições variam de acordo como esta instalado o seu Linux.

  • Copiando os arquivos
  • $ sudo cp /boot/vmlinuz-<versao kernel> /mnt/boot/
    $ sudo cp /boot/System.map-<versao kernel> /mnt/boot/
    $ sudo cp -a /lib/modules/<novo versao kernel> /mnt/raiz/lib/modules/

    Copiando a imagem do kernel, o System.map e os módulos, respectivamente, para os diretórios do seu servidor Linux.

  • Criando o initrd
  • Temos que criar um novo initrd para o novo kernel. Vamos aproveitar o initrd do kernel atual do seu sistema Linux para criar o novo. O initrd vai ajudar o novo kernel montar corretmente a partição root do seu Linux.
    Perceba que removemos os módulos do kernel atual que esta no initrd antes de copiar os módulos do kernel novo.

    $ sudo mkdir ~/initrd
    $ cd ~/initrd
    $ sudo gzip -dc /mnt/boot/initrd.img-<versao kernel atual> | cpio -id
    $ sudo rm -rf lib/modules/<versao kernel atual>
    $ sudo cp -a /lib/modules/<novo versao kernel> lib/modules/
    $ find . | cpio --quiet --dereference -o -H newc | gzip -9 > /mnt/boot/initrd-<novo versao kernel>

  • Criando nova entrada no menu do grub
  • Para concluir nosso processo, vamos criar uma nova entrada no menu.lst do grub para que seja possível bootar o novo kernel. Edite o arquivo /mnt/boot/grub/menu.lst e inclua uma nova opção no menu:

    title Novo Kernel
    root (hd0,0)
    kernel /vmlinuz-<novo versao kernel> root=/dev/sda2 ro quiet
    initrd /initrd.img-<novo versao kernel>

  • Bootando o novo kernel
  • Pronto, você já esta pronto para testar o novo kernel e bootar corretamente o seu sistema Linux. Desmonte as partições e reinicie o sistema, dessa vez, boote sem o livecd. No menu do grub escolha a nova opção e boa sorte!

    $ sudo umount /mnt/boot/
    $ sudo umount /mnt/raiz/
    $ sudo shutdown -r now

  • Referências
  • http://askubuntu.com/questions/94156/installing-with-a-different-kernel
    http://www.indiangnu.org/2009/how-to-create-editextract-initrd-in-ubuntudebian-and-redhatfedora-linux/

Ler Post Completo | Make a Comment ( 2 so far )

Oracle Easy Connect: PHP e sqlplus

Posted on março 10, 2012. Filed under: Oracle, PHP, Tips | Tags:, , |

O Oracle permite um método de conexão com o banco de dados chamado EZCONNECT, easy connect naming method, ou de forma mais simplificada, easy connect. Com o easy connect você elimina a necessidade de inserir os parâmetros do banco de dados dentro do arquivo tnsnames.ora para para poder conectar.

Abaixo vamos demonstrar a syntax do easy connect usado junto com o sqlplus e para conexão do oracle dentro do PHP. Vamos assumir os seguintes parâmetros para os exemplos abaixo:

Assumindo os seguintes parâmetros:
Usuário: admin
Senha: senha123
Host: 192.168.0.10
Database: PRODUCAO
Porta: 1521

Easy Connect com sqlPLus:

# sqlplus admin/senha123@192.168.0.10:1521/PRODUCAO

Easy Connect no PHP:

$conn = oci_connect(‘admin’, ‘senha123’, ‘192.168.0.10:1521/PRODUCAO’);

Ler Post Completo | Make a Comment ( None so far )

Gerenciando sessão no PHP com Zend_Session

Posted on março 3, 2012. Filed under: PHP, Tips, Zend Framework | Tags:, , |

Introdução

Trabalhar com sessões no PHP, à primeira vista, normalmente é percebido como algo assustador, porém instigante e necessário. A utilização de sessões permite persistir dados dos usuários através de diferentes requisições. Todo o mecanismo para utilzação de sessões no PHP é de modo estruturado. O Zend Framework nos proporciona trabalhar com sessões no modo de programação orientado a objetos, abstraído da camada estruturada do php, principalmente através das classes Zend_Session e Zend_Session_Namespace.

O modo como o Zend Framework trabalha com sessões é bastante intuitivo, deixa o código mais organizado, fácil de utilizar, fácil de manter e pode ser usado fora da estrutura MVC. Abaixo, vamos à alguns exemplos práticos.

Criando dados na sessão

A criação de sessões é bem simples, ainda mais utilizando POO. Segue abaixo código que cria dados na sessão usando o Namespace padrão.

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* obtendo o namespace padrao */
$session = new Zend_Session_Namespace();

/* inserir dados na sessao */
if(!isset($session->usuario)) {
        $session->usuario = 'Douglas';
        $session->email = 'douglas.pasqua@gmail.com';
        $session->apelido = 'Doug';
        $session->telefone = '(11) 9999-9999';
}

Acessando dados na sessão

Para acessar os dados da sessão criado no script anterior, não há segredos. Por enquanto, estamos trabalhando somente com o Namespace padrão.
Para que os dados sejam printados na tela corretamente, é necessário ter passado antes pelo script anterior, para que os dados possam ser criados.

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* obtendo o namespace padrao */
$session = new Zend_Session_Namespace();

/* printando na tela os dados armazenados na sessao */
if(isset($session->usuario)) {
        echo $session->usuario . "<br />";
        echo $session->email . "<br />";
        echo $session->apelido . "<br />";
        echo $session->telefone . "<br />";
}

Ao navegar pelo script:

Caso precise limpar os dados armazenados anteriormente, de maneira simples:

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* obtendo o namespace padrao */
$session = new Zend_Session_Namespace();

/* limpando as informacoes do usuario da sessao padrao */
unset($session->usuario);

Segregando dados na sessão utilizando Namespaces

A utilização de Namespaces na sessão pelo ZF ajuda a evitar colisão de informações, além de deixar todo o processo mais limpo e organizado. Dessa forma, podemos ter um mesmo nome de variável na sessão, com dados diferentes, porém em namespaces diferentes.

Veja no código abaixo, que criamos dois namespaces de sessão, Login e Webservice. Dessa forma podemos manter informações diferentes para o mesmo nome de variável, usuario, sem que uma conflite com a outra.

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* obtendo a sessao referente ao namespace Login */
$session_login = new Zend_Session_Namespace('Login');

/* obtendo a sessoa referente ao namespace Webservice */
$session_webservice = new Zend_Session_Namespace('Webservice');

/* incluindo dados na sessao do namespace Login */
if(!isset($session_login->usuario)) {
        $session_login->usuario = 'admin';
}

/* incluindo dados na sessao do namespace Webservice */
if(!isset($session_webservice->usuario)) {
        $session_webservice->usuario = 'visitante1';
}

Após navegar pelo script anterior, e ao acessar o próximo script, estaremos printando na tela as informações definidas nos Namespaces Login e Webservice.

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* obtendo a sessao referente ao namespace Login */
$session_login = new Zend_Session_Namespace('Login');
/* obtendo a sessoa referente ao namespace Webservice */
$session_webservice = new Zend_Session_Namespace('Webservice');

/* printando na tela os  dados da sessao do namespace Login */
if(isset($session_login->usuario)) {
        echo "Logado como: " . $session_login->usuario . "<br />";
}

/* printando na tela os  dados da sessao do namespace Webservice */
if(isset($session_webservice->usuario)) {
        echo "Usuario Webservice: " . $session_webservice->usuario . "<br />";
}

Limpando os dados da Sessão

Existem diversas formas de limpar os dados da sessão. Como sempre os módulos do ZF são bastante flexíveis. O script abaixo limpa os dados da sessão somente para o Namespace Webservice:

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* inicializando a sessao */
Zend_Session::start();

/* limpando todos os dados da sessao referente ao namespace Webservice */
if(Zend_Session::namespaceIsset("Webservice")) {
        Zend_Session::namespaceUnset("Webservice");
}

Caso queira deletar todas as informações que estão na sessão, incluíndo todos Namespaces:

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* limpando todos os dados da sessao */
Zend_Session::destroy(true);

Fazendo a sessão persistir

Por padrão, ao criarmos uma sessão, ela irá persistir somente até você fechar o navegador. Caso você queira que a sessão perpetue-se além da sessão do navegador, você pode definir um tempo de expiração maior para sua sessão através do método rememberMe. Isso é útil por exemplo, caso deseje lembrar o nome do usuário toda vez que ele voltar no site, ou até mesmo salvar os dados de autenticação para mantê-lo logado sempre que voltar ao site.

No exemplo abaixo, ao passar por esse script, sua sessão será mantida por 1 mês. O método rememberMe recebe o parâmetro de tempo em segundos.

<?php
/* include Zend Session */
require_once ('Zend/Session/Namespace.php');

/* inicializando a sessao */
Zend_Session::start();

/* persistir a sessao por 1 mes */
Zend_Session::rememberMe(60 * 60 * 24 * 7 * 4);

Após usar o rememberMe, queria voltar que a sessão dure somente até fechar o navegador, você pode usar o método forgetMe().

Re-definindo o ID da Sessão

O controle da sessão de um usuário é identificado através de um ID único. Esse ID único é gerado pelo PHP e enviado para o usuário através de um cookie no navegador. Esse cookie é enviado para o servidor em todas requisições sub-sequentes para que possamos identificar o usuário novamente e obter seus dados correspondentes.

O php nos permite gerar esse ID novamente caso desejado. É interessante gerar esse ID novamente no momento que o usuário autentica no site. ajudando a evitar ataques que roubam sua sessão. Para se informar mais sobre segurança de sessão, acessar o link .

Segue abaixo exemplo caso queria re-definir o ID da sessão:

<?php
/* include Zend Session */
require_once ('Zend/Session/Namespace.php');

/* inicializa sessao */
Zend_Session::start();

/* obtem o id da sessao atual */
$id_antes = Zend_Session::getId();

/* re-define o id da sesssao */
Zend_Session::regenerateId(true);

/* printar na tela o antes e depois do re-definir o id da sessao */
echo "id da Sessao antes: " . $id_antes . "<br />";
echo "id da Sessao depois: " . Zend_Session::getId() . "<br />";

Ao Acessar o script anterior:

Conclusão

O Zend Framework fornece um série de APIs consistentes e flexíveis. É o que acontece com o Zend_Session. Biblioteca muito rica. Procurei apresentar o essencial dela neste artigo. Caso queira se aprofundar, acesse o manual através do link abaixo. Espero que tenham gostado e até a próxima.

http://framework.zend.com/manual/en/zend.session.html

Ler Post Completo | Make a Comment ( 3 so far )

Liked it here?
Why not try sites on the blogroll...