<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                > MySQL安裝和復制請查看7.1/7.2相關章節 > MHA要求MySQL所有節點創建復制賬戶 > LVS負責讀操作的負載均衡 #### 基礎環境 操作系統:Centos 7.3 64位; ```shell 數據庫寫VIP:192.168.0.20 數據庫讀VIP(LVS):192.168.0.21 ``` 服務器角色和配置信息 |角色|IP地址|主機名|Server-ID|功能類型| | :------------: | :------------: | :------------: | :------------: | :------------: | |Master|192.168.0.230|mdb01.prod.ding|168001200|寫| |Candicate Master|192.168.0.236|mdb01-s1.prod.ding|168001201|讀| |Slave|192.168.0.235|mdb01-s2.prod.ding|168001202|讀| |Monitor host|192.168.0.237|mha.prod.ding||MySQL主庫的故障轉移| |LVS+Keepalived-A|192.168.0.90|mdb-lvs01.prod.ding||讀操作的負載均衡| |LVS+Keepalived-B|192.168.0.91|mdb-lvs02.prod.ding||LVS高可用備機| 各服務器軟件部署情況 |角色|Manager|Node|Keepalived|LVS| | :------------: | :------------: | :------------: | :------------: | :------------: | |Master|-|部署|-|-| |Candicate Master|-|部署|-|-| |Slave|-|部署|-|-| |MHA host|部署|部署|-|-| |LVS+Keepalived-A|-|-|部署|部署| |LVS+Keepalived-B|||部署|部署| #### 拓撲圖及實現原理 ![MHA拓撲圖](index_files/MHA.png "MHA拓撲圖") ##### 業務流程 **讀操作** 1. LVS實現讀操作的負載均衡; 2. Keepalived在上層管理LVS,并對兩臺從庫進行健康檢測(通過定義Check腳本); 3. 一臺從庫出現故障后,Keepalived將其剔除出負載均衡集群; **寫操作** 1. 在Master上綁定寫VIP(MHA啟動后會通過腳本進行操作); 2. MHA監控Master狀態,當Master出現故障后(宕機、復制暫停)時; 3. 通過Failover腳本,卸載Master上的WVIP; 4. 通過Failover在CMaster上綁定WVIP,提升其為主庫; 5. 同步并應用差異日志,并將從庫指向新主庫; 問題:當MHA把Master切換到了CMaster上后,LVS如何處理分發在CMaster上的讀操作? 解釋:由于Keepalived會通過腳本定期監控CMaster的狀態,包括同步、SQL線程、I/O線程,所以當CMaster升級為主庫后,這些狀態都將消失,Keepalived將自動將CMaster剔除出負載均衡集群。 #### 部署MHA MHA使用Perl編寫,需要安裝Perl依賴,建議使用阿里云的YUM源,YUM安裝 Node節點需要perl-DBD-MySQL perl-DBI Manger需要perl-Config-Tiny.noarch perl-Log-Dispatch.noarch perl-Parallel-ForkManager.noarch perl-DBD-MySQL perl-DBI ##### 部署約定 |序號|目錄名稱|目錄位置| | :------------: | :------------: | :------------: | |1|上傳文件目錄|/tmp/| |2|MHA配置文件目錄|/app/mha| |3|MHA日志文件目錄|/app/mha/log| |4|MHA管理目錄|/app/mha/app1| |5|MHA處理數據目錄|/tmp| |6|relay_log_purge腳本目錄|/app/scripts| |7|master_ip_failover腳本目錄|/app/scripts| ##### 配置阿里云的YUM源 ```shell #clean OS default repo mkdir /etc/yum.repos.d/old && mv /etc/yum.repos.d/C* /etc/yum.repos.d/old/ #add local repo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo ``` ##### 安裝Perl依賴 方法一 使用YUM 安裝(推薦) ```shell yum install -y perl-Config-Tiny.noarch perl-Log-Dispatch.noarch perl-Parallel-ForkManager.noarch perl-DBD-MySQL perl-DBI ``` 方法二 使用cpanm安裝。注意:時間必須整正確 編寫腳本DBD_install.sh ```shell #!/bin/bash wget http://xrl.us/cpanm --no-check-certificate mv cpanm /usr/bin/ chmod 755 /usr/bin/cpanm cat >/root/list<<EOF install DBD::mysql install Config::Tiny install Log::Dispatch install Parallel::ForkManager install Time::HiRes EOF for package in `cat /root/list` do cpanm $package done ``` ##### 在所有節點上安裝MHA Node: rpm包安裝 ```shell cd /opt/ rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm ``` 編譯安裝 ```shell tar xf mha4mysql-node-0.53.tar.gz cd mha4mysql-node perl Makefile.PL make && make install ``` ##### 安裝MHA Manager rpm包安裝 ```shell cd /opt/ rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm ``` 編譯安裝 ```shell tar zxf mha4mysql-manager-0.53.tar.gz cd mha4mysql-manager-0.53 perl Makefile.PL make make install ``` #### 配置MHA manger 創建基礎目錄 ```shell mkdir -p /etc/mha mkdir -p /etc/mha/log mkdir -p /etc/mha/app1 mkdir -p /etc/mha/scripts mkdir -p /tmp/ ``` ##### 配置MHA對MySQL監控和binlog控制 >這個賬戶和復制賬戶沒有關系 ```shell grant all on *.* to 'mha'@'192.168.0.%' identified by 'mha'; flush privileges; ``` ##### 在(MHA/M/S1/S2)服務器上配置主機名(MHA管理腳本通過主機名調用) ```shell cat >>/etc/hosts<< EOF 192.168.0.230 ip230 192.168.0.235 ip235 192.168.0.236 ip236 192.168.0.237 ip237 EOF ``` ##### 所有MySQL節點增加mysqlbinlog環境變量(解析binlog用) ```shell echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/bashrc ;source /etc/bashrc ``` > bashrc是每次執行bash腳本時加載的變量 ##### 配置MHA和MySQL主從之間的主機免密鑰登錄 所有節點執行以下操作 - 部署SSH免密鑰登錄 - 所有節點可以SSH訪問MHA和其他MySQL節點 - 所有節點可以SSH訪問自己 ```shell ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub "root@192.168.0.230" ssh-copy-id -i ~/.ssh/id_rsa.pub "root@192.168.0.235" ssh-copy-id -i ~/.ssh/id_rsa.pub "root@192.168.0.236" ssh-copy-id -i ~/.ssh/id_rsa.pub "root@192.168.0.237" ``` ##### 在/app/mha下創建app1.cnf >注意修改相關配置文件master_binlog_dir為MySQl的數據目錄 ```shell [server default] manager_log=/etc/mha/log/app1.log manager_workdir=/etc/mha/app1/ master_binlog_dir=/data/mysql3306 master_ip_failover_script=/etc/mha/master_ip_failover ping_interval=1 remote_workdir=/tmp secondary_check_script=/bin/masterha_secondary_check -s ip235 -s ip236 --user=root --master_host=ip230 --master_ip=192.168.0.230 --master_port=3306 ssh_user=root user=mha password=mha repl_password=repl repl_user=repl [server1] hostname=192.168.0.230 port=3306 [server2] candidate_master=1 check_repl_delay=0 hostname=192.168.0.235 port=3306 [server3] hostname=192.168.0.236 port=3306 ``` > 根據實際情況修改masterha_secondary_check位置,rpm安裝在bin目錄下 #### 上傳并修改/etc/mha/master_ip_failover腳本 ```shell chmod 600 master_ip_failover ``` 內容詳見結尾附件 ##### 調整參數(網卡名稱和IP) ```shell my $vip = '192.168.0.20/24'; # Virtual IP my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; ``` #### 部署從庫(S1/S2)的手動回收中繼日志腳本 上傳relay_purge.sh到/app/scripts下并增加執行權限 ```shell #!/bin/bash /usr/bin/purge_relay_logs --user=root --password=123.com --socket=/tmp/mysql3306.sock --host=localhost -disable_relay_log_purge --port=3306 --workdir=/tmp >> /app/scripts/purge_relay_logs.log 2>&1 ``` 增加執行權限 ```shell chmod 600 /app/scripts/relay_purge.sh ``` 部署定時任務 ```shell echo '0 4 * * * /bin/sh /app/scripts/relay_purge.sh' >/var/spool/cron/root ``` #### 切換測試 ##### 驗證SSH配置 ```shell masterha_check_ssh --conf=/etc/mha/app1.cnf ``` ##### 測試復制、應用差異日志、故障轉移腳本 ```shell masterha_check_repl --conf=/etc/mha/app1.cnf ``` ##### 啟動MHA ```shell nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover< /dev/null >/etc/mha/app1/manager.log 2>&1 & #狀態檢查 sterha_check_status --conf=/etc/mha/app1.cnf ``` ##### 關閉MHA 正常關閉 ```shell masterha_stop --conf=/etc/mha/app1.cnf ``` ##### 關閉主庫,并監控MHA日志 具體日志請查看MHA日志部分 這時,230(down) 235提升為主庫,236指向了235 #### 恢復原有環境 1.啟動230數據庫,并查看position情況 ```shell show master status\G ``` 2.將236重新指向230 ```shell stop slave; change master to master_host='192.168.0.230',master_user='repl',master_password='repl',master_log_file='mysql-bin.000003',master_log_pos=154; start slave; ``` 3.將235重新指向230 ```shell change master to master_host='192.168.0.230',master_user='repl',master_password='repl',master_log_file='mysql-bin.000003',master_log_pos=154; start slave; ``` 4.恢復MHA配置文件,并刪除鎖文件 ```shell rm -f /etc/mha/app1/app1.failover.complete ``` > 不刪除,不會切換,防止反復切換 5.卸載235上的寫VIP ```shell /sbin/ifconfig eth0:1 down ``` #### 附件 /etc/mha/master_ip_failover ```shell #!/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.0.20/24'; # Virtual IP my $key = "0"; my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down"; $ssh_user = "root"; 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" ) { # $orig_master_host, $orig_master_ip, $orig_master_port are passed. # If you manage master ip address at global catalog database, # invalidate orig_master_ip here. my $exit_code = 1; #eval { # print "Disabling the VIP on old master: $orig_master_host \n"; # &stop_vip(); # $exit_code = 0; #}; eval { print "Disabling the VIP on old master: $orig_master_host \n"; #my $ping=`ping -c 1 10.0.0.13 | grep "packet loss" | awk -F',' '{print $3}' | awk '{print $1}'`; #if ( $ping le "90.0%" && $ping gt "0.0%" ){ #$exit_code = 0; #} #else { &stop_vip(); # updating global catalog, etc $exit_code = 0; #} }; if ($@) { warn "Got Error: $@\n"; exit $exit_code; } exit $exit_code; } elsif ( $command eq "start" ) { # all arguments are passed. # If you manage master ip address at global catalog database, # activate new_master_ip here. # You can also grant write access (create user, set read_only=0, etc) here. 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"; `ssh $ssh_user\@$orig_master_ip \" $ssh_start_vip \"`; exit 0; } else { &usage(); exit 1; } } # A simple system call that enable the VIP on the new master sub start_vip() { `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`; } # A simple system call that disable the VIP on the old_master sub stop_vip() { `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"; } # the end. ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看