数据库集群 MySQL主从复制
MySQL主從復制
本節內容我們聯系使用MySQL的主從復制功能配置Master和Slave節點,驗證數據MySQL的數據同步功能。
因為要使用多個MySQL數據庫,所以不建議在電腦上安裝多個MySQL數據庫,最好的辦法是使用多個綠色版的MySQL數據庫。
MariaDB數據庫是MySQL創始人Michael創建的MySQL重要分支。由于Oracle持有了MySQL的版權,MySQL存在閉源的隱患,加之Oracle對MySQL的更新不太重視,所以業界許多公司紛紛采用了完全開源的MariaDB數據庫。MariaDB建立在MySQL5.5版本上,所以MariaDB與MySQL的兼容性非常好,并且性能上也做出了很大的優化,社區活躍,軟件版本更新迅速,包括谷歌、Facebook等企業紛紛改用MariaDB數據庫。
Master數據庫
首先把安裝到C:\Program Files里面的MariaDB目錄復制一份,放置的路徑沒有要求,但是盡量把數據庫放在C盤或者D盤上面,改名DB1。因為這兩個盤符的空間處在硬盤磁碟的外圈,所以線速度很快,數據讀寫速度也很理想。
?
?
DB1將要當做主庫使用,創建my.ini文件,然后編輯文件內容。
?
?
[mysqld]
#數據庫字符集
character_set_server = utf8
#MySQL主機名(只可以是數字)
server_id = 10
#端口號
port = 7001
#開啟二進制操作日志(日志內容會發送給Slave數據庫執行)
log_bin = mysql_bin
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
?
?
創建start.bat文件,編寫啟動命令。
?
?
cd bin
mysqld --defaults-file=../my.ini --user=root
@pause
?
?
執行start.bat命令啟動DB1數據庫,命令行窗口關閉后也不影響MariaDB的運行。
?
?
啟動MariaDB客戶端,用戶名為root,密碼是安裝MariaDB時候設置的,因此輸入正確密碼登錄即可。
?
?
在DB1中創建新的用戶給Slave主機同步數據使用,由于root用戶權限太大而且無法遠程訪問,所以必須創建一個新的用戶才行。
?
?
給backup用戶設置服務權限(勾選3個權限)然后保存,具備數據同步的權利。
?
?
?
這時候需要關閉數據庫,在DB1連接上右鍵選擇“命令界面”,在命令界面中輸出shutdown;回車即可。
?
?
?
?
關閉了DB1,在data文件夾中刪除所有以mysql_bin開頭的文件。這些文件是二進制操作日志文件,其中包含了在Master數據庫創建slave賬號和權限的操作,這部分操作不應該同步到Slave數據上面,所以我們就應該把二進制操作文件都刪除。
?
?
再次啟動DB1數據庫
Slave服務器
依照DB1的做法,從C盤安裝位置再復制一份MariaDB文件夾,起名為DB2。DB2當做備份數據庫,所以我們還是要先創建my.ini文件。
[mysqld]
#數據庫字符集
character_set_server = utf8
#MySQL主機名(只可以是數字)
server_id = 20
#端口號
port = 7002
#開啟二進制操作日志(日志內容會發送給Slave數據庫執行)
log_bin = mysql_bin
#Slave從Master等到mysql_bin的日志數據后先寫到本地的relay_bin日志中然后在執行
relay_log = relay_bin
#該參數規定Slave的更新操作是否要寫入log_bin
#當A時Master,B是Slave,同時還是C的Master,這個時候就需要開啟該參數
#本次實驗只驗證兩臺數據庫的Master和Slave關系,所以不用開啟
#log-slave-updates = 1
#該參數定義Master失聯后再次連接的間隔時間(默認60秒)
#master-connect-retry = 60
#Slave數據庫的數據不可以更改,只能與Master同步
read-only = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
?
?
創建start.bat文件,然后啟動數據庫
使用客戶端連接7002端口的DB2,用戶名root,密碼是安裝密碼。
?
?
啟動DB2的命令界面,然后執行如下MySQL命令。
stop slave;
-----------------------------------------------------------------------
change master to master_host='127.0.0.1',master_port=7001,master_user='backup',master_password='abc123456';
-----------------------------------------------------------------------
start slave;
?
?
取消命令界面的“自動換行”然后執行下面的語句
show slave status;
?
?
?
?
如果上圖兩處狀態信息都為YES,那么就代表數據庫主從同步已經成功。
為了驗證主從同步已經成功,我們在Master數據庫中創建student表,然后隨意插入數據,接著再查看Slave數據庫里面的student表和數據是否已經同步。
雙Master雙Slave
我們已經有了一個Master數據庫和一個Slave數據庫,但還顯得不夠。原因要從兩個方面分析。其一,Master和Slave的工作狀態由誰來管理。比如DB1宕機,DB2接替工作成為新的Master,那么DB1恢復上線之后,DB1就應該自動變成Slave數據庫,同步數據。當DB2宕機,DB1重新成為Master,顯然我們需要一種管理DB1和DB2的軟件。其二,DB1充當Master,所有的SQL讀寫操作全部由DB1完成,沒有讀寫分離機制,導致DB的負擔過重,效率低下,因此我們需要一種讀寫分離機制。
開源的MyCat數據庫集群軟件做的不錯,非常適合管理許多MySQL數據庫集群。因為是阿里巴巴團隊出品,所以實際應用起來效果很好。關于MyCat的介紹這里不過多介紹,請各位訪問MyCat的官網(http://www.mycat.org.cn/)
我們將使用MyCat管理MariaDB數據庫的集群,它將接管數據的讀寫分離和主從備份的管理工作。必須要跟大家介紹一下我這里采用的雙Master雙Slave的集群方式,因為這將關系到MyCat的具體配置。下面我們一起推演從Master/Slave發展到雙Master雙Slave的過程。
之前我們擁有了DB1和DB2兩個數據庫,一個當作Master,另一個當作Slave。SQL讀寫操作全部放在DB1上完成,DB1的負擔很重,而且速度也很受影響。故此讓DB1變成write節點,DB2變成read節點,SQL語句的分發由MyCat完成。DB1寫入/更新的數據會及時備份給DB2,DB2執行SELECT語句會查詢到這些數據,這樣就實現了讀寫分離的功能,數據的使用速度大大提高了(不明白讀寫分離機制好處的同學可以利用百度搜索自行學習)。
讀寫分離實現了,可是目前還有一個棘手的問題急需解決:主從備份。因為DB2是read節點,當DB1宕機之后,DB2是不能轉換成write節點的,所以這就沒辦法保證主從備份的及時切換。于是我們又想出了一個新辦法,再創建一個write節點,讓DB3接替DB1的工作,DB4充當DB3的read節點。DB1和DB3都有可能宕機,其中一個宕機,另一個必須立即接替工作,所以DB1和DB3必須保證數據的同步: DB1和DB3互為主從備份。
創建DB3數據庫,步驟與之前相同,my.ini文件如下:
[mysqld]
#數據庫字符集
character_set_server = utf8
#MySQL主機名(只可以是數字)
server_id = 30
#端口號
port = 7003
#開啟二進制操作日志(日志內容會發送給Slave數據庫執行)
log_bin = mysql_bin
#Slave從Master等到mysql_bin的日志數據后先寫到本地的relay_bin日志中然后在執行
relay_log = relay_bin
#該參數規定Slave的更新操作是否要寫入log_bin
log-slave-updates = 1
#該參數定義Master失聯后再次連接的間隔時間(默認60秒)
#master-connect-retry = 60
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
登錄客戶端軟件,創建backup賬戶,勾選三個權限,這些操作與之前DB1的完全一致。
關閉DB3數據庫,刪除data目錄中的所有mysql_bin開頭的文件,然后重新啟動數據。
命令界面執行主從同步的設置命令,如下:
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數據庫。
關閉DB1數據庫,重新改寫my.ini配置文件。
[mysqld]
#數據庫字符集
character_set_server = utf8
#MySQL主機名(只可以是數字)
server_id = 10
#端口號
port = 7001
#開啟二進制操作日志(日志內容會發送給Slave數據庫執行)
log_bin = mysql_bin
#Slave從Master等到mysql_bin的日志數據后先寫到本地的relay_bin日志中然后在執行
relay_log = relay_bin
#該參數規定Slave的更新操作是否要寫入log_bin
log-slave-updates = 1
#該參數定義Master失聯后再次連接的間隔時間(默認60秒)
#master-connect-retry = 60
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
重新啟動DB1,在DB1的命令界面設置主從同步,如下:
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數據庫。
仿照DB2的步驟,創建DB4,my.ini中的端口號設置為7004,server_id設置為40,然后設置成DB3的Slave,至此雙Master和雙Slave配置成功。
下載最新版本的MyCat軟件,目前最新版本是1.5,我們下載對應的windows版MyCat。千萬要注意,MyCat壓縮文件不能解壓縮到含有中文和空格的目錄下面,例如桌面和C:\Program Files\
?
?
因為MyCat是用Java語言開發的數據庫集群工具,因此我們必須要安裝JDK1.7以上的版本。這里省略JDK的安裝過程,需要重點聲明,必須要配置path變量和JAVA_HOME變量。
?
?
?
修改mycat\bin\startup_nowrap.bat文件,把-Xms1G和-Xmx2G修改成-Xms128M和-Xmx256M。如果不修改這兩處配置,MyCAT很有可能會因為內存空間不夠而無法啟動。
?
?
?
?
?
?
打開mycat\conf\server.xml文件,里面包含了MyCat默認自帶的兩個賬戶(內容可以修改),以后我們將使用user賬戶登錄MyCat。
?
?
打開mycat\conf\schema.xml文件,設置數據庫連接。
?
?
DB1~DB4的用戶名為root,我這里的數據庫安裝密碼為112233。<writeHost>是write節點,<readHost>是read節點,意味著讀寫分離設置完畢。
<dataHost>標簽的balance=3意味著所有的讀請求隨機分發到<readHost>節點。
<dataHost>標簽的writeType=1意味著<writeHost>節點宕機,MyCat會切換使用其他的<writeHost>。switchType=1代表自動切換從主服務器。
數據切分
至此還沒有結束,因為DB1~DB4的雙Master雙Slave數據庫僅僅實現了主從備份和讀寫分離,數據切分還沒有實現。什么是數據切分?比如電商系統的交易記錄表數據量就很大,日積月累可能已經到了幾千萬條記錄了。這時候對數據的CRUD操作會很慢,通常情況下MySQL單表數據超過2000萬,速度就會迅速下降。像是索引、SQL語句優化等等的作用很不明顯,甚至索引會成為一種累贅(海量數據排序)。最根本的解決辦法就是縮小MySQL單表數據體積,控制在2000萬條以內。超出這個范圍就實行切分數據,海量數據保存到不同的數據庫數據表中。比如雙十一當天產生了5億條訂單,這些記錄被切分到50臺MySQL數據庫中,每個MySQL的訂單交易表分得1000萬條數據,這樣就能保證每臺MySQL數據庫的性能。
當然了,隨著時間的推移,這些MySQL中的數據也會超過2000萬條,這時候應該怎么處理?再添加50臺MySQL嗎?No,No,這時候應該做冷熱數據處理。1年內的訂單交易的數據最為重要,1年以上的交易數據很少被用到,那么我們編寫程序定期將過期的訂單轉移到幾個MySQL數據庫中,即便單表數據會超過2000萬,由于這些數據極少被用到,所以不用擔心速度的問題。冷熱數據處理不是我們這篇文章深入討論的內容,我們要利用MyCat實現數據切分。
DB1~DB4的讀寫性能和抗風險性都很好,掛掉某個DB節點,其他備用的DB會接替工作。因為DB1和DB3互為主從復制,所以我們不能拿它們做數據切分。如果我們把數據切分到DB1和DB3上,它們的備份機制會保證兩個數據庫的數據完全相同,這與數據切分的初衷相悖。所以,我們把DB1~DB4當作一個虛擬的切分節點,還需要再創建另外一個虛擬切分節點,當然也需要實現主從復制和讀寫分離,因此各位同學要創建DB5~DB8數據庫,也是采用雙Master雙Slave的形式,請各位自行完成,請注意DB1~DB4與DB5~DB8沒有主從復制關系。
為mycat/conf/schema.xml文件再配置一個<dataHost>,name=localhost2,兩個<dataHost>節點用作數據切分。
?
?
如下圖,修改<dataNode>節點,只保留兩個<dataNode>節點。當數據被切分到localhost1上會被保存到db1數據庫里面,也就是說DB1~DB4上面都會有db1這個數據庫。當數據被切分到localhost2上會被保存到db2數據庫里面,意味著DB5~DB6都會有db2數據庫。
?
?
修改<table>標簽,如下圖:
?
?
執行mycat/bin/?startup_nowrap.bat文件,啟動mycat服務器,啟動成功界面如下:
?
?
在DB1上面創建db1數據庫,由于主從備份的緣故,DB2~DB4自動都會創建db1數據庫。
?
?
在DB5上面創建db2數據庫,D6~DB8也會自動創建db2數據庫。
?
?
用客戶端創建一個MyCat連接,端口號為8066,用戶名test,密碼test
?
?
使用MyCat連接到MyCat服務器之后,點擊工具欄上面的“查詢”,然后再查詢窗口中執行SQL語句創建company表。因為schema.xml文件中<table>標簽規定了company表是全局表,所以數據會被同樣分發到dn1和dn2兩個節點。
?
?
各位同學在每個數據庫連接下面的“表”選項上點擊右鍵刷新就會發現DB1~DB4的db1中存在company表,DB5~DB8的db2中也存在company表。
?
?
回到MyCAT的查詢面板,接著執行SQL語句插入數據。
?
?
然后觀察DB1~DB8每個company表是否都包含了插入的數據。
?
?
?
我們再創建一個employee表,如下圖:
?
?
根據schema.xml文件中<table>標簽可知,employee是分片表,數據會被切分。又根據partition-hash-int.txt文件得知,sharding_id列的數據是10000,則記錄被切分到dn1節點,DB1~DB4都會保存這條記錄,反之保存到dn2節點。
執行插入語句,查看DB1~DB4和DB5~DB8的employee表數據是否是不相同的,完成了數據切分。
?
?
?
?
?
為了驗證數據庫容災性,我們使用shutdown命令關閉DB1,再次向company和employee插入新數據,檢查是否可以執行。然后再啟動DB1數據庫,觀察DB1中的company和employee數據是否已經實時與DB3同步了。這樣的話,無論DB1~DB8哪一個數據庫宕機都不會影響到數據庫集群,也不會損失任何數據。
轉載于:https://www.cnblogs.com/liuxuanhang/p/7747359.html
總結
以上是生活随笔為你收集整理的数据库集群 MySQL主从复制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipython notebook的安装和
- 下一篇: 不等双十一,ChemDraw降价活动已经