ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MHA-altas-mysql高可用

2019-08-23 22:02:42  阅读:162  来源: 互联网

标签:slave altas 192.168 mha master usr mysql MHA


MHA-altas-mysql高可用

标签(空格分隔): linux服务


文章目录

#1. MHA简介

  • MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件,能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行切换过程中,最大程度上保证数据库的一致性,以达到真正意义上的高可用。

  • MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以独立部署在一台独立的机器上管理多个Master-Slave集群,也可以部署在一台Slave上。当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。

  • 工作流程

  1. 从宕机崩溃的master保存二进制日志事件(binlog events);
  2. 识别含有最新更新的slave;
  3. 应用差异的中继日志(relay log)到其他的slave;
  4. 应用从master保存的二进制日志事件(binlog events);
  5. 提升一个slave为新的master;
  6. 使其他的slave连接新的master进行复制;

#2. MHA环境准备
##2.1 基础环境配置

  • 实验需要三台服务器,基于centos6.5版本
  • 在三台机/etc/hosts都要做好映射,如下:
    192.168.200.184 mysql-master
    192.168.200.185 mysql-master-A
    192.168.200.183 mysql-master-B
  • 关闭selinux和iptables

##2.2 GTID介绍

  • GTID:(Global Transaction)全局事务标识符:是一个唯一的标识符,它创建并与源服务器(主)上提交的每个事务相关联。此标识符不仅对其发起的服务器是唯一的,而且在给定复制设置中的所有服务器上都是唯一的。所有交易和所有GTID之间都有1对1的映射
  • GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增
  • 支持多线程(每个库每个独立线程);自动找点进行主从复制;把主从相关信息记录在table中,而不像原来记录在文件中;支持延迟复制

##2.3 安装mysql-5.6

#安装依赖
yum -y install ncurses-devel libaio
    
#二进制安装mysql
tar xf mysql-5.6.17-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/mysql-5.6.17-linux-glibc2.5-x86_64 /usr/local/mysql
    
#初始化mysql
useradd -M -s /sbin/nologin mysql
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/

#修改配置文件及启动脚本
/bin/cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
/bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    
#加入开机自启并启动,修改mysql-root密码
ln -s /usr/local/mysql/bin/* /usr/local/bin/
chkconfig --add mysqld
/etc/init.d/mysqld start
mysqladmin -uroot password '123123'

##2.3 配置基于GTID的主从复制

  • 先决条件:主从都开启binlog日志,主从库server-id不同,主从库都有主从复制用户

###2.3.1 修改配置文件

修改配置文件为以下内容:
cat /etc/my.cnf

[client]
socket = /usr/local/mysql/data/mysql.sock

[mysqld]
#禁止自动删除relay log日志
relay_log_purge         = 0

#开启GTID功能
gtid_mode               = ON
log_slave_updates
enforce_gtid_consistency

lower_case_table_name   = 1
default-storage-engine  = InnoDB
port                    = 3306
datadir                 = /usr/local/mysql/data
character-set-server    = utf8
socket                  = /usr/local/mysql/data/mysql.sock

#开启binlog日志,设置每台server_id都不一样
log_bin                 = mysql-bin
server_id               = 1

innodb_buffer_pool_size = 200M
slave-parallel-workers  = 8
thread_cache_size       = 600
back_log                = 600
slave_net_timeout       = 60
max_binlog_size         = 512M
key_buffer_size         = 8M
query_cache_size        = 64M
join_buffer_size        = 2M
sort_buffer_size        = 2M
query_cache_type        = 1
thread_stack            = 192K

三台都修改,注意只有server-id不同,完成后,重启数据库
/etc/init.d/mysqld restart

###2.3.2 创建主从复制用户,开启主从复制
登录数据库后,进行以下操作:

#创建主从用户,查看是否正常,三台都创建,不然MHA测试主从正常会出错,也可以通过数据全备后实现,主从库的账号系统需要一致
grant replication slave on *.* to rep@'192.168.200.%' identified by '123123';
show grants for rep@'192.168.200.%';

#查看GTID是否开启,两项模式为ON则开启成功,所有主从库都需要开启,不开的库,无法正常主从复制
show global variables like '%gtid%';

#在两台从库上录入主库信息
CHANGE MASTER TO MASTER_HOST='192.168.200.184', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123123';

#在两台从库上开启主从,并查看状态:
start slave;
show slave status\G
#出现两个yes为成功

###2.3.3 关于主从同步错误的解决办法

  • 当 BIN-LOG 里面出现 SQL 级别错误导致主从不能同步的时候,可以用下面方法掠过该错误语句行,继续同步::
    关闭主从复制后,跳过指针,会出现一个问题:
    stop slave;
    set global sql_slave_skip_counter=1;
    错误提示:
    ERROR 1858 (HY000): sql_slave_skip_counter can not be set when theserver is running with @@GLOBAL.GTID_MODE = ON. Instead, for each transactionthat you want to skip, generate an empty transaction with the same GTID as thetransaction
    解决方法:
    在主库上,查看关于GTID的UUID:
    show global variables like '%gtid%';
    gtid_executed为64f20ec6-a873-11e9-ad4b-000c29eda4cb
    然后在从库上:
    stop slave;
    show slave status\G
    记录下面这条信息(记录主库相同UUID后面的数,此处是1-9)
    Executed_Gtid_Set: 64f20ec6-a873-11e9-ad4b-000c29eda4cb:1-9
    重置主库状态信息:
    reset master;
    跳过报错的GTID的位置,只需要在1-9的基础加1即可;
    set global gtid_purged='64f20ec6-a873-11e9-ad4b-000c29eda4cb:1-10';
    重新录入主库信息:
    CHANGE MASTER TO MASTER_HOST=‘192.168.200.184’, MASTER_PORT=3307, MASTER_AUTO_N=1, MASTER_USER=‘rep’, MASTER_PASSWORD=‘123123’;
    开启主从同步,查看状态是否正常,若还是提示同样问题,可能需要跳过多次GTID位置,方法相同,多试几次:
    start slave;
    show slave status\G

#3. 部署MHA
##3.1 环境准备
三台机都需要配置以下操作

#安装依赖,节点包:
yum -y install perl-DBD-MySQL
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

#登录数据库,创建mha管理用户
grant all privileges on *.* to mha@'192.168.200.%' identified by '123123';
#主库创建,从库会复制

##3.2 将mysql-slave-B部署为管理节点
###3.2.1 安装manager管理节点包
#使用阿里云源+epel源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
wget -O /etc/yum.repos.d/epel-6.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y clean all
yum makecache

#安装manager依赖包
yum -y install perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

#安装manager包
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

###3.2.2 编辑管理节点相关配置
#创建配置文件目录及日志目录
mkdir -p /etc/mha
mkdir -p /var/log/mha/mha1

#创建配置文件:
vim /etc/mha/mha1.conf

#内容为下,每行最后不要有空格:
[server default]
manager_log=/var/log/mha/mha1/manager
manager_workdir=/var/log/mha/mha1
#指定binlog存放路径的全局变量,优先级低于binlog日志模块
master_binlog_dir=/usr/local/mysql/data
#指定启用VIP命令的命令的路径
master_ip_failover_script=/usr/local/bin/master_ip_failover

#管理用户账号密码
user=mha
password=123123
#存活检查的间隔时间
ping_interval=2
#主从账号密码,用于ssh连接的用户
repl_password=123123
repl_user=rep
ssh_user=root

#放在server模块下,就是设置候选master
#candidate_master=1
#忽略relay日志的复制延迟,配合上个参数使用
#check_repl_delay=0

[server1]
hostname=192.168.200.184
port=3306

[server2]
hostname=192.168.200.185
port=3306

[server3]
hostname=192.168.200.183
port=3306

[binlog1]
no_master=1
hostname=192.168.200.183
master_binlog_dir=/data/mysql/binlog/

##3.3 配置ssh信任
三台机都创建密钥,并且给自己和另外两台机都分发公钥

ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa

ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.200.183
ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.200.184
ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.200.185

##3.4 启动测试

  • ssh连接测试,指定测试的配置文件(实例)
    masterha_check_ssh --conf=/etc/mha/mha1.cnf
    提示信息如下为成功:
    All SSH connection tests passed successfully
  • 主从复制测试
    masterha_check_repl --conf=/etc/mha/mha1.cnf
    提示信息如下为成功:
    MySQL replication health is OK

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

多enter几次,且ps -ef | grep perl查看是否成功开启

#4. 测试MHA自动切换主库
##4.1 测试主库切换

  • 在管理节点上,查看slave状态,此时显示主库为192.168.200.184,也就是原master

  • 关闭master上的mysqld服务

  • 再查看管理节点上的slave状态,如master信息变为192.168.200.185则切换成功

##4.2 MHA及日志说明

  • 主库宕机,发生切换时,mha配置文件信息相关模块会被删除,且后台的mha进程由于执行成功,会结束
  • manageri日志记录了详细过程,也包含了往从库录入的新主库相关信息,可以用于故障节点恢复用

##4.3 测试故障还原

  • 将宕机的mysqld服务重新启动
  • 登录mysql,录入新主库信息,并开启主从复制
    mysql -uroot -p123123
    CHANGE MASTER TO MASTER_HOST=‘192.168.0.52’, MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER=‘rep’, MASTER_PASSWORD=‘123123’;
    start slave;
    然后查看slave状态是否正确:
    show slave status\G
  • 补全管理节点上mha配置文件的删除部分
    [server1]
    hostname=192.168.200.184
    port=3306
  • 再启动mha进程,监控master,主从复制架构的状态

#5. 解决切换过程主库IP变更,日志丢失问题
##5.1 配置VIP漂移解决IP变更

  • 通过keepalived的方式,管理虚拟IP的漂移
  • 通过MHA自带脚本方式,管理虚拟IP的漂移

    #获取管理脚本master_ip_failover,yum安装是没有,源码安装才有,解压源码包就可以得到
    tar xf mha4mysql-manager-0.56.tar.gz
    cd mha4mysql-manager-0.56/samples/scripts/
    cp master_ip_failover /usr/local/bin/

    #自带的模板脚本有多处需要修改,这里我们可以使用现成的,修改几个参数:
    cp master_ip_failover /usr/local/bin/
    chmod +x /usr/local/bin/master_ip_failover

    vim /usr/local/bin/master_ip_failover
    #需要修改以下几项:
    my $vip = ‘192.168.200.60/24’; #定义VIP
    my $key = ‘0’; #定义网卡后缀数值
    my sshstartvip=&quot;/sbin/ifconfigeth0:ssh_start_vip = &quot;/sbin/ifconfig eth0:sshs​tartv​ip="/sbin/ifconfigeth0:key $vip"; #绑定VIP的命令,注意网卡名
    my sshstopvip=&quot;/sbin/ifconfigeth0:ssh_stop_vip = &quot;/sbin/ifconfig eth0:sshs​topv​ip="/sbin/ifconfigeth0:key down"; #关闭VIP的命令

    #还需要在mha配置文件中添加一行参数,指定启用VIP的命令的路径
    master_ip_failover_script=/usr/local/bin/master_ip_failover

  • 重启管理节点的mha进程
    pkill perl
    nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &
    若启动失败,需要进行mha的ssh测试和主从复制测试

##5.2 配置binlog-server备份服务器
防止主库宕机,binlog复制不及时的问题,此处把备份服务器和管理节点配置为一台

#修改管理节点mha配置文件,在全局binlog存放位置下插入:
master_ip_failover_script=/usr/local/bin/master_ip_failover

#并且在文件最后,添加新模块
[binlog1]
#添加binlog模块
no_master=1
#不允许切换为主
hostname=192.168.200.183
#存放IP
master_binlog_dir=/data/mysql/binlog/
#binlog存放位置优先级比全局的高,主库上的binlog日志会被复制到这个IP的这个目录下

然后进行日志拉取:

#创建存放目录并进入
mkdir -p /data/mysql/binlog/
cd /data/mysql/binlog/

#关闭主从切换进程,才能开启拉取日志进程,不然报错
#拉取主库binlog日志,指定从VIP拉取,从00001开始且stop-never
#开启拉取进程后,再开启主库切换
pkill perl

mysqlbinlog -R --host=192.168.200.60 --user=mha --password=123123 --raw --stop-never mysql-bin.000001 &

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

#6 源码安装mha方法
##6.1 安装node节点:
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Params-Validate perl-CPAN perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
tar xf mha4mysql-node-0.56.tar.gz -C /usr/src/
cd /usr/src/mha4mysql-node-0.56/
perl Makefile.PL
make && make install
##6.2 安装manager节点:
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Params-Validate perl-CPAN perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
tar xf mha4mysql-manager-0.56.tar.gz -C /usr/src/
cd /usr/src/mha4mysql-manager-0.56/
perl Makefile.PL
make && make install

#7 Atlas实现读写分离
##7.1 简介

  • 开发于MySQL官方退出的MySQL-proxy0.8.2版本基础之上,属于一个基于mysql协议的中间件

  • 主要功能:

  1. 读写分离,从库负载均衡
  2. IP过滤
  3. 自动分表
  4. DBA可平滑上下线DB,自动摘除宕机DB

##7.2 manager管理节点上安装配置Atlas
#安装:
rpm -ivh Atlas-2.2.1.e16.×86_64.rpm

#配置:先备份该配置文件,然后修改

cat -n /usr/local/mysql-proxy/conf/test.cnf | egrep -w "12|15|18|36|48"
12 proxy-backend-addresses = 192.168.200.60:3307
15 proxy-read-only-backend-addresses = 192.168.200.185:3307@1,192.168.200.183:3307@1
18 pwds = root:++gAN07C/Q0=,mha:++gAN07C/Q0=
30 log-level = error
36 sql-log = ON
45 proxy-address = 192.168.200.183:8888
48 admin-address = 192.168.200.183:5555

#其中,12行填写主库地址及端口,若配置了VIP填写VIP
15行填写从库地址,@后面的数字代表了负责均衡权重
18MySQL授权用户账号密码,密码使用/usr/local/mysql-proxy/bin/encrypt进行加密
30设置日志级别
36开启日志
45设置提供代理的监听端口为8888
48设置管理监听端口为5555

##7.3 数据库初始环境修改

  • 若管理节点上开启了mha进程和binlog拉取进程,先关闭
  • 修改管理节点mha配置文件
    将三个server的port都改为3307

  • 修改主从mysql库的监听端口,从配置文件上修改为3307,由于端口修改,需要修改从库的主从复制信息,在两台从库上,进行以下步骤:

    #关闭主从,重新写入信息,查看是否能正常同步
    stop slave;
    change master to master_host=‘192.168.200.184’,master_port=3306,master_auto_position=1,master_user=‘rep’,master_password=‘123123’;
    start slave;
    show slave status\G

##7.4 启动Atlas服务
#启动mysqlbinlog日志备份进程:
mysqlbinlog -R --host=192.168.200.184 --port=3307 --user=mha --password=123123 --raw --stop-never mysql-bin.000001 &

#启动mha管理进程:
nohup masterha_manager --conf=/etc/mha/mha1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/mha1/manager.log 2>&1 &

#启动Atlas服务:
/usr/local/mysql-proxy/bin/mysql-proxd test start

#指定实例test启动(可以多实例)
netstat -antup | grep mysql0-proxy
#查看代理端口8888和管理端口5555是否开启

##7.5 登录Atlas管理端口
在管理节点上,登录管理端口
mysql -uuser -ppwd -P5555 -h 192.168.200.183
查看有的权限:
select * from help;
查看各个库的读写分离属性
select * from backends;
主库应该是rw,从库应该是ro,状态应该都是up,这里是平滑管理界面,可以在这里根据选项修改设置

##7.6 进行读写分离机负载均衡测试
在mysql-slave-A和msql-slave-B上分别创建库db02,db03

mysql -uroot -p123123 -P3307
create database db02;

这里在mysql-masters上登录,查看,是看不到db02或者db03的,从库的操作,不会被同步到主库,可以登录远程管理节点(Atlas配置机)来测试读负载均衡:

mysql -uroot -p123123 -h 192.168.200.183 -P8888
show databases;
#出现db02,db03轮换代表负载成功

此时,创建一个表test01,再查看

create database test01;
show databases;
#多查看几次,若在有db02和db03情况下,都看到了test01,代表这个创建表的SQL语句,是写进了主库,经过主从同步到了从库,所以能证实读写分离

标签:slave,altas,192.168,mha,master,usr,mysql,MHA
来源: https://blog.csdn.net/jccodecode/article/details/100046575

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有