记录.NetCore如何使用MyCat

随着.NetCore的发展,最近我们也顺利的服务化、容器化了,生产环境全部跑在Linux了,下一步准备Devops。但随着数据量的逐渐增多和所处行业的业务性质,个别服务对应的数据库开始进行开始做分布式数据库了。前期也做过简单的技术调研,比如efcore读写分离、新生命团队的开源中间件XCode、以前有些服务基于CQRS开发的做一个小改动使之支持读写分离、MyCat中间件等,最终我们选用MyCat在一个服务上进行小规模使用。

MyCat是件,能做什么,在这里就不一一细说了,放一个官网链接,有兴趣的朋友可以查看》http://www.mycat.io/

以下以本机win10系统为例详细记录:

【需要的环境】

java环境jdk

mycat-server

mycat-eye

zookeeper

navicat 客户端 navicat for mysql

mysql 环境(5.5以上)

【下载MyCat】

下载地址:https://github.com/MyCATApache/Mycat-download,我下载的是Mycat-server-1.6版本;

【配置&安装】

下载完成解压到你想要的目录,解压后的目录说明:

bin执行文件

conf配置文件

lib依赖包

logs日志

conf目录中主要文件

rule.xml分片规则配置文件

schema.xml数据库配置文件

server.xml系统参数配置文件

然后,使用管理员权限打开cmd并到MyCat的安装目录,切换到mycat/bin目录;执行startup_nowrap.bat,一般情况都可以启动成功。因这这个时候所有的配置都是默认的。

接下来就需要按我们的业务需要来配置MyCat了,这里建议先不要按网上的资料马上开始贴过来配置,而是先花点时间了解一下它的分片规则,个人觉得这个很重要。

假设我们有3个数据库实例:

db1:localhost:3306 nick_mysqlcluster_test_1

db2:localhost:3306 nick_mysqlcluster_test_2

db3:localhost:3306 nick_mysqlcluster_test_3

同主机db1,db2,db3中 t_test表 为分片表 以CreateTime为分片字段进行数据分片;

CREATE TABLE `t_test` (
  `Id` varchar(36) NOT NULL,
  `Name` varchar(64) NOT NULL,
  `CreateTime` datetime NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

使用Navicat Premium 12或其他工具联上你的MySQL创建三个库(nick_mysqlcluster_test_1、2、3),每个库中一个表(t_test)每个库中的t_test表结构是一样的。

【rule.xml分片规则配置】

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	<tableRule name="sharding-by-date-rule">
        <rule>
            <columns>CreateTime</columns>
            <algorithm>sharding-by-date</algorithm>
        </rule>
    </tableRule>
    <function name="sharding-by-date" class="io.mycat.route.function.PartitionByDate">
        <property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2019-10-01</property>
        <property name="sPartionDay">10</property>
    </function>
</mycat:rule>

注:这里配置的意思为从2019-10-01开始,每10天一个分片。其他的分片策略请看官网。

【schema.xml数据库配置文件】

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <table name="t_test" rule="sharding-by-date-rule" dataNode="dn1,dn2,dn3"/> 		
		<table name="t_test2" type="global" primaryKey="Id" dataNode="dn1"/>
	</schema>
	<dataNode name="dn1" dataHost="localhost1" database="nick_mysqlcluster_test_1"/>
	<dataNode name="dn2" dataHost="localhost1" database="nick_mysqlcluster_test_2"/>
	<dataNode name="dn3" dataHost="localhost1" database="nick_mysqlcluster_test_3"/>
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
		<heartbeat>select user()</heartbeat>  
		<writeHost host="hostM1" url="localhost:3306" user="root" password="******"/>
	</dataHost>
</mycat:schema>

【server.xml系统参数配置文件】

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	<system>
		<property name="defaultSqlParser">druidparser</property>
		<property name="useHandshakeV10">1</property>
		<property name="mutiNodeLimitType">1</property>
		<property name="charset">utf8</property>
		<property name="serverPort">8066</property>
		<property name="managerPort">9066</property>
	</system>
	<user name="root">
		<property name="password">nickhuang</property>
		<property name="schemas">TESTDB</property>
	</user>
	<user name="user">
		<property name="password">testuser</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
	</user>
</mycat:server>

如果环境都配置好同时MyCat的重要三个文件也配置完成,看一下成果吧:管理员权限打开cmd并到MyCat的安装目录,切换到mycat/bin目录;执行mycat start看看是否可以执行成功。

如果不成功请检查以下原因:

先查看日志:在哪找?logs/wrapper.log文件!记到哦。

1.MySQL的版本问题:最初我装的是8.0.16版本,一直无法启动,后来才知道目前为止MyCat不支持8.0,当然有办法解决,这里不啰嗦这些,改装5.7.27版本,没有问题;

2.如果jdk1.8,请修改conf/wrapper.conf文件:wrapper.java.additional.3=-XX:MaxPermSize=64M更改为:wrapper.java.additional.3=-XX:MaxMetaspaceSize=64M

3.如果配置的是其他分片策略,可能会出现不同的问题 ,这里要一一排查,我也无法一下写全,这里只记录这两个比较重要的问题 。

OK,这时候再start,启动成功。

程序中如何使用呢?

这一部分网上的文章真不多,而且有也完全不可以使用,由于我们分库分表的这个服务使用的ORM是efcore,很多人说要用Pomelo.EntityFrameworkCore.MyCat,我也尝试了很多次,无果。这里记录一下真实可用的方案:

重要:只安装包mysql.data.entityframework.core包,其他的都不要安装,包括Pomelo.EntityFrameworkCore.MyCat!!!

2.DbContext       

public class SampleContext : DbContext
    {
        public SampleContext(DbContextOptions<SampleContext> options) : base(options)
        {

        }

        public DbSet<User> User { get; set; }
    }

3.Startup

services.AddDbContext<SampleContext>(options => options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));

4.appsettings.json

"ConnectionStrings": {
    "DefaultConnection": "server=localhost;port=8066;uid=root;pwd=******;database=TESTDB"
  }

以前的业务代码都不用改。只是在这里,我们以前直接MySQL,现在的一个变化是转而连接MyCat。

跑起来,用Postman试一下吧,分别写入CreateTime为:2019-10-08、2019-10-12、2019-10-19或其他,看看他们会写到哪个库的t_test表中,是不是和我们预期的一样呢?

先写到这里,以后有时间,继续完善其他功能。如果有小伙伴感兴趣,可以加Q38095589交流。

也请大牛多指点,感谢!

 

 

 

 

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