国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)

這篇具有很好參考價值的文章主要介紹了MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)
MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)

一,MyCat入門

1.什么是mycat
官網(wǎng):http://www.mycat.org.cn/

? mycat是數(shù)據(jù)庫中間件

它可以干什么?

  1. 讀寫分離
  2. 數(shù)據(jù)分片:垂直拆分,水平拆分
  3. 多數(shù)據(jù)源整合
2.數(shù)據(jù)庫中間件

? 中間件:是一類連接軟件組件和應用的計算機軟件,以便于軟件各部件之間的溝通。

? 例子:tomcat,kafka,redis等中間件

3.為什么使用macat
  1. java與數(shù)據(jù)庫緊耦合
  2. 高訪問量高并發(fā)對數(shù)據(jù)庫的壓力
  3. 讀寫請求數(shù)據(jù)不一致
4.常見數(shù)據(jù)庫中間件對比
  1. cobar:屬于阿里B2B事業(yè)群,始于2008年,在阿里服役3年多,接管3000+個MySQL數(shù)據(jù)庫的shema,集群日處理在線SQL請求50億次以上,由于cobar發(fā)起人的離職,cobar停止維護
  2. mycat:開源社區(qū)在阿里cobar基礎上進行二次開發(fā),解決了cobar存在的問題,并且加入了許多新的功能在其中
  3. oneproxy:基于MySQL官網(wǎng)的proxy思想利用c進行開發(fā)的,oneproxy是一款商業(yè)收費的中間件。舍去了一些功能,專注在性能和穩(wěn)定性上。
  4. kingshard:由小團隊用go語言開發(fā),需要不斷完善
  5. viress:是YouTube生產(chǎn)在使用,結構很復雜。不支持MySQL原生協(xié)議,使用需要改造成本。
  6. atllas:是360團隊基于MySQL proxy改寫,功能還需完善,高并發(fā)下不穩(wěn)定
  7. maxscale:是mariadb研發(fā)的中間件
  8. MySQLroute:是MySQL官網(wǎng)oracle公司發(fā)布的中間件
5.mycat原理

? mycat的原理中最重要的一個動詞是‘攔截’,它攔截了用戶發(fā)送過來的SQL語句,首先對SQL語句做了一些特定的分析:如分片分析,路由分析,讀寫分離分析,緩存分析等,然后將此SQL發(fā)往后端的真實數(shù)據(jù)庫,并將返回的結構做適當?shù)奶幚?,最終再返回給用戶。
MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)

6.mycat1.X與mycat2.X的功能對比
功能 1.6 2.x
多語句 不支持 支持
blob值 支持一部分 支持
全局二級索引 不支持 支持
任意跨庫join(包含復雜查詢) catlet支持 支持
分片表與分片表JOIN查詢 ER表支持 支持
關聯(lián)子查詢 不支持 支持一部分
分庫同時分表 不支持 支持
存儲過程 支持固定形式的 支持更多
支持邏輯視圖 不支持 支持
支持物理視圖 支持 支持
批量插入 不支持 支持
執(zhí)行計劃管理 不支持 支持
路由注釋 支持 支持
集群功能 支持 支持更多集群類型
自動hash分片算法 不支持 支持
支持第三方監(jiān)控 支持mycat-web 支持普羅米斯,kafka日志等監(jiān)控
流式合拼結果集 支持 支持
范圍查詢 支持 支持
單表映射物理表 不支持 支持
XA事務 弱XA 支持,事務自動恢復
支持MySQL8 需要更改mysql8的服務器配置支持 支持
虛擬表 不支持 支持
joinClustering 不支持 支持
union all語法 不支持 支持
BKAJoin 不支持 支持
優(yōu)化器注釋 不支持 支持
ER表 支持 支持
全局序列號 支持 支持
保存點 不支持 支持
離線遷移 支持 支持(實驗)
增量遷移 CRC32算法支持 BINLOG追平(實驗)
安全停機 不支持 支持(實驗)
HAProxy協(xié)議 不支持 支持
會話粘滯 update后select會粘滯 update后select會粘滯且支持設置時間
全局表插入支持全局序列號 不支持 支持
全局表插入支持主表插入自增結果作為序列號 不支持 支持
外部調(diào)用的分片算法 不支持但可定制 支持

二,MyCat安裝和管理命令

提前安裝JDK

[root@localhost ~]# tar -zxf jdk-8u171-linux-x64.tar.gz
[root@localhost ~]# ls
anaconda-ks.cfg  jdk-8u171-linux-x64.tar.gz        mysql80-community-release-el7-7.noarch.rpm
jdk1.8.0_171     mycat2-install-template-1.20.zip  original-ks.cfg
[root@localhost ~]# mv jdk1.8.0_171/ /usr/local/java
[root@localhost ~]# vi /etc/profile
PATH=$PATH:/usr/local/java/bin

[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
1.下載安裝包
tar(zip)包 :
http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template1.20.zip

jar 包 :
http://dl.mycat.org.cn/2.0/1.21-release/ (下載最新的 jar 包)

MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)

2.上傳服務器解壓
[root@localhost ~]# ls
anaconda-ks.cfg                                mycat2-install-template-1.20.zip            original-ks.cfg
mycat2-1.21-release-jar-with-dependencies.jar  mysql80-community-release-el7-7.noarch.rpm
[root@localhost ~]# unzip mycat2-install-template-1.20.zip
[root@localhost ~]# mv mycat /usr/local/
[root@localhost mycat]# ls
bin  conf  lib  logs
[root@localhost mycat]# mv /root/mycat2-1.21-release-jar-with-dependencies.jar ./lib/
[root@localhost mycat]# chmod 777 -R ./lib/
3.為mycat連接的MySQL添加用戶
#直接將root改為所有地址可以登錄,方便,但是在真實環(huán)境中需要根據(jù)權限來創(chuàng)建用戶
mysql> 
4.修改mycat的portotype的配置

? 啟動mycat之前需要確認prototype數(shù)據(jù)源所對應的mysql數(shù)據(jù)庫配置,修改對應的 user(用戶),password(密碼),url中的ip

[root@localhost mycat]# vi conf/datasources/prototypeDs.datasource.json
{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ_WRITE",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"prototypeDs",
        "password":"1234.Com",
        "type":"JDBC",
        "url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
        "user":"root",
        "weight":0
}
5.啟動MyCat
[root@localhost mycat]# cd bin/
[root@localhost bin]# chmod 555 *
[root@localhost bin]# ./mycat start
6.MyCat管理
./mycat start #開啟
./mycat stop	#關閉
./mycat restart 	#重啟
./mycat status	#查看狀態(tài)
./mycat console	#前臺運行
./mycat pause	#暫停
7.mycat登錄
[root@localhost bin]# mysql -uroot -p1234.Com -P 8066 -h 192.168.2.1
選項:
-u:用戶名
-p:密碼
-P:端口
-h:IP地址
[root@localhost bin]# mysql -uroot -p1234.Com -P 9066	#后臺管理端口

三,MyCat名詞概念描述

1.分庫分表

? 按照一定規(guī)則把數(shù)據(jù)庫中的表拆分為多個帶有數(shù)據(jù)庫實例,物理庫,物理表訪問路徑的分表

解讀:

? 分庫:一個電商項目,分為用戶庫、訂單庫等等。

? 分表:一張訂單表數(shù)據(jù)數(shù)百萬,達到 MySQL 單表瓶頸,分到多個數(shù)據(jù)庫中 的多張表

2.邏輯庫

? 數(shù)據(jù)庫代理中的數(shù)據(jù)庫,它可以包含多個邏輯表

? 解讀:Mycat 里定義的庫,在邏輯上存在,物理上在 MySQL 里并不存在。有可能是 多個 MySQL 數(shù)據(jù)庫共同組成一個邏輯庫。類似多個小孩疊羅漢穿上外套,扮演一個大 人。

3.邏輯表

? 數(shù)據(jù)庫代理中的表,它可以映射代理連接的數(shù)據(jù)庫中的表(物理表)

? 解讀:Mycat 里定義的表,在邏輯上存在,可以映射真實的 MySQL 數(shù)據(jù)庫的表???以一對一,也可以一對多。

4.物理庫

? 數(shù)據(jù)庫代理連接的數(shù)據(jù)庫中的庫,比如mysql上的information_schema

? 解讀:MySQL 真實的數(shù)據(jù)庫

5.物理表

? 數(shù)據(jù)庫代理連接的數(shù)據(jù)庫中的表,比如mysql上的information_schema.TABLES

? 解讀:MySQL 真實的數(shù)據(jù)庫中的真實數(shù)據(jù)表。

6.分庫分表中間件

? 實現(xiàn)了分庫分表功能的中間件,功能上相當于分庫分表型數(shù)據(jù)庫中的計算節(jié)點

?

7.分庫分表型數(shù)據(jù)庫

? 以分庫分表技術構建的數(shù)據(jù)庫,在組件上一般有計算節(jié)點,存儲節(jié)點.它的存儲節(jié)點一般是一個可獨立部署的數(shù)據(jù)庫產(chǎn)品,比如mysql

8.拆分鍵

? 即分片鍵,描述拆分邏輯表的數(shù)據(jù)規(guī)則的字段

? 解讀:比如訂單表可以按照歸屬的用戶 id 拆分,用戶 id 就是

9.分區(qū)

? 一般指數(shù)據(jù)分區(qū),計算節(jié)點上,水平分片表拆分數(shù)據(jù)的最小區(qū)域

?

10.分區(qū)鍵

? 當使用等值查詢的時候,能直接映射一個分區(qū)的拆分鍵

?

11.系統(tǒng)表,元數(shù)據(jù)表

? 一般指mysql中的information_schema,performance_schema,mysql三個庫下的表

12.物理分表

? 指已經(jīng)進行數(shù)據(jù)拆分的,在數(shù)據(jù)庫上面的物理表,是分片表的一個分區(qū)

? 解讀:多個物理分表里的數(shù)據(jù)匯總就是邏輯表的全部數(shù)據(jù)

13.物理分庫

? 一般指包含多個物理分表的庫

? 解讀:參與數(shù)據(jù)分片的實際數(shù)據(jù)庫

14.單庫分表

? 在同一個數(shù)據(jù)庫下同一個庫表拆分成多個物理分表

?

15.分庫

? 一般指通過多個數(shù)據(jù)庫拆分分片表,每個數(shù)據(jù)庫一個物理分表,物理分庫名字相同

? 解讀:分庫是個動作,需要多個數(shù)據(jù)庫參與。就像多個數(shù)據(jù)庫是多個盤子,分庫就是 把一串數(shù)據(jù)葡萄,分到各個盤子里,而查詢數(shù)據(jù)時,所有盤子的葡萄又通過 Mycat2 組 成了完整的一串葡萄。

16.分片表,水平分片表

? 按照一定規(guī)則把數(shù)據(jù)拆分成多個分區(qū)的表,在分庫分表語境下,它屬于邏輯表的一種

17.單表

? 沒有分片,沒有數(shù)據(jù)冗余的表,

? 解讀:沒有拆分數(shù)據(jù),也沒有復制數(shù)據(jù)到別的庫的表。

18.全局表,廣播表

? 每個數(shù)據(jù)庫實例都冗余全量數(shù)據(jù)的邏輯表.

? 它通過表數(shù)據(jù)冗余,使分片表的分區(qū)與該表的數(shù)據(jù)在同一個數(shù)據(jù)庫實例里,達到join運算能夠直接在該數(shù)據(jù)庫實例里執(zhí)行.它的數(shù)據(jù)一致一般是通過數(shù)據(jù)庫代理分發(fā)SQL實現(xiàn).也有基于集群日志的實現(xiàn).

? 解讀:例如系統(tǒng)中翻譯字段的字典表,每個分片表都需要完整的字典數(shù)據(jù)翻譯字段。

19.集群

? 多個數(shù)據(jù)節(jié)點組成的邏輯節(jié)點.在mycat2里,它是把對多個數(shù)據(jù)源地址視為一個數(shù)據(jù)源地址(名稱),并提供自動故障恢復,轉移,即實現(xiàn)高可用,負載均衡的組件

? 解讀:集群就是高可用、負載均衡的代名詞

20.數(shù)據(jù)源

? 連接后端數(shù)據(jù)庫的組件,它是數(shù)據(jù)庫代理中連接后端數(shù)據(jù)庫的客戶端

? 解讀:Mycat 通過數(shù)據(jù)源連接 MySQL 數(shù)據(jù)庫

21.schema(庫)

? 在mycat2中配置表邏輯,視圖等的配置

22.物理視圖

? 后端數(shù)據(jù)庫中的視圖

23.邏輯視圖

? 在mycat2中的邏輯視圖是把一個查詢語句視為邏輯表的功能

?

24.前端會話

? 一般指Mycat服務器中,該會話指向連接mycat的客戶端

25.后端會話

? 一般指Mycat服務器中,該會話指向連接數(shù)據(jù)庫的客戶端

26.后端數(shù)據(jù)庫

? 在數(shù)據(jù)庫代理中,數(shù)據(jù)庫代理連接的數(shù)據(jù)庫

27.透傳SQL

? 在數(shù)據(jù)庫代理中,指從客戶端接收的SQL,它不經(jīng)過改動,在代理中直接發(fā)送到后端數(shù)據(jù)庫

28.透傳結果集

? 在數(shù)據(jù)庫代理中,指從后端數(shù)據(jù)庫返回的結果集,不經(jīng)過改動,轉換,寫入到前端會話

?

29.ER表

? 狹義指父子表中的子表,它的分片鍵指向父表的分片鍵,而且兩表的分片算法相同

廣義指具有相同數(shù)據(jù)分布的一組表.

? 解讀:關聯(lián)別的表的子表,例如:訂單詳情表就是訂單表的 ER 表

30.原型庫(prototype)

? 原型庫是 Mycat2 后面的數(shù)據(jù)庫,比如 mysql 庫

? 解讀:原型庫就是存儲數(shù)據(jù)的真實數(shù)據(jù)庫,配置數(shù)據(jù)源時必須指定原型庫

四,MyCat配置文件介紹

1.配置文件
[root@localhost ~]# cd /usr/local/mycat/conf/
[root@localhost conf]# ll
總用量 32
drwxr-xr-x 2 root root   36 628 2021 clusters
drwxr-xr-x 2 root root   41 529 11:01 datasources
-rw-r--r-- 1 root root 3338 35 2021 dbseq.sql
-rw-r--r-- 1 root root  316 112 2021 logback.xml
-rw-r--r-- 1 root root    0 35 2021 mycat.lock
drwxr-xr-x 2 root root   31 628 2021 schemas
drwxr-xr-x 2 root root    6 628 2021 sequences
-rw-r--r-- 1 root root  776 1228 2021 server.json
-rw-r--r-- 1 root root 1643 35 2021 simplelogger.properties
drwxr-xr-x 2 root root  233 628 2021 sql
drwxr-xr-x 2 root root    6 628 2021 sqlcaches
-rw-r--r-- 1 root root   49 35 2021 state.json
drwxr-xr-x 2 root root   28 628 2021 users
-rw-r--r-- 1 root root  211 35 2021 version.txt
-rw-r--r-- 1 root root 4165 113 2022 wrapper.conf

clusters:集群
datasources:數(shù)據(jù)源
server.json:服務配置
user:用戶目錄
2.用戶(user)

? 配置用戶相關信息

1.所在目錄

? mycat /conf/users

2.命名方式

? {用戶名}.user.json

3.配置內(nèi)容
[root@localhost conf]# vi users/root.user.json
{
        "dialect":"mysql",
        "ip":null,
        "password":"123456",
        "transactionType":"xa",
        "username":"root"
}

#字段含義:
#username:用戶名
#password:密碼
#isolation:設置初始化的事務隔離級別
#transactionType:事務類型
可選值:
	proxy 本地事務,在涉及大于 1 個數(shù)據(jù)庫的事務,commit 階段失敗會導致不一致,但是兼容性最好
xa 事務,需要確認存儲節(jié)點集群類型是否支持 XA
	可以通過語句實現(xiàn)切換
	set transaction_policy = 'xa'
	set transaction_policy = 'proxy' 可以通過語句查詢
	SELECT @@transaction_policy
3.數(shù)據(jù)源(datasource)

? 配置mycat連接的數(shù)據(jù)源信息

1.所在目錄

? mycat /conf/datasources

2.命名方式

? {數(shù)據(jù)源名字}.datasource.json

3.配置內(nèi)容
[root@localhost conf]# vi datasources/prototypeDs.datasource.json
{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ_WRITE",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"prototypeDs",
        "password":"1234.Com",
        "type":"JDBC",
        "url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
        "user":"root",
        "weight":0
}

字段含義:
dbtype:數(shù)據(jù)庫類型,mysql
name:用戶名
password:密碼
type:數(shù)據(jù)源類型,默認JDBC
url:訪問數(shù)據(jù)庫地址
idletimeout:空閑連接超時時間
initsqls:初始化sql
initsqlsgetconnection:對于JDBC每次獲取連接是否都執(zhí)行initSqls
instanceType:配置實例只讀還是讀寫 可選值:READ_WRITE,READ,WRITE
4.集群(cluster)

? 配置集群信息

1.所在目錄

? mycat /conf/clusters

2.命名方式

? {集群名字}.clusteer.json

3.配置內(nèi)容
[root@localhost conf]# vi clusters/prototype.cluster.json
{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetry":3,
                "minSwitchTimeInterval":300,
                "slaveThreshold":0
        },
        "masters":[  #配置多個節(jié)點,在主掛的時候會選一個檢測存活的數(shù)據(jù)源作為主節(jié)點
                "prototypeDs"
        ],
        "maxCon":200,
        "name":"prototype",
        "readBalanceType":"BALANCE_ALL",
        "switchType":"SWITCH"
}

字段:
clusterType:集群類型
	可選值:
		single_node:單一節(jié)點
		master_slave:普通主從
		garela_cluster:garela cluster /PXC 集群
		MHAMHA集群
		MGRMGR集群
readBalanceType:查詢負責均衡策略
	可選值:
		BALANCE_ALL(默認值):獲取集群中所有數(shù)據(jù)源
		BALANCE_ALL_READ:獲取集群中允許讀的數(shù)據(jù)源
		BALANCE_READ_WEITE:獲取集群中允許讀寫的數(shù)據(jù)源,但允許讀的數(shù)據(jù)源優(yōu)先
		BALANCE——NODE:獲取集群中允許寫數(shù)據(jù)源,即主節(jié)點中選擇
switchType:切換類型
	可選值:
		NOT_SWITCH:不進行主從切換
		SWITCH:進行主從切換
5.邏輯庫表(schema)

? 配置邏輯庫表,實現(xiàn)分庫分表

1.所在目錄

? mycat /conf/shemas

2.命名方式

? {庫名}.schema.json

3.配置內(nèi)容
[root@localhost conf]# vi schemas/mysql.schema.json

#庫配置
 "locality":{
                                "schemaName":"mysql",
                                "tableName":"spm_baseline",
                                "targetName":"prototype"
                        }
#schemaName:邏輯庫名
#targetName:目的數(shù)據(jù)源或集群
targetName自動從prototype目標加載test庫下的物理表或者視圖作為單表,prototype必須是MySQL服務器

#單表配置
{
"schemaName": "mysql-test",
"normalTables": {
"role_edges": {
"createTableSQL":null,//可選
"locality": {
"schemaName": "mysql",//物理庫,可選
"tableName": "role_edges",//物理表,可選
"targetName": "prototype"//指向集群,或者數(shù)據(jù)源
}
}

五,搭建讀寫分離

? 我們通過mycat和mycat的主從復制配合搭建數(shù)據(jù)庫的讀寫分離,實現(xiàn)MySQL的高可用性,我們將搭建,一主一從,雙主雙從兩種讀寫分離模式。

MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)

1.搭建一主一從

? 一個主機用于處理所有寫請求,一臺從機負責所有讀請求

1.搭建MySQL數(shù)據(jù)庫主從復制
1.主MySQL配置
[root@localhost ~]# vi /etc/my.cnf
server-id=1
log-bin=mysql-bin
[root@localhost ~]# systemctl restart mysqld
2.其他配置
#設置不要復制的數(shù)據(jù)庫(可以設置為多個)
binlog-ignore-db=dbname
binlog-ignore-db=information_schema
#設置需要復制的數(shù)據(jù)庫
binlog-do-db=dbname
#設置binlog格式
binlog_format=statement
2.從MySQL配置
[root@localhost ~]# vi /etc/my.cnf
server-id=2
log-bin=mysql-bin
[root@localhost ~]# systemctl restart mysqld
3.主MySQL添加授權用戶和二進制日志信息
mysql> grant replication slave on *.* to slave@'%' identified by '1234.Com';
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      438 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

4.在從機上做主從
mysql> change master to master_host='192.168.2.1',master_user='slave',master_password='1234.Com',master_log_pos=438,master_log_file='mysql-bin.000002';
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
 			Slave_IO_Running: Yes		#數(shù)據(jù)傳輸
            Slave_SQL_Running: Yes		#SQL執(zhí)行

5.測試驗證(主MySQL)
mysql> create database mydb1;
Query OK, 1 row affected (0.00 sec)

mysql> use mydb1;
Database changed
mysql> create table mytb1(id int,name varchar(50));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into
    -> mytb1 values(1,'zhangsan');
Query OK, 1 row affected (0.03 sec)

mysql> insert into  mytb1 values(2,'lisi');
Query OK, 1 row affected (0.00 sec)

mysql> select * from mytb1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
+------+----------+
2 rows in set (0.00 sec)

2.配置mycat讀寫分離

1.創(chuàng)建數(shù)據(jù)源
[root@localhost mycat]# mysql -uroot -p123456 -P8066 -h192.168.2.1
mysql> create database mydb1;

[root@localhost mycat]# vi conf/schemas/mydb1.schema.json
{
        "customTables":{},
        "globalTables":{},
        "normalProcedures":{},
        "normalTables":{},
        "schemaName":"mydb1",
        "targetName": "prototype",
        "shardingTables":{},
        "views":{}
}
2.登錄mycat添加數(shù)據(jù)源
[root@localhost mycat]# mysql -uroot -p123456 -P8066 -h192.168.2.1

mysql> /*+ mycat:createDataSource{ "name":"rwSepw","url":"jdbc:mysql://192.168.2.1:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;
Query OK, 0 rows affected (0.02 sec)

mysql>
mysql> /*+ mycat:createDataSource{ "name":"rwSepr","url":"jdbc:mysql://192.168.2.2:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;
Query OK, 0 rows affected (0.03 sec)
#查詢配置數(shù)據(jù)源結果
mysql> /*+ mycat:showDataSources{} */\G

3.更新集群信息,添加dr0從節(jié)點,實現(xiàn)讀寫分離
mysql> /*!mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */;
Query OK, 0 rows affected (0.03 sec)

mysql> /*+ mycat:showClusters{} */;		#查看集群配置文件
+-----------+-------------+-------------------+-------------+----------+---------------+-------------------------------------------+-------------------------------------------+-----------+
| NAME      | SWITCH_TYPE | MAX_REQUEST_COUNT | TYPE        | WRITE_DS | READ_DS       | WRITE_L                                   | READ_L                                    | AVAILABLE |
+-----------+-------------+-------------------+-------------+----------+---------------+-------------------------------------------+-------------------------------------------+-----------+
| prototype | SWITCH      | 2000              | BALANCE_ALL | rwSepw   | rwSepw,rwSepr | io.mycat.plug.loadBalance.BalanceRandom$1 | io.mycat.plug.loadBalance.BalanceRandom$1 | true      |
+-----------+-------------+-------------------+-------------+----------+---------------+-------------------------------------------+-------------------------------------------+-----------+
1 row in set (0.01 sec)
ava.lang.RuntimeException: java.lang.IllegalArgumentException: ignored rw
Sepr

? 修改集群配置文件

[root@localhost mycat]# vi /usr/local/mycat/conf/clusters/prototype.cluster.json
{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetryCount":3,
                "minSwitchTimeInterval":300,
                "showLog":false,
                "slaveThreshold":0.0
        },
        "masters":[
                "rwSepw"
        ],
        "replicas":[
                "rwSepr"
        ],
        "maxCon":2000,
        "name":"prototype",
        "readBalanceType":"BALANCE_ALL",
        "switchType":"SWITCH"
}


readBalanceType
查詢負載均衡策略
	可選值:
	BALANCE_ALL(默認值)
	獲取集群中所有數(shù)據(jù)源
	BALANCE_ALL_READ
	獲取集群中允許讀的數(shù)據(jù)源
	BALANCE_READ_WRITE
	獲取集群中允許讀寫的數(shù)據(jù)源,但允許讀的數(shù)據(jù)源優(yōu)先
	BALANCE_NONE
	獲取集群中允許寫數(shù)據(jù)源,即主節(jié)點中選擇
	
switchType
NOT_SWITCH:不進行主從切換
SWITCH:進行主從切換
4.重啟mycat
[root@localhost mycat]# ./bin/mycat restart
Stopping mycat2...
Stopped mycat2.
Starting mycat2...
5.驗證讀寫分離
在從MySQL上修改數(shù)據(jù)
mysql> update mytb1 set name='wangwu' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

然后使用mycat登錄
查詢來查看數(shù)據(jù)不同

六,雙主雙從讀寫分離

? 一個主機 m1 用于處理所有寫請求,它的從機 s1 和另一臺主機 m2 還有它的從機 s2 負責所有讀請求。當 m1 主機宕機后,m2 主機負責寫請求,m1、m2 互為備機。架構圖 如下

MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)

1.環(huán)境

角色 IP地址
master1 192.168.2.1
slave1 192.168.2.2
master2 192.168.2.3
slave2 192.168.2.4

2.搭建雙主雙從

1.一主一從

根據(jù)上面的讀寫分離的步驟做兩遍

2.雙主雙從

? master1與master2互作主從

1.master1配置
mysql> change master to master_host='192.168.2.3',master_user='slave',master_password='1234.Com',master_log_pos=438,master_log_file='mysql-bin.000001';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
2.master2配置
mysql> change master to master_host='192.168.2.1',master_user='slave',master_password='1234.Com',master_log_pos=6394,master_log_file='mysql-bin.000001';
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
3.測試
查看是否master1創(chuàng)建庫,四臺同步

3.實現(xiàn)多種主從

1.雙主雙從
*m1:主機
*m2:備機,也負責讀
*s1,s2:從機
2.添加兩個數(shù)據(jù)源

? 注意:如果不是從一主一從做的需要添加四個數(shù)據(jù)源

1.登錄mycat操作
/*+ mycat:createDataSource{ "name":"rwSepw2","url":"jdbc:mysql://192.168.2.3:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;

/*+ mycat:createDataSource{ "name":"rwSepr2","url":"jdbc:mysql://192.168.2.4:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"1234.Com" } */;
2.修改集群配置文件
[root@localhost mycat]# vi /usr/local/mycat/conf/clusters/prototype.cluster.json
{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetryCount":3,
                "minSwitchTimeInterval":300,
                "showLog":false,
                "slaveThreshold":0.0
        },
        "masters":[
                "rwSepw","rwSepw2"
        ],
         "replicas":[
                "rwSepr","rwSepr2","rwSepw2"
        ],
        "maxCon":2000,
        "name":"prototype",
        "readBalanceType":"BALANCE_ALL",
  
        "switchType":"SWITCH"
}

七,分庫分表

1.分庫分表原理

? 一個數(shù)據(jù)庫由很多表的構成,每個表對應著不同的業(yè)務,垂直切分是指按照業(yè) 務將表進行分類,分布到不同 的數(shù)據(jù)庫上面,這樣也就將數(shù)據(jù)或者說壓力分擔到不同 的庫上面,如下圖:

MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)

? 系統(tǒng)被切分成了,用戶,訂單交易,支付幾個模塊

2.如何分庫

? 一個問題:在兩臺主機上的兩個數(shù)據(jù)庫中的表,能否關聯(lián)查詢?

? 答案:不可以關聯(lián)查詢。

分庫的原則:有緊密關聯(lián)關系的表應該在一個庫里,相互沒有關聯(lián)關系的表可以分到 不同的庫里。

例子:

#客戶表 rows:20萬
CREATE TABLE customer(
	id INT AUTO_INCREMENT
	NAME VARCHAR(200),
	PRIMARY KEY(id)
);
#訂單表 rows:600萬
CREATE TABLE orders(
	id INT AUTO_INCREMENT,
	order_type INT,
	customer_id INT,
	amount DECIMAL(10,2),
	PRIMARY KEY(id)
);
#訂單詳細表 rows:600萬
CREATE TABLE orders_detail(
	id INT AUTO_INCREMENT,
	detail VARCHAR(2000),
	order_id INT,
	PRIMARY KEY(id)
);
#訂單狀態(tài)字典表 rows:20
CREATE TABLE dict_order_type(
	id INT AUTO_INCREMENT,
	order_type VARCHAR(200),
	PRIMARY KEY(id)				
);

? 以上四個表如何分庫?客戶表分在一個數(shù)據(jù)庫,另外三張都需要關聯(lián)查詢,分在另外 一個數(shù)據(jù)庫。

3.如何分表

1.選擇要拆分的表

? MySQL 單表存儲數(shù)據(jù)條數(shù)是有瓶頸的,單表達到 1000 萬條數(shù)據(jù)就達到了瓶頸,會 影響查詢效率,需要進行水平拆分(分表)進行優(yōu)化。

? 例如:例子中的 orders、orders_detail 都已經(jīng)達到 600 萬行數(shù)據(jù),需要進行分表 優(yōu)化。

2.分庫字段

? 以 orders 表為例,可以根據(jù)不同自字段進行分表

分表字段 效果
id(主鍵,或創(chuàng)建時間) 查詢訂單注重是時效,歷史訂單被查詢的次數(shù)少,如此分片會造成一個節(jié)點訪問多,一個訪問少,不平均
customer_id(客戶id) 根據(jù)客戶id去分,兩個節(jié)點訪問平均,一個客戶的所有訂單都在同一個節(jié)點

4.實現(xiàn)分庫分表

? Mycat2 一大優(yōu)勢就是可以在終端直接創(chuàng)建數(shù)據(jù)源、集群、庫表,并在創(chuàng)建時指定 分庫、分表。與 1.6 版本比大大簡化了分庫分表的操作

1.添加數(shù)據(jù)庫,存儲數(shù)據(jù)源
/*+ mycat:createDataSource{
"name":"dw0",
"url":"jdbc:mysql://192.168.2.1:3306",
"user":"root",
"password":"1234.Com"
} */;

/*+ mycat:createDataSource{
"name":"dr0",
"url":"jdbc:mysql://192.168.2.1:3306",
"user":"root",
"password":"1234.Com"
} */;

/*+ mycat:createDataSource{
"name":"dw1",
"url":"jdbc:mysql://192.168.2.2:3306",
"user":"root",
"password":"1234.Com"
} */;

/*+ mycat:createDataSource{
"name":"dr1",
"url":"jdbc:mysql://192.168.2.2:3306",
"user":"root",
"password":"1234.Com"
} */;
2.添加集群配置

? 把新添加的數(shù)據(jù)源配置成集群

    /*!mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */;

/*!
{mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]}
*/;


3.創(chuàng)建全局表
#添加數(shù)據(jù)庫db1
CREATE DATABASE db1;
#在建表語句中加上關鍵字 BROADCAST(廣播,即為全局表)
CREATE TABLE db1.`travelrecord` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` varchar(100) DEFAULT NULL,
`traveldate` date DEFAULT NULL,
`fee` decimal(10,0) DEFAULT NULL,
`days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST


4.創(chuàng)建分片表(分庫分表)
#在 Mycat 終端直接運行建表語句進行數(shù)據(jù)分片
CREATE TABLE db1.orders(
id BIGINT NOT NULL AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id),
KEY `id` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id)
tbpartitions 1 dbpartitions 2;

#數(shù)據(jù)庫分片規(guī)則,表分片規(guī)則,以及各分多少片
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(6,102,100,100020);
SELECT * FROM orders;

#同樣可以查看生成的配置信息
#進入相關目錄查看 schema 配置
vim /usr/local/mycat/conf/schemas/db1.schema.json

ongblob,
PRIMARY KEY (id),
KEY id (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST文章來源地址http://www.zghlxwxcb.cn/news/detail-490195.html


#### 	4.創(chuàng)建分片表(分庫分表)

```sql
#在 Mycat 終端直接運行建表語句進行數(shù)據(jù)分片
CREATE TABLE db1.orders(
id BIGINT NOT NULL AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id),
KEY `id` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id)
tbpartitions 1 dbpartitions 2;

#數(shù)據(jù)庫分片規(guī)則,表分片規(guī)則,以及各分多少片
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(6,102,100,100020);
SELECT * FROM orders;

#同樣可以查看生成的配置信息
#進入相關目錄查看 schema 配置
vim /usr/local/mycat/conf/schemas/db1.schema.json

到了這里,關于MyCat2介紹以及部署和讀寫分離/分庫分表(MyCat2.0)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 分庫分表介紹以及shardingjdbc實現(xiàn)分庫分表

    分庫分表介紹以及shardingjdbc實現(xiàn)分庫分表

    分庫分表概念 一、什么是分庫分表 分庫分表是在海量數(shù)據(jù)下,由于單庫、表數(shù)據(jù)量過大,導致數(shù)據(jù)庫性能持續(xù)下降的問題,演變出的技術方案。 分庫分表是由分庫和分表這兩個獨立概念組成的,只不過通常分庫與分表的操作會同時進行,以至于我們習慣性的將它們合在一起

    2023年04月13日
    瀏覽(34)
  • Mysql 分庫分表 Mycat

    Mysql 分庫分表 Mycat

    https://www.bilibili.com/video/BV1Kr4y1i7ru?p=163spm_id_from=pageDrivervd_source=ff8b7f852278821525f11666b36f180a 1.1 熱點數(shù)據(jù)多 - 緩沖區(qū)不足 -內(nèi)存不足 1.2 數(shù)據(jù)多 - 磁盤不足 1.3 請求數(shù)據(jù)量多 - 帶寬不足 1.4 排序/分組/連續(xù)查詢/集合統(tǒng)計 太多 - cpu 不足 2.1.1 垂直分庫 - 表業(yè)務類型拆分 2.1.2 垂直分表 -

    2024年02月02日
    瀏覽(23)
  • MySQL運維6-Mycat分庫分表之垂直分庫

    MySQL運維6-Mycat分庫分表之垂直分庫

    場景:在業(yè)務系統(tǒng)中,涉及一下表結構,但是由于用戶與訂單每天都會產(chǎn)生大量的數(shù)據(jù),單臺服務器的數(shù)據(jù)存儲以及處理能力是有限的,可以對數(shù)據(jù)庫表進行拆分,原有數(shù)據(jù)庫如下 說明1:整個業(yè)務系統(tǒng)中的表,大致分為四個,商品信息類的表,訂單相關的表,用戶相關表及

    2024年02月04日
    瀏覽(30)
  • 04、MySQL-------MyCat實現(xiàn)分庫分表

    04、MySQL-------MyCat實現(xiàn)分庫分表

    https://www.cnblogs.com/zhangyi555/p/16528576.html 橫向(水平)拆分 那如果把一張表中的不同的記錄分別放到不同的表中,這種就是橫向拆分。 橫向拆分的結果是數(shù)據(jù)庫表中的數(shù)據(jù)會分散到多張分表中,使得每一個單表中的數(shù)據(jù)的條數(shù)都有所下降。比如我們可以把不同的用戶的訂單分

    2024年02月07日
    瀏覽(23)
  • Mycat分庫分表實時同步到GreatSQL

    Mycat分庫分表實時同步到GreatSQL

    MyCat作為經(jīng)典的分庫分表中間件,在長時間內(nèi)被廣泛認為是管理超大MySQL數(shù)據(jù)庫集合的有效解決方案。近來接到客戶需求,需要將MyCat集群遷移到GreatSQL中,并且在一段時間內(nèi)需要實時從MyCat中同步數(shù)據(jù)到GreatSQL中,全量同步數(shù)據(jù)比較容易操作,增量同步有如下兩個棘手的問題:

    2024年02月03日
    瀏覽(18)
  • MySQL運維13-Mycat分庫分表之按月分片

    MySQL運維13-Mycat分庫分表之按月分片

    使用場景為按照自然月來分片,每個自然月為一個分片,但是一年有12個月,是不是要有12個數(shù)據(jù)節(jié)點才行呢?并不是。例如我現(xiàn)在只有三個分片數(shù)據(jù)庫,這樣就可以1月在第一個數(shù)據(jù)分片中,2月在第二個數(shù)據(jù)分片中,3月在第三個數(shù)據(jù)分片中,當來到4月的時候,就會重新開始

    2024年02月04日
    瀏覽(27)
  • mycat實現(xiàn)mysql讀寫分離

    mycat實現(xiàn)mysql讀寫分離

    mycat集群+Haproxy+Keepalived+mysql1主2從 環(huán)境規(guī)劃 centos7.9 1主2從,讀寫分離 名稱 ip 端口 mysql-master 192.168.1.220 3306 mysql-slave1 192.168.1.221 3306 mysql-slave2 192.168.1.222 3306 mycat-1 192.168.1.221 8066 mycat-2 192.168.1.222 8066 haproxy-1 192.168.1.221 18066 haproxy-2 192.168.1.222 18066 keepalived-1 192.168.1.221 keepalived-2 1

    2024年01月19日
    瀏覽(19)
  • 數(shù)據(jù)庫:mycat實現(xiàn)讀寫分離

    數(shù)據(jù)庫:mycat實現(xiàn)讀寫分離

    目錄 一、mycat 1、mycat實現(xiàn)讀寫分離原理 2、mycat應用場景 3、mycat作用 4、mycat實現(xiàn)讀寫分離實戰(zhàn) 1、mycat實現(xiàn)讀寫分離原理 ①用戶進行讀操作則由mycat轉給配置的從數(shù)據(jù)庫。 ②用戶進行寫操作則由mycat轉給配置的主數(shù)據(jù)庫。 ③轉發(fā)規(guī)則由mycat配置文件中定義,那臺是讀那臺是寫

    2024年02月07日
    瀏覽(26)
  • 數(shù)據(jù)庫應用:Mycat實現(xiàn)讀寫分離

    數(shù)據(jù)庫應用:Mycat實現(xiàn)讀寫分離

    目錄 一、理論 1.Mycat 2.Mycat安裝啟動 3.Mycat搭建讀寫分離 4.垂直分庫 5.水平分表 6.Mycat高可用 7.Mycat安全設置 8.Mycat監(jiān)控工具 二、實驗 1.Mycat讀寫分離 2.Mycat監(jiān)控安裝 三、問題 1.Mycat命令無法補全 2.Mycat啟動失敗 3.zookeeper啟動報錯 四、總結 (1)概念 MyCAT是一款由阿里Cobar演變而來

    2024年02月15日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包