Mysql 高可用集群 ------ MHA
发表于:2024-11-13 作者:千家信息网编辑
千家信息网最后更新 2024年11月13日,文章目录一、MHA 简介二、部署 MHA第一步:三台主从服务器安装 mysql第二步:修改 mysql 的主配置文件:/etc/my.cnf ,注意三个服务器的 server-id 不能一样第三步:三
千家信息网最后更新 2024年11月13日Mysql 高可用集群 ------ MHA
文章目录
一、MHA 简介
二、部署 MHA
第一步:三台主从服务器安装 mysql
第二步:修改 mysql 的主配置文件:/etc/my.cnf ,注意三个服务器的 server-id 不能一样
第三步:三个服务器启动 mysql 服务
第四步:配置 Mysql 主从同步(一主两从)
第五步:安装 MHA
第六步:启动 MHA
一、MHA 简介:
MHA(Master High Availability)
(1)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
(2)该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一个独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
(3)工作原理:
1、在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
2、顺序:
从宕机崩溃的master保存二进制日志事件(binlog events);
识别含有最新更新的slave;
应用差异的中继日志(relay log)到其他的slave;
应用从master保存的二进制日志事件(binlog events);
提升一个slave为新的master;
使其他的slave连接新的master进行复制
二、部署 MHA:
角色 需要安装的软件包
master(192.168.220.131) mha4mysql-node
slave1 (192.168.220.140) mha4mysql-node
slave2(192.168.220.136) mha4mysql-node
manager (192.168.220.170) mha4mysql-manager、mha4mysql-node
(1)需求:
本案例要求通过MHA 监控MySQL 数据库在故障时进行自动切换,不影响业务。
(2)思路:
安装MySQL数据库
配置MySQL 一主两从
安装MHA软件
配置无密码认证
配置MySQL、MHA 高可用
模拟 master 故障切换
(3)操作系统:Cent0S7…6 版本, MHA版本是0.57版本
第一步:三台主从服务器安装 mysql
(MySQL版本请使用5.6.36;cmake版本请使用2.8.6),因为三台安装操作都一致,这边演示在 master 上的安装顺序。
1、安装编译依赖包: yum -y install ncurses-devel gcc-c++ perl-Module-Install2、安装 gmake 编译软件(直接解压,然后./configure,gmake && gmake install 就可以了)3、安装 Mysql 数据库:解压;编译:cmake \-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \-DDEFAULT_CHARSET=utf8 \-DDEFAULT_COLLATION=utf8_general_ci \-DWITH_EXTRA_CHARSETS=all \-DSYSCONFDIR=/etc安装:make && make install4、创建mysql用户,并授权:groupadd mysqluseradd -M -s /sbin/nologin mysql -g mysqlchown -R mysql.mysql /usr/local/mysql5、设置环境变量:cp support-files/my-default.cnf /etc/my.cnfcp support-files/mysql.server /etc/rc.d/init.d/mysqldchmod +x /etc/rc.d/init.d/mysqldchkconfig --add mysqldecho "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profilesource /etc/profile //使环境变量生效
第二步:修改 mysql 的主配置文件:/etc/my.cnf ,注意三台服务器的 server-id 不能一样
---配置主服务器:vim /etc/my.cnf[mysql]server-id = 1log_bin = master-binlog-slave-updates = true---配置从服务器1:vim /etc/my.cnf[mysql]server-id = 2log_bin = master-binrelay-log = relay-log-binrelay-log-index = slave-relay-bin.index---配置从服务器2:vim /etc/my.cnf[mysql]server-id = 3log_bin = master-binrelay-log = relay-log-binrelay-log-index = slave-relay-bin.index
第三步:三台服务器启动 mysql 服务
(1)创建软连接:
ln -s /usr/local/mysql/bin/mysql /usr/sbin/ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
(2)开启服务:
systemctl stop firewalld.service setenforce 0/usr/local/mysql/bin/mysqld_safe --user=mysql & //开启服务[root@s01 mysql-5.6.36]# netstat -natp | grep 3306 //查看端口是否正常开发tcp6 0 0 :::3306 :::* LISTEN 40105/mysqld
第四步:配置 Mysql 主从同步(一主两从)
(1)mysql 主从配置,注意授权:
在所有数据库节点上授权两个用户,一个是从库同步使用的用户 myslave ,密码设为 "123" ; 另外一个是 manager 使用监控用户 mha,密码设为 "manager" 。
mysql -uroot -p //进入数据库mysql> grant replication slave on *.* to 'myslave'@'192.168.220.%' identified by '123';mysql> grant all privileges on *.* to 'mha'@'192.168.220.%' identified by 'manager';mysql> flush privileges; //刷新数据库下面三条视情况添加(理论上不需要),以主机名授权(MHA检查时是通过主机名的形式):mysql> grant all privileges on *.* to 'mha'@'master' identified by 'manager';mysql> grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';mysql> grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
(2)在 Mysql 主服务器上查看二进制文件和同步点:
show master status;
(3)接下来,在slave1 和slave2 上分别执行同步:
slave1:change master to master_host='192.168.220.131',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=1215;slave2:change master to master_host='192.168.220.131',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=1215;
1、在两台从服务器上开启slave,查看 IO 和 SQL 线程是否都为 yes ,表示同步正常:
mysql> start slave;mysql> show slave status\G;
2、必须设置两个从服务器为只读模式:
mysql> set global read_only=1;
第五步:安装 MHA
(1)所有服务器上都必须安装 MHA 依赖的环境包,首先安装 epel 源:
yum install epel-release --nogpgcheck -yyum install -y perl-DBD-MYSQL \perl-Config-Tiny \perl-Log-Dispatch \perl-Parallel-ForkManager \perl-ExtUtils-CBuilder \perl-ExtUtils-MakeMaker \perl-CPAN
(2)所有服务器上必须安装 mode 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件,下面都是在 master 上操作演示安装 node组件。
1、安装node组件(四台服务器都需要):tar zvxf mha4mysql-node-0.57.tar.gz -C /opt/cd /opt/mha4mysql-node-0.57/perl Makefile.PL make && make install2、manager服务器上安装 manager组件(这个只有manager服务器才需要):tar zvxf mha4mysql-manager-0.57.tar.gz -C /opt/cd /opt/mha4mysql-manager-0.57/perl Makefile.PLmake && make install
(3)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;.
(4)同时,安装node后也会在usr/local/bin 目录下面会生成几个工具(这些工具通常由 MHA manager 的脚本触发,无需人为操作):
apply_diff_relay_logs :识别差异的中继日志事件并将其差异的事件应用于其他的 slave;
save_binary_logs:保存和复制 master 的二进制日志;
filter_mysqlbinlog :去除不必要的 ROLLBACK 事件 (MHA 已不再使用这个工具);
purge_relay_logs:清除中继日志(不会阻塞 SQL 线程);
(5)配置无密码认证:
1、在 manager 上配置到所有数据库节点的无密码认证:ssh-keygen -t rsa //因为是无密码登录,所以这步一直回车即可(会出现密钥)ssh-copy-id 192.168.220.131ssh-copy-id 192.168.220.140ssh-copy-id 192.168.220.136输入"yes";再输入密码即可2、在 master 上配置到数据库节点slave1 和slave2 的无密码认证:ssh-keygen -t rsassh-copy-id 192.168.220.140ssh-copy-id 192.168.220.136输入"yes";再输入密码即可3、在 slave1 上配置到数据库节点master 和slave2 的无密码认证:ssh-keygen -t rsassh-copy-id 192.168.220.131ssh-copy-id 192.168.220.136输入"yes";再输入密码即可4、在 slave2 上配置到数据库节点master 和slave1 的无密码认证:ssh-keygen -t rsassh-copy-id 192.168.220.131ssh-copy-id 192.168.220.140输入"yes";再输入密码即可
(6)配置 MHA:
1、在 manager 节点上复制相关脚本到 /usr/local/bin 目录:
cp -ra /opt/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin/ls scripts/ master_ip_failover:自动切换时 VIP 管理的脚本; master_ip_online_change:在线切换时 VIP 的管理; power_manager:故障发生后关闭主机的脚本; send_report:因故障切换后发送报警的脚本;将自动切换时 VIP 管理的脚本复制到 /usr/local/bin/目录下:cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin/
2、重新编写 master_ip_failover 脚本:
vim /usr/local/bin/master_ip_failover#!/usr/bin/env perluse 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.220.100';my $brdc = '192.168.220.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_mastersub 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";}
3、创建 MHA 软件目录并拷贝配置文件:
mkdir /etc/masterhacp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/编辑配置文件:vim /etc/masterha/app1.cnf[server default]manager_log=/var/log/masterha/app1/manager.logmanager_workdir=/var/log/masterha/app1master_binlog_dir=/usr/local/mysql/datamaster_ip_failover_script=/usr/local/bin/master_ip_failovermaster_ip_online_change_script=/usr/local/bin/master_ip_online_changepassword=managerremote_workdir=/tmprepl_password=123repl_user=myslavesecondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.220.140 -s 192.168.220.136shutdown_script=""ssh_user=rootuser=mha[server1]hostname=192.168.220.131port=3306[server2]candidate_master=1hostname=192.168.220.140check_repl_delay=0port=3306[server3]hostname=192.168.220.136port=3306
(7)测试 ssh 无密码认证,如果正常最后都会输出 successful:
masterha_check_ssh -conf=/etc/masterha/app1.cnf
masterha_check_repl -conf=/etc/masterha/app1.cnf //检查健康状态
(8)注意:第一次配置需要去 master 上手动开启虚拟 IP
/sbin/ifconfig ens33:1 192.168.220.100/24
第六步:启动 MHA
(1)启动 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 &
(2)查看 MHA 状态,可以看到当前的 master 是 mysql1 节点:
masterha_check_status --conf=/etc/masterha/app1.cnf
(3)故障模拟:
1、首先启用监控观察日志记录:
tailf /var/log/masterha/app1/manager.log
2、现在在主库上关闭mysql 服务:
pkill -9 mysql
可以看到从库的状态,vip会切换到其中之一的从库上:
此时,客户机也可以通过虚拟ip,连接上数据库:
mysql -h 192.168.220.100 -u root -p
比如,现在在数据库内创建一个新库:
1、我们可以在成为新主库的第一台从服务器上,看见这个创建的新库:
2、同时由于主从同步部署的原因,第二台从服务器上也可以看见这个新库:
服务
服务器
配置
数据
故障
密码
数据库
节点
切换
日志
同步
二进制
脚本
输入
主从
认证
目录
组件
软件
事件
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
天津云度互联网科技
无锡微信软件开发团队
科技互联网企业文化墙
微信小程序连接数据库没有
医院无线网络安全
网络安全与政治的联系
服务器网络管理口
数据库主键 索引 外键
网络安全师需要了解什么
软件开发工程通过湖南岚鸿
软件开发版权所有权
国三网络技术考试大纲
服务器tcp和udp有什么区别
it网站学习软件开发
程序软件开发性价比出众
江苏省网络安全感调查
简述iso网络安全体系结构
mac管理ftp服务器
信保汇通互联网科技招兼职
开启数据库追踪的步骤
软件开发公司在哪能看到
软件开发出差多吗
创建数据库student表
个人ftp服务器
网络安全 会议讲话
免费直播服务器软件
网络安全主题教育活动简报幼儿园
程大软件开发
征文网络安全500
数据库堡垒机