主库:192.168.0.11
备选主库:192.168.0.12
从库:192.168.0.13
监控机:192.168.0.10
首先在三台机器上安装mysql(监控机的mysql先不装,以后再说)。
我使用percona server(一个mysql的改进版。据说比mysql性能更好些)。
[root@cluster1 ~]# tar zxvf Percona-Server-5.5.21-rel25.1-234.Linux.i686.tar.gz -C /usr/local/
[root@cluster1 ~]# cd /usr/local/
[root@cluster1 local]# mv Percona-Server-5.5.21-rel25.1-234.Linux.i686 mysql
[root@cluster1 local]# useradd -s /bin/false -M mysql
[root@cluster1 mysql]# cd /usr/local/mysql/
[root@cluster1 mysql]# chown -R mysql.mysql .
[root@cluster1 mysql]# cp support-files/my-medium.cnf /etc/my.cnf
[root@cluster1 mysql]# ./scripts/mysql_install_db --user=mysql
[root@cluster1 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@cluster1 mysql]# chmod +x /etc/init.d/mysqld
[root@cluster1 mysql]# echo "/usr/local/mysql/lib" >> /etc/ld.so.conf
[root@cluster1 mysql]# ldconfig
[root@cluster1 mysql]# /etc/init.d/mysqld start
[root@cluster1 mysql]# chkconfig --add mysqld
[root@cluster1 mysql]# chkconfig --level 235 mysqld on
注意“my.cnf”拷贝过去之后最好指定“basedir”和“datadir”以及二进制日志和“server-id”
以上是三台机器安装mysql,一定记得“server-id”不能相同。
Mysql5.5以后新增了半同步复制功能。在使用replication时,主服务器把要提交的事物至少传给了一个备库。增加了主库和从库之间事物的一致性。MHA配合半同步复制效果更佳。虽然启用半同步复制会降低一些性能。但为保持整个系统的正常运行还是值得的。
开启半同步复制:
主库:
[root@cluster1 mysql]# cp /usr/local/mysql/lib/plugin/*.so /usr/local/mysql/lib/mysql/plugin/
不拷贝的话默认找不到模块文件。
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> set global rpl_semi_sync_master_timeout=1000;
可以show一下验证是否打开了semisync功能。
mysql> show global status like 'rpl%';
为了让mysql在重启时自动加载该功能,在/etc/my.cnf中加入:
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
1000为1000ms的超时时间。
备选主库(从库):
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> set global rpl_semi_sync_master_timeout=1000;
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled=1;
在/etc/my.cnf中加入:
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
从库:
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled=1;
在/etc/my.cnf中加入:
rpl_semi_sync_slave_enabled=1
在备用节点和从节点的/etc/my.cnf中加入选项:
read_only=1
relay_log_purge=0
配置主从关系:
主库上:
mysql> show master status;
记录下 “File”和“Position”即当前主库使用的二进制日志名称和位置。
mysql> grant replication slave to repl@'192.168.0.%' identified by 'repl';
两台从库上:
change master to master_host="192.168.0.11",master_user="repl",master_password="repl",master_log_file="mysql-bin-cluster1.000004",master_log_pos=255;
其中备选主库也给它加一个replication的帐号:
mysql> grant replication slave to repl@'192.168.0.%' identified by 'repl';
在两台从库上 mysql>start slave;mysql>show slave status\G;
查看Slave_IO_Running: Yes
Slave_SQL_Running: Yes
是否都为yes。如果是则主从关系配置完毕。
可在主库上再次验证半同步复制是否正常开启,并监听到客户端。
Mysql>show global status like “rpl%”;
可以看到Rpl_semi_sync_master_clients 是2.说明半同步复制正常。
安装MHA manager和MHA node
在监控机上安装这两个组件
首先修改下主机名
[root@localhost ~]# hostname manager
[root@localhost ~]#vim /etc/sysconfig/network
把相应的HOSTNAME改成manager
[root@cluster1 ~]# cat > /etc/hosts << A
> 127.0.0.1 localhost.localdomain localhost
> 192.168.0.10 manager
> 192.168.0.11 cluster1
> 192.168.0.12 cluster2
> 192.168.0.13 slave
> A
其他三台机器做同样操作,最好加上时间同步 ntpdate ntp.api.bz
安装第三方yum源,下载epel的rpm包,安装即可。epel源的包比较全,MHA依赖的perl包都能直接用yum安装。
监控机:
安装依赖包
[root@manager ~]# yum install perl-DBD-MySQL
[root@manager ~]# yum install perl-Config-Tiny
[root@manager ~]# yum install perl-Log-Dispatch
[root@manager ~]# yum install perl-Parallel-ForkManager
[root@manager ~]# yum install perl-Config-IniFiles
安装mha-node
[root@manager ~]# tar zxvf mha4mysql-node-0.53.tar.gz
[root@manager ~]# cd mha4mysql-node-0.53
[root@manager mha4mysql-node-0.53]# perl Makefile.PL;make;make install
安装mha-manager
[root@manager ~]# tar zxvf mha4mysql-manager-0.53.tar.gz
[root@manager ~]# cd mha4mysql-manager-0.53
[root@manager mha4mysql-manager-0.53]# perl Makefile.PL ;make;make install
其他mysql节点只安装perl-DBD-MySQL和mha-node即可。
配置manager
拷贝样例文件到/usr/local/bin下
[root@manager mha4mysql-manager-0.53]# cp samples/scripts/* /usr/local/bin/
注意其中的master_ip_failover是不能直接使用的,需要进行修改。我不怎么懂perl脚本,幸运的是我google到一个比较好用的脚本,稍作修改就行了。
编辑主配置文件:
[root@manager mha4mysql-manager-0.53]# vim /etc/app1.cnf
[server default]
manager_workdir=/masterha/app1
manager_log=/masterha/app1/manager.log
#remote_workdir=/usr/local/mysql
user=root
password=123456
ssh_user=root
repl_user=repl
repl_password=repl
ping_interval=1
shutdown_script=""
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change_script
report_script=""
[server1]
hostname=192.168.0.11
master_binlog_dir=/usr/local/mysql/data
candidate_master=1
[server2]
hostname=192.168.0.12
master_binlog_dir=/usr/local/mysql/data
candidate_master=1
[server3]
hostname=192.168.0.13
master_binlog_dir=/usr/local/mysql/data
no_master=1
[root@manager ~]# mkdir -p /masterha/app1/
基本上监控机的安装配置算是完成了。
Mysql节点的配置:
主节点
mysql> grant all on *.* to root@192.168.0.10 identified by '123456';
mysql> grant all on *.* to root@cluster1 identified by '123456';
mysql> grant all on *.* to root@192.168.0.11 identified by '123456';
备选主机点(从节点)
mysql> grant all on *.* to root@192.168.0.10 identified by '123456';
mysql> grant all on *.* to root@cluster2 identified by '123456';
mysql> grant all on *.* to root@192.168.0.12 identified by '123456';
从节点
mysql> grant all on *.* to root@192.168.0.10 identified by '123456';
mysql> grant all on *.* to root@slave identified by '123456';
mysql> grant all on *.* to root@192.168.0.13 identified by '123456';
到监控机,建立ssh无密码登录环境
[root@manager ~]# ssh-keygen -t rsa
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.11
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.12
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.13
在主机点11上
[root@cluster1 ~]# ssh-keygen -t rsa
[root@cluster1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.12
[root@cluster1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.13
备选主节点12上
[root@cluster2 ~]# ssh-keygen -t rsa
[root@cluster2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.11
[root@cluster2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.13
在从节点上
[root@slave ~]# ssh-keygen -t rsa
[root@slave ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.11
[root@slave ~]# ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.12
再回到监控机
[root@manager ~]# masterha_check_ssh --conf=/etc/app1.cnf
检查ssh登录是否完全正确
[root@manager ~]# masterha_check_repl --conf=/etc/app1.cnf
检查复制情况是否完全正确。
都无误后可以启动manager
[root@manager ~]# nohup masterha_manager --conf=/etc/app1.cnf < /dev/null > /masterha/app1/manager.log 2>&1 &
在备用主节点和从节点上加入计划任务:
00 00 * * * /usr/local/bin/purge_relay_logs –user=root –password=123456 –disable_relay_log_purge >> /masterha/purge_relay_logs.log 2>&1
本文是在基本测试通过的情况下,回忆实施步骤写下来的,可能有错误之处。实现了正常情况下,master主机用虚拟IP对外提供写服务。master的mysql宕掉后的master转移,虚拟ip转移以及slave的转移。其他测试正在进行中。有同样兴趣的朋友大家一起测试一下。