版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第3章
數(shù)據(jù)庫集群3.1數(shù)據(jù)庫簡介3.2數(shù)據(jù)庫集群簡介3.3數(shù)據(jù)庫集群架構(gòu)3.4數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.5數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)熟悉常用的數(shù)據(jù)庫熟悉常用數(shù)據(jù)庫集群架構(gòu)掌握數(shù)據(jù)庫主從復(fù)制的搭建方法掌握數(shù)據(jù)庫讀寫分離的部署方式引言眾所周知,網(wǎng)站數(shù)據(jù)安全和7x24不宕機(jī)是運(yùn)維人員的核心任務(wù),而網(wǎng)站數(shù)據(jù)安全離不開數(shù)據(jù)庫集群的構(gòu)建。使用單機(jī)MySQL存儲網(wǎng)站數(shù)據(jù)讀寫速度快,適用于低并發(fā)的情況。但是隨著用戶的激增,數(shù)據(jù)的量級也是呈指數(shù)的增長,從GB到TB到PB,大量的讀寫請求會使單節(jié)點(diǎn)的MySQL硬盤無法承受,一些大規(guī)模的網(wǎng)站則會構(gòu)建數(shù)據(jù)庫集群來提高數(shù)據(jù)庫的安全性和可靠性。本章將詳細(xì)講解數(shù)據(jù)庫集群相關(guān)知識。3.1數(shù)據(jù)庫簡介數(shù)據(jù)庫定義數(shù)據(jù)庫的類型MySQL簡介數(shù)據(jù)庫(Database)是按照一定的數(shù)據(jù)結(jié)構(gòu)(數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)的組織形式或數(shù)據(jù)之間的聯(lián)系)來組織、存儲及管理數(shù)據(jù)的倉庫,可視為電子化的文件柜,用戶可以對文件中的數(shù)據(jù)進(jìn)行新增、查詢、更新、刪除等操作。早期比較受歡迎的數(shù)據(jù)庫模型有三種,分別為層次式數(shù)據(jù)庫、網(wǎng)絡(luò)式數(shù)據(jù)庫、關(guān)系型數(shù)據(jù)庫。而現(xiàn)代的互聯(lián)網(wǎng)世界中,最常用的數(shù)據(jù)庫模型只有兩種,關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫。3.1
數(shù)據(jù)庫簡介1.關(guān)系型數(shù)據(jù)庫雖然網(wǎng)絡(luò)式數(shù)據(jù)庫和層次式數(shù)據(jù)庫已經(jīng)很好地解決了數(shù)據(jù)的集中和共享問題,但是在數(shù)據(jù)獨(dú)立和抽象級別上仍有很大欠缺。用戶在對這兩種數(shù)據(jù)庫進(jìn)行存取時,仍然需要明確數(shù)據(jù)的存儲結(jié)構(gòu),指出存取路徑。而關(guān)系型數(shù)據(jù)庫就可以比較好地解決這些問題。關(guān)系型數(shù)據(jù)庫模型是把復(fù)雜的數(shù)據(jù)結(jié)構(gòu)歸結(jié)為簡單的二元關(guān)系(即二維表格形式)。在關(guān)系型數(shù)據(jù)庫中,對數(shù)據(jù)的操作幾乎全部建立在一個或多個關(guān)系表格上,通過這些關(guān)聯(lián)的表格分類、合并、連接或選取等運(yùn)算來實(shí)現(xiàn)數(shù)據(jù)的管理。2.非關(guān)系型數(shù)據(jù)庫非關(guān)系型數(shù)據(jù)庫也被稱為NoSQL數(shù)據(jù)庫,NoSQL的本意是“NotOnlySQL”,指的是非關(guān)系型數(shù)據(jù)庫,而不是“NOSQL”的意思,因此,NoSQL的產(chǎn)生并不是要徹底否定關(guān)系型數(shù)據(jù)庫,而是作為傳統(tǒng)數(shù)據(jù)庫的一個有效補(bǔ)充。NoSQL數(shù)據(jù)庫在特定的場景下可以發(fā)揮難以想象的高效率和高性能。3.1
數(shù)據(jù)庫簡介隨著Web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在應(yīng)付Web2.0網(wǎng)站,特別是對于規(guī)模日益擴(kuò)大,數(shù)據(jù)越來越海量,擁有超大規(guī)模和高并發(fā)的類似微博、微信、SNS等的Web2.0純動態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問題,例如:傳統(tǒng)的關(guān)系型數(shù)據(jù)庫IO瓶頸、性能瓶頸都難以有效突破,于是開始出現(xiàn)了大批針對特定場景,以高性能和使用便利為目的功能特異化的數(shù)據(jù)庫產(chǎn)品。NoSQL(非關(guān)系型)類的數(shù)據(jù)庫在就是這樣的情景中誕生并得到了非常迅速的發(fā)展。關(guān)系型數(shù)據(jù)庫是目前最受歡迎的數(shù)據(jù)庫管理系統(tǒng),技術(shù)比較成熟,尤其是MySQL數(shù)據(jù)庫,很多中小型企業(yè)為了節(jié)省成本都會選擇它。下面來認(rèn)識一下企業(yè)中常用的數(shù)據(jù)庫。常用的:SQLServer、Oracle、MySQL、Redis、MongoDB等。不常用的:DB2、Informix、Sybase、PostgreSQL等。由于篇幅有限,這里只重點(diǎn)介紹最常用的MySQL。3.1
數(shù)據(jù)庫簡介MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQLAB公司開發(fā),屬于Oracle旗下產(chǎn)品。MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在WEB應(yīng)用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。MySQL所使用的SQL語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。MySQL軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),一般中小型網(wǎng)站的開發(fā)都會選擇MySQL作為網(wǎng)站數(shù)據(jù)庫。3.1
數(shù)據(jù)庫簡介3.1數(shù)據(jù)庫集群簡介數(shù)據(jù)庫集群的概念數(shù)據(jù)庫集群與分布式數(shù)據(jù)庫系統(tǒng)的區(qū)別數(shù)據(jù)庫集群,顧名思義,配置若干(兩臺及以上)臺數(shù)據(jù)庫服務(wù)器組成一個系統(tǒng),作為一個整體為客戶端提供透明的數(shù)據(jù)服務(wù)。大量讀寫請求來臨時,數(shù)據(jù)庫集群可以將請求分發(fā)給不同的集群節(jié)點(diǎn),這樣的處理使得數(shù)據(jù)的讀寫速度更快,也更好地解決了高并發(fā)情況下單節(jié)點(diǎn)數(shù)據(jù)庫的性能問題。數(shù)據(jù)庫集群技術(shù)不但為數(shù)據(jù)提供了安全性,增加了冗余特性,還避免了單點(diǎn)故障對網(wǎng)站系統(tǒng)產(chǎn)生的巨大損失和負(fù)面影響,保障了系統(tǒng)的穩(wěn)定性。數(shù)據(jù)庫集群和分布式數(shù)據(jù)庫系統(tǒng)都可以解決更高并發(fā)量的問題,以及實(shí)現(xiàn)容災(zāi)、數(shù)據(jù)備份,提高數(shù)據(jù)信息的安全性。分布式數(shù)據(jù)庫是指利用網(wǎng)絡(luò)將分散的數(shù)據(jù)存儲節(jié)點(diǎn)連接起來組成一個整體提供數(shù)據(jù)庫服務(wù)。用戶通過分布式數(shù)據(jù)庫系統(tǒng)的就近訪問原則,可以訪問就近的數(shù)據(jù)庫節(jié)點(diǎn),數(shù)據(jù)庫各節(jié)點(diǎn)之間能夠同步數(shù)據(jù)傳輸,實(shí)現(xiàn)了數(shù)據(jù)的一致性。3.2
數(shù)據(jù)庫集群簡介數(shù)據(jù)庫集群與分布式數(shù)據(jù)庫系統(tǒng)的對比圖。3.2
數(shù)據(jù)庫集群簡介數(shù)據(jù)庫集群與分布式數(shù)據(jù)庫系統(tǒng)的區(qū)別。(1)數(shù)據(jù)庫可以具有多個相似或相同的數(shù)據(jù)集,分布式數(shù)據(jù)庫系統(tǒng)一般具有完全不同的數(shù)據(jù)集。(2)數(shù)據(jù)庫集群的各節(jié)點(diǎn)使用相同的操作系統(tǒng)、數(shù)據(jù)庫版本,以及相同版本的補(bǔ)丁包,而分布式數(shù)據(jù)庫系統(tǒng)中各節(jié)點(diǎn)可以使用不同的操作系統(tǒng)和不同版本的數(shù)據(jù)庫系統(tǒng)。(3)數(shù)據(jù)庫集群一般情況下是建立在高速局域網(wǎng)內(nèi),而分布式數(shù)據(jù)庫系統(tǒng)還可以建立在異地遠(yuǎn)程網(wǎng)絡(luò)。3.3數(shù)據(jù)庫集群架構(gòu)主從復(fù)制多級復(fù)制雙主復(fù)制多元復(fù)制主從復(fù)制架構(gòu),顧名思義,分為主數(shù)據(jù)庫和從數(shù)據(jù)庫。從數(shù)據(jù)庫要求與主數(shù)據(jù)庫有完全相同數(shù)據(jù)庫環(huán)境,當(dāng)主數(shù)據(jù)庫實(shí)時更新數(shù)據(jù)信息時,主數(shù)據(jù)庫會將更新信息寫入一個二進(jìn)制文件binlog中,然后發(fā)送到從數(shù)據(jù)庫中。從服務(wù)器成功連接主服務(wù)器后,讀取主服務(wù)器的二進(jìn)制文件,并執(zhí)行相應(yīng)的操作直至最后一次更新的位置,然后等待主服務(wù)器通知新的更新。數(shù)據(jù)的完整性依賴于主庫保存的binlog,比如主庫宕機(jī)了,還可以通過binlog把丟失的數(shù)據(jù)同步到從庫中,以加強(qiáng)數(shù)據(jù)的安全性。3.3
數(shù)據(jù)庫集群架構(gòu)3.3.1
主從復(fù)制一主多從復(fù)制的邏輯圖主從復(fù)制的主要作用就是做數(shù)據(jù)的熱備,主數(shù)據(jù)庫一般為實(shí)時的業(yè)務(wù)數(shù)據(jù)庫,從數(shù)據(jù)庫作為后備數(shù)據(jù)庫。當(dāng)主庫故障后,可以切換為從庫繼續(xù)工作,有效避免了數(shù)據(jù)的丟失。在主庫讀取請求壓力非常大的情況下,有3種方法可以有效解決。第1種是提高主庫的配置,主庫執(zhí)行讀、寫功能,從庫進(jìn)行備份,避免備份期間影響主服務(wù)器服務(wù),確保數(shù)據(jù)安全;第2種方法是在一主多從的復(fù)制架構(gòu)中實(shí)現(xiàn)讀寫分離,使用主庫實(shí)現(xiàn)寫入數(shù)據(jù),從庫執(zhí)行查詢工作(即讀功能),使數(shù)據(jù)庫能支撐更大的并發(fā)量;第3種是把大量實(shí)時性要求不高的讀請求利用負(fù)載均衡分發(fā)到多個從庫上,把實(shí)時性要求很高的請求分發(fā)到主庫去讀,從而降低主庫的讀取壓力。但是需要注意,由于主從復(fù)制是異步復(fù)制,會產(chǎn)生主從延遲的問題。3.3
數(shù)據(jù)庫集群架構(gòu)3.3.1
主從復(fù)制一主多從的復(fù)制架構(gòu)可以解決大部分請求壓力較大的場景需求,隨著業(yè)務(wù)量的增大,主庫發(fā)送binlog日志到從庫的I/O訪問頻率過高,網(wǎng)絡(luò)壓力也會隨著增大,這時多級復(fù)制架構(gòu)可以解決主庫額外的I/O線程壓力和網(wǎng)絡(luò)壓力。3.3
數(shù)據(jù)庫集群架構(gòu)3.3.2
多級復(fù)制MySQL的多級復(fù)制邏輯圖多級復(fù)制結(jié)構(gòu)與一主多從結(jié)構(gòu)相比,添加了一個二級主庫Master2,那么主庫Master1只需給一個庫Master2發(fā)送二進(jìn)制日志,降低了主庫的壓力。3.3
數(shù)據(jù)庫集群架構(gòu)3.3.2
多級復(fù)制多級復(fù)制結(jié)構(gòu)中不難看出,主庫Master1的數(shù)據(jù)信息需要經(jīng)過兩次復(fù)制才能到達(dá)Slave,那么這個過程的延遲會比一主多從復(fù)制的延遲還嚴(yán)重。針對上述問題,可以把二級主庫Master2數(shù)據(jù)表的引擎設(shè)置為BlackHole,來有效減少延遲問題。BlackHole引擎又稱為“黑洞”引擎,使用此引擎的表格永遠(yuǎn)為空,數(shù)據(jù)并不會寫入磁盤中,而對數(shù)據(jù)的增、刪、改等操作會被記錄到binlog中,示例代碼。mysql>CREATETABLEuser( 'id'intNOTNULLAUTO_INCREMENTPRIMARYKEY, 'name'varchar(20)NOTNULLDEFAULT'', 'age'tinyintunsignedNOTNULLDEFAULT0)ENGINE=BLACKHOLEcharset=utf8;QueryOK,0rowsaffected(0.02sec)mysql>INSERTINTO'user'('name','age')values("qianfeng","18");QueryOK,1rowsaffected(0.02sec)mysql>SELECT*FROMuser;Emptyset(0.00sec)表中的數(shù)據(jù)為空。設(shè)置二級主庫使用BlackHole引擎后,二級主庫并不負(fù)責(zé)讀寫等請求,只是把binlog日志發(fā)送到從庫Slave中。3.3
數(shù)據(jù)庫集群架構(gòu)3.3.3
雙主復(fù)制主主復(fù)制邏輯圖雙主復(fù)制(DualMaster)又稱為主主復(fù)制,即兩個主數(shù)據(jù)庫,且兩個主庫互為主從。主主復(fù)制架構(gòu)常用于數(shù)據(jù)庫管理員做維護(hù)時需要主從切換的場景,從而避免了重復(fù)搭建從庫的麻煩。3.3
數(shù)據(jù)庫集群架構(gòu)3.3.3
雙主復(fù)制雙主架構(gòu)聯(lián)合主從復(fù)制主主架構(gòu)可以與主從復(fù)制聯(lián)合一起使用,如在Master2庫下配置從庫,如此一來大大減少了主庫的讀取壓力和重建從庫的額外壓力。MySQL5.7版本開始支持多源(Multi-Source)復(fù)制,實(shí)現(xiàn)了多主一從復(fù)制,將多個數(shù)據(jù)庫(Master)的數(shù)據(jù)集中發(fā)送到1臺從庫(Slave)上。多源復(fù)制結(jié)構(gòu)要求至少包含兩個主庫和一個從庫,常被用于復(fù)雜的業(yè)務(wù)需求,不但可以支撐OLTP(聯(lián)機(jī)事務(wù)處理),又能夠滿足OLAP(聯(lián)機(jī)分析處理)。3.3
數(shù)據(jù)庫集群架構(gòu)3.3.4
多源復(fù)制多源復(fù)制的邏輯圖使用多源復(fù)制可以將多個服務(wù)器的數(shù)據(jù)信息備份到單個服務(wù)器,數(shù)據(jù)集中存放節(jié)省了服務(wù)器等軟硬件成本以及避免了資源的浪費(fèi)。通過多源復(fù)制實(shí)現(xiàn)了將多個庫表合并,匯聚數(shù)據(jù),便于數(shù)據(jù)集中統(tǒng)計(jì)、分析和操作。3.4數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)MySQL主從復(fù)制原理實(shí)驗(yàn)環(huán)境部署MySQL部署主從復(fù)制集群測試數(shù)據(jù)同步MySQL的主從復(fù)制是一個異步的復(fù)制過程,數(shù)據(jù)將從一個MySQL數(shù)據(jù)庫(Master)復(fù)制到另外一個MySQL數(shù)據(jù)庫(Slave),是由三個線程參與完成了在Master與Slave之間數(shù)據(jù)復(fù)制的過程。其中有兩個線程(SQL線程和I/O線程)在Slave端,另外一個線程(I/O線程)在Master端。要實(shí)現(xiàn)MySQL的主從復(fù)制,首先必須打開Master端的binlog記錄功能,否則就無法實(shí)現(xiàn)。因?yàn)檎麄€復(fù)制過程實(shí)際上就是Slave端從Master端獲取binlog日志,然后再在Slave上以相同的順序執(zhí)行獲取的binlog日志中所記錄的各種SQL操作。要打開MySQL的binlog記錄功能,可以通過在MySQL的配置文件f中的mysqld模塊增加log_bin參數(shù)來實(shí)現(xiàn)。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.1
MySQL主從復(fù)制原理將主從復(fù)制的過程總結(jié)為5步,具體如下所示。(1)主庫把數(shù)據(jù)更改(DDL、DML、DCL)事件記錄到二進(jìn)制日志(BinaryLog)中。(2)從庫向主庫發(fā)起連接,主庫和從庫連接。(3)這時,主庫創(chuàng)建一個binlogdumpthread線程,將二進(jìn)制日志的內(nèi)容發(fā)送給從庫。(4)從庫啟動后,創(chuàng)建I/O線程讀取主庫上的日志并復(fù)制到自己的中繼日志(RelayLog)中。(5)從庫繼續(xù)創(chuàng)建SQL線程讀取中繼日志中的內(nèi)容,將其重放到從庫數(shù)據(jù)庫之上。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.1
MySQL主從復(fù)制原理MySQL主從復(fù)制的工作過程準(zhǔn)備2臺VM虛擬機(jī)(或者物理服務(wù)器),一臺做主數(shù)據(jù)庫(master1),一臺從數(shù)據(jù)庫(slave1),具體如表。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.2
實(shí)驗(yàn)環(huán)境配置項(xiàng)主服務(wù)器從服務(wù)器HostNamemaster1slave1IP4445ServerID144145版本號MySQL5.7MySQL5.7說明:ServerID的取值范圍為1~65535,并且每臺主機(jī)的ServerID不能相同,本例中以服務(wù)器IP地址的最后兩位作為ServerID。操作系統(tǒng)版本CentOS7.6,提前關(guān)閉防火墻及SELinux(過程不再贅述)。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.2
實(shí)驗(yàn)環(huán)境1.在實(shí)驗(yàn)開始前,建議為這2臺服務(wù)器互相做域名解析,便于通信。域名解析可以使用修改本地hosts文件的方式,也可以使用DNS服務(wù)器解析。這里采取修改hosts文件的方式,分別在2臺服務(wù)器的/etc/hosts文件中添加以下代碼。44master145slave1做完域名解析之后,可以使用ping命令進(jìn)行檢測,若無丟包現(xiàn)象,說明解析成功。2.為了便于讀者觀察實(shí)驗(yàn)操作對象,將主從服務(wù)器的主機(jī)名修改為master1、slave1,可以省略此步。修改主機(jī)名。[root@qfedu~]#hostnamectlset-hostname新的主機(jī)名例如,修改主服務(wù)器的主機(jī)名為qfedu-master1。[root@qfedu~]#hostnamectlset-hostnamemaster13.為了保證各服務(wù)器的時間一致,對服務(wù)器進(jìn)行時間校對。[root@qfedu~]#ntpdate-u1本書將以目前比較成熟的MySQL數(shù)據(jù)庫為例來展示數(shù)據(jù)庫優(yōu)化方法的應(yīng)用。在虛擬機(jī)上部署MySQL數(shù)據(jù)庫有兩種方式,一種是直接使用Yum命令下載安裝,另一種是使用源碼包安裝。兩種方式各有優(yōu)缺點(diǎn),詳情如表。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQLMySQL安裝方式Y(jié)um安裝源碼包安裝優(yōu)點(diǎn)可以自動處理依賴關(guān)系,無需編譯,安裝速度快。十分靈活,可以根據(jù)需求自行調(diào)整組件或其他參數(shù)。缺點(diǎn)無法進(jìn)行MySQL的個性化設(shè)置,不可以隨意增加或刪除一些組件。安裝速度慢,且安裝過程復(fù)雜極易出錯,有可能會因?yàn)閷?yīng)用環(huán)境把握失誤、參數(shù)設(shè)置不當(dāng),而使得系統(tǒng)性能更差。對于初學(xué)者,推薦采用Yum的方式進(jìn)行實(shí)驗(yàn)。因篇幅有限,本書只介紹Yum安裝的方式,有興趣使用源碼包安裝MySQL的讀者可以參考官方文檔自行實(shí)驗(yàn)。(1)進(jìn)入MySQL官網(wǎng)。CentOS7默認(rèn)的倉庫中沒有MySQL的鏡像源,首先需要從官方網(wǎng)站()下載MySQL的鏡像倉庫文件來更新Yum倉庫。Yum倉庫中存有MySQL的鏡像源之后,再下載并安裝MySQL,之后初始化MySQL進(jìn)行使用。1.配置MySQL鏡像源3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL(2)單擊上圖中的“DOWNLOADS”標(biāo)簽,進(jìn)入MySQL下載頁。(4)單擊MySQL社區(qū)版下載鏈接,進(jìn)入MySQL社區(qū)版下載頁。(3)進(jìn)入MySQL下載頁之后,會看到MySQL性能簡介。繼續(xù)下拉該頁面,可以看到MySQL社區(qū)版的下載鏈接。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL企業(yè)版主要作為商用,閉源收費(fèi)。社區(qū)版與企業(yè)版功能并無太大差異,且開源免費(fèi),這里選擇社區(qū)版進(jìn)行實(shí)驗(yàn)。(6)單擊該版本對應(yīng)的Download按鈕進(jìn)入確認(rèn)下載頁。(5)單擊圖中的“MySQLYumRepository”鏈接,進(jìn)入到MySQL倉庫源的版本選擇頁。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL使用的是CentOS7進(jìn)行實(shí)驗(yàn),所以在此處選擇“RedHatEnterpriseLinux7/OracleLinux7(ArchitectureIndependent),RPMPackage”進(jìn)行實(shí)驗(yàn)3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL(7)鼠標(biāo)右鍵單擊頁面下方“Nothanks,juststartmydownload.”鏈接,選擇復(fù)制鏈接地址,再返回到虛擬機(jī)終端,使用wget命令下載MySQL。(8)下載完成后,輸入ls即可看到下載完成的MySQL鏡像包。使用Yum工具將該鏡像包解析并更新至本機(jī)的鏡像源中。[root@qfedu~]#wget /get/mysql80-community-release-el7-4.noarch.rpm[root@qfedu~]#lsmysql80-community-release-el7-4.noarch.rpm[root@qfedu~]#yum-ylocalinstallmysql80-community-release-el7-4.noarch.rpm……安裝步驟省略……已安裝:mysql80-community-release.noarch0:el7-4完畢!當(dāng)官方源配置完成,服務(wù)器就可以使用Yum進(jìn)行安裝并使用該軟件。2.下載并安裝MySQL(1)選擇需要的版本。查看Yum倉庫中提供的MySQL版本。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL從查詢結(jié)果可以看到默認(rèn)開啟的是目前最新的MySQL8.0版本。MySQL8.0版本雖然是最新的,但是并不穩(wěn)定。市場中現(xiàn)在使用的是較穩(wěn)定的5.7版本,這里借助Yum管理工具包關(guān)閉MySQL8.0版本,開啟5.7版本進(jìn)行實(shí)驗(yàn)。2.下載并安裝MySQL(1)選擇需要的版本。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL下載Yum管理工具包。[root@qfedu~]#yum-yinstallyum-utils使用yum-config-manager命令關(guān)閉MySQL8.0版本,并開啟MySQL5.7版本。[root@qfedu~]#yum-config-manager--disablemysql80-community[root@qfedu~]#yum-config-manager--enablemysql57-community設(shè)置完成后再次確認(rèn)目前倉庫中提供的MySQL版本。[root@qfedu~]#yumrepolistenabled|grepmysqlmysql-connectors-community/x86_64MySQLConnectorsCommunity221mysql-tools-community/x86_64MySQLToolsCommunity135mysql57-community/x86_64MySQL5.7CommunityServer544從查詢結(jié)果可以看到版本無誤,可以進(jìn)行下一步的安裝。2.下載并安裝MySQL(2)安裝MySQL。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL使用Yum命令下載并安裝MySQL。[root@qfedu~]#yum-yinstallmysql-community-server當(dāng)看到如下提示時說明安裝完成。已安裝:mysql-community-libs.x86_640:5.7.36-1.el7mysql-community-libs-compat.x86_640:5.7.36-1.el7mysql-community-server.x86_640:5.7.36-1.el7作為依賴被安裝:mysql-community-client.x86_640:5.7.36-1.el7mysql-community-common.x86_640:5.7.36-1.el7mysql-community-libs.x86_640:5.7.36-1.el7net-tools.x86_640:2.0-0.25.20131004git.el7完畢!3.初始化MySQL3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL安裝完成后,啟動MySQL服務(wù)并設(shè)置開機(jī)自啟[root@qfedu~]#systemctlstartmysqld[root@qfedu~]#systemctlenablemysqld設(shè)置完成后,可以輸入systemctlstatusmysqld查看當(dāng)前MySQL的運(yùn)行狀態(tài),也可以通過查看相關(guān)文件是否存在,MySQL是否已經(jīng)工作在正確的端口來驗(yàn)證服務(wù)已成功啟動(MySQL的默認(rèn)工作端口是3306)。這里用第二種辦法來查看[root@qfedu~]#ls/var/lib/mysqlaria_log.00000001ca.pemib_logfile0mysql.sockpublic_key.pemaria_log_controlclient-cert.pemib_logfile1mysql.sock.lock server-cert.pemfclient-key.pemibtmp1performance_schema server-key.pemca-key.pemibdata1mysqlprivate_key.pem[root@qfedu~]#netstat-anpt|grepmysqltcp600:::3306:::*LISTEN73973/mysqld從上面的查詢結(jié)果可以看出MySQL配置文件正常,且該項(xiàng)服務(wù)已工作在正確的端口。3.初始化MySQL3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQLMySQL5.7成功安裝后,系統(tǒng)會隨機(jī)為root用戶生成一個初始密碼(也可以稱為臨時密碼),保存在/var/log/mysqld.log中。隨機(jī)生成的密碼一般包含英文、數(shù)字及符號,較為復(fù)雜。該臨時密碼只能用來登陸數(shù)據(jù)庫,如果要在數(shù)據(jù)庫中進(jìn)行更多操作,必須更改數(shù)據(jù)庫密碼。為了便于后續(xù)使用,這里先利用MySQL的臨時密碼進(jìn)入數(shù)據(jù)庫,再更改數(shù)據(jù)庫密碼。本書暫時將root用戶的密碼更改為“QianFeng@123”,讀者也可以自定義用戶名及密碼。(1)查看系統(tǒng)為root用戶隨機(jī)生成的臨時密碼。[root@qfedu~]#cat/var/log/mysqld.log|grep"temporarypassword"2020-01-03T07:22:33.997442Z1[Note]Atemporarypasswordisgeneratedforroot@localhost:g8R4#F*4l,WX系統(tǒng)為root用戶隨機(jī)生成的臨時密碼為“g8R4#F*4l,WX”。3.初始化MySQL3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL(2)使用root用戶及臨時密碼,進(jìn)入數(shù)據(jù)庫。[root@qfedu~]#mysql-uroot-p'g8R4#F*4l,WX'mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis4Serverversion:5.7.36Copyright(c)2000,2021,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>看見mysql>提示符,說明數(shù)據(jù)庫登錄成功。3.初始化MySQL3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL(3)更改數(shù)據(jù)庫的密碼為“QianFeng@123”。mysql>ALTERUSER'root'@'localhost'IDENTIFIEDBY'qianfeng@123';ERROR1819(HY000):Yourpassworddoesnotsatisfythecurrentpolicyrequirements(4)針對以上問題,需要在配置文件中設(shè)置密碼強(qiáng)度。[root@qfedu~]#vim/etc/f#在[mysqld]下添加如下內(nèi)容[mysqld]validate_password=off返回了一個錯誤提示,設(shè)置的密碼不符合密碼安全策略。然后重啟數(shù)據(jù)庫,重新登錄數(shù)據(jù)庫,修改密碼[root@qfedu~]#systemctlrestartmysqld[root@qfedu~]#mysql-uroot-p'g8R4#F*4l,WX'······此處省略部分代碼······mysql>alteruser'root'@'localhost'identifiedby'qianfeng@123';QueryOK,0rowsaffected(0.11sec)3.初始化MySQL3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL(5)使用root用戶及設(shè)定的新密碼登陸數(shù)據(jù)庫,驗(yàn)證密碼是否更改成功。[root@qfedu~]#mysql-uroot-p'QianFeng@123'mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.WelcometotheMySQLmonitor.Commandsendwith;or\g.······此處省略部分代碼······Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>密碼更改成功,數(shù)據(jù)庫初始化完成。1.配置主服務(wù)器3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(1)在配置主從復(fù)制集群時,需要在主服務(wù)器上開啟二進(jìn)制日志并配置唯一的服務(wù)器ID,配置完成后需要重新啟動mysqld服務(wù)。編輯主服務(wù)器的配置文件f[root@master1~]#vi/etc/f[mysqld]#添加如下代碼log-bin=/var/log/mysql/mysql-binserver-id=144(2)創(chuàng)建相關(guān)的日志目錄并賦予權(quán)限。[root@master1~]#mkdir/var/log/mysql[root@master1~]#chownmysql.mysql/var/log/mysql(3)目錄創(chuàng)建完成后,重新啟動mysqld服務(wù)。[root@master1~]#systemctlrestartmysqld需要注意,在配置文件中如果省略Server-ID(或者將其設(shè)置為默認(rèn)值0),則主服務(wù)器將拒絕來自從服務(wù)器的任何連接。1.配置主服務(wù)器3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(4)為了保證在使用帶事務(wù)的InnoDB進(jìn)行復(fù)制設(shè)置時盡可能提高持久性和一致性,也需要在主服務(wù)器(master1)的f配置文件中加入以下配置項(xiàng)。innodb_flush_log_at_trx_commit=1sync_binlog=1“innodb_flush_log_at_trx_commit=1”表示當(dāng)事務(wù)提交時,系統(tǒng)會將日志緩沖寫入磁盤,并且立即刷新。參數(shù)“sync_binlog=1”表示當(dāng)事務(wù)提交時,將二進(jìn)制文件寫入磁盤并立即執(zhí)行刷新操作。另外為了從服務(wù)器可以連接主服務(wù)器,還需要將skip_networking選項(xiàng)設(shè)置為OFF狀態(tài)(默認(rèn)為OFF狀態(tài)),如果該選項(xiàng)為啟用狀態(tài),則從站無法與主站通訊,并且會造成復(fù)制失敗。1.配置主服務(wù)器3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(5)在MySQL中查看skip_networking選項(xiàng)狀態(tài)。mysql>showvariableslike'%skip_networking%';+-----------------+-------+|Variable_name|Value|+-----------------+-------+|skip_networking|OFF|+-----------------+-------+1rowinset(0.00sec)skip_networking選項(xiàng)為關(guān)閉狀態(tài)。2.創(chuàng)建指定用戶3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(1)在進(jìn)行主從復(fù)制時,為了提高數(shù)據(jù)庫集群的安全性,建議創(chuàng)建一個專門用于復(fù)制數(shù)據(jù)的用戶,每個從服務(wù)器需要使用MySQL主服務(wù)器上的用戶名和密碼連接到主服務(wù)器上。例如,在主服務(wù)上創(chuàng)建用戶repl,并允許該用戶可以從任何主機(jī)上連接到Master上進(jìn)行復(fù)制操作。mysql>createuser'repl'@'%';QueryOK,0rowsaffected(0.02sec)mysql>grantreplicationslaveon*.*to'repl'@'%'identifiedby'qianfeng@123';QueryOK,0rowsaffected(0.02sec)2.創(chuàng)建指定用戶3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(2)用戶和權(quán)限設(shè)置完成后,可以嘗試在從服務(wù)器上使用剛才創(chuàng)建的用戶進(jìn)行測試連接。[root@slave1~]#mysql-urepl-p'qianfeng@123'-hmaster1mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis3Serverversion:5.7.36-logMySQLCommunityServer(GPL)Copyright(c)2000,2021,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>用戶repl可以通過從服務(wù)器登陸主服務(wù)器。3.拷貝數(shù)據(jù)3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(1)在搭建主從復(fù)制集群時,主服務(wù)上可能會已經(jīng)存在數(shù)據(jù),為了模擬真實(shí)的生產(chǎn)環(huán)境,在主服務(wù)器上插入測試數(shù)據(jù)。mysql>createdatabasetest;QueryOK,1rowaffected(0.01sec)mysql>createtabletest.t1(idint,namevarchar(50));QueryOK,0rowsaffected(0.02sec)mysql>insertintotest.t1values(1,"lucky"),(2,"Cookie"),(3,"Belle");QueryOK,3rowsaffected(0.01sec)Records:3Duplicates:0Warnings:0mysql>select*fromtest.t1;+------+--------+|id|name|+------+--------+|1|lucky||2|Cookie||3|Belle|+------+--------+3rowsinset(0.00sec)在Master服務(wù)器中插入數(shù)據(jù)成功。3.拷貝數(shù)據(jù)3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(2)在啟動復(fù)制之前,需要將主服務(wù)器中現(xiàn)有的數(shù)據(jù)與從服務(wù)器保持同步,在進(jìn)行相關(guān)操作時需要保持客戶端的正常運(yùn)行,以便鎖定保持不變。將主服務(wù)器中現(xiàn)有的數(shù)據(jù)導(dǎo)出,并將導(dǎo)出的數(shù)據(jù)復(fù)制到每個從服務(wù)器上。本次實(shí)例將使用mysqldump工具創(chuàng)建要復(fù)制的所有數(shù)據(jù)庫轉(zhuǎn)儲。[root@master1~]#mysqldump-uroot-p'qianfeng@123'--all-databases--master-data=1>dbdump.dbmysqldump:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.master-data參數(shù)表示自動鎖定表;如果不使用master-data參數(shù),則需要手動鎖定單獨(dú)會話中的所有表。3.拷貝數(shù)據(jù)3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(3)查看備份中數(shù)據(jù)記錄的二進(jìn)制日志的位置,以便在從服務(wù)器配置中使用。[root@master1~]#vimdbdump.db1--MySQLdump10.13Distrib5.7.36,forLinux(x86_64)2--3--Host:localhostDatabase:4--------------------------------------------------------5--Serverversion5.7.36-log67/*!40101SET@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT*/;8/*!40101SET@OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS*/;9/*!40101SET@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION*/;10/*!40101SETNAMESutf8*/;11/*!40103SET@OLD_TIME_ZONE=@@TIME_ZONE*/;12/*!40103SETTIME_ZONE='+00:00'*/;13/*!40014SET@OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS,UNIQUE_CHECKS=0*/;14/*!40014SET@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=0*/;15/*!40101SET@OLD_SQL_MODE=@@SQL_MODE,SQL_MODE='NO_AUTO_VALUE_ON_ZERO'*/;16/*!40111SET@OLD_SQL_NOTES=@@SQL_NOTES,SQL_NOTES=0*/;1718--19--Positiontostartreplicationorpoint-in-timerecoveryfrom20--2122CHANGEMASTERTOMASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1255;//省略部分內(nèi)容//在配置文件的第22行中可以看出日志文件的分割點(diǎn)為mysql-bin.000001文件中的1255位置。3.拷貝數(shù)據(jù)3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(4)使用scp或者rsync工具將備份出來的數(shù)據(jù)傳輸?shù)綇姆?wù)器上。[root@master1~]#scpdbdump.dbroot@slave1:/root/Theauthenticityofhost'slave1(45)'can'tbeestablished.ECDSAkeyfingerprintisSHA256:rGvvMJlt6bXovaZhGWpUM7L1eqGYz3e4RVPD4yHSGVc.ECDSAkeyfingerprintisMD5:9e:40:59:3b:b1:71:51:55:6c:6a:9c:37:80:1a:1d:2e.Areyousureyouwanttocontinueconnecting(yes/no)?yesWarning:Permanentlyadded'slave1,45'(ECDSA)tothelistofknownhosts.root@slave1'spassword:#slave1服務(wù)器的登錄密碼dbdump.db100%856KB6.5MB/s00:00slave1可以被主服務(wù)器解析出IP地址4.配置從服務(wù)器3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.3
部署MySQL(1)數(shù)據(jù)拷貝完成后,接下來需要在從服務(wù)器的f配置文件中添加ServerID。[root@slave1~]#vi/etc/f[mysqld]server-id=145(2)配置修改完成后需要重新啟動mysqld的服務(wù)。[root@slave1~]#systemctlrestartmysqld(3)在從服務(wù)器的數(shù)據(jù)庫中導(dǎo)入備份數(shù)據(jù)。mysql>source/root/dbdump.db(4)從服務(wù)器上連接主服務(wù)器,注意相關(guān)信息的準(zhǔn)確性。mysql>CHANGEMASTERTO->master_host='master1',->master_user='repl',->master_password='qianfeng@123',->master_log_file='mysql-bin.000001',->master_log_pos=1255;QueryOK,0rowsaffected,2warnings(0.01sec)master_host表示需要連接的主服務(wù)器名稱,master_user表示連接到主服務(wù)器的用戶,master_password表示連接用戶的密碼。4.配置從服務(wù)器3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(5)配置完成后,在從服務(wù)器開始復(fù)制線程。mysql>startslave;QueryOK,0rowsaffected(0.09sec)(6)在從服務(wù)器執(zhí)行如下操作可以驗(yàn)證線程是否工作正常。mysql>showslavestatus\G***************************1.row***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:master1Master_User:replMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-bin.000001Read_Master_Log_Pos:1255Relay_Log_File:slave1-relay-bin.000003Relay_Log_Pos:320Relay_Master_Log_File:mysql-bin.000001
Slave_IO_Running:YesSlave_SQL_Running:YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Last_Errno:0Last_Error:Skip_Counter:0Exec_Master_Log_Pos:1255Relay_Log_Space:528Until_Condition:NoneUntil_Log_File:Until_Log_Pos:0Master_SSL_Allowed:NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master:0Master_SSL_Verify_Server_Cert:NoLast_IO_Errno:0Last_IO_Error:Last_SQL_Errno:0Last_SQL_Error:4.配置從服務(wù)器3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.4
部署主從復(fù)制集群(6)在從服務(wù)器執(zhí)行如下操作可以驗(yàn)證線程是否工作正常。Replicate_Ignore_Server_Ids:Master_Server_Id:144Master_UUID:dfdb039c-738c-11ec-82c0-000c29dcf9caMaster_Info_File:/var/lib/mysql/SQL_Delay:0SQL_Remaining_Delay:NULLSlave_SQL_Running_State:Slavehasreadallrelaylog;waitingformoreupdatesMaster_Retry_Count:86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position:0Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:1rowinset(0.00sec)I/O線程和SQL線程的狀態(tài)都為YES,證明主從復(fù)制線程啟動成功。1.復(fù)制狀態(tài)驗(yàn)證3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.5
測試數(shù)據(jù)同步主從復(fù)制線程啟動后,主服務(wù)上關(guān)于修改數(shù)據(jù)的操作都會在從服務(wù)器中回演,這樣就保證了主從服務(wù)器數(shù)據(jù)的一致性,下面將進(jìn)行相應(yīng)的驗(yàn)證。(1)嘗試在主服務(wù)器中插入一些數(shù)據(jù),并在從服務(wù)器上查看插入的數(shù)據(jù)是否存在。[root@master1~]#mysql-uroot-p'qianfeng@123'-e"insertintotest.t1values(4,'coco');"mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.[root@master1~]#mysql-uroot-p'qianfeng@123'-e"select*fromtest.t1;"mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.+------+--------+|id|name|+------+--------+|1|lucky||2|Cookie||3|Belle||4|coco|+------+--------+在主服務(wù)器上成功地插入了一條數(shù)據(jù)1.復(fù)制狀態(tài)驗(yàn)證3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.5
測試數(shù)據(jù)同步(2)在從服務(wù)器上查看該數(shù)據(jù)是否存在。[root@slave1~]#mysql-uroot-p'qianfeng@123'-e"select*fromtest.t1;"mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.+------+--------+|id|name|+------+--------+|1|lucky||2|Cookie||3|Belle||4|coco|+------+--------+從服務(wù)器的tt表中也存在id為4的數(shù)據(jù),這說明從服務(wù)器與主服務(wù)器中的數(shù)據(jù)同步成功。3.4
數(shù)據(jù)庫主從復(fù)制實(shí)戰(zhàn)3.4.5
測試數(shù)據(jù)同步2.故障排除當(dāng)SQL線程或者I/O線程啟動異常時,讀者可以先使用“showmasterstatus\G”命令檢查當(dāng)前二進(jìn)制日志的位置與配置slave時設(shè)置的二進(jìn)制日志位置是否相同。另外,讀者也可以通過f配置中指定的錯誤日志查看錯誤信息。[root@slave1~]#tail-10/var/log/mysqld.log3.加入新的從服務(wù)器當(dāng)數(shù)據(jù)量不斷增加時,如果需要在集群中加入其他的從服務(wù)器,則配置流程與從服務(wù)器的配置一樣,唯一不同的是需要修改新加入從服務(wù)器的Server-ID編號。另外,需要注意,假如在新加入從服務(wù)器之前,主服務(wù)器執(zhí)行了刪除庫的操作。并且,刪除的庫剛好是在第一次mysqldump備份時的數(shù)據(jù)。那么,在從服務(wù)器上將會顯示“沒有這個數(shù)據(jù)庫”的錯誤信息,因此,建議使用最新的備份數(shù)據(jù)。3.5數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)數(shù)據(jù)庫代理Mycat讀寫分離原理實(shí)驗(yàn)環(huán)境部署流程3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.1
數(shù)據(jù)庫代理在單一的主從數(shù)據(jù)庫架構(gòu)中,前端應(yīng)用通過數(shù)據(jù)庫的IP地址或者指定端口向后端請求相應(yīng)的數(shù)據(jù)。當(dāng)面對較多的數(shù)據(jù)庫服務(wù)器時,Web請求需要在這些服務(wù)器之間進(jìn)行判斷,以便找到哪一臺服務(wù)上保存著自己想要的數(shù)據(jù)。面對數(shù)據(jù)請求高峰時,這種判斷不僅會帶來大量的請求等待,而且還有可能會造成整個系統(tǒng)的癱瘓。本章將通過具體的案例來講解數(shù)據(jù)庫集群中如何實(shí)現(xiàn)高可用以及數(shù)據(jù)的讀寫分離策略。實(shí)際上,許多企業(yè)會通過在不同的地域招募代理商來加快品牌的宣傳速度和市場占有率,隨著互聯(lián)網(wǎng)的不斷發(fā)展,人們也會通過淘寶、京東這種“代理”平臺來滿足自己的消費(fèi)需求。在互聯(lián)網(wǎng)領(lǐng)域,系統(tǒng)管理員在面對數(shù)據(jù)庫的多主集群時,也會使用代理服務(wù)器來實(shí)現(xiàn)數(shù)據(jù)的分發(fā)和資源的合理應(yīng)用。3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.1
數(shù)據(jù)庫代理代理服務(wù)器是網(wǎng)絡(luò)信息的中轉(zhuǎn)站,是信息“交流”的使者,常見的數(shù)據(jù)庫代理架構(gòu)如圖。代理服務(wù)器提供統(tǒng)一的入口供用戶訪問,當(dāng)用戶訪問代理服務(wù)器時,代理服務(wù)器會將用戶請求平均的分發(fā)到后端的服務(wù)器集群,并且其本身并不會做任何的數(shù)據(jù)處理。這樣一來,代理服務(wù)器不僅起到負(fù)載均衡的作用,而且同時還提供了獨(dú)立的端口和IP。3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.1
數(shù)據(jù)庫代理當(dāng)后端的服務(wù)器處理完請求后也會通過代理服務(wù)器返回給用戶,基本的網(wǎng)絡(luò)拓?fù)淙鐖D。前端應(yīng)用請求只需指定代理服務(wù)器的IP地址和端口即可訪問后端數(shù)據(jù)文件,這種形式不僅提高了系統(tǒng)的數(shù)據(jù)處理能力,而且還保證了后端數(shù)據(jù)庫的安全性,使系統(tǒng)更加的健壯。數(shù)據(jù)庫代理(DBProxy)又被稱為數(shù)據(jù)庫中間件,當(dāng)面對大量的應(yīng)用請求時,代理可以通過對數(shù)據(jù)進(jìn)行分片以及自身的自動路由與聚合機(jī)制實(shí)現(xiàn)對不同請求的分發(fā),以此來達(dá)到數(shù)據(jù)庫的讀寫分離功能。3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.1
數(shù)據(jù)庫代理隨著市場的發(fā)展和技術(shù)的更新,產(chǎn)生了許多不同的數(shù)據(jù)庫代理服務(wù)器,國內(nèi)企業(yè)中目前使用較多的數(shù)據(jù)庫代理服務(wù)器有以下幾種。MySQLProxy:MySQL官方提供數(shù)據(jù)庫中間件。Atlas:奇虎360團(tuán)隊(duì)在MySQLProxy的基礎(chǔ)上進(jìn)行的二次開發(fā)。DBProxy:美團(tuán)點(diǎn)評在Atlas的基礎(chǔ)上進(jìn)行的二次開發(fā)。Amoeba:早期阿里巴巴使用的數(shù)據(jù)庫中間件。Cober:由阿里巴巴團(tuán)隊(duì)進(jìn)行維護(hù)和開發(fā)。MyCat:由阿里巴巴團(tuán)隊(duì)進(jìn)行維護(hù)和開發(fā)。由于各個中間件的應(yīng)用場景和使用方式不同,本書將對實(shí)際應(yīng)用常見中涉及較多的Mycat數(shù)據(jù)庫中間件進(jìn)行介紹和說明。關(guān)于其他的數(shù)據(jù)庫中間件的使用方式,讀者可以自行查閱。3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.2
Mycat讀寫分離原理本次實(shí)例中將通過搭建Mycat代理,實(shí)現(xiàn)MySQL雙主雙從集群的讀寫分離。讀寫分離集群架構(gòu)如圖。Mycat是一款開源的數(shù)據(jù)庫代理軟件,由阿里巴巴在Cobar的基礎(chǔ)上進(jìn)行改良,不僅支持市場上主流的數(shù)據(jù)庫(MySQL、Oracle、MongoDB等),而且還支持?jǐn)?shù)據(jù)庫中的事務(wù)操作。本節(jié)將通過具體的案例演示Mycat中間件的配置流程和使用方法。讀寫分離集群中,各服務(wù)器的詳細(xì)參數(shù)如表。3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.3
實(shí)驗(yàn)環(huán)境為了避免實(shí)驗(yàn)過程中產(chǎn)生不必要的錯誤,建議關(guān)閉防火墻和SELinux。在進(jìn)行相關(guān)操作前各服務(wù)器之間需要進(jìn)行相應(yīng)的域名解析。主機(jī)名稱主機(jī)IP系統(tǒng)Mycat40Centos7Master144Centos7Slave145Centos7Master241Centos7Slave242Centos740 mycat44 master1 45 slave1 41 master242 slave2 [root@qfedu~]#ntpdate-u1為了保證各服務(wù)器的時間一致,對主從數(shù)據(jù)庫服務(wù)器進(jìn)行時間校對。(2)在Mycat主機(jī)上安裝Java環(huán)境,通過瀏覽器訪問Java網(wǎng)站并下載相應(yīng)的JDK,具體的頁面如圖。(1)由于Mycat是基于Java語言編寫,所以在部署Mycat之前需要搭建Java環(huán)境。Mycat的各版本與JDK版本對應(yīng)關(guān)系如表。3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.4
部署流程MycatJDK1.3~1.51.71.61.81.71.72.01.81.配置Java環(huán)境3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.4
部署流程1.配置Java環(huán)境(3)在Mycat服務(wù)器中使用Wget工具下載相應(yīng)的JDK壓縮包并解壓。[root@mycat~]#lsjdk-8u311-linux-x64.tar.gz[root@mycat~]#tarxfjdk-8u311-linux-x64.tar.gz-C/usr/local/[root@mycat~]#ln-s/usr/localk1.8.0_311//usr/local/java(4)解壓完成后需要在全局配置文件內(nèi)追加設(shè)置Java環(huán)境變量。[root@mycat~]#vim/etc/profileJAVA_HOME=/usr/local/javaPATH=$JAVA_HOME/bin:$PATHexportJAVA_HOMEPATH3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.4
部署流程1.配置Java環(huán)境(5)刷新全局變量,使環(huán)境變量生效。[root@mycat~]#source/etc/profile(6)使用相關(guān)命令驗(yàn)證Java環(huán)境是否安裝成功。[root@mycat~]#env|grepJAVAJAVA_HOME=/usr/local/java[root@mycat~]#java-versionjavaversion"1.8.0_311"Java(TM)SERuntimeEnvironment(build1.8.0_311-b11)JavaHotSpot(TM)64-BitServerVM(build25.311-b11,mixedmode)使用java-version命令可以查詢到Java的版本信息即證明Java環(huán)境安裝成功。3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.4
部署流程2.配置Mycat(1)Java環(huán)境搭建完成后,即可部署Mycat服務(wù)。首先,為了讓應(yīng)用之間互不影響,可以為Mycat創(chuàng)建一個專屬的用戶。#查看是否已經(jīng)存在Mycat用戶[root@mycat~]#cat/etc/group|grepmycat[root@mycat~]#cat/etc/passwd|grepmycat#創(chuàng)建Mycat用戶[root@mycat~]#groupaddmycat[root@mycat~]#useradd-gmycatmycat(2)Mycat創(chuàng)建完成后,可使用passwdmycat命令修改用戶密碼。Mycat官網(wǎng)下載Mycat壓縮包,具體如圖。(3)進(jìn)入下載頁面,復(fù)制合適版本的下載鏈接。3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.4
部署流程2.配置Mycat[root@mycat~]#wget//20190828135747/Mycat-server--release-20190828135747-linux.tar.gz[root@mycat~]#lsjdk-8u311-linux-x64.tar.gzMycat-server--release-20190828135747-linux.tar.gz[root@mycat~]#tarxfMycat-server--release-20190828135747-linux.tar.gz-C/usr/local/[root@mycat~]#ls/usr/local/mycat/bincatletconfliblogsversion.txt(4)在Mycat服務(wù)器中使用wget工具進(jìn)行下載,下載完成后將壓縮包解壓至指定路徑即可。3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.4
部署流程2.配置Mycat(5)解壓在/usr/local/目錄下有一個mycat文件夾,將該文件夾的所有者設(shè)置為mycat用戶。[root@mycat~]#chown-Rmycat:mycat/usr/local/mycat(6)etc文件下的profile文件是設(shè)置系統(tǒng)級別的環(huán)境變量和啟動程序的,其中的配置會對所有用戶生效。此時只需修改單個用戶的環(huán)境變量,編輯~/.bashrc文件。[root@mycat~]#vim~/.bashrc#添加如下代碼exportMYCAT_HOME=/usr/local/mycatexportPATH=$PATH:$MYCAT_HOME/bin(7)刷新全局變量,使環(huán)境變量生效。[root@mycat~]#source/etc/profile3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.4
部署流程2.配置Mycat(8)Mycat作為代理服務(wù)器,上端的用戶請求通過server.xml配置文件中設(shè)定的參數(shù)訪問Mycat代理。由于Mycat本身并不具有存儲引擎,所以還需要schema.xml文件中的參數(shù)連接下端的數(shù)據(jù)庫服務(wù)器以此來保存相關(guān)數(shù)據(jù)。(9)在server.xml配置文件中可以看到上端用戶訪問Mycat所需要的賬戶和密碼,原始配置文件如下所示。2.配置Mycat3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.4
部署流程[root@mycat~]#vim/usr/local/mycat/conf/server.xml<!--ROOT用戶密碼設(shè)置項(xiàng)--><username="root"defaultAccount="true"><propertyname="password">123456</property><propertyname="schemas">TESTDB</property><!--表級DML權(quán)限設(shè)置--><!--<privilegescheck="false"><schemaname="TESTDB"dml="0110"><tablename="tb01"dml="0000"></table><tablename="tb02"dml="1111"></table></schema></privileges>--></user><!--其他用戶密碼設(shè)置項(xiàng)--><username="user"><propertyname="password">user</property><propertyname="schemas">TESTDB</property><propertyname="readOnly">true</property><propertyname="defaultSchema">TESTDB</property></user></mycat:server>username="root"項(xiàng)表示上端連接Mycat數(shù)據(jù)庫的賬戶;propertyname="password"項(xiàng)表示連接Mycat的密碼;propertyname="schemas"項(xiàng)表示后方數(shù)據(jù)庫的統(tǒng)稱2.配置Mycat3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.4
部署流程(10)在默認(rèn)情況下,上端通過Root用戶連接Mycat,因此可以將配置文件中的“其他用戶的配置項(xiàng)”使用“<!---->”注釋掉,修改完成后,如圖。(11)另外,也可以在“ROOT用戶密碼設(shè)置項(xiàng)”中修改使用Root用戶訪問Mycat代理的密碼和下端數(shù)據(jù)庫群的統(tǒng)稱。例如將密碼設(shè)置為“qianfeng@123”,修改后的代碼如圖。3.5
數(shù)據(jù)庫讀寫分離實(shí)戰(zhàn)3.5.4
部署流程2.配置Mycat(12)server.xml文件修改完成后,保存退出即可。接下來,還需要設(shè)置Mycat下端連接MySQL的配置,即修改schema.xml文件。[root@mycat~]#vim/usr/local/mycat/conf/schema.xml(13)原始配置文件刪除注釋后主要分為以
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度股權(quán)質(zhì)押資產(chǎn)重組合同示范文本3篇
- 二零二五年度鋼材倉儲物流服務(wù)合同9篇
- 二零二五年度路燈照明設(shè)施安全檢測合同樣本2篇
- 二零二五年度:勞動合同法實(shí)務(wù)操作與案例分析合同3篇
- 二零二五年度船舶建造與設(shè)備安裝合同2篇
- 二零二五年度農(nóng)產(chǎn)品質(zhì)量檢測合同范本3篇
- 二零二五年度安置房買賣合同電子支付與結(jié)算規(guī)范3篇
- 3、2025年度綠色出行接送機(jī)服務(wù)合同范本2篇
- 二零二五年度文化創(chuàng)意產(chǎn)業(yè)合作開發(fā)合同范本3篇
- 家里陪護(hù)合同(2篇)
- 手術(shù)室護(hù)理實(shí)踐指南2023年
- 電力安全工作規(guī)程(變電部分)課件
- 新人教版六年級下冊數(shù)學(xué)全冊課件
- 環(huán)保設(shè)施安全風(fēng)險告知卡
- 卵石地層樁基旋挖鉆施工方案
- 江蘇對口單招英語考綱詞匯總結(jié)
- (完整word版)手卡模板
- GB/T 4091-2001常規(guī)控制圖
- GB/T 13912-2020金屬覆蓋層鋼鐵制件熱浸鍍鋅層技術(shù)要求及試驗(yàn)方法
- GB 18399-2001棉花加工機(jī)械安全要求
- 陜西省延安市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)
評論
0/150
提交評論