时间:2021-07-01 10:21:17 帮助过:17人阅读
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
1)故障切换快
在主从复制集群中,只要从库在复制上没有延迟,MHA通常可以在数秒内实现故障切换。9-10秒内检查到master故障,可以选择在7-10秒关闭master以避免出现裂脑,几秒钟内,
将差异中继日志(relay log)应用到新的master上,因此总的宕机时间通常为10-30秒。恢复新的master后,MHA并行的恢复其余的slave。即使在有数万台slave,也不会
影响master的恢复时间。
DeNA在超过150个MySQL(主要5.0 /5 .1版本)主从环境下使用了MHA。当mater故障后,MHA在4秒内就完成了故障切换。在传统的主动/被动集群解决方案中,4秒内完成故障切换是不可能的。
2)master故障不会导致数据不一致
当目前的master出现故障时,MHA自动识别slave之间中继日志(relay log)的不同,并应用到所有的slave中。这样所有的salve能够保持同步,只要所有的slave处于存活
状态。和Semi-Synchronous Replication一起使用,(几乎)可以保证没有数据丢失。
3)无需修改当前的MySQL设置
MHA的设计的重要原则之一就是尽可能地简单易用。MHA工作在传统的MySQL版本5.0和之后版本的主从复制环境中。和其它高可用解决方法比,MHA并不需要改变MySQL的部署环境。
MHA适用于异步和半同步的主从复制。
启动/停止/升级/降级/安装/卸载MHA不需要改变(包扩启动/停止)MySQL复制。当需要升级MHA到新的版本,不需要停止MySQL,仅仅替换到新版本的MHA,然后重启MHA Manager
就好了。
MHA运行在MySQL 5.0开始的原生版本上。一些其它的MySQL高可用解决方案需要特定的版本(比如MySQL集群、带全局事务ID的MySQL等等),但并不仅仅为了master的高可用才迁移应用的。在大多数情况下,已经部署了比较旧MySQL应用,并且不想仅仅为了实现Master的高可用,花太多的时间迁移到不同的存储引擎或更新的前沿发行版。MHA工作的包括5.0 /5 .1 /5 .5的原生版本的MySQL上,所以并不需要迁移。
4)无需增加大量的服务器
MHA由MHA Manager和MHA Node组成。MHA Node运行在需要故障切换/恢复的MySQL服务器上,因此并不需要额外增加服务器。MHA Manager运行在特定的服务器上,因此需要
增加一台(实现高可用需要2台),但是MHA Manager可以监控大量(甚至上百台)单独的master,因此,并不需要增加大量的服务器。即使在一台slave上运行MHA Manager也是
可以的。综上,实现MHA并没用额外增加大量的服务。
5)无性能下降
MHA适用与异步或半同步的MySQL复制。监控master时,MHA仅仅是每隔几秒(默认是3秒)发送一个 ping 包,并不发送重查询。可以得到像原生MySQL复制一样快的性能。
6)适用于任何存储引擎
MHA可以运行在只要MySQL复制运行的存储引擎上,并不仅限制于InnoDB,即使在不易迁移的传统的MyISAM引擎环境,一样可以使用MHA。
|
三、MHA高可用环境部署记录
1)机器环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
ip地址 主机名 角色
182.48.115.236 Node_Master 写入,数据节点
182.48.115.237 Node_Slave 读,数据节点,备选Master(candicate master)
182.48.115.238 Manager_Slave 读,数据节点,也作为Manager server(即也作为manager节点)
........................................................................................................
为了节省机器,这里选择只读的从库182.48.115.237(从库不对外提供读的服务)作为候选主库,即candicate master,或是专门用于备份
同样,为了节省机器,这里选择182.48.115.238这台从库作为manager server(实际生产环节中,机器充足的情况下, 一般是专门选择一台机器作为Manager server)
........................................................................................................
关闭三台机器的iptables和selinux
部署节点之间 ssh 无密码登陆的信任关系(即在所有节点上做 ssh 免密码登录,包括对节点本机的信任)
[root@Node_Master ~] # ssh-copy-id 182.48.115.236
[root@Node_Master ~] # ssh-copy-id 182.48.115.237
[root@Node_Master ~] # ssh-copy-id 182.48.115.238
[root@Node_Slave ~] # ssh-copy-id 182.48.115.236
[root@Node_Slave ~] # ssh-copy-id 182.48.115.237
[root@Node_Slave ~] # ssh-copy-id 182.48.115.238
[root@Manager_Slave ~] # ssh-copy-id 182.48.115.236
[root@Manager_Slave ~] # ssh-copy-id 182.48.115.237
[root@Manager_Slave ~] # ssh-copy-id 182.48.115.238
现在3台节点已经能实现两两互相 ssh 通了,不需要输入密码即可。如果不能实现任何两台主机互相之间可以无密码登录,后面的环节可能会有问题。
|
2)实现主机名hostname登录(在三台节点上都需要执行)(这一步不是必须要操作的)
1 2 3 4 5 6 7 8 9 |
分别设置三台节点机器的主机名(主机名上面已提出),并绑定hosts.
三台机器的 /etc/hosts 文件的绑定信息如下:
[root@Node_Master ~] # vim /etc/hosts
.......
182.48.115.236 Node_Master
182.48.115.237 Node_Slave
182.48.115.238 Manager_Slave
相互验证下使用主机名登陆是否正常,是否可以相互使用主机名 ssh 无密码登陆到对方。
|
3)准备好Mysql主从环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
架构如下,一主二从的架构:
主库:182.48.115.236 从库:182.48.115.237
主库:182.48.115.236 从库:182.48.115.238
Mysql主从环境部署可以参考:http: //www .cnblogs.com /kevingrace/p/6256603 .html
.......................................................................................
------主库配置------
server- id =1
log-bin=mysql-bin
binlog-ignore-db=mysql
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
------从库1配置-------
server- id =2
log-bin=mysql-bin
binlog-ignore-db=mysql // 千万要注意:主从同步中的过滤字段要一致,否则后面使用masterha_check_repl 检查复制时就会出错!
slave-skip-errors = all
------从库2配置-------
server- id =3
log-bin=mysql-bin
binlog-ignore-db=mysql
slave-skip-errors = all
然后主库授权给从库连接的权限,设置后,最好在从库上验证下是否能使用授予的权限连接主库。
然后在从库上根据主库的“show master status;” 信心进行change master.....同步设置。
注意:
主从设置时,如果设置了bbinlog-ignore-db 和 replicate-ignore-db 过滤规则,则主从必须相同。即要使用binlog-ignore-db过滤字段,则主从配置都使用这个,
要是使用replicate-ignore-db过滤字段,则主从配置都使用这个,千万不能主从配置使用的过滤字段不一样!因为MHA 在启动时候会检测过滤规则,如果过滤规则不同,MHA 不启动监控和故障转移。
.......................................................................................
|
4)创建用户mha管理的账号(在三台节点上都需要执行)
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql> GRANT SUPER,RELOAD,REPLICATION CLIENT,SELECT ON *.* TO manager@ ‘182.48.115.%‘ IDENTIFIED BY ‘manager_1234‘ ;
Query OK, 0 rows affected (0.06 sec)
mysql> GRANT CREATE,INSERT,UPDATE,DELETE,DROP ON*.* TO manager@ ‘182.48.115.%‘ ;
Query OK, 0 rows affected (0.05 sec)
创建主从账号(在三台节点上都需要执行):
mysql> GRANT RELOAD, SUPER, REPLICATION SLAVE ON*.* TO ‘repl‘ @ ‘182.48.115.%‘ IDENTIFIED BY ‘repl_1234‘ ;
Query OK, 0 rows affected (0.09 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.06 sec)
|
5)开始安装mha
mha包括manager节点和data节点,其中:
data节点包括原有的MySQL复制结构中的主机,至少3台,即1主2从,当master failover后,还能保证主从结构;只需安装node包。
manager server:运行监控脚本,负责monitoring 和 auto-failover;需要安装node包和manager包。
5.1)在所有data数据节点机上安装安装MHA node
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
下载mha4mysql-node-0.56. tar .gz
下载地址:http: //pan .baidu.com /s/1cphgLo
提取密码:7674
[root@Node_Master ~] # yum -y install perl-DBD-MySQL //先安装所需的perl模块
[root@Node_Master ~] # tar -zvxf mha4mysql-node-0.56.tar.gz
[root@Node_Master ~] # cd mha4mysql-node-0.56
[root@Node_Master mha4mysql-node-0.56] # perl Makefile.PL
................................................................................................................
这一步可能报错如下:
1)Can‘t locate ExtUtils /MakeMaker .pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 ......
解决办法:
[root@Node_Master mha4mysql-node-0.56] # yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
2)Can‘t locate CPAN.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5 ....
解决办法:
[root@Node_Master mha4mysql-node-0.56] # yum install -y perl-CPAN
................................................................................................................
[root@Node_Master mha4mysql-node-0.56] # make && make install
|
5.2)在manager节点(即182.48.115.238)上安装MHA Manager(注意manager节点也要安装MHA node)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
首先下载第三方yum源
[root@Manager_Slave ~] # rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装perl的mysql包:
[root@Manager_Slave ~] # yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles perl-Time-HiRes -y
安装MHA Manager软件包:
下载地址:https: //pan .baidu.com /s/1slyfXN3
提取密码:86wb
[root@Manager_Slave ~] # tar -vxf mha4mysql-manager-0.56.tar
[root@Manager_Slave ~] # cd mha4mysql-manager-0.56
[root@Manager_Slave mha4mysql-manager-0.56] # perl Makefile.PL
[root@Manager_Slave mha4mysql-manager-0.56] # make && make install
安装完MHA Manager后,在 /usr/local/bin 目录下会生成以下脚本:
[root@Manager_Slave mha4mysql-manager-0.56] # ll /usr/local/bin/
总用量 84
-r-xr-xr-x. 1 root root 16367 5月 31 21:37 apply_diff_relay_logs
-r-xr-xr-x. 1 root root 4807 5月 31 21:37 filter_mysqlbinlog
-r-xr-xr-x. 1 root root 1995 5月 31 22:23 masterha_check_repl
-r-xr-xr-x. 1 root root 1779 5月 31 22:23 masterha_check_ssh
-r-xr-xr-x. 1 root root 1865 5月 31 22:23 masterha_check_status
-r-xr-xr-x. 1 root root 3201 5月 31 22:23 masterha_conf_host
-r-xr-xr-x. 1 root root 2517 5月 31 22:23 masterha_manager
-r-xr-xr-x. 1 root root 2165 5月 31 22:23 masterha_master_monitor
-r-xr-xr-x. 1 root root 2373 5月 31 22:23 masterha_master_switch
-r-xr-xr-x. 1 root root 5171 5月 31 22:23 masterha_secondary_check
-r-xr-xr-x. 1 root root 1739 5月 31 22:23 masterha_stop
-r-xr-xr-x. 1 root root 8261 5月 31 21:37 purge_relay_logs
-r-xr-xr-x. 1 root root 7525 5月 31 21:37 save_binary_logs
其中:
masterha_check_repl 检查MySQL复制状况
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_status 检测当前MHA运行状态
masterha_conf_host 添加或删除配置的server信息
masterha_manager 启动MHA
masterha_stop 停止MHA
masterha_master_monitor 检测master是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_secondary_check 多种线路检测master是否存活
另外:
在.. /mha4mysql-manager-0 .56 /samples/scripts 下还有以下脚本,需要将其复制到 /usr/local/bin
[root@Manager_Slave mha4mysql-manager-0.56] # cd samples/scripts/
[root@Manager_Slave scripts] # ll
总用量 32
-rwxr-xr-x. 1 4984 users 3648 4月 1 2014 master_ip_failover // 自动切换时VIP管理脚本,不是必须,如果我们使用keepalived的,我们可以自己编写脚本完成对vip的管理,比如监控mysql,如果mysql异常,我们停止keepalived就行,这样vip就会自动漂移
-rwxr-xr-x. 1 4984 users 9870 4月 1 2014 master_ip_online_change // 在线切换时VIP脚本,不是必须,同样可以可以自行编写简单的shell完成
-rwxr-xr-x. 1 4984 users 11867 4月 1 2014 power_manager // 故障发生后关闭master脚本,不是必须
-rwxr-xr-x. 1 4984 users 1360 4月 1 2014 send_report // 故障切换发送报警脚本,不是必须,可自行编写简单的shell完成
[root@Manager_Slave scripts] # cp ./* /usr/local/bin/
|
5.3)在管理节点(182.48.115.238)上进行下面配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
[root@Manager_Slave mha4mysql-manager-0.56] # mkdir -p /etc/masterha
[root@Manager_Slave mha4mysql-manager-0.56] # cp samples/conf/app1.cnf /etc/masterha/
[root@Manager_Slave mha4mysql-manager-0.56] # vim /etc/masterha/app1.cnf
[server default]
manager_workdir= /var/log/masterha/app1 // 设置manager的工作目录
manager_log= /var/log/masterha/app1/manager .log // 设置manager的日志
ssh_user=root //ssh 免密钥登录的帐号名
repl_user=repl //mysql 复制帐号,用来在主从机之间同步二进制日志等
repl_password=repl_1234 // 设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
ping_interval=1 // 设置监控主库,发送 ping 包的时间间隔,用来检查master是否正常,默认是3秒,尝试三次没有回应的时候自动进行railover
master_ip_failover_script= /usr/local/bin/master_ip_failover // 设置自动failover时候的切换脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change // 设置手动切换时候的切换脚本
[server1]
hostname =182.48.115.236
port=3306
master_binlog_dir= /data/mysql/data/ // 设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录
[server2]
hostname =182.48.115.237
port=3306
candidate_master=1 // 设置为候选master,即master机宕掉后,优先启用这台作为新master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
check_repl_delay=0 // 默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
master_binlog_dir= /data/mysql/data/
[server3]
hostname =182.48.115.238
port=3306
#candidate_master=1
master_binlog_dir= /data/mysql/data/
#[server4]
#hostname=host4
#no_master=1
|
5.4)设置relay log的清除方式(在两台slave节点上)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
[root@Node_Slave ~] # mysql -p123456 -e ‘set global relay_log_purge=0‘
[root@Manager_Slave ~] # mysql -p123456 -e ‘set global relay_log_purge=0‘
..................................................................................................
温馨提示:
MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,所以这里要将relay log的自动清除设置为OFF,采用手动清除relay log的方式。
在默认情况下,从服务器上的中继日志会在SQL线程执行完毕后被自动删除。但是在MHA环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用
中继日志的自动删除功能。定期清除中继日志需要考虑到复制延时的问题。在ext3的文件系统下,删除大的文件需要一定的时间,会导致严重的复制延时。为了避
免复制延时,需要暂时为中继日志创建硬链接,因为在linux系统中通过硬链接删除大文件速度会很快。(在mysql数据库中,删除大表时,通常也采用建立硬链接的方式)
MHA节点中包含了pure_relay_logs命令工具,它可以为中继日志创建硬链接,执行SET GLOBAL relay_log_purge=1,等待几秒钟以便SQL线程切换到新的中继日志,
再执行SET GLOBAL relay_log_purge=0。
pure_relay_logs脚本参数如下所示:
--user mysql 用户名
--password mysql 密码
--port 端口号
--workdir 指定创建relay log的硬链接的位置,默认是 /var/tmp ,由于系统不同分区创建硬链接文件会失败,故需要执行硬链接具体位置,成功执行脚本后,硬链接的中继日志文件被删除
--disable_relay_log_purge 默认情况下,如果relay_log_purge=1,脚本会什么都不清理,自动退出,通过设定这个参数,当relay_log_purge=1的情况下会将relay_log_purge设置为0。清理relay log之后,最后将参数设置为OFF。
设置定期清理relay脚本(在两台slave节点上操作)
[root@Node_Slave ~] # vim /root/purge_relay_log.sh
#!/bin/bash
user=root
passwd =123456
port=3306
host=localhost
log_dir= ‘/data/masterha/log‘
work_dir= ‘/data‘
purge= ‘/usr/local/bin/purge_relay_logs‘
if [ ! -d $log_dir ]
then
mkdir $log_dir -p
fi
$purge --user=$user --host=$host --password=$ passwd --disable_relay_log_purge --port=$port --workdir=$work_dir >> $log_dir /purge_relay_logs .log 2>&1
[root@Node_Slave ~] # chmod 755 /root/purge_relay_log.sh
添加到 crontab 定期执行
[root@Node_Slave ~] # crontab -e
0 4 * * * /bin/bash /root/purge_relay_log .sh
purge_relay_logs脚本删除中继日志不会阻塞SQL线程。下面手动执行看看什么情况。
[root@Node_Slave ~] # /usr/local/bin/purge_relay_logs --user=root --host=localhost --password=123456 --disable_relay_log_purge --port=3306 --workdir=/data
2017-05-31 23:27:13: purge_relay_logs script started.
Found relay_log.info: /data/mysql/data/relay-log .info
Opening /data/mysql/data/mysql-relay-bin .000002 ..
Opening /data/mysql/data/mysql-relay-bin .000003 ..
Executing SET GLOBAL relay_log_purge=1; FLUSH LOGS; sleeping a few seconds so that SQL thread can delete older relay log files ( if it keeps up); SET GLOBAL relay_log_purge=0; .. ok.
2017-05-31 23:27:17: All relay log purging operations succeeded.
[root@Node_Slave ~] # ll /data/masterha/log/
总用量 4
-rw-r--r--. 1 root root 905 5月 31 23:26 purge_relay_logs.log
|
5.5)检查SSH配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
检查MHA Manger到所有MHA Node的SSH连接状态:
[root@Manager_Slave ~] # masterha_check_ssh --conf=/etc/masterha/app1.cnf
Wed May 31 23:06:01 2017 - [warning] Global configuration file /etc/masterha_default .cnf not found. Skipping.
Wed May 31 23:06:01 2017 - [info] Reading application default configuration from /etc/masterha/app1 .cnf..
Wed May 31 23:06:01 2017 - [info] Reading server configuration from /etc/masterha/app1 .cnf..
Wed May 31 23:06:01 2017 - [info] Starting SSH connection tests..
Wed May 31 23:06:04 2017 - [debug]
Wed May 31 23:06:01 2017 - [debug] Connecting via SSH from root@182.48.115.236(182.48.115.236:22) to root@182.48.115.237(182.48.115.237:22)..
Wed May 31 23:06:02 2017 - [debug] ok.
Wed May 31 23:06:02 2017 - [debug] Connecting via SSH from root@182.48.115.236(182.48.115.236:22) to root@182.48.115.238(182.48.115.238:22)..
Wed May 31 23:06:03 2017 - [debug] ok.
Wed May 31 23:06:04 2017 - [debug]
Wed May 31 23:06:01 2017 - [debug] Connecting via SSH from root@182.48.115.237(182.48.115.237:22) to root@182.48.115.236(182.48.115.236:22)..
Wed May 31 23:06:03 2017 - [debug] ok.
Wed May 31 23:06:03 2017 - [debug] Connecting via SSH from root@182.48.115.237(182.48.115.237:22) to root@182.48.115.238(182.48.115.238:22)..
Wed May 31 23:06:04 2017 - [debug] ok.
Wed May 31 23:06:04 2017 - [debug]
Wed May 31 23:06:02 2017 - [debug] Connecting via SSH from root@182.48.115.238(182.48.115.238:22) to root@182.48.115.236(182.48.115.236:22)..
Wed May 31 23:06:03 2017 - [debug] ok.
Wed May 31 23:06:03 2017 - [debug] Connecting via SSH from root@182.48.115.238(182.48.115.238:22) to root@182.48.115.237(182.48.115.237:22)..
Wed May 31 23:06:04 2017 - [debug] ok.
Wed May 31 23:06:04 2017 - [info] All SSH connection tests passed successfully.
可以看见各个节点 ssh 验证都是ok的。
|
5.6)使用mha工具check检查repl环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
通过masterha_check_repl脚本查看整个mysql集群的复制状态
[root@Manager_Slave ~] # masterha_check_repl --conf=/etc/masterha/app1.cnf
Wed May 31 23:43:43 2017 - [warning] Global configuration file /etc/masterha_default .cnf not found. Skipping.
Wed May 31 23:43:43 2017 - [info] Reading application default configuration from /etc/masterha/app1 .cnf..
Wed May 31 23:43:43 2017 - [info] Reading server configuration from /etc/masterha/app1 .cnf..
Wed May 31 23:43:43 2017 - [info] MHA::MasterMonitor version 0.56.
Wed May 31 23:43:43 2017 - [error][ /usr/local/share/perl5/MHA/ServerManager .pm, ln301] Got MySQL error when connecting 182.48.115.237(182.48.115.237:3306) :1045:Access denied for user ‘root‘ @ ‘182.48.115.238‘ (using password: NO), but this is not a MySQL crash. Check MySQL server settings.
at /usr/local/share/perl5/MHA/ServerManager .pm line 297
Wed May 31 23:43:43 2017 - [error][ /usr/local/share/perl5/MHA/ServerManager .pm, ln301] Got MySQL error when connecting 182.48.115.236(182.48.115.236:3306) :1045:Access denied for user ‘root‘ @ ‘182.48.115.238‘ (using password: NO), but this is not a MySQL crash. Check MySQL server settings.
at /usr/local/share/perl5/MHA/ServerManager .pm line 297
Wed May 31 23:43:43 2017 - [error][ /usr/local/share/perl5/MHA/ServerManager .pm, ln301] Got MySQL error when connecting 182.48.115.238(182.48.115.238:3306) :1045:Access denied for user ‘root‘ @ ‘182.48.115.238‘ (using password: NO), but this is not a MySQL crash. Check MySQL server settings.
at /usr/local/share/perl5/MHA/ServerManager .pm line 297
Wed May 31 23:43:43 2017 - [error][ /usr/local/share/perl5/MHA/ServerManager .pm, ln309] Got fatal error, stopping operations
Wed May 31 23:43:43 2017 - [error][ /usr/local/share/perl5/MHA/MasterMonitor .pm, ln424] Error happened on checking configurations. at /usr/local/share/perl5/MHA/MasterMonitor .pm line 326
Wed May 31 23:43:43 2017 - [error][ /usr/local/share/perl5/MHA/MasterMonitor .pm, ln523] Error happened on monitoring servers.
Wed May 31 23:43:43 2017 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
发现上面的复制环节是不ok的!!!
原因是通过root用户远程连接节点的mysql不通
..............................................................................................................
解决办法:在三个节点机器上的mysql上授权,允许182.48.115.%的机器通过root用户无密码登陆,即
mysql> update mysql.user set password=password( "" ) where user= "root" and host= "182.48.115.%" ; // 如果没有这个权限,就grant命令创建这个用户权限
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host,password from mysql.user;
+---------+--------------+-------------------------------------------+
| user | host | password |
+---------+--------------+-------------------------------------------+
.........
| root | 182.48.115.% | |
+---------+--------------+-------------------------------------------+
11 rows in set (0.00 sec)
..............................................................................................................
然后再次通过masterha_check_repl脚本查看整个mysql集群的复制状态
[root@Manager_Slave ~] # masterha_check_repl --conf=/etc/masterha/app1.cnf
..............................
Bareword "FIXME_xxx" not allowed while "strict subs" in use at /usr/local/bin/master_ip_failover line 93.
还是出现如上报错,原因是:
原来Failover两种方式:一种是虚拟IP地址,一种是全局配置文件。MHA并没有限定使用哪一种方式,而是让用户自己选择,虚拟IP地址的方式会牵扯到其它的软件,比如keepalive软件,而且还要修改脚本master_ip_failover。
解决办法如下:
添加软连接(所有节点):
[root@Manager_Slave ~] # ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
[root@Manager_Slave ~] # ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
先暂时注释掉管理节点的 /etc/masterha/app1 .cnf文件中的master_ip_failover_script= /usr/local/bin/master_ip_failover 这个选项。
后面引入keepalived后和修改该脚本以后再开启该选项。
[root@Manager_Slave ~] # cat /etc/masterha/app1.cnf
.........
#master_ip_failover_script= /usr/local/bin/master_ip_failover
最后在通过masterha_check_repl脚本查看整个mysql集群的复制状态
[root@Manager_Slave ~] # masterha_check_repl --conf=/etc/masterha/app1.cnf
Thu Jun 1 00:20:58 2017 - [warning] Global configuration file /etc/masterha_default .cnf not found. Skipping.
Thu Jun 1 00:20:58 2017 - [info] Reading application default configuration from /etc/masterha/app1 .cnf..
Thu Jun 1 00:20:58 2017 - [info] read_only=1 is not set on slave 182.48.115.237(182.48.115.237:3306).
Thu Jun 1 00:20:58 2017 - [warning] relay_log_purge=0 is not set on slave 182.48.115.237(182.48.115.237:3306).
Thu Jun 1 00:20:58 2017 - [info] read_only=1 is not set on slave 182.48.115.238(182.48.115.238:3306).
Thu Jun 1 00:20:58 2017 - [warning] relay_log_purge=0 is not set on slave 182.48.115.238(182.48.115.238:3306).
Thu Jun 1 00:20:58 2017 - [info] Checking replication filtering settings..
Thu Jun 1 00:20:58 2017 - [info] binlog_do_db= , binlog_ignore_db= mysql
Thu Jun 1 00:20:58 2017 - [info] Replication filtering check ok.
Thu Jun 1 00:20:58 2017 - [info] GTID (with auto-pos) is not supported
Thu Jun 1 00:20:58 2017 - [info] Starting SSH connection tests..
Thu Jun 1 00:21:02 2017 - [info] All SSH connection tests passed successfully.
...........
Thu Jun 1 00:21:07 2017 - [info] Checking replication health on 182.48.115.237..
Thu Jun 1 00:21:07 2017 - [info] ok.
Thu Jun 1 00:21:07 2017 - [info] Checking replication health on 182.48.115.238..
Thu Jun 1 00:21:07 2017 - [info] ok.
Thu Jun 1 00:21:07 2017 - [warning] master_ip_failover_script is not defined.
Thu Jun 1 00:21:07 2017 - [warning] shutdown_script is not defined.
Thu Jun 1 00:21:07 2017 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
这个时候,发现整个复制环境状况是ok的了!!
|
6)管理mha操作
6.1)检查MHA Manager的状态
1 2 3 4 5 |
通过master_check_status脚本查看Manager的状态
[root@Manager_Slave ~] # masterha_check_status --conf=/etc/masterha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
注意:如果正常,会显示 "PING_OK" ,否则会显示 "NOT_RUNNING" ,这代表MHA监控没有开启
|
6.2)开启MHA Manager监控
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
使用下面命令放在后台执行启动动作
[root@Manager_Slave ~] # 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 &
启动参数介绍:
--remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。
--manger_log 日志存放位置
--ignore_last_failover 在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了
避免 ping -pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我
设置的 /data 产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非
在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。
再次查看MHA Manager监控是否正常:
[root@Manager_Slave ~] # masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:2542) is running(0:PING_OK), master:182.48.115.236
可以看见已经在监控了,而且master的主机为182.48.115.236
查看启动日志
[root@Manager_Slave ~] # tail -n20 /var/log/masterha/app1/manager.log
Checking slave recovery environment settings..
Opening /data/mysql/data/relay-log .info ... ok.
Relay log found at /data/mysql/data , up to mysql-relay-bin.000006
Temporary relay log file is /data/mysql/data/mysql-relay-bin .000006
Testing mysql connection and privileges..Warning: Using a password on the command line interface can be insecure.
done .
Testing mysqlbinlog output.. done .
Cleaning up test file (s).. done .
Thu Jun 1 00:37:29 2017 - [info] Slaves settings check done .
Thu Jun 1 00:37:29 2017 - [info]
182.48.115.236(182.48.115.236:3306) (current master)
+--182.48.115.237(182.48.115.237:3306)
+--182.48.115.238(182.48.115.238:3306)
Thu Jun 1 00:37:29 2017 - [warning] master_ip_failover_script is not defined.
Thu Jun 1 00:37:29 2017 - [warning] shutdown_script is not defined.
Thu Jun 1 00:37:29 2017 - [info] Set master ping interval 1 seconds.
Thu Jun 1 00:37:29 2017 - [warning] secondary_check_script is not defined. It is highly recommended setting it to check master reachability from two or more routes.
Thu Jun 1 00:37:29 2017 - [info] Starting ping health check on 182.48.115.236(182.48.115.236:3306)..
Thu Jun 1 00:37:29 2017 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn‘t respond..
其中 "Ping(SELECT) succeeded, waiting until MySQL doesn‘t respond.." 说明整个系统已经开始监控了。
|
6.3)关闭MHA Manage监控
1 2 3 4 5 6 7 8 9 |
关闭很简单,使用masterha_stop命令完成。
[root@Manager_Slave ~] # masterha_stop --conf=/etc/masterha/app1.cnf
Stopped app1 successfully.
[1]+ Exit 1 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
[root@Manager_Slave ~] #
查看MHA Manager监控,发现已关闭
[root@Manager_Slave ~] # masterha_check_status --conf=/etc/masterha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
|
7)配置VIP
vip配置可以采用两种方式,一种通过keepalived的方式管理虚拟ip浮动;另外一种通过脚本方式启动虚拟ip的方式(即不需要keepalived或者heartbeat类似的软件)。
第一种方式:通过keepalive的方式管理vip
7.1)下载软件进行并进行安装(在两台master上都要安装,准确的说一台是master(182.48.115.236);另外一台是备选master(182.48.115.237),在没有切换以前是slave)