基于MHA的MySQL的高可用详细总结文档.docx
《基于MHA的MySQL的高可用详细总结文档.docx》由会员分享,可在线阅读,更多相关《基于MHA的MySQL的高可用详细总结文档.docx(42页珍藏版)》请在冰点文库上搜索。
基于MHA的MySQL的高可用详细总结文档
文件版本:
文件编号:
R&D0008
发布日期:
2016-08-10
编制:
xxx
审批:
MySQLMHA文档总结
xxx版权所有
修订记录
版本号
发布日期
拟制人
修订描述
2016-08-10
xxx
首次发布
MySQLMHA
◆MySQLMHA介绍
实现原理:
MHA是由日本Mysql专家用Perl写的一套Mysql故障切换方案以保障数据库的高可用性,它的功能是能在0-30s之内实现主Mysql故障转移(failover),MHA故障转移能够专门好的帮咱们解决从库数据的一致性问题,同时最大化挽回故障发生后的数据。
MHA里有两个角色一个是node节点一个是manager节点,要实现那个MHA,必需最少要三台数据库服务器,一主多备,即一台充当master,一台充当master的备份机,另外一台是从属机,那个地址实验为了实现更好的成效利用四台机械,需要说明的是一旦主服务器宕机,备份机即开始充当master提供服务,若是主服务器上线也可不能再成为master了,因为若是如此数据库的一致性就被改变了。
该软件由两部份组成:
MHAManager(治理节点)和MHANode(数据节点)。
MHAManager能够单独部署在一台独立的机械上治理多个master-slave集群,也能够部署在一台slave节点上。
MHANode运行在每台MySQL服务器上,MHAManager会按时探测集群中的master节点,当master显现故障时,它能够自动将最新数据的slave提升为新的master,然后将所有其他的slave从头指向新的master。
整个故障转移进程对应用程序完全透明。
在MHA自动故障切换进程中,MHA试图从宕机的主服务器上保留二进制日记,最大程度的保证数据的不丢失,但这并非老是可行的。
例如,若是主服务器硬件故障或无法通过ssh访问,MHA无法保留二进制日记,只进行故障转移而丢失了最新的数据。
利用MySQL的半同步复制,能够大大降低数据丢失的风险。
MHA能够与半同步复制结合起来。
若是只有一个slave已经收到了最新的二进制日记,MHA能够将最新的二进制日记应用于其他所有的slave服务器上,因此能够保证所有节点的数据一致性。
目前MHA要紧支持一主多从的架构,要搭建MHA,要求一个复制集群中必需最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器,出于机械本钱的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。
官方介绍:
注意:
不能够访问google的时候,请利用翻墙或修改hosts文件以下我提供一个hosts文件。
将hosts文件内容拷贝到C:
\Windows\System32\drivers\etc\hosts中粘贴到文件最后面保留即可,正常访问google。
◆操作流程步骤
1.第一要保证虚拟性能够上网,那个地址我利用公司电信云平台的四台vmware的虚拟机
2.关闭selinux和配置IP地址和本地source源
3.配置epel源(在线安装需要)
4.配置ssh公钥免登录环境
5.修改hostname
6.配置hosts文件
7.配置Mysql的主从同步关系并通过grant命令赋权
8.安装node包
9.在治理机安装manager包
10.编辑主配置文件
11.测试及排错
12.启动
◆拓扑图演变
主mysql宕机以后架构变成一主一从,
1.从宕机崩溃的master保留二进制日记事件(binlogevents);
2.识别含有最新更新的slave;
3.应用不同的中继日记(relaylog)到其他的slave;
4.应用从master保留的二进制日记事件(binlogevents);
5.提升一个slave为新的master;
6.使其他的slave连接新的master进行复制;
◆MHA软件包说明
MHA软件由两部份组成,Manager工具包和Node工具包,具体的说明如下。
vManager工具包
要紧包括以下几个工具:
1.masterha_check_ssh检查MHA的SSH配置状况
2.masterha_check_repl检查MySQL复制状况
3.masterha_manger启动MHA
4.masterha_check_status检测当前MHA运行状态
5.masterha_master_monitor检测master是不是宕机
6.masterha_master_switch操纵故障转移(自动或手动)
7.masterha_conf_host添加或删除配置的server信息
vNode工具包
这些工具通常由MHAManager的脚本触发,无需人为操作)要紧包括以下几个工具:
save_binary_logs保留和复制master的二进制日记
apply_diff_relay_logs识别不同的中继日记事件并将其不同的事件应用于其他的slave
filter_mysqlbinlog去除没必要要的ROLLBACK事件(MHA已再也不利用那个工具)
purge_relay_logs清除中继日记(可不能阻塞SQL线程)
注意:
为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL的半同步复制。
关于半同步复制原理列位自己进行查阅。
(不是必需)
◆实验环境
利用电信云主机。
详细情形:
一、操作系统版本
UbuntuLTS\n\l
二、操作系统位数
x86_64,64位操作系统
3、操作系统内核
Linuxmastersql#36-UbuntuSMPTueApr1020:
39:
51UTC2012x86_64x86_64x86_64GNU/Linux
4、云主机情形
角色
Ip地址
主机名
Server_id
类型
Monitorhost
监控复制组
Master
写入
Candicatemaster
读
Slave
读
其中master对外提供写服务,备选master(实际的slave,主机名slavesql2)提供读服务,slave也提供相关的读服务,一旦master宕机,将会把备选master提升为新的master,slave指向新的master。
上面和下面所有的命令最好都利用root用户执行,我曾经利用非root用户,最后发觉很烦,另ubuntu默许root是不能够ssh登岸的,要先:
passwdroot给root添加密码,如此root就能够够ssh登岸了。
◆成立ssh无密码登录环境
vmanager公约操作
root@manager:
ssh-keygen
Generatingpublic/privatersakeypair.
Enterfileinwhichtosavethekey(/root/.ssh/id_rsa):
Enterpassphrase(emptyfornopassphrase):
Entersamepassphraseagain:
Youridentificationhasbeensavedin/root/.ssh/id_rsa.
Yourpublickeyhasbeensavedin/root/.ssh/.
Thekeyfingerprintis:
20:
a3:
4a:
e2:
1f:
c4:
4c:
9a:
90:
8f:
00:
c4:
26:
36:
aa:
81root@iZ28i9mza1uZ
Thekey'srandomartimageis:
+--[RSA2048]----+
|+.|
|o*|
|X..o.|
|Eo*.o.|
|+=o+S|
|=..|
|...|
|..|
|.|
+-----------------+
然后在/root/.ssh/.下面会新建两个文件id_rsa(私钥)和(私钥)。
拷贝公约到其他三台机械:
root@manager:
ssh-copy-id-i.ssh/
#什么缘故要在本机也要设置呢,因为manager节点安装在这上面,如不设置在下面ssh检查时会通只是。
root@manager:
ssh-copy-id-i.ssh/
root@manager:
ssh-copy-id-i.ssh/
root@manager:
ssh-copy-id-i.ssh/
进程示用意(因其进程都一样,故只示范)
v主mysql公约操作
ssh-keygen-trsa
ssh-copy-id-i.ssh/
ssh-copy-id-i.ssh/
ssh-copy-id-i.ssh/
v从mysql1公约操作
ssh-keygen-trsa
ssh-copy-id-i.ssh/
ssh-copy-id-i.ssh/
ssh-copy-id-i.ssh/
v从mysql2公约操作
从mysql2也确实是主mysql宕机以后要充当主mysql的备用主mysql。
ssh-keygen-trsa
ssh-copy-id-i.ssh/
ssh-copy-id-i.ssh/
ssh-copy-id-i.ssh/
v主机名
root@manager:
~#cat/etc/hostname
manager
在不重启的情形下在手动执行一次。
root@localhost:
~#hostnamemanager
root@manager:
~#bash
我只列出manager机械操作步骤,其他机械一样操作设置mastersql,slavesql1,slavesql2
v修改hosts
root@manager:
~#cat/etc/host
hostnamehosts
root@slavesql1:
~#cat/etc/hosts
localhost
ubuntu1
#ThefollowinglinesaredesirableforIPv6capablehosts
:
:
1ip6-localhostip6-loopback
fe00:
:
0ip6-localnet
ff00:
:
0ip6-mcastprefix
ff02:
:
1ip6-allnodes
ff02:
:
2ip6-allrouters
mastersql
slavesql1
slavesql2
manager
添加到hosts文件中,对应各自的ip和主机名
我只列出了manager的主机hosts文件,其他三台机械相同操作修改hosts。
v测试ssh登录
root@manager:
~#sshmastersql
WelcometoUbuntuLTS(GNU/Linuxx86_64)
*Documentation:
SysteminformationasofWedAug1010:
38:
20CST2016
Systemload:
Processes:
83
Usageof/:
%ofUsersloggedin:
1
Memoryusage:
4%IPaddressforeth0:
Swapusage:
0%IPaddressforeth0:
0:
Graphthisdataandmanagethissystematpackagescanbeupdated.
6updatesaresecurityupdates.
Newrelease'LTS'available.
Run'do-release-upgrade'toupgradetoit.
Lastlogin:
WedAug1010:
22:
362016from说明已经无密码登岸了。
root@manager:
~#sshslavesql1
root@manager:
~#sshslavesql2
我只测试了manger无密码登岸到其他三台机械。
其他类似。
安装
◆安装mysql和配置主从关系
v在线安装
root@mastersql:
~#apt-getinstall-ymysql-server
ThefollowingNEWpackageswillbeinstalled:
libdbd-mysql-perllibdbi-perllibhtml-template-perllibmysqlclient16
libnet-daemon-perllibplrpc-perl
mysql-commonmysql-server
0upgraded,12newlyinstalled,0toremoveand1notupgraded.
NeedtogetMBofarchives.
Afterthisoperation,MBofadditionaldiskspacewillbeused.
Doyouwanttocontinue[Y/n]?
现在按下Y
......
【mysqlroot密码设为:
root】
......
v编辑mysql配置文件
root@mastersql:
~#cat/etc/mysql/|grepbind-address
bind-address=#如此就能够够root远程连接mysql
v启动mysql和查询启动状态
Ø启动mysql
root@mastersql:
~#/etc/mysqlstart
Ø查看mysql的启动情形
root@mastersql:
~#psaux|grep-vgrep|grepmysql
mysql2943763444853868?
SslAug090:
13/usr/sbin/mysqld
能够看出mysql进程已经启动,且进pid号为29347。
接着查看mysql的端口号。
Ø查看mysql的端口号
root@mastersql:
~#netstat-lnp|grepmysql
tcp00LISTEN29437/mysqld
unix2[ACC]STREAMLISTENING266276529437/mysqld/var/run/mysqld/
从上面的列表能够看出mysql的默许端口号已经启动。
Ø登岸mysql
root@mastersql:
~#mysql-uroot-proot
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis39
Serverversion:
(Ubuntu)
Copyright(c)2000,2016,Oracleand/oritsaffiliates.Allrightsreserved.
OracleisaregisteredtrademarkofOracleCorporationand/orits
affiliates.Othernamesmaybetrademarksoftheirrespective
owners.
Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.
mysql>showdatabases;
+--------------------+
|Database|
+--------------------+
|information_schema|
|hive|
|mysql|
|networkd|
|performance_schema|
+--------------------+
5rowsinsetsec)
以上单台mysql测试OK。
现在我只在mastersql主机上在线安装了,其他两个主机mysqlsql1和mysqlsql2相同操作安装。
Manager主机不需要安装mysql。
v数据库一致性
在主数据库里导出所有的数据库。
然后导入到两个从数据库,保证做主从之前数据一致。
主数据库之前一直在利用,两个从数据库都是新安装的。
在导出数据库之前必然要锁表,或保证数据库没有利用。
root@mastersql:
mysqldump-uroot-proot--all-databases--lock-tables=false-->/root/
把从主数据中的数据拷贝到两到两台从mysql,且将该导入到这两个从mysql数据库。
root@slavesql1:
mysql-uroot-proot
root@slavesql2:
mysql-uroot-proot
v半同步复制开启
Ømastersql上:
mysql>installpluginrpl_semi_sync_mastersoname'';
mysql>setglobalrpl_semi_sync_master_enabled=1;
mysql>setglobalrpl_semi_sync_master_timeout=1000;
mysql>showglobalstatuslike'rpl%';
为了让mysql在重启时自动加载该功能,在/etc/mysql/加入:
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
Ø备选master(slavesql2)上:
mysql>installpluginrpl_semi_sync_mastersoname'';
mysql>setglobalrpl_semi_sync_master_enabled=1;
mysql>setglobalrpl_semi_sync_master_timeout=1000;
mysql>installpluginrpl_semi_sync_slavesoname'';
mysql>setglobalrpl_semi_sync_slave_enabled=1;
在/etc/mysql/中加入:
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
Øslavesql1上:
mysql>installpluginrpl_semi_sync_slavesoname'';
mysql>setglobalrpl_semi_sync_slave_enabled=1;
在/etc/mysql/中加入:
rpl_semi_sync_slave_enabled=1
在备用节点和从节点的/etc/mysql/中加入选项:
read_only=1
relay_log_purge=0
v配置mysql主从
Ø在master上
root@mastersql:
~#cat/etc/mysql/|greplog_bin
#log_bin=/var/log/mysql/
log_bin=realcloud
修改mysql的主的log_bin日记名字,用于主宕机以后从备主机接管后从同步的log_bin。
名字不通用于区别。
现在,mysql的logbin的位置路径是路径:
/var/lib/mysql,而再也不是/var/log/mysql。
mysql>grantreplicationslaveon*.*torealcloud@''identifiedby'realcloud';
mysql>showmasterstatus;
+------------------+----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
||107|||
+------------------+----------+--------------+------------------+
1rowinsetsec)
记录下“File”和“Position”即当前主库利用的二进制日记名称和位置。
Ø在备选master(mysqlsql2)和slave(mysqlsql1)上
mysql>slavestop;
mysql>changemastertomaster_host="",master_user="realcloud",master_password="realcloud",master_log_file="",master_log_pos=107;
master_log_file和master_log_pos是上面记下的东西。
Ø在备选master(slavesql2)上,授权其网段内其他机械登岸的账号和密码
mysql>grantreplicationslaveon*.*torepl@''identifiedbyrepl;
Ø然后在备选master(slavesql2)和slave(slavesql1)上
mysql>slavestart;
mysql>showslavestatus\G'|egrep'Slave_IO|Slave_SQL'
Slave_IO_State:
Waitingformastertosendevent
Slave_IO_Running:
Yes
Slave_SQL_Running:
Yes
#若是Slave_IO_Running:
Yes和Slave_SQL_Running:
Yes则说明主从配置成功
#还能够到master上执行Mysql>showglobalstatuslike"rpl%";
mysql>showglobalstatuslike"rpl%";
+--------------------------------------------+--------