配置MySQL實現主主互備模式並利用keepalived實現雙主高可用


每台主機均需安裝keepalived,mysql,安裝過程這里不多介紹,不懂的可自行百度。

本次配置的環境為


   DB1:192.168.31.190                DB2:192.168.31.184        MySQL VIP:192.168.31.189 


1、修改MySQL配置文件

首先修改DB1的/etc/my.cnf配置文件,在"[mysqld]"段中添加一下內容:

              server-id = 1
              log-bin=mysql-bin
              relay-log = mysql-relay-bin
              replicate-wild-ignore-table=mysql.%
              replicate-wild-ignore-table=test.%
              replicate-wild-ignore-table=information_schema.%

然后修改DB2主機/etc/my.cnf配置文件,在"[mysqld]"段添加一下內容:

               server-id = 2
               log-bin=mysql-bin
               relay-log = mysql-relay-bin
               replicate-wild-ignore-table=mysql.%
               replicate-wild-ignore-table=test.%
               replicate-wild-ignore-table=information_schema.%

2、手動同步數據庫

DB1和DB2數據需要保持同步,在DB1上執行操作

mysql> FLUSH TABLES WITH READ LOCK;
Query OK,0 rows affected (0.00 sec)
#然后不要退出終端,重開一個終端,執行一下命令
# cd /var/lib/
# tar zcvf mysql.tar.gz mysql
# scp mysql.tar.gz DB2:/var/lib/

將數據傳輸到DB2后解壓覆蓋然后依次重啟DB1和DB2上的MySQL

3、創建復制用戶並授權

在DB1MySQL執行如下操作:

mysql> grant replication slave on *.* to 'repl_user'@'192.168.31.184' identified by 'repl_passwd';
mysql> show master status;

然后在DB2的MySQL將DB1設為自己的主服務器,操作如下:

mysql> change master to \
    -> master_host='192.168.31.190',
    -> master_user='repl_user',
    -> master_password='repl_passwd',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=106;
#接着啟動slave服務
mysql> start slave;
#查看slave運行狀態 mysql
> show slave status\G;

到這里,從DB1到DB2的MySQL主從復制已經完成,接下來配置DB2到DB1的mysql主從復制,過程和上面完全一樣,在DB2的MySQL創建復制用戶:

mysql> grant replication slave on *.* to 'repl_user'@'192.168.31.190' identified by 'repl_passwd';
mysql> show master status;

然后在DB1的MySQL將DB2設為自己的主服務器:

mysql> change master to \
    -> master_host='192.168.31.184',
    -> master_user='repl_user',
    -> master_password='repl_passwd',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=436;

mysql> start slave;
mysql> show slave status\G;

接着啟動slave服務。至此,MySQL雙主模式的主從復制配置完畢。

4、配置keepalived實現MySQL雙主高可用

首先在DB1上配置/etc/keepalived/keepalived.conf,內容如下

global_defs {
   notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script check_mysqld {
script  "/etc/keepalived/mysqlcheck/check_slave.pl 127.0.0.1"#檢測mysql復制狀態腳本
interval 2
weight 21
}
vrrp_instance HA_1 {
    state BACKUP   #在DB1和DB2均為BACKUP
    interface eth1
    virtual_router_id 80
    priority 100
    advert_int 2
    nopreempt   #不搶占模式,只在優先級高的機器設置
    authentication {
         auth_type PASS
         auth_pass qweasdzxc
   track_script {
   check_mysqld
   }
    virtual_ipaddress {
        192.168.31.189/24 dev eth1  #mysql對外服務IP,即VIP
    }
    }

其中,/etc/keepalived/mysqlcheck/check_slave.pl文件的內容如下:

#!/usr/bin/perl -w
use DBI;
use DBD::mysql;
#CONFIG VARIABLES
$SBM = 120;
$db = "ixdba";
$host = $ARGV[0];
$port = 3306;
$user = "root";
$pw = "915389546";
#SQL query
$query = "show slave status";
$dbh = DBI->connect("DBI:mysql:$db:$host:$port",$user,$pw,{ RaiseError => 0,PrintError => 0 });
if (!defined($dbh)) {
   exit 1;
}
$sqlQuery = $dbh->prepare($query);
$sqlQuery->execute;
$Slave_IO_Running = "";
$Slave_SQL_Running = "";
$Seconds_Behind_Master = "";
while (my $ref = $sqlQuery->fetchrow_hashref()) {
     $Slave_IO_Running = $ref->{'Slave_IO_Running'};
     $Slave_SQL_Running = $ref->{'Slave_SQL_Running'};
     $Seconds_Behind_Master = $ref->{'Second_Behind_Master'};
}
$sqlQuery->finish;
$dbh->disconnect();
if ( $Slave_IO_Running eq "NO" || $Slave_SQL_Running eq "NO" ) {
   exit 1;
} else {
   if ( $Seconds_Behind__Master > $SBM) {
     exit 1;
   }  else {
          exit 0;
   }
}

接着將keepalived和check_slave.pl復制到DB2服務器上對應的位置,然后將keepalived文件中的priority值修改為90,還需去掉nopreempt選項,然后分別在DB1和DB2上啟動keepalived服務。

5、測試主從同步功能

首先從第三台服務器遠程登錄VIP為“192.168.31.188“的數據庫,操作過程如下:

[root@localhost~]#mysql -uroot -p -h 192.168.31.188
Enter password:

MySQL [(none)]> show variables like "%hostname%"; +---------------+----------------+ | Variable_name | Value | +---------------+----------------+ | hostname | DB1 | +---------------+----------------+ 1 row in set (0.01 sec) MySQL [(none)]> show variables like "%server_id%"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 1 | +---------------+-------+ 1 row in set (0.01 sec)
#可以看到成功通過VIP登錄,並且登錄了DB1服務器
#接下來測試復制數據功能 MySQL [(none)]
> create database repldb; Query OK, 1 row affected (0.12 sec) MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | repldb | | test | +--------------------+ 5 rows in set (0.01 sec) MySQL [(none)]> use repldb; Database changed MySQL [repldb]> create table repl_table(id int,email varchar(80),password varchar(40) not null); Query OK, 0 rows affected (0.03 sec) MySQL [repldb]> show tables; +------------------+ | Tables_in_repldb | +------------------+ | repl_table | +------------------+ 1 row in set (0.00 sec) MySQL [repldb]> insert into repl_table (id,email,password) values(1,"xiaoming@qq.com","123456"); Query OK, 1 row affected (0.00 sec)

然后登錄DB2主機的MySQL查看,可以發現數據實現了同步。

6、故障轉移測試

首先遠程通過VIP地址登錄MySQL系統,不要退出這個連接,然后在DB1服務器的MySQL命令行執行如下操作:

mysql>slave stop;

然后回到遠程連接的MySQL數據庫執行如下操作:

MySQL [(none)]> show variables like "%hostname%";
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| hostname      | DB2            |
+---------------+----------------+
1 row in set (0.01 sec)
MySQL [(none)]> show variables like "%server_id%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
1 row in set (0.01 sec)

可以發現在DB1發現故障之后MySQL服務從DB1切換到了DB2服務器,至此,所有配置完成。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM