server.xml 幾乎保存了所有 mycat 需要的系統配置信息。
1、system 標簽:
該標簽內嵌套的所有 property 標簽都與系統配置有關。
charset 屬性:
該屬性用於字符集設置。
<system> <property name="charset">utf8</property> </system>
defaultSqlParser 屬性:
該屬性用來指定默認的解析器。目前的可用的取值有:druidparser 和 fdbparser。使用的時候可以選擇其中的一種,目前一般都使用 druidparser。1.3 解析器默認為 fdbparser,1.4 默認為 druidparser,1.4 以后 fdbparser 作廢。
processors 屬性:
該屬性主要用於指定系統可用的線程數,默認值為機器 CPU 核心線程數。主要影響 processorBufferPool、 processorBufferLocalPercent、 processorExecutor 屬性。NIOProcessor 的個數也是由這個屬性定義的,所以調優的時候可以適當的調高這個屬性。
processorBufferChunk 屬性:
該屬性指定每次分配 Socket Direct Buffer 的大小,默認是 4096 個字節。這個屬性也影響 buffer pool 的長度。如果一次性獲取的數過大 buffer 不夠用會經常出現警告,此時可以適當調大。
processorBufferPool 屬性:
該屬性指定 bufferPool 計算比例值。由於每次執行 NIO 讀、寫操作都需要使用到 buffer,系統初始化的時候會建立一定長度的 buffer 池來加快讀、寫的效率,減少建立 buffer 的時間。Mycat 中有兩個主要的 buffer 池:
BufferPool:BufferPool 由 ThreadLocalPool 組合而成,每次從 BufferPool 中獲取 buffer 都會優先獲取ThreadLocalPool 中的 buffer,未命中之后才會去獲取 BufferPool 中的 buffer。也就是說 ThreadLocalPool 是作為 BufferPool 的二級緩存,每個線程內部自己使用的。BufferPool 上的 buffer 則是每個 NIOProcessor 都共享的。
這個屬性的默認值為: 默認bufferChunkSize(4096) * processors屬性 * 1000
BufferPool 的總長度 = bufferPool / bufferChunk。
若 bufferPool 不是 bufferChunk 的整數倍,則總長度為前面計算得出的商 + 1
假設系統線程數為 4,其他都為屬性的默認值,則:
bufferPool = 4096 * 4 * 1000
BufferPool 的總長度 : 4000 = 16384000 / 4096

processorBufferLocalPercent 屬性:
前面提到了 ThreadLocalPool。這個屬性就是用來控制分配這個 pool 的大小用的,這個屬性默認值為 100。
線程緩存百分比 = bufferLocalPercent / processors 屬性。
例如,系統可以同時運行 4 個線程,使用默認值,則根據公式每個線程的百分比為 25。最后根據這個百分比來計算出具體的 ThreadLocalPool 的長度公式如下:
ThreadLocalPool 的長度 = 線程緩存百分比 * BufferPool 長度 / 100
假設 BufferPool 的長度為 4000,其他保持默認值。
那么最后每個線程建立上的 ThreadLocalPool 的長度為: 1000 = 25 * 4000 / 100
processorExecutor 屬性:
這個屬性主要用於指定 NIOProcessor 上共享的 businessExecutor 固定線程池大小。 mycat 在需要處理一些異步邏輯的時候會把任務提交到這個線程池中。新版本中這個連接池的使用頻率不是很大了,可以設置一個較小的值。
sequnceHandlerType 屬性:
指定使用 Mycat 全局序列的類型。 0 為本地文件方式,1 為數據庫方式,2 為時間戳序列方式,3 為分布式ZK ID 生成器,4 為 zk 遞增 id 生成。
TCP 連接相關屬性:
- StandardSocketOptions.SO_RCVBUF
- StandardSocketOptions.SO_SNDBUF
- StandardSocketOptions.TCP_NODELAY
以上這三個屬性,分別由:
frontSocketSoRcvbuf 默認值: 1024 * 1024
frontSocketSoSndbuf 默認值: 4 * 1024 * 1024
frontSocketNoDelay 默認值: 1
backSocketSoRcvbuf 默認值: 4 * 1024 * 1024
backSocketSoSndbuf 默認值: 1024 * 1024
backSocketNoDelay 默認值: 1
各自設置前后端 TCP 連接參數。 Mycat 在每次建立前、后端連接的時候都會使用這些參數初始化連接。可以按系統要求適當的調整這些 buffer 的大小。
其他涉及屬性:
1.1、心跳屬性
mycat 中有幾個周期性的任務來異步的處理一些我需要的工作。這些屬性就在系統調優的過程中也是比不可少的。
processorCheckPeriod :
清理 NIOProcessor 上前后端空閑、超時和關閉連接的間隔時間。默認是 1 秒,單位毫秒。
dataNodeIdleCheckPeriod :
對后端連接進行空閑、超時檢查的時間間隔,默認是 300 秒,單位毫秒。
dataNodeHeartbeatPeriod :
對后端所有讀、寫庫發起心跳的間隔時間,默認是 10 秒,單位毫秒。
1.2、服務相關屬性
這里介紹一個與服務相關的屬性,主要會影響外部系統對 myact 的感知。
bindIp :
mycat 服務監聽的 IP 地址,默認值為 0.0.0.0。
serverPort :
定義 mycat 的使用端口,默認值為 8066。
managerPort :
定義 mycat 的管理端口,默認值為 9066。
1.3、Mysql 連接相關屬性
初始化 mysql 前后端連接所涉及到的一些屬性:
packetHeaderSize :
指定 Mysql 協議中的報文頭長度。默認 4。
maxPacketSize :
指定 Mysql 協議可以攜帶的數據最大長度。默認 16M。
idleTimeout :
指定連接的空閑超時時間。某連接在發起空閑檢查下,發現距離上次使用超過了空閑時間,那么這個連接會被回收,就是被直接的關閉掉。默認 30 分鍾,單位毫秒。
charset :
連接的初始化字符集。默認為 utf8。
txIsolation :
前端連接的初始化事務隔離級別,只在初始化的時候使用,后續會根據客戶端傳遞過來的屬性對后端數據庫連接進行同步。默認為 REPEATED_READ,設置值為數字默認 3。
- READ_UNCOMMITTED = 1;
- READ_COMMITTED = 2;
- REPEATED_READ = 3;
- SERIALIZABLE = 4;
sqlExecuteTimeout :
SQL 執行超時的時間,Mycat 會檢查連接上最后一次執行 SQL 的時間,若超過這個時間則會直接關閉這連接。默認時間為 300 秒,單位秒。
2、user 標簽
<user name="test"> <property name="password">123456</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> <property name="benchmark">111111</property> <proerty name="usingDecrypt">1</property> <privileges check="false"> <schema name="TESTDB" dml="0010" showTables="custome/mysql"> <table name="tb_user" dml="0110"></table> <table name="tb_dynamic dml="1111"></table> </schema> </privileges> </user>
該標簽主要用於定義登錄 mycat 的用戶和權限。示例定義了一個用戶,用戶名為 test、密碼為123456,可訪問的 schema 也只有 TESTDB 一個。
property屬性 :
聲明具體的屬性值,例如修改schemas內的文本來控制用戶可訪問的 schema,同時訪問多個 schema 的話使用,隔開,例如:
<property name="schemas">TESTDB,db1,db2<property>
Benchmark 屬性:
用於mycat連接服務降級處理:benchmark基准,當前端的整體connection數達到基准值時,對來自該賬戶的請求開始拒絕連接,0或不設表示不限制。
usingDecrypt 屬性:
是否對密碼加密。默認0表示不開啟,1表示開啟密碼加密,同時使用加密程序對密碼加密。
privileges 屬性:
對用戶的 schema 及下級的 table 進行精細化的 DML 權限控制。
check 屬性是用於標識是否開啟 DML 權限檢查, 默認 false 標識不檢查。由於 Mycat 一個用戶的 schemas 屬性可配置多個 schema ,所以 privileges 的下級節點 schema 節點同樣可配置多個,對多庫多表進行細粒度的 DML 權限控制。
Schema/Table 上的 dml 屬性:
