MySQL - MHA架构

412 阅读3分钟

本篇将向大家演示MHA架构过程(后面会续更一些理论知识)

  • 演示环境介绍

        CentOS: 7.0.4
        MySQL:  5.7.4
        主服务器IP:  192.168.252.128
        从服务器IP:  192.168.252.129
        从服务器IP:  192.168.252.130
        监控服务器IP:192.168.252.131
        虚拟IP:      192.168.252.220
    
  • 配置步骤

    • 主从复制环境搭建 (如果你的mysql版本是5.7以上建议采用基于GTID的复制方式)

      MySQL主从环境搭建

    • 数据库主服务器配置虚拟IP (其他服务器不用管)

      'localhost@root> ifconfig 网卡名称:1 192.168.252.220/24 netmask 255.255.255.0'
      
    • MHA集群内所有服务器互相配置SSH免验签登录

          (1):生成ssh密钥【如果之前配置过第一步就可以跳过了】
          'localhost@root> ssh-keygen' #一直回车就行
          (2):将ssh密钥拷贝至集群中其他服务器
          'localhost@root> ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@192.168.252.128' 
          # 所有服务器都循环往复直至所有服务器都可以免签登录至任意一台服务器
      
    • MHA集群内所有服务器安装MHA-node及MHA-manaeger扩展包

          'localhost@root> yum -y install epel-release perl-Config-Tiny.noarch perl-Time-HiRes.x86  perl-DBD-MySQL ncftp'
          'localhost@root> yum -y install perl-Parallel-ForkManager perl-Log-Dispatch'
      
    • MHA集群内所有服务器安装 MHA-node软件包

          'localhost@root> rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm'
      
    • MHA监控服务器安装 MHA-manager软件包

          'localhost@root> rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm'
      
    • 主服务器创建MHA管理员账号

          'mysql> grant all privileges on *.* to mha@192.168.252.131 identified by 123456'
      
    • 创建MHA配置文件及工作目录

          # 集群内所有服务器都需要创建/home/mysql_mha
          'localhost@root> mkdir -p /home/mysql_mha /etc/mha'
          'localhost@root> vi /etc/mha/mysql_mha.cnf'
          
          [server default]
          # MHA管理员账号
          user = mha
          # MHA管理员密码
          password = 123456
          # MHA工作目录
          manager_workdir = /home/mysql_mha
          # MHA日志存放目录
          manager_log = /home/mysql_mha/manager.log
          # 数据服务器MHA同步目录
          remote_workdir = /home/mysql_mha
          # ssh连接账户
          ssh_user = root
          # 从服务器连接账户 (确保每一个从库中都有这个账户,不然后面会报错)
          repl_user = slaveroot
          # 从服务器连接密码
          repl_password = root
          # 心跳间隔时间 (单位:秒)
          ping_interval = 1
          # mysql日志存放目录
          master_binlog_dir = /usr/local/mysql/var/
          # ip脚本校验脚本存放位置
          master_ip_failover_script = /usr/bin/master_ip_failover
          # 需要验证的服务器 (我这里把所有数据库服务器都放进去了)
          secondary_check_script = /usr/bin/masterha_secondary_check -s 192.168.252.128 -s 192.168.252.129 -s 192.168.252.130
          
          [server1]
          # 服务器IP
          hostname = 192.168.252.128
          # 允许成为候选主机 (如不想这个IP成为主服务器把key换成no_master)
          candidate_master = 1
          
          [server2]
          hostname = 192.168.252.129
          candidate_master = 1
          
          [server3]
          hostname = 192.168.252.130
          candidate_master = 1
      
    • 创建MHA-ip校验脚本

          'localhost@host> vi /usr/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.252.220/24'; # 虚拟ip,大家只需要修改这一项就好
          my $key = '88';
          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";
          }
      
      
    • 验证配置结果

          # 修改文件执行权限
          'localhost@root> chmod 0777 /usr/bin/master_ip_failover'
          
          # 验证ssh (验证结果为 All SSH connection tests passed successfully. 表示配置成功)
          'localhost@root> masterha_check_ssh --conf=/etc/mha/mysql_mha.cnf'
          
          # 验证主从复制 (验证结果为 MySQL Replication Health is OK. 表示配置成功)
          'localhost@root> masterha_check_repl --conf=/etc/mha/mysql_mha.cnf'
          
          # 启动MHA
          'localhost@root> nohup /usr/bin/masterha_maneger --conf=/etc/mha/mysql_mha.cnf &'
      

      未完待续