共計 7811 個字符,預計需要花費 20 分鐘才能閱讀完成。
這篇文章給大家分享的是有關 Mycat 如何實現 Mysql 集群讀寫分離的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。
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 主服務器 CentOS 7.6
192.168.2.5 從服務器 CentOS 7.6
運行 Mycat 需要 JDK 1.7 或者以上版
下載 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/
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
?xml version= 1.0 encoding= UTF-8 ?
!DOCTYPE mycat:schema SYSTEM schema.dtd
mycat:schema xmlns:mycat= http://io.mycat/ 注意這里的網址,錯寫會啟動失敗!
schema name= mydata checkSQLschema= false sqlMaxLimit= 100 dataNode= dn1
/schema
dataNode name= dn1 dataHost= dthost database= mydata /
dataHost name= dthost maxCon= 500 minCon= 10 balance= 1 writeType= 0 dbType= mysql dbDriver= native switchType= -1 slaveThreshold= 100
heartbeat show slave status /heartbeat
writeHost host= c7_2_3 url= 192.168.2.3:3306 user= mycat password= 123456 寫服務器
/writeHost
writeHost host= c7_2_5 url= 192.168.2.5:3306 user= mycat password= 123456 讀服務器
/writeHost
/dataHost
/mycat:schema
強制所有的讀操作都在讀服務器上運行,只有寫入數據時才切換到寫服務器
注意這里的 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=mydata
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 show 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 -h292.168.2.2 -P8066
8066 為 mycat 運行時的端口號
測試讀寫分離
mysql -uroot -p123456 -h292.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.3 上查看
開啟 從服務器 192.168.2.5
模擬 主服務器 192.168.2.3 宕機
查詢正常, 嘗試寫入數據
查詢正常但是不能寫入
添加多個庫
vim cat /usr/local/mycat/conf/server.xml
!– 多個庫指定標簽用逗號隔開 —
property name= schemas mydata,wordpress /property
vim /usr/local/mycat/conf/schema.xml
schema name= wordpress checkSQLschema= false sqlMaxLimit= 100 dataNode= dn2
/schema
dataNode name= dn2 dataHost= dthost1 database= wordpress /
添加完重啟服務
/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
感謝各位的閱讀!關于“Mycat 如何實現 Mysql 集群讀寫分離”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!