--------------Mysql實現數據庫主從複製架構----------------mysql
1、環境準備:linux
centos系統服務器2臺、一臺用戶作Mysql主服務器,一臺用於作Mysql從服務器,配置好yum源、防火牆關閉、各節點時鐘服務同步、各節點之間能夠經過主機名互相通訊sql
192.168.41.145 master數據庫
192.168.41.137 slavevim
2、準備步驟:centos
一、iptables -F && setenforce 清空防火牆策略,關閉selinux服務器
二、①vim /etc/hosts網絡
192.168.41.145 master #各節點之間能夠經過主機名互相通訊架構
192.168.41.137 slave異步
② ntpdate 172.17.0.1 #各節點時鐘服務同步
三、拿兩臺服務器都使用yum方式安裝Mysql服務,要求版本一致
四、分別啓動兩臺服務器mysql服務,確保服務正常.
3、實現步驟:
一、配置master主服務器
對master進行配置,包括打開二進制日誌,指定惟一的servr ID。例如,在配置文件加入以下值。
vim /etc/my.cnf
server-id=1 #配置server-id,讓主服務器有惟一ID號
log-bin=mysql-bin #打開Mysql日誌,日誌格式爲二進制
skip-name-resolve#關閉名稱解析,(非必須)
2.建立複製賬號
在Master的數據庫中創建一個備份賬戶:每一個slave使用標準的MySQL用戶名和密碼連master 。進行復制操做的用戶會授予REPLICATION SLAVE權限。
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'192.168.%.%' IDENTIFIED BY 'ke';
3.查看主服務器狀態
在Master的數據庫執行show master status,查看主服務器二進制日誌狀態
四、配置slave從服務器
對slave進行配置,打開中繼日誌,指定惟一的servr ID,設置只讀權限。在配置文件加入以下值
server-id=2 #配置server-id,讓從服務器有惟一ID號
relay_log = mysql-relay-bin #打開Mysql日誌,日誌格式爲二進制
read_only = 1 #設置只讀權限
log_bin = mysql-bin #開啓從服務器二進制日誌
log_slave_updates = 1 #使得更新的數據寫進二進制日誌中
5.啓動從服務器複製線程
①stop slave;
②reset slave;
③讓slave鏈接master,並開始重作master二進制日誌中的事件。
CHANGE MASTER TO
MASTER_HOST='192.168.41.145',
MASTER_USER='slave',
MASTER_PASSWORD='ke', 【主從密碼要一致】
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=278;
※注意
IP爲master的IP;
密碼和master設置一致;
POS設置查看master獲得:show master status
④start slave;# 啓動複製線程。
六、查看從服務器狀態
可以使用SHOW SLAVE STATUS\G查看從服務器狀態,以下所示,也可用show processlist \G查看當前複製狀態:
Slave_IO_Running: Yes #IO線程正常運行
Slave_SQL_Running: Yes #SQL線程正常運行
【二者必須同時YES,纔算啓動成功】
附:主從同步出現一下錯誤:
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
解決方法:
致使lave_IO_Running 爲connecting 的緣由主要有如下 3 個方面:
一、網絡不通
二、密碼不對
三、pos不對
4、驗證
在master上插入數據,查看slave上是否能夠同步
create database liuke;#建數據庫
use liuke;
create table mini_tb(id int(3),name char(10)); #建表
insert into mini_tb values(001,'candy'); #插入數據
select*from mini_tb; #查看錶內容
在slave上查看,能夠同步則成功。
5、添加新slave服務器
假如master已經運行好久了,想對新安裝的slave進行數據同步,甚至它沒有master的數據。
此時,有幾種方法可使slave從另外一個服務開始,例如,從master拷貝數據,從另外一個slave克隆,從最近的備份開始一個slave。爲了加快Slave與master同步,可
用如下方式先進行數據同步:
(1)master的某個時刻的數據快照;
(2)數據庫的備份數據
(3)master的二進制日誌文件。
--------------mysql實現數據庫主主複製----------------
1、原理
主主複製即在兩臺MySQL主機內均可以變動數據,並且另一臺主機也會作出相應的變動。
如何實現:就是將兩個主從複製有機合併起來。
配置的時候須要注意的問題:主鍵重複,server-id不能重複。
2、實驗步驟
master:192.168.41.145 slave:192.168.41.137
一、配置文件
定義master使用奇數id
vim /etc/my.cnf
auto_increment_offset=1 #起始值。通常填第n臺主MySQL。此時爲第一臺主MySQL
auto_increment_increment=2 #步進值auto_imcrement。通常有n臺主MySQL就填n
slave 使用偶數id
auto_increment_offset=2
auto_increment_increment=2
二、 由於主主複製是兩個主從複製組合一塊兒,因此就接着上面主從複製接着配置。
(1)
①在slave上建立一個192.168.41.145主機能夠登陸的MySQL用戶。
用戶:bubu 密碼:123
②建立:create user 'bubu'@'192.168.41.145' IDENTIFIED BY "123";
受權:grant replication slave on *.* to 'bubu'@'192.168.41.145' IDENTIFIED BY "123";
mysql>FLUSH PRIVILEGES;
③在192.168.41.137上查看二進制名和位置:show master status;
(3) 告知二進制文件名與位置
在192.168.41.145中執行:
change master to master_host='192.168.41.137',
master_user='bubu',
master_password='123',
master_log_file='mysql-bin.000004',
master_log_pos=601;
主主複製配置完成。
3、測試
(1)
兩個主機分別啓動slave:start slave;
分別查看slave狀態:
192.168.41.145 【replicate-do-db=aa #要同步的數據庫,默認全部庫】
192.168.41.137
當看到Slave_IO_Running: YES、Slave_SQL_Running: YES才代表狀態正常
(2)
①192.168.41.145
MariaDB [mysql]> use jesper;
create table tab1(id int);
insert into tab1 values('66');
select*from tab1;
②192.168.41.145
MariaDB [mysql]> use jesper;
insert into tab1 values('99');
select*from tab1;
查看數據: 兩個主機數據結果同樣!
※注意:
一、主主複製配置文件中auto_increment_increment和auto_increment_offset只能保證主鍵不重複,卻不能保證主鍵有序。
二、當配置完成Slave_IO_Running、Slave_SQL_Running不全爲YES時,show slave status\G信息中有錯誤提示,可根據錯誤提示進行更正。
常見出錯點:
一、兩臺數據庫都存在db數據庫,而第一臺MySQL db中有tab1,第二臺MySQL db中沒有tab1,那確定不能成功。
二、已經獲取了數據的二進制日誌名和位置,又進行了數據操做,致使POS發生變動。在配置CHANGE MASTER時仍是用到以前的POS。
三、stop slave後,數據變動,再start slave。出錯。
終極更正法:從新執行一遍CHANGE MASTER就行了
--------------MySQL實現數據庫半同步複製-------------
半同步複製模式必須在主服務器和從服務器同時中開啓,不然將會默認爲異步複製模式。
1、環境準備
①須要安裝方可以使用:
mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';
半同步複製:
semisync_master.so
semisync_slave.so
②檢查是否有自動加載功能
MariaDB [(none)]> show variables like 'have_dynamic_loading';
③主從複製已經配置好,而且已經工做。
2、實驗步驟
一、主節點設置:
①安裝:INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
②查看:MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';#查看半同步複製文件
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
③MariaDB [mydb]> SET GLOBAL rpl_semi_sync_master_enabled=ON;【0:關閉;1:開啓】
#開啓半同步複製,默認是關閉的。
二、從節點設置:
①INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
②MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';#查看是否加載成功
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
③重啓從服務器IO線程,手動將異步模式換成半同步模式
MariaDB [mydb]> STOP SLAVE IO_THREAD;
MariaDB [mydb]> SET GLOBAL rpl_semi_sync_slave_enabled = ON ;
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [mydb]> START SLAVE IO_THREAD;
※可查看從庫錯誤日誌觀察是否生效
三、配置文件修改
主從配置文件都添加:
vim /etc/my.cnf
rpl_semi_sync_master_enabled=1 #表示之後啓動MySQL將會自動開啓半同步複製
3、測試
摸擬slave掛掉,master等待10s仍沒接收到反饋信號,則轉爲異步複製模式,繼續執行。
首先同步建立數據庫aa
一、slave執行stop slave;關閉主從複製
二、master在aa數據庫中建立表aihao,沒接收到反饋信號,等待十秒後(Rpl_semi_sync_master_timeout=1000等待超時),繼續執行
master:
slave:
三、master在數據庫中再建立tab2,不須要等待反饋,直接執行
【當反饋超時時,master將切換到異步複製模式。此時是異步模式,不須要等待】
四、slave執行start slave,數據開始同步,創建aihao、tab2,反饋給master,並切換爲半同步複製
五、slave執行stop slave;關閉主從複製
六、master在數據庫中建立表tab3,此時須要等待10s,接收slave反饋信號;等待超時,切換爲異步複製模式,繼續執行【步驟4時,數據同步已經反饋給master,此時master已是半同步複製模式】