当前位置:首页 > 配件供应 > 正文

MySQL高可用架构(MHA)与Atlas读写分离

1.1MHA简介1.1.1MHA软件介绍MHA(MasterHighAvailability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在...

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


1.1MHA简介1.1.1MHA软件介绍

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、保存master上的所有binlog事件2、找到含有最新binlog位置点的slave3、通过中继日志将数据恢复到其他的slave4、将包含最新binlog位置点的slave提升为master5、将其他从库slave指向新的master原slave01并开启主从复制6、将保存下来的binlog恢复到新的master上

1、监控所有node节点MHA功能说明:

1.1.3MHA高可用架构图


1.1.4MHA工具介绍

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架构


1.8.3Sharding配置示例

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:3306
1.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即可.

最新文章