構建高性能的--MySQL--數據庫系統---主從複製剖析

主從複製解決方案

主從複製解決方案是mysql自身提供的一種高可用解決方案,數據同步方法採用的是 MySQL 複製技術

MySQL 複製技術:主從架構中,從服務器到主服務器拉取二進制日誌文件,然後再將日誌文件解析成相應的sql 在從服務器上重新執行一遍主服務器的操作,通過這種方式保持數據的一致性

注意:MySQL 複製技術僅僅提供了日誌的同步執行功能,而從服務器只提供讀操作,並且主服務器故障時,必須通過手動來處理故障轉移,通常的做法是將一臺從服務器更改爲主服務器。

爲了達到更高的可用性,在實際的應用環境中,一般都是採用MySQL複製技術配合高可用集羣軟件來實現自動故障轉移。例如 keepalived

下面舉個栗子!( 部署過程 )

實驗架構圖:
構建高性能的--MySQL--數據庫系統---主從複製剖析

修改DB1配置文件增加以下幾項:
[mysqld]
log-bin=mysql-bin
relay-log=mysql-relay-bin
server-id=1
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%

修改DB2配置文件增加以下幾項:
[mysqld]
log-bin=mysql-bin
relay-log=mysql-relay-bin
server-id=2
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%

推薦在主從庫上使用replicate-wild-ignore-table和replicate_wild_do_table兩個選項來解決複製過濾的問題。

保證數據同步
如果DB1上已經有MySQL數據,那麼在執行主主互備之前,需要將DB1和DB2上的MySQL保持數據同步。

首先在DB1上執行鎖表然後將數據導出,在DB2上應用。
鎖表命令:FLUSH TABLES WITH READ LOCK;

創建複製用戶並授權
首先在DB1創建複製用戶

然後在DB2的MySQL庫中將DB1設爲自己的主服務器

mysql> change master to
-> master_host='192.168.0.254',
-> master_user='repl_user',
-> master_password='123456',
-> master_log_file='mysql-bin.000002',
-> master_log_pos=106;

注意:master_log_file和master_log_pos這兩個選項的值要對應在DB1上通過SQL語句"show master status" 查詢到的值。

在DB2上啓動Slave服務

mysql> start slave;

查看DB2上slave的運行狀態

這樣DB1到DB2的主從複製已經完成,接下來配置從DB2到DB1的主從複製,這個過程和前面完全一樣。首先在DB2的MySQL庫中創建複製用戶

然後在DB1的MySQL庫中將DB2設爲自己的主服務器
mysql> change master to
-> master_host='192.168.0.251',
-> master_user='repl_user',
-> master_password='123456',
-> master_log_file='mysql-bin.000002',
-> master_log_pos=106;

啓動複製線程
mysql> start slave;

查看DB1上slave的運行狀態

從狀態看出複製服務運行正常,MySQL雙主模式的主從複製配置完成。

配置Keepalived實現MySQL雙主高可用

需要在兩臺服務器上安裝keepalived,這裏拿DB1安裝過程舉例,DB2的安裝過程相同這裏不重複。
tar xf keepalived-1.2.12.tar.gz

cd keepalived-1.2.12
./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64/
make
make install

DB1服務器配置文件 /etc/keepalived/keepalived.conf

global_defs {
notification_email {br/>root@localhost
}
notification_email_from keepalived.example.com
router_id MySQL_HA
}

vrrp_script check_mysqld {
script "/etc/keepalived/check_slave.pl 127.0.0.1"
interval 2
weight 21
}

vrrp_instance HA_1 {
state BACKUP //DB1和DB2上均配置爲BACKUP
interface eth0
virtual_router_id 80
priority 100
advert_int 2
nopreempt //不搶佔模式,只在優先級高的機器上設置即可,優先級低的機器可以不設置。

authentication {
    auth_type PASS
    auth_pass 23b14455cd
}

track_script {
check_mysqld
}
virtual_ipaddress {
192.168.0.150
}
}

其中,/etc/keepalived/check_slave.pl 腳本內容爲:

#!/usr/bin/perl -w
use DBI;
use DBD::mysql;

CONFIG VARIABLES

$SBM = 120;
$db = "wpdb";
$host = $ARGV[0];
$port = 3306;
$user = "root";
$pw = "123456";

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->{'Seconds_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;
}
}

這是用Perl寫的檢測MySQL複製狀態的腳本,修改文件中的MySQL數據庫端口,用戶名,密碼即可直接使用。

如果執行這個腳本報如下錯誤時:

使用以下命令可以解決:

yum install perl-DBI perl-DBD-MySQL -y

DB2的keepalived.conf文件和DB1基本一樣,只需將priority值修改爲90,由於配置的是不搶佔模式,還需要去掉nopreempt選項。

然後分別啓動兩臺主機上的keepalived服務

測試服務的高可用功能

我們在192.168.0.3這臺主機上用mysql客戶端連接vip:192.168.0.150

從上面兩張圖可以看出來,目前是連到了192.168.0.254這臺服務器上,也就表示遊標IP在這臺服務器上。

測試故障轉移

故障模擬,我們這時手動停掉192.168.0.254的MySQL複製線程

這裏可以看到,當停掉複製線程後,執行查詢時連接中斷了一次,馬上再次連接上完成查詢,顯示的server_id已經變成2了,表示服務器已經切換了。

查看DB2服務器的IP地址驗證遊標IP是否轉移過來了

(以上是部署過程)

這裏說幾點比較重要的知識點(敲黑板!!!!)

  1. mysql 複製技術複製的是日誌
  2. mysql 複製是單向、異步複製
  3. 複製過程是主服務器將更新寫入二進制文件,並通知從服務器
  4. 複製分爲基於語句的複製(默認)
  5. 基於行的複製
  6. 混合類型的複製(複製語句+複製行)執行語句+複製行
  7. mysql複製原理!!!由三個線程來完成 主服務器 I/O 線程、從服務器I/O 線程 從服務器SQL線程
  8. mysql複製基於 mysql Binary Log功能
  9. mysql複製常用架構:一主一從、一主多從、主主互備、雙主多從、
  10. 同一時刻只有一個主服務器進行寫操作

待補充.......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章