<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MySQL MHA部署與測(cè)試-上篇

          共 21863字,需瀏覽 44分鐘

           ·

          2021-06-12 04:01

          目錄

          • 1、介紹

            • 1.1 簡介

            • 1.2 主要特性

            • 1.3 組成結(jié)構(gòu)

          • 2、MHA 部署

            • 2.1 環(huán)境準(zhǔn)備

            • 2.2 環(huán)境部署

            • 2.3 MHA 部署

          • 3、vip、故障提醒、binlog_server

            • 3.1 vip 功能部署

            • 3.2 故障提醒功能部署

            • 3.3 binlog_server 搭建

          • 4、MHA 工作原理介紹

            • 4.1 主要工作流程介紹

            • 4.2 mha 選主策略

            • 4.3 數(shù)據(jù)補(bǔ)償


          1、介紹

          1.1 簡介

          MHA(Master High Availability)目前在MySQL高可用方面是一個(gè)相對(duì)成熟的解決方案,它由日本DeNA公司的youshimaton(現(xiàn)就職于Facebook公司)開發(fā),是一套優(yōu)秀的作為MySQL高可用性環(huán)境下故障切換和主從提升的高可用軟件

          1.2 主要特性

          MHA的主要特征:

          • master的監(jiān)控到故障轉(zhuǎn)移全部都能自動(dòng)完成,故障轉(zhuǎn)移也可以手動(dòng)執(zhí)行
          • 可在秒級(jí)單位內(nèi)實(shí)現(xiàn)故障轉(zhuǎn)移
          • 可將任意slave提升到master
          • 具備在多個(gè)點(diǎn)上調(diào)用外部腳本(擴(kuò)展)的技能,可以用在電源OFF或者IP地址的故障轉(zhuǎn)移上
          • 安裝和卸載不用停止當(dāng)前的mysql進(jìn)程
          • MHA自身不會(huì)增加服務(wù)器負(fù)擔(dān),不會(huì)降低性能,不用追加服務(wù)器
          • 不依賴Storage Engine
          • 不依賴二進(jìn)制文件的格式(不論是statement模式還是Row模式)
          • 針對(duì)OS掛掉的故障轉(zhuǎn)移,檢測(cè)系統(tǒng)是否掛掉需要10秒,故障轉(zhuǎn)移僅需4

          1.3 組成結(jié)構(gòu)

          manager 組件
          masterha_manger             # 啟動(dòng)MHA
          masterha_check_ssh         # 檢查MHA的SSH配置狀況
          masterha_check_repl         # 檢查MySQL復(fù)制狀況,配置信息
          masterha_master_monitor     # 檢測(cè)master是否宕機(jī)
          masterha_check_status       # 檢測(cè)當(dāng)前MHA運(yùn)行狀態(tài)
          masterha_master_switch      # 控制故障轉(zhuǎn)移(自動(dòng)或者手動(dòng))
          masterha_conf_host         # 添加或刪除配置的server信息

          node 組件
          save_binary_logs            # 保存和復(fù)制master的二進(jìn)制日志
          apply_diff_relay_logs       # 識(shí)別差異的中繼日志事件并將其差異的事件應(yīng)用于其他的
          purge_relay_logs            # 清除中繼日志(不會(huì)阻塞SQL線程)

          2、MHA 部署

          2.1 環(huán)境準(zhǔn)備

          2.1.1 拓?fù)?span style="display: none;">

          2.1.2 環(huán)境準(zhǔn)備

          需準(zhǔn)備Linux環(huán)境Mysql1 主 2 從環(huán)境,本次部署具體使用軟件版本情況如下 操作系統(tǒng):Linux CentOS 7.6數(shù)據(jù)庫:MySQL 8.0.20MHA:mha4mysql-0.58

          2.2 環(huán)境部署

          2.2.1 安裝操作系統(tǒng)

          操作系統(tǒng)版本:Linux CentOS 7.6

          主機(jī)名及ip

          db1:192.168.10.51,db2:192.168.10.52,db3:192.168.10.53

          2.2.2 安裝數(shù)據(jù)庫

          分別在三臺(tái)服務(wù)器安裝MySQL 8.0.20數(shù)據(jù)庫 配置文件如下:

          [mysqld]
          user=mysql
          basedir=/usr/local/mysql
          datadir=/data/3306/data
          socket=/tmp/mysql.sock

          gtid-mode=on                        # gtid開關(guān)
          enforce-gtid-consistency=true       # 強(qiáng)制GTID一致
          log-slave-updates=1                 # 從庫強(qiáng)制更新binlog日志

          log_bin = mysql-bin
          binlog_format = mixed
          expire_logs_days = 15
          log-error=/data/3306/data/mysql_error.log
          server-id = 51     # server-id 三臺(tái)不同 ,db2為52,db3為53
          default_authentication_plugin=mysql_native_password   #修改密碼加密方式

          [mysql]
          socket=/tmp/mysql.sock

          2.2.3 搭建主從環(huán)境

          搭建主從環(huán)境,確認(rèn) 1 主 2 從運(yùn)行正常

          2.3 MHA 部署

          2.3.1 節(jié)點(diǎn)互信

          db01

          rm -rf /root/.ssh
          ssh-keygen
          ssh-copy-id 192.168.10.51
          ssh-copy-id 192.168.10.52
          ssh-copy-id 192.168.10.53

          db02

          ssh-keygen
          ssh-copy-id 192.168.10.51
          ssh-copy-id 192.168.10.52
          ssh-copy-id 192.168.10.53

          db03

          ssh-keygen
          ssh-copy-id 192.168.10.51
          ssh-copy-id 192.168.10.52
          ssh-copy-id 192.168.10.53

          2.3.2 下載軟件

          mkdir -p /data/tools/ && cd /data/tools
          wget https://qiniu.wsfnk.com/mha4mysql-node-0.58-0.el7.centos.noarch.rpm --no-check-certificate
          wget https://qiniu.wsfnk.com/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm --no-check-certificate

          2.3.3 創(chuàng)建軟連接

          ln -s /usr/local/mysql/bin/mysqlbinlog  /usr/bin/mysqlbinlog
          ln -s /usr/local/mysql/bin/mysql          /usr/bin/mysql

          2.3.4 安裝軟件

          安裝node軟件(mhamanager軟件是依賴于node軟件運(yùn)行的,所以需要先安裝node端) db1-db3

          yum install perl-DBD-MySQL -y
          rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

          安裝managerdb3

          yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
          yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

          2.3.5 創(chuàng)建用戶

          db1主庫中創(chuàng)建mha用戶,此用戶用于mha用來確認(rèn)各節(jié)點(diǎn)存活狀態(tài)、binlog_server拉去binlog日志。(mysql 8.0 之后版本需要單獨(dú)創(chuàng)建用戶后授權(quán)。注意密碼加密方式)

          create user mha@'192.168.10.%' identified by 'mha';
          grant all privileges on *.* to mha@'192.168.10.%';

          2.3.6 創(chuàng)建相關(guān)目錄

          db3

          #創(chuàng)建配置文件目錄
           mkdir -p /etc/mha
          #創(chuàng)建日志目錄
           mkdir -p /var/log/mha/app1

          2.3.7 manager 配置文件

          db3

          cat > /etc/mha/app1.cnf <<EOF
          [server default]
          manager_log=/var/log/mha/app1/manager              # MHA的工作日志設(shè)置
          manager_workdir=/var/log/mha/app1                  # MHA工作目錄
          master_binlog_dir=/data/3306/data                  # 主庫的binlog目錄
          user=mha                                           # 監(jiān)控用戶
          password=mha                                       # 監(jiān)控密碼
          ping_interval=2                                    # 心跳檢測(cè)的間隔時(shí)間
          repl_password=123                                  # 復(fù)制用戶
          repl_user=rep                                      # 復(fù)制密碼
          ssh_user=root                                      # ssh互信的用戶

          [server1]                                          # 節(jié)點(diǎn)信息....
          hostname=192.16.10.51
          port=3306

          [server2]
          hostname=192.168.10.52
          port=3306
          candidate_master=1                                 # 被選主

          [server3]
          no_master=1                                        # 不參與選主
          hostname=192.168.10.53
          port=3306
          EOF

          2.3.8 檢查狀態(tài)

          db3

          # 檢查ssl互通情況
          [root@db3 ~]# vim /etc/mha/app1.cnf
          [root@db3 ~]# masterha_check_ssh   --conf=/etc/mha/app1.cnf
          ...
          Tue Jun  1 17:01:47 2021 - [info] All SSH connection tests passed successfully.


          #
           檢查 mha配置文件
          [root@db3 ~]# masterha_check_repl  --conf=/etc/mha/app1.cnf
          ...
          MySQL Replication Health is NOT OK!

          2.3.9 啟動(dòng) manager 服務(wù)

          db03

          [root@db3 ~]# 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 &
          [1] 4406

          --conf=/etc/mha/app1.cnf    # 指定配置文件
          --remove_dead_master_conf   # 剔除已經(jīng)死亡的節(jié)點(diǎn)
          --ignore_last_failover      # 默認(rèn)不能短時(shí)間(8小時(shí))多次切換,此參數(shù)跳過檢查

          2.3.10 查看 mha 運(yùn)行狀態(tài)

          [root@db3 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
          app1 (pid:4406) is running(0:PING_OK), master:192.168.10.51

          3、vip、故障提醒、binlog_server

          master_ip_failover  # vip故障轉(zhuǎn)移腳本
          send_report         # 故障提醒腳本

          3.1 vip 功能部署

          vip(eth0:1)網(wǎng)卡日常綁定在主庫的網(wǎng)卡上,如主庫出現(xiàn)錯(cuò)誤導(dǎo)致mha重新選主,也會(huì)跟隨移動(dòng)到新主庫的網(wǎng)卡上。所以要求各mha節(jié)點(diǎn)網(wǎng)卡名稱一致vip網(wǎng)段要求與各節(jié)點(diǎn)均在同一網(wǎng)段內(nèi)vip實(shí)現(xiàn)腳本是根據(jù)源碼 perl 腳本重新編寫master_ip_failover

          3.1.1 準(zhǔn)備腳本

          #!/usr/bin/env perl

          use strict;
          use warnings FATAL => 'all';

          use Getopt::Long;

          my (
              $command,          $ssh_user,        $orig_master_host, $orig_master_ip,
              $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port
          );

          my $vip = '192.168.10.49/24';
          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 192.168.10.49";

          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,
          );

          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";
          }

          3.1.2 修改腳本

          腳本中以下部分按照要求修改

          vim  /usr/local/bin/master_ip_failover

          my $vip = '192.168.10.49/24';      # vip網(wǎng)段,與各節(jié)點(diǎn)服務(wù)器網(wǎng)段一致。
          my $key = '1';                     # 虛擬網(wǎng)卡eth0:1 的 1
          my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";  # 網(wǎng)卡按照實(shí)際網(wǎng)卡名稱填寫
          my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";   # 網(wǎng)卡按照實(shí)際網(wǎng)卡名稱填寫
          my $ssh_Bcast_arp= "/sbin/arping -I eth0 -c 3 -A 192.168.10.49"# 重新聲明mac地址,arp

          3.1.3 上傳腳本并授權(quán)

          \cp -a * /usr/local/bin    # 上傳腳本文件到/usr/local/bin
          chmod +x /usr/local/bin/*  # 給腳本增加執(zhí)行權(quán)限
          dos2unix /usr/local/bin/*  # 處理腳本中的中文字符

          3.1.4 修改 manager 配置文件

          在配置文件中增加vip故障轉(zhuǎn)移部分

          vim /etc/mha/app1.cnf
          master_ip_failover_script=/usr/local/bin/master_ip_failover

          3.1.5 重啟 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 &

          3.1.6 在主庫 db1 增加 vip

          ifconfig eth0:1 192.168.10.49/24

          3.2 故障提醒功能部署

          3.2.1 準(zhǔn)備腳本

          #!/usr/bin/perl

          use strict;
          use warnings FATAL => 'all';
          use Mail::Sender;
          use Getopt::Long;

          #new_master_host and new_slave_hosts are set only when recovering master succeeded
          my ( $dead_master_host, $new_master_host, $new_slave_hosts, $subject, $body );
          my $smtp='smtp.qq.com';
          my $mail_from='[email protected]';
          my $mail_user='xxxxx';
          my $mail_pass='xxxxxx';
          #my $mail_to=['[email protected]','[email protected]'];
          my $mail_to='[email protected]';

          GetOptions(
            'orig_master_host=s' => \$dead_master_host,
            'new_master_host=s'  => \$new_master_host,
            'new_slave_hosts=s'  => \$new_slave_hosts,
            'subject=s'          => \$subject,
            'body=s'             => \$body,
          );

          # Do whatever you want here
          mailToContacts($smtp,$mail_from,$mail_user,$mail_pass,$mail_to,$subject,$body);

          sub mailToContacts {
           my ($smtp, $mail_from, $mail_user, $mail_pass, $mail_to, $subject, $msg ) = @_;
           open my $DEBUG, ">/tmp/mail.log"
            or die "Can't open the debug file:$!\n";
           my $sender = new Mail::Sender {
            ctype  => 'text/plain;charset=utf-8',
            encoding => 'utf-8',
            smtp  => $smtp,
            from  => $mail_from,
            auth  => 'LOGIN',
            TLS_allowed => '0',
            authid  => $mail_user,
            authpwd  => $mail_pass,
            to  => $mail_to,
            subject  => $subject,
            debug  => $DEBUG
           };
           $sender->MailMsg(
            {
             msg => $msg,
             debug => $DEBUG
            }
           ) or print $Mail::Sender::Error;
           return 1;
          }

          exit 0;

          修改以下部分為個(gè)人郵箱內(nèi)容

          #new_master_host and new_slave_hosts are set only when recovering master succeeded
          my ( $dead_master_host, $new_master_host, $new_slave_hosts, $subject, $body );
          my $smtp='smtp.qq.com';                   # 發(fā)件服務(wù)器
          my $mail_from='[email protected]';            # 發(fā)件地址
          my $mail_user='xxxxx';                    # 發(fā)件用戶名
          my $mail_pass='xxxxxx';                   # 發(fā)件郵箱密碼
          my $mail_to='[email protected]';              # 收件地址

          #my $mail_to=['[email protected]','[email protected]']; # 可設(shè)置收件郵箱群組

          3.2.2 修改 manager 配置文件

          vim /etc/mha/app1.cnf
          # 添加一行:
          report_script=/usr/local/bin/send_report

          3.2.3 重啟 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 &

          3.3 binlog_server 搭建

          binlog_server功能主要是實(shí)時(shí)拉去主庫binlog進(jìn)行存儲(chǔ),如果主庫出現(xiàn)宕機(jī),mha切換主從時(shí),通過binlog_server服務(wù)器拿取bin_log日志對(duì)新主庫進(jìn)行數(shù)據(jù)補(bǔ)償,實(shí)現(xiàn)日志補(bǔ)償冗余

          3.3.1 創(chuàng)建相關(guān)目錄

          mkdir -p /data/binlog_server/   # binlog_server存儲(chǔ)目錄
          chown -R mysql.mysql /data/*    # 授權(quán)

          3.3.2 開啟 binlog_server 服務(wù)

          cd  /data/binlog_server/     # 進(jìn)入binlog_server存儲(chǔ)目錄
          mysql -e "show slave status \G"|grep "Master_Log"  # 確認(rèn)當(dāng)前slave的io進(jìn)程拉取的日志量

          #
          # 啟動(dòng)binlog日志拉取守護(hù)進(jìn)程
          mysqlbinlog  -R --host=192.168.10.51 --user=mha --password=mha --raw  --stop-never mysql-bin.000004 &      # 注意:拉取日志的起點(diǎn),需要按照目前從庫的已經(jīng)獲取到的二進(jìn)制日志點(diǎn)為起點(diǎn)

          3.3.3 修改 manager 配置文件

          增加以下內(nèi)容

          vim /etc/mha/app1.cnf
          [binlog1]
          no_master=1
          hostname=192.168.10.53
          master_binlog_dir=/data/binlog_server/

          3.3.4 重啟 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 &

          4、MHA 工作原理介紹

          4.1 主要工作流程介紹

          • 1、啟動(dòng) MHA-manager
          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 &
          • 2、監(jiān)控
          /usr/bin/masterha_master_monitor # 每隔ping_interval秒探測(cè)1次,連續(xù)4次還沒有,說明主庫宕機(jī)。
          • 3、選主 根據(jù)各項(xiàng)參數(shù)選擇新主

          • 4、數(shù)據(jù)補(bǔ)償 對(duì)新主的數(shù)據(jù)差異進(jìn)行補(bǔ)償。

          • 5、切換 所有從庫解除主從身份。stop slave ; reset slave; 重構(gòu)新的主從關(guān)系。change master to

          • 6、遷移 vip 將 vip 網(wǎng)卡(eth0:1)綁定至新主服務(wù)器。

          • 7、故障提醒 發(fā)送故障提醒郵件

          • 8、額外數(shù)據(jù)補(bǔ)償 根據(jù) binlog_server 服務(wù)器進(jìn)行額外數(shù)據(jù)補(bǔ)償

          • 9、剔除故障節(jié)點(diǎn) 將故障的主服務(wù)器剔除 mha 環(huán)境(配置文件刪除)

          • 10、manager 程序“自殺

          4.2 mha 選主策略

          4.2.1 選主依據(jù)

          1、日志量latest

          選取獲取binlog最多的slave節(jié)點(diǎn),為latest節(jié)點(diǎn)

          [root@db3 ~]# mysql -uroot -p123456 -e "show slave status\G" |grep Master_Log
                    Master_Log_File: mysql-bin.000005
                    Read_Master_Log_Pos: 196
                    Relay_Master_Log_File: mysql-bin.000005
                    Exec_Master_Log_Pos: 196

          2、備選主prefmanager配置文件中指定了candidate_master=1參數(shù)

          [server2]
          hostname=192.168.10.52
          port=3306
          candidate_master=1     # 備選主

          3、不被選主 配置文件中設(shè)置no_master=1

          [server3]
          no_master=1    # 不被選
          hostname=192.168.10.53
          port=3306

          二進(jìn)制日志沒開log_bin如果從庫落后主庫100M的日志量(可以關(guān)閉) check_slave_delay

          4.2.2 節(jié)點(diǎn)數(shù)組

          alive存活
          latest日志最新
          perf被選
          bad不選

          4.2.3 選主判斷

          從上至下按條件依次篩選,上條不符合才會(huì)選擇下一條 1、沒有prefbad,就選latest第一個(gè)(根據(jù)配置文件 server1-2-3) 2、即是latest又是perf,又不是bad3、perflatest,都不是bad,選perf4、第3條也可能選latest,如perf100M以上binlog5、如果以上條件都不滿足,且只有一個(gè)salve可選,則選擇此slave6、沒有符合的slave,則選主失敗,failover失敗

          4.3 數(shù)據(jù)補(bǔ)償

          4.3.1 原主庫 ssh 可連接

          各個(gè)從節(jié)點(diǎn)調(diào)用:save_binary_logs腳本,立即保存缺失部分的binlog到各自節(jié)點(diǎn)/var/tmp目錄

          4.3.2 原主庫 ssh 不能連接

          從節(jié)點(diǎn)調(diào)用apply_diff_relay_logs,進(jìn)行relay-log日志差異補(bǔ)償

          4.3.3 額外數(shù)據(jù)補(bǔ)償(主庫日志冗余機(jī)制)

          binlog_server實(shí)現(xiàn)數(shù)據(jù)補(bǔ)償

          瀏覽 54
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美啪啪自拍 | 家庭乱伦免费无码视频 | 欧美日韩国产91 | 六月婷婷六月 | 精品视频你懂的 |