MyCat負載均衡 下篇
之前在 一步一步在Windows中使用MyCat負載均衡 上篇 中已經講了如何配置出MyCat。下面講其相關的使用。
五、配置MyCat-eye
對於MyCat監控官網還提供一個MyCat-eye web系統來展示它的運行情況。
MyCat發展到目前的版本,已經不是一個單純的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流數據庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在MyCat里,都是一個傳統的數據庫表,支持標准的SQL語句進行數據的操作,這樣一來,對前端業務系統來說,可以大幅降低開發難度,提升開發速度
MyCAT-WEB就是基於mycat的一個性能監控工具,方便大家更有效的使用mycat管理mycat監控mycat,讓大家的mycat工作更加高效。
下載:http://dl.mycat.io/

運行eye之前還需要安 zookeeper,所以先安裝 zookeeper ,
解壓到 D:\zookeeper-3.4.6
到目錄conf 下創建 zoo.cfg 文件,默認就是加載這個文件,文件內容 我直接copy 的sample里面的
#zoo.cfg 的內容 # 心跳檢查的時間 2秒 tickTime=2000 # 初始化時 連接到服務器端的間隔次數,總時間10*2=20秒 initLimit=10 # ZK Leader 和follower 之間通訊的次數,總時間5*2=10秒 syncLimit=5 # 存儲內存中數據庫快照的位置,如果不設置參數,更新事務日志將被存儲到默認位置。 dataDir=D:\\zookeeper-3.4.6\\zkdata # 錯誤日志的存放位置 dataLogDir=F:\\zookeeper-3.4.6\\logs # ZK 服務器端的監聽端口 clientPort=2181
然后 cd 到bin 目錄下 執行zkServer.cmd 就啟動成功了。
注意:dataDir 和 dataLogDir 目錄不會自動創建,得手動創建才能啟動。
可以用netstat -ano|findstr "2181" 看看是否OK。
也可以用JPS 查看啟動的JAVA 進程的情況,會出現這樣
C:\windows\system32>jps 8068 10040 QuorumPeerMain // 這東西是zk的東西,源碼有介紹 10556 Jps
也可以用自帶客戶端命令 : zkCli.cmd -server 127.0.0.1:2181
關於JPS的東西,可以自己去JAVA_HOME\bin 目錄下去看,里面很多命令
安裝好zookeeper后,啟動MyCat
windows啟動
啟動start.bat
inux啟動
啟動start.sh
打開mycat-web窗口
輸入網址:http://localhost:8082/mycat/
若沒配置好zookeeper會出現下面的頁面

當配置好后會出現:

添加mycat服務,用戶名,密碼為之前配置的mycat ,123456,保存


還可以添加對mysql的監控,在mysql管理中添加。

對SQL的監控我這測試了幾天,還沒數據,可能哪里配置沒有加,所以后面再處理。eye具體的使用資料網上不是很多,需要自己探索。
六、在NET中使用MyCat
由於MyCAT與MySQL協議有些許差異,開發者可能不能夠直接使用Oracle官方提供的Mysql.Data(ADO層)來與MyCAT直接連接,因此我們專門為.NET開發者設計了針對MyCAT優化過的ADO層驅動,即Pomelo.Data.MyCat,開發者通過使用MyCatConnection、MyCatCommand類可以實現對MyCAT的連接與查詢。下面將展示一個簡短的使用MyCat for ADO.NET來向MyCAT寫入數據。
在vs中nuget引入Pomelo.Data.MyCat,但安裝報下面的錯

錯誤提示net框架4.5版本低了,所以調到4.6。
MyCatConnection, MyCatCommand等內容在命名空間 Pomelo.Data.MyCat 中. 按照常規的ADO.NET開發流程即可實現對MyCAT的操作。
Pomelo.Data.MyCat的使用與mysql一致:
封裝基礎代碼:
private static readonly string connectionString = "server=localhost;database=TESTDB;uid=mycat;pwd=123456";
/// <summary>
/// 執行SQL語句,返回影響的記錄數
/// </summary>
/// <param name="SQLString">SQL語句</param>
/// <returns>影響的記錄數</returns>
public static int ExecuteSql(string SQLString, params MyCatParameter[] cmdParms)
{
using (MyCatConnection connection = new MyCatConnection(connectionString))
{
using (MyCatCommand cmd = new MyCatCommand())
{
try
{
PrepareCommand(cmd, connection, null, SQLString, cmdParms);
int rows = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return rows;
}
catch (MyCatException e)
{
throw e;
}
}
}
}
/// <summary>
/// 執行查詢語句,返回DataSet
/// </summary>
/// <param name="SQLString">查詢語句</param>
/// <returns>DataSet</returns>
public static DataSet Query(string SQLString)
{
using (MyCatConnection connection = new MyCatConnection(connectionString))
{
DataSet ds = new DataSet();
try
{
connection.Open();
MyCatDataAdapter command = new MyCatDataAdapter(SQLString, connection);
command.Fill(ds, "ds");
}
catch (MyCatException ex)
{
throw new Exception(ex.Message);
}
return ds;
}
}
private static void PrepareCommand(MyCatCommand cmd, MyCatConnection conn, MyCatTransaction trans, string cmdText, MyCatParameter[] cmdParms)
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
if (trans != null)
cmd.Transaction = trans;
cmd.CommandType = CommandType.Text;//cmdType;
if (cmdParms != null)
{
foreach (MyCatParameter parameter in cmdParms)
{
if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
(parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
cmd.Parameters.Add(parameter);
}
}
}
插入數據:
string name = textBox1.Text;
if (string.IsNullOrEmpty(name)) return;
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into hotnews(");
strSql.Append("newsname)");
strSql.Append(" values (");
strSql.Append("@newsname)");
MyCatParameter[] parameters = {
new MyCatParameter("@newsname", MyCatDbType.VarChar,100),
};
parameters[0].Value = name;
int rows = ExecuteSql(strSql.ToString(), parameters);
if (rows > 0)
{
label1.Text = "添加成功";
}
else
{
label1.Text = "添加失敗";
}
查詢數據:
StringBuilder strSql = new StringBuilder();
strSql.Append("select * ");
strSql.Append(" FROM hotnews ");
DataSet ds = Query(strSql.ToString());
dataGridView1.DataSource = ds.Tables[0];
七、注意
MyCat 主鍵ID自增長配置,但保存時還是會出現下面的情況,當還是沒指定ID時,插入的ID還是下面的ID會導致插入失敗,因此想做分布式最好是將ID設置為自己生成GUID,這樣不管哪個庫都是全局唯一。若還是想自增型,可以參考園友這篇:MyCat 主鍵ID自增長配置

需要提醒的是MyCat不僅用於MySQL,而且支持Oracle、DB2、SQL Server、PostgreSQL等
基於心跳的自動故障切換,支持讀寫分離,支持MySQL主從,以及galera cluster集群
支持單庫內部任意join,支持跨庫2表join,甚至基於caltlet的多表join
支持數據的多片自動路由與聚合,支持sum,count,max等常用的聚合函數,支持跨庫分頁
更多功能請參考官網
MyCat官網:http://www.mycat.org.cn/

