mysql高可用架构

高可用架构代表产品

  • MHa
  • PXC
  • InnoDB Cluster
  • MGC
  • MySQL Cluster
  • Mycat

读写分离代表产品

  • Atlas
  • ProxySQL
  • Mycat
  • Maxscale

分布式架构代表产品

  • Mycat
  • DBLE
  • sharding-jdbc
  • ProxySQL

Newsql

  • PinCAP TiDB
  • Aliyun PolarDB
  • Goole Spanner

MHA架构搭建

0.56下载地址

  1. 创建软链接
    ln -s /data/app/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
    ln -s /data/app/mysql/bin/mysql /usr/bin/mysql

  2. 各节点相互通信

  3. 各节点创建用户
    grant all privileges on . to mha@‘10.0.0.%’ identified by ‘mha’;

  4. 创建配置文件目录
    mkdir -p /etc/mha

  5. 创建日志文件目录
    mkdir -p /var/log/mha/app1

  6. 编辑配置文件

    vim /etc/mha/app1.cnf
    [server default]
    manager_log=/var/log/mha/app1/manager        
    manager_workdir=/var/log/mha/app1            
    master_binlog_dir=/data/binlog #主库binlog文件目录       
    user=mha                                   
    password=mha                               
    ping_interval=2 #隔两秒通信主库,通信四次失败会切换
    repl_password=123
    repl_user=repl
    ssh_user=root                               
    [server1]                                   
    hostname=10.0.0.51
    port=3306                                  
    [server2]            
    hostname=10.0.0.52
    port=3306
    [server3]
    hostname=10.0.0.53
    port=3306
    
  7. 互信检查
    masterha_check_ssh --conf=/etc/mha/app1.cnf

  8. 主从状态检查
    masterha_check_repl --conf=/etc/mha/app1.cnf

  9. 开启MHA
    关闭MHA masterha_stop --conf=/etc/mha/app1.cnf

    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 &
    #nohup僵尸进程,--remove_dead_master_conf故障切换时把故障的主机从配置文件中删除,默认的话转移失败,八小时之内不进行转移,ignore_last_failover忽略
    

    MHA命令介绍

  10. 查看MHA状态
    masterha_check_status --conf=/etc/mha/app1.cnf

MHA软件结构

manager组件

masterha_manger             启动MHA 
masterha_check_ssh      	检查MHA的SSH配置状况 
masterha_check_repl         检查MySQL复制状况 
masterha_master_monitor     检测master是否宕机 
masterha_check_status       检测当前MHA运行状态 
masterha_master_switch  	控制故障转移(自动或者手动)
masterha_conf_host      	添加或删除配置的server信息

node组件

save_binary_logs            保存和复制master的二进制日志 
apply_diff_relay_logs       识别差异的中继日志事件并将其差异的事件应用于其他的
purge_relay_logs            清除中继日志(不会阻塞SQL线程)

MHA原理

选主

candidate_master=1  强制某个节点为备选主。如果日志量超过100M差异,放弃掉他。
check_repl_delay=0  不检查日志量的差异。
如果都没有配置,则选择日志量写入多的实例,如果都一致,按配置文件的先后顺序

日志补偿

主库宕机后如果能ssh连接,会立即保存缺失部分的binlog到/var/tmp/xxxxx
主库宕机后如果不能sshh连接,计算两个从节点的relay-log日志差异。

vip故障转移脚本

  1. master_ip_failover上传到/usr/local/bin目录下
  2. my $vip = '10.0.0.55/24'; #vip地址
    my $key = '1'; #辅助网卡序号
    my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; #网卡名称
    my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
    my $ssh_Bcast_arp= "/sbin/arping -I eth0 -c 3 -A 10.0.0.55";
    
  3. vim /etc/mha/app1.cnf master_ip_failover_script=/usr/local/bin/master_ip_failover
  4. 手工添加vip

故障提醒脚本

vim send_report
my $smtp='smtp.qq.com';             # smtp服务器
my $mail_from='[email protected]';    # 发件箱
my $mail_user='22654481';           # 用户名 QQ号
my $mail_pass='gemghsvgkeyzcagh';   # 授权码
my $mail_to=['[email protected]'];    # 收件箱

vim /etc/mha/app1.cnf  
report_script=/usr/local/bin/send_report

日志补偿的冗余方案

mha节点拉取主库的binlog日志,一定能保证和主库是一模一样的日志

  1. mkdir -p /data/binlog_server/ 创建存放日志的目录并授权
  2. cd /data/binlog_server/mysqlbinlog -R --host=10.0.0.51 --user=mha --password=mha --raw --stop-never mysql-bin.000008 & --stop-nerer一直拉取
    拉取日志的起点,需要按照目前从库的已经获取到的二进制日志点为起点
  3. vim /etc/mha/app1.cnf 
    [binlog1]
    master_binlog_dir=/data/binlog_server/
    

MHA在线切换

  1. vim /usr/local/bin/master_ip_online_change
    
    my $vip = "10.0.0.55/24";
    my $key = "1";
    my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig ens33:$key $vip down";
    my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 10.0.0.55";
    
  2. vim /etc/mha/app1.cnf master_ip_online_change_script=/usr/local/bin/master_ip_online_change
  3. 停MHA
  4. masterha_master_switch  --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=10.0.0.51 --orig_master_is_new_slave --running_updates_limit=10000
    #--master_state=alive在线切换,--orig_master_is_new_slave原来的主库变成从库,--running_updates_limit=10000延迟大于一万毫秒切换失败
    
  5. 重新拉取日志

你可能感兴趣的:(mysql高可用架构)