一、基本知识引见
1、MHA定义
Master HA。是一个开源的高可用顺序,为MySQL的主从架构供应了毛病自动恢复的功用。主从复制时期,当MHA监测到MySQL的Master节点毛病时,会自动提拔复制集群中的某个Slave节点成为新的Master节点。在切换时期,也会经由历程从其他节点中猎取分外信息来防止数据一致性题目。除此之外,MHA还供应了master节点的在线毛病切换功用,可以依据须要来切换Master/Slave节点。
2、MHA构造
MHA中的一切节点主要有两种角色,即:治理节点和数据节点。
治理节点(MHA Manager):平常零丁布置在一台机械上,用来治理多个master和slave集群,而每一个master和slave构成的集群称之为一个application。
数据节点(MHA Node):运转在每一台MySQL效劳器上,经由历程监控具有剖析和清算logs功用的脚原本加快节点的毛病转移。
3、HMA组件
(1)Manager组件
masterha_check_sh: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效劳的东西
(2)Node组件
save_binary_logs:保留和赋值master的二进制日记 apply_diff_relay_logs:辨认差别的中继日记并应用于其他slave filter_mysqlbinlog:去除不必要的ROLLBACK事宜(MHA已不再运用这个东西) purge_relay_logs:消灭中继日记(不会壅塞SQL线程)
(3)自定义扩大
secondary_check_script:经由历程多条收集路由监测master的可用性 master_ip_failover_script:更新application运用的masterip shutdown_script:强迫封闭master节点 report_script:发送报告 init_conf_load_script:加载初始设置参数 master_ip_online_change_script:更新master节点ip地点
二、MHA搭建
1、环境预备
操纵系统:CentOS6.9_X86_64
MySQL版本:MySQL5.6.39通用二进制
效劳器计划:
主节点Master:192.168.199.104(mysql-master,master)
从节点1:192.168.199.105(mysql-slave01,slave01)
从节点2:192.168.199.106(mysql-slave02,slave02)
治理节点:192.168.199.107(mysql-manager,manager)
2、搭建
(1)设置各个节点的host,在背面运用起来会比较轻易,不必每次手写IP
[root@mysql-master ~]# vim /etc/hosts #增加以下内容: 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.199.104 mysql-master master 192.168.199.105 mysql-slave01 slave01 192.168.199.106 mysql-slave02 slave02 192.168.199.107 mysql-manager manager
(2)将设置好的host文件复制到其他三个节点上
[root@mysql-master ~]# scp /etc/hosts slave01:/etc/ [root@mysql-master ~]# scp /etc/hosts slave02:/etc/ [root@mysql-master ~]# scp /etc/hosts manager:/etc/
(3)设置主从同步,slave01和slave02为master的从库
开启master的二进制日记
[root@mysql-master ~]# vim /etc/my.cnf #在[mysqld]下面增加以下内容: server-id = 104 skip-name-resolve log_bin=/mysql_data/mysql-bin log_bin_index=/mysql_data/mysql-bin.index binlog_format = mixed
在master上检察当前的二进制日记点位置,并建立复制账户
[root@mysql-master ~]# mysql -uroot –proot #检察当前二进制日记点的位置 mysql> SHOW MASTER STATUS \G *************************** 1. row *************************** File: mysql-bin.000090 Position: 120 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec) #建立从库的复制账户 mysql> GRANT REPLICATION SLAVE ,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.199.%' IDENTIFIED BY 'repl'; #革新权限 mysql> FLUSH PRIVILEGES;
在slave01上开启二进制日记和中继日记,并设置为master的从库
[root@mysql-slave01 ~]# vim /etc/my.cnf #在[mysqld]下增加以下内容: server-id = 105 log_bin = /mysql_data/mysql-bin log_bin_index = /mysql_data/mysql-bin.index relay_log = /mysql_data/mysql-relay relay_log_index = /mysql_data/mysql-relay.index read_only relay_log_purge = 0
参数诠释:
relay_log_purge:该参数示意不自动清算中继日记,因为MHA须要依据slave的中继日记推断slave同步master的binlog到什么位置了 read_only:示意是只读,MHA须要依据这个参数来辨认主从库 bin_log:开启从库的二进制日记,因为在主节点涌现毛病时,须要将个中某个从库提拔为主库,所以须要开启从库的二进制日记
启动slave01节点,并将须要同步的主节点信息指向master节点:
[root@mysql-slave01 ~]# service mysqld restart [root@mysql-slave01 ~]# mysql -uroot –proot #运用change master敕令将主库指向master节点 mysql> CHANGE MASTER TO MASTER_HOST = '192.168.199.104',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000090',MASTER_LOG_POS=120; mysql> START SLAVE; #检察是不是同步胜利 mysql> SHOW SLAVE STATUS \G 看到以下信息示意同步胜利: Slave_IO_Running: Yes Slave_SQL_Running: Yes
以一样的体式格局设置第二台从库,可以直接将slave01上的设置文件直接复制到第二台slave上,然后修正即可。
[root@mysql-slave01 ~]# scp /etc/my.cnf slave02:/etc/ [root@mysql-slave02 ~]# vim /etc/my.cnf #修正server-id即可: server-id = 106
修正完成以后,保留退出,并重启mysql,然后设置slave02为master的从库
[root@mysql-slave02 ~]# mysql -uroot –proot mysql> CHANGE MASTER TO MASTER_HOST = '192.168.199.104',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000090',MASTER_LOG_POS=120; mysql> START SLAVE; #检察是不是同步胜利 mysql> SHOW SLAVE STATUS \G 看到以下信息示意同步胜利: Slave_IO_Running: Yes Slave_SQL_Running: Yes
(4)建立具有治理权限的用户账号
#在主节点master上建立治理账号,使其可以同步到其他连个从节点,注重:这个治理账号须要可以长途衔接MySQL mysql> GRANT ALL ON *.* TO 'mha'@'192.168.199.%' IDENTIFIED BY 'mha'; mysql> FLUSH PRIVILEGES;
(5)因为MHA架构须要各个节点之间可以举行互信通讯,所以须要将各个节点之间设置为无秘钥登录,因为节点比较多,单个生成并复制比较贫苦,可以在主节点上生成秘钥对,然后让每一个主机都具有一样的私钥
#在master上生成秘钥对 [root@mysql-master ~]# ssh-keygen -t rsa -P '' #起首保留到本机的秘钥文件中,使得本机可以无秘钥运用ssh体式格局上岸本机 [root@mysql-master ~]# cat .ssh/id_rsa.pub >> .ssh/authorized_keys #运用ssh上岸本机测试,发明可以无暗码上岸 [root@mysql-master ~]# ssh 192.168.199.104 #修正authorized_keys文件的权限,只能属主检察,同组用户和其他用户不可检察 [root@mysql-master ~]# chmod go= .ssh/authorized_keys
将秘钥对和私钥文件复制到其他三个节点上,注重:保证其原有的权限
[root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys slave01:/root/.ssh/ [root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys slave02:/root/.ssh/ [root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys manager:/root/.ssh/ #测试无暗码上岸,在主节点上实行以下敕令,检察slave01节点的ip地点 [root@mysql-master ~]# ssh slave01 'ifconfig eth0' #可以检察到slave01的ip地点示意无秘钥上岸设置胜利,其他俩节点可以自身考证
(6)下载mha4mysql-manager和mha4mysql-node装置包
此处运用的软件包版本以下:
治理节点:mha4mysql-manager-0.56.tar.gz 数据节点:mha4mysql-node-0.56.tar.gz
(7)设置epel,因为mha4mysql有的包是来自于base中,有的包是来自于epel中
[root@mysql-master ~]# rpm –ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
(8)解压,并运用perl敕令实行Makefile.PL剧本
[root@mysql-master ~]# tar xf mha4mysql-manager-0.56.tar.gz [root@mysql-master ~]# cd mha4mysql-manager-0.56 [root@mysql-master mha4mysql-manager-0.56]# perl Makefile.PL
注重:实行Makefile.PL历程当中,假如涌现类似于以下的毛病,则须要装置perl顺序所依靠的库文件:
Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install/Makefile.pm line 4. BEGIN failed--compilation aborted at inc/Module/Install/Makefile.pm line 4
涌现上述毛病,则须要装置依靠:
[root@mysql-master ~]# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker cpan perl-Time-HiRes perl-DBI perl-DBD-MySQL
(9)确保”perl MakeFile.PL”准确实行以后,运用make敕令完成装置。注:可以运用”echo $?”检察上此敕令的实行效果来推断上条敕令是不是准确实行完成。一般0代表准确完成。
[root@mysql-master mha4mysql-manager-0.56]# make [root@mysql-master mha4mysql-manager-0.56]# make install
(10)master上的manager装置完成以后,依据一样的体式格局编译装置mha4mysql-node
[root@mysql-manager ~]# tar xf mha4mysql-node-0.56.tar.gz [root@mysql-manager ~]# cd mha4mysql-node-0.56 [root@mysql-manager mha4mysql-node-0.56]# perl Makefile.PL #推断Makefile.PL是不是一般实行完成 [root@mysql-manager mha4mysql-node-0.56]# echo $? 0 [root@mysql-manager mha4mysql-node-0.56]# make && make install
(11)在其他三台效劳器上(master,slave01,slave02)上装置mha4mysql-node
[root@mysql-slave01 ~]# tar mha4mysql-node-0.56.tar.gz [root@mysql-slave01 ~]# cd mha4mysql-node-0.56 [root@mysql-slave01 mha4mysql-node-0.56]# perl Makefile.PL [root@mysql-slave01 mha4mysql-node-0.56]# make && make install
其他两个节点装置体式格局雷同,此处略。
(12)装置完成,可以看到在/usr/local/bin下有一些剧本,就是mha4mysql生成的剧本文件
(13)初始化MHA
编辑mha的设置文件,主要有以下两类:
global设置:为各个application供应默许设置
application设置:用来指定有哪些效劳器
#建立目次并编辑设置文件 [root@mysql-manager ~]# mkdir -pv /etc/masterha/ [root@mysql-manager ~]# vim /etc/masterha/app01.conf
写入以下内容:
[server default] user=mha #治理用户的用户名 password=mha #治理用户暗码 manager_workdir=/data/masterha/app01 #manager节点的事情目次,用来寄存一些二进制日记,不存在会自动建立 manager_log=/data/masterha/app01/manager.log #日记文件位置 remote_workdir=/data/masterha/app01 #长途的每一个节点的事情目次,没有会自动生成 ssh_user=root #须要运用ssh来完成一些治理操纵 repl_user=repl #具有复制权限的用户名 repl_password=repl #具有复制权限的暗码 ping_interval=1 #每隔多长时间监测一次主节点是不是在线,心跳信息监测 #其他主机 [server1] hostname=192.168.199.104 #ssh_port=3306 #假如MySQL没有运用默许端口号,则此处须要指定,运用默许端口不须要指定 candidate_master=1 #示意该节点是不是在主节点毛病以后介入成为主节点 master_binlog_dir=/mysql_data/ #指定mysql的binlog日记途径 [server2] hostname=192.168.199.105 candidate_master=1 master_binlog_dir=/mysql_data/ [server3] hostname=192.168.199.106 #no_master=1 #示意主节点毛病以后,该节点不介入成为主节点 master_binlog_dir=/mysql_data/
(14)搜检各个节点之间的通讯是不是一般
[root@mysql-manager ~]# masterha_check_ssh --conf=/etc/masterha/app01.conf
毛病1:Can't locate Config/Tiny.pm in @INC (@INC contains:XXX
缘由:这类毛病是因为缺乏依靠包
处理办法:装置提醒的依靠包
以下的几个rpm包假如操纵系统自身没有自带,须要自身从网上下载,可以从
http://rpmfind.net/ 下载所须要的rpm包。以下的rpm包都是针对CentOS6.9 X86_64的:
perl-Mail-Sender-0.8.16-3.el6.noarch.rpm perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm perl-Config-Tiny-2.12-7.1.el6.noarch.rpm
下载完成以后,运用yum敕令装置即可,因为个中能够还会依靠其他包。
毛病2:master_check_ssh实行中的毛病:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
缘由:/root/.ssh/下的文件内容不一样或许文件的权限有题目,我碰到的是文件内容有题目。
处理办法:从新将其他主机上的秘钥对和私钥拷贝一份就一般了。
(15)搜检主从复制环境是不是一般
[root@mysql-manager ~]# masterha_check_repl --conf=/etc/masterha/app01.conf
毛病1:
Sat Jun 2 03:07:26 2018 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln301] install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 27) line 3. Perhaps the DBD::mysql perl module hasn't been fully installed, or perhaps the capitalisation of 'mysql' isn't right.
缘由:缺乏perl-DBD-MySQL依靠库
处理办法:
[root@mysql-manager ~]# yum install -y perl-DBD-MySQL*
毛病2:
Sat Jun 2 03:11:06 2018 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln188] There is no alive server. We can't do failover
毛病3:
Failed to save binary log: Binlog not found from /var/lib/mysql,/var/log/mysql! If you got this error at MHA Manager, please set "master_binlog_dir=/path/to/binlog_directory_of_the_master
缘由:mysql的binlog日记目次没有在默许的/var/log/mysql下,而是在其他处所,致使目次找不到。
处理办法:在manager节点的设置文件中每一个节点下制订二进制日记的目次途径。
[server1] hostname=192.168.199.105 candidate_master=1 master_binlog_dir=/mysql_data/ #指定二进制日记文件目次
毛病4:
Can't exec "mysqlbinlog": No such file or directory at /usr/local/share/perl5/MHA/BinlogManager.pm line 106. mysqlbinlog version command failed with rc 1:0, please verify PATH, LD_LIBRARY_PATH, and client options
缘由:运用ssh衔接以后找不到mysqlbinlog敕令
处理办法:将/usr/local/mysql-5.6.39/目次衔接到/usr/bin下
[root@mysql-master ~]# ln –s /usr/local/mysql-5.6.39/bin /usr/bin [root@mysql-slave01 ~]# ln –s /usr/local/mysql-5.6.39/bin /usr/bin [root@mysql-slave02 ~]# ln –s /usr/local/mysql-5.6.39/bin /usr/bin
(16)启动MHA
#前台启动,日记会直接打印在掌握台上 [root@mysql-manager app01]# masterha_manager --conf=/etc/masterha/app01.conf #背景启动 [root@mysql-manager app01]# nohup masterha_manager --conf=/etc/masterha/app01.conf &
(17)考证高可用毛病自动转移
#住手master节点的mysqld效劳 [root@mysql-master ~]# killall mysqld mysqld_safe #检察本来的两个slave节点信息,发明已有slave01被提拔为master了 mysql> SHOW SLAVE STATUS \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.199.105 Master_User: repl ... #检察slave01的read_only属性,发明已被修正为OFF了 mysql> SHOW VARIABLES LIKE 'read_only'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | read_only | OFF | +---------------+-------+
注重:当某一个master毛病以后,从库提拔为主库,本来的manager节点上的manager效劳会自动退出。须要手动重启。
(18)毛病的效劳器再次恢复时,须要运用”CHANGE MASTER”敕令手动将其加入到从节点中
(19)manager节点启动以后,可以运用masterha_check_status敕令检察当前的主节点状况信息
[root@mysql-manager ~]# masterha_check_status --conf=/etc/masterha/app01.conf app01 (pid:20582) is running(0:PING_OK), master:192.168.199.105
MHA的其他用法,如在线主从切换等,可以自行参考官方文档,此处不再引见。别的另有MHA的manager节点的自动重启功用,报警功用,毛病主机完全摘除功用等可以经由历程shell剧本完成,背面有时间会继承引见。
至此,MySQL的MHA高可用基本功用搭建完成。全部历程当中有无数的坑,能够读者在搭建历程当中,还会碰到其他的深坑,最好可以硬着头皮一个一个去处理!篇幅较长,一切内容都是经由考证一个字一个字敲上去的,但也不免有笔误,若有毛病,迎接在下方批评指出!
相干引荐:
运维角度浅谈MySQL数据库优化
运维角度浅谈MySQL数据库优化(李振良)
以上就是基于MySQL数据库,谈MySQL高可用运维的细致内容,更多请关注ki4网别的相干文章!