一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

本篇文章給大家介紹了關(guān)于mysql讀寫分離的相關(guān)知識,希望對大家有幫助。

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

mysql 讀寫分離的概述

  • MySQL 作為目前世界上使用最廣泛的免費數(shù)據(jù)庫,相信所有從事系統(tǒng)運維的工程師都一定接觸過。

  • 在實際的生產(chǎn)環(huán)境中,由單臺 MySQL 作為獨立的數(shù)據(jù)庫是完全不能滿足實際需求的,無論是在安全性,高可用性以及高并發(fā)等各個方面。

  • 因此,一般來說都是通過主從復制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離(MySQL-Proxy/Amoeba)來提升數(shù)據(jù)庫的并發(fā)負載能力進行部署與實施。

讀寫分離工作原理

  • 基本的原理是:

  • 主數(shù)據(jù)庫處理事務性增、改、刪操作(INSERT、UPDATE、delete

  • 從數(shù)據(jù)庫處理 select 查詢操作

  • 數(shù)據(jù)庫復制被用來把事務性操作導致的變更同步到集群中的從數(shù)據(jù)庫。

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

為什么要讀寫分離

  • 面對越來越大的訪問壓力,單臺的服務器的性能成為瓶頸,需要分擔負載

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

  • 從庫可配置 myisam 引擎,提升查詢性能以及節(jié)約系統(tǒng)開銷

  • 增加冗余,提高可用性

實現(xiàn)讀寫分離的方式

  • 一般有兩種方式實現(xiàn)
  • 應用程序?qū)訉崿F(xiàn),網(wǎng)站的程序?qū)崿F(xiàn)
  • 應用程序?qū)訉崿F(xiàn)指的是在應用程序內(nèi)部及連接器中實現(xiàn)讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 優(yōu)點:

  • 應用程序內(nèi)部實現(xiàn)讀寫分離,安裝既可以使用

  • 減少一定部署難度

  • 訪問壓力在一定級別以下,性能很好

  • 缺點:

  • 架構(gòu)一旦調(diào)整,代碼要跟著變

  • 難以實現(xiàn)高級應用,如自動分庫,分表

  • 無法適用大型應用場景

中間件層實現(xiàn):

  • 中間件層實現(xiàn)是指在外部中間件程序?qū)崿F(xiàn)讀寫分離

  • 常見的中間件程序

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • Cobar:

  • 阿里巴巴 B2B 開發(fā)的關(guān)系型分布式系統(tǒng),管理將近 3000 個 MySQL 實例。 在阿里經(jīng)受住了考驗,后面由于作者的走開的原因 cobar 沒有人維護 了,阿里也開發(fā)了 tddl 替代 cobar。

  • MyCAT:

  • 社區(qū)愛好者在阿里 cobar 基礎(chǔ)上進行二次開發(fā),解決了 cobar 當時存在的一些問題,并且加入了許多新的功能在其中。目前 MyCAT 社區(qū)活躍度很高,已經(jīng)有一些公司在使用 MyCAT。總體來說支持度比

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

  • OneProxy:

  • 數(shù)據(jù)庫界大牛,前支付寶數(shù)據(jù)庫團隊領(lǐng)導樓總開發(fā),基于 mysql 官方 的 proxy 思想利用 c 進行開發(fā)的,OneProxy 是一款商業(yè)收費的中間件,樓總舍去了一些功能點,專注在性能和穩(wěn)定性上。有人測

  • 試過說在高并發(fā)下很穩(wěn)定。

  • Vitess:

  • 這個中間件是 Youtube 生產(chǎn)在使用的,但是架構(gòu)很復雜。 與以往中間件不同,使用 Vitess 應用改動比較大,要使用他提供語言的 API 接口,我們可以借鑒他其中的一些設(shè)計思想。

  • Kingshard:

  • Kingshard 是前 360Atlas 中間件開發(fā)團隊的陳菲利用業(yè)余時間 用 go 語言開發(fā)的,目前參與開發(fā)的人員有 3 個左右, 目前來看還不是成熟可以使用的產(chǎn)品,需要在不斷完善。

  • Atlas:

  • 360 團隊基于 mysql proxy 把 lua 用 C 改寫。原有版本是支持分表, 目前已經(jīng)放出了分庫分表版本。在網(wǎng)上看到一些朋友經(jīng)常說在高并發(fā)下會經(jīng)常掛掉,如果大家要使用需要提前做好測試。

  • MaxScale 與 MySQL Route:

  • 這兩個中間件都算是官方的,MaxScale 是 mariadb (MySQL 原作者維護的一個版本)研發(fā)的,目前版本不支持分庫分表。MySQL Route 是現(xiàn)在 MySQL 官方 oracle 公司發(fā)布出來的一個中間件。

  • 優(yōu)點:

  • 架構(gòu)設(shè)計更靈活

  • 可以在程序上實現(xiàn)一些高級控制,如:透明化水平拆分,failover,監(jiān)控可以依靠技術(shù)手段提高 mysql 性能對業(yè)務代碼的影響小,同時也安全

  • 缺點:

  • 需要一定的開發(fā)運維團隊的支持。


什么是 MyCAT

  • 一個徹底開源的,面向企業(yè)應用開發(fā)的大數(shù)據(jù)庫集群

  • 支持事務、ACID、可以替代 MySQL 的加強版數(shù)據(jù)庫

  • ? 一個可以視為 MySQL 集群的企業(yè)級數(shù)據(jù)庫,用來替代昂貴的 Oracle 集群

  • 一個融合內(nèi)存緩存技術(shù)、nosql 技術(shù)、hdfs 大數(shù)據(jù)的新型 SQL Server

  • 結(jié)合傳統(tǒng)數(shù)據(jù)庫和新型分布式數(shù)據(jù)倉庫的新一代企業(yè)級數(shù)據(jù)庫產(chǎn)品

  • 一個新穎的數(shù)據(jù)庫中間件產(chǎn)品

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離


MyCat 服務安裝與配置

  • MyCat 有提供編譯好的安裝包,支持 windowslinux、Mac、Solaris 等系統(tǒng)上安裝與運行

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

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 實驗架構(gòu):
  • 192.168.2.2? ? ?Mycat? ? ? ? centos 8.3.2011
  • 192.168.2.3? ? ?主服務器? ?CentOS 7.6
  • 192.168.2.5? ? ?從服務器? ?CentOS 7.6
  • 運行 Mycat 需要JDK 1.7 或者以上版

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 下載 Mycat?
  • 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” | sudo passwd –stdin mycat
  • sudo chown -R mycat. /usr/local/mycat/

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • bin 程序目錄,Linux 下運行:./mycat console,首先要 chmod +x *?
    注:mycat 支持的命令{ console | start | stop | restart | status | dump }?
    conf 目錄下存放配置文件:server.xml 是 Mycat 服務器參數(shù)調(diào)整和用戶授權(quán)的配置文件,schema.xml 是邏輯庫定義和表以及分片定義的配置文件,rule.xml 是分片規(guī)則的配置文件,分片規(guī)則的具體一些參數(shù)信息單獨存放為文件,也在這個目錄下,配置文件修改,需要重啟 Mycat 生效。
    lib 目錄下主要存放 mycat 依賴的一些 jar 文件。
    日志存放在 logs/mycat.log 中,每天一個文件,日志的配置是在 conf/log4j.xml 中,根據(jù)自己的需要,可以調(diào)整輸出級別為 debug,在 debug 級別下,會輸出更多的信息,方便排查問題。

MyCat 服務啟動與啟動設(shè)置

  • MyCAT 在 Linux 中部署啟動時,首先需要在 Linux 系統(tǒng)的環(huán)境變量中配置 MYCAT_HOME,操作方式如下:

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

  • 使環(huán)境變量生效

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

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

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

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

mycat 的用戶賬號和授權(quán)信息是在 conf/server.xml 文件中配置

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

  • 這里定義的是在 192.168.2.2 上登陸 mycat 的用戶名和密碼,名稱可以自定義。192.168.2.2 上沒有運行 mysqld 服務,schemas里面指定的數(shù)據(jù)庫名是服務器端必須存在的數(shù)據(jù)庫!

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

編輯 MyCAT 的配置文件 schema.xml,關(guān)于 dataHost 的配置信息如下:

  • 備份原先的配置文件
  • cp ?/usr/local/mycat/conf/schema.xml{,.bak}
  • 編輯 配置文件
  • vim /usr/local/mycat/conf/schema.xml

    http://io.mycat/”>? ? ? 注意這里的網(wǎng)址,錯寫會啟動失敗!
    ? ? ? ?
    ? ? ? ?

    ? ? ? ?
    ? ? ? ? balance=”1″ writeType=”0″ dbType=”mysql” dbDriver=”native” switchType=”-1″ slaveThreshold=”100″>
    ? ? ? ? ? ? ? ? show slave status
    ? ? ? ? ? ? ? ? ? ?寫服務器
    ? ? ? ? ? ? ? ?

    ? ? ? ? ? ? ? ? ? ?讀服務器
    ? ? ? ? ? ? ? ?

    ? ? ? ?

    ?

  • 強制所有的讀操作都在讀服務器上運行,只有寫入數(shù)據(jù)時才切換到寫服務器

  • 注意這里的 mycat 用戶都要在 主從數(shù)據(jù)庫 上 192.168.2.3 和 2.5 授權(quán)

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

  • 或者指定網(wǎng)段

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

  • flush privileges;

  • 如果報這個錯誤,服務器運行正常的話,首先檢查有沒有授權(quán)

  • Error 1184 (HY000): Invalid DataSource:0

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  schema:邏輯庫,與MySQL中的database(數(shù)據(jù)庫)對應,一個邏輯庫中定義了所包括的table。?
  table:表,即物理數(shù)據(jù)庫中存儲的某一張表,與傳統(tǒng)數(shù)據(jù)庫不同,這里的表格需要聲明其所存儲的邏輯數(shù)據(jù)節(jié)點DataNode,這是通過表格的分片規(guī)則定義來實現(xiàn)的,table可以定義其所屬的“子表(childTable)”,子表的分片依賴于與“父表”的具體分片地址,簡單的說,就是屬于父表里某一條記錄A的子表的所有記錄都與A存儲在同一個分片上。?
分片規(guī)則:是一個字段與函數(shù)的捆綁定義,根據(jù)這個字段的取值來返回所在存儲的分片(DataNode)的序號,每個表格可以定義一個分片規(guī)則,分片規(guī)則可以靈活擴展,默認提供了基于數(shù)字的分片規(guī)則,字符串的分片規(guī)則等。?
  dataNode:?MyCAT的邏輯數(shù)據(jù)節(jié)點,是存放table的具體物理節(jié)點,也稱之為分片節(jié)點,通過DataSource來關(guān)聯(lián)到后端某個具體數(shù)據(jù)庫上,一般來說,為了高可用性,每個DataNode都設(shè)置兩個DataSource,一主一從,當主節(jié)點宕機,系統(tǒng)自動切換到從節(jié)點。?
  dataHost:定義某個物理庫的訪問地址,用于捆綁到dataNode上。

MyCAT目前通過配置文件的方式來定義邏輯庫和相關(guān)配置:?
  MYCAT_HOME/conf/schema.xml中定義邏輯庫,表、分片節(jié)點等內(nèi)容;?
  MYCAT_HOME/conf/rule.xml中定義分片規(guī)則;?
  MYCAT_HOME/conf/server.xml中定義用戶以及系統(tǒng)相關(guān)變量,如端口等。

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

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

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

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

配置 MySQL 主從

  • 在2臺服務器上分別安裝、配置mariadb,具體步驟請參閱:https://blog.csdn.net/gaofei0428/article/details/103829676?spm=1001.2014.3001.5501
  • 首先在主數(shù)據(jù)庫端 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=mydata
    replicate-do-db=mydata

  • lower_case_table_names=1? ?開啟大小寫匹配
  • 注意需要同步的數(shù)據(jù)庫必須事先存在

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 啟動無誤后在然后在從服務器 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? ? 開啟只讀模式,防止數(shù)據(jù)回寫,不會影響 slave 同步復制
  • lower_case_table_names=1? ?開啟大小寫匹配

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 重啟 從數(shù)據(jù)庫服務后進行以下操作
  • 停止從服務器的slave,創(chuàng)建slave數(shù)據(jù)庫用戶
  • 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”

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 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 “show slave status”

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 測試

  • 首先導出主服務器 192.168.2.3 的所有庫的備份

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

  • 然后在從服務器 192.168.2.5 導入

  • mysql -uroot -p

  • 在主數(shù)據(jù)庫端 192.168.2.3 添加一些數(shù)據(jù),觀測從數(shù)據(jù)庫是否同步

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 在從服務器端查看

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 如果同步出錯,需要在從服務器 stop slave,然后重新 change master?

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 使用 slave 用戶登陸測試

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離


  • 回到 mycat 服務器 192.168.2.2

  • 嘗試登陸
  • mysql -uroot -p123456 -h192.168.2.2 -P8066
  • 8066 為 mycat 運行時的端口號

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 測試讀寫分離

  • mysql -uroot -p123456 -h192.168.2.2 -P9066 -e “show @@datasource”
  • 9066為 mycat?管理端口
  • select * from mydata.mylist;

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 寫入數(shù)據(jù)或者更改數(shù)據(jù)

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

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

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

  • systemctl stop mariadb.service

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 在 192.168.2.2 上嘗試寫入數(shù)據(jù)
  • insert into mydata.mylist values(7,’gf’);

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 在 主服務器 192.168.2.3 上查看

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 開啟 從服務器 192.168.2.5

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 模擬 主服務器 192.168.2.3 宕機

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 查詢正常,嘗試寫入數(shù)據(jù)

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 查詢正常但是不能寫入

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離


  • 添加多個庫
  • vim?cat /usr/local/mycat/conf/server.xml
  • ??? ?
    ?? ??mydata,WordPress

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

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

  • ?

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

  • 添加完重啟服務
  • /usr/local/mycat/bin/mycat restart
  • tail /usr/local/mycat/logs/wrpper.log

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離

一起聊聊Mycat實現(xiàn) Mysql 集群讀寫分離


  • 報錯處理
    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視頻教程

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊14 分享