一、MySql介紹
MySQL作為世界上使用最為廣泛的數據庫之一,免費是其原因之一。但不可忽略的是它本身的功能的確很強大。隨着技術的發展,在實際的生產環境中,由單台MySQL數據庫服務器不能滿足實際的需求。
此時數據庫集群就很好的解決了這個問題了。采用MySQL分布式集群,能夠搭建一個高並發、負載均衡的集群服務器。在此之前我們必須要保證每台MySQL服務器里的數據同步。
數據同步我們可以通過MySQL內部配置就可以輕松完成,主要有主從(master slave )復制和主主復制。
二、主從復制介紹
在MySQL集群環境中,可以分為主節點與從節點,通過主從復制可以實現數據備份、故障轉移、MySQL集群、高可用、讀寫分離等。
MySQL的主從復制是MySQL本身自帶的一個功能,不需要額外的第三方軟件就可以實現,其復制功能並不是copy文件來實現的,而是借助binlog日志文件里面的SQL命令實現的主從復制,可以理解為我再Master端執行了一條SQL命令,那么在Salve端同樣會執行一遍,從而達到主從復制的,同步數據的效果。
理解圖:
三、主從復制原理
Mysql 中有一種日志叫做 bin 日志(二進制日志)。這個日志會記錄下所有修改了數據庫的SQL 語句(insert,update,delete,create/alter/drop table, grant 等等)。
MySQL的主從復制是MySQL本身自帶的一個功能,不需要額外的第三方軟件就可以實現,其復制功能並不是copy文件來實現的,而是借助binlog日志文件里面的SQL命令實現的主從復制,
可以理解為我再Master端執行了一條SQL命令,那么在Salve端同樣會執行一遍,從而達到主從復制的效果。
從庫生成兩個線程,一個I/O線程,一個SQL線程; i/o線程去請求主庫 的binlog,並將得到的binlog日志寫到relay log(中繼日志) 文件中;
主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog; SQL 線程,會讀取relay log文件中的日志,並解析成具體操作,來實現主從的操作一致,而最終數據一致;
復制流程圖(來自網絡):
自己理解畫圖:
復制過程:
1、主節點必須啟用二進制日志,記錄任何修改了數據庫數據的事件。
2、從節點開啟一個線程(I/O Thread)把自己扮演成 mysql 的客戶端,通過 mysql 協議,請求主節點的二進制日志文件中的事件
3、主節點啟動一個線程(dump Thread),檢查自己二進制日志中的事件,跟對方請求的位置對比,如果不帶請求位置參數,則主節點就會從第一個日志文件中的第一個事件一個一個發送給從節點。
4、從節點接收到主節點發送過來的數據把它放置到中繼日志(Relay log)文件中。並記錄該次請求到主節點的具體哪一個二進制日志文件內部的哪一個位置(主節點中的二進制文件會有多個,在后面詳細講解)。
5、從節點啟動另外一個線程(sql Thread ),把 Relay log 中的事件讀取出來,並在本地再執行一次。
復制中線程的作用:
從節點:
I/O Thread: 從 Master 節點請求二進制日志事件,並保存於中繼日志中。
Sql Thread: 從Relay log 中讀取日志事件並在本地完成重放。
主節點:
Dump Thread:為每個 Slave 的 I/O Thread 啟動一個 dump 線程,用於向從節點發送二進制事件。
**思考:**從節點需要建立二進制日志文件嗎?
看情況,如果從節點需要作為其他節點的主節點時,是需要開啟二進制日志文件的。這種情況叫做級聯復制。如果只是作為從節點,則不需要創建二進制文件。
Mysql復制特點:
1、異步復制:主節點中一個用戶請求一個寫操作時,主節點不需要把寫的數據在本地操作完成同時發送給從服務器並等待從服務器反饋寫入完成,再響應用戶。
主節點只需要把寫入操作在本地完成,就響應用戶。但是,從節點中的數據有可能會落后主節點,可以使用(很多軟件來檢查是否落后)
2、主從數據不一致。
主從復制配置過程:
主服務器節點
- 啟用二進制日志。
- 為當前節點設置一個全局唯一的server_id。
- 創建有復制權限的用戶賬號 REPLIACTION SLAVE ,REPLIATION CLIENT。
vi /etc/my.cnf 新增以下內容
server_id=177 ###服務器id log-bin=mysql-bin ###開啟日志文件
重啟mysql服務 service mysqld restart
驗證是否已經配置成功
show variables like '%server_id%';
能夠查詢對應配置文件中的server_id 說明已經配置成功,如下圖:
show master status;
能夠看到同步的文件,和行數 說明已經配置成功。如圖
從服務節點:
1、克隆服務器
2、啟動中繼日志。
3、為當前節點設置一個全局唯一的server_id。
4、使用有復制權限的用戶賬號連接至主節點,並啟動復制線程。
vi /etc/my.cnf server_id=178 ###從服務器server_id log-bin=mysql-bin ###日志文件同步方式 binlog_do_db=test ###同步數據庫
重啟mysql服務 service mysqld restart
驗證是否已經配置成功
show variables like '%server_id%';
能夠查詢對應配置文件中的server_id 說明已經配置成功
從服務器同步主服務器配置
CHANGE MASTER TO MASTER_HOST='192.168.80.135',MASTER_USER='root',MASTER_PASSWORD='root', MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=415
參數詳解:
master_host: 主服務器的IP
master_user: 主服務器上新創建的用戶名
master_password: 用戶的密碼
master_port: 主服務器的端口,如果未曾修改,默認即可。
master_log_file: 主服務器二進制日志文件的名稱,填寫查看主服務器的master狀態時顯示的File的值
master_log_pos: 日志的位置,填寫查看主服務器的master狀態時顯示的Position的值
開始同步
start slave
檢查從服務器復制功能狀態
SHOW SLAVE STATUS
主要看這Slave_IO_Running、Slave_SQL_Running狀態,為Yes則表明設置成功。
Slave_IO_Running:連接到主庫,並讀取主庫的日志到本地,生成本地日志文件
Slave_SQL_Running:讀取本地日志文件,並執行日志里的SQL命令。
如果如下錯誤:
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
解決辦法
因為服務器克隆的時候交UUID產生了重復 ,解決辦法
Cat /etc/my.cnf
cd /var/lib/mysql
rm -rf auto.cnf
重啟服務器即可
service mysqld restart