1. 程式人生 > >聊一聊mycat資料庫集群系列之雙主雙重實現

聊一聊mycat資料庫集群系列之雙主雙重實現

  最近在梳理資料庫叢集的相關操作,現在花點時間整理一下關於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
為了更高的交流,歡迎大家關注我的公眾號,掃描下面二維碼即可關注,謝謝: