8 MHA+Atlas实现高可用+读写分离

简介

MHA优点

1、管理规模:一个Manager能管理多套复制,不需要修改现有的复制部署,大大地节约服务器的数量
2、速度上:较短的时间内实现自动故障检测和故障转移(10-30秒),主备切换功能速度快,安全无损3、耗数据一致性:解决了主库崩溃的数据一致性问题:MHA Manager可以独立部署在一台独立的机器上管理多个Master-Slave集群,也可以部署在一台Slave上。当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,将宕机的master上保存下来的二进制日志恢复到含有最新位置点的slave上,然后将所有其他的Slave重新指向新的Master。整个故障转移过程对应用程序是完全透明的。
4、工作时:性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping包(默认3秒),所以对性能无影响
兼容性:只要replication支持的存储引擎,MHA都支持,不会局限于innodb

MHA工作流程

把宕机的master二进制日志保存下来
找到binlog位置点最新的slave
在binlog位置点最新的slave上用relay log(差异日志)修复其它slave
将宕机的master上保存下来的二进制日志恢复到含有最新位置点的slave上
将含有最新位置点binlog所在的slave提升为master
将其它slave重新指向新提升的master,并开启主从复制

MHA架构图

8 MHA+Atlas实现高可用+读写分离

MHA工具介绍

MHA软件由两部分组成,Manager工具包和Node工具包

Manager工具包主要包括

8 MHA+Atlas实现高可用+读写分离

Node工具包主要包括

8 MHA+Atlas实现高可用+读写分离

实验:

环境准备

下面要进行一项实验,由四台192.168.1.10:MHA-manager,192.168.1.11:master,192.168.1.12:slave,192.168.1.13:slave,之后搭建起来会模拟master宕机过程,需要手动将master指向新的slave,然后添加脚本,实现VIP漂移

8 MHA+Atlas实现高可用+读写分离

安装mysql

所有服务器修改主机名
hostnamectl set-hostname mha-manager;bash
hostnamectl set-hostname mysql-db01;bash
hostnamectl set-hostname mysql-db02;bash
hostnamectl set-hostname mysql-db03;bash

四台服务器同时二进制安装mysql
创建下载包目录
mkdir ~/tools;cd ~/tools
包mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz
解压二进制包,移到/usr/local目录下
tar xf mysql-5.6.30-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.30-linux-glibc2.5-x86_64/ /usr/local/mysql
创建数据库用户
useradd -M -s /sbin/nologin mysql
安装mysql依赖包
cd /usr/local/mysql/scripts/
yum -y install autoconf
初始化数据库
./mysql_install_db --user=mysql --datadir=/usr/local/mysql/data/ --basedir=/usr/local/mysql/
复制配置文件
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
复制命令脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
配置环境变量
echo 'export PATH="/usr/local/mysql/bin:$PATH"' >> /etc/profile.d/mysql.sh
source /etc/profile

启动mysql服务
启动
systemctl daemon-reload
systemctl start mysql
开机自启
chkconfig --add mysqld
chkconfig mysqld on
设置初始用户名与密码
mysqladmin -uroot password 123

主从复制

流程:
主库和从库都要先开启binlog,主库和从库server-id设置为不同,并创建主从用户,授权和接受授权

 配置文件(主库为例)
配置manager服务端配置文件(之后同步binlog日志使用)

8 MHA+Atlas实现高可用+读写分离

systemctl restart mysqld

三台mysql修改主配置文件以主服务器(11)为例(从server_id不同即可)
vim /etc/my.cnf

[mysqld]
server_id=1
log_bin=mysql-bin
user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
log_error=/usr/local/mysql/data/error.log

systemctl restart mysqld

主服务器创建授权用户
mysql -uroot -p123
grant replication slave on *.* to rep@'192.168.1.%' identified by '123';flush privileges;
show master status;

8 MHA+Atlas实现高可用+读写分离

从服务器接受授权(12、13)
mysql -uroot -p123
change master to master_host='192.168.1.11',master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=120;

详解
master_host 主库IP地址
master_user 主库授权的用户
master_password 主库复制用户对应的密码

开启slave
start slave;
show slave status\G

8 MHA+Atlas实现高可用+读写分离
8 MHA+Atlas实现高可用+读写分离

主从服务器禁用自动删除relay log永久生效(可选:临时生效:set global relay_log_purge=0;)
vim /etc/my.cnf

[mysqld]
relay_log_purge=0
8 MHA+Atlas实现高可用+读写分离

systemctl restart mysqld

登录从服务器mysql临时设置只读(当成为主服务器时只读失效)
set global read_only=1;

(12、13)因为mysql-db02与mysql-db03为备用主库,所以也需要添加rep用户复制权限

mysql -uroot -p123
grant replication slave on *.* to rep@'192.168.1.%' identified by '123';

部署MHA-node(所有节点)

在所有节点上部署数据节点包
添加主机名与IP映射关系
vim /etc/hosts
192.168.1.10 mha-manager
192.168.1.11 mysql-db01
192.168.1.12 mysql-db02
192.168.1.13 mysql-db03

安装MHA节点依赖包
yum -y install perl-DBD-MySQL
cd ~/tools/
拉包,将mha4mysql-manager-0.56-0.el6.noarch.rpm管理节点包和mha4mysql-node-0.56-0.el6.noarch.rpm数据节点包拉到当前目录 (管理节点安装管理包和节点包,被管理节点只需要安装节点包)
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

8 MHA+Atlas实现高可用+读写分离

在三台mysql数据库上部署授权用户

mysql -uroot -p123
grant all privileges on *.* to mha@'192.168.1.%' identified by 'mha';flush privileges;

主节点上查看用户情况,顺便去从节点看看同步是否完成
select user,host from mysql.user;

8 MHA+Atlas实现高可用+读写分离

删除主节点的空用户,否则之后会报错,顺便去从节点检查下空用户是否也跟着删除

delete from mysql.user where user='';
flush privileges;
select user,host from mysql.user;
8 MHA+Atlas实现高可用+读写分离
8 MHA+Atlas实现高可用+读写分离
8 MHA+Atlas实现高可用+读写分离

部署MHA-manager(10)

上传perl的rpm依赖软件包
cd ~/tools/
拉包

8 MHA+Atlas实现高可用+读写分离

安装依赖包
yum -y localinstall perl-*
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

8 MHA+Atlas实现高可用+读写分离

Manager端编辑配置文件
创建配置文件目录
mkdir -p /etc/mha
创建普通日志目录
mkdir -p /var/log/mha/app1
创建bin-log日志保存目录(之后保存bin-log日志用到)
mkdir -p /var/data/binlog

编辑mha配置文件
vim /etc/mha/app1.cnf

[server default]
#设置manager日志
manager_log=/var/log/mha/app1/manager
#设置manager工作目录
manager_workdir=/var/log/mha/app1
#设置master保存binlog的位置,以便MHA可以找到master日志
master_binlog_dir=/usr/local/mysql/data/
#设置监控的用户
user=mha
#设置mha用户的密码
password=mha
#设置监控主库,发送ping包的时间间隔,尝试三次没有回应的时候自动进行failover
ping_interval=2
#设置复制用户的密码
repl_password=123
#指定复制用户
repl_user=rep
#设置ssh登录名
ssh_user=root

[server1]
hostname=192.168.1.11
port=3306

[server2]
#设置为候选master,如果设置该参数后,发生主从切换后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
candidate_master=1
#默认情况下一个slave数据量落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置这个参数,MHA触发切换再选择一个新的master的时候忽略复制延时,这个参数对于设置candidate_master=1的主机非常有用,因为这个候选主在切换过程中一定是新的master
check_repl_delay=0
hostname=192.168.1.12
port=3306

[server3]
hostname=192.168.1.13
port=3306

注:如果配置文件出现报错,记着把注释删掉

配置ssh信任(所有节点)
所有节点配置所有主机的ssh信任(配置16次)
创建秘钥对
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

所有节点分发公钥,包括自己
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.10
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.11
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.12
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.13

测试ssh ,指向配置文件
masterha_check_ssh --conf=/etc/mha/app1.cnf

8 MHA+Atlas实现高可用+读写分离

测试主从复制
masterha_check_repl --conf=/etc/mha/app1.cnf

8 MHA+Atlas实现高可用+读写分离

配置VIP漂移

两种VIP管理方式
通过keepalived的方式,管理VIP;
通过MHA自带脚本方式,管理VIP

为了防止脑裂,使用MHA脚本方式管理VIP
Mha-manager修改配置文件
vim /etc/mha/app1.cnf
在[server default]标签下添加
master_ip_failover_script=/usr/local/bin/master_ip_failover

8 MHA+Atlas实现高可用+读写分离

上传脚本文件master_ip_failover到/usr/local/bin目录下
vim /usr/local/bin/master_ip_failover

#!/usr/bin/env perl

#  Copyright (C) 2011 DeNA Co.,Ltd.
#  You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#  Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

## Note: This is a sample script and is not complete. Modify the script based on your environment.

use strict;
use warnings FATAL => 'all';

use Getopt::Long;
use MHA::DBHelper;

my (
  $command,        $ssh_user,         $orig_master_host,
  $orig_master_ip, $orig_master_port, $new_master_host,
  $new_master_ip,  $new_master_port,  $new_master_user,
  $new_master_password
);

my $vip = '192.168.1.100/24';
my $key = '0';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
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,
  'new_master_user=s'     => \$new_master_user,
  'new_master_password=s' => \$new_master_password,
);

exit &main();

sub main {
    print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
    if ( $command eq "stop" || $command eq "stopssh" ) {
        my $exit_code = 1;
        eval {
            print "Disabling the VIP on old master: $orig_master_host \n";
            &stop_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn "Got Error: $@\n";
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "start" ) {
        my $exit_code = 10;
        eval {
            print "Enabling the VIP - $vip on the new master - $new_master_host \n";
            &start_vip();
            $exit_code = 0;
        };
        if ($@) {
            warn $@;
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "status" ) {
        print "Checking the Status of the script.. OK \n";
        exit 0;
    }
    else {
        &usage();
        exit 1;
    }
}
sub start_vip() {
    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
     return 0  unless  ($ssh_user);
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
  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";
}

脚本增加执行权限
chmod +x /usr/local/bin/master_ip_failover

手动绑定Master的VIP(11)
ifconfig ens33:0 192.168.1.100/24
ip a |grep ens33

8 MHA+Atlas实现高可用+读写分离

测试VIP(10)

启动MHA
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

8 MHA+Atlas实现高可用+读写分离

add:关闭MHA Manage监控
masterha_stop --conf=/etc/mha/app1.conf
主从切换之后为了防止脑裂,自动关闭监控,一旦发生切换管理进程将会退出,无法进行再次测试,需将故障数据库加入到MHA环境中来

测试状态
masterha_check_status --conf=/etc/mha/app1.cnf

宕掉master(11)
systemctl stop mysqld

此时vip漂移到db02(12)
ip a|grep ens33

8 MHA+Atlas实现高可用+读写分离

查看监控日志
cat /var/log/mha/app1/manager

8 MHA+Atlas实现高可用+读写分离
8 MHA+Atlas实现高可用+读写分离

继续关闭12的mysql服务,VIP漂移到13
systemctl stop mysqld

8 MHA+Atlas实现高可用+读写分离

cat /var/log/mha/app1/manager

8 MHA+Atlas实现高可用+读写分离

将旧主库(db01)恢复为从库,需手动执行
开启刚才停掉的master的mysql服务
systemctl start mysqld

db03(13)使用show master status; 

8 MHA+Atlas实现高可用+读写分离

db01和db02接受授权,让db-03成为db-01和db-02的主库 

change master to master_user='rep',master_password='123',master_host='192.168.1.13',master_log_file='mysql-bin.000002',master_log_pos=531;
start slave;

show slave status\G

8 MHA+Atlas实现高可用+读写分离

在MHA的配置文件中,将旧db-01从库(之前的slave的信息加入,因为主从切换导致被管理的server1和server2下的配置内容已经消失)
vim /etc/mha/app1.cnf

8 MHA+Atlas实现高可用+读写分离

将新的从库临时设置read_only=1
set global read_only=1;

测试复制,如果not ok,一般是配置文件改错了
masterha_check_repl --conf=/etc/mha/app1.cnf

8 MHA+Atlas实现高可用+读写分离

需要重新启动MHA,依然恢复正常,这样就形成了新的一主(13)两从(11、12)
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

最后测试宕机mysql-db03,看看是否会漂移到mysql-db01

注(下面一段命令未成功,可忽略):

手动从节点加入主节点方式方式:原来的主要变成从,和现在的主建立主从关系(change master to... start slave;)这些操作后文档说下面一条命令可以重新将当季的master加入到master中,但是测试没效果
masterha_master_switch --conf=/etc/mha/app1.cnf --dead_master_host=192.168.1.13 --master_state=dead --new_master_host=192.168.1.11 --ignore_last_failover

配置binlog-server

修改mha配置文件
vim /etc/mha/app1.cnf
添加

[binlog]
no_master=1
hostname=192.168.1.10
master_binlog_dir=/var/data/binlog
8 MHA+Atlas实现高可用+读写分离

cd /var/data/binlog/
mha-master开启备份主服务器上的bin-log日志功能
mysqlbinlog -R --host=192.168.1.11 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &

解析:
--raw:binlog日志会以二进制格式存储在磁盘中,如果不指定该选项,则会以文本形式保存
--user:复制的MySQL用户
--stop-never:不断生成的binlog保存到本地
mysql-bin.000001:代表从哪个binlog开始复制。

测试binlog备份
ls

8 MHA+Atlas实现高可用+读写分离

在master上刷新日志
flush logs;

8 MHA+Atlas实现高可用+读写分离

再看备份目录,会多出来二进制日志文件

8 MHA+Atlas实现高可用+读写分离

Atlas(基于MHA环境实现)

介绍

Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项

8 MHA+Atlas实现高可用+读写分离

主要功能
读写分离:Atlas会透明的将事务语句和写语句发送至主库执行,读语句发送至从库执行。具体以下语句会在主库执行

Atlas主要功能
1.读写分离
2.从库负载均衡
3.IP过滤
4.自动分表
5.DBA可平滑上下线DB
6.自动摘除宕机的DB

环境准备:

192.168.1.10 atlas管理端
192.168.1.11:mysql主
192.168.1.12、192.168.1.13:mysql从

Atlas安装(主数据库,此时为11)

下载包Atlas-2.2.1.el6.x86_64.rpm
官网下载方式:wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 

8 MHA+Atlas实现高可用+读写分离

add:安装好了,它会默认在”/usr/local/mysql-proxy”下给你生成4个文件夹,以及需要配置的文件

8 MHA+Atlas实现高可用+读写分离

查看一下命令

8 MHA+Atlas实现高可用+读写分离

“encrypt”是用来生成MySQL密码加密的,在配置的时候会用到
“mysql-proxy”是MySQL自己的读写分离代理
“mysql-proxyd”是360弄出来的,后面有个“d”,服务的启动、重启、停止。都是用他来执行的

编辑配置文件

思路:下载管理包即可,但是需要给管理节点配置文件中的登录用户授权,管理节点需要进行读写分离配置,还需要设置一个管理账户

cd /usr/local/mysql-proxy/bin/

8 MHA+Atlas实现高可用+读写分离

这是用来登录到Atlas的管理员的账号与密码,与之对应的是“#Atlas监听的管理接口IP和端口”,也就是说需要设置管理员登录的端口,才能进入管理员界面,默认端口是2345,也可以指定IP登录,指定IP后,其他的IP无法访问管理员的命令界面。

vim /usr/local/mysql-proxy/conf/test.cnf

[mysql-proxy]

#带#号的为非必需的配置项目,这是用来登录到Atlas的管理员的账号与密码,与之对应的是“#Atlas监听的管理接口IP和端口”,也就是说需要设置管理员登录的端口,才能进入管理员界面,默认端口是2345,也可以指定IP登录,指定IP后,其他的IP无法访问管理员的命令界面。方便测试,我这里没有指定IP和
端口登录。
#管理接口的用户名
admin-username = user

#管理接口的密码
admin-password = pwd

#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 192.168.1.11:3306

#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 192.168.1.12:3306@1,192.168.1.13:3306@1

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = root:3yb5jEku5h4=

#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
daemon = true

#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
keepalive = true

#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 8

#日志级别,分为message、warning、critical、error、debug五个级别
log-level = message

#日志存放的路径
log-path = /usr/local/mysql-proxy/log

#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
sql-log = ON

#慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。
#sql-log-slow = 10

#实例名称,用于同一台机器上多个Atlas实例间的区分
#instance = test

#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234

#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345

#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
#tables = person.mt.id.3

#默认字符集,设置该项后客户端不再需要执行SET NAMES语句
charset = utf8

#允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
#client-ips = 127.0.0.1, 192.168.1

#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
#lvs-ips = 192.168.1.1

修改的地方这里再次截图下,加强记忆

8 MHA+Atlas实现高可用+读写分离
8 MHA+Atlas实现高可用+读写分离
8 MHA+Atlas实现高可用+读写分离
8 MHA+Atlas实现高可用+读写分离
8 MHA+Atlas实现高可用+读写分离
8 MHA+Atlas实现高可用+读写分离

因为atlas需要管理两个从数据库,所以需要授权给atlas登录

grant all on *.* to root@'%' identified by '123';
flush privileges;

启动Atlas

/usr/local/mysql-proxy/bin/mysql-proxyd test start

8 MHA+Atlas实现高可用+读写分离

如果开启失败,去找日志文件
/usr/local/mysql-proxy/log

Atlas连接与测试

yum -y install mariadb-server

登录工作账号端口
mysql -uuser -ppwd -h 127.0.0.1 -P2345

查看帮助信息
select * from help;

8 MHA+Atlas实现高可用+读写分离

查看后端服务器连接状态
select * from backends;

8 MHA+Atlas实现高可用+读写分离

11进行读写,12、13读

测试读写负载均衡

mysql -uroot -p123 -h127.0.0.1 -P1234

use school;
两个从库都有一个school库,库中有一个students表,内容不一样
12端

8 MHA+Atlas实现高可用+读写分离

13端:

8 MHA+Atlas实现高可用+读写分离

登录工作接口和端口,测试读写分离
mysql -uroot -p123 -h 127.0.0.1 -P3307

8 MHA+Atlas实现高可用+读写分离

发布者:LJH,转发请注明出处:https://www.ljh.cool/6516.html

(1)
上一篇 2020年6月1日 上午2:33
下一篇 2020年6月3日 下午6:04

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注