mysql8 MHA集群部署

服务器环境

系统 主机名 IP
centos7.9 mha-master 192.168.200.41、192.168.200.45(vip)
centos7.9 mha-slave01 192.168.200.42
centos7.9 mha-slave02 192.168.200.43
centos7.9 mha-monitor 192.168.200.40

SSH互信

mha-master、mha-slave01、mha-slave02、mha-monitor四台机器之间设置免密互信

mysql安装

  1. mha-master、mha-slave01、mha-slave02安装mysql8

    tar zxvf mysql-8.0.19-1.el7.x86_64.rpm-bundle.tar.gz
    
    rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
    
    rpm -ivh mysql-community-common-8.0.19-1.el7.x86_64.rpm --nodeps --force
    rpm -ivh mysql-community-libs-8.0.19-1.el7.x86_64.rpm --nodeps --force
    rpm -ivh mysql-community-client-8.0.19-1.el7.x86_64.rpm --nodeps --force
    rpm -ivh mysql-community-server-8.0.19-1.el7.x86_64.rpm --nodeps --force
    # yum 安装perl-DBD-MySQL依赖
    rpm -ivh mysql-community-libs-compat-8.0.19-1.el7.x86_64.rpm --nodeps --force
    
    
    mkdir -p /data/mysql/data /data/mysql/mysql-files /data/mysql/mysql-keyring
    chown -R mysql:mysql /data/mysql
    rm -rf /var/lib/mysql
    rm -rf /var/lib/mysql-files
    rm -rf /var/lib/mysql-keyring
    ln -s /data/mysql/data /var/lib/mysql
    ln -s /data/mysql/mysql-files /var/lib/mysql-files
    ln -s /data/mysql/mysql-keyring /var/lib/mysql-keyring
    
  2. 修改my.cnf

    [mysqld]
    port=3308
    default-time-zone='+08:00' 
    server-id=41 # server的唯一标识
    log-bin=mysql-bin
    binlog_format=row
    
    binlog-ignore-db=mysql #要忽略的数据库
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=sys
    
    replicate_ignore_db=mysql
    replicate_ignore_db=information_schema
    replicate_ignore_db=performance_schema
    replicate_ignore_db=sys
    
    log-slave-updates=1 # 允许从服务器将复制时间写入binglog日志
    skip-name-resolve # 禁用DNS解析,加快IP方式的连接
    
    auto-increment-increment=1
    auto-increment-offset=1
    
    gtid-mode=on # 开启gtid模式
    enforce-gtid-consistency=1 # 开启gtid安全限制
    report_host=192.168.200.41 # 报告主机监控地址
    
    default-authentication-plugin=mysql_native_password
    
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    pid-file=/var/run/mysqld/mysqld.pid
    
    log-error=/var/lib/mysql/mysqld.log
    slow_query_log = 1
    long_query_time = 2
    slow_query_log_file = /var/lib/mysql/mysql-slow.log
    
    
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_general_ci
    init_connect='SET NAMES utf8mb4'
    
    max_connections = 1024
    max_connect_errors = 6000
    open_files_limit = 65535
    table_open_cache = 128
    max_allowed_packet = 200M
    binlog_cache_size = 1M
    max_heap_table_size = 8M
    tmp_table_size = 16M
    read_buffer_size = 2M
    read_rnd_buffer_size = 8M
    sort_buffer_size = 8M
    join_buffer_size = 8M
    thread_cache_size = 64
    key_buffer_size = 4M
    ft_min_word_len = 4
    transaction_isolation = REPEATABLE-READ
    
    performance_schema = 0
    explicit_defaults_for_timestamp=true
    lower_case_table_names=1
    skip-external-locking 
    default-storage-engine = InnoDB 
    innodb_file_per_table = 1
    
    innodb_open_files = 500
    
    innodb_buffer_pool_size = 6G
    innodb_buffer_pool_chunk_size = 128M
    innodb_buffer_pool_instances = 16
    
    innodb_write_io_threads = 4
    innodb_read_io_threads = 4
    innodb_thread_concurrency = 0
    innodb_purge_threads = 1
    innodb_flush_log_at_trx_commit = 2
    innodb_log_buffer_size = 2M
    innodb_log_file_size = 32M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 90
    innodb_lock_wait_timeout = 120 
    bulk_insert_buffer_size = 8M
    myisam_sort_buffer_size = 8M
    myisam_max_sort_file_size = 10G
    myisam_repair_threads = 1
    interactive_timeout = 7200
    wait_timeout = 86400
    
    [client]
    default-character-set = utf8mb4
    [mysql]
    socket=/var/lib/mysql/mysql.sock
    default-character-set = utf8mb4
    
  3. mha-master、mha-slave01、mha-slave02启动mysql服务并修改root密码

    # 修改mysql的root账号初始权限
    alter user 'root'@'localhost' identified with mysql_native_password by "p2+EH+zA|#qOSdn^fNT8";
    flush privileges;
    
  4. mha-master创建MHA账号和主从同步账号repl

    # 创建主从同步账号repl,并授权
    create user 'repl'@'192.168.200.%' identified with mysql_native_password by 'Test0102@.';
    
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.200.%';
    
    # 创建MHA账号并授权
    create user 'mha'@'192.168.200.%' identified with mysql_native_password by 'Test0102@.';
    
    grant all privileges on *.* to 'mha'@'192.168.200.%';
    
    flush privileges;
    
  5. mha-slave01、mha-slave02从库设置

    change master to master_host='192.168.200.41',master_port=3308,master_user='repl',master_password='Test0102@.',master_auto_position=1;
    

MHA 安装部署

  1. 所有节点安装MHA Node

    
    # 依赖安装
    yum -y install perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-CPAN
    
    # 软件下载地址
    https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
    
    # 源码编译安装
    tar -zxf mha4mysql-node-0.58.tar.gz
    cd mha4mysql-node-0.58/
    
    perl Makefile.PL
    make
    sudo make install
    
    # 查看安装成功后的脚本文件
    ll /usr/local/bin/
    
    
  2. mha-monitor节点安装MHA Manager

    # 安装依赖(需要epel的yum源,否则perl-Log-Dispatch,perl-Parallel-ForkManager这2个包安装不了)
    yum -y install perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-CPAN perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
    
    # 软件下载地址
    https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
    
    # 源码编译安装
    tar -zxf mha4mysql-manager-0.58.tar.gz
    cd mha4mysql-manager-0.58/
    perl Makefile.PL
    make
    sudo make install
    
    # 拷贝脚本文件至/usr/local/bin/
    cp samples/scripts/master_ip_failover /usr/local/bin/
    cp samples/scripts/master_ip_online_change /usr/local/bin/
    
    # 查看安装成功后的脚本文件
    ll /usr/local/bin/
    
    # 配置 MHA Manager
    mkdir /etc/mha
    mkdir /usr/local/mha
    mkdir -p /var/log/masterha/app1
    
    cat > /etc/mha/mha.cnf << EOF
    
    [server default]
    manager_workdir=/var/log/masterha/app1
    manager_log=/var/log/masterha/app1/app1.log
    master_ip_failover_script=/usr/local/bin/master_ip_failover
    master_ip_online_change_script=/usr/local/bin/master_ip_online_change
    ping_interval=1
    secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.200.42 -s 192.168.200.43
    ssh_user=root
    user=mha
    password=Test0102@.
    repl_user=repl
    repl_password=Test0102@.
    
    [server1]
    hostname=192.168.200.41
    port=3308
    
    [server2]
    hostname=192.168.200.42
    port=3308
    candidate_master=1
    
    
    [server3]
    hostname=192.168.200.43
    port=3308
    
    EOF
    
    # 修改手动vip切换脚本
    cat > /usr/local/bin/master_ip_failover << EOF
    #!/usr/bin/env perl
    
    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.200.45/24';
    my $ifdev = 'ens33';
    my $key = '1';
    my $ssh_start_vip = "/sbin/ifconfig $ifdev:$key $vip";
    my $ssh_stop_vip = "/sbin/ifconfig $ifdev:$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();
          # updating global catalog, etc
          $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 $@;
    
          # If you want to continue failover, exit 10.
          exit $exit_code;
        }
        exit $exit_code;
      }
      elsif ( $command eq "status" ) {
    
        print "Checking the Status of the script.. OK \n";
        # do nothing
        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";
    }
    
    EOF
    
    # 手动测试切换VIP/usr/local/bin/master_ip_failover
    
    停
    /usr/local/bin/master_ip_failover --command=stop --ssh_user=root --orig_master_host=192.168.200.42 --orig_master_ip=192.168.200.42 --orig_master_port=3308 --new_master_host=192.168.200.41 --new_master_ip=192.168.200.41 --new_master_port=3308
    
    启
    /usr/local/bin/master_ip_failover --command=start --ssh_user=root --orig_master_host=192.168.200.41 --orig_master_ip=192.168.200.41 --orig_master_port=3308 --new_master_host=192.168.200.42 --new_master_ip=192.168.200.42 --new_master_port=3308
    
    # 自动切换脚本/usr/local/bin/master_ip_online_change
    
    # MHA 检测ssh状态
    masterha_check_ssh --conf=/etc/mha/mha.cnf
    
    # MHA 检测mysql集群主从状态
    masterha_check_repl --conf=/etc/mha/mha.cnf
    
    # MHA Manager启动
    nohup masterha_manager --conf=/etc/mha/mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/app1.log 2>&1 &
    
    # MHA Manager关闭
    masterha_stop --conf=/etc/mha/mha.cnf
    
    

你可能感兴趣的:(数据库,mysql,数据库)