主從複製解決方案
主從複製解決方案是mysql自身提供的一種高可用解決方案,數據同步方法採用的是 MySQL 複製技術。
MySQL 複製技術:主從架構中,從服務器到主服務器拉取二進制日誌文件,然後再將日誌文件解析成相應的sql 在從服務器上重新執行一遍主服務器的操作,通過這種方式保持數據的一致性。
注意:MySQL 複製技術僅僅提供了日誌的同步執行功能,而從服務器只提供讀操作,並且主服務器故障時,必須通過手動來處理故障轉移,通常的做法是將一臺從服務器更改爲主服務器。
爲了達到更高的可用性,在實際的應用環境中,一般都是採用MySQL複製技術配合高可用集羣軟件來實現自動故障轉移。例如 keepalived
下面舉個栗子!( 部署過程 )
實驗架構圖:
修改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是否轉移過來了
(以上是部署過程)
這裏說幾點比較重要的知識點(敲黑板!!!!)
- mysql 複製技術複製的是日誌
- mysql 複製是單向、異步複製
- 複製過程是主服務器將更新寫入二進制文件,並通知從服務器
- 複製分爲基於語句的複製(默認)
- 基於行的複製
- 混合類型的複製(複製語句+複製行)執行語句+複製行
- mysql複製原理!!!由三個線程來完成 主服務器 I/O 線程、從服務器I/O 線程 從服務器SQL線程
- mysql複製基於 mysql Binary Log功能
- mysql複製常用架構:一主一從、一主多從、主主互備、雙主多從、
- 同一時刻只有一個主服務器進行寫操作
待補充.......