MHA,MySQL 的高可用架构
MHA,MySQL 的高可用架构,在基于主从架构的模式下,当主服务器挂掉之后,由 MHA 中 manager 来决定从哪台 slave 从服务器当中选择一台作 为master 主服务器,通常是比较从服务器中的数据,哪个最全,最新,更新时间的长短来判断,当决定使用哪台从服务器作为新的主服务器后, MHA 会从其 他节点处获取额外信息,避免数据不一致的情况发生,使数据一致。
MHA 有两种角色:
1.MHA manager
用于统筹管理一个主从架构集群的 master 转换,数据复制权限,以及数据库操作权限等设置,通常作为单台服务器进行配置。每一个 master/slave 集群都作为一个 application。
2.MHA node
MySQL 集群当中的节点,所有在该集群中的服务器都是一个节点,如manager,master,slave1,slave2 四台服务器,则有四个 node 节点。它通过监控具备解 析和清理 logs 功能的脚本来加快故障转移。
MHA 架构集群:
manager 172.25.50.1
master server_id=1 172.25.50.3
slave1 server_id=2 172.25.50.4
slave2 server_id=3 172.25.50.2
1)首先配置好一主两从的数据库架构,这一块就不详细描述了,需要注意的是,因为 MHA 高可用架构的关系,任何一台 MySQL 服务器都有可能成为主服务器, 所以不能像普通主从架构一般,给主服务器开启 binlog,给从服务器开启 relay_log,需要在主从服务器上都开启 binlog 与 relay_log。如该/etc/my.cnf 配置,在初始化mysql前将启动脚本的密码查件注销,以免影响后面的实验
由于做主从复制时已经配好了 master 和 slave1,所以只需要在配置一个slave2;再配置后,发现 IQ 线程为NO
查看日志发现是和主库不同步的原因
在停止 slave 输入命令使其复制时跳过 773 后开启 slave 后正常
slamysql> stop slave;
Query OK, 0 rows affected (0.28 sec)mysql> CHANGE MASTER TO
MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=773;
Query OK, 0 rows affected (0.52 sec)
mysql> start slave;
Query OK, 0 rows affected (0.11 sec)
2、MHA 高可用的实现首先需要构建主从集群,其次,需要将各个节点之间的ssh 通信无障碍。
设置密钥通信
如 master172.25.50.1 需要向其余三个节点传送密钥,使之能够无密码访问
#ssh-keygen -t rsa -P ""
#ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.50.2#ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.50.3
#ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.50.4
其余三个节点如是。
3安装 MHA
MHA manager
#yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm #该 manager 安装需要依赖于许多 epel 源中的插件,联网安装
MHA node
#yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm #四个节点都需要安装
4、配置 manager,使 manager 能够管理主从集群,手动设置一个配置文件在server default 针对于所有 MySQL 服务器的设置。user,password 用于对数据库进行管理的账号密码,这个是需要在 MySQL集群中,即 master,slave1,slave2 中授权。
如ssh_user 则是通信时使用的用户,为 root。repl_user,repl_password 用于主从数据库之间复制转移的账户密码,当主服务器 down 后,从服务器起来,需要在从服务器中进行的 change master授权。
manager_workdir,manager_log 则是用于设置 manager 的工作目录以及日志存放路径。
master_binlog_dir 用于告诉 managermaster 的 binlog 日志放置路径。
ping_interval 用于设置访问的间隔,使用 ping 方式访问。
server1,server2,server3 则是三台 MySQL 服务器,指定其 hostname,可用 IP 地址代替,若要使用主机名,则需要将主机名写入/etc/hosts 中。candidate_master=1,用于设置该服务器是否有资格成为主服务器,若为 0则无资格。
MHA manager 的安装,会提供诸多工具程序,其常见的如下所示。
Manager 节点:
- masterha_check_ssh:MHA 依赖的 SSH 环境检测工具;
- masterha_check_repl:MySQL 复制环境检测工具;
- masterha_manager:MHA 服务主程序;- masterha_check_status:MHA 运行状态探测工具;
- masterha_master_monitor:MySQL master 节点可用性监测工具;
- masterha_master_switch:master 节点切换工具;
- masterha_conf_host:添加或删除配置的节点;
- masterha_stop:关闭 MHA 服务的工具;
Node 节点:
- save_binary_logs:保存和复制 master 的二进制日志;
- apply_diff_relay_logs:识别差异的中继日志事件并应用于其它 slave;
- filter_mysqlbinlog:去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具);
- purge_relay_logs:清除中继日志(不会阻塞 SQL 线程);
mkdir masterha
cd masterha/
vim app1.cnf
[server default]
user=root
password=Hhb+1996
ssh_user=root
repl_password=Hhb+1996
repl_user=repl
master_binlog_dir=/var/lib/mysql
remote_workdir=/tmp
#secondary_check_script= masterha_secondary_check -s remote_host1 -s remote_host2
ping_interval=1
# master_ip_failover_script= /script/masterha/master_ip_failover
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
# master_ip_online_change_script= /script/masterha/master_ip_online_change
manager_workdir=/usr/local/masterha/
manager_log=/usr/local/masterha/manager.log
[server1]
hostname=172.25.50.1
[server2]
hostname=172.25.50.2
candidate_master=1
check_repl_delay=0
[server3]
hostname=172.25.50.3
使用ma sterha_check_ssh --conf=/usr/local/masterha/app1.cnf测试通信环境是否正常;masterha_check_repl --conf=/usr/local/masterha/app1.cnf 测试复制环境是否正常
在使用masterha_check_repl --conf=/usr/local/masterha/app1.cnf测试复制环境时发现环境异常
分析报错后发现时没有在master端给prel和root授权的缘故
在master 上授权:
mysql> grant replication slave on *.* to repl@'%' identified by 'Hhb+1996';
mysql> grant replication slave on *.* to root@'%' identified by 'Hhb+1996';
授权后测试:
Nohup masterha_manager --conf=/usr/local/masterha/app1.cnf &
Nohup masterha_manager --conf=/usr/local/masterha/app1.cnf 在管理主机启动管理程序
[root@server3 ~]# pkill -9 mysqld #此时在将3中mysql强行关闭,发现server2由slave端变成muster端,
在管理端查看刚才的日管理日志
手动切换:当master端数据库关掉后可用下面手动方法切换
masterha_master_switch--master_state=dead--conf=/usr/local/masterha/app1.cnf--dead_master_host=172.25.50.2--dead_master_port=3306--new_master_host=172.25.50.3--new_master_port=3306--ignore_last_failover
手动热切换:可以在master正常工作时使其数据库关掉,让备用mastre机接替其工作
masterha_master_switch--conf=/usr/local/masterha/app1.cnf--master_state=alive--new_master_host=172.25.50.2--new_master_port=3306 --orig_master_is_new_slave--running_updates_limit=10000
测试二: 停掉备用主机的io,然后在master主机加入数据,造成备用master和master主机二进制数据不一致,然后关掉master主机的mysql,执行manager命令,使备用master成为master,看数据是否会一致
change master to master_host='172.25.50.3', master_user='repl', master_password='Hhb+1996', master_auto_position=1; #使master指向server3(注意:每次执行需删除app1.failover.complete,否责出错)
stop slave io_thread; 停掉备用主机io线程
在主master主机插入数据
在另一台slave中查看数据是否同步过去
在备用主机上查看数据是否同步
使备用成为master后,查看数据是否根据差异日志恢复过来
使用脚本控制master状态,
Vim /usr/local/masterha/app1.cnf #加入需要的脚本并指定位置
master_ip_failover_script= /usr/local/masterha/master_ip_failover
# shutdown_script= /script/masterha/power_manager
report_script= /usr/local/masterha/send_report
master_ip_online_change_script= /usr/local/masterha/master_ip_online_change
manager_workdir=/usr/local/masterha
manager_log=/usr/local/masterha/manager.log
vim master_ip_failover #给master添加虚拟ip
vim master_ip_online_change #同样只需添加虚拟ip
vim send_report #添加邮箱和密码
chmod +x send_report master_ip_failover master_ip_online_change #给脚本添加执行权限
测试:
在测试时需要虚拟机进行联网
[root@foundation50 MHA]# iptables -t nat -A POSTROUTING -s 172.25.50.0/24 -j MASQUERADE #在物理主机添加路由
vim /etc/sysconfig/network-scripts/ifcfg-eth0 #在需要联网的虚拟机上添加网关,为物理机ip
Vim /etc/resolv.conf #添加本地解析,使其可拼通百度
/etc/init.d/network restart #重启网络使其生效
启动管理,将master机上的数据库关掉,此时的状态变化便会以邮件形式发到你的邮箱,从而达到监控报警的目的
masterha_master_switch--conf=/usr/local/masterha/app1.cnf--master_state=alive--new_master_host=172.25.50.3--new_master_port=3306--orig_master_is_new_slave --running_updates_limit=10000
通过脚本热切换,由于加了脚本,此时再执行,并不会造成muster的mysql数据库关掉,而是使原来的master主机变为备用master,可以不断进行切换
此时,server3则成为master,ip漂移到server3上
Server2 则由原来的master主机变为slave,由于此时变换并没有造成机器瘫痪,所以不会发邮箱提醒