最近在梳理數據庫集群的相關操作,現在花點時間整理一下關於mysql數據庫集群的操作總結,恰好你又在看這一塊,供一份參考。本次系列終結大概包括以下內容:多數據庫安裝、mycat部署安裝、數據庫之讀寫分離主從復制、數據庫之雙主多重、數據庫分庫分表。每一個點,有可能會對應一篇或者多篇文章,由於還要繼續上班工作,所以本系列分享預計持續時間需要10天左右,有興趣的您可以持續關注。我是一個菜鳥,如果寫的不好的地方,望多多指點和包涵。
好了,不逼逼了,直接進入本次的主題:mycat雙主雙重實現。在前的幾篇文章中,我們已經完整的介紹了主從備份,讀寫分離實現。但是在實際生產中,為了系統的高可用,主從備份是遠遠不夠用的,比如:要是主掛了,那么整個系統的寫數據都掛了,如果讀數據庫掛了,那怎么整個系統的讀操作也就掛了,為了實現系統的高可用,在實際項目中,我們會搭建至少搭建雙主多重。
一、簡介
數據庫集群的方式有多種 ,前面的介紹的一種是主從復制,讀寫分離,這一種方式在一般的系統已經夠用了,但是對系統可用性要求很高的系統,這樣是會有缺陷的,原因是:主只有一個,萬一主掛了呢?那系統的所有讀操作都將被中斷,系統不能提供寫服務,當重掛了,系統不同提高讀服務,所以無論那一台數據庫掛了,系統都會受到影響。對於高可用的系統,那是不行的,比如:電商系統等等。不急不急,其實也很簡單,一台不夠,那就多台就解決問題了:雙主多重,雙主:主要指的是兩台主機(一主一備),兩台主機相互間要同步數據,其中一台掛了另外一台可以正常運行。這樣能夠大大提升系統的高可用。
本次以雙主4重來做實例練習,在同一台服務器上,通過不同端口來區分不同的數據庫,具體的數據配置如下:
服務器名稱 |
端口 |
備注 |
Master_3306 |
3306 |
第一台主機,需要和第二台主機(主備機)同步數據 |
Slave1_3307 |
3307 |
第二台主機(主備機),需要和第一台主同步數據 |
Slave1_3308 |
3308 |
第一台主機對應的第一台重機 |
Master_3309 |
3309 |
第一台主機對應的第二台重機 |
Slave1_3310 |
3310 |
第二台主機對應的第一台重機 |
Slave1_3311 |
3311 |
第二台主機對應的第二台重機 |
二、數據庫環境准備
雙主多重的在原理上,和上一篇說的主從備份的原理都是一樣的,雙主雙從只是在原來的基礎上,針對主機和重機都增加了對於的備機。主機的有兩個數據庫實例,其實兩個的主備的角色是相互的,當一台機器掛了,另外一台機器就充當了主機。所以最終數據的體現效果就是,所有主機和從機都要保持數據一致。為了達到這一目錄,在備份上需要策略如下:兩台主機間都要相互同步、每一台主機對於的重機都需要同步對應的主機數據。最終的數據同步關系為:
-
3306 與 3307 相互數據同步
-
3308、3309 都要同步3306的數據
-
3310、3311 都要同步3307的數據
在配置文件上和上一篇的配置原理一樣,只是針對兩個主機需要新增一個配置節點:log-slave-updates:在作為從庫的時候,有寫入操作也要更新二進制文件。
下面簡單羅列每一個數據庫的my.ini的配置文件
3306配置文件
[Client] port = 3306 [mysqld] #設置3306端口 port = 3306 # 設置mysql的安裝目錄 basedir=C:\Program Files (x86)\MySQL\MySQL Server 8.0_3306 # 設置mysql數據庫的數據的存放目錄 datadir=C:\Program Files (x86)\MySQL\MySQL Server 8.0_3306\data # 允許最大連接數 max_connections=200 # 服務端使用的字符集默認為8比特編碼的latin1字符集 character-set-server=utf8 # 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB # 主從復制設置 # 設置服務id,注意改id值在同一個數據庫集群中要保持唯一 server-id = 3306 # 寫入磁盤策略 該參數的有效值有 0、1、2 # 默認值為1,在實際使用過程中,為了效率,我們一般會在設置為2 innodb_flush_log_at_trx_commit=2 # 開啟binlog日志同步功能 # 這個參數直接影響mysql的性能和完整性。 sync_binlog=0 # 在作為從庫的時候,有寫入操作也要更新二進制文件 log-slave-updates # 二進制日志保留天數 expire_logs_days=180 # binlog日志文件名(可以任意命名) log-bin=mysql-bin # 表示自增長字段每次遞增的量,其默認值是1,取值范圍是1 .. 65535 auto_increment_increment=2 # 表示自增長字段從那個數開始,他的取值范圍是1 .. 65535 auto_increment_offset=1 # 在主主同步配置時,需要將兩台服務器的auto_increment_increment增長量都配置為2,而要把auto_increment_offset分別配置為1和2. # 這樣才可以避免兩台服務器同時做更新時自增長字段的值之間發生沖突。 # 同步的數據庫設置方式有兩種: # binlog_do_db:設置需要同步的數據庫 # binlog-ignore-db:設置不需要同步的數據庫 #同步的數據庫,除此之外別的不同步(和下面binlog-ignore-db二選一) # binlog_do_db=testdb #不同步數據庫,除此之外都同步 binlog-ignore-db = information_schema binlog-ignore-db = mysql binlog-ignore-db = performance_schema binlog-ignore-db = sys [mysql] # 設置mysql客戶端默認字符集 default-character-set=utf8
3307置文件
[Client] port = 3307 [mysqld] #設置3307端口 port = 3307 # 設置mysql的安裝目錄 basedir=C:\Program Files (x86)\MySQL\MySQL Server 8.0_3307 # 設置mysql數據庫的數據的存放目錄 datadir=C:\Program Files (x86)\MySQL\MySQL Server 8.0_3307\data # 允許最大連接數 max_connections=200 # 服務端使用的字符集默認為8比特編碼的latin1字符集 character-set-server=utf8 # 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB # 主從復制設置 # 設置服務id,注意改id值在同一個數據庫集群中要保持唯一 server-id = 3306 # 寫入磁盤策略 該參數的有效值有 0、1、2 # 默認值為1,在實際使用過程中,為了效率,我們一般會在設置為2 innodb_flush_log_at_trx_commit=2 # 開啟binlog日志同步功能 # 這個參數直接影響mysql的性能和完整性。 sync_binlog=0 # 表示自增長字段每次遞增的量,其默認值是1,取值范圍是1 .. 65535 auto_increment_increment=2 # 表示自增長字段從那個數開始,他的取值范圍是1 .. 65535 auto_increment_offset=2 # 在主主同步配置時,需要將兩台服務器的auto_increment_increment增長量都配置為2,而要把auto_increment_offset分別配置為1和2. # 這樣才可以避免兩台服務器同時做更新時自增長字段的值之間發生沖突。 # 在作為從庫的時候,有寫入操作也要更新二進制文件 log-slave-updates # 二進制日志保留天數 expire_logs_days=180 # binlog日志文件名(可以任意命名) log-bin=mysql-bin # 同步的數據庫設置方式有兩種: # binlog_do_db:設置需要同步的數據庫 # binlog-ignore-db:設置不需要同步的數據庫 #同步的數據庫,除此之外別的不同步(和下面binlog-ignore-db二選一) # binlog_do_db=testdb #不同步數據庫,除此之外都同步 binlog-ignore-db = information_schema binlog-ignore-db = mysql binlog-ignore-db = performance_schema binlog-ignore-db = sys [mysql] # 設置mysql客戶端默認字符集 default-character-set=utf8
3308配置文件
[Client] port = 3308 [mysqld] #設置3308端口 port = 3308 # 該id主要要保持唯一,后面在設置主從同步的時候會用到 server-id = 3308 # 設置mysql的安裝目錄 basedir=C:\Program Files (x86)\MySQL\MySQL Server 8.0.21_3308 # 設置mysql數據庫的數據的存放目錄 datadir=C:\Program Files (x86)\MySQL\MySQL Server 8.0.21_3308\data # 允許最大連接數 max_connections=200 # 服務端使用的字符集默認為8比特編碼的latin1字符集 character-set-server=utf8 # 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB [mysql] # 設置mysql客戶端默認字符集 default-character-set=utf8
3309配置文件
[Client] port = 3309 [mysqld] #設置3309端口 port = 3309 # 該id主要要保持唯一,后面在設置主從同步的時候會用到 server-id = 3309 # 設置mysql的安裝目錄 basedir=C:\Program Files (x86)\MySQL\MySQL Server 8.0.21_3309 # 設置mysql數據庫的數據的存放目錄 datadir=C:\Program Files (x86)\MySQL\MySQL Server 8.0.21_3309\data # 允許最大連接數 max_connections=200 # 服務端使用的字符集默認為8比特編碼的latin1字符集 character-set-server=utf8 # 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB [mysql] # 設置mysql客戶端默認字符集 default-character-set=utf8
3310配置文件
[Client] port = 3308 [mysqld] #設置3310端口 port = 3310 # 該id主要要保持唯一,后面在設置主從同步的時候會用到 server-id = 3310 # 設置mysql的安裝目錄 basedir=C:\Program Files (x86)\MySQL\MySQL Server 8.0.21_3310 # 設置mysql數據庫的數據的存放目錄 datadir=C:\Program Files (x86)\MySQL\MySQL Server 8.0.21_3310\data # 允許最大連接數 max_connections=200 # 服務端使用的字符集默認為8比特編碼的latin1字符集 character-set-server=utf8 # 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB [mysql] # 設置mysql客戶端默認字符集 default-character-set=utf8
3311配置文件
[Client] port = 3311 [mysqld] #設置3311端口 port = 3311 # 該id主要要保持唯一,后面在設置主從同步的時候會用到 server-id = 3308 # 設置mysql的安裝目錄 basedir=C:\Program Files (x86)\MySQL\MySQL Server 8.0.21_3311 # 設置mysql數據庫的數據的存放目錄 datadir=C:\Program Files (x86)\MySQL\MySQL Server 8.0.21_3311\data # 允許最大連接數 max_connections=200 # 服務端使用的字符集默認為8比特編碼的latin1字符集 character-set-server=utf8 # 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB [mysql] # 設置mysql客戶端默認字符集 default-character-set=utf8
三、數據庫配置驗證
數據庫雙主多重配置驗證,主要驗證兩個主機數據更新是否所有集群中的是所有數據是否都發送對應的改變,如果發送說明配置成功。
1、 在3306中創建一個數據test和一個表user
查看其它的庫是否都創建了一個庫test和一個表user
2、 在3307中對表user插入一條數據
查看其余所有庫對於的表是否也新增了該數據
四、mycat雙主多從配置
Mycat的使用配置,我們先從最簡單的模式(主從復制)開始配置起走。Mycat主從復制主要配置文件有如下兩個文件,兩個文件都在mycat目錄\conf下。
- server.xml: 配置文件包含了mycat的系統配置信息
- schema.xml:涵蓋了mycat的邏輯庫,表,分片規則,分片節點及數據源。
server.xml配置文件
server.xml主要涉及到兩個標簽的配置,和上一篇的主重復制一樣:
- system標簽:主要配置系統相關的配置,在此不在做詳細的描述,根據實際需要在去配置;
- user標簽:主要用於定義登錄mycat的用戶和權限,這也是本次需要介紹的配置節點。user標簽可以同時配置多個節點。
<!--配置mycat連接用戶信息--> <!--name:用戶名--> <user name="root" defaultAccount="true"> <!--password:用戶登錄密碼--> <property name="password">xuyuanhong</property> <!--password:mysql對應的邏輯庫名稱,如果有多個庫,那么不同的庫之間通過,連接--> <property name="schemas">test</property> </user>
schema.xml配置文件
schema配置相對上一篇的主從復制的配置節點,只是將負載均衡節點balance的值改為1,同時在服務上新增一個主節點,同時新增一個從節點,其余配置不變,如下:
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!--schema:mycat整個數據庫的映射框架配置,每一個mycat邏輯庫需要一個對於的配置節點--> <!--name:mycat的邏輯庫名稱,和sercer.xml中的邏輯庫名稱保持一致--> <!--checkSQLschema:是否檢測SQL,如果設置為 true,那么mycat會對傳遞的SQL做優化,主要去掉指定庫名稱,反之則不做任何處理,一般情況下設置false--> <!--sqlMaxLimit:最大連接數--> <!--dataNode:主要配置邏輯庫和實際庫的映射關系,會有一個專門的節點來配置,此處指需要綁定對於的映射關系名稱即可--> <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dntest"> </schema> <!--dataNode:配置mycat邏輯庫和實際庫的映射關系--> <!--name:映射關系名稱,要和上面的schema對應的dataNode節點名稱保持一致--> <!--database:實體庫映射的真實數據庫名稱--> <!--dataHost:具體的數據庫連接屬性節點名稱--> <dataNode name="dntest" database="test" dataHost="hosttest" /> <!--dataHost:配置數據庫的連接信息和路由規則信息--> <!--name:數據連接地址信息名稱,語上面的dataNode節點中的dataHost名稱對應--> <!--maxCon:指定每個讀寫實例連接池的最大連接--> <!--minCon:指定每個讀寫實例連接池的最小連接,初始化連接池的大小--> <!--balance:查詢操作負載均衡類型,目前的取值有以下4種 balance=0: 不開啟讀寫分離,所有讀操作都發送到當前可用的writeHost上。 balance=1: 全部的readHost與Stand by writeHost都參與select語句的負載均衡, 簡而言之,當雙主雙從模式(M1->S1, M2->S2,並且M1與M2互為主備)時,在正常情況下,M2,S1和S2都參與select的負載均 balance=2: 所有的讀操作都隨機在writeHost,readHost上分發。 balance=3: 所有的讀請求都隨機分配到writeHost對應的readHost上執行,writeHost不負擔讀壓力,注意balance=3只在mycat1.4之后版本中有效。 在實際使用中,針對讀寫分離模式,我們一般都配置為3 --> <!--writeType:寫操作負載均衡類型,目前的取值有3種: writeType=“0”, 所有寫操作都發送到可用的writeHost上。 writeType=“1”,所有寫操作都隨機的發送到readHost。 writeType=“2”,所有寫操作都隨機的在writeHost、readhost分上發。 毫無疑問,在實際使用過中,都會配置為0 -->
<!--dbType:指定后端連接的數據庫類型,目前支持二進制的mysql協議,還有其他使用JDBC連接的數據庫。如mongodb,spark等-->
<!--dbDriver:指定連接后端數據庫使用的Driver,目前可選的值有native和JDBC。
使用native的話,因為這個值執行的是二進制的mysql協議,所以可以使用mysql和maridb。
其他類型的數據庫則需要使用JDBC驅動來支持
-->
<!--switchType:切換方式:
-1:表示不自動切換。
1:默認值,表示自動切換
2:表示基於MySQL主從同步狀態決定是否切換,心跳語句: show slave status.
3:表示基於mysql galary cluster的切換機制,適合mycat1.4之上的版本,心跳語句show status like "%esrep%";
-->
<dataHost name="hosttest" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--心跳檢測語句,mycat也是要實時的去檢測每一個映射數據庫的狀態,通過執行該語句的返回來判斷數據庫是否在線-->
<heartbeat>select user()</heartbeat>
<!-- writeHost:寫服務器映射關系配置 -->
<!-- url:數據庫地址(ip+端口號) -->
<!-- user:數據庫連接用戶名(注意改賬號一定要授權可以遠程訪問改數據庫) -->
<!-- password:數據庫連接密碼 -->
<writeHost host="hostM1" url="192.168.101.191:3306" user="root"
password="xuyuanhong">
<!-- readHost:讀服務器映射關系配置,可以配置多個節點,多個節點就代表多個從數據庫 -->
<readHost host="hostS11" url="192.168.101.191:3308" user="root" password="xuyuanhong">
</readHost>
<readHost host="hostS12" url="192.168.101.191:3309" user="root" password="xuyuanhong">
</readHost>
</writeHost>
<writeHost host="hostM2" url="192.168.101.191:3307" user="root"
password="xuyuanhong">
<!-- readHost:讀服務器映射關系配置,可以配置多個節點,多個節點就代表多個從數據庫 -->
<readHost host="hostS21" url="192.168.101.191:3310" user="root" password="xuyuanhong">
</readHost>
<readHost host="hostS22" url="192.168.101.191:3311" user="root" password="xuyuanhong">
</readHost>
</writeHost>
</dataHost>
</mycat:schema>
五、mycat啟動及其常用操作命令
- 首先需要進入到mycat安裝目錄的bin目錄下
cd E:\Program Files\mycat\bin
- 開啟mycat
mycat.bat start
- 停止mycat
mycat.bat stop
- 重啟mycat
mycat.bat restart
- 查看mycat狀態
mycat.bat status
六、mycat中遇到的問題解決
其實在實際mycat配置時,我也不是一次配置成功的,也遇到了兩個小問題,現在羅列出來,如果剛剛你也遇到了正好可以解決掉。
1、Unrecognized VM option 'AggressiveOpts'
解決方式:打開wrapper.conf配置文件,找到AggressiveOpts並將整行注釋掉即可,如下圖所示:
2、Could not create the Java Virtual Machine.
該問題有可能是設置才內存超出本地環境實際內存,處理方式也簡單,直接將wrapper.conf對應的內存改小即可。如下圖位置:
有關mycat的部署安裝、讀寫分離就分享到這兒了,下一篇將和大家一起分享mycat的多主多重配置,有興趣的小伙伴,可以持續關注,謝謝!
好了,到目前為止,針對數據庫的主從復制、算主多重的部署從頭到尾的每一步都做了一個總結。在后續的文章中就要開始對數據庫的分庫分表進行梳理回顧。有興趣的朋友,可以持續關注,謝謝支持。
END
為了更高的交流,歡迎大家關注我的公眾號,掃描下面二維碼即可關注,謝謝: