[TOC]
默認端口:**8066**
mycat 不負責主從同步,僅作為數據查詢中間件,主從扔由mysql自行配置
## 原理
mycat的原理中最重要的一個動作是“攔截”,它攔截了用戶發送過來的SQL語句,首先對SQL語句做了一些特定的分析:如分片分析、路由分析、讀寫分離分析、緩存分析等,然后將此SQL發送后端的真實數據庫,并將返回的結果做適當的處理,最終再返回給用戶。
總結:mycat會攔截sql語句,然后分析出涉及的**庫**和**表**,然后進行命令分發,如果涉及了排序等操作,會在mycat端做相應的處理。
## 安裝
[https://mp.weixin.qq.com/s?__biz=MzU1MDc4NjE2NQ==&mid=2247486038&idx=1&sn=6a73b799eaf44a2eabcdcefe8f3f3092&chksm=fb9a0f4ccced865a208ddf8645abf8800fc5e7d48b2f1de9262cbb652051b10daa668dc436f7&scene=21#wechat_redirect]()
## 配置
[https://mp.weixin.qq.com/s?src=11×tamp=1663056989&ver=4041&signature=HkXFlwrfN6byU0nBhL4EM4K*gRBSJrSmCkRzO3vPFPkQYz5Nh9H1Ncn4efNfgmYmcrklOd5B0w9DOhstE-o1aawkNSZ8uEP7Qj7cWpvs8IGAaPYTQaZ*jnxFllp7IK5-&new=1]()
>3個配置文件,也就是server.xml、schema.xml和rule.xml
### server.xml

#### ** user 標簽**主要用于定義登錄Mycat的用戶和權限
可以修改user標簽的name屬性來指定用戶名,修改password的值來修改密碼,修改readOnly的值為true 或false來限制用戶的讀寫權限。如果需要同時訪問多個schema,則多個schema之間使用英文逗號隔開
>**schema**

>**benchmark**
通過設置benchmak屬性的值來限制前端的整體連接數量,如果其值為0或不對其進行設置,則表示不限制連接數量

>**usingDecrypt**
通過設置usingDecrypt 屬性的值來開啟密碼加密功能。默認值為0,表示不開啟加密,值為1表示開啟加密
### schema.xml
管理著 MyCat 的邏輯庫、表、分片規則、DataNode 以及 DataSource
schema 標簽用于定義 MyCat 實例中的邏輯庫,MyCat 可以有多個邏輯庫,每個邏輯庫都有自己的相關配置。可以使用 schema 標簽來劃分這些不同的邏輯庫。如果不配置 schema 標簽,所有的表配置,會屬于同一個默認的邏輯庫。
**dataNode**
該屬性用于綁定邏輯庫到某個具體的 database 上,1.3 版本如果配置了dataNode,則不可以配置分片表,1.4 可以配置默認分片,只需要配置需要分片的表即可。
**checkSQLschema**
當該值設置為true時,如果執行語句`select * from TESTDB.users;`則MyCat會把語句修改為`select * from users;`。即把表示 schema 的字符去掉,避免發送到后端數據庫執行時報錯(`ERROR1146 (42S02): Table ‘testdb.users’ doesn’t exist`)。
不過,即使設置該值為 true ,如果語句所帶的是并非是 schema 指定的名字,例如:`select * from db1.users;`?那么 MyCat 并不會刪除 db1 這個字段,如果沒有定義該庫的話則會報錯,所以在提供 SQL語句的最好是不帶這個字段。
**sqlMaxLimit**
當該值設置為某個數值時。每條執行的 SQL 語句,如果沒有加上 limit 語句,MyCat 也會自動的加上所對應的值。例如設置值為 100,執行`select * from TESTDB.users;`的效果為和執行`select * from TESTDB.users limit 100;`相同。
**table 標簽**
table 標簽定義了 MyCat 中的邏輯表,所有需要拆分的表都需要在這個標簽中定義。
### rule.xml
定義了我們對表進行拆分所涉及到的規則定義。我們可以靈活的對表使用不同的分片算法,或者對表使用相同的算法但具體的參數不同。
這個文件里面主要有 tableRule 和 function 這兩個標簽。在具體使用過程中可以按照需求添加 tableRule 和 function。
**tableRule標簽**
`name 屬性`指定唯一的名字,用于標識不同的表規則。
`rule 標簽`則指定對物理表中的哪一列進行拆分和使用什么路由算法。
`columns 標簽`內指定要拆分的列名字。
`algorithm 標簽`使用 function 標簽中的 name 屬性。連接表規則和具體路由算法。當然,多個表規則可以連接到同一個路由算法上。table 標簽內使用。讓邏輯表使用這個規則進行分片。

**function 標簽**
`name`?指定算法的名字。
`class`?制定路由算法具體的類名字。
`property`?為具體算法需要用到的一些屬性。

- Go準備工作
- 依賴管理
- Go基礎
- 1、變量和常量
- 2、基本數據類型
- 3、運算符
- 4、流程控制
- 5、數組
- 數組聲明和初始化
- 遍歷
- 數組是值類型
- 6、切片
- 定義
- slice其他內容
- 7、map
- 8、函數
- 函數基礎
- 函數進階
- 9、指針
- 10、結構體
- 類型別名和自定義類型
- 結構體
- 11、接口
- 12、反射
- 13、并發
- 14、網絡編程
- 15、單元測試
- Go常用庫/包
- Context
- time
- strings/strconv
- file
- http
- Go常用第三方包
- Go優化
- Go問題排查
- Go框架
- 基礎知識點的思考
- 面試題
- 八股文
- 操作系統
- 整理一份資料
- interface
- array
- slice
- map
- MUTEX
- RWMUTEX
- Channel
- waitGroup
- context
- reflect
- gc
- GMP和CSP
- Select
- Docker
- 基本命令
- dockerfile
- docker-compose
- rpc和grpc
- consul和etcd
- ETCD
- consul
- gin
- 一些小點
- 樹
- K8s
- ES
- pprof
- mycat
- nginx
- 整理后的面試題
- 基礎
- Map
- Chan
- GC
- GMP
- 并發
- 內存
- 算法
- docker