MyCat學習、使用、安裝、配置

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 性能監控,例如:內存分享、流量分析、連接分析、活動線程分
析等等。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章