共計 5883 個字符,預(yù)計需要花費 15 分鐘才能閱讀完成。
這篇文章主要介紹“怎么理解 Mycat 讀寫分離”,在日常操作中,相信很多人在怎么理解 Mycat 讀寫分離問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么理解 Mycat 讀寫分離”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學(xué)習(xí)吧!
1 MySQL 讀寫分離的概述
Mysql 作為目前世界上使用最廣泛的免費數(shù)據(jù)庫,相信所有從事系統(tǒng)運維的工程師都一定接觸過。但在實際的生產(chǎn)環(huán)境中,由單臺 Mysql 作為獨立的數(shù)據(jù)庫是完全不能滿足實際需求的,無論是在安全性,高可用性以及高并發(fā)等各個方面。
因此,一般來說都是通過主從復(fù)制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離(MySQL-Proxy/Amoeba)來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力,這樣的方案來進行部署與實施的。
1.1 讀寫分離工作原理:
基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫處理 SELECT 查詢操作。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。
數(shù)據(jù)內(nèi)部交換過程:
1.2 為什么要讀寫分離:
1)面對越來越大的訪問壓力,單臺的服務(wù)器的性能成為瓶頸,需要分擔(dān)負(fù)載;
2)主從只負(fù)責(zé)各自的寫和讀,極大程度的緩解 X 鎖和 S 鎖爭用;
3)從庫可配置 myisam 引擎,提升查詢性能以及節(jié)約系統(tǒng)開銷;
4)增加冗余,提高可用性。
1.3 實現(xiàn)讀寫分離的方式:
一般有兩種方式實現(xiàn)
1)應(yīng)用程序?qū)訉崿F(xiàn),網(wǎng)站的程序?qū)崿F(xiàn);
2)應(yīng)用程序?qū)訉崿F(xiàn)指的是在應(yīng)用程序內(nèi)部及連接器中實現(xiàn)讀寫分離。
優(yōu)點:
A:應(yīng)用程序內(nèi)部實現(xiàn)讀寫分離,安裝既可以使用;
B:減少一定部署難度;
C:訪問壓力在一定級別以下,性能很好。
缺點:
A:架構(gòu)一旦調(diào)整,代碼要跟著變;
B:難以實現(xiàn)高級應(yīng)用,如自動分庫,分表;
C:無法適用大型應(yīng)用場景。
中間件層實現(xiàn)
中間件層實現(xiàn)是指在外部中間件程序?qū)崿F(xiàn)讀寫分離
常見的中間件程序:
Cobar:
阿里巴巴 B2B 開發(fā)的關(guān)系型分布式系統(tǒng),管理將近 3000 個 MySQL 實例。在阿里經(jīng)受住了考驗,后面由于作者的走開的原因 cobar 沒有人維護了,阿里也開發(fā)了 tddl 替代 cobar。
MyCAT:
社區(qū)愛好者在阿里 cobar 基礎(chǔ)上進行二次開發(fā),解決了 cobar 當(dāng)時存在的一些問題,并且加入了許多新的功能在其中。目前 MyCAT 社區(qū)活躍度很高,目前已經(jīng)有一些公司在使用 MyCAT。總體來說支持度比較高,也會一直維護下去,
OneProxy:
數(shù)據(jù)庫界大牛,前支付寶數(shù)據(jù)庫團隊領(lǐng)導(dǎo)樓總開發(fā),基于 mysql 官方的 proxy 思想利用 c 進行開發(fā)的,OneProxy 是一款商業(yè)收費的中間件,樓總舍去了一些功能點,專注在性能和穩(wěn)定性上。有朋友測試過說在高并發(fā)下很穩(wěn)定。
Vitess:
這個中間件是 Youtube 生產(chǎn)在使用的,但是架構(gòu)很復(fù)雜。與以往中間件不同,使用 Vitess 應(yīng)用改動比較大要使用他提供語言的 API 接口,我們可以借鑒他其中的一些設(shè)計思想。
Kingshard:
Kingshard 是前 360Atlas 中間件開發(fā)團隊的陳菲利用業(yè)務(wù)時間用 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)點:
A:架構(gòu)設(shè)計更靈活;
B:可以在程序上實現(xiàn)一些高級控制,如:透明化水平拆分,failover, 監(jiān)控;
C:可以依靠些技術(shù)手段提高 mysql 性能;
D:對業(yè)務(wù)代碼的影響小,同時也安全。
缺點:
需要一定的開發(fā)運維團隊的支持。
2 什么是 MYCAT
一個徹底開源的,面向企業(yè)應(yīng)用開發(fā)的大數(shù)據(jù)庫集群;
支持事務(wù)、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)品。
3 服務(wù)安裝與配置
實驗架構(gòu)
服務(wù)器
IP
說明
xuegod65
192.168.1.65
mycat 服務(wù)器,連接數(shù)據(jù)庫時,連接此服務(wù)器
xuegod63
192.168.1.63
物理數(shù)據(jù)庫 1,master
xuegod64
192.168.1.64
物理數(shù)據(jù)庫 2,slave
MyCAT 有提供編譯好的安裝包,支持 windows、Linux、Mac、Solaris 等系統(tǒng)上安裝與運行。官方下載主頁 http://www.mycat.io。
3.1 文件結(jié)構(gòu)
linux 下可以下載 Mycat-server-xxxxx.linux.tar.gz 解壓在某個目錄下,注意目錄不能有空格,
在 Linux(Unix) 下,建議放在 /usr/local/Mycat 目錄下,
目錄結(jié)構(gòu)
目錄
說明
bin
mycat 命令,啟動、重啟、停止等
catlet
catlet 為 Mycat 的一個擴展功能
conf
Mycat 配置信息, 重點關(guān)注
lib
Mycat 引用的 jar 包,Mycat 是 java 開發(fā)的
logs
日志文件,包括 Mycat 啟動的日志和運行的日志。
配置文件
文件
說明
server.xml
Mycat 的配置文件,設(shè)置賬號、參數(shù)等
schema.xml
Mycat 對應(yīng)的物理數(shù)據(jù)庫和數(shù)據(jù)庫表的配置
rule.xml
Mycat 分片(分庫分表)規(guī)則
3.2 mycat 安裝 (xuegod65)1. 安裝 JDK 1.7 或者以上版本
第一步:下載 jdk-8u131-linux-x64.tar.gz 文件 http://haixi.sfkcn.com:8080/201704/tools/jdk-linux-x64.tar.gz
第二步:新建 /usr/java 文件夾,將 jdk-8u131-linux-x64.tar.gz 放到該文件夾中,并解壓到當(dāng)前目錄下
第三步:配置環(huán)境變量 在 /etc/profile 底部加入如下內(nèi)容:
JAVA_HOME=/usr/java/jdk1.8.0_131
PATH=$JAVA_HOME/bin:$PATH CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
[root@xuegod65 java]# source /etc/profile # 使環(huán)境變量生效
查看 java –version
2. 解壓 mycat 安裝
linux 下可以下載 Mycat-server-xxxxx.linux.tar.gz 解壓到 /usr/local/,注意目錄不能有空格
創(chuàng)建 mycat 用戶,并修改密碼 useradd mycat
修改權(quán)限 chown – R mycat.mycat /usr/local/mycat
配置環(huán)境變量
1) vi /etc/profile, 在系統(tǒng)環(huán)境變量文件中增加
MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH
2) 執(zhí)行 source /etc/profile 命令,使環(huán)境變量生效。
編輯 hosts 文件
192.168.1.63 xuegod63.cn xuegod63
192.168.1.64 xuegod64.cn xuegod64
192.168.1.65 xuegod65.cn xuegod65
4 服務(wù)啟動與啟動設(shè)置
(mycat 的用戶賬號和授權(quán)信息是在 conf/server.xml 文件中配置
[root@xuegod65 ~]#Vim /usr/local/mycat/conf/server.xml
druidparser
user name= root
123456
ha
user
ha
true
參數(shù)說明
user 用戶配置節(jié)點
–name 登錄的用戶名,也就是連接 Mycat 的用戶名,這里就是對于外部應(yīng)用
–password 登錄的密碼,也就是連接 Mycat 的密碼
–schemas 數(shù)據(jù)庫名,這里會和 schema.xml 中的配置關(guān)聯(lián),多個用逗號分開,例如需要這個用戶需要管理兩個數(shù)據(jù)庫 db1,db2,則配置 db1,dbs
–privileges 配置用戶針對表的增刪改查的權(quán)限,具體見文檔吧
編輯 MyCAT 的配置文件 schema.xml,關(guān)于 dataHost 的配置信息如下:
[root@xuegod65 ~]#vim /usr/local/mycat/conf/schema.xml
select user()
以下是一個模版解釋
select user()
balance 屬性負(fù)載均衡類型,目前的取值有 4 種:
balance= 0 , 不開啟讀寫分離機制,所有讀操作都發(fā)送到當(dāng)前可用的 writeHost 上。
balance= 1,全部的 readHost 與 stand by writeHost 參與 select 語句的負(fù)載均衡,簡單的說,當(dāng)雙主雙從模式 (M1 – S1,M2- S2,并且 M1 與 M2 互為主備),正常情況下,M2,S1,S2 都參與 select 語句的負(fù)載均衡。
balance= 2,所有讀操作都隨機的在 writeHost、readhost 上分發(fā)。
balance= 3,所有讀請求隨機的分發(fā)到 wiriterHost 對應(yīng)的 readhost 執(zhí)行,writerHost 不負(fù)擔(dān)讀壓力,注意 balance=3 只在 1.4 及其以后版本有,1.3 沒有。
writeType 屬性,負(fù)載均衡類型,目前的取值有 3 種:
writeType= 0 , 所有寫操作發(fā)送到配置的第一個 writeHost,第一個掛了切到還生存的第二個 writeHost,重新啟動后已切換后的為準(zhǔn),切換記錄在配置文件中:dnindex.properties .
writeType= 1,所有寫操作都隨機的發(fā)送到配置的 writeHost。
writeType= 2,沒實現(xiàn)。
switchType 屬性
-1 表示不自動切換
1 默認(rèn)值,自動切換
2 基于 MySQL 主從同步的狀態(tài)決定是否切換
5 配置 Mysql 主從
xuegod63 上創(chuàng)建數(shù)據(jù)庫和表,用于實現(xiàn)寫操作:
[root@xuegod63 ~]# mysql -uroot -p123456
mysql create database ha;
mysql use ha;
mysql create table test(id int,name varchar(20));
mysql insert into test values(1, man
授權(quán)給 mycat 登陸數(shù)據(jù)庫使用的帳號
mysql grant all privileges on *.* to mycat@ % identified by 123456
mysql grant replication slave on *.* to slave@ 192.168.1.% identified by 123456
mysql flush privileges;
mysqldump –uroot –p123456 -B ha ha.sql # 導(dǎo)出給從庫
scp ha.sql xuegod64.cn:/root
[root@xuegod64 ~]# vim /etc/my.cnf
log-bin=mysql-bin-master # 啟用二進制日志
server-id=1 #本機數(shù)據(jù)庫 ID 標(biāo)示
binlog-do-db=HA #可以被從服務(wù)器復(fù)制的庫, 二進制需要同步的數(shù)據(jù)庫名
binlog-ignore-db=mysql # 不可以被從服務(wù)器復(fù)制的庫
如需關(guān)閉密碼強度審計,在 my.cnf 添加 validate-password=off
[root@xuegod64 ~]# systemctl restart mysqld
xuegod64 上導(dǎo)入數(shù)據(jù)庫和表,用于實現(xiàn)讀操作:
[root@xuegod64 ~]# mysql -uroot -p123456 ha.sql
授權(quán)給 mycat 登陸數(shù)據(jù)庫使用的帳號
mysql grant all privileges on *.* to mycat@ % identified by 123456
mysql flush privileges;
[root@xuegod64 ~]# vim /etc/my.cnf
server-id=2 #本機數(shù)據(jù)庫 ID 標(biāo)示
[root@xuegod64 ~]# systemctl restart mysqld
mysql stop slave; # 停止 slave
mysql change master to master_host= 192.168.1.63 ,master_user= slave ,master_password= 123456
mysql start slave; # 啟動 slave
mysql show slave status\G 查看狀態(tài),有兩個 yes 主從同步成功!
啟動服務(wù) mycat 服務(wù)
[root@xuegod65~]# /usr/local/mycat/bin/mycat start
測試讀寫分離
6 當(dāng)我們 slave 掛掉后咋樣呢
模擬故障:從服務(wù)器掛掉了
[root@xuegod64 ~]# systemctl stop mysqld
在客戶端上測試讀寫
[root@xuegod66 ~]# mysql -uroot -p123456 -h 192.168.1.65-P8066
mysql use ha;
mysql select * from t1;
說明讀操作的路由切換到 master 上了,對外沒有任何影響!
7 當(dāng)我們 master 掛掉后咋樣呢
模擬故障:主服務(wù)器掛掉了
[root@xuegod63 ~]# systemctl stop mysqld
在客戶端上測試讀寫
[root@xuegod66 ~]# mysql -uroot -p123456 -h 192.168.1.65 -P8066
mysql create table t3(id int);
ERROR 1184 (HY000): 拒絕連接 #主數(shù)據(jù)庫停止了,是無法寫操作的,但不影響讀.
mysql use ha;
mysql select * from t1;
到此,關(guān)于“怎么理解 Mycat 讀寫分離”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>