柚子快報(bào)邀請(qǐng)碼778899分享:數(shù)據(jù)庫(kù)中間件Mycat介紹詳解
柚子快報(bào)邀請(qǐng)碼778899分享:數(shù)據(jù)庫(kù)中間件Mycat介紹詳解
1. Mycat介紹1.1. 什么是Mycat1.2. 使用Mycat后的結(jié)構(gòu)圖1.3. 為什么要用Mycat?1.4. Mycat能干什么?1.4.1. 讀寫(xiě)分離1.4.2. 數(shù)據(jù)分片1.4.3. 多數(shù)據(jù)源整合
1.5. Mycat原理1.6. 默認(rèn)端口1.7. MySQL主從模式搭建實(shí)例(重)1.7.1. 基于Docker的MySQL主從復(fù)制搭建1.7.1.1. 拉取MySQL 5.7鏡像文件1.7.1.2. 創(chuàng)建和啟動(dòng)主從容器1.7.1.3. 配置Master(主)1.7.1.4. 配置Slave(從)1.7.1.5. 鏈接Master(主)和Slave(從)1.7.1.6.主從復(fù)制排錯(cuò)1.7.1.7. 測(cè)試主從復(fù)制
1.7.2. 準(zhǔn)備:在Master主庫(kù)和Slave從庫(kù)都需要完成
下一篇:
Mycat安裝與啟動(dòng)
1. Mycat介紹
1.1. 什么是Mycat
Mycat 是基于Java語(yǔ)言編寫(xiě)的數(shù)據(jù)庫(kù)中間件。 Mycat也是基于阿里開(kāi)源的Cobar產(chǎn)品而研發(fā),具有穩(wěn)定性,可靠性。 其核心功能就是分庫(kù)分表,配合數(shù)據(jù)庫(kù)的主從模式還可以實(shí)現(xiàn)讀寫(xiě)分離。 Mycat官網(wǎng):http://www.Mycat.org.cn/ Mycat下載:http://dl.Mycat.org.cn/ 注:互聯(lián)網(wǎng)大多數(shù)應(yīng)用的性能瓶頸都是數(shù)據(jù)庫(kù)的瓶頸,數(shù)據(jù)庫(kù)要承擔(dān)大量的數(shù)據(jù)交互。特別是我們的數(shù)據(jù)庫(kù)還是關(guān)系型數(shù)據(jù)庫(kù),性能比較差,大數(shù)據(jù)量下性能還是非常差。(十萬(wàn)級(jí)別數(shù)據(jù)性能)
1.2. 使用Mycat后的結(jié)構(gòu)圖
1.3. 為什么要用Mycat?
Java與數(shù)據(jù)庫(kù)緊耦合;高訪問(wèn)量高并發(fā)對(duì)數(shù)據(jù)庫(kù)的壓力;讀寫(xiě)請(qǐng)求數(shù)據(jù)不一致。
1.4. Mycat能干什么?
1.4.1. 讀寫(xiě)分離
原理: 需要搭建主從模式,讓主數(shù)據(jù)庫(kù)(Master)處理事務(wù)性增、刪、改操作(INSERT、DELETE、UPDATE),而從數(shù)據(jù)庫(kù)(Slave)處理查詢(SELECT)操作。 Mycat配合數(shù)據(jù)庫(kù)本身的復(fù)制功能,可以解決讀寫(xiě)分離的問(wèn)題。
1.4.2. 數(shù)據(jù)分片
數(shù)據(jù)庫(kù)分布式。 分庫(kù): 分表: 一張表的數(shù)據(jù)量太大,將表中的數(shù)據(jù)進(jìn)行拆分,如user表拆分成:user_1、user_2、user_3等表。這些表也不一定存放在一個(gè)數(shù)據(jù)庫(kù)中,可以將它們存放在不同的數(shù)據(jù)庫(kù)中。這樣做也形成了新的問(wèn)題,怎么去哪個(gè)數(shù)據(jù)庫(kù)表中查詢用戶?這就需要Mycat了,我們Java代碼只要訪問(wèn)Mycat就行,Mycat通過(guò)配置(分配規(guī)則)去處理。 垂直拆分(分庫(kù))、水平拆分(分表)、垂直+水平拆分(分庫(kù)分表)
1.4.3. 多數(shù)據(jù)源整合
1.5. Mycat原理
Mycat 的原理中最重要的一個(gè)動(dòng)詞是“攔截”,它攔截了用戶發(fā)送過(guò)來(lái)的 SQL 語(yǔ)句,首先對(duì) SQL語(yǔ)句做了一些特定的分析:如分片分析、路由分析、讀寫(xiě)分離分析、緩存分析等,然后將此 SQL 發(fā)往后端的真實(shí)數(shù)據(jù)庫(kù),并將返回的結(jié)果做適當(dāng)?shù)奶幚?,最終再返回給用戶。 原理: 應(yīng)用向Mycat發(fā)送SQL, Mycat攔截SQL,經(jīng)過(guò)各種分析,然后發(fā)給相應(yīng)的數(shù)據(jù)源進(jìn)行處理。 數(shù)據(jù)源將處理結(jié)果再響應(yīng)給Mycat,Mycat經(jīng)過(guò)各種處理,最后響應(yīng)給應(yīng)用。 上圖分析: (1)應(yīng)用向Mycat發(fā)送查詢orders訂單的SQL,條件是prov=zhejiang。 (2)Mycat經(jīng)過(guò)條件分析查找滿足條件的數(shù)據(jù)源dn1。 (3)dn1處理完SQL后,將處理結(jié)果響應(yīng)給Mycat,Mycat再經(jīng)過(guò)處理響應(yīng)給應(yīng)用。
這種方式把數(shù)據(jù)庫(kù)的分布式從代碼中解耦出來(lái),程序員察覺(jué)不出來(lái)后臺(tái)使用 Mycat 還是MySQL。
1.6. 默認(rèn)端口
MySQL默認(rèn)端口是:3306 Mycat默認(rèn)端口是:8066 Tomcat默認(rèn)端口是:8080 Oracle默認(rèn)端口是:1521 nginx默認(rèn)端口是:80 http協(xié)議默認(rèn)端口是:80 Redis默認(rèn)端口是:6379
1.7. MySQL主從模式搭建實(shí)例(重)
1.7.1. 基于Docker的MySQL主從復(fù)制搭建
為什么基于Docker搭建?
資源有限;虛擬機(jī)搭建對(duì)機(jī)器配置有要求,并且安裝MySQL步驟繁瑣;一臺(tái)機(jī)器上可以運(yùn)行多個(gè)Docker容器;Docker容器之間相互獨(dú)立,有獨(dú)立IP,互不沖突;Docker使用步驟簡(jiǎn)單,啟動(dòng)容器在秒級(jí)別。
1.7.1.1. 拉取MySQL 5.7鏡像文件
docker pull mysql:5.7
1.7.1.2. 創(chuàng)建和啟動(dòng)主從容器
設(shè)置目錄: 為了使MySQL的數(shù)據(jù)保持在宿主機(jī)上,先建立數(shù)據(jù)庫(kù)存儲(chǔ)目錄:
mkdir -pv /root/docker/mysql/data
建立主服務(wù)器的配置目錄
mkdir -pv /root/docker/mysql/data/master
建立從服務(wù)器的配置目錄
mkdir -pv /root/docker/mysql/data/slave
Master(主):
docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
Slave(從):
docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
注: Master對(duì)外映射的端口是3306,Slave對(duì)外映射的端口是3307。因?yàn)镈ocker容器是相互獨(dú)立的,每個(gè)容器有其獨(dú)立的IP,所以不同容器使用相同的端口并不會(huì)沖突。這里我們應(yīng)該盡量使用MySQL默認(rèn)的3306端口,否則可能會(huì)出現(xiàn)無(wú)法通過(guò)IP連接Docker容器內(nèi)MySQL的問(wèn)題。
開(kāi)放3306端口:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
測(cè)試: Docker ps查看主從MySQL,并用Navicat等工具測(cè)試連接主從MySQL。
1.7.1.3. 配置Master(主)
進(jìn)入主容器:
docker exec -it mysql-master /bin/bash
切換到/etc/mysql目錄下
cd /etc/mysql
對(duì)my.cnf進(jìn)行編輯
vi my.cnf
此時(shí)會(huì)報(bào)出bash: vi: command not found,需要我們?cè)赿ocker容器內(nèi)部自行安裝vim。
apt-get install vim
需要先執(zhí)行 apt-get update命令,這個(gè)命令的作用是:同步/etc/apt/sources.list和/etc/apt/sources.list.d中列出的源的索引,這樣才能獲取到最新的軟件包。 再執(zhí)行apt-get install vim,就可以安裝vim了: 在my.cnf中添加如下配置:
[mysqld]
server-id=100 ## 同一局域網(wǎng)內(nèi)要唯一,且要小于Slave的server_id
log-bin=mysql-bin ## 開(kāi)啟二進(jìn)制日志功能,可以隨便取(關(guān)鍵),會(huì)生成一個(gè)
mysql-bin.000001的日志文件,Slave就是來(lái)讀取該日志文件進(jìn)行同步。
重啟服務(wù): 配置完成之后,需要重啟MySQL服務(wù)使配置生效。
systemctl restart mysqld
或者
service mysql restart
重啟mysql服務(wù)時(shí)會(huì)使得docker容器停止,我們還需要啟動(dòng)容器
docker start mysql-master
對(duì)Slave授權(quán)同步 在Master數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)同步用戶,授予用戶slave的REPLICATION SLAVE權(quán)限和REPLICATION CLIENT權(quán)限(必須嗎?),用于在主從庫(kù)之間同步數(shù)據(jù)。 #創(chuàng)建slave用戶及密碼
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
#授權(quán)
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
#二合一
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
在mysql-master中查看日志:/var/lib/mysql
1.7.1.4. 配置Slave(從)
和配置Master(主)一樣,在Slave配置文件my.cnf中添加如下配置:
[mysqld]
server-id=101 ## 設(shè)置server_id,且要大于主庫(kù)的server_id,注意要唯一
log-bin=mysql-slave-bin ## 開(kāi)啟二進(jìn)制日志功能,以備Slave作為其它Slave的Master時(shí)使用
relay-log=edu-mysql-relay-bin ## relay_log配置中繼日志
配置完成后也需要重啟mysql服務(wù)和docker容器,操作和配置Master(主)一致。 注:不需要開(kāi)放Slave訪問(wèn)授權(quán)
1.7.1.5. 鏈接Master(主)和Slave(從)
(1)在Master進(jìn)入mysql,執(zhí)行:
show master status;
說(shuō)明:File和Position字段的值后面將會(huì)用到,在后面的操作完成之前,需要保證Master庫(kù)不能做任何操作,否則將會(huì)引起狀態(tài)變化,F(xiàn)ile和Position字段的值變化。
(2)在Slave中進(jìn)入mysql,執(zhí)行:
change master to master_host='192.168.26.130', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;
簡(jiǎn)化:
change master to master_host='192.168.186.129',
master_user='slave',
master_password='123456',
master_log_file='mysql-bin.000001';
說(shuō)明: master_host=‘192.168.26.130’ 對(duì)應(yīng)主庫(kù)地址 master_user=‘slave’ 訪問(wèn)主庫(kù)的用戶名 master_password=‘123456’ 密碼 master_port=3306 端口號(hào) master_log_file=‘mysql-bin.000002’ 讀取的日志文件(對(duì)應(yīng)Master主機(jī)中的日志文件)
命令說(shuō)明: master_host :Master的地址,指的是容器的獨(dú)立ip,可以通過(guò)docker inspect –format=‘{{.NetworkSettings.IPAddress}}’ 容器名稱|容器id查詢?nèi)萜鞯膇p master_port:Master的端口號(hào),指的是容器的端口號(hào) master_user:用于數(shù)據(jù)同步的用戶 master_password:用于同步的用戶的密碼 master_log_file:指定 Slave 從哪個(gè)日志文件開(kāi)始復(fù)制數(shù)據(jù),即上文中提到的 File 字段的值 master_log_pos:從哪個(gè) Position 開(kāi)始讀,即上文中提到的 Position 字段的值 master_connect_retry:如果連接失敗,重試的時(shí)間間隔,單位是秒,默認(rèn)是60秒。
(3)在Slave 中的mysql終端執(zhí)行:
show slave status \G; #查看主從同步狀態(tài),\G格式
正常情況下,SlaveIORunning 和 SlaveSQLRunning 都是No,因?yàn)槲覀冞€沒(méi)有開(kāi)啟主從復(fù)制過(guò)程。 (4)開(kāi)啟主從復(fù)制命令 start slave; #關(guān)閉主從復(fù)制:stop slave; 然后再次查詢主從同步狀態(tài):show slave status \G;。 說(shuō)明: SlaveIORunning 和 SlaveSQLRunning 都是Yes,說(shuō)明主從復(fù)制已經(jīng)開(kāi)啟。 此時(shí)可以測(cè)試數(shù)據(jù)同步是否成功。
1.7.1.6.主從復(fù)制排錯(cuò)
使用start slave;開(kāi)啟主從復(fù)制過(guò)程后,如果SlaveIORunning一直是Connecting,則說(shuō)明主從復(fù)制一直處于連接狀態(tài),這種情況一般是下面幾種原因造成的,我們可以根據(jù)Last_IO_Error提示予以排除。
網(wǎng)絡(luò)不通——檢查ip,端口密碼不對(duì)——檢查是否創(chuàng)建用于同步的用戶和用戶密碼是否正確pos不對(duì)——檢查Master的 Position
注意: 如果在排錯(cuò)中出現(xiàn)Error錯(cuò)誤是UUIDs錯(cuò)誤,則表示主從UUIDs是相同的,最大可能性就是文件是復(fù)制的,所以產(chǎn)生的UUIDs是相同的。 解決:先退出mysql,再編輯:vim /var/lib/mysql/auto.cnf,修改里面的編碼即可。
1.7.1.7. 測(cè)試主從復(fù)制
測(cè)試主從復(fù)制方式就十分多了,最簡(jiǎn)單的是在Master創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),然后檢查Slave是否存在此數(shù)據(jù)庫(kù)。 (1)在Master主庫(kù)中創(chuàng)建db_abc庫(kù): (2)在Slave從庫(kù)中查看所有數(shù)據(jù)庫(kù): 以上我們就實(shí)現(xiàn)了MySQL的主從備份功能,接下來(lái)我們開(kāi)始安裝Mycat。
1.7.2. 準(zhǔn)備:在Master主庫(kù)和Slave從庫(kù)都需要完成
防火墻都開(kāi)放3306端口;(或關(guān)閉防火墻) #將3306加入防火墻
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#關(guān)閉防火墻
systemctl stop firewalld;
保證root用戶可以被Mycat訪問(wèn)(給權(quán)限);在Mycat中通過(guò)Master主庫(kù)的root用戶訪問(wèn)Master主庫(kù)。
Grant all privileges on *.* to ‘root’@’%’ identified by ‘root’ with grant option;
Flush privileges;
下一篇:Mycat安裝與啟動(dòng)
柚子快報(bào)邀請(qǐng)碼778899分享:數(shù)據(jù)庫(kù)中間件Mycat介紹詳解
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。