網(wǎng)站頁(yè)面怎么做的好看chatgpt 鏈接
系列文章目錄
rpmbuild構(gòu)建mysql5.7.42版本的rpm包
文章目錄
- 系列文章目錄
- 一、mysql-5.7.42RPM包構(gòu)建
- 二、同步模式分類(lèi)介紹
- 1.異步同步模式
- 2.半同步模式
- 2.1.實(shí)現(xiàn)半同步操作流程
- 2.2.半同步問(wèn)題總結(jié)
- 2.3.半同步一致性
- 2.4.異步與半同步對(duì)比
- 3.GTID同步
- 三、GTID同步介紹
- 1.gtid介紹
- 2.gtid組成
- 3.gtid工作原理
- 4.gtid優(yōu)缺點(diǎn)
- 四、搭建主從復(fù)制
- 1.兩臺(tái)機(jī)器分別安裝mysql-rpm包
- 2.檢查兩臺(tái)機(jī)器my.cnf配置文件
- 3.創(chuàng)建主從復(fù)制用戶(hù)
- 4.搭建主從
- 5.驗(yàn)證
- 五、主從復(fù)制原理
- 總結(jié)
一、mysql-5.7.42RPM包構(gòu)建
1、首先請(qǐng)查看頂部的系列文章目錄,通過(guò)這篇文章構(gòu)建出mysql的rpm安裝包
2、接著將構(gòu)建好的rpm包上傳到服務(wù)器,至此安裝包準(zhǔn)備完畢,接下來(lái)搭建GTID同步模式的主從復(fù)制
二、同步模式分類(lèi)介紹
1.異步同步模式
異步同步模式是 MySQL 默認(rèn)的同步策略模式。
客戶(hù)端在向服務(wù)端發(fā)送請(qǐng)求后,master處理完之后,直接返回客戶(hù)端結(jié)果,接著在將對(duì)應(yīng)的log信息發(fā)送給 slave節(jié)點(diǎn)。
異步同步模式缺點(diǎn)
主庫(kù)在執(zhí)行完客戶(hù)端提交的事務(wù)后會(huì)立即將結(jié)果返回給客戶(hù)端,并不關(guān)心從庫(kù)是否已經(jīng)接收并處理,
這樣就會(huì)有一個(gè)問(wèn)題,主庫(kù)如果crash掉了,此時(shí)主庫(kù)上已經(jīng)提交的事務(wù)可能并沒(méi)有傳到從庫(kù)上,
如果此時(shí),強(qiáng)行將從提升為主,可能導(dǎo)致新的主庫(kù)上數(shù)據(jù)不完整
2.半同步模式
半同步模式與異步同步的模式最大的區(qū)別
1、主庫(kù)在執(zhí)行完客戶(hù)端提交的事務(wù)后不是立刻返回給客戶(hù)端,而是等待至少一個(gè)從庫(kù)接收到并寫(xiě)到relay_log中才返回給客戶(hù)端
2、半同步模式也是基于異步復(fù)制的基礎(chǔ)上進(jìn)行的,無(wú)非是半同步模式需要安裝異步插件完成
2.1.實(shí)現(xiàn)半同步操作流程
1、檢測(cè)是否支持動(dòng)態(tài)安裝插件模式
mysql > select @@have_dynamic_loading; #返回YES為支持,反之不支持
2、在 master 上安裝 master 對(duì)應(yīng)的插件.slave節(jié)點(diǎn)也可以安裝,此處不做示例
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #執(zhí)行安裝
mysql >show global variables like 'rpl_semi%'; #查看安裝插件后的參數(shù)配置
+-------------------------------------------+------------+
| 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_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
3、master 服務(wù)器和 slave 服務(wù)器都開(kāi)啟主從復(fù)制插件功能
mysql > set global rpl_semi_sync_master_enabled=ON; #調(diào)整半同步插件參數(shù)值
mysql > show global variables like 'rpl_semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+-------------------------------------------+------------+
4、salve 節(jié)點(diǎn)半同步復(fù)制模式
mysql >stop slave io_thread;
mysql >start slave io_thread;
5、在 master 上查看 slave 信息。
這里我們看到 Rpl_semi_sync_master_clients=1,則表示有一個(gè) salve 節(jié)點(diǎn)連接上了
mysql > show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_status | ON |
+--------------------------------------------+-------+
15 rows in set
Time: 0.011s
2.2.半同步問(wèn)題總結(jié)
問(wèn)題 | 解答 |
---|---|
slave 節(jié)點(diǎn)響應(yīng) master 延遲 | 當(dāng) master 發(fā)送給 slave 節(jié)點(diǎn) binary log 之后,需要等待 slave 的響應(yīng)。有時(shí)可能 slave 節(jié)點(diǎn)響應(yīng)很慢,master 不能一直等待,這樣會(huì)導(dǎo)致客戶(hù)端請(qǐng)求超時(shí)情況,可以通過(guò)下面的參數(shù)進(jìn)行設(shè)置。該參數(shù)的單位是毫秒,默認(rèn)是 10 秒,推薦設(shè)置大一點(diǎn)。因?yàn)槌瑫r(shí)之后,master 會(huì)自動(dòng)切換為異步復(fù)制。rpl_semi_sync_master_timeout |
半同步模式自動(dòng)轉(zhuǎn)為異步同步模式 | 上方提到了,如果超時(shí)之后,半同步模式會(huì)自動(dòng)切換為異步復(fù)制模式。 |
master 接收 slave 節(jié)點(diǎn)數(shù)量,響應(yīng)客戶(hù)端。 | 當(dāng) master 需要將 binary log 發(fā)送給多個(gè) slave 節(jié)點(diǎn)時(shí),如果 slave 節(jié)點(diǎn)存在多個(gè),master 都要等待 slave 一一響應(yīng)之后才回復(fù)客戶(hù)端,這也是一個(gè)特別耗時(shí)的過(guò)程,可以通過(guò)下面的參數(shù)進(jìn)行設(shè)置。rpl_semi_sync_master_wait_for_slave_count #默認(rèn)是1 |
當(dāng)半同步模式自動(dòng)切換為異步之后,如何切換為半同步模式。 | 這時(shí)候需要手動(dòng)切換模式。就是關(guān)閉 io_thread,再開(kāi)啟 io_thread |
2.3.半同步一致性
半同步復(fù)制模式極大程度上提高了主從復(fù)制的一致性。同時(shí)在 MySQL5.7+的版本增加了另外一個(gè)參數(shù),
讓復(fù)制的一致性更加可靠。這個(gè)參數(shù)就是rpl_semi_sync_master_wait_point,需要在 master 上執(zhí)行。
mysql > set global rpl_semi_sync_master_wait_point = 'x';該參數(shù)有兩個(gè)值。一個(gè)值是 AFTER_SYNC,一個(gè)值是 AFTER_COMMIT。默認(rèn)是 AFTER_SYNC。區(qū)別如下表格所示
AFTER_COMMIT | master 在將事務(wù)寫(xiě)入 binary log 之后,然后發(fā)送給 slave。同時(shí)也會(huì)自動(dòng)提交 master 的事務(wù)。等 slave 響應(yīng)之后,master 接著響應(yīng)給客戶(hù)端信息。 |
---|---|
AFTER_SYNC | master 在將事務(wù)寫(xiě)入 binary log 之后,然后發(fā)送給 slave。等待 slave 響應(yīng)之后,才會(huì)提交 master 的事務(wù),接著響應(yīng)給客戶(hù)端信息。 |
2.4.異步與半同步對(duì)比
異步同步模式 | 是直接返回給客戶(hù)端在處理 slave 的問(wèn)題,如果 master 響應(yīng)給客戶(hù)端成功信息,在處理 slave 問(wèn)題時(shí),服務(wù)掛掉了,此時(shí)就會(huì)出現(xiàn)數(shù)據(jù)不一致。 |
---|---|
半同步模式 | 需要等待 slave 節(jié)點(diǎn)做出響應(yīng),master 才會(huì)響應(yīng)客戶(hù)端,如果 salve 響應(yīng)較慢就會(huì)造成客戶(hù)端等待時(shí)間較長(zhǎng) |
半同步模式 | master 等待 slave 響應(yīng)之后才會(huì)響應(yīng)給客戶(hù)端,此方式極大程度的保證了數(shù)據(jù)的一致性,為主從復(fù)制的數(shù)據(jù)一致性提供了更可靠的保證。也推薦使用該方式進(jìn)行主從復(fù)制操作。 |
3.GTID同步
如下方所示
三、GTID同步介紹
1.gtid介紹
GTID是一種全局事務(wù)ID,它是在master上已經(jīng)提交的事務(wù),slave直接根據(jù)該ID進(jìn)行復(fù)制操作。
該操作替代了binary log + postion的方式。使得主從復(fù)制的配置操作更加簡(jiǎn)單。
2.gtid組成
server-id不是MySQL配置文件中id,而是每一個(gè)MySQL服務(wù)在啟動(dòng)時(shí),都會(huì)生成一個(gè)全局隨機(jī)唯一的ID。transaction-id則是事務(wù)的ID,創(chuàng)建事務(wù)是會(huì)自動(dòng)生成一個(gè)ID。
GTID = server-id + transaction-id組成
3.gtid工作原理
1、當(dāng)一個(gè)事務(wù)在主庫(kù)端執(zhí)行并提交時(shí),會(huì)產(chǎn)生GITD,一同記錄到binlog日志中
2、binlog傳輸?shù)絪lave,并存儲(chǔ)到slave的relay-log(中繼日志)中,,讀取GTID的這個(gè)值設(shè)置gtid_next變量,即告訴Slave,下一個(gè)要執(zhí)行的GTID值
3、sql線(xiàn)程從relay log中獲取GTID,然后對(duì)比slave端的binlog是否有該GTID
4、如果有記錄,說(shuō)明該GTID的事務(wù)已經(jīng)執(zhí)行,slave會(huì)忽略
5、如果沒(méi)有記錄,slave就會(huì)執(zhí)行該GTID事務(wù),并記錄該GTID到自身的binlog。在讀取執(zhí)行事務(wù)前會(huì)先檢查其他session持有該GTID,確保不被重復(fù)執(zhí)行。
6、在解析過(guò)程中會(huì)判斷是否有主鍵,如果沒(méi)有就用二級(jí)索引,如果沒(méi)有就用全部掃描
4.gtid優(yōu)缺點(diǎn)
優(yōu)點(diǎn) | 缺點(diǎn) |
---|---|
根據(jù) GTID 可以快速的確定事務(wù)最初是在哪個(gè)實(shí)例上提交的。 | 必須確保主從庫(kù)的引擎一致 |
簡(jiǎn)單的實(shí)現(xiàn) failover,不用以前那樣在需要找 log_file 和 log_pos。 | 不允許一個(gè)SQL同時(shí)更新一個(gè)事務(wù)引擎和非事務(wù)引擎的表 |
更簡(jiǎn)單的搭建主從復(fù)制,確保每個(gè)事務(wù)只會(huì)被執(zhí)行一次。 | / |
比傳統(tǒng)的復(fù)制更加安全,一個(gè) GTID 在一個(gè)服務(wù)器上只執(zhí)行一次,避免重復(fù)執(zhí)行導(dǎo)致數(shù)據(jù)混亂或者主從不一致。 | / |
GTID是連續(xù)的沒(méi)有空洞的,保證數(shù)據(jù)的一致性,零丟失 | / |
GTID 用來(lái)代替classic的復(fù)制方法,不再使用 binlog+pos 開(kāi)啟復(fù)制。而是使用 master_auto_postion=1 的方式自動(dòng)匹配 GTID 斷點(diǎn)進(jìn)行復(fù)制。 | / |
GTID 的引入,讓每一個(gè)事務(wù)在集群事務(wù)的海洋中有了秩序,使得 DBA 在運(yùn)維中做集群變遷時(shí)更加方便 | / |
四、搭建主從復(fù)制
環(huán)境準(zhǔn)備
ip | 分類(lèi) |
---|---|
192.168.56.130 | master |
192.168.56.131 | slave |
1.兩臺(tái)機(jī)器分別安裝mysql-rpm包
這個(gè)rpm包就是第一步已構(gòu)建好的rpm包
[root@mysql1 ~]# rpm -ivh city-mysql5.7.42-1-1.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...1:city-mysql5.7.42-1-1 ################################# [100%]
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
Datadir /export/servers/data/my3306 will been created,instance install will continue
Starting MySQL..... SUCCESS!
Install successful!!!
The Password of mysql user root is : 0gvzJr66iNs51. mysql進(jìn)程可以使用systemctl啟停;2. mysql未設(shè)置開(kāi)機(jī)自啟;3. mysql登陸方式:mysql -uroot -p -S /export/servers/data/my3306/run/mysqld.sock4. 建議修改root密碼5. 參數(shù)文件中設(shè)置為只讀(read_only=1 super_read_only=1),如需要請(qǐng)將參數(shù)值該為零。
2.檢查兩臺(tái)機(jī)器my.cnf配置文件
因?yàn)樵诎惭b了構(gòu)建好的rpm包后,my.cnf文件已經(jīng)封裝進(jìn)去了,因此在安裝后,只需要略微調(diào)試相關(guān)參數(shù),即可使用。下方只列出了幾個(gè)需要修改的重要參數(shù),其余參數(shù)再次不展示
master節(jié)點(diǎn)
檢查my.cnf文件中是否包含了開(kāi)啟gtid的相關(guān)參數(shù)
server_id = 1 #自定義
log_bin = ON
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON
innodb_buffer_pool_size= 1G #根據(jù)服務(wù)器配置調(diào)整
slave節(jié)點(diǎn)
server_id = 2 #自定義 與master不同即可
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON
log_slave_updates = ON
read_only = ON #從庫(kù)開(kāi)啟只讀
super_read_only = ON #從庫(kù)開(kāi)啟只讀
innodb_buffer_pool_size= 1G #根據(jù)服務(wù)器配置調(diào)整
參數(shù)調(diào)整完成后,需要重啟master-slave兩個(gè)節(jié)點(diǎn)的MySQL,重啟完成后,下一步就開(kāi)始搭建主從關(guān)系
3.創(chuàng)建主從復(fù)制用戶(hù)
登錄主庫(kù)執(zhí)行
mysql > grant replication slave on *.* to 'repl'@'%' identified by '123456';
mysql > flush privileges;
4.搭建主從
登錄從庫(kù)操作
mysql > reset master;
mysql > change master to master_host='主庫(kù)IP', master_port=主庫(kù)端口,master_user='repl' ,master_password='xx' ,master_auto_position=1;
mysql > start slave; #開(kāi)啟主從復(fù)制
mysql > show slave status\G; #查看主從狀態(tài)
當(dāng)IO thread和SQL thrad 都為YES 說(shuō)明主從搭建完畢
5.驗(yàn)證
登錄主庫(kù)操作
mysql> show master status;
+------------------+-----------+--------------+------------------+---------------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+---------------------------------------------------+
| mysql-bin.010602 | 590048831 | | | 52cf1b46-f308-11ec-a372-fa163e258462:1-1404783188 |
+------------------+-----------+--------------+------------------+---------------------------------------------------+
1 row in set (0.00 sec)
如上所示,主庫(kù)已產(chǎn)生了binlog日志及記錄了當(dāng)前gtid執(zhí)行的位置。至此基于GTID同步模式的主從復(fù)制搭建完成
五、主從復(fù)制原理
1、服務(wù)器開(kāi)啟二進(jìn)制日志,主服務(wù)器會(huì)把sql操作記錄通過(guò)多dump線(xiàn)程寫(xiě)入到主服務(wù)器的二進(jìn)制日志中
2、從服務(wù)器的io 線(xiàn)程向主服務(wù)器二進(jìn)制日志發(fā)送請(qǐng)求,master 服務(wù)器在接收到請(qǐng)求之后,根據(jù)偏移量將新的 binary log 發(fā)送給 slave 服務(wù)器。
3、slave 服務(wù)器收到新的 binary log 之后,寫(xiě)入到自身的 relay log 中,這就是所謂的中繼日志
4、slave 服務(wù)器,單獨(dú)開(kāi)啟一個(gè) sql thread 讀取 relay log 之后,寫(xiě)入到自身數(shù)據(jù)中
總結(jié)
本篇文章主要針對(duì)mysql5.7版本的同步模式分類(lèi)、基于gtid同步模式搭建主從寫(xiě)的文章,對(duì)于mysql的構(gòu)建安裝過(guò)程可參考頂部的鏈接文章。希望這幾篇文章可以幫助到大家