1. 程式人生 > >Mycat資料庫中介軟體

Mycat資料庫中介軟體

Mycat介紹

      中介軟體:代理;

      面向企業的開源的資料庫叢集,效能極高;淘寶正在使用;

      京東,美團;

      資料庫中介軟體歷史:

            amoeba:變形蟲

                 分散式高可用結構不穩定

            cobar:Mycat前身

                    資料庫中介軟體原理

                    

                    cober容易出現後端的物理伺服器假死現象;

                   

Mycat特點

      1、高效能的讀寫分離

      2、100億級別的大表水平分片,叢集平行計算

      3、整合多種資料來源的輸入和輸出

            

Mycat核心概念

      1、Mycat核心元件的概念

            邏輯庫(對應資料庫):Mycat中間提供客戶端傳入sql,攔截sql根據配置解析

            翻譯要到物理庫執行的真正sql語句;

            客戶端在連線Mycat後可以操作資料庫語句,表格語句等等;

            客戶端在連線Mycat看到的資料庫叫做邏輯庫

                 (並不是真正的資料庫,資料可以來源一個物理庫,也可以來源於多個物理庫)

                  

            邏輯庫在Mycat中需要使用<schema>標籤完成配置,在schema.xml檔案中配置

            邏輯表:邏輯庫資料的細分分配

            分片表:

                 

                 表格的整體資料量過大時,mycat將會使用多個物理庫中的真實表格對應做邏輯分片表

                 的資料分片儲存,這種表格在mycat叫做分片表

            非分片表

                 資料儲存時,整體資料量不夠海量時,可以使用非分片表儲存,相對來說

                 非分片表比分片表配置簡單;

            全域性表

                  企業中一些工具表格,字典表,它們的共同特點是:資料變動穩定,資料量不大,這種表格

                  需要和業務表做非常多的關聯查詢,為了底層資料查詢時不做過多的跨庫操作,global全域性

                  表示為每個物理庫中都複製一份

                  工具表、字典表:

                        業務中很多邏輯,都不是用字元表示的

                        通訊成功:200狀態碼

                        通訊異常:500

                        通訊成功:400

                        數字代表特殊含義的情況,可以記錄在資料庫中某個工具表或字典表中;

                              

            ER表

                    mycat獨有

                    分片表的一種特殊情況,多個分片表有關係的時候,經常做關聯查詢,如果多個分片表格

                    中相關的資料,但是切分到的儲存物理庫不同,會導致關聯查詢/相關資料查詢時造成底層的非常大量的

                    跨庫操作;

                    

                    以訂單和訂單商品為例,一旦分片表格設定完成,很有可能2個表格相關的資料被切分到了不同的物理庫,

                    相關資料查詢時,mycat底層誇庫操作非常多,造成查詢的效率非常低下;

                    mycat就全球第一次提出ER表的概念; 

                    ER表根據相關內容的設定主表(t_order)使用table標籤配置,從表不能使用純粹的分片表格設定

                    需要在table下指定(childtable),根據主表的切分邏輯完成從表的切分;

                     

Mycat中的配置檔案

      配置檔案

            根目錄的conf中有兩個核心的配置檔案,配置內容實現:

                   讀寫分離、高可用替換、分散式儲存、ER分片表邏輯。

            server.xml

                  包括2個重要標籤

                  system:配置mycat啟動時佔用的系統的一些資源屬性(註釋掉的不需要動,保持預設)

                  user:指定當前登陸的使用者資訊;

                           屬性:

                                name表示登入當前的mycat的使用者名稱

                                password表示登入密碼

                                schemas表示當前這個使用者可以檢視的邏輯庫,以“,”分隔

                                        這裡的名稱必須和schema.xml中的schema標籤名稱對應

                                readOnly表示當前使用者只讀,不能操作寫

                                quarantine標籤:安全措施可以設定白名單黑名單

                                        whitehost:白名單列表

                                        blacklist:黑名單列表

            schema.xml:當前mycat代理的資料庫叢集的設定

                  邏輯庫,分片/非分片表,ER表,讀寫分離,高克用替換

                  標籤結構

                  schema:邏輯庫

                       table:邏輯表

                             childtable:邏輯表的從邏輯表

                  dataNode:資料分片節點的配置,一個數據分片node對應的資料庫結構可能很簡單

                                     也可能很複雜,指向一個dataHost

                  dataHost:

                        heartbeat:心跳檢測,語句不一樣,替換邏輯可能不同

                        writeHost:寫操作的資料庫節點(也可以讀)

                              readHost:與當前writeHost相關的(主從)讀節點(只讀)

                  每個標籤的屬性

                         schema:name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"

                              name:邏輯庫名稱

                              checkSQLschema:例如sql語句“select * from tb_item”,mycat攔截,將其表格名稱根據當前屬性的設定進行修改,

                                                              false不會自動檢查邏輯庫名稱,不拼接邏輯庫名字“select * from tb_item”,

                                                              可能會導致無法找到邏輯庫執行後續邏輯,true自動檢測,

                                                              會拼接邏輯庫名字“select * from TESTDB.tb_item”

                              sqlMaxLimit:一種查詢的保護措施,執行查詢語句時,自動配置的分頁資料,只差前100條,在沒有limit時

                         table:<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" type="global"/>

                              name:邏輯表名稱,配置和真實資料庫的表名最好相同

                              dataNode:對應一個,多個數據庫節點的標籤,多個值表示分片,單個值表示非分片

                              rule:資料分片的計算規則,auto-sharding-long,利用long整型的id值進行範圍劃分

                                      (0-500萬(index0),500萬-1000萬(index1),1000萬-1500萬(index2))

                              primaryKey:指向表格的主鍵,最好與真實欄位一致

                              type:表格型別,預設不是global

                         childtable:從表

                              <childTable name="orders" primaryKey="ID" joinKey="order_id"parentKey="id">

                              name:從表名稱,保持和資料庫真是表格一致

                              primaryKey:主鍵名稱

                              joinKey:從表中外來鍵欄位;必須和真實資料庫的從表外來鍵欄位名一致

                              parentKey:主表的欄位名,必須和主表與從表的外來鍵相關,對應主表的欄位名稱

                         dataNode標籤:資料節點

                              <dataNode name="dn1" dataHost="localhost1" database="db1" />

                              name:表示名稱,邏輯庫,邏輯表指向的依據

                              dataHost:指向真實管理資料庫的標籤名稱dataHost

                              database:真實資料庫名稱,邏輯庫和所有真實資料庫名稱一致

                         dataHost:管理資料分片的真實資料庫的標籤,內不包含真實資料庫資訊

                              <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql"

                              dbDriver="native" switchType="1"  slaveThreshold="100">

                              name:名稱,與datanode指向對應

                              maxCon:底層資料庫的連線最大數

                              minCon:底層資料庫的連線最小數

                              balance:值是0,1,2,3,分別表示對當前dataHost中維護的資料庫門的讀操作邏輯

                                      0:不開啟讀寫分離,所有的讀寫操作都在最小的索引號的writeHost(第一個)

                                      1:全部的readHost和備用的writeHost都參與讀資料的平衡,去過讀的請求過多,

                                            負責寫的第一個writeHost也分擔一部分

                                      2:所有的讀操作,都隨機的在所有的writeHost和readHost上進行

                                      3:所有的讀操作,都到writeHost對應的readHost上進行(備用的writeHost不參加了)

                                           在叢集中沒有配置readHost的情況下,讀都到第一個writeHost完成

                              writeType:控制當前dataHost維護的資料叢集的寫操作

                                     0:所有的寫操作都在第一個writeHost標籤的資料庫進行

                                     1:所有的寫操作,都隨機分配到所有的writeHost(mycat1.5完全不建議配置了)

                              dbtype:資料庫型別(不同資料庫配置不同名稱,mysql)

                              dbDriver:資料庫驅動,native,動態獲取

                              switchType:切換的邏輯

                                     0:故障不切換;

                                     1:故障切換,當前寫操作的writeHost故障,進行切換,切換到下一個writeHost

                              slaveThreshold:標籤中的<heartbeat>用來檢測後端資料庫的心跳sql語句;

                                                          本屬性檢查從節點與主節點的同步情況(延遲時間數)

                                                          配合心跳語句show slave status;

                                                          讀寫分離時,所有的readHost的資料都可靠。

Mycat的安裝

      1 基於jdk執行(雲主機略)

      2 獲取安裝包

            /home/resources

            #cp /home/resources/Mycat***.tar.gz ./

            將檔案拷貝到software

      3 解壓

            #tar -xf Mycat***.tar.gz

            

      4 測試執行

            mycat的根目錄中bin儲存了mycat的核心執行命令檔案

            mycat

            #mycat console