目录
2.修改 Master、Slave1、Slave2 节点的主机名
5. Master、Slave1、Slave2 节点上都创建两个软链接
7.Master 节点查看二进制文件和同步点 、在 Slave1、Slave2 节点执行同步操作
1.所有服务器上都安装 MHA 依赖的环境,首先安装 epel 源

MHA Node(数据节点)
MHA Manager(管理节点)
1、从宕机的 Master 保存二进制日志事件(binlog event);
2、识别含有最新更新的 Slave;
3、应用差异的中继日志(relay log)到其他 Slave;
4、应用从 Master 保存的二进制日志事件;
5、提升一个 Slave 为新的 Master;
6、使其他的 Slave 连接新的 Master 进行复制;

#在四台服务器上初始化环境
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#在Master上
hostnamectl set-hostname Mysql1
su
#在Slave1
hostnamectl set-hostname Mysql2
su
#在Slave2
hostnamectl set-hostname Mysql3
su
vim /etc/hosts
192.168.59.118 Mysql1
192.168.59.111 Mysql2
192.168.59.114 Mysql3
- #修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf
- ##Master 节点##
- vim /etc/my.cnf
- [mysqld]
- server-id = 1
- log_bin = master-bin
- log-slave-updates = true
-
- systemctl restart mysqld
-
- ##Slave1 节点##
- vim /etc/my.cnf
- server-id = 2 #三台服务器的 server-id 不能一样
- log_bin = master-bin
- relay-log = relay-log-bin
- relay-log-index = slave-relay-bin.index
-
- systemctl restart mysqld
-
- ###Slave2 节点##
- vim /etc/my.cnf
- server-id = 3
- log_bin = master-bin
- relay-log = relay-log-bin
- relay-log-index = slave-relay-bin.index
-
- systemctl restart mysqld
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
ls /usr/sbin/mysql*
- ###Master、Slave1、Slave2 节点上都授权###
- grant replication slave on *.* to 'myslave'@'192.168.59.%' identified by '123123';
- #授权主从用户
- grant all privileges on *.* to 'mha'@'192.168.59.%' identified by 'manager';
- grant all privileges on *.* to 'mha'@'Mysql1' identified by 'manager';
- grant all privileges on *.* to 'mha'@'Mysql2' identified by 'manager';
- grant all privileges on *.* to 'mha'@'Mysql3' identified by 'manager';
-
- #刷新库
- flush privileges;
- ###在master上###
- show master status;
-
- ###在slave1、slave2节点执行同步操作##
- change master to master_host='192.168.59.118',master_user='myslave',master_password='123123',master_log_file='master-bin.000002',master_log_pos=1745;
- start slave;
- show slave status\G;
set global read_only=1;
##在主master上创建库、表并插入数据##
create database test1;
use test1;
insert into info values('小明');
select * from test1.info;
##在slave1、slave2上验证##
select * from test1.info;
- yum install epel-release --nogpgcheck -y
-
- yum install -y perl-DBD-MySQL \
- perl-Config-Tiny \
- perl-Log-Dispatch \
- perl-Parallel-ForkManager \
- perl-ExtUtils-CBuilder \
- perl-ExtUtils-MakeMaker \
- perl-CPAN
2.安装 MHA 软件包,先在所有服务器上必须先安装 node 组件
对于每个操作系统版本不一样,这里 CentOS7.4 必须选择 0.57 版本。
在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件。
- ##将需要的包下载到/opt下##
-
- ##每台服务器上解压安装node组件##
- cd /opt
- tar zxf mha4mysql-node-0.57.tar.gz
- cd mha4mysql-node-0.57
- perl Makefile.PL
- make && make install
3.在 MHA-manager 节点上安装 manager 组件
- tar zxf mha4mysql-manager-0.57.tar.gz
- cd mha4mysql-manager-0.57/
- perl Makefile.PL
- make && make install
4.在所有服务器上配置无密码认证
- #在 manager 节点上配置到所有数据库节点的无密码认证
- ssh-keygen -t rsa #一路按回车键
- ssh-copy-id 192.168.59.118
- ssh-copy-id 192.168.59.111
- ssh-copy-id 192.168.59.114
-
- ####数据库服务器之间互相导入即可####
-
- #在master上
- ssh-keygen -t rsa #一路按回车键
- ssh-copy-id 192.168.59.111
- ssh-copy-id 192.168.59.114
-
- #在slave1上
- ssh-keygen -t rsa #一路按回车键
- ssh-copy-id 192.168.59.118
- ssh-copy-id 192.168.59.114
-
- #在slave2上
- ssh-keygen -t rsa #一路按回车键
- ssh-copy-id 192.168.59.118
- ssh-copy-id 192.168.59.111
5.在manager节点上操作
- (1)##在 manager 节点上复制相关脚本到/usr/local/bin 目录
- cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
-
- #拷贝后会有四个执行文件
- ll /usr/local/bin/scripts/
- master_ip_failover #自动切换时 VIP 管理的脚本
- master_ip_online_change #在线切换时 vip 的管理
- power_manager #故障发生后关闭主机的脚本
- send_report #因故障切换后发送报警的脚本
-
- (2)##复制上述的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,这里使用master_ip_failover脚本来管理 VIP 和故障切换
- cp /usr/local/bin/scripts/* /usr/local/bin
-
- (3)##修改master_ip_failover 全部删除,添加以下内容,修改相关参数
-
- #!/usr/bin/env perl
- use strict;
- use warnings FATAL => 'all';
-
- use Getopt::Long;
-
- my (
- $command, $ssh_user, $orig_master_host, $orig_master_ip,
- $orig_master_port, $new_master_host, $new_master_ip, $new_master_port
- );
- #############################添加内容部分#########################################
- my $vip = '192.168.59.188'; #指定vip的地址
- my $brdc = '192.168.59.255'; #指定vip的广播地址
- my $ifdev = 'ens33'; #指定vip绑定的网卡
- my $key = '1'; #指定vip绑定的虚拟网卡序列号
- my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #代表此变量值为ifconfig ens33:1 192.168.59.188
- my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; #代表此变量值为ifconfig ens33:1 192.168.59.188 down
- my $exit_code = 0; #指定退出状态码为0
- #my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
- #my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
- ##################################################################################
- GetOptions(
- 'command=s' => \$command,
- 'ssh_user=s' => \$ssh_user,
- 'orig_master_host=s' => \$orig_master_host,
- 'orig_master_ip=s' => \$orig_master_ip,
- 'orig_master_port=i' => \$orig_master_port,
- 'new_master_host=s' => \$new_master_host,
- 'new_master_ip=s' => \$new_master_ip,
- 'new_master_port=i' => \$new_master_port,
- );
-
- exit &main();
-
- sub main {
-
- print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
-
- if ( $command eq "stop" || $command eq "stopssh" ) {
-
- my $exit_code = 1;
- eval {
- print "Disabling the VIP on old master: $orig_master_host \n";
- &stop_vip();
- $exit_code = 0;
- };
- if ($@) {
- warn "Got Error: $@\n";
- exit $exit_code;
- }
- exit $exit_code;
- }
- elsif ( $command eq "start" ) {
-
- my $exit_code = 10;
- eval {
- print "Enabling the VIP - $vip on the new master - $new_master_host \n";
- &start_vip();
- $exit_code = 0;
- };
- if ($@) {
- warn $@;
- exit $exit_code;
- }
- exit $exit_code;
- }
- elsif ( $command eq "status" ) {
- print "Checking the Status of the script.. OK \n";
- exit 0;
- }
- else {
- &usage();
- exit 1;
- }
- }
- sub start_vip() {
- `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
- }
- ## A simple system call that disable the VIP on the old_master
- sub stop_vip() {
- `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
- }
-
- sub usage {
- print
- "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
- }
-
- #删除注释
- :2,87 s/^#//
-
- (4)##创建 MHA 软件目录并拷贝配置文件,这里使用app1.cnf配置文件来管理 mysql 节点服务器
-
- #创建 MHA 软件目录并拷贝配置文件
- cd /opt/mha4mysql-manager-0.57/samples/conf/
- ls
- mkdir /etc/masterha
- cp app1.cnf /etc/masterha/
-
-
- #修改app1.cnf配置文件,删除原文所有内容,添加下面的
- vim /etc/masterha/app1.cnf
- [server default]
- manager_workdir=/var/log/masterha/app1
- master_binlog_dir=/usr/local/mysql/data
- manager_log=/var/log/masterha/app1/manager.log
- manager_workdir=/var/log/masterha/app1
- master_binlog_dir=/usr/local/mysql/data
- master_ip_failover_script=/usr/local/bin/master_ip_failover
- master_ip_online_change_script=/usr/local/bin/master_ip_online_change
- password=manager
- ping_interval=1
- remote_workdir=/tmp
- repl_password=123123
- repl_user=myslave
- secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.59.111 -s 192.168.59.114
- shutdown_script=""
- ssh_user=root
- user=mha
-
- [server1]
- hostname=192.168.59.118
- port=3306
-
- [server2]
- candidate_master=1
- check_repl_delay=0
- hostname=192.168.59.111
- port=3306
-
- [server3]
- hostname=192.168.59.114
- port=3306
-
- (5)###在主节点开启虚拟IP
- ifconfig ens33:1 192.168.59.188/24
-
- (6)##在 manager 节点上测试 ssh 无密码认证,如果正常最后会输出 successfully。如下所示
- masterha_check_ssh -conf=/etc/masterha/app1.cnf
-
- (7)##在 manager 节点上测试 mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常。如下所示。
- masterha_check_repl -conf=/etc/masterha/app1.cnf
-
- (8)##在 manager 节点上启动 MHA
- nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
-
- (9)##查看 MHA 状态,可以看到当前的 master 是 Mysql1 节点。
- masterha_check_status --conf=/etc/masterha/app1.cnf
-
- (10)查看 MHA 日志,也以看到当前的 master 是 192.168.59.118,如下所示。
- cat /var/log/masterha/app1/manager.log | grep "current master"
-
- (11)##查看 Mysql1 的 VIP 地址 192.168.59.118 是否存在,这个 VIP 地址不会因为 manager 节点停止 MHA 服务而消失。
- ifconfig
-
- //若要关闭 manager 服务,可以使用如下命令。
- masterha_stop --conf=/etc/masterha/app1.cnf
- 或者可以直接采用 kill 进程 ID 的方式关闭。
- #在 manager 节点上监控观察日志记录
- tail -f /var/log/masterha/app1/manager.log
-
- #在 Master 节点 Mysql1 上停止mysql服务
- systemctl stop mysqld
- 或
- pkill -9 mysql
-
- #在slave1,slave2上查看,正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 app1.cnf 文件内容,将宕机的 mysql1 节点删除。查看 mysql2 是否接管 VIP
- ifconfig
-
-
- 故障切换备选主库的算法:
- 1.一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。
- 2.数据一致的情况下,按照配置文件顺序,选择备选主库。
- 3.设定有权重(candidate_master=1),按照权重强制指定备选主。
- (1)默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。
- (2)如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。
- 1.#修复mysql1
- systemctl restart mysqld
-
- 2.#修复主从
- #在现主库服务器 Mysql2 查看二进制文件和同步点
- show master status;
- #在原主库服务器 mysql1 执行同步操作
- change master to master_host='192.168.59.111',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1745;
- start slave;
- show slave status\G;
-
- 3.#在 manager 节点上修改配置文件app1.cnf(再把这个记录添加进去,因为它检测掉失效时候会自动消失)
- vi /etc/masterha/app1.cnf
- ....
- secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.59.118 -s 192.168.59.114
- ....
- [server1]
- hostname=192.168.59.111
- port=3306
-
- [server2]
- candidate_master=1
- check_repl_delay=0
- hostname=192.168.59.118
- port=3306
-
- [server3]
- hostname=192.168.59.114
- port=3306
-
- 4.#在 manager 节点上启动 MHA
- nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &