MySQL高可用实战(MHA)
一、环境准备
IP
主机名
角色
OS
192。168。182。110
local168182110
mysqlmaster、MHAmanager、MHAnode
Centos7
192。168。182。111
local168182111
mysqlslave1、MHAnode
Centos7
192。168。182。112
local168182112
mysqlslave2、MHAnode
Centos7
【温馨提示】MHAmanager最好是单独一台机器部署,尽量不要混部。1、配置hosts192。168。182。110local168182110192。168。182。111local168182111192。168。182。112local1681821122、关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld3、禁用SELinux临时关闭;关闭swap主要是为了性能考虑swapoffa可以通过这个命令查看swap是否关闭了free永久关闭sedris。swap。etcfstab4、关闭swap临时关闭;关闭swap主要是为了性能考虑swapoffa可以通过这个命令查看swap是否关闭了free永久关闭sedris。swap。etcfstab5、配置互信sshkeygensshcopyidlocal168182110sshcopyidlocal168182111sshcopyidlocal168182112二、mysql主从部署1)安装mysql(MySQL5。7。24)添加mysqlserver源mkdirpoptmysqlmha;cdoptmysqlmhawgethttps:dev。mysql。comgetmysql80communityreleaseel73。noarch。rpmrpmivhmysql80communityreleaseel73。noarch。rpm解决报错如,CheckthatthecorrectkeyURLsareconfiguredforthisrepository。rpmimporthttp:repo。mysql。comRPMGPGKEYmysql2022更新yum缓存yummakecache使用yum查看MySQL的仓库,查看MySQL的版本yumrepolistallgrepmysql安装yumconfigmanageryumyinstallyumutils修改为需要的版本,即禁用yum存储库中mysql不需要的版本和开启需要的版本yumconfigmanagerdisablemysql80communityyumconfigmanagerenablemysql57community先禁用本地的MySQL模块,要不然找不到mysqlcommunityserver,默认mysqlserver是8。0的版本yummoduledisablemysql开始安装mysqlserver和mysqlclientyuminstallmysqlcommunityservermysqly2)mysql节点配置1、修改配置文件
修改mysql的所有节点mysql的主配置文件(etcmy。cnf)
Master节点serverid1logbinmysqlbinbinlogformatmixedlogslaveupdatestrue
Slave1,Slave2节点serverid2(slave3节点,则serverid3。三台节点serverid不可重复)logbinmysqlbinrelaylogrelaylogbinrelaylogindexslaverelaybin。index3、启动服务systemctlstartmysqld5、设置root密码默认密码greptemporarypasswordvarlogmysqld。logmysqlurootp重置root密码setglobalvalidatepasswordpolicy0;setglobalvalidatepasswordlength1;ALTERuserrootlocalhostIDENTIFIEDBY123456;3)配置mysql一主两从1、所有数据库节点进行mysql授权登录客户端mysqlurootp123456setglobalvalidatepasswordpolicy0;setglobalvalidatepasswordlength1;从库进行同步使用的用户grantreplicationslaveon。tomyslave192。168。182。identifiedby123456;MHAmanager使用grantallon。tomha192。168。182。identifiedby123456;防止从库通过主机名连接不上主库grantallon。tomhalocal168182110identifiedby123456;grantallon。tomhalocal168182111identifiedby123456;grantallon。tomhalocal168182112identifiedby123456;FLUSHPRIVILEGES;2、在主库查看二进制文件和偏移量(master节点)mysqlshowmasterstatus;
3、slave1,slave2执行同步操作changemastertomasterhost192。168。182。110,masterusermyslave,masterpassword123456,masterlogfilemysqlbin。000002,masterlogpos1875;startslave;两个slave节点都需要IO线程和SQL线程为yes状态showslavestatusG。。。。。。。。。。。SlaveIORunning:YesSlaveSQLRunning:Yes。。。。。。。。。
4、两个从库都设置为只读模式通过全局变量readonly设置。设置值为1,或者on,表示开启。设置值为0或者off,表示关闭mysqlsetglobalreadonly1;showglobalvariableslikereadonly;【注意】得退出客户端再登录才会生效4)测试主从插入数据测试主从同步在master节点添加数据createdatabasetest01;createtabletest01。test(idint);insertintotest01。testvalues(1);在slave节点查数据selectfromtest01。test;三、MHA概述
MHA(MasterHighAvailability)是由日本人yoshinorim开发的一款成熟且开源的MySQL高可用程序,它实现了MySQL主从环境下MASTER宕机后能够自动进行单次故障转移的功能,其本身由perl语言编写,安装方便使用简单。
MHA官网:https:code。google。comarchivepmysqlmasterha
GitHub地址:https:github。comyoshinorimmha4mysqlmanager
文档:https:github。comyoshinorimmha4mysqlmanagerwiki四、MHA架构
当一个master崩溃时,MHA会恢复下面的restslave。
五、MHA组件
MHA由MHAManager和MHANode组成,如下所示:
MHAManager有监控MySQLmaster、控制master故障转移等管理程序。MHA节点具有故障转移辅助脚本,例如解析MySQL二进制中继日志,识别中继日志位置,中继日志应从哪个位置应用到其他从站,将事件应用到目标从站等。MHA节点在每个MySQL服务器上运行。当MHAManager进行故障转移时,MHAManager通过SSH连接MHANode并在需要时执行MHANode命令。六、安装MHA软件
下载地址:https:github。comyoshinorimmha4mysqlmanagerwikiDownloads1)所有节点安装MHAnode软件
下载地址:https:github。comyoshinorimmha4mysqlnodereleasestagv0。58cdoptmysqlmha注意,所有节点都需要安装MHAnode1、先安装相关依赖:yuminstallperlDBDMySQLy下载wgethttps:github。comyoshinorimmha4mysqlnodereleasesdownloadv0。58mha4mysqlnode0。580。el7。centos。noarch。rpm2、安装mha:rpmivhmha4mysqlnode0。580。el7。centos。noarch。rpm也可以使用下面方式安装yuminstallymha4mysqlnode0。580。el7。centos。noarch。rpm2)安装mhamanager(110节点上)1、安装mhamanager先安装好依赖yumyinstallepelreleaseyumyinstallperlConfigTinyperlTimeHiResperlParallelForkManagerperlLogDispatchperlDBDMySQLncftphttps:github。comyoshinorimmha4mysqlmanagerreleasestagv0。58wgethttps:github。comyoshinorimmha4mysqlmanagerreleasesdownloadv0。58mha4mysqlmanager0。580。el7。centos。noarch。rpm安装rpmivhmha4mysqlmanager0。580。el7。centos。noarch。rpm2、编写masteripfailover脚本
optmysqlmhamasteripfailover,下面配置文件中会用到!usrbinenvperlusestrict;usewarningsFATALall;useGetopt::Long;my(command,origmasterhost,origmasterip,sshuser,origmasterport,newmasterhost,newmasterip,newmasterport,origmastersshport,newmastersshport,newmasteruser,newmasterpassword);这里定义的虚拟IP配置要注意,这个ip必须要与你自己的集群在同一个网段,否则无效myvip192。168。182。20124;mykey1;这里的网卡名称ens33需要根据你机器的网卡名称进行修改如果多台机器直接的网卡名称不统一,有两种方式,一个是改脚本,二是把网卡名称修改成统一我这边实际情况是修改成统一的网卡名称mysshstartvipsudosbinifconfigens33:keyvip;mysshstopvipsudosbinifconfigens33:keydown;mysshBcastarpsudosbinarpingIbond0c3Avip;GetOptions(commandscommand,sshuserssshuser,origmasterhostsorigmasterhost,origmasteripsorigmasterip,origmasterportiorigmasterport,origmastersshportiorigmastersshport,newmasterhostsnewmasterhost,newmasteripsnewmasterip,newmasterportinewmasterport,newmastersshportnewmastersshport,newmasterusernewmasteruser,newmasterpasswordnewmasterpassword);exitmain();submain{sshuserdefinedsshuser?sshuser:root;printINSCRIPTTESTsshusersshstopvipsshusersshstartvip;if(commandeqstopcommandeqstopssh){myexitcode1;eval{printDisablingtheVIPonoldmaster:origmasterhost;stopvip();exitcode0;};if(){warnGotError:;exitexitcode;}exitexitcode;}elsif(commandeqstart){myexitcode10;eval{printEnablingtheVIPviponthenewmasternewmasterhost;startvip();startarp();exitcode0;};if(){warn;exitexitcode;}exitexitcode;}elsif(commandeqstatus){printCheckingtheStatusofthescript。。OK;exit0;}else{usage();exit1;}}substartvip(){sshsshusernewmasterhostsshstartvip;}substopvip(){sshsshuserorigmasterhostsshstopvip;}substartarp(){sshsshusernewmasterhostsshBcastarp;}subusage{printUsage:masteripfailovercommandstartstopstopsshstatussshuseruserorigmasterhosthostorigmasteripiporigmasterportportnewmasterhosthostnewmasteripipnewmasterportport;}
给该脚本添加可执行权限:chmodaxoptmysqlmhamasteripfailover3、配置(manager节点)创建相关目录(所有节点)mkdirpoptmysqlmhamhanodemanager节点mkdirpoptmysqlmhamha编写配置文件vimoptmysqlmhamysqlmha。cnf内容如下:〔serverdefault〕mha访问数据库的账号与密码usermhapassword123456port3306指定mha的工作目录managerworkdiroptmysqlmhamha指定管理ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a路径managerlogoptmysqlmhamanager。log指定master节点存放binlog的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件的目录logbinmysqlbin默认是在varlibmysqlmasterbinlogdirvarlibmysql指定mha在远程节点上的工作目录remoteworkdiroptmysqlmhamhanode指定主从复制的mysq用户和密码replusermyslavereplpassword123456指定检测间隔时间pinginterval1指定一个脚本,该脚本实现了在主从切换之后,将虚拟ip漂移到新的master上masteripfailoverscriptoptmysqlmhamasteripfailover指定检查的从服务器IP地址。有几个,就用s选项加几个secondarycheckscriptusrbinmasterhasecondarychecks192。168。182。111s192。168。182。112用于故障切换的时候发送邮件提醒reportscriptdata1mysqlmhasendmail〔server1〕hostname192。168。182。110port3306sshuserrootcandidatemaster1checkrepldelay0〔server2〕hostname192。168。182。111port3306sshuserrootcandidatemaster1checkrepldelay0〔server3〕hostname192。168。182。112port3306sshuserrootcandidatemaster1checkrepldelay0
candidatemaster1
设置为候选master,设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个从库不是集群中最新的slave,nomaster1正好相反
checkrepldelay0
默认情况下如果一个slave落后master超过100M的relaylogs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间;通过设置checkrepldelay0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidatemaster1的主机非常有用,因为这个候选主在切换的过程中一定是新的master5)在master上手动启动虚拟iP
第一次配置需要在master节点上手动启动虚拟IP,标签要和masteripfaioverl配置文件中mykey1;一样sbinifconfigens33:1192。168。182。201246)在manager节点测试ssh无密认证masterhachecksshconfoptmysqlmhamysqlmha。cnf
7)在manager节点上测试mysql主从情况masterhacheckreplconfoptmysqlmhamysqlmha。cnf
8)在manage上启动mhanohupmasterhamanagerconfoptmysqlmhamysqlmha。cnfremovedeadmasterconfignorelastfailoverdevnullvarlogmhamanager。log21removedeadmasterconf:该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。mangerlog:日志存放位置。ignorelastfailover:在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免pingpong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志记目录,也就是上面设置的日志app1。failover。complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为ignorelastfailover。9)查看MHA状态masterhacheckstatusconfoptmysqlmhamysqlmha。cnf
10)查看MHA日志文件catoptmysqlmhamanager。loggrepcurrentmaster11)manager节点关闭manager服务masterhastopconfoptmysqlmhamysqlmha。cnf七、故障模拟与恢复1)停掉mysqlmastersystemctlstopmysqld2)查看主备节点查看虚拟ipipa
登录mysql查看主从关系mysqlurootp123456发现111这个节点已经变成主节点了
3)故障恢复
先在当前的主库服务器slave1上查看二进制日志和同步点mysqlurootp123456showmasterstatus;
再在原master服务器上执行同步操作先恢复mysql服务systemctlstartmysqldmysqlurootp123456指向新的master节点进行同步changemastertomasterhost192。168。182。111,masterusermyslave,masterpassword123456,masterlogfilemysqlbin。000003,masterlogpos1948;startslave;这里需要过一段时间再看同步状态showslavestatusG
MySQL高可用实战就到这了,有疑问的小伙伴欢迎给我留言哦