旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

基于MySQL数据库,谈MySQL高可用运维【MySQL教程】,mysql高可用运维

作者:搜教程发布时间:2019-12-01分类:MySQL教程浏览:63评论:0


导读:本篇文章将引见MySQL的别的一种高可用完成计划,即:MHA(MasterHighAvaliable)。MasterHA。是一个开源的高可用顺序,为MySQL的主从架构供应了...
本篇文章将引见MySQL的别的一种高可用完成计划,即:MHA(Master High Avaliable)。Master HA。是一个开源的高可用顺序,为MySQL的主从架构供应了毛病自动恢复的功用。

一、基本知识引见

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网别的相干文章!

标签:mysql高可用运维


欢迎 发表评论: