.NET开发者如何使用MyCat
背景
在開發(fā)中,我們設(shè)計的系統(tǒng)的效率在很大程度上會受到數(shù)據(jù)庫引擎單表的性能制約,因此在數(shù)據(jù)量龐大、或記錄過寬時,需要考慮分庫分表從而減輕數(shù)據(jù)庫壓力,提升查詢效率。此外配置讀寫分離,讓主數(shù)據(jù)庫處理事務(wù)性查詢,而從數(shù)據(jù)庫處理SELECT查詢。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性查詢導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。使用讀寫分離最大的作用無非是環(huán)境服務(wù)器壓力。
什么是MyCat?
從定義和分類來看,它是一個開源的分布式數(shù)據(jù)庫系統(tǒng),是一個實現(xiàn)了MySQL協(xié)議的服務(wù)器,前端用戶可以把它看作是一個數(shù)據(jù)庫代理,用MySQL客戶端工具和命令行訪問,而其后端可以用MySQL原生協(xié)議與多個MySQL服務(wù)器通信,也可以用JDBC協(xié)議與大多數(shù)主流數(shù)據(jù)庫服務(wù)器通信,其核心功能是分表分庫,即將一個大表水平分割為N個小表,存儲在后端MySQL服務(wù)器里或者其他數(shù)據(jù)庫里。
MyCat發(fā)展到目前的版本,已經(jīng)不是一個單純的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流數(shù)據(jù)庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲。而在最終用戶看來,無論是那種存儲方式,在MyCat里,都是一個傳統(tǒng)的數(shù)據(jù)庫表,支持標(biāo)準(zhǔn)的SQL語句進(jìn)行數(shù)據(jù)的操作,這樣一來,對前端業(yè)務(wù)系統(tǒng)來說,可以大幅降低開發(fā)難度,提升開發(fā)速度。
MyCat的優(yōu)勢
基于阿里巴巴的開源項目Cobar,具備良好的穩(wěn)定性、可靠性、優(yōu)良的結(jié)構(gòu)和優(yōu)良的性能,擁有許多的項目案例。站在巨人的肩膀上,MyCAT將走的更遠(yuǎn)。
廣泛借鑒最好的開源項目和創(chuàng)新的理念,讓這些融入MyCAT的基因,使MyCAT成為領(lǐng)先其他電商等類似的開源項目,甚至超過了一些企業(yè)級應(yīng)用。
MyCAT技術(shù)團隊的參與者都經(jīng)歷過至少五多年的項目經(jīng)驗,團隊中包括一些高級軟件工程師、架構(gòu)師、DBA。由精英們組成的MYCAT技術(shù)團隊將確保產(chǎn)品質(zhì)量。
MyCAT是完全獨立的社區(qū),不依附于任何企業(yè),遵循著完全開放、免費、開源的原則。它不像一些開源項目,重要的功能封閉在其商業(yè)產(chǎn)品,并使開源項目像一個裝飾。
支持超過60種的數(shù)據(jù)庫作為數(shù)據(jù)節(jié)點,如MySQL、SQL Server、Oracle、MongoDB、DB2等
MyCat與ADO.NET
由于MyCAT與MySQL協(xié)議有些許差異,開發(fā)者可能不能夠直接使用Oracle官方提供的Mysql.Data(ADO層)來與MyCAT直接連接,因此我們專門為.NET開發(fā)者設(shè)計了針對MyCAT優(yōu)化過的ADO層驅(qū)動,即Pomelo.Data.MyCat,開發(fā)者通過使用MyCatConnection、MyCatCommand類可以實現(xiàn)對MyCAT的連接與查詢。下面將展示一個簡短的使用MyCat for ADO.NET來向MyCAT寫入數(shù)據(jù)。
首先將NuGet包?Pomelo.Data.MyCat?添加至?project.json?中:
{"version": "1.0.0-*","buildOptions": { ? ?"emitEntryPoint": true ?},"dependencies": { ? ?"Microsoft.NETCore.App": { ? ? ?"type": "platform", ? ? ?"version": "1.0.0" ? ?}, ? ?"Pomelo.Data.MyCat": "1.0.0-*" ?},"frameworks": { ? ?"netcoreapp1.0": { ? ? ?"imports": "dnxcore50" ? ?} ?}}MyCatConnection,?MyCatCommand等內(nèi)容在命名空間?Pomelo.Data.MyCat?中. 按照常規(guī)的ADO.NET開發(fā)流程即可實現(xiàn)對MyCAT的操作。
using Pomelo.Data.MyCat;namespace MyCatAdoSample{ ?
?public class Program ? ?{ ? ? ?
? ? ??public static void Main(string[] args) ? ? ? ?{ ? ? ?
? ? ?? ? ?using (var conn = new MyCatConnection(
"server=localhost;database=adosample;uid=root;pwd=yourpwd")) ? ? ? ? ? ?{ ? ? ? ? ? ? ? ?conn.Open(); ? ? ?
? ? ? ? ?using (var cmd = new MyCatCommand(
"INSERT INTO `test` (`content`) VALUES ('Hello MyCat')"
, conn)) ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ?cmd.ExecuteNonQuery(); ? ? ? ? ? ? ? ?} ? ? ? ? ? ?} ? ? ? ?} ? ?} }
MyCat 與 Entity Framework Core
由于MyCAT的協(xié)議與MySQL有所差異,導(dǎo)致了無論是Java平臺下的Hibernate還是.NET下的Entity Framework都無法使用MySQL的EF provider來操作MyCAT,這點在Migrations以及Code First上表現(xiàn)的尤為明顯,此外開發(fā)者不僅需要手動建庫,還需要配置分片規(guī)則等,操作繁瑣。
因此我們特地開發(fā)了專門為MyCAT量身打造的Entity Framework Core Provider,即Pomelo.EntityFrameworkCore.MyCat。
下面我們將詳細(xì)介紹如何在Ubuntu 14.04 Server中部署MyCAT,以及使用Entity Framework Core來使用Code First模式使用MyCAT,并使用EF的Migration功能來創(chuàng)建數(shù)據(jù)庫以及進(jìn)行遷移工作。
1、在服務(wù)器中安裝Java8、MySQL5.7以及.NET Core SDK
# add-apt-repository ppa:webupd8team/java # apt-get update# apt-get install oracle-java8-installer # wget http://dev.mysql.com/get/mysql-apt-config_0.6.0-1_all.deb # dpkg -i mysql-apt-config_0.6.0-1_all.deb # apt-get update# apt-get install mysql-community-server
# sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ trusty main" > /etc/apt/sources.list.d/dotnetdev.list'
# apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
# apt-get update# apt-get install dotnet-dev-1.0.0-preview2-003121
2、下載Pomelo.EntityFrameworkCore.MyCat.Proxy?和?MyCat Server,將MyCat Server解壓至/usr/local/mycat中,將Pomelo.EntityFrameworkCore.MyCat.Proxy解壓至~/proxy中
并編輯~/proxy/config.json,將MyCatRoot設(shè)置為/usr/local/mycat。
3、進(jìn)入~/proxy目錄,啟動MyCat for Entity Framework Core的代理程序:
nohup dotnet Pomelo.EntityFrameworkCore.MyCat.Proxy.dll
4、創(chuàng)建一個.NET Core控制臺程序,并將Pomelo.EntityFrameworkCore.MyCat添加至project.json中。
5、創(chuàng)建模型,如創(chuàng)建一個Blog模型:
using System;using System.ComponentModel.DataAnnotations;
namespace MyCatDemo.Models { ?
? ?public class Blog
? ?{ ? ? ?
? ? ?public long Id { get; set; }[MaxLength(64)] ? ?
? ? ?? ?public string Title { get; set; } ? ?
? ? ?? ?public string Content { get; set; } ? ? ?
? ? ?? ?public DateTime Time { get; set; }} }
6、創(chuàng)建DbContext類,并重寫DbContext中的OnConfiguring方法,配置數(shù)據(jù)節(jié)點以及MyCAT服務(wù)器信息
protected override void OnConfiguring(? ? ? ? ? ? DbContextOptionsBuilder optionsBuilder)
{ ? ?base.OnConfiguring(optionsBuilder);optionsBuilder.UseMyCat(
"server=192.168.0.129;database=blog;uid=test;pwd=test")
// MyCAT連接字符串.UseDataNode("192.168.0.129", "blog_1", "root", "123456")
// 數(shù)據(jù)節(jié)點連接信息.UseDataNode("192.168.0.129", "blog_2", "root", "123456").UseDataNode("192.168.0.129", "blog_3", "root", "123456").UseDataNode("192.168.0.129", "blog_4", "root", "123456"); }
7、編寫Main方法中的邏輯,向數(shù)據(jù)庫中插入數(shù)據(jù)
using System;using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using MyCatDemo.Models;
namespace MyCatDemo{ ?
? ?public class Program{ ? ? ?
? ? ? ??public static void Main(string[] args) ? ? ? ?{ ? ? ? ?
? ? ? ??? ?var DB = new SampleContext(); ?
? ? ? ??? ?for(var i = 0; i < 100; i++){DB.Blogs.Add(new Blog
? ? ? ??? ? {
? ? ? ??? ? ?Title = "New post #" + i,
? ? ? ??? ? Content = "Hello mycat",
? ? ? ??? ? ?Time = DateTime.Now });}DB.SaveChanges();Console.Read();}} }
8、在控制臺中執(zhí)行dotnet ef migrations add Init和dotnet ef database update來創(chuàng)建數(shù)據(jù)庫。
9、運行控制臺程序。
10、使用Navicat或其他工具查看各個節(jié)點數(shù)據(jù)情況
最后附上示例的完整屏幕錄像
class="video_iframe" data-vidtype="1" style=" z-index:1; " height="375" width="500" frameborder="0" data-src="https://v.qq.com/iframe/preview.html?vid=x03233od6kw&width=500&height=375&auto=0" allowfullscreen>
相關(guān)文章:
MyCat:開源分布式數(shù)據(jù)庫中間件
原文地址:http://www.1234.sh/post/mycat-getting-started-cn
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的.NET开发者如何使用MyCat的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis集群~StackExchang
- 下一篇: .NET 程序集单元测试工具 Smoke