MHA的组件中主要有两个,一个是Manager节点组件。类似于一个监督者。

Node节点组件则是安装于数据库节点,其中一个作为Master。

MHA在主节点发生故障时需要进行主节点自动切换,所以必不可少地需要管理员权限。所以多个节点之间需要基于ssh秘钥认证。

MHA的主要配置在于manager。




准备三台机器统一安装mysql-5.7 (1922.168.6.12,192.168.6.92,192.168.6.91)



创建用户

useradd -s /sbin/nologin -M mysql

创建数据目录

mkdir -p /data/mysql
chown -R mysql.mysql /data/mysql

初始化数据库 (5.7版本注意初始化时的密码)

/usr/local/mysql/bin/mysqld --no-defaults --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/

配置开机自启动

cp support-files/mysql.server /etc/init.d/mysqld 
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --list
/etc/init.d/mysqld start

修改初始密码:

/usr/local/mysql/bin/mysqladmin -uroot -p password '123456'

创建软连接

ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog

第一步:修改/etc/my.cnf配置文件 (三台节点的server-id不同)

master节点

[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
log-bin=/data/mysql/mysql-bin
binlog_format=row                        开启行模式
secure-file-priv=/tmp                      限制mysqld 的导入|导出只能发生在/tmp/目录下
server-id=12                         
 #GTID
gtid-mode=on                          启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true                 强制GTID的一致性
log-slave-updates=1                      slave更新是否记入日志(5.6必须的)
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

slave 节点

[mysqld]
server-id=13
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
log-bin=/data/mysql/mysql-bin
binlog_format=row
secure-file-priv=/tmp 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
slave_parallel_workers = 16
slave_parallel_type= logical_clock
#GTID
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1

开启半同步复制 

master 节点安装插件

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

#半同步复制(加到配置文件my.cnf)

rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000

slave 节点 安装插件 主从同步开启才能启动

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

#半同步复制(加到配置文件my.cnf)

rpl_semi_sync_slave_enabled=1

注意:修改完,重启三个节点的数据库

第二步:创建复制用户

主节点:

GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY '123456';

从库开启复制:

change master to master_host='192.168.6.12',master_user='repl',master_password='123456',MASTER_AUTO_POSITION=1;
start slave;


第三步:关闭relaylog自动删除

MySQL数据库主从复制在缺省情况下从库的relay logs会在SQL线程执行完毕后被自动删除,但是对于MHA场景下,对于某些滞后从库的恢复依赖于其他从库的relay log,因此采取禁用自动删除功能以及定期清理的办法。对于清理过多过大的relay log需要注意引起的复制延迟资源开销等。MHA可通过purge_relay_logs脚本及配合cronjob来完成此项任务。

set global relay_log_purge = 0; 临时(建议三个节点都做)
relay_log_purge = 0   永久,在配置文件,建议在三个节点都做


第四步:安装各个节点node软件包

安装mha node:

依赖包perl-DBD-MySQL ,并在三个节点都安装node软件

yum  -y install perl-DBD-MySQL
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

主库中创建mha管理用户

grant all privileges on *.* to mha@'%' identified by '123456';

第五步:部署manger节点(从库192.168.6.91上部署)

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

创建必须目录

mkdir -p /etc/mha
mkdir -p /var/log/mha/app1    ----》可以管理多套主从复制

创建配置文件

vim /etc/mha/app1.cnf          -----》serverdefault可以独立
[server default]                        
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1
master_ip_failover_script=/usr/local/bin/master_ip_failover
user=mha
password=123456
ping_interval=2
repl_password=123456
repl_user=repl
ssh_user=root
[server1]
candidate_master=1
check_repl_delay=0 
hostname=192.168.6.12
port=3306
[server2]
candidate_master=1                           ----》不管怎样都切到优先级高的主机,一般在主机性能差异的时候用
check_repl_delay=0                           ----》不管优先级高的备选库,数据延时多久都要往那切
hostname=192.168.6.92
port=3306
[server3]
hostname=192.168.6.91
port=3306

检测互信

masterha_check_ssh  --conf=/etc/mha/app1.cnf

测试复制是否正常

masterha_check_repl --conf=/etc/mha/app1.cnf

第六步:MHA自带高可用

vim /usr/local/bin/master_ip_failover
my $vip = '192.168.6.166/24';
my $key = '0';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

在主节点上做

ifconfig eth0:0 192.168.6.166/24


启动mha

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

检查状态:

masterha_check_status --conf=/etc/mha/app1.cnf