日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库集群 MySQL主从复制

發(fā)布時(shí)間:2025/3/8 数据库 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库集群 MySQL主从复制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

MySQL主從復(fù)制

本節(jié)內(nèi)容我們聯(lián)系使用MySQL的主從復(fù)制功能配置Master和Slave節(jié)點(diǎn),驗(yàn)證數(shù)據(jù)MySQL的數(shù)據(jù)同步功能。

因?yàn)橐褂枚鄠€(gè)MySQL數(shù)據(jù)庫,所以不建議在電腦上安裝多個(gè)MySQL數(shù)據(jù)庫,最好的辦法是使用多個(gè)綠色版的MySQL數(shù)據(jù)庫。

MariaDB數(shù)據(jù)庫是MySQL創(chuàng)始人Michael創(chuàng)建的MySQL重要分支。由于Oracle持有了MySQL的版權(quán),MySQL存在閉源的隱患,加之Oracle對(duì)MySQL的更新不太重視,所以業(yè)界許多公司紛紛采用了完全開源的MariaDB數(shù)據(jù)庫。MariaDB建立在MySQL5.5版本上,所以MariaDB與MySQL的兼容性非常好,并且性能上也做出了很大的優(yōu)化,社區(qū)活躍,軟件版本更新迅速,包括谷歌、Facebook等企業(yè)紛紛改用MariaDB數(shù)據(jù)庫。

Master數(shù)據(jù)庫

首先把安裝到C:\Program Files里面的MariaDB目錄復(fù)制一份,放置的路徑?jīng)]有要求,但是盡量把數(shù)據(jù)庫放在C盤或者D盤上面,改名DB1。因?yàn)檫@兩個(gè)盤符的空間處在硬盤磁碟的外圈,所以線速度很快,數(shù)據(jù)讀寫速度也很理想。

?

?

DB1將要當(dāng)做主庫使用,創(chuàng)建my.ini文件,然后編輯文件內(nèi)容。

?

?

[mysqld]

#數(shù)據(jù)庫字符集

character_set_server = utf8

#MySQL主機(jī)名(只可以是數(shù)字)

server_id = 10

#端口號(hào)

port = 7001

#開啟二進(jìn)制操作日志(日志內(nèi)容會(huì)發(fā)送給Slave數(shù)據(jù)庫執(zhí)行)

log_bin = mysql_bin

sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

?

?

創(chuàng)建start.bat文件,編寫啟動(dòng)命令。

?

?

cd bin

mysqld --defaults-file=../my.ini --user=root

@pause

?

?

執(zhí)行start.bat命令啟動(dòng)DB1數(shù)據(jù)庫,命令行窗口關(guān)閉后也不影響MariaDB的運(yùn)行。

?

?

啟動(dòng)MariaDB客戶端,用戶名為root,密碼是安裝MariaDB時(shí)候設(shè)置的,因此輸入正確密碼登錄即可。

?

?

DB1中創(chuàng)建新的用戶給Slave主機(jī)同步數(shù)據(jù)使用,由于root用戶權(quán)限太大而且無法遠(yuǎn)程訪問,所以必須創(chuàng)建一個(gè)新的用戶才行。

?

?

  • 用戶名為backup
  • Slave主機(jī)的IP是127.0.0.1
  • 密碼設(shè)置為abc123456
  • backup用戶設(shè)置服務(wù)權(quán)限(勾選3個(gè)權(quán)限)然后保存,具備數(shù)據(jù)同步的權(quán)利。

    ?

    ?

    ?

    這時(shí)候需要關(guān)閉數(shù)據(jù)庫,在DB1連接上右鍵選擇“命令界面”,在命令界面中輸出shutdown;回車即可。

    ?

    ?

    ?

    ?

    關(guān)閉了DB1,在data文件夾中刪除所有以mysql_bin開頭的文件。這些文件是二進(jìn)制操作日志文件,其中包含了在Master數(shù)據(jù)庫創(chuàng)建slave賬號(hào)和權(quán)限的操作,這部分操作不應(yīng)該同步到Slave數(shù)據(jù)上面,所以我們就應(yīng)該把二進(jìn)制操作文件都刪除。

    ?

    ?

    再次啟動(dòng)DB1數(shù)據(jù)庫

    Slave服務(wù)器

    依照DB1的做法,從C盤安裝位置再復(fù)制一份MariaDB文件夾,起名為DB2。DB2當(dāng)做備份數(shù)據(jù)庫,所以我們還是要先創(chuàng)建my.ini文件。

    [mysqld]

    #數(shù)據(jù)庫字符集

    character_set_server = utf8

    #MySQL主機(jī)名(只可以是數(shù)字)

    server_id = 20

    #端口號(hào)

    port = 7002

    #開啟二進(jìn)制操作日志(日志內(nèi)容會(huì)發(fā)送給Slave數(shù)據(jù)庫執(zhí)行)

    log_bin = mysql_bin

    #SlaveMaster等到mysql_bin的日志數(shù)據(jù)后先寫到本地的relay_bin日志中然后在執(zhí)行

    relay_log = relay_bin

    #該參數(shù)規(guī)定Slave的更新操作是否要寫入log_bin

    #當(dāng)A時(shí)MasterBSlave,同時(shí)還是CMaster,這個(gè)時(shí)候就需要開啟該參數(shù)

    #本次實(shí)驗(yàn)只驗(yàn)證兩臺(tái)數(shù)據(jù)庫的MasterSlave關(guān)系,所以不用開啟

    #log-slave-updates = 1

    #該參數(shù)定義Master失聯(lián)后再次連接的間隔時(shí)間(默認(rèn)60)

    #master-connect-retry = 60

    #Slave數(shù)據(jù)庫的數(shù)據(jù)不可以更改,只能與Master同步

    read-only = 1

    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

    ?

    ?

    創(chuàng)建start.bat文件,然后啟動(dòng)數(shù)據(jù)庫

    使用客戶端連接7002端口的DB2,用戶名root,密碼是安裝密碼。

    ?

    ?

    啟動(dòng)DB2的命令界面,然后執(zhí)行如下MySQL命令。

    stop slave;

    -----------------------------------------------------------------------

    change master to master_host='127.0.0.1',master_port=7001,master_user='backup',master_password='abc123456';

    -----------------------------------------------------------------------

    start slave;

    ?

    ?

    取消命令界面的“自動(dòng)換行”然后執(zhí)行下面的語句

    show slave status;

    ?

    ?

    ?

    ?

    如果上圖兩處狀態(tài)信息都為YES,那么就代表數(shù)據(jù)庫主從同步已經(jīng)成功。

    為了驗(yàn)證主從同步已經(jīng)成功,我們?cè)?/span>Master數(shù)據(jù)庫中創(chuàng)建student表,然后隨意插入數(shù)據(jù),接著再查看Slave數(shù)據(jù)庫里面的student表和數(shù)據(jù)是否已經(jīng)同步。

    Master雙Slave

    我們已經(jīng)有了一個(gè)Master數(shù)據(jù)庫和一個(gè)Slave數(shù)據(jù)庫,但還顯得不夠。原因要從兩個(gè)方面分析。其一,Master和Slave的工作狀態(tài)由誰來管理。比如DB1宕機(jī),DB2接替工作成為新的Master,那么DB1恢復(fù)上線之后,DB1就應(yīng)該自動(dòng)變成Slave數(shù)據(jù)庫,同步數(shù)據(jù)。當(dāng)DB2宕機(jī),DB1重新成為Master,顯然我們需要一種管理DB1和DB2的軟件。其二,DB1充當(dāng)Master,所有的SQL讀寫操作全部由DB1完成,沒有讀寫分離機(jī)制,導(dǎo)致DB的負(fù)擔(dān)過重,效率低下,因此我們需要一種讀寫分離機(jī)制。

    開源的MyCat數(shù)據(jù)庫集群軟件做的不錯(cuò),非常適合管理許多MySQL數(shù)據(jù)庫集群。因?yàn)槭前⒗锇桶蛨F(tuán)隊(duì)出品,所以實(shí)際應(yīng)用起來效果很好。關(guān)于MyCat的介紹這里不過多介紹,請(qǐng)各位訪問MyCat的官網(wǎng)(http://www.mycat.org.cn/

    我們將使用MyCat管理MariaDB數(shù)據(jù)庫的集群,它將接管數(shù)據(jù)的讀寫分離和主從備份的管理工作。必須要跟大家介紹一下我這里采用的雙Master雙Slave的集群方式,因?yàn)檫@將關(guān)系到MyCat的具體配置。下面我們一起推演從Master/Slave發(fā)展到雙Master雙Slave的過程。

    之前我們擁有了DB1和DB2兩個(gè)數(shù)據(jù)庫,一個(gè)當(dāng)作Master,另一個(gè)當(dāng)作Slave。SQL讀寫操作全部放在DB1上完成,DB1的負(fù)擔(dān)很重,而且速度也很受影響。故此讓DB1變成write節(jié)點(diǎn),DB2變成read節(jié)點(diǎn),SQL語句的分發(fā)由MyCat完成。DB1寫入/更新的數(shù)據(jù)會(huì)及時(shí)備份給DB2,DB2執(zhí)行SELECT語句會(huì)查詢到這些數(shù)據(jù),這樣就實(shí)現(xiàn)了讀寫分離的功能,數(shù)據(jù)的使用速度大大提高了(不明白讀寫分離機(jī)制好處的同學(xué)可以利用百度搜索自行學(xué)習(xí))。

    讀寫分離實(shí)現(xiàn)了,可是目前還有一個(gè)棘手的問題急需解決:主從備份。因?yàn)?/span>DB2是read節(jié)點(diǎn),當(dāng)DB1宕機(jī)之后,DB2是不能轉(zhuǎn)換成write節(jié)點(diǎn)的,所以這就沒辦法保證主從備份的及時(shí)切換。于是我們又想出了一個(gè)新辦法,再創(chuàng)建一個(gè)write節(jié)點(diǎn),讓DB3接替DB1的工作,DB4充當(dāng)DB3的read節(jié)點(diǎn)。DB1和DB3都有可能宕機(jī),其中一個(gè)宕機(jī),另一個(gè)必須立即接替工作,所以DB1和DB3必須保證數(shù)據(jù)的同步: DB1和DB3互為主從備份。

    創(chuàng)建DB3數(shù)據(jù)庫,步驟與之前相同,my.ini文件如下:

    [mysqld]

    #數(shù)據(jù)庫字符集

    character_set_server = utf8

    #MySQL主機(jī)名(只可以是數(shù)字)

    server_id = 30

    #端口號(hào)

    port = 7003

    #開啟二進(jìn)制操作日志(日志內(nèi)容會(huì)發(fā)送給Slave數(shù)據(jù)庫執(zhí)行)

    log_bin = mysql_bin

    #SlaveMaster等到mysql_bin的日志數(shù)據(jù)后先寫到本地的relay_bin日志中然后在執(zhí)行

    relay_log = relay_bin

    #該參數(shù)規(guī)定Slave的更新操作是否要寫入log_bin

    log-slave-updates = 1

    #該參數(shù)定義Master失聯(lián)后再次連接的間隔時(shí)間(默認(rèn)60)

    #master-connect-retry = 60

    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

    登錄客戶端軟件,創(chuàng)建backup賬戶,勾選三個(gè)權(quán)限,這些操作與之前DB1的完全一致。

    關(guān)閉DB3數(shù)據(jù)庫,刪除data目錄中的所有mysql_bin開頭的文件,然后重新啟動(dòng)數(shù)據(jù)。

    命令界面執(zhí)行主從同步的設(shè)置命令,如下:

    stop slave;

    -----------------------------------------------------------------------

    change master to master_host='127.0.0.1',master_port=7001,master_user='backup',master_password='abc123456';

    -----------------------------------------------------------------------

    start slave;

    查看主從備份是否成功,如果成功則說明DB3是DB1的Slave數(shù)據(jù)庫。

    關(guān)閉DB1數(shù)據(jù)庫,重新改寫my.ini配置文件。

    [mysqld]

    #數(shù)據(jù)庫字符集

    character_set_server = utf8

    #MySQL主機(jī)名(只可以是數(shù)字)

    server_id = 10

    #端口號(hào)

    port = 7001

    #開啟二進(jìn)制操作日志(日志內(nèi)容會(huì)發(fā)送給Slave數(shù)據(jù)庫執(zhí)行)

    log_bin = mysql_bin

    #SlaveMaster等到mysql_bin的日志數(shù)據(jù)后先寫到本地的relay_bin日志中然后在執(zhí)行

    relay_log = relay_bin

    #該參數(shù)規(guī)定Slave的更新操作是否要寫入log_bin

    log-slave-updates = 1

    #該參數(shù)定義Master失聯(lián)后再次連接的間隔時(shí)間(默認(rèn)60)

    #master-connect-retry = 60

    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

    重新啟動(dòng)DB1,在DB1的命令界面設(shè)置主從同步,如下:

    stop slave;

    -----------------------------------------------------------------------

    change master to master_host='127.0.0.1',master_port=7003,master_user='backup',master_password='abc123456';

    -----------------------------------------------------------------------

    start slave;

    查看主從配置是否成功,如果成功則說明DB1是DB3的Slave數(shù)據(jù)庫。

    仿照DB2的步驟,創(chuàng)建DB4,my.ini中的端口號(hào)設(shè)置為7004,server_id設(shè)置為40,然后設(shè)置成DB3的Slave,至此雙Master和雙Slave配置成功。

    下載最新版本的MyCat軟件,目前最新版本是1.5,我們下載對(duì)應(yīng)的windows版MyCat。千萬要注意,MyCat壓縮文件不能解壓縮到含有中文和空格的目錄下面,例如桌面和C:\Program Files\

    ?

    ?

    因?yàn)?/span>MyCat是用Java語言開發(fā)的數(shù)據(jù)庫集群工具,因此我們必須要安裝JDK1.7以上的版本。這里省略JDK的安裝過程,需要重點(diǎn)聲明,必須要配置path變量和JAVA_HOME變量。

    ?

    ?

    ?

    修改mycat\bin\startup_nowrap.bat文件,把-Xms1G-Xmx2G修改成-Xms128M和-Xmx256M。如果不修改這兩處配置,MyCAT很有可能會(huì)因?yàn)閮?nèi)存空間不夠而無法啟動(dòng)。

    ?

    ?

    ?

    ?

    ?

    ?

    打開mycat\conf\server.xml文件,里面包含了MyCat默認(rèn)自帶的兩個(gè)賬戶(內(nèi)容可以修改),以后我們將使用user賬戶登錄MyCat。

    ?

    ?

    打開mycat\conf\schema.xml文件,設(shè)置數(shù)據(jù)庫連接。

    ?

    ?

    DB1~DB4的用戶名為root,我這里的數(shù)據(jù)庫安裝密碼為112233。<writeHost>write節(jié)點(diǎn),<readHost>是read節(jié)點(diǎn),意味著讀寫分離設(shè)置完畢。

    <dataHost>標(biāo)簽的balance=3意味著所有的讀請(qǐng)求隨機(jī)分發(fā)到<readHost>節(jié)點(diǎn)。

  • 當(dāng)<writeHost>節(jié)點(diǎn)宕機(jī),那么它對(duì)應(yīng)的<readHost>節(jié)點(diǎn)將不負(fù)責(zé)處理讀操作。
  • 當(dāng)<readHost>節(jié)點(diǎn)宕機(jī),那么讀操作將分發(fā)給其他的<readHost>節(jié)點(diǎn)。
  • <dataHost>標(biāo)簽的writeType=1意味著<writeHost>節(jié)點(diǎn)宕機(jī),MyCat會(huì)切換使用其他的<writeHost>。switchType=1代表自動(dòng)切換從主服務(wù)器。

    數(shù)據(jù)切分

    至此還沒有結(jié)束,因?yàn)?/span>DB1~DB4的雙Master雙Slave數(shù)據(jù)庫僅僅實(shí)現(xiàn)了主從備份和讀寫分離,數(shù)據(jù)切分還沒有實(shí)現(xiàn)。什么是數(shù)據(jù)切分?比如電商系統(tǒng)的交易記錄表數(shù)據(jù)量就很大,日積月累可能已經(jīng)到了幾千萬條記錄了。這時(shí)候?qū)?shù)據(jù)的CRUD操作會(huì)很慢,通常情況下MySQL單表數(shù)據(jù)超過2000萬,速度就會(huì)迅速下降。像是索引、SQL語句優(yōu)化等等的作用很不明顯,甚至索引會(huì)成為一種累贅(海量數(shù)據(jù)排序)。最根本的解決辦法就是縮小MySQL單表數(shù)據(jù)體積,控制在2000萬條以內(nèi)。超出這個(gè)范圍就實(shí)行切分?jǐn)?shù)據(jù),海量數(shù)據(jù)保存到不同的數(shù)據(jù)庫數(shù)據(jù)表中。比如雙十一當(dāng)天產(chǎn)生了5億條訂單,這些記錄被切分到50臺(tái)MySQL數(shù)據(jù)庫中,每個(gè)MySQL的訂單交易表分得1000萬條數(shù)據(jù),這樣就能保證每臺(tái)MySQL數(shù)據(jù)庫的性能。

    當(dāng)然了,隨著時(shí)間的推移,這些MySQL中的數(shù)據(jù)也會(huì)超過2000萬條,這時(shí)候應(yīng)該怎么處理?再添加50臺(tái)MySQL嗎?No,No,這時(shí)候應(yīng)該做冷熱數(shù)據(jù)處理。1年內(nèi)的訂單交易的數(shù)據(jù)最為重要,1年以上的交易數(shù)據(jù)很少被用到,那么我們編寫程序定期將過期的訂單轉(zhuǎn)移到幾個(gè)MySQL數(shù)據(jù)庫中,即便單表數(shù)據(jù)會(huì)超過2000萬,由于這些數(shù)據(jù)極少被用到,所以不用擔(dān)心速度的問題。冷熱數(shù)據(jù)處理不是我們這篇文章深入討論的內(nèi)容,我們要利用MyCat實(shí)現(xiàn)數(shù)據(jù)切分。

    DB1~DB4的讀寫性能和抗風(fēng)險(xiǎn)性都很好,掛掉某個(gè)DB節(jié)點(diǎn),其他備用的DB會(huì)接替工作。因?yàn)镈B1和DB3互為主從復(fù)制,所以我們不能拿它們做數(shù)據(jù)切分。如果我們把數(shù)據(jù)切分到DB1和DB3上,它們的備份機(jī)制會(huì)保證兩個(gè)數(shù)據(jù)庫的數(shù)據(jù)完全相同,這與數(shù)據(jù)切分的初衷相悖。所以,我們把DB1~DB4當(dāng)作一個(gè)虛擬的切分節(jié)點(diǎn),還需要再創(chuàng)建另外一個(gè)虛擬切分節(jié)點(diǎn),當(dāng)然也需要實(shí)現(xiàn)主從復(fù)制和讀寫分離,因此各位同學(xué)要?jiǎng)?chuàng)建DB5~DB8數(shù)據(jù)庫,也是采用雙Master雙Slave的形式,請(qǐng)各位自行完成,請(qǐng)注意DB1~DB4與DB5~DB8沒有主從復(fù)制關(guān)系。

    為mycat/conf/schema.xml文件再配置一個(gè)<dataHost>,name=localhost2,兩個(gè)<dataHost>節(jié)點(diǎn)用作數(shù)據(jù)切分。

    ?

    ?

    如下圖,修改<dataNode>節(jié)點(diǎn),只保留兩個(gè)<dataNode>節(jié)點(diǎn)。當(dāng)數(shù)據(jù)被切分到localhost1上會(huì)被保存到db1數(shù)據(jù)庫里面,也就是說DB1~DB4上面都會(huì)有db1這個(gè)數(shù)據(jù)庫。當(dāng)數(shù)據(jù)被切分到localhost2上會(huì)被保存到db2數(shù)據(jù)庫里面,意味著DB5~DB6都會(huì)有db2數(shù)據(jù)庫。

    ?

    ?

    修改<table>標(biāo)簽,如下圖:

    ?

    ?

    執(zhí)行mycat/bin/?startup_nowrap.bat文件,啟動(dòng)mycat服務(wù)器,啟動(dòng)成功界面如下:

    ?

    ?

    DB1上面創(chuàng)建db1數(shù)據(jù)庫,由于主從備份的緣故,DB2~DB4自動(dòng)都會(huì)創(chuàng)建db1數(shù)據(jù)庫。

    ?

    ?

    DB5上面創(chuàng)建db2數(shù)據(jù)庫,D6~DB8也會(huì)自動(dòng)創(chuàng)建db2數(shù)據(jù)庫。

    ?

    ?

    用客戶端創(chuàng)建一個(gè)MyCat連接,端口號(hào)為8066,用戶名test,密碼test

    ?

    ?

    使用MyCat連接到MyCat服務(wù)器之后,點(diǎn)擊工具欄上面的“查詢”,然后再查詢窗口中執(zhí)行SQL語句創(chuàng)建company表。因?yàn)閟chema.xml文件中<table>標(biāo)簽規(guī)定了company表是全局表,所以數(shù)據(jù)會(huì)被同樣分發(fā)到dn1和dn2兩個(gè)節(jié)點(diǎn)。

    ?

    ?

    各位同學(xué)在每個(gè)數(shù)據(jù)庫連接下面的“表”選項(xiàng)上點(diǎn)擊右鍵刷新就會(huì)發(fā)現(xiàn)DB1~DB4的db1中存在company表,DB5~DB8的db2中也存在company表。

    ?

    ?

    回到MyCAT的查詢面板,接著執(zhí)行SQL語句插入數(shù)據(jù)。

    ?

    ?

    然后觀察DB1~DB8每個(gè)company表是否都包含了插入的數(shù)據(jù)。

    ?

    ?

    ?

    我們?cè)賱?chuàng)建一個(gè)employee表,如下圖:

    ?

    ?

    根據(jù)schema.xml文件中<table>標(biāo)簽可知,employee是分片表,數(shù)據(jù)會(huì)被切分。又根據(jù)partition-hash-int.txt文件得知,sharding_id列的數(shù)據(jù)是10000,則記錄被切分到dn1節(jié)點(diǎn),DB1~DB4都會(huì)保存這條記錄,反之保存到dn2節(jié)點(diǎn)。

    執(zhí)行插入語句,查看DB1~DB4和DB5~DB8的employee表數(shù)據(jù)是否是不相同的,完成了數(shù)據(jù)切分。

    ?

    ?

    ?

    ?

    ?

    為了驗(yàn)證數(shù)據(jù)庫容災(zāi)性,我們使用shutdown命令關(guān)閉DB1,再次向company和employee插入新數(shù)據(jù),檢查是否可以執(zhí)行。然后再啟動(dòng)DB1數(shù)據(jù)庫,觀察DB1中的company和employee數(shù)據(jù)是否已經(jīng)實(shí)時(shí)與DB3同步了。這樣的話,無論DB1~DB8哪一個(gè)數(shù)據(jù)庫宕機(jī)都不會(huì)影響到數(shù)據(jù)庫集群,也不會(huì)損失任何數(shù)據(jù)。

    轉(zhuǎn)載于:https://www.cnblogs.com/liuxuanhang/p/7747359.html

    總結(jié)

    以上是生活随笔為你收集整理的数据库集群 MySQL主从复制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。