標籤:mysql 資料庫複寫 主主複製 主從複製 半同步複製
--------------Mysql實現資料庫主從複製架構----------------
一、環境準備:
centos系統伺服器2台、一台使用者做Mysql主伺服器,一台用於做Mysql從伺服器,配置好yum源、防火牆關閉、各節點時鐘服務同步、各節點之間可以通過主機名稱互相通訊
192.168.41.145 master
192.168.41.137 slave
二、準備步驟:
1、iptables -F && setenforce 清空防火牆策略,關閉selinux
2、①vim /etc/hosts
192.168.41.145 master #各節點之間可以通過主機名稱互相通訊
192.168.41.137 slave
② ntpdate 172.17.0.1 #各節點時鐘服務同步
3、拿兩台伺服器都使用yum方式安裝Mysql服務,要求版本一致
4、分別啟動兩台伺服器mysql服務,確保服務正常.
三、實現步驟:
1、配置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 [email protected]'192.168.%.%' IDENTIFIED BY 'ke';
3.查看主伺服器狀態
在Master的資料庫執行show master status,查看主伺服器二進位日誌狀態
4、配置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;# 啟動複製線程。
6、查看從伺服器狀態
可使用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 個方面:
1、網路不通
2、密碼不對
3、pos不對
四、驗證
在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上查看,可以同步則成功。
五、添加新slave伺服器
假如master已經運行很久了,想對新安裝的slave進行資料同步,甚至它沒有master的資料。
此時,有幾種方法可以使slave從另一個服務開始,例如,從master拷貝資料,從另一個slave複製,從最近的備份開始一個slave。為了加快Slave與master同步,可
用以下方式先進行資料同步:
(1)master的某個時刻的資料快照;
(2)資料庫的備份資料
(3)master的二進位記錄檔。
--------------mysql實現資料庫主主複製----------------
一、原理
主主複製即在兩台MySQL主機內都可以變更資料,而且另外一台主機也會做出相應的變更。
如何?:就是將兩個主從複製有機合并起來。
配置的時候需要注意的問題:主鍵重複,server-id不能重複。
二、實驗步驟
master:192.168.41.145 slave:192.168.41.137
1、設定檔
定義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
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;
主主複製配置完成。
三、測試
(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;
查看資料: 兩個主機資料結果一樣!
※注意:
1、主主複製設定檔中auto_increment_increment和auto_increment_offset只能保證主鍵不重複,卻不能保證主鍵有序。
2、當配置完成Slave_IO_Running、Slave_SQL_Running不全為YES時,show slave status\G資訊中有錯誤提示,可根據錯誤提示進行更正。
常見出錯點:
1、兩台資料庫都存在db資料庫,而第一台MySQL db中有tab1,第二台MySQL db中沒有tab1,那肯定不能成功。
2、已經擷取了資料的二進位日誌名和位置,又進行了資料操作,導致POS發生變更。在配置CHANGE MASTER時還是用到之前的POS。
3、stop slave後,資料變更,再start slave。出錯。
終極更正法:重新執行一遍CHANGE MASTER就好了
--------------MySQL實現資料庫半同步複製-------------
半同步複製模式必須在主伺服器和從伺服器同時中開啟,否則將會預設為非同步複製模式。
一、環境準備
①需要安裝方可使用:
mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';
半同步複製:
semisync_master.so
semisync_slave.so
②檢查是否有自動載入功能
MariaDB [(none)]> show variables like 'have_dynamic_loading';
③主從複製已經配置好,並且已經工作。
二、實驗步驟
1、主節點設定:
①安裝: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:開啟】
#開啟半同步複製,預設是關閉的。
2、從節點設定:
①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;
※可查看從庫錯誤記錄檔觀察是否生效
3、設定檔修改
主從設定檔都添加:
vim /etc/my.cnf
rpl_semi_sync_master_enabled=1 #表示以後啟動MySQL將會自動開啟半同步複製
三、測試
摸擬slave掛掉,master等待10s仍沒接收到反饋訊號,則轉為非同步複製模式,繼續執行。
首先同步建立資料庫aa
1、slave執行stop slave;關閉主從複製
2、master在aa資料庫中建立表aihao,沒接收到反饋訊號,等待十秒後(Rpl_semi_sync_master_timeout=1000等待逾時),繼續執行
master:
slave:
3、master在資料庫中再建立tab2,不需要等待反饋,直接執行
【當反饋逾時時,master將切換到非同步複製模式。此時是非同步模式,不需要等待】
4、slave執行start slave,資料開始同步,建立aihao、tab2,反饋給master,並切換為半同步複製
5、slave執行stop slave;關閉主從複製
6、master在資料庫中建立表tab3,此時需要等待10s,接收slave反饋訊號;等待逾時,切換為非同步複製模式,繼續執行【步驟4時,資料同步已經反饋給master,此時master已經是半同步複製模式】
Mysql實現資料庫主從複製、主主複製、半同步複製