使用MHA做mysql的高可用

时间:2021-08-13 03:59:21

使用MHA做mysql的高可用

主库: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

10001000ms的超时时间。

备选主库(从库):

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 slavemysql>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 managerMHA 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源,下载epelrpm包,安装即可。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-MySQLmha-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的转移。其他测试正在进行中。有同样兴趣的朋友大家一起测试一下。