每台主機均需安裝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服務器,至此,所有配置完成。