MHA高可用配置及故障切換
一、MHA概述
1、傳統的MySQL主從架構存在的問題
MySQL主伺服器出故障後就無法寫入資料了
2、MHA簡介
一套優秀的MySQL高可用環境下故障切換和主從複製的軟體
MySQL故障過程中,MHA能做到0-30秒內自動完成故障切換
3、MHA組成
MHA Manager(管理節點)和 MHA Node(資料節點)
MHA Manager 可以單獨部署在一臺獨立的機器上,管理多個 master-slave 叢集(Manger是單獨一臺監控master伺服器健康狀態的伺服器。);也可以部署在一臺 slave 節點上。MHA Node 執行在每臺 MySQL 伺服器上,MHA Manager 會定時探測叢集中的 master 節點。當 master 出現故障時,它可以自動將最新資料的 slave 提升為新的 master,然後將所有其他的 slave 重新指向新的 master。整個故障轉移過程對應用程式完 全透明。
4、MHA特點(優勢)
在 MHA 自動故障切換過程中,MHA 試圖從宕機的主伺服器上儲存二進位制日誌,最大程度的保證資料的不丟失,但這並不總是可行的。例如,如果主伺服器硬體故障或無法通過 SSH 訪問,MHA 沒法儲存二進位制日誌,就會出現只進行故障轉移但丟失了最新的資料的情況。
使用 MySQL 5.5 的半同步複製,可以大大降低資料丟失的風險。MHA 可以與半同步復 制結合起來。如果只有一個 slave 已經收到了最新的二進位制日誌,MHA 可以將最新的二進 制日誌應用於其他所有的 slave 伺服器上,因此可以保證所有節點的資料一致性。
5、MHA架構
目前MHA支援一主多從架構,最少三臺服務,即一主兩從
二、MHA高可用案例
三、具體過程
3.1、實驗需求
MHA 監控 MySQL資料庫健康狀態,在主伺服器故障時進行自動切換,不影響業務。
3.2、實驗思路
1.MHA架構
1)資料庫安裝
2)一主兩從
3)MHA搭建
2.故障模擬
1)主庫失效
2)備選主庫成為主庫
3)從庫2將備選主庫指向為主庫
3.故障修復
1)壞庫修復,啟動
2)在修復好的庫上建立新主從關係
3)修改manager配置檔案,新增修好的庫的記錄
4)重啟mha
3.3、實驗環境
主機名 | IP地址 | 角色 | 軟體包 |
---|---|---|---|
Master | 20.0.0.10 | 主伺服器 | node資料節點軟體包 |
Slave1 | 20.0.0.20 | 主備/從伺服器 | node資料節點軟體包 |
Slave2 | 20.0.0.30 | 從伺服器 | node資料節點軟體包 |
Manger | 20.0.0.40 | 從伺服器 | node資料節點軟體包/Manger管理節點軟體包 |
3.4、實驗步驟
配置MySQL主從同步
1、安裝 MySQL 資料庫
在三臺 MySQL 節點上分別安裝資料庫,MySQL 版本請使用 5.6.36,cmake 版本請使
用 2.8.6。
1.1安裝主伺服器
主伺服器 yum -y install ncurses-devel gcc-c++ perl-Module-Install tar zxvf cmake-2.8.6.tar.gz cd cmake-2.8.6 ./configure gmake && gmake install cd tar zxvf mysql-5.6.36.tar.gz cd mysql-5.6.36 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc make && make install cp support-files/my-default.cnf /etc/my.cnf cp support-files/mysql.server /etc/rc.d/init.d/mysqld chmod +x /etc/rc.d/init.d/mysqld chkconfig --add mysqld echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile source /etc/profile groupadd mysql useradd -M -s /sbin/nologin mysql -g mysql chown -R mysql.mysql /usr/local/mysql mkdir -p /data/mysql /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql echo ' [client] port = 3306 socket = /usr/local/mysql/mysql.sock [mysql] port = 3306 socket = /usr/local/mysql/mysql.sock [mysqld] user = mysql basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock server-id = 1 log_bin = master-bin log-slave-updates = true sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES' > /etc/my.cnf ln -s /usr/local/mysql/bin/mysql /usr/sbin/ ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/ systemctl start mysqld netstat -anpt | grep 3306
1.2安裝從伺服器
從1伺服器 yum -y install ncurses-devel gcc-c++ perl-Module-Install tar zxvf cmake-2.8.6.tar.gz cd cmake-2.8.6 ./configure gmake && gmake install cd tar zxvf mysql-5.6.36.tar.gz cd mysql-5.6.36 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc make && make install cp support-files/my-default.cnf /etc/my.cnf cp support-files/mysql.server /etc/rc.d/init.d/mysqld chmod +x /etc/rc.d/init.d/mysqld chkconfig --add mysqld echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile source /etc/profile groupadd mysql useradd -M -s /sbin/nologin mysql -g mysql chown -R mysql.mysql /usr/local/mysql mkdir -p /data/mysql /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql echo ' [client] port = 3306 socket = /usr/local/mysql/mysql.sock [mysql] port = 3306 socket = /usr/local/mysql/mysql.sock [mysqld] user = mysql basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock server-id = 2 log_bin = master-bin relay-log = relay-log-bin relay-log-index = slave-relay-bin.index sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES' > /etc/my.cnf ln -s /usr/local/mysql/bin/mysql /usr/sbin/ ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/ systemctl start mysqld netstat -anpt | grep 3306
1.3安裝從2伺服器
從2伺服器 yum -y install ncurses-devel gcc-c++ perl-Module-Install tar zxvf cmake-2.8.6.tar.gz cd cmake-2.8.6 ./configure gmake && gmake install cd tar zxvf mysql-5.6.36.tar.gz cd mysql-5.6.36 cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc make && make install cp support-files/my-default.cnf /etc/my.cnf cp support-files/mysql.server /etc/rc.d/init.d/mysqld chmod +x /etc/rc.d/init.d/mysqld chkconfig --add mysqld echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile source /etc/profile groupadd mysql useradd -M -s /sbin/nologin mysql -g mysql chown -R mysql.mysql /usr/local/mysql mkdir -p /data/mysql /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql echo ' [client] port = 3306 socket = /usr/local/mysql/mysql.sock [mysql] port = 3306 socket = /usr/local/mysql/mysql.sock [mysqld] user = mysql basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock server-id = 3 relay-log = relay-log-bin relay-log-index = slave-relay-bin.index sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES' > /etc/my.cnf ln -s /usr/local/mysql/bin/mysql /usr/sbin/ ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/ systemctl start mysqld netstat -anpt | grep 3306
1.4、修改 Master 的主配置檔案/etc/my.cnf 檔案,三臺伺服器的 server-id 不能一樣,刪除字符集utf8的語句
vi /etc/my.cnf [mysqld] server-id = 1 log_bin = master-bin log-slave-updates = true
1.5、修改從服務、etc/my.cnf配置檔案
從一。vi /etc/my.cnf [mysqld] server-id = 2 log_bin = master-bin relay_bin = relay-log-bin relay_log_index = slave-relay-bin.index
從2.vi /etc/my.cnf [mysqld] server-id = 3 relay_log = relay-log-bin relay_log_index = slave-relay-bin.index
2、每個MySQL做兩個軟連結,為HMA服務
ln -s /usr/local/mysql/bin/mysql /usr/sbin ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin
3、啟動MySQL服務
systemctl start mysqld
4、配置mysql 一直兩從
4.1 首先在所有資料庫節點上授權兩個使用者,一個是從庫同步使用,另外一個是 manager使用。
1 mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123'; 2 mysql> grant all privileges on *.* to 'mha'@'20.0.0.%' identified by 'manager'; 3 mysql> flush privileges;
4.2在主伺服器上檢視二進位制檔案和同步點
mysql> show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000001 | 608 | | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
4.3在從1 和 從2分別執行同步,檢視 IO 和 SQL 執行緒都是 yes 代表同步是否正常
mysql> change master to master_host='20.0.0.10',master_user='myslave',master_password='123',master_log_file='master-bin.000001',master_log_pos=608; mysql> start slave; mysql> show slave status\G; Slave_IO_Running: Yes Slave_SQL_Running: Yes
4.4 將兩個從庫設定為只讀模式
mysql> set global read_only=1;
4.5 在主庫插入兩條資料,測試是否同步
mysql> create database test_xuhao; mysql> use test_xuhao; mysql> create table test(id int); mysql> insert into test(id) values (1); mysql> select * from test;
4.6 在兩個從庫分別查詢如下所示說明主從同步正常
從1 mysql> select * from test_xuhao.test; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec) 從2 mysql> select * from test_xuhao.test; +------+ | id | +------+ | 1 | +------+ 1 row in set (0.00 sec)
4.7.安裝MHA軟體
1、所有伺服器上都安裝 MHA 依賴的環境,首先安裝 epel 源
yum -y install epel-release --nogpgcheck yum -y install perl-DBD-MySQL \ perl-Config-Tiny \ perl-Log-Dispatch \ perl-Parallel-ForkManager \ perl-ExtUtils-CBuilder \ perl-ExtUtils-MakeMaker \ perl-CPAN
2、MHA軟體包對於每個作業系統版本不一樣,這裡Centos7.6必須選擇0.57版本,在所有伺服器上必須先安裝 node 元件,最後在 MHA-manager 節點上安裝 manager 元件,因為 manager 依賴 node 元件。
注意:所有伺服器上必須安裝node元件,最後在MHA-manager節點上安裝manager元件
tar zxf mha4mysql-node-0.57.tar.gz cd mha4mysql-node-0.57/ perl Makefile.PL make install
3、在 MHA-manager 上安裝 manager 元件
tar zxf mha4mysql-manager-0.57.tar.gz cd mha4mysql-manager-0.57/ perl Makefile.PL make && make install
manager 安裝後在/usr/local/bin 下面會生成幾個工具,主要包括以下幾個:
cd /usr/local/bin ll 總用量 84 -r-xr-xr-x. 1 root root 16381 10月 27 18:36 apply_diff_relay_logs -r-xr-xr-x. 1 root root 4807 10月 27 18:36 filter_mysqlbinlog -r-xr-xr-x. 1 root root 1995 10月 27 18:39 masterha_check_repl ###檢查 MySQL 複製狀況 -r-xr-xr-x. 1 root root 1779 10月 27 18:39 masterha_check_ssh ###檢查 MHA 的 SSH 配置狀況 -r-xr-xr-x. 1 root root 1865 10月 27 18:39 masterha_check_status ###檢測當前 MHA 執行狀態 -r-xr-xr-x. 1 root root 3201 10月 27 18:39 masterha_conf_host ###新增或刪除配置的 server 資訊 -r-xr-xr-x. 1 root root 2517 10月 27 18:39 masterha_manager ###啟動 manager的指令碼 -r-xr-xr-x. 1 root root 2165 10月 27 18:39 masterha_master_monitor ###檢測 master 是否宕機 -r-xr-xr-x. 1 root root 2373 10月 27 18:39 masterha_master_switch ###控制故障轉移(自動或者手動) -r-xr-xr-x. 1 root root 5171 10月 27 18:39 masterha_secondary_check -r-xr-xr-x. 1 root root 1739 10月 27 18:39 masterha_stop ###關閉manager -r-xr-xr-x. 1 root root 8261 10月 27 18:36 purge_relay_logs -r-xr-xr-x. 1 root root 7525 10月 27 18:36 save_binary_logs
node 安裝後也會在/usr/local/bin 下面會生成幾個指令碼(這些工具通常由 MHA
Manager 的指令碼觸發,無需人為操作)主要如下:
save_binary_logs ###儲存和複製 master 的二進位制日誌 apply_diff_relay_logs ###識別差異的中繼日誌事件並將其差異的事件應用於其他的 slave filter_mysqlbinlog ###去除不必要的 ROLLBACK 事件(MHA 已不再使用這個工具) purge_relay_logs ###清除中繼日誌(不會阻塞 SQL 執行緒)
5、配置 無密碼認證
5.1 在manager伺服器 上配置到所有節點的無密碼認證
ssh-keygen -t rsa #一路按回車鍵 ssh-copy-id 20.0.0.10 #先輸入yes,再輸入20.0.0.10伺服器的密碼 ssh-copy-id 20.0.0.20 ssh-copy-id 20.0.0.30 驗證 ssh [email protected] ssh [email protected] ssh [email protected]
5.2在主伺服器上配置到資料庫節點的無密碼認證
ssh-keygen -t rsa ssh-copy-id 20.0.0.20 ssh-copy-id 20.0.0.30 驗證 ssh [email protected] ssh [email protected]
5.3在從1伺服器上配置到資料庫節點的無密碼認證
ssh-keygen -t rsa ssh-copy-id 20.0.0.10 ssh-copy-id 20.0.0.30 驗證 ssh [email protected] ssh [email protected]
5.4在從2伺服器上配置資料庫節點的無密碼認證
ssh-keygen -t rsa ssh-copy-id 20.0.0.10 ssh-copy-id 20.0.0.20 驗證 ssh [email protected] ssh [email protected]
6、配置MHA
6.1在 manager 節點上覆制相關指令碼到/usr/local/bin 目錄,複製上述的自動切換時 VIP 管理的指令碼到/usr/local/bin 目錄,這裡使用指令碼管理 VIP
cp -ra mha4mysql-manager-0.57/samples/scripts /usr/local/bin ll /usr/local/bin/scripts/ cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin vi /usr/local/bin/master_ip_failover 刪除檔案裡的所有內容,複製下面的內容 #!/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 = '20.0.0.200'; my $brdc = '20.0.0.255'; my $ifdev = 'ens33'; my $key = '1'; my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; my $exit_code = 0; #my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;"; #my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key"; ################################################################################## 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 \"`; } # 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"; }
拷貝後會有四個執行檔案,檔案的含義如下: 1 master_ip_failover #自動切換時 VIP 管理的指令碼 2 master_ip_online_change #線上切換時 vip 的管理 3 power_manager #故障發生後關閉主機的指令碼 4 send_report #因故障切換後傳送報警的指令碼
6.2 建立 MHA 軟體目錄並拷貝配置檔案
1 mkdir /etc/masterha 2 cp mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/ 3 vim /etc/masterha/app1.cnf 4 [server default] 5 manager_workdir=/var/log/masterha/app1 6 manager_log=/var/log/masterha/app1/manager.log 7 master_binlog_dir=/usr/local/mysql/data 8 master_ip_failover_script= /usr/local/bin/master_ip_failover 9 master_ip_online_change_script= /usr/local/bin/master_ip_online_change10 password=manager 11 user=mha 12 ping_interval=1 13 remote_workdir=/tmp 14 repl_password=123 15 repl_user=myslave 16 secondary_check_script= /usr/local/bin/masterha_secondary_check -s 20.0.0.20 -s 20.0.0.30 17 shutdown_script="" 18 ssh_user=root 19 [server1] 20 hostname=20.0.0.10 21 port=3306 22 [server2] 23 hostname=20.0.0.20 24 port=3306 25 candidate_master=1 26 check_repl_delay=0 27 [server3] 28 hostname=20.0.0.30 29 port=3306
6.3 測試 ssh 無密碼認證,如果正常最後會輸出 successfully,如下所示
masterha_check_ssh -conf=/etc/masterha/app1.cnf ...... Wed Oct 28 00:07:09 2020 - [debug] Connecting via SSH from [email protected](20.0.0.30:22) to [email protected](20.0.0.20:22).. Wed Oct 28 00:07:10 2020 - [debug] ok. Wed Oct 28 00:07:10 2020 - [debug] Wed Oct 28 00:07:08 2020 - [debug] Connecting via SSH from [email protected](20.0.0.20:22) to [email protected](20.0.0.10:22).. Wed Oct 28 00:07:09 2020 - [debug] ok. Wed Oct 28 00:07:09 2020 - [debug] Connecting via SSH from [email protected](20.0.0.20:22) to [email protected](20.0.0.30:22).. Wed Oct 28 00:07:09 2020 - [debug] ok. Wed Oct 28 00:07:10 2020 - [info] All SSH connection tests passed successfully.
6.4測試 MySQL 主從連線情況,最後出現 MySQL Replication Health is OK 字樣說明正常
masterha_check_repl -conf=/etc/masterha/app1.cnf ...... IN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 20.0.0.200=== Checking the Status of the script.. OK Wed Oct 28 09:25:28 2020 - [info] OK. Wed Oct 28 09:25:28 2020 - [warning] shutdown_script is not defined. Wed Oct 28 09:25:28 2020 - [info] Got exit code 0 (Not master dead). MySQL Replication Health is OK.
6.5啟動MHA
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
6.6檢視 MHA 狀態,可以看到當前的 master 是主伺服器節點
1 masterha_check_status --conf=/etc/masterha/app1.cnf 2 app1 (pid:24405) is running(0:PING_OK), master:20.0.0.10
6.7 、檢視 MHA 日誌,也以看到當前的 master 是 20.0.0.10
cat /var/log/masterha/app1/manager.log ...... Wed Oct 28 09:27:04 2020 - [info] Replicating from 20.0.0.10(20.0.0.10:3306) Wed Oct 28 09:27:04 2020 - [info] Current Alive Master: 20.0.0.10(20.0.0.10:3306) Wed Oct 28 09:27:04 2020 - [info] Checking slave configurations.. Wed Oct 28 09:27:04 2020 - [warning] relay_log_purge=0 is not set on slave 20.0.0.20(20.0.0.20:3306). Wed Oct 28 09:27:04 2020 - [warning] relay_log_purge=0 is not set on slave 20.0.0.30(20.0.0.30:3306). Wed Oct 28 09:27:04 2020 - [warning] log-bin is not set on slave 20.0.0.30(20.0.0.30:3306). This host cannot be a master. ......
6.8 第一次配置vip的時候,需要在主伺服器上建立虛擬IP地址
1 ifconfig ens33:1 20.0.0.200/24 2 ifconfig
四、故障測試
1、關閉主伺服器的mysql服務檢視從1伺服器的虛擬IP地址有沒有轉移過來,從2上檢視主伺服器是不是從1
從1伺服器 ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 20.0.0.20 netmask 255.255.255.0 broadcast 20.0.0.255 inet6 fe80::a140:18a2:d866:8f33 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:42:10:0a txqueuelen 1000 (Ethernet) RX packets 1315993 bytes 1324408060 (1.2 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 795190 bytes 69519345 (66.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 20.0.0.200 netmask 255.0.0.0 broadcast 20.255.255.255 ether 00:0c:29:42:10:0a txqueuelen 1000 (Ethernet) 從2伺服器 mysql mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 20.0.0.20 Master_User: myslave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000003 Read_Master_Log_Pos: 120 Relay_Log_File: relay-log-bin.000002 Relay_Log_Pos: 284 Relay_Master_Log_File: master-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes ......
2、重新開啟manager伺服器,主伺服器開啟mysql服務
1 systemctl restart mysqld
3、檢視從1伺服器檢視二進位制檔案和同步點
mysql> show master status; +-------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-------------------+----------+--------------+------------------+-------------------+ | master-bin.000003 | 120 | | | | +-------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
4、在主伺服器上執行同步,檢視 IO 和 SQL 執行緒都是 yes 代表同步是否正常
mysql> change master to master_host='20.0.0.20',master_user='myslave',master_password='123',master_log_file='master-bin.000003',master_log_pos=120; mysql> start slave; mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 20.0.0.20 Master_User: myslave Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000003 Read_Master_Log_Pos: 120 Relay_Log_File: mysqld-relay-bin.000002 Relay_Log_Pos: 284 Relay_Master_Log_File: master-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes18 ......
5、在從1上建立,主伺服器和從2上檢視
從1伺服器 mysql> create database aa; mysql> use aa; mysql> create table test(id int(3)); mysql> insert into test values(1); mysql> select * from test; +------+ | id | +------+ | 1 | +------+ 主伺服器 mysql> use aa; mysql> select * from test; +------+ | id | +------+ | 1 | +------+ 從2伺服器 mysql> use aa; mysql> select * from test; +------+ | id | +------+ | 1 | +------+
6、在manager伺服器上修改配置檔案(再把這個記錄新增進去,因為它檢測掉失效時候會自動消失)
1 vi /etc/masterha/app1.cnf 2 ...... 3 [server1] 4 hostname=192.168.8.134 5 port=3306 6 ......
7、在manager伺服器上啟動manager
1 masterha_check_ssh -conf=/etc/masterha/app1.cnf 2 masterha_check_repl -conf=/etc/masterha/app1.cnf 3 nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 & 4 masterha_check_status --conf=/etc/masterha/app1.cnf