一起聊聊Mycat實作 Mysql 叢集讀寫分離

WBOY
發布: 2022-01-21 18:11:06
轉載
2778 人瀏覽過

這篇文章為大家介紹了關於MySQL讀寫分離的相關知識,希望對大家有幫助。

一起聊聊Mycat實作 Mysql 叢集讀寫分離

MySQL 讀寫分離的概述

  • #MySQL 作為目前世界上使用最廣泛的免費資料庫,相信所有從事系統運維的工程師都一定接觸過。

  • 在實際的生產環境中,由單一 MySQL 作為獨立的資料庫是完全無法滿足實際需求的,無論是在安全性,高可用性以及高並發等各個方面。

  • 因此,一般來說都是透過主從複製(Master-Slave)的方式來同步資料,再透過讀寫分離(MySQL-Proxy/Amoeba)來提升資料庫的並發負載能力#進行部署與實作。

讀寫分離工作原理

  • #基本的原則是:

  • 主資料庫處理交易性增加、變更、刪除操作(INSERT、UPDATE、DELETE)

  • 從資料庫處理SELECT 查詢操作

  • 資料庫複製被用來把事務性操作導致的變更同步到叢集中的從資料庫。

#為什麼要讀寫分離

  • 面對越來越大的存取壓力,單一的伺服器的效能成為瓶頸,需要分擔負載

  • 主從只負責各自的寫和讀,極大程度的緩解X(寫入)鎖定和S(讀取)鎖定爭用

  • 從程式庫可設定myisam 引擎,提升查詢效能以及節約系統開銷

  • 增加冗餘,提高可用性

實作讀寫分離的方式

  • 一般有兩種方式實現
  • 應用程式層實現,網站的程式實作
  • 應用程式層實作指的是在應用程式內部及連接器中實現讀寫分離

  • #優點:

  • #應用程式內部實作讀寫分離,安裝既可以使用

  • 減少一定部署難度

  • #存取壓力在一定層級以下,效能很好

  • 缺點:

  • 架構一旦調整,程式碼要跟著變

  • 難以實現進階應用,如自動分庫,分錶

  • #無法適用大型應用程式場景

中間件層實作:

  • #中間件層實作是指在外部中介軟體程式實作讀寫分離

  • 常見的中間件程式

  • Cobar:

  • 阿里巴巴B2B 開發的關係型分散式系統,管理將近3000 個MySQL 實例。在阿里經受住了考驗,後面由於作者的走開的原因 cobar 沒有人維護 了,阿里也開發了 tddl 替代 cobar。

  • MyCAT:

  • 社群愛好者在阿里cobar 基礎上進行二次開發,解決了cobar 當時存在的一些問題,並加入了許多新的功能在其中。目前 MyCAT 社群活躍度很高,已經有一些公司在使用 MyCAT。整體來說支持度比

  • 較高,也會一直維護下去。

  • OneProxy:

  • 資料庫界大牛,前支付寶資料庫團隊領導樓總開發,基於mysql 官方的proxy 思想利用c 進行開發的,OneProxy 是一款商業收費的中間件,樓總捨去了一些功能點,專注在性能和穩定性上。有人測試

  • 試過說在高並發下很穩定。

  • Vitess:

  • 這個中間件是 Youtube 生產在使用的,但是架構很複雜。與以往中間件不同,使用 Vitess 應用改動比較大,要使用他提供語言的 API 接口,我們可以藉鏡他其中的一些設計思想。

  • Kingshard:

  • Kingshard 是前360Atlas 中間件開發團隊的陳菲利用業餘時間用go 語言開發的,目前參與開發的人員有3 個左右, 目前來看還不是成熟可以使用的產品,需要在不斷改進。

  • Atlas:

  • 360 團隊基於 mysql proxy 把 lua 用 C 改寫。原版本是支援分錶, 目前已經放出了分庫分錶版本。在網路上看到一些朋友常說在高並發下會常常掛掉,如果大家要使用需要提前做好測試。

  • MaxScale 與MySQL Route:

  • 這兩個中間件都算是官方的,MaxScale 是mariadb (MySQL 原作者維護的一個版本)研發的,目前版本不支援分庫分錶。 MySQL Route 是現在 MySQL 官方 Oracle 公司發佈出來的中介軟體。

  • 優點:

  • 架構設計更靈活

  • 可以在程式上實作一些高階控制,如:透明化水平拆分,failover,監控可以依靠技術手段提高mysql 性能對業務代碼的影響小,同時也安全

  • 缺點:

  • ##需要一定的開發維運團隊的支持。


什麼是MyCAT

  • #一個徹底開源的,面向企業應用開發的大資料庫叢集

  • 支援事務、ACID、可以取代MySQL 的加強版資料庫

  •   一個可以視為MySQL 叢集的企業級資料庫,用來取代昂貴的Oracle 叢集

  • 一個融合記憶體快取技術、NoSQL 技術、HDFS 大數據的新SQL Server

  • 結合傳統資料庫與新分散式資料倉儲的新一代企業級資料庫產品

  • 一個新穎的資料庫中間件產品


MyCat 服務安裝與設定

  • #MyCat 有提供編譯好的安裝包,支援Windows、Linux、Mac、Solaris 等系統上安裝與運行

  • 官方下載主頁http://www.mycat.org.cn/

    實驗架構:
  • 192.168.2.2     Mycat        CentOS 8.3.2011
  • 192.168.2.3 #62# 192.168.2.5     從伺服器   CentOS 7.6
  • 執行Mycat 需要JDK 1.7 或以上版本

下載
  • wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
  • ##tar xf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /usr/local/
  • sudo useradd -M -N -s /sbin/nologin mycat && echo "123456" | passwd --stdin mycat
  • sudo chown -R mycat. /usr/local/mycat/

  • bin 程式目錄,Linux 下運作:./mycat console,首先要chmod x * 
    註:mycat 支援的指令{ console | start | stop | restart | status | dump } 
    conf目錄下存放設定檔:server.xml 是Mycat 伺服器參數調整和使用者授權的設定文件,schema.xml 是邏輯庫定義和表以及分片定義的設定文件,rule.xml 是分片規則的設定文件,分片規則的具體一些參數資訊單獨存放為文件,也在這個目錄下,設定檔修改,需要重啟Mycat 生效。
    lib 目錄下主要存放 mycat 依賴的一些 jar 檔案。
    日誌存放在logs/mycat.log 中,每天一個文件,日誌的配置是在conf/log4j.xml 中,根據自己的需要,可以調整輸出等級為debug,在debug 等級下,會輸出更多的訊息,方便排查問題。

MyCat 服務啟動與啟動設定

  • #MyCAT 在Linux 中部署啟動時,首先需要在Linux 系統的環境變數中設定MYCAT_HOME,操作方式如下:

  • sudo vim /etc/profile.d/mycat.sh
    MYCAT_HOME=/usr/local/mycat PATH= $MYCAT_HOME/bin:$PATH

  • 使環境變數生效

  • . /etc/profile.d/mycat.sh

  • #啟動服務
  • /usr/local/mycat/bin/mycat start
  •  cat /usr/local /mycat/logs/wrapper.log

#mycat 的使用者帳號和授權資訊是在conf/server.xml 檔案中設定

  • vim /usr/local/mycat/conf/server.xml









  • ##這裡定義的是在192.168.2.2 登陸mycat 的使用者名稱和密碼,名稱可以自訂。 192.168.2.2 上沒有執行 mysqld 服務,schemas裡面指定的資料庫名稱是伺服器端必須存在的資料庫!




    #############編輯MyCAT 的設定檔schema.xml,關於dataHost 的設定信息如下:#########備份原先的設定檔######\cp  /usr/local/mycat/conf/schema.xml{,.bak}######編輯設定檔#########vim /usr/local/mycat/conf/schema.xml### ### ###      ### 注意這裡的網址,錯寫會啟動失敗! ######         ###         ###     ” "dn1" dataHost="dthost" database="mydata"/>###         ###                 /heartbeat>###                ### >######         ####
  • 強制所有的讀取操作都在讀取伺服器上運行,只有寫入資料時才切換到寫入伺服器

  • 注意這裡的mycat 使用者都要在主從資料庫上192.168.2.3 和2.5 授權

  • GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' IDENTIFIED BY '123456';

  • 或指定網段

  • GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'192.168.2. %' IDENTIFIED BY '123456';

  • #flush privileges;

  • 如果報這個錯誤,伺服器運作正常的話,先檢查有沒有授權

  • ERROR 1184 (HY000): Invalid DataSource:0

##  schema:邏輯函式庫,與MySQL中的Database(資料庫)對應,一個邏輯庫中定義了所包含的Table。
  table:表,即實體資料庫中儲存的某一張表,與傳統資料庫不同,這裡的表格需要宣告其所儲存的邏輯資料節點DataNode,這是透過表格的分片規則定義來實現的,table可以定義其所屬的“子表(childTable)”,子表的分片依賴於與“父表”的具體分片地址,簡單的說,就是屬於父表裡某一條記錄A的子表的所有記錄都與A儲存在同一個分片上。
分片規則:是一個欄位與函數的捆綁定義,根據這個欄位的值來傳回所在儲存的分片(DataNode)的序號,每個表格可以定義一個分片規則,分片規則可以靈活擴展,預設提供了基於數字的分片規則,字串的分片規則等。
  dataNode: MyCAT的邏輯資料節點,是存放table的具體物理節點,也稱為分片節點,透過DataSource來關聯到後端某個特定資料庫上,一般來說,為了高可用性,每個DataNode都設定兩個DataSource,一個主一從,當主節點宕機,系統自動切換到從節點。 
  dataHost:定義某個實體函式庫的存取位址,用於捆綁到dataNode上。

MyCAT目前透過設定檔的方式定義邏輯函式庫與相關設定: 
  MYCAT_HOME/conf/schema.xml中定義邏輯庫,表格、分片節點等內容; 
  MYCAT_HOME/conf /rule.xml中定義分片規則; 
  MYCAT_HOME/conf/server.xml中定義使用者以及系統相關變量,如連接埠等。

註解:
schema 標籤用來定義 MyCat 實例中的邏輯庫,name:後面就是邏輯庫名 MyCat 可以有多個邏輯庫,每個邏輯庫都有自己的相關配置。可以使用 schema 標籤來劃分這些不同的邏輯庫。
checkSQLschema 這個屬性預設就是 false,官方文件的意思就是是否去掉表前面的資料庫的名稱,”select * from db1.testtable” ,設定為 true 就會去掉 db1。但如果 db1 的名稱不是
schema 的名稱,那麼也不會被去掉,因此官方建議不要使用這種語法。同時預設為 false。
sqlMaxLimit 當該值設定為某個數值時。每條執行的 SQL 語句,如果沒有加上 limit 語句,MyCat 也會自動的加上所對應的值。例如設定值為100,執行”select * from test_table”,則效果為
“selelct * from test_table limit 100”.
dataNode 標籤定義了MyCat 中的資料節點,也就是我們通常說所的數據分片

#########################################

  • 重新啟動服務
  • /usr/local/mycat/bin/mycat restart
    Stopping Mycat-server...
    Stopped Mycat -server.
    Starting Mycat-server...
    tail /usr/local/mycat/logs/wrapper.log

設定MySQL 主從

  • 在2台伺服器上分別安裝、設定mariadb,具體步驟請參考:https://blog.csdn.net/gaofei0428/ article/details/103829676?spm=1001.2014.3001.5501
  • 首先在主資料庫端 192.168.2.3 編輯/etc/my.cnf

  • #/etc/my.cnf
  • [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock

    symbolic-links=0

    log-bin=/data/mysql/mysql-bin

    server-id=1 binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=test
    innodb_flush_log_at_trx_commit=1
    binlog-do-db=
    mydatadata ## replicate-do-db=mydata
    lower_case_table_names=1   開啟大小寫符合
  • ##注意需要同步的資料庫必須事先存在

  • ##啟動無誤後在然後在從伺服器192.168.2.5 上配置/etc/my.cnf

    vim /etc/my.cnf                                                                              1 

    [mysqld]
  • datadir=/var/lib/mysql
  • # socket=/var/lib/mysql/mysql.sock

    symbolic-links=0

    log-bin=/data/mysql/mysql-bin
    # server-id=2
    relay-log-index=/data/mysql/slave-relay-bin.index
    relay-log=/data/mysql/slave-relay-bin
    lower_case_table_names=1

    read_only =1    開啟唯讀模式,防止資料回寫,不會影響slave 同步複製
  • lower_case_table_names=1   開啟大小寫符合




  • ##重啟從資料庫服務後進行以下動作

停止從伺服器的slave,建立slave資料庫使用者

mysql -uroot -p123456 - e "stop slave"

mysql -uroot -p123456 -e "grant replication slave on *.* to 'slave'@'%' identified by '123456'" mysql -uroot -p123456 -e "select user ,password from mysql.user"

#########mysql -uroot -p123456 -e "change master to master_host='192.168.2.3',master_user=' slave',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=245;"### mysql -uroot -p123456 -e "start slave"### mysql -uroot -p123456 -e "start slave"### mysql -uroot -p123556 slave status"##################################
  • 測試

  • #首先匯出主伺服器192.168.2.3 的所有程式庫的備份

  • #mysqldump -uroot -p --all-databases > /tmp/all_dbs.sql

  • 然後在從伺服器192.168.2.5 匯入

  • ##mysql -uroot -p < ; /tmp/all_dbs.sql

  • 在主資料庫端192.168.2.3 新增一些數據,觀測從資料庫是否同步

    #在從伺服器端查看

    #如果同步出錯,則需要在從伺服器stop slave,然後重新change master

    #使用slave使用者登陸測試


  • #回到mycat 伺服器192.168.2.2

  • #嘗試登陸
  • #mysql -uroot -p123456 -h192.168.2.2 -P8066
  • 8066 為mycat 執行階段的連接埠號碼

  • 測試讀取與寫入分離

  • mysql -uroot -p123456 -h192.168.2.2 -P9066 -e "show @@datasource"
  • 9066為mycat 管理連接埠
  • #select * from mydata.mylist;

  • 寫入資料或變更資料

  • insert into mydata.mylist values(10,'test');

  • 模擬故障,先停止從伺服器192.168.2.5

  • #systemctl stop mariadb.service

    在192.168.2.2 上嘗試寫入資料
  • insert into mydata.mylist values( 7,'gf');

######################################## #######開啟從伺服器192.168.2.5#####################模擬主伺服器192.168.2.3 宕機######### #################

  • 查詢正常,嘗試寫入資料

  • #查詢正常但是不能寫入


  • #新增多個庫
  • vim cat /usr/local/mycat /conf/server.xml
  •      
         mydata,wordpress

  • vim /usr/local/mycat/conf/schema.xml

  •  

  • 新增完重啟服務
  • #/usr/local/mycat/bin/mycat restart
  • tail / usr/local/mycat/logs/wrpper.log


  • 已報錯處理
    #Startup failed: Timed out waiting for a signal from the JVM.
    JVM did not exit on request, terminated

    # 解決方案
    在wrapper.conf中加入
    wrapper.startup.timeout=300   //逾時時間300秒
    wrapper.ping.timeout=120

##推薦學習:mysql影片教學

以上是一起聊聊Mycat實作 Mysql 叢集讀寫分離的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!