传统的MySQL主从架构存在单点故障的问题
试想?如果主从架构中MySQL的master挂了呢?
主机名 | IP地址 | 角色 | 所需安装软件包 |
---|---|---|---|
manager | 192.168.150.20 | manager管理节点 | manager组件,node组件 |
master | 192.168.150.30 | MySQL主数据库 | node组件 |
slave1 | 192.168.150.40 | MySQL从数据库 | node组件 |
slave2 | 192.168.150.50 | MySQL从数据库 | node组件 |
第一步MySQL安装
安装完毕后需要给master、slave1、slave2分别做两个软链接
第一个是mysql命令文件
第二个是mysqlbinlog可用于断点恢复
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
第二步配置MySQL一主两从只需要配置该链接中的主从复制部分
在所有数据库节点上授权两个用户,一个是从库同步使用,另一个是manager使用
第四个账户manager 管理mysql集群使用(监控)三台都做
grant replication slave on *.* to 'myslave'@'192.168.150.%' identified by '123456';
grant all privileges on *.* to 'mha'@'192.168.150.%' identified by 'manager';
flush privileges;
刷新权限列表
下面三条授权,理论上不用添加,但是实验环境通过MHA检查MySQL主从报错,报两个从库通过主机名连接不上主库,所有数据库都需要添加以下授权
grant all privileges on *.* to 'mha'@'master' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
flush privileges;
必须设置两个从库为只读模式
set global read_only=1;
flush privileges;
所有节点配置
vim /etc/sysconfig/selinux
SELINUX=disabled
在所有服务器上安装MHA依赖环境,首先安装epel源,只有安装了源perl才会有
安装epel源,并且不进行gph检查
yum install -y epel-release --nogpgcheck
perl针对于mysql数据库
从配置文件中提拿其中的值
log-日志
多线程管理
扩展工具CBuilder MakeMaker
cpan perl中的数据库
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
MHA软件包对于每个操作系统版本不一样,这里Centos7.4必须选择0.57版本
在所有服务器上必须先安装node组件,最后在MHA-manager节点上安装manager组件因为manager依赖node组件
所有节点安装node组件
cd /opt
tar zxvf /opt/mha4mysql-node-0.57.tar.gz -C /root/
cd /root/mha4mysql-node-0.57/
perl Makefile.PL
make && make install
在MHA(manager)节点上安装manager组件(必须先安装node才能安装manager组件)
cd /opt
tar zxvf /opt/mha4mysql-manager-0.57.tar.gz -C /root
cd /root/mha4mysql-manager-0.57/
perl Makefile.PL
make && make install
manager安装后再/usr/local/bin目录下会生成几个工具,主要包括以下:
masterha_check_ssh检查MHA的SSH配置状况
masterha_check_repl检查MySQL复制状况
masterha_manager启动manager的脚本
masterha_check_status检查当前MHA运行状态
masterha_master_monitor检查master是否宕机
masterha_master_switch控制故障转移(自动或者手动)
masterha_conf_host添加或删除配置的server信息
masterha_stop关闭manager
node安装后也会在/usr/local/bin目录下生产几个脚本,需要进行检查,主要包括以下
save_binary_logs保存和复制master的二进制日志
apply_diff_relay_logs识别差异的中继日志时间,并将其差异的时间应用于其他的slave
filter_mysqlbinlog去除不必要的ROLLBACK回滚时间(MHA已不适用这个工具)
purge_relay_logs清除中继日志(不会阻塞 SQL线程)
在manager上配置到所有数据库节点的无密码认证
ssh-keygen -t rsa
这条一直回车
ssh-copy-id 192.168.150.30
这里执行后输入yes再输入密码
ssh-copy-id 192.168.150.40
ssh-copy-id 192.168.150.50
在master上配置到slave1和salve2的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.150.40
ssh-copy-id 192.168.150.50
在slave1上配置到master和save2的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.150.30
ssh-copy-id 192.168.150.50
在slave2上配置到master和save1的无密码认证
ssh-keygen -t rsa
ssh-copy-id 192.168.150.30
ssh-copy-id 192.168.150.40
在MHA节点上复制相关脚本到/usr/local/bin目录
cp -ra /root/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因故障切换后发送报警的脚本
复制上述的master_ip_failover(自动切换时VIP管理的脚本)到/usr/local/bin目录这里使用脚本管理VIP
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin/
修改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.150.200'; my $brdc = '192.168.150.255'; my $ifdev = 'ens33'; my $key = '1'; my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; my $exit_code = 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"; }
粘贴时注意#号可以:% s/#//g
其中最主要的内容就是
my $vip = '192.168.150.200';
浮动的ip
my $brdc = '192.168.150.255';
广播地址
my $ifdev = 'ens33';
使用的网卡名为ens33
my $key = '1';
虚拟接口
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
使用ifconfig命令将其启动
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
可以使用ifconfig命令将其down
my $exit_code = 0;
正常退出(返回状态码)
mkdir /etc/masterha
cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
vim /etc/masterha/app1.cnf
[server default] 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 user=mha ping_interval=1 remote_workdir=/tmp repl_password=123456 repl_user=myslave #report_script /usr/local/send_report secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.150.40 -s 192.168.150.50 shutdown_script="" ssh_user=root [server1] hostname=192.168.150.30 port=3306 [server2] hostname=192.168.150.40 candidate_master=1 check_repl_delay=0 port=3306 [server3] hostname=192.168.150.50 port=3306
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager工作目录
manager_workdir=/var/log/masterha/app1
manager日志
master_binlog_dir=/usr/local/mysql/data
manager保存binlog的位置,这里的路径要于master里配置的binlog(相同?)
master_ip_failover_script=/usr/local/bin/master_ip_failover
设置自动failover时候切换脚本,也就是上一个配置的脚本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
设置手动切换时候的切换脚本
password=manager
此处密码为之前创建监控用户的密码
user=mha
设置监控用户
ping_interval=1
设置监控主库,发送ping包的事件间隔,默认为3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp
设置远端的MySQL在发生切换时binlog的(临时)保存位置
repl_password=123456
设置复制(slaves)用户的密码
repl_user=myslave
设置复制用于的账户
report_script /usr/local/send_report
设置发生切换后发送的报警的脚本暂时用不到
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.150.40 -s 192.168.150.50
设置检查从服务器的脚本
shutdown_script=""
设置故障发生后关闭故障主机脚本
ssh_user=root
设置ssh的登录用户名
[server2]
candidate_master=1
设置候选master,如果设置了此参数,发送主从切换后,会将此库提升为主库
check_repl_delay=0
支持复制的检查,默认情况下如果一个slave落后master 100M的relay logs(中继日志)的话,MHA将不会选择该slave作为新的master,设置为0的话忽略此规则
[server1]
设置的是主[server2]
设置的是从(主备)[server3]
从
/sbin/ifconfig ens33:1 192.168.150.200/24
注意要于master_ip_failover文件中my $key = '1';
虚拟接口对应
mha-manager有两个核心的配置文件
故障切换脚本,/usr/local/bin/master_ip_failover
app1.cnf
如果正常会输出successfully
masterha_check_ssh -conf=/etc/masterha/app1.cnf
masterha_check_repl -conf=/etc/masterha/app1.cnf
注意:如果软连接不创建的话,无法开启故障检测
启动时会进行日志记录(在后台开启)
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 &
nohup选项:nohup搭配&使用能做到在电源断电的情况下重启后程序还在后台运行单单&的话断电后重启则不在了
masterha_manager:开启
- - remove_dead_master_conf 当master服务器失效时,发生主从切换后,会把旧的master的ip从主配置文件删除
- - ignore_last_failover忽略故障转移,忽略掉总是宕机不够可靠的服务器
在缺省情况下,如果MHA检测到连续发生方剂,且两次宕机间隔不足8小时的话,则不会进行failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略桑次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志记录下,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件;
为了方便,这里设为-ignore_last_failover
< /dev/null >生成的所有信息会导到null下或者/var/log/masterha/app1/manager.log日志文件中
2>&1 &把2错误性的输出从定向为标准性输出,开启后台运行
masterha_check_status --conf=/etc/masterha/app1.cnf
cat /var/log/masterha/app1/manager.log
VIP地址不会因为manager节点停止MHA服务而消失
ifconfig
manager服务器上启用监控观察日志
tailf /var/log/masterha/app1/manager.log
模拟故障查看master变化
`systemctl stop mysqldr上执行
VIP地址消失、主备服务器查看ifconfig
systemctl restart mysqld.service
netstat -natp |grep 3306
mysql -uroot -p123456
stop slave;
change master to master_host='192.168.150.40',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
start slave;
这时候之前的master以slave的身份加入集群
以防新的master再次挂掉此时需要重新修改一下配置文件规定master的选举
结果故障恢复实验后的app1.cnf文件会有所改变
server再进行修改即可
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 &
再启动MHA即可