zoukankan      html  css  js  c++  java
  • linux系统mysql数据库MHA高可用

    1.MHA简介

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

    该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

    在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,较大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了的二进制日志,MHA可以将的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。

    2.MHA原理

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

    3.MHA工具介绍

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

    1.Manager工具:

    • masterha_check_ssh : 检查MHA的SSH配置。
    • masterha_check_repl : 检查MySQL复制。
    • masterha_manager : 启动MHA。
    • masterha_check_status : 检测当前MHA运行状态。
    • masterha_master_monitor : 监测master是否宕机。
    • masterha_conf_host : 添加或删除配置的server信息。
    • masterha_master_switch : 控制故障转移(自动或手动)。
    • masterha_secondary_check:建立TCP连接从远程服务器
    • masterha_stop:停止MHA

    2. Node工具

    • save_binary_logs : 保存和复制master的二进制日志。
    • apply_diff_relay_logs : 识别差异的中继日志事件并应用于其它slave。
    • filter_mysqlbinlog : 去除不必要的ROLLBACK事件(防止回滚事件,MHA已不再使用这个工具)。
    • purge_relay_logs : 清除中继日志(不会阻塞SQL线程)。
      注意:Node这些工具通常由MHA Manager的脚本触发,无需人手操作。

    MHA优点总结

    1)自动故障转移快

    2) 主库崩溃不存在数据一致性问题

    3)不需要对当前mysql环境做重大修改

    4) 不需要添加额外的服务器(仅一台manager就可管理上百个replication)

    5) 性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping包(默认 3秒),所以对性能无影响。你可以理解为MHA的性能和简单的主从复制框架性能一样。

    6) 只要replication支持的存储引擎,MHA都支持,不会局限于innodb

    4.基于GTID的主从复制

    GTID原理介绍
    GTID又叫全局事务ID(Global Transaction ID),是一个已提交事务的编号,并且是一个全局唯一的编号。MySQL5.6版本之后在主从复制类型上新增了GTID复制。
    GTID是由server_uuid和事务id组成的,即GTID = server_uuid:transaction_id。 server_uuid是在数据库启动过程中自动生成的,每台机器的server-uuid不一样。uuid存放在数据目录的auto.cnf文件下。而transaction_id就是事务提交时由系统顺序分配的一个不会重复的序列号。

    GTID存在的价值
    (1)GTID使用master_auto_position=1代替了基于binlog和position号的主从复制搭建方式,更便于主从复制的搭建。
    (2)GTID可以知道事务在最开始是在哪个实例上提交的。
    (3)GTID方便实现主从之间的failover,再也不用不断地去找position和binlog 了。

    主从复制中GTID的管理与维护
    GTID带来最方便的一点就是主从复制的搭建过程了。它跟异步复制、半同步复制类似,只不过不再利用传统复制模式的binlog文件和position号了,而是在从库“change master to”时使用master_auto_position=1的方式进行搭建,这就让操作变得更加方便和可靠。

    先决条件

    1.主库和从库开启binlog
    2.主库和从库server-id不同
    3.创建主从复制用户

    主库操作

    修改配置文件

    #编辑mysql配置文件
    [root@mysql-db01 ~]# vim /etc/my.cnf
    #在mysqld标签下配置
    [mysqld]
    server_id =1	#主库server-id为1,从库不等于1
    log_bin=mysql-bin	#开启binlog日志
    #重启mysql
    [root@mysql-db01 ~]# /etc/init.d/mysqld restart
    

    创建主从复制用户

    #登录数据库
    [root@mysql-db01 ~]# mysql -uroot -poldboy123
    #创建rep用户(做MHA每个机器都要创建这个用户)
    mysql> grant replication slave on *.* to rep@'172.16.1.5%' identified by '123';
    

    从库操作

    修改配置文件

    #修改mysql-db02配置文件
    [root@mysql-db02 ~]# vim /etc/my.cnf
    #在mysqld标签下配置
    [mysqld]
    server_id = 2	#主库server-id为1,从库必须大于1
    log_bin=mysql-bin	#开启binlog日志
    #重启mysql
    [root@mysql-db02 ~]# /etc/init.d/mysqld restart
    
    #修改mysql-db03配置文件
    [root@mysql-db03 ~]# vim /etc/my.cnf
    #在mysqld标签下配置
    [mysqld]
    server_id = 3	#主库server-id为1,从库必须大于1
    log_bin=mysql-bin	#开启binlog日志
    #重启mysql
    [root@mysql-db03 ~]# /etc/init.d/mysqld restart
    

    开启GID

    #编辑mysql配置文件(主库从库都需要修改)
    [root@mysql-db01 ~]# vim /etc/my.cnf
    #在[mysqld]标签下添加
    [mysqld]
    gtid_mode=ON
    log_slave_updates
    enforce_gtid_consistency
    #重启数据库
    [root@mysql-db01 ~]# /etc/init.d/mysqld restart
    
    [root@mysql-db02 ~]# vim /etc/my.cnf
    #在[mysqld]标签下添加
    [mysqld]
    gtid_mode=ON
    log_slave_updates
    enforce_gtid_consistency
    #重启数据库
    [root@mysql-db02 ~]# /etc/init.d/mysqld restart
    
    [root@mysql-db03 ~]# vim /etc/my.cnf
    #在[mysqld]标签下添加
    [mysqld]
    gtid_mode=ON
    log_slave_updates
    enforce_gtid_consistency
    #重启数据库
    [root@mysql-db03 ~]# /etc/init.d/mysqld restart
    
    #检查GTID状态
    mysql> show global variables like '%gtid%';
    +--------------------------+-------+
    | Variable_name            | Value |
    +--------------------------+-------+
    | enforce_gtid_consistency | ON    | #执行GTID一致
    | gtid_executed            |       |
    | gtid_mode                | ON    | #开启GTID模块
    | gtid_owned               |       |
    | gtid_purged              |       |
    +--------------------------+-------+
    

    配置主从复制

    #所有从库执行 chang master to语句,配置复制主机信息
    mysql> change master to 
    ->	master_host='172.16.1.51',
    ->	master_user='rep',
    ->	master_password='123',
    ->	master_auto_position=1;
    
    #开启slave
    mysql> start slave;
    #查看slave状态
    mysql> show slave statusG
    

    5.部署MHA

    部署MHA之前的配置:

    1.只有从库配置:
    	#从库设置只读
    	mysql> set global read_only=1;
    
    2.主库和从库都执行:
    	#在配置文件中设置,关闭MySQL自动清除relaylog的功能,跳过反向解析
    	[root@mysql-db01 ~]# vim /etc/my.cnf
    	[mysqld]
    	relay_log_purge = 0
    	skip_name_resolve	
    	#关闭MySQL自动清除relaylog的功能
    	mysql> set global relay_log_purge = 0;
    

    环境准备

    #每台机器上传MHA的rpm包
    [root@mysql-db01 ~]# ll
    mha4mysql-manager-0.56-0.el6.noarch.rpm
    mha4mysql-node-0.56-0.el6.noarch.rpm
    
    部署node节点(3台):
    #安装依赖包
    [root@mysql-db01 ~]# yum install perl-DBD-MySQL -y
    #安装node包(3台):
    [root@db-01 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
    [root@db-02 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
    [root@db-03 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
    
    部署manager节点(1台:10.0.0.53)
    #安装manager依赖包
    [root@mysql-db03 ~]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
    #安装manager包
    [root@db-03 ~]# yum localinstall -y mha4mysql-manager-0.56-0.el6.noarch.rpm
    
    #添加mha管理账号(所有节点)
    mysql> grant all on *.* to mha@'172.16.1.5%' identified by 'mha';
    
    命令软连接(所有节点)
    #如果不创建命令软连接,检测mha复制情况的时候会报错
    [root@db-01 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/
    [root@db-01 ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin/
    

    配置ssh免密登录

    #做ssh 免密登录(下面4条命令,所以节点都执行)
    #创建秘钥对
    [root@db-01 ~]## ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
    #发送公钥,包括自己
    [root@db-01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.51
    [root@db-01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.52
    [root@db-01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.53
    

    编辑配置文件

    #在安装manager节点的机器上,创建mha配置文件目录
    [root@db-03 ~]# mkdir /etc/mha/
    #编辑mha配置文件
    [root@mysql-db03 ~]# vim /etc/mha/app1.cnf
    [server default]
    manager_log=/etc/mha/manager.log		#manager的日志
    manager_workdir=/etc/mha/app1/			#manager的工作目录
    master_binlog_dir=/usr/local/mysql/data	#master保存binlog的位置,以便MHA可找到master的日志
    password=mha							#MHA管理账号的密码						
    ping_interval=2							#监控主库发送ping包的时间间隔,尝试三次没有回应则切换主库
    repl_password=123						#主从复制环境中的用户的密码
    repl_user=rep							#主从复制环境中的用户名 
    ssh_user=root							#ssh的登录用户名
    user=mha								#MHA管理账号
    
    [server1]
    hostname=172.16.1.51
    port=3306
    
    [server2]
    hostname=172.16.1.52
    port=3306
    
    [server3]
    hostname=172.16.1.53
    port=3306
    
    

    MHA启动前检测

    #测试ssh
    [root@db03 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
    #看到如下字样,则测试成功
    Tue Mar  7 01:03:33 2017 - [info] All SSH connection tests passed successfully.
    #测试复制
    [root@db03 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
    #看到如下字样,则测试成功
    MySQL Replication Health is OK.
    

    启动MHA

    #启动MHA
    [root@db03 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &
    
    #检测MHA启动状态
    [root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
    app1 (pid:10434) is running(0:PING_OK), master:172.16.1.52
    
    #启动命令分析
    nohup 
    masterha_manager			#MHA的启动程序
    --conf=/etc/mha/app1.cnf	#指定配置文件
    --remove_dead_master_conf	#移除宕机的server标签从配置文件里
    --ignore_last_failover		#忽略上一次的切换
    < /dev/null > /etc/mha/manager.log 2>&1 &
    
    MHA的工作机制:
    1.完成一次切换后,会生成一个锁文件在工作目录中
    2.下次切换之前,会检测锁文件是否存在
    3.如果锁文件存在,8个小时之内不允许第二次切换
    

    切换主库测试

    #STOP主库
    [root@db01 ~]# /etc/init.d/mysqld stop
    #在STOP主库同时可以看着manager日志
    [root@db03 ~]# tail -f /etc/mha/manager.log
    #在db03上可以看到主库以切换成db02
    mysql> show slave statusG
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 172.16.1.52
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000009
              Read_Master_Log_Pos: 231
                   Relay_Log_File: db03-relay-bin.000002
                    Relay_Log_Pos: 361
            Relay_Master_Log_File: mysql-bin.000009
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    

    MHA环境修复

    1.修复宕机的主库
    [root@db01 ~]# /etc/init.d/mysqld start
    2.在MHA的日志中,找到change master 语句
    [root@db-03 ~]# grep -i 'change master to' /etc/mha/manager.log 
    Thu Jul 25 04:38:35 2019 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='172.16.1.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='xxx';
    3.在宕机的主库中执行change master语句
    mysql> CHANGE MASTER TO MASTER_HOST='172.16.1.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123';
    4.开启IO和SQL线程,将宕机的主库重新加入集群变成从库
    mysql> start slave;
    5.在manager配置文件中,将server标签重新添加
    [root@db03 ~]# vim /etc/mha/app1.cnf 
    [server1]
    hostname=172.16.1.51
    port=3306
    6.启动MHA
    [root@db03 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/manager.log 2>&1 &
    7.检测MHA启动状态
    [root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
    app1 (pid:10434) is running(0:PING_OK), master:172.16.1.52
    

    6.配置VIP漂移

    修改MHA主配置文件

    [root@db03 ~]# vim /etc/mha/app1.cnf
    #在[server default]标签下添加
    master_ip_failover_script=/etc/mha/master_ip_failover	#使用MHA自带脚本
    

    编辑脚本

    #根据配置文件中脚本路径编辑
    [root@db03 ~]# vim /etc/mha/master_ip_failover
    #修改以下几行内容
    my $vip = '172.16.1.55/24';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; 
    #添加执行权限,否则mha无法启动
    [root@db03 ~]#  chmod +x /etc/mha/master_ip_failover
    

    手动绑定VIP

    #绑定vip
    [root@db01 ~]# ifconfig eth1:1 172.16.1.55/24
    

    7.配置binlog-server

    修改mha配置文件

    [root@db03 ~]# vim /etc/mha/app1.cnf
    [binlog1]
    no_master=1
    hostname=10.0.0.53
    master_binlog_dir=/data/mysql/binlog/
    

    备份binlog

    #创建备份binlog目录
    [root@db03 ~]# mkdir -p /data/mysql/binlog/
    #进入该目录
    [root@db03 ~]# cd /data/mysql/binlog/
    #备份binlog
    [root@db03 binlog]# mysqlbinlog  -R --host=172.16.1.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000001 &
    #启动mha
    [root@mysql-db03 binlog]# 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.Atlas

    Atlas主要功能

    1.读写分离

    2.从库负载均衡

    3.IP过滤

    4.自动分表

    5.DBA可平滑上下线DB

    6.自动摘除宕机的DB

    下载安装Atlas

    #下载Atlas
    [root@db03 ~]# 
    wget httpss://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
    #安装
    [root@db03 ~]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 
    Preparing...               ########################################### [100%]
      1:Atlas                  ########################################### [100%]
    

    编辑配置文件

    #进入Atlas工具目录
    [root@db03 ~]# cd /usr/local/mysql-proxy/bin/
    #生成密码
    [root@db03 bin]# ./encrypt 123
    #修改Atlas配置文件
    [root@db03 ~]# vim /usr/local/mysql-proxy/conf/test.cnf
    #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
    proxy-backend-addresses = 172.16.1.51:3306
    #Atlas后端连接的MySQL从库的IP和端口
    proxy-read-only-backend-addresses = 10.0.0.52:3306,10.0.0.53:3306
    #用户名与其对应的加密过的MySQL密码
    pwds = rep:3yb5jEku5h4=
    #SQL日志的开关
    sql-log = ON
    #Atlas监听的工作接口IP和端口
    proxy-address = 0.0.0.0:1234
    #默认字符集,设置该项后客户端不再需要执行SET NAMES语句
    charset = utf8
    

    启动

    [root@db03 ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
    OK: MySQL-Proxy of test is started
    

    Atlas管理操作

    #用atlas管理用户登录
    [root@db03 ~]# mysql -uuser -ppwd -h127.0.0.1 -P2345
    #查看可用命令帮助
    mysql> select * from help;
    #查看后端代理的库
    mysql> SELECT * FROM backends;
    +-------------+----------------+-------+------+
    | backend_ndx | address        | state | type |
    +-------------+----------------+-------+------+
    |           1 | 10.0.0.51:3307 | up    | rw   |
    |           2 | 10.0.0.53:3307 | up    | ro   |
    |           3 | 10.0.0.52:3307 | up    | ro   |
    +-------------+----------------+-------+------+
    #平滑摘除mysql
    mysql> REMOVE BACKEND 2;
    Empty set (0.00 sec)
    #检查是否摘除成功
    mysql> SELECT * FROM backends;
    +-------------+----------------+-------+------+
    | backend_ndx | address        | state | type |
    +-------------+----------------+-------+------+
    |           1 | 10.0.0.51:3307 | up    | rw   |
    |           2 | 10.0.0.52:3307 | up    | ro   |
    +-------------+----------------+-------+------+
    #保存到配置文件中
    mysql> SAVE CONFIG;
    Empty set (0.06 sec)
    
  • 相关阅读:
    java基础面试题:说说&和&&的区别
    java基础面试题:java中有没有goto? 在JAVA中如何跳出当前的多重嵌套循环?
    Java基础面试操作题: 获取 1-20 之间的随机数,共计 20 个,要求不能重复 获取 1-20 之间的随机数,共计 10 个,要求不能重
    Intellij设置Eclipse 快捷键
    Intellij 安装sonarlint
    Intellij 关闭参数提示
    Linux中Firefox——Firebug插件安装及使用
    Linux中Firefox——Httpfox插件安装及使用
    OpenCV——Haar-like特征
    Python学习笔记6(列表生成式)
  • 原文地址:https://www.cnblogs.com/zabcd/p/13366390.html
Copyright © 2011-2022 走看看