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/