溫馨提示
關於主從複製的原理及其實現請參閱MySQL主從複製
一、關於複製的相關問題
1、非同步複製解決了那些問題
複製解決的基本問題是讓一台伺服器的資料和另外的伺服器保持同步,可以位於不同的網路拓撲中,對整台伺服器的特定的資料庫,甚至特定的表進行複製。
複製方案有兩種:
第一種、基於語句複製和基於行複製,都是通過記錄主伺服器的二進位日誌,並在從伺服器上進行重放(replay)完成複製,它們都是非同步進行的。
mariadb或mysql複製大部分都是向後相容的。這意味著版本較新的伺服器可以是版本老的伺服器的從伺服器。複製通常不會大幅增加伺服器的開銷,它需要主伺服器啟用二進位日誌。複製對擴充讀取有好處,可以將讀指向到到從伺服器上.
2、有了非同步為什麼還要用半同步複製
MySQL5.5之前版本的MySQL Replication都是非同步(asynchronous)的,主庫在執行完一些事務後,是不會管備庫的進度的。如果備庫不幸落後,而更不幸的是主庫此時又出現Crash(例如宕機),這時備庫中的資料就是不完整的。簡而言之,在主庫發生故障的時候,我們無法使用備庫來繼續提供資料一致的服務了。Semisynchronous Replication則一定程度上保證提交的事務已經傳給了至少一個備庫。
3. 為什麼不是完全同步
Semi_synchronous中,僅僅保證事務的已經傳遞到備庫上,但是並不確保已經在備庫上執行完成了。
此外,還有一種情況會導致主備資料不一致。在某個session中,主庫上提交一個事務後,會等待事務傳遞給至少一個備庫,如果在這個等待過程中主庫Crash,那麼也可能備庫和主庫不一致,這是很致命的。(在主庫恢複後,可以通過參數Rpl_semi_sync_master_no_tx觀察)
4. 如果主備之間串連出現故障,主庫是否會一直等待?
如果主備網路故障或者備庫掛了,主庫在事務提交後等待10秒(rpl_semi_sync_master_timeout的預設值)後,就會繼續。這時,主庫就會變回原來的非同步狀態
二、半同步的實現過程
註:
1、之前的博文己經說過如何安裝mariadb(與msyql編譯或二進位通用格式安裝方法一樣),這裡就直接上配置了。
2、如果要想實現半同步複製,先得配置主從複製。
================正式開始===========================
系統版本:CentOS6.5
資料庫:mariadb-10(通用二進位格式安裝)
系統資源分派
master 端:
ip地址: 192.168.1.114
slave 端:
ip地址:192.168.1.109
半同步外掛程式是由Google提供,具體位置/usr/local/mysql/lib/plugin/下,一個是master用的semisync_master.so,一個是slave用的semisync_slave.so
在master端上執行如下命令:
MariaDB [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
還要在/etc/my.cnf中開啟semi_sync,將以下兩條語句寫入[mysqld]段中
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
或在資料庫中直接執行如下命令
MariaDB [(none)]> set global rpl_semi_sync_master_enabled=1
重新啟動服務
[root@bogon ~]# service mysqld restart
MySQL server PID file could not be found! [FAILED]
Starting MySQL [ OK ]
在slave端執行如下命令:
MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
在/etc/my.cnf設定檔[mysqld]段中添加如下一條語句
rpl_semi_sync_slave_enabled=1
或在資料庫中直接執行下面的語句
MariaDB [(none)]>set global rpl_semi_sync_slave_enabled=1
重新啟動伺服器
[root@bogon data]# service mysqld restart
Shutting down MySQL.. [ OK ]
Starting MySQL... [ OK ]
在master查看一下狀態
MariaDB [(none)]> SHOW
GLOBAL
STATUS
LIKE
'rpl_semi%'
;
+
--------------------------------------------+-------+
| Variable_name | Value |
+
--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status |
ON
|
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+
--------------------------------------------+-------+
14
rows
in
set
(0.00 sec)
註解:
Rpl_semi_sync_master_clients
記錄支援半同步的slave的個數。
Rpl_semi_sync_master_net_avg_wait_time
master 等待slave 回複的平均等待時間。 單位毫秒.
Rpl_semi_sync_master_net_wait_time
master 總的等待時間。
Rpl_semi_sync_master_net_waits
master 等待slave 回複的的總的等待次數。
Rpl_semi_sync_master_no_times
master 關閉半同步複製的次數。
Rpl_semi_sync_master_no_tx
master 沒有收到slave的回複而提交的次數,(應該可以理解為master 等待逾時的次
數)
Rpl_semi_sync_master_status
標記master現在是否是半同步複製狀態。
Rpl_semi_sync_master_tx_avg_wait_time
master 花在每個事務上的平均等待時間。
Rpl_semi_sync_master_tx_wait_time
master 總的等待次數。
Rpl_semi_sync_master_wait_sessions
當前有多少個session 因為slave 的回複而造成等待。
Rpl_semi_sync_master_yes_tx
master 成功接收到slave的回複的次數。
Rpl_semi_sync_slave_status
標記slave 是否在半同步狀態。
slave
MariaDB [(none)]> SHOW
GLOBAL
STATUS
LIKE
'rpl_semi%'
;
+
----------------------------+-------+
| Variable_name | Value |
+
----------------------------+-------+
| Rpl_semi_sync_slave_status |
ON
|
+
----------------------------+-------+
1 row
in
set
(0.00 sec)
MariaDB 的詳細介紹:請點這裡
MariaDB 的:請點這裡
推薦閱讀:
在 CentOS/RHEL/Scientific Linux 6 下安裝 LAMP (Apache with MariaDB and PHP)