
1.1MHA简介1.1.1MHA软件介绍MHA(MasterHighAvailability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于F......

MHA(MasterHighAvailability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在10~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;在复制框架中,MHA能够很好地解决复制过程中的数据一致性问题,由于不需要在现有的replication中添加额外的服务器,仅需要一个manager节点,而一个Manager能管理多套复制,所以能大大地节约服务器的数量;另外,安装简单,无性能损耗,以及不需要修改现有的复制部署也是它的优势之处。
MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成。
该软件由两部分组成:MHAManager(管理节点)和MHANode(数据节点)。MHAManager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHANode运行在每台MySQL服务器上,MHAManager会定时探测集群中的master节点,当**master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master**。整个故障转移过程对应用程序完全透明。
1.1.2MHA工作原理
1、监控所有node节点MHA功能说明:
1.1.3MHA高可用架构图
MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下:
Manager工具包主要包括以下几个工具:
masterha_check_ssh检査主从复制情况masterha_manger检测MHA的运行状态^masterha_master_monitor手动故障转移—masterha_conf_host建立TCP连接从远程服务器vmasterha_stop保存宕机的master的binlogapply_diff_relay_logs防止回滚事件一MHA已不再使用这个工具purge_relay_logscat/etc/(Final)[root@db01~]/etc//iptablesstatusiptables:Firewallisnotrunning.[root@db01~]
db02主机(slave1)
1[root@db02~]_645[root@db02~]getenforce8Disabled9[root@db02~]cat/etc/(Final)3[root@db02~]/etc//iptablesstatus6iptables:[root@db02~]1.2.2mysql软件说明
三台服务器上都全新安装:
[root@db01~]_label31.3基于GTID的主从复制配置1.3.1先决条件主库和从库都要开启binlog
主库和从库server-id必须不同
要有主从复制用户
1.3.2配置主从复制**文件**
[root@db01~]跳过域名解析gtid-mode=on强制GTID的一致性log-slave-updates=1cat/etc/[mysqld]3basedir=/application/mysql4datadir=/application/mysql/data5socket=/tmp/=/var/log/=/data/mysql/mysql-bin8binlog_format=row9secure-file-priv=/tmp10server-id=5211skip-name-resolve12gtid-mode=on13enforce-gtid-consistency=true14log-slave-updates=115relay_log_purge=016[mysql]17socket=/tmp/**文件**
1[root@db03~]vi/etc/[mysqld]basedir=/usr/local/mysqldatadir=/data/mysqlserver-id=1log-bin=mysql-binsocket=/tmp/=ROWgtid-mode=onenforce-gtid-consistency=truelog-slave-updates=1从节点文件
同一个复制拓扑中的所有服务器的id号必须惟一binlog-format=RO启用gtid类型,否则就是普通的复制架构enforce-gtid-consistency=trueslave更新是否记入日志复制用户准备(Master主节点)
mysqlGRANTREPLICATIONSLAVEON*.*TOrep@'10.0.0.%'IDENTIFIEDBY'123';开启复制(Slave从节点)
mysqlstartslave;mysqlshowslavestatus\G现在就可以进行主从复制测试。
1.4部署MHA本次MHA的部署基于GTID复制成功构建,普通主从复制也可以构建MHA架构。
1.4.1环境准备(所有节点操作)安装依赖包
yuminstallperl-DBD-MySQL-y下载mha软件,mha官网:https://archive/p/mysql-master-ha/
github下载地址:
下载软件包\
在所有节点安装node
创建mha管理用户
grantallprivilegeson*.*tomha@'10.0.0.%'identifiedby'mha';安装epel源,软件需要wget-O/etc//
创建必须目录
mkdir-p/etc/mhamkdir-p/var/log/mha/app1----》可以管理多套主从复制
编辑mha-manager***配置文件***
[root@db03~]设置manager的工作目录3manager_workdir=/var/log/masterha/app14设置master保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录7master_binlog_dir=/data/mysql8设置手动切换时候的切换脚本11master_ip_online_change_script=/usr/local/bin/master_ip_online_change12设置监控用户root15user=root16设置远端mysql在发生切换时binlog的保存位置19remote_workdir=/tmp20设置复制环境中的复制用户名23repl_user=rep24一旦MHA到server02的监控之间出现问题,MHAManager将会尝试从server03登录到server0227secondary_check_script=/usr/local/bin/masterha_secondary_check-sserver03-sserver02--user=root--master_host=server02--master_ip=10.0.0.51--master_port=330628设置ssh的登录用户名31ssh_user=root3233[server1]34hostname=10.0.0.5135port=33063637[server2]38hostname=10.0.0.5239port=330640默认情况下如果一个slave落后master100M的relaylogs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master43check_repl_delay=0
配置ssh信任(密钥分发,在所有节点上执行)
分发公钥,包括自己foriin123;dossh-copy-id-i/root/.ssh/id_@10.0.0.5$i;done
分发完成后测试分发是否成功
foriin123;$idate;done或[root@db03~]启动mhanohupmasterha_manager--conf=/etc/mha/_dead_master_conf--ignore_last_failover/dev/null/var/log/mha/app1/
启动成功后,检查主库状态
[root@db03~]masterha_check_status--conf=/etc/mha/(pid:11669)isrunning(0:PING_OK),master:10.0.0.51
手动停止主库
[root@db01~]tailf/var/log/mha/app1/manager~~~FriDec2915:51:142017-[info]:CHANGEMASTERTOMASTER_HOST='10.0.0.52',MASTER_PORT=3306,MASTER_AUTO_POSITION=1,MASTER_USER='repl',MASTER_PASSWORD='xxx';
修复主从
①启动原主库,添加changemasterto信息
[root@db01~]cat/etc/mha/[binlog1]hostname=10.0.0.53master_binlog_dir=/data/mysql/binlog/no_master=1[serverdefault]manager_log=/var/log/mha/app1/managermanager_workdir=/var/log/mha/app1master_binlog_dir=/data/mysqlmaster_ip_failover_script=/usr/local/bin/master_ip_failoverpassword=mhaping_interval=2repl_password=123repl_user=replssh_user=rootuser=mha[server1]hostname=10.0.0.51port=3306[server2]hostname=10.0.0.52port=3306[server3]hostname=10.0.0.53port=3306
②mha检查复制状态
[root@db03~]masterha_check_status--conf=/etc/mha/(pid:11978)isrunning(0:PING_OK),master:10.0.0.52
实验结束将主库切换回db01.
①停止mha
[root@db03~]masterha_check_repl--conf=/etc/mha/
⑥启动mha
nohupmasterha_manager--conf=/etc/mha/_dead_master_conf--ignore_last_failover/dev/null/var/log/mha/app1/
检查切换是否成功
[root@db03~]grep"script"/etc/mha/[serverdefault]master_ip_failover_script=/usr/local/bin/master_ip_failover
再主配置中添加VIP脚本
脚本内容
[root@db03~]!/usr/bin/envperlusestrict;usewarningsFATAL='all';useGetopt::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='10.0.0.55/24';my$key='0';my$ssh_start_vip="/sbin/ifconfigeth0:$key$vip";my$ssh_stop_vip="/sbin/ifconfigeth0:$keydown";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,);exitmain();submain{print"\n\nINSCRIPTTEST====$ssh_stop_vip==$ssh_start_vip===\n\n";if($commandeq"stop"||$commandeq"stopssh"){my$exit_code=1;eval{print"DisablingtheVIPonoldmaster:$orig_master_host\n";stop_vip();$exit_code=0;};if($@){warn"GotError:$@\n";exit$exit_code;}exit$exit_code;}elsif($commandeq"start"){my$exit_code=10;eval{print"EnablingtheVIP-$viponthenewmaster-$new_master_host\n";start_vip();$exit_code=0;};if($@){warn$@;exit$exit_code;}exit$exit_code;}elsif($commandeq"status"){print"CheckingtheStatusofthescript..OK\n";exit0;}else{usage();exit1;}}substart_vip(){`ssh$ssh_user\@$new_master_host\"$ssh_start_vip\"`;}substop_vip(){return0unless($ssh_user);`ssh$ssh_user\@$orig_master_host\"$ssh_stop_vip\"`;}subusage{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";}该脚本为软件自带,脚本获取方法:再mha源码包中的samples目录下有该脚本的模板,对该模板进行修改即可使用。路径如:/samples/scripts
脚本修改内容
my$vip='10.0.0.55/24';my$key='0';my$ssh_start_vip="/sbin/ifconfigeth0:$key$vip";my$ssh_stop_vip="/sbin/ifconfigeth0:$keydown";
脚本添加执行权限否则mha无法启动
chmod+x/usr/local/bin/master_ip_failover
手动绑定VIP(**主库)**
ifconfigeth0:010.0.0.55/24
检查
[root@db01~]/etc//mysqldstop
在db03上查看从库slave信息

ViewCode停掉主库后的主从信息
在db01上查看vip信息
2:eth0:BROADCAST,MULTICAST,UP,LOWER_UPmtu1500qdiscpfifo_faststateUPqlen1000link/ether00:0c:29:6c:7a:11brdff:ff:ff:ff:ff:/24::20c:29ff:fe6c:7a11/64scopelinkvalid_lftforeverpreferred_lftforever
在db02上查看vip信息
[root@db02~]进入目录启动程序cd/data/mysql/binlog/\mysqlbinlog-R--host=10.0.0.51--user=mha--password=
参数说明:-R远程主机
5)启动mha
nohupmasterha_manager--conf=/etc/mha/_dead_master_conf--ignore_last_failover/dev/null/var/log/mha/app1/1.6.2测试binlog备份
lltotal44-rw-r--r--1rootroot285Mar803:11
mysql-uroot-p123
再次查看binlog目录
[root@db03binlog]/usr/local/mysql-proxy/bin/encrypt1233yb5jEku5h4=[root@db03bin]启动/usr/local/mysql-proxy/bin/mysql-proxydteststop重启
注意:test是配置文件的名称
脚本内容:

ViewCodeAtas管理脚本
检查端口是否正常
[root@db03~]
查看帮助信息
mysqlSELECT*FROMhelp;
查看后端的代理库
mysqlSELECT*FROMbacks;+-------------+----------------+-------+------+|back_ndx|address|state|type|+-------------+----------------+-------+------+|1|10.0.0.55:3306|up|rw||2|10.0.0.52:3306|up|ro||3|10.0.0.53:3306|up|ro|+-------------+----------------+-------+------+3rowsinset(0.00sec)
平滑摘除mysql
mysqlREMOVEBACKEND2;Emptyset(0.00sec)
检查是否摘除
mysqlSELECT*FROMbacks;+-------------+----------------+-------+------+|back_ndx|address|state|type|+-------------+----------------+-------+------+|1|10.0.0.55:3306|up|rw||2|10.0.0.53:3306|up|ro|+-------------+----------------+-------+------+2rowsinset(0.00sec)
保存到配置文件中
mysqlSAVECONFIG;
将节点再添加回来
:3306;Emptyset(0.00sec)
查看是否添加成功
mysqlSELECT*FROMbacks;+-------------+----------------+-------+------+|back_ndx|address|state|type|+-------------+----------------+-------+------+|1|10.0.0.55:3306|up|rw||2|10.0.0.53:3306|up|ro||3|10.0.0.52:3306|up|ro|+-------------+----------------+-------+------+3rowsinset(0.00sec)
保存到配置文件中
mysqlSAVECONFIG;1.7.9连接数据库查看负载
通过atlas登陆数据,注意,使用的是数据库上的用户及密码
第一次查询server_id
mysqlshowvariableslike"server_id";+---------------+-------+|Variable_name|Value|+---------------+-------+|server_id|53|+---------------+-------+1rowinset(0.00sec)
第二次查询server_id
mysqlshowvariableslike"server_id";+---------------+-------+|Variable_name|Value|+---------------+-------+|server_id|52|+---------------+-------+1rowinset(0.00sec)
通过上面可以看到负载成功\
1.7.10读写分离的说明Atlas会透明的将事务语句和写语句发送至主库执行,读语句发送至从库执行。具体以下语句会在主库执行:
显式事务中的语句
从库负载均衡配置
proxy-read-only-back-addresses=ip1:port1@权重,ip2:port2@权重1.7.11Atlas高级功能
自动分表
使用Atlas的分表功能时,首先需要在配置文件设置tables参数。
tables参数设置格式:数据库名.表名.分表字段.子表数量,比如:
Atles功能的说明
IP**过滤:client-ips**
该参数用来实现IP过滤功能。
在传统的开发模式中,应用程序直接连接DB,因此DB会对部署应用的机器(比如web服务器)的IP作访问授权。
在引入中间层后,因为连接DB的是Atlas,所以DB改为对部署Atlas的机器的IP作访问授权,如果任意一台客户端都可以连接Atlas,就会带来潜在的风险。
client-ips参数用来控制连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔写在一行上即可。
如:client-ips=192.168.1.2,192.168.2
这就代表192.168.1.2这个IP和192.168.2.*这个段的IP可以连接Atlas,其他IP均不能连接。如果该参数不设置,则任意IP均可连接Atlas。如果设置了client-ips参数,且Atlas前面挂有LVS,则必须设置lvs-ips参数,否则可以不设置lvs-ips。
SQL**语句黑白名单功能:**Atlas会屏蔽不带where条件的delete和update操作,以及sleep函数。
1.8Atlas-Sharding版本1.8.1版本介绍Sharding的基本思想就是把一个数据表中的数据切分成多个部分,存放到不同的主机上去(切分的策略有多种),从而缓解单台机器的性能跟容量的问题.
sharding是一种水平切分,适用于单表数据庞大的情景.目前atlas支持静态的
sharding方案,暂时不支持数据的自动迁移以及数据组的动态加入.
Atlas以表为单位sharding,同一个数据库内可以同时共有sharding的表和不sharding的表,不sharding的表数据存在未sharding的数据库组中.
目前Atlassharding支持insert,delete,select,update语句,只支持不跨shard的事务.所有的写操作如insert,delete,update只能一次命中一个组,否则会报"ERROR1105(HY000):writeoperationisonlyallowtoonedbgroup!"错误.
由于sharding取替了Atlas的分表功能,所以在Sharding分支里面,Atlas单机分表的功能已经移除,配置tables将不会再有效.
1.8.2Atlas-Sharding架构
Atlas支持非sharding跟sharding的表共存在同一个Atlas中,2.2.1之前的配置可以直接运行.之前的配置如
proxy-back-addresses=192.168.0.12:3306proxy-read-only-back-addresses=192.168.0.13:3306,192.168.0.14:3306
这配置了一个master和两个slave,这属于非sharding的组,所有非sharding的表跟语句都会发往这个组内.
所以之前没有Sharding的Atlas的表可以无缝的在新版上使用,
注意:非Sharding的组只能配置一个,而sharding的组可以配置多个.下面的配置,配置了Sharding的组,注意与上面的配置区分
[shardrule-0]table=_test
分表名,有数据库+表名组成t
ype=range
sharding类型:range或hash
shard-key=id
sharding字段
groups=0:0-999,1:1000-1999
分片的group,如果是range类型的sharding,则groups的格式是:group_id:id范围。如果是hash类型的sharding,则groups的格式是:group_id。例如groups=0,1
[group-0]proxy-back-addresses=192.168.0.15:3306proxy-read-only-back-addresses=192.168.0.16:3306[group-1]proxy-back-addresses=192.168.0.17:3306proxy-read-only-back-addresses=192.168.0.18:33061.8.4Sharding限制
关于支持的语句
Atlassharding只对sql语句提供有限的支持,目前支持基本的Select,insert/replace,delete,update语句,支持全部的Where语法(SQL-92标准),不支持DDL(createdropalter)以及一些管理语句,DDL请直连MYSQL执行,请只在Atlas上执行Select,insert,delete,update(CRUD)语句.
对于以下语句,如果语句命中了多台dbgroup,Atlas均未做支持(如果语句只命中了一个dbgroup,如selectcount(*)fromtestwhereid1000,其中dbgroup0范围是0-1000,那么这些特性都是支持的)LimitOffset(支持Limit)
增加节点
注意:暂时只支持range方式的节点扩展,hash方式由于需要数据迁移,暂时未做支持.
扩展节点在保证原来节点的范围不改变的情况下,如已有dbgroup0为范围0-999,dbgroup1为范围1000-1999,这个时候可以增加范围2000的节点.如增加一个节点为2000-2999,修改配置文件,重启Atlas即可.