1、MyCat官網
2、MyCat下載
第一章 入門概述
1.1 是什麼
Mycat 是數據庫中間件。
1、 數據庫中間件
中間件: 是一類連接軟件組件和應用的計算機軟件, 以便於軟件各部件之間的溝通。
例子: Tomcat, web中間件。
數據庫中間件: 連接java應用程序和數據庫
2、 爲什麼要用Mycat?
① Java與數據庫緊耦合。
② 高訪問量高併發對數據庫的壓力。
③ 讀寫請求數據不一致
3、 數據庫中間件對比
① Cobar屬於阿里B2B事業羣,始於2008年,在阿里服役3年多,接管3000+個MySQL數據庫的schema,
集羣日處理在線SQL請求50億次以上。由於Cobar發起人的離職, Cobar停止維護。
② Mycat是開源社區在阿里cobar基礎上進行二次開發,解決了cobar存在的問題,並且加入了許多新
的功能在其中。青出於藍而勝於藍。
③ OneProxy基於MySQL官方的proxy思想利用c進行開發的, OneProxy是一款商業收費的中間件。舍
棄了一些功能,專注在性能和穩定性上。
④ kingshard由小團隊用go語言開發,還需要發展,需要不斷完善。
⑤ Vitess是Youtube生產在使用, 架構很複雜。不支持MySQL原生協議,使用需要大量改造成本。
⑥ Atlas是360團隊基於mysql proxy改寫,功能還需完善,高併發下不穩定。
⑦ MaxScale是mariadb(MySQL原作者維護的一個版本) 研發的中間件
⑧ MySQLRoute是MySQL官方Oracle公司發佈的中間件
3、 Mycat的官網
http://www.mycat.io/
1.2 幹什麼
1、讀寫分離
2、數據分片
垂直拆分(分庫) 、 水平拆分(分表) 、 垂直+水平拆分(分庫分表)
3、多數據源整合
1.3 原理
Mycat 的原理中最重要的一個動詞是“攔截”,它攔截了用戶發送過來的 SQL 語句,首先對 SQL
語句做了一些特定的分析:如分片分析、路由分析、讀寫分離分析、緩存分析等,然後將此 SQL 發
往後端的真實數據庫, 並將返回的結果做適當的處理,最終再返回給用戶。
這種方式把數據庫的分佈式從代碼中解耦出來,程序員察覺不出來後臺使用 Mycat 還是MySQL。
第二章 安裝啓動
2.1 安裝
1、 解壓後即可使用
解壓縮文件拷貝到 linux 下 /usr/local/
2、 三個配置文件
①schema.xml: 定義邏輯庫,表、分片節點等內容
②rule.xml: 定義分片規則
③server.xml: 定義用戶以及系統相關變量,如端口等
2.2 啓動
1、 修改配置文件server.xml
修改用戶信息,與MySQL區分, 如下:
… <user name="mycat"> <property name="password">123456</property> <property name="schemas">TESTDB</property> </user> … |
2、修改配置文件 schema.xml
刪除<schema>標籤間的表信息, <dataNode>標籤只留一個, <dataHost>標籤只留一個, <writeHost>
<readHost>只留一對
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="host1" database="testdb" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.140.128:3306" user="root" password="123123"> <!-- can have multi read hosts --> <readHost host="hostS1" url="192.168.140.127:3306" user="root" password="123123" /> </writeHost> </dataHost> </mycat:schema> |
3、 驗證數據庫訪問情況
Mycat 作爲數據庫中間件要和數據庫部署在不同機器上,所以要驗證遠程訪問情況。
mysql -uroot -p123123 -h 192.168.140.128 -P 3306 mysql -uroot -p123123 -h 192.168.140.127 -P 3306 #如遠程訪問報錯,請建對應用戶 grant all privileges on *.* to root@'缺少的host' identified by '123123'; |
4、 啓動程序
①控制檯啓動 : 去 mycat/bin 目錄下執行 ./mycat console
②後臺啓動 :去 mycat/bin 目錄下 ./mycat start
爲了能第一時間看到啓動日誌,方便定位問題,我們選擇①控制檯啓動。
5、 啓動時可能出現報錯
如果操作系統是 CentOS6.8, 可能會出現域名解析失敗錯誤,如下圖
可以按照以下步驟解決
① 用 vim 修改 /etc/hosts 文件, 在 127.0.0.1 後面增加你的機器名
② 修改後重新啓動網絡服務
2.3 登錄
1、登錄後臺管理窗口
此登錄方式用於管理維護 Mycat
mysql -umycat -p123456 -P 9066 -h 192.168.140.128 #常用命令如下: show database show @@help |
2、登錄數據窗口
此登錄方式用於通過 Mycat 查詢數據,我們選擇這種方式訪問 Mycat
mysql -umycat -p123456 -P 8066 -h 192.168.140.128 |
第三章 搭建讀寫分離
我們通過 Mycat 和 MySQL 的主從複製配合搭建數據庫的讀寫分離, 實現 MySQL 的高可用性。
我們將搭建:一主一從、雙主雙從兩種讀寫分離模式。
3.1 搭建一主一從
一個主機用於處理所有寫請求,一臺從機負責所有讀請求,架構圖如下
1、 搭建 MySQL 數據庫主從複製
① MySQL 主從複製原理
② 主機配置(host79)
修改配置文件: vim /etc/my.cnf #主服務器唯一ID server-id=1 #啓用二進制日誌 log-bin=mysql-bin # 設置不要複製的數據庫(可設置多個) binlog-ignore-db=mysql binlog-ignore-db=information_schema #設置需要複製的數據庫 binlog-do-db=需要複製的主數據庫名字 #設置logbin格式 binlog_format=STATEMENT |
binlog 日誌三種格式
③ 從機配置(host80)
修改配置文件: vim /etc/my.cnf #從服務器唯一ID server-id=2 #啓用中繼日誌 relay-log=mysql-relay |
④ 主機、從機重啓 MySQL 服務
⑤ 主機從機都關閉防火牆
⑥ 在主機上建立帳戶並授權 slave
#在主機MySQL裏執行授權命令 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123'; |
#查詢master的狀態 show master status; #記錄下File和Position的值 #執行完此步驟後不要再操作主服務器MySQL,防止主服務器狀態值變化 |
⑦ 在從機上配置需要複製的主機
#複製主機的命令 CHANGE MASTER TO MASTER_HOST='主機的IP地址', MASTER_USER='slave', MASTER_PASSWORD='123123', MASTER_LOG_FILE='mysql-bin.具體數字',MASTER_LOG_POS=具體值; #啓動從服務器複製功能 start slave; #查看從服務器狀態 show slave status\G; |
#下面兩個參數都是Yes,則說明主從配置成功! # Slave_IO_Running: Yes # Slave_SQL_Running: Yes |
⑧ 主機新建庫、新建表、 insert 記錄, 從機複製
⑨ 如何停止從服務複製功能
stop slave; |
⑩ 如何重新配置主從
stop slave; reset master; |
2、 修改 Mycat 的配置文件 schema.xml
之前的配置已分配了讀寫主機,是否已實現讀寫分離?
驗證讀寫分離 (1) 在寫主機插入: insert into mytbl values (1,@@hostname); 主從主機數據不一致了 (2) 在Mycat裏查詢: select * from mytbl; |
修改<dataHost>的balance屬性,通過此屬性配置讀寫分離的類型
負載均衡類型,目前的取值有4 種: (1) balance="0", 不開啓讀寫分離機制, 所有讀操作都發送到當前可用的 writeHost 上。 (2) balance="1",全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從 模式(M1->S1, M2->S2,並且 M1 與 M2 互爲主備),正常情況下, M2,S1,S2 都參與 select 語句的負載均衡。 (3) balance="2",所有讀操作都隨機的在 writeHost、 readhost 上分發。 (4) balance="3",所有讀請求隨機的分發到 readhost 執行, writerHost 不負擔讀壓力 |
爲了能看到讀寫分離的效果,把balance設置成2, 會在兩個主機間切換查詢
… <dataHost name="host1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> … |
3、 啓動 Mycat
4、 驗證讀寫分離
#(1) 在寫主機數據庫表mytbl中插入帶系統變量數據, 造成主從數據不一致 INSERT INTO mytbl VALUES(2,@@hostname); #(2) 在Mycat裏查詢mytbl表,可以看到查詢語句在主從兩個主機間切換 |
3.2 搭建雙主雙從
一個主機 m1 用於處理所有寫請求, 它的從機 s1 和另一臺主機 m2 還有它的從機 s2 負責所有讀請
求。當 m1 主機宕機後, m2 主機負責寫請求, m1、 m2 互爲備機。 架構圖如下
編號 | 角色 | IP 地址 | 機器名 |
1 | Master1 | 192.168.140.128 | host79.test |
2 | Slave1 | 192.168.140.127 | host80.test |
3 | Master2 | 192.168.140.126 | host81.test |
4 | Slave2 | 192.168.140.125 | host82.test |
1、 搭建 MySQL 數據庫主從複製(雙主雙從)
① 雙主機配置
Master1配置
修改配置文件: vim /etc/my.cnf #主服務器唯一ID server-id=1 #啓用二進制日誌 log-bin=mysql-bin # 設置不要複製的數據庫(可設置多個) binlog-ignore-db=mysql binlog-ignore-db=information_schema #設置需要複製的數據庫 binlog-do-db=需要複製的主數據庫名字 #設置logbin格式 binlog_format=STATEMENT # 在作爲從數據庫的時候, 有寫入操作也要更新二進制日誌文件 log-slave-updates #表示自增長字段每次遞增的量,指自增字段的起始值,其默認值是1, 取值範圍是1 .. 65535 auto-increment-increment=2 # 表示自增長字段從哪個數開始,指字段一次遞增多少,他的取值範圍是1 .. 65535 auto-increment-offset=1 |
Master2配置
修改配置文件: vim /etc/my.cnf #主服務器唯一ID server-id=3 #啓用二進制日誌 log-bin=mysql-bin # 設置不要複製的數據庫(可設置多個) |
binlog-ignore-db=mysql binlog-ignore-db=information_schema #設置需要複製的數據庫 binlog-do-db=需要複製的主數據庫名字 #設置logbin格式 binlog_format=STATEMENT # 在作爲從數據庫的時候,有寫入操作也要更新二進制日誌文件 log-slave-updates #表示自增長字段每次遞增的量,指自增字段的起始值,其默認值是1,取值範圍是1 .. 65535 auto-increment-increment=2 # 表示自增長字段從哪個數開始,指字段一次遞增多少,他的取值範圍是1 .. 65535 auto-increment-offset=2 |
② 雙從機配置
Slave1配置
修改配置文件: vim /etc/my.cnf #從服務器唯一ID server-id=2 #啓用中繼日誌 relay-log=mysql-relay |
Slave2配置
修改配置文件: vim /etc/my.cnf #從服務器唯一ID server-id=4 #啓用中繼日誌 relay-log=mysql-relay |
③ 雙主機、 雙從機重啓 mysql 服務
④ 主機從機都關閉防火牆
⑤ 在兩臺主機上建立帳戶並授權 slave
#在主機MySQL裏執行授權命令 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123'; #查詢Master1的狀態 show master status; |
#查詢Master2的狀態 show master status; #分別記錄下File和Position的值 #執行完此步驟後不要再操作主服務器MYSQL,防止主服務器狀態值變化 |
⑥ 在從機上配置需要複製的主機
Slava1 複製 Master1, Slava2 複製 Master2
#複製主機的命令 CHANGE MASTER TO MASTER_HOST='主機的IP地址', MASTER_USER='slave', MASTER_PASSWORD='123123', MASTER_LOG_FILE='mysql-bin.具體數字',MASTER_LOG_POS=具體值; Slava1的複製命令 Slava2的複製命令 #啓動兩臺從服務器複製功能 start slave; |
#查看從服務器狀態 show slave status\G; #Slava1的複製Master1 #Slava2的複製Master2 #下面兩個參數都是Yes,則說明主從配置成功! # Slave_IO_Running: Yes # Slave_SQL_Running: Yes |
⑦ 兩個主機互相複製
Master2 複製 Master1, Master1 複製 Master2
# Master2的複製命令 # Master1的複製命令 #啓動兩臺主服務器複製功能 start slave; #查看從服務器狀態 show slave status\G; Master2的複製Master1 Master1的複製Master2 |
#下面兩個參數都是Yes,則說明主從配置成功! # Slave_IO_Running: Yes # Slave_SQL_Running: Yes |
⑧ Master1 主機新建庫、新建表、 insert 記錄, Master2 和從機複製
⑨ 如何停止從服務複製功能
stop slave; |
⑩ 如何重新配置主從
stop slave; reset master; |
2、 修改 Mycat 的配置文件 schema.xml
修改<dataHost>的balance屬性,通過此屬性配置讀寫分離的類型
負載均衡類型,目前的取值有4 種: (1) balance="0", 不開啓讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上。 (2) balance="1",全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從 模式(M1->S1, M2->S2,並且 M1 與 M2 互爲主備),正常情況下, M2,S1,S2 都參與 select 語句的負載均衡。 (3) balance="2",所有讀操作都隨機的在 writeHost、 readhost 上分發。 (4) balance="3",所有讀請求隨機的分發到 readhost 執行, writerHost 不負擔讀壓力 |
爲了雙主雙從讀寫分離balance設置爲1
… <dataNode name="dn1" dataHost="host1" database="testdb" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100" > <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.140.128:3306" user="root" password="123123"> <!-- can have multi read hosts --> <readHost host="hostS1" url="192.168.140.127:3306" user="root" password="123123" /> </writeHost> <writeHost host="hostM2" url="192.168.140.126:3306" user="root" password="123123"> <!-- can have multi read hosts --> <readHost host="hostS2" url="192.168.140.125:3306" user="root" password="123123" /> </writeHost> </dataHost> … # balance="1": 全部的readHost與stand by writeHost參與select語句的負載均衡。 #writeType="0": 所有寫操作發送到配置的第一個writeHost,第一個掛了切到還生存的第二個 #writeType="1",所有寫操作都隨機的發送到配置的 writeHost, 1.5 以後廢棄不推薦 #writeHost,重新啓動後以切換後的爲準,切換記錄在配置文件中:dnindex.properties 。 #switchType="1": 1 默認值,自動切換。 # -1 表示不自動切換 # 2 基於 MySQL 主從同步的狀態決定是否切換。 |
3、 啓動 Mycat
4、 驗證讀寫分離
#在寫主機Master1數據庫表mytbl中插入帶系統變量數據, 造成主從數據不一致 INSERT INTO mytbl VALUES(3,@@hostname); #在Mycat裏查詢mytbl表,可以看到查詢語句在Master2(host81) 、 Slava1(host80) 、 Slava2(host82) 主從三個主機間切換 |
5、 抗風險能力
#停止數據庫Master1 #在Mycat裏插入數據依然成功, Master2自動切換爲寫主機 INSERT INTO mytbl VALUES(3,@@hostname); |
#啓動數據庫Master1 #在Mycat裏查詢mytbl表,可以看到查詢語句在Master1(host79) 、 Slava1(host80) 、 Slava2(host82) 主從三個主機間切換 |
Master1、 Master2 互做備機,負責寫的主機宕機,備機切換負責寫操作,保證數據庫讀寫分離高
可用性。
第四章 垂直拆分——分庫
一個數據庫由很多表的構成,每個表對應着不同的業務,垂直切分是指按照業務將表進行分類,
分佈到不同 的數據庫上面,這樣也就將數據或者說壓力分擔到不同的庫上面,如下圖:
系統被切分成了,用戶,訂單交易,支付幾個模塊。
4.1 如何劃分表
一個問題:在兩臺主機上的兩個數據庫中的表,能否關聯查詢?
答案:不可以關聯查詢。
分庫的原則: 有緊密關聯關係的表應該在一個庫裏,相互沒有關聯關係的表可以分到不同的庫裏。
#客戶表 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) ); #訂單狀態字典表 rows:20 CREATE TABLE dict_order_type( id INT AUTO_INCREMENT, order_type VARCHAR(200), PRIMARY KEY(id) ); |
以上四個表如何分庫?客戶表分在一個數據庫,另外三張都需要關聯查詢,分在另外一個數據庫。
4.2 實現分庫
1、 修改 schema 配置文件
… <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> <table name="customer" dataNode="dn2" ></table> </schema> <dataNode name="dn1" dataHost="host1" database="orders" /> <dataNode name="dn2" dataHost="host2" database="orders" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.140.128:3306" user="root" password="123123"> </writeHost> </dataHost> <dataHost name="host2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> |
<heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM2" url="192.168.140.127:3306" user="root" password="123123"> </writeHost> </dataHost> … # 如下圖 |
2、 新增兩個空白庫
分庫操作不是在原來的老數據庫上進行操作,需要準備兩臺機器分別安裝新的數據庫
#在數據節點 dn1、 dn2 上分別創建數據庫 orders CREATE DATABASE orders; |
3、 啓動 Mycat
./mycat console |
4、 訪問 Mycat 進行分庫
#訪問 Mycat mysql -umycat -p123456 -h 192.168.140.128 -P 8066 #切換到 TESTDB #創建 4 張表 #查看錶信息,可以看到成功分庫 |
第五章 水平拆分——分表
相對於垂直拆分,水平拆分不是將表做分類,而是按照某個字段的某種規則來分散到多個庫之中,
每個表中 包含一部分數據。簡單來說,我們可以將數據的水平切分理解爲是按照數據行的切分,就
是將表中的某些行切分 到一個數據庫,而另外的某些行又切分到其他的數據庫中,如圖:
5.1 實現分表
1、 選擇要拆分的表
MySQL 單表存儲數據條數是有瓶頸的,單表達到 1000 萬條數據就達到了瓶頸,會影響查詢效率,
需要進行水平拆分(分表) 進行優化。
例如:例子中的 orders、 orders_detail 都已經達到 600 萬行數據,需要進行分表優化。
2、 分表字段
以 orders 表爲例,可以根據不同自字段進行分表
編號 | 分表字段 | 效果 |
1 | id(主鍵、 或創建時間) | 查詢訂單注重時效,歷史訂單被查詢的次數少,如此分片會造成一個節點訪問多,一個訪問少,不平均。 |
2 | customer_id(客戶 id) | 根據客戶 id 去分,兩個節點訪問平均,一個客戶的所 有訂單都在同一個節點 |
3、 修改配置文件 schema.xml
#爲 orders 表設置數據節點爲 dn1、 dn2, 並指定分片規則爲 mod_rule(自定義的名字) <table name="orders" dataNode="dn1,dn2" rule="mod_rule" ></table> #如下圖 |
4、 修改配置文件 rule.xml
#在 rule 配置文件裏新增分片規則 mod_rule,並指定規則適用字段爲 customer_id, #還有選擇分片算法 mod-long(對字段求模運算) , customer_id 對兩個節點求模,根據結果分片 #配置算法 mod-long 參數 count 爲 2,兩個節點 <tableRule name="mod_rule"> <rule> <columns>customer_id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> … <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">2</property> </function> #如下圖: |
5、 在數據節點 dn2 上建 orders 表
6、 重啓 Mycat,讓配置生效
7、 訪問 Mycat 實現分片
#在 mycat 裏向 orders 表插入數據, INSERT 字段不能省略 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); #在mycat、 dn1、 dn2中查看orders表數據,分表成功 |
5.2 Mycat 的分片 “join”
Orders 訂單表已經進行分表操作了,和它關聯的 orders_detail 訂單詳情表如何進行 join 查詢。
我們要對 orders_detail 也要進行分片操作。 Join 的原理如下圖:
1、 ER 表
Mycat 借鑑了 NewSQL 領域的新秀 Foundation DB 的設計思路, Foundation DB 創新性的提
出了 Table Group 的概念,其將子表的存儲位置依賴於主表,並且物理上緊鄰存放,因此徹底解決了
JION 的效率和性能問 題,根據這一思路,提出了基於 E-R 關係的數據分片策略,子表的記錄與所
關聯的父表記錄存放在同一個數據分片上。
#修改 schema.xml 配置文件 … <table name="orders" dataNode="dn1,dn2" rule="mod_rule" > <childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" /> </table> … #在dn2 創建 orders_detail 表 #重啓 Mycat #訪問 Mycat 向 orders_detail 表插入數據 INSERT INTO orders_detail(id,detail,order_id) values(1,'detail1',1); INSERT INTO orders_detail(id,detail,order_id) VALUES(2,'detail1',2); INSERT INTO orders_detail(id,detail,order_id) VALUES(3,'detail1',3); INSERT INTO orders_detail(id,detail,order_id) VALUES(4,'detail1',4); INSERT INTO orders_detail(id,detail,order_id) VALUES(5,'detail1',5); INSERT INTO orders_detail(id,detail,order_id) VALUES(6,'detail1',6); #在mycat、 dn1、 dn2中運行兩個表join語句 Select o.*,od.detail from orders o inner join orders_detail od on o.id=od.order_id; |
2、 全局表
在分片的情況下,當業務表因爲規模而進行分片以後,業務表與這些附屬的字典表之間的關聯,
就成了比較 棘手的問題,考慮到字典表具有以下幾個特性:
① 變動不頻繁
② 數據量總體變化不大
③ 數據規模不大,很少有超過數十萬條記錄
鑑於此, Mycat 定義了一種特殊的表,稱之爲“全局表”,全局表具有以下特性:
① 全局表的插入、更新操作會實時在所有節點上執行,保持各個分片的數據一致性
② 全局表的查詢操作,只從一個節點獲取
③ 全局表可以跟任何一個表進行 JOIN 操作
將字典表或者符合字典表特性的一些表定義爲全局表,則從另外一個方面,很好的解決了數據
JOIN 的難題。 通過全局表+基於 E-R 關係的分片策略, Mycat 可以滿足 80%以上的企業應用開發
#修改 schema.xml 配置文件 … <table name="orders" dataNode="dn1,dn2" rule="mod_rule" > <childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" /> </table> <table name="dict_order_type" dataNode="dn1,dn2" type="global" ></table> … #在dn2 創建 dict_order_type 表 #重啓 Mycat #訪問 Mycat 向 dict_order_type 表插入數據 INSERT INTO dict_order_type(id,order_type) VALUES(101,'type1'); INSERT INTO dict_order_type(id,order_type) VALUES(102,'type2'); #在Mycat、 dn1、 dn2中查詢表數據 |
5.3 常用分片規則
1、 取模
此規則爲對分片字段求摸運算。 也是水平分表最常用規則。 5.1 配置分表中, orders 表採用了此規
則。
2、 分片枚舉
通過在配置文件中配置可能的枚舉 id,自己配置分片,本規則適用於特定的場景,比如有些業務
需要按照省份或區縣來做保存,而全國省份區縣固定的,這類業務使用本條規則。
#(1) 修改schema.xml配置文件 <table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" ></table> #(2) 修改rule.xml配置文件 <tableRule name="sharding_by_intfile"> <rule> <columns>areacode</columns> <algorithm>hash-int</algorithm> </rule> </tableRule> … <function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property> <property name="type">1</property> <property name="defaultNode">0</property> </function> # columns:分片字段, algorithm:分片函數 # mapFile: 標識配置文件名稱, type: 0爲int型、 非0爲String, #defaultNode: 默認節點:小於 0 表示不設置默認節點,大於等於 0 表示設置默認節點, # 設置默認節點如果碰到不識別的枚舉值,就讓它路由到默認節點,如不設置不識別就報錯 #(3) 修改partition-hash-int.txt配置文件 110=0 120=1 #(4) 重啓 Mycat #(5) 訪問Mycat創建表 #訂單歸屬區域信息表 |
CREATE TABLE orders_ware_info ( `id` INT AUTO_INCREMENT comment '編號', `order_id` INT comment '訂單編號', `address` VARCHAR(200) comment '地址', `areacode` VARCHAR(20) comment '區域編號', PRIMARY KEY(id) ); #(6) 插入數據 INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (1,1,'北京','110'); INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (2,2,'天津','120'); #(7) 查詢Mycat、 dn1、 dn2可以看到數據分片效果 |
3、 範圍約定
此分片適用於,提前規劃好分片字段某個範圍屬於哪個分片。
#(1) 修改schema.xml配置文件 <table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" ></table> #(2) 修改rule.xml配置文件 <tableRule name="auto_sharding_long"> <rule> <columns>order_id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule> … <function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> <property name="defaultNode">0</property> </function> # columns:分片字段, algorithm:分片函數 # mapFile: 標識配置文件名稱 #defaultNode: 默認節點:小於 0 表示不設置默認節點,大於等於 0 表示設置默認節點, # 設置默認節點如果碰到不識別的枚舉值,就讓它路由到默認節點,如不設置不識別就 報錯 #(3) 修改autopartition-long.txt配置文件 0-102=0 103-200=1 #(4) 重啓 Mycat #(5) 訪問Mycat創建表 #支付信息表 CREATE TABLE payment_info ( `id` INT AUTO_INCREMENT comment '編號', `order_id` INT comment '訂單編號', `payment_status` INT comment '支付狀態', PRIMARY KEY(id) ); #(6) 插入數據 INSERT INTO payment_info (id,order_id,payment_status) VALUES (1,101,0); INSERT INTO payment_info (id,order_id,payment_status) VALUES (2,102,1); INSERT INTO payment_info (id,order_id ,payment_status) VALUES (3,103,0); INSERT INTO payment_info (id,order_id,payment_status) VALUES (4,104,1); #(7) 查詢Mycat、 dn1、 dn2可以看到數據分片效果 |
4、 按日期(天)分片
此規則爲按天分片。 設定時間格式、範圍
#(1) 修改schema.xml配置文件 <table name="login_info" dataNode="dn1,dn2" rule="sharding_by_date" ></table> #(2) 修改rule.xml配置文件 <tableRule name="sharding_by_date"> <rule> <columns>login_date</columns> <algorithm>shardingByDate</algorithm> </rule> </tableRule> … <function name="shardingByDate" class="io.mycat.route.function.PartitionByDate"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2019-01-01</property> <property name="sEndDate">2019-01-04</property> |
<property name="sPartionDay">2</property> </function> # columns:分片字段, algorithm:分片函數 #dateFormat :日期格式 #sBeginDate :開始日期 #sEndDate:結束日期,則代表數據達到了這個日期的分片後循環從開始分片插入 #sPartionDay :分區天數,即默認從開始日期算起,分隔 2 天一個分區 #(3) 重啓 Mycat #(4) 訪問Mycat創建表 #用戶信息表 CREATE TABLE login_info ( `id` INT AUTO_INCREMENT comment '編號', `user_id` INT comment '用戶編號', `login_date` date comment '登錄日期', PRIMARY KEY(id) ); #(6) 插入數據 INSERT INTO login_info(id,user_id,login_date) VALUES (1,101,'2019-01-01'); INSERT INTO login_info(id,user_id,login_date) VALUES (2,102,'2019-01-02'); INSERT INTO login_info(id,user_id,login_date) VALUES (3,103,'2019-01-03'); INSERT INTO login_info(id,user_id,login_date) VALUES (4,104,'2019-01-04'); INSERT INTO login_info(id,user_id,login_date) VALUES (5,103,'2019-01-05'); INSERT INTO login_info(id,user_id,login_date) VALUES (6,104,'2019-01-06'); #(7) 查詢Mycat、 dn1、 dn2可以看到數據分片效果 |
5.4 全局序列
在實現分庫分表的情況下,數據庫自增主鍵已無法保證自增主鍵的全局唯一。爲此, Mycat 提供
了全局 sequence,並且提供了包含本地配置和數據庫配置等多種實現方式
1、 本地文件
此方式 Mycat 將 sequence 配置到文件中,當使用到 sequence 中的配置後, Mycat 會更下
classpath 中的 sequence_conf.properties 文件中 sequence 當前的值。
① 優點: 本地加載,讀取速度較快
② 缺點: 抗風險能力差, Mycat 所在主機宕機後,無法讀取本地文件。
2、 數據庫方式
利用數據庫一個表 來進行計數累加。但是並不是每次生成序列都讀寫數據庫,這樣效率太低。
Mycat 會預加載一部分號段到 Mycat 的內存中,這樣大部分讀寫序列都是在內存中完成的。
如果內存中的號段用完了 Mycat 會再向數據庫要一次。
問:那如果 Mycat 崩潰了 ,那內存中的序列豈不是都沒了?
是的。如果是這樣,那麼 Mycat 啓動後會向數據庫申請新的號段,原有號段會棄用。
也就是說如果 Mycat 重啓,那麼損失是當前的號段沒用完的號碼,但是不會因此出現主鍵重複
① 建庫序列腳本
#在 dn1 上創建全局序列表 CREATE TABLE MYCAT_SEQUENCE (NAME VARCHAR(50) NOT NULL,current_value INT NOT NULL,increment INT NOT NULL DEFAULT 100, PRIMARY KEY(NAME)) ENGINE=INNODB; #創建全局序列所需函數 DELIMITER $$ CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS VARCHAR(64) DETERMINISTIC BEGIN DECLARE retval VARCHAR(64); SET retval="-999999999,null"; SELECT CONCAT(CAST(current_value AS CHAR),",",CAST(increment AS CHAR)) INTO retval FROM MYCAT_SEQUENCE WHERE NAME = seq_name; RETURN retval; END $$ DELIMITER ; DELIMITER $$ CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),VALUE INTEGER) RETURNS VARCHAR(64) DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE |
SET current_value = VALUE WHERE NAME = seq_name; RETURN mycat_seq_currval(seq_name); END $$ DELIMITER ; DELIMITER $$ CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS VARCHAR(64) DETERMINISTIC BEGIN UPDATE MYCAT_SEQUENCE SET current_value = current_value + increment WHERE NAME = seq_name; RETURN mycat_seq_currval(seq_name); END $$ DELIMITER ; #初始化序列表記錄 INSERT INTO MYCAT_SEQUENCE(NAME,current_value,increment) VALUES ('ORDERS', 400000, 100); |
② 修改 Mycat 配置
#修改sequence_db_conf.properties vim sequence_db_conf.properties #意思是 ORDERS這個序列在dn1這個節點上,具體dn1節點是哪臺機子,請參考schema.xml #修改server.xml vim server.xml #全局序列類型: 0-本地文件, 1-數據庫方式, 2-時間戳方式。此處應該修改成1。 |
#重啓Mycat |
③ 驗證全局序列
#登錄 Mycat,插入數據 insert into orders(id,amount,customer_id,order_type) values(next value for MYCATSEQ_ORDERS,1000,101,102); #查詢數據 #重啓Mycat後,再次插入數據,再查詢 |
3、 時間戳方式
全局序列ID= 64 位二進制 (42(毫秒)+5(機器 ID)+5(業務編碼)+12(重複累加) 換算成十進制爲 18 位數的
long 類型,每毫秒可以併發 12 位二進制的累加。
① 優點: 配置簡單
② 缺點: 18 位 ID 過長
4、 自主生成全局序列
可在 java 項目裏自己生成全局序列,如下:
① 根據業務邏輯組合
② 可以利用 redis 的單線程原子性 incr 來生成序列
但,自主生成需要單獨在工程中用 java 代碼實現, 還是推薦使用 Mycat 自帶全局序列。
第六章 基於 HA 機制的 Mycat 高可用
在實際項目中, Mycat 服務也需要考慮高可用性,如果 Mycat 所在服務器出現宕機,或 Mycat 服
務故障,需要有備機提供服務,需要考慮 Mycat 集羣。
6.1 高可用方案
我們可以使用 HAProxy + Keepalived 配合兩臺 Mycat 搭起 Mycat 集羣,實現高可用性。 HAProxy
實現了 MyCat 多節點的集羣高可用和負載均衡, 而 HAProxy 自身的高可用則可以通過 Keepalived 來
實現。
編號 | 角色 | IP 地址 | 機器名 |
1 | Mycat1 | 192.168.140.128 | host79.test |
2 | Mycat2 | 192.168.140.127 | host80.test |
3 | HAProxy(master) | 192.168.140.126 | host81.test |
4 | Keepalived(master) | 192.168.140.126 | host81.test |
5 | HAProxy(backup) | 192.168.140.125 | host82.test |
6 | Keepalived(backup) | 192.168.140.125 | host82.test |
6.2 安裝配置 HAProxy
1、 安裝 HAProxy
#1準備好HAProxy安裝包,傳到/opt目錄下 #2解壓到/usr/local/src tar -zxvf haproxy-1.5.18.tar.gz -C /usr/local/src #3進入解壓後的目錄,查看內核版本, 進行編譯 cd /usr/local/src/haproxy-1.5.18 uname -r make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64 # ARGET=linux310,內核版本,使用uname -r查看內核,如: 3.10.0-514.el7,此時該參數就爲linux310; #ARCH=x86_64,系統位數; #PREFIX=/usr/local/haprpxy #/usr/local/haprpxy,爲haprpxy安裝路徑。 #4編譯完成後,進行安裝 make install PREFIX=/usr/local/haproxy #5安裝完成後, 創建目錄、 創建HAProxy配置文件 mkdir -p /usr/data/haproxy/ vim /usr/local/haproxy/haproxy.conf #6向配置文件中插入以下配置信息,並保存 global log 127.0.0.1 local0 #log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 chroot /usr/local/haproxy pidfile /usr/data/haproxy/haproxy.pid uid 99 gid 99 daemon #debug #quiet defaults log global |
mode tcp option abortonclose option redispatch retries 3 maxconn 2000 timeout connect 5000 timeout client 50000 timeout server 50000 listen proxy_status bind :48066 mode tcp balance roundrobin server mycat_1 192.168.140.128:8066 check inter 10s server mycat_2 192.168.140.127:8066 check inter 10s frontend admin_stats bind :7777 mode http stats enable option httplog maxconn 10 stats refresh 30s stats uri /admin stats auth admin:123123 stats hide-version stats admin if TRUE |
2、 啓動驗證
#1啓動HAProxy /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf #2查看HAProxy進程 ps -ef|grep haproxy #3打開瀏覽器訪問 http://192.168.140.125:7777/admin |
#在彈出框輸入用戶名: admin密碼: 123123 #如果Mycat主備機均已啓動,則可以看到如下圖 #4驗證負載均衡,通過HAProxy訪問Mycat mysql -umycat -p123456 -h 192.168.140.126 -P 48066 |
6.3 配置 Keepalived
1、 安裝 Keepalived
#1準備好Keepalived安裝包,傳到/opt目錄下 #2解壓到/usr/local/src tar -zxvf keepalived-1.4.2.tar.gz -C /usr/local/src #3安裝依賴插件 yum install -y gcc openssl-devel popt-devel #3進入解壓後的目錄, 進行配置, 進行編譯 cd /usr/local/src/keepalived-1.4.2 ./configure --prefix=/usr/local/keepalived #4進行編譯, 完成後進行安裝 make && make install #5運行前配置 cp /usr/local/src/keepalived-1.4.2/keepalived/etc/init.d/keepalived /etc/init.d/ mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/src/keepalived-1.4.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ #6修改配置文件 vim /etc/keepalived/keepalived.conf |
#修改內容如下 ! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { #主機配MASTER,備機配BACKUP state MASTER #所在機器網卡 interface ens33 virtual_router_id 51 #數值越大優先級越高 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { #虛擬IP 192.168.140.200 } } virtual_server 192.168.140.200 48066 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP |
real_server 192.168.140.125 48066 { weight 1 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 192.168.140.126 48600 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } |
2、 啓動驗證
#1啓動Keepalived service keepalived start #2登錄驗證 mysql -umycat -p123456 -h 192.168.140.200 -P 48066 |
6.4 測試高可用
1、 測試步驟
#1關閉mycat #2通過虛擬ip查詢數據 mysql -umycat -p123456 -h 192.168.140.200 -P 48066 |
第七章 Mycat 安全設置
7.1 權限配置
1、 user 標籤權限控制
目前 Mycat 對於中間件的連接控制並沒有做太複雜的控制,目前只做了中間件邏輯庫級別的讀
寫權限控制。是通過 server.xml 的 user 標籤進行配置。
#server.xml配置文件user部分 <user name="mycat"> <property name="password">123456</property> <property name="schemas">TESTDB</property> </user> <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user> #如下圖 |
配置說明
標籤屬性 | 說明 |
name | 應用連接中間件邏輯庫的用戶名 |
password | 該用戶對應的密碼 |
TESTDB | 應用當前連接的邏輯庫中所對應的邏輯表。 schemas 中可以配置一個或多個 |
readOnly | 應用連接中間件邏輯庫所具有的權限。 true 爲只讀, false 爲讀寫都有,默認爲 false |
測試案例
#測試案例一 # 使用user用戶,權限爲只讀(readOnly: true) # 驗證是否可以查詢出數據, 驗證是否可以寫入數據 #1、用user用戶登錄,運行命令如下: mysql -uuser -puser -h 192.168.140.128 -P8066 #2、切換到TESTDB數據庫,查詢orders表數據,如下: use TESTDB select * from orders; #3、可以查詢到數據,如下圖 #4、執行插入數據sql,如下: insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000); #5、 可看到運行結果,插入失敗, 只有只讀權限, 如下圖: #測試案例二 # 使用mycat用戶,權限爲可讀寫(readOnly: false) # 驗證是否可以查詢出數據, 驗證是否可以寫入數據 #1、用mycat用戶登錄,運行命令如下: mysql -umycat -p123456 -h 192.168.140.128 -P8066 #2、切換到TESTDB數據庫,查詢orders表數據,如下: use TESTDB select * from orders; #3、可以查詢到數據,如下圖 |
#4、執行插入數據sql,如下: insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000); #5、 可看到運行結果,插入成功,如下圖: |
2、 privileges 標籤權限控制
在 user 標籤下的 privileges 標籤可以對邏輯庫(schema)、表(table)進行精細化的 DML 權限控
制。
privileges 標籤下的 check 屬性,如爲 true 開啓權限檢查,爲 false 不開啓,默認爲 false。
由於 Mycat 一個用戶的 schemas 屬性可配置多個邏輯庫(schema) ,所以 privileges 的下級
節點 schema 節點同樣可配置多個,對多庫多表進行細粒度的 DML 權限控制。
#server.xml配置文件privileges部分 #配置orders表沒有增刪改查權限 <user name="mycat"> <property name="password">123456</property> <property name="schemas">TESTDB</property> <!-- 表級 DML 權限設置 --> <privileges check="true"> <schema name="TESTDB" dml="1111" > <table name="orders" dml="0000"></table> <!--<table name="tb02" dml="1111"></table>--> </schema> </privileges> </user> |
#如下圖 |
配置說明
DML 權限 | 增加(insert) | 更新(update) | 查詢(select) | 刪除(select) |
0000 | 禁止 | 禁止 | 禁止 | 禁止 |
0010 | 禁止 | 禁止 | 可以 | 禁止 |
1110 | 可以 | 禁止 | 禁止 | 禁止 |
1111 | 可以 | 可以 | 可以 | 可以 |
測試案例
#測試案例一 # 使用mycat用戶, privileges配置orders表權限爲禁止增刪改查(dml="0000") # 驗證是否可以查詢出數據, 驗證是否可以寫入數據 #1、 重啓mycat, 用mycat用戶登錄,運行命令如下: mysql -umycat -p123456 -h 192.168.140.128 -P8066 #2、切換到TESTDB數據庫,查詢orders表數據,如下: use TESTDB select * from orders; #3、 禁止該用戶查詢數據,如下圖 #4、執行插入數據sql,如下: insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000); #5、 可看到運行結果, 禁止該用戶插入數據, 如下圖: |
#測試案例二 # 使用mycat用戶, privileges配置orders表權限爲可以增刪改查(dml="1111") # 驗證是否可以查詢出數據, 驗證是否可以寫入數據 #1、 重啓mycat, 用mycat用戶登錄,運行命令如下: mysql -umycat -p123456 -h 192.168.140.128 -P8066 #2、切換到TESTDB數據庫,查詢orders表數據,如下: use TESTDB select * from orders; #3、可以查詢到數據,如下圖 #4、執行插入數據sql,如下: insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000); #5、 可看到運行結果,插入成功,如下圖: #4、執行插入數據sql,如下: delete from orders where id in (7,8); #5、 可看到運行結果,插入成功,如下圖: |
7.2 SQL 攔截
firewall 標籤用來定義防火牆; firewall 下 whitehost 標籤用來定義 IP 白名單 , blacklist 用來定義
SQL 黑名單。
1、 白名單
可以通過設置白名單, 實現某主機某用戶可以訪問 Mycat,而其他主機用戶禁止訪問。
#設置白名單 #server.xml配置文件firewall標籤 #配置只有192.168.140.128主機可以通過mycat用戶訪問 <firewall> <whitehost> <host host="192.168.140.128" user="mycat"/> </whitehost> </firewall> #如下圖 #重啓Mycat後, 192.168.140.128主機使用mycat用戶訪問 mysql -umycat -p123456 -h 192.168.140.128 -P 8066 #可以正常訪問, 如下圖 #在此主機換user用戶訪問,禁止訪問 |
#在192.168.140.127主機用mycat用戶訪問,禁止訪問 |
2、 黑名單
可以通過設置黑名單, 實現 Mycat 對具體 SQL 操作的攔截, 如增刪改查等操作的攔截。
#設置黑名單 #server.xml配置文件firewall標籤 #配置禁止mycat用戶進行刪除操作 <firewall> <whitehost> <host host="192.168.140.128" user="mycat"/> </whitehost> <blacklist check="true"> <property name="deleteAllow">false</property> </blacklist> </firewall> #如下圖 #重啓Mycat後, 192.168.140.128主機使用mycat用戶訪問 mysql -umycat -p123456 -h 192.168.140.128 -P 8066 #可以正常訪問, 如下圖 |
#切換TESTDB數據庫後,執行刪除數據語句 delete from orders where id=7; #運行後發現已禁止刪除數據,如下圖 |
可以設置的黑名單 SQL 攔截功能列表
配置項 | 缺省值 | 描述 |
selelctAllow | true | 是否允許執行 SELECT 語句 |
deleteAllow | true | 是否允許執行 DELETE 語句 |
updateAllow | true | 是否允許執行 UPDATE 語句 |
insertAllow | true | 是否允許執行 INSERT 語句 |
createTableAllow | true | 是否允許創建表 |
setAllow | true | 是否允許使用 SET 語法 |
alterTableAllow | true | 是否允許執行 Alter Table 語句 |
dropTableAllow | true | 是否允許修改表 |
commitAllow | true | 是否允許執行 commit 操作 |
rollbackAllow | true | 是否允許執行 roll back 操作 |
第八章 Mycat 監控工具
8.1 Mycat-web 簡介
Mycat-web 是 Mycat 可視化運維的管理和監控平臺,彌補了 Mycat 在監控上的空白。幫 Mycat 分
擔統計任務和配置管理任務。 Mycat-web 引入了 ZooKeeper 作爲配置中心,可以管理多個節點。
Mycat-web 主要管理和監控 Mycat 的流量、連接、活動線程和內存等,具備 IP 白名單、郵件告警等模
塊,還可以統計 SQL 並分析慢 SQL 和高頻 SQL 等。爲優化 SQL 提供依據。
8.2 Mycat-web 配置使用
1、 ZooKeeper 安裝
安裝步驟如下:
#1下載安裝包http://zookeeper.apache.org/ #2 安裝包拷貝到Linux系統/opt目錄下,並解壓 tar -zxvf zookeeper-3.4.11.tar.gz #3 進入ZooKeeper解壓後的配置目錄(conf) ,複製配置文件並改名 cp zoo_sample.cfg zoo.cfg #4 進入ZooKeeper的命令目錄(bin) ,運行啓動命令 |
./zkServer.sh start #5 ZooKeeper服務端口爲2181,查看服務已經啓動 netstat -ant | grep 2181 |
2、 Mycat-web 安裝
安裝步驟如下:
#1下載安裝包http://www.mycat.io/ #2 安裝包拷貝到Linux系統/opt目錄下,並解壓 tar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz #3 拷貝mycat-web文件夾到/usr/local目錄下 cp -r mycat-web /usr/local #4 進入mycat-web的目錄下運行啓動命令 cd /usr/local/mycat-web/ ./start.sh & #5 Mycat-web服務端口爲8082,查看服務已經啓動 netstat -ant | grep 8082 #6 通過地址訪問服務 http://192.168.140.127:8082/mycat/ |
3、 Mycat-web 配置
安裝步驟如下:
#1 先在註冊中心配置ZooKeeper地址,配置後刷新頁面,可見 #2 新增Mycat監控實例 |
8.3 Mycat 性能監控指標
在 Mycat-web 上可以進行 Mycat 性能監控,例如:內存分享、流量分析、連接分析、活動線程分
析等等。