mycat分库分表

垂直分:A业务,B业务,C业务分别放在不同的数据库。

水平分:A业务同样的表复制3份,放到3个数据库。

通俗理解:垂直分,锤子,锤烂  ---> 表结构不一样;水平分,复制的感觉,一样的表结构

===================================================================

mysql分片和分区的区别:

当数据库表中数据量能够被预测到将会非常大,或者已经拥有庞大的数据时,
我们应该选择分表或者分区(即使用多个数据库)来解决数据访问时的性能问题。
如果单机的cpu能够承受站点的并发数,应该选择分表的方式,因为分表相对简单,
容易实现scale,而且涉及到多表连接时,分区是不能直接使用join的。
但如果站点并发数太大,需要多个cpu来访问多个数据库是无疑的,
这时需要选择分区的方式。

分表能够解决单表数据量过大带来的查询效率下降的问题,但是,
却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,
当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,
此时都没有意义了。因此,我们必须换一种思路,对数据库进行拆分,
从而提高数据库写入能力,这就是所谓的分库。

(一般最少200万数据考虑分表,但是如果对查询性能要求不太高,或者有其他需求,可以调整)

先根据业务或者区域分库=》再分表(本篇仅讨论分库)

搭建参考资料:

https://blog.youkuaiyun.com/yelllowcong/article/details/79063546

https://blog.youkuaiyun.com/sinat_34093604/article/details/78708119

使用参考:

https://www.jianshu.com/p/26513f428ecf

https://blog.youkuaiyun.com/linlinv3/article/details/51777324

分片规则:

https://blog.youkuaiyun.com/xiaobluesky/article/details/50429428

https://blog.youkuaiyun.com/webnum/article/details/78312025

常遇错误:

https://blog.youkuaiyun.com/smooth00/article/details/71082046

https://www.cnblogs.com/ivictor/archive/2016/01/25/5155123.html

http://blog.51cto.com/goome/2058959

https://blog.youkuaiyun.com/l1028386804/article/details/53441395

mycat与sharddingJdbc 对比:

mycat 相比于sharddingJdbc中间多一层proxy,sharddingJdbc实现是轻量级实现

===========================================================================================
启动MyCat:

进入bin目录然后:
./mycat start
查看启动状态:
./mycat status
停止:
./mycat stop
重启:
./mycat restart 

===========================================================================================

实际操作步骤:

一、环境

Mycat部署一共需要用到三台服务器 , 两台mysql服务器 , 一台mycat服务器.

一台mysql服务器分别建10个实例 , 总计20个。( dss_db1 - dss_db20 )

Mycat版本:  Mycat-server-1.6-release (在mycat 服务器上不需要安装mysql,但是要安装jdk)

  • 创建mysql数据库实例

在第一台mysql中:

执行建库、建表语句

在第二台mysql中:

执行建库、建表语句

(如果当前环境只有一台mysql , 则在一台mysql上建立20个数据库实例)

三、安装mycat

将mycat安装包下载下来,选择目录存放

#解压文件

tar -zxvf Mycat-server-1.6-RELEASE-xxx-linux.tar.gz

修改配置文件:

1.server.xml中

TESTDB均改为 ***DB

123456设置为连接mycat对应的密码(Navicat连接mycat的密码,账户为root)

修改<property name="useOffHeapForMerge">0</property>

2.

用mycat配置文件中的schema.xml替换  schema.xml (自己配置表名和所属数据库实例,然后还有连接的数据库的用户和密码)

修改 localhost1与localhost2下面对应的 url 与password

(现在只有一台mysql就配置为一样)

用mycat配置文件中的rule.xml替换 rule.xml (根据自己的业务配的划分规则,例如:枚举(适合区域)、一致性hash(适合大数据量、方便扩容))

用mycat配置文件中的partition-hash-int.txt替换 partition-hash-int.txt (这里面根据自己的业务配置的区域划分规则,例如:北京在第一台数据库实例,上海在第二台等等,可以北京上海都在一台,后面的值一样就行。)

3.

wrapper.conf中修改

wrapper.java.command=/usr/lib/jvm/java-1.8.0/bin/java(这个是linux服务器下jdk的安装目录,最后的结尾必须到/java)

4.Log4j2.xml里面配level属性 置日志级别

  • 启动mycat

进入bin目录然后:
./mycat start
查看启动状态:
./mycat status
停止:
./mycat stop
重启:
./mycat restart

logs文件夹下 wrapper.log 查看mycat日志,mycat启动后,日志最后打印successful则表示mycat启动成功,然后用navicat连接mycat。

(如果要插入数据,需要在mycat下用insert into 带上完整列名添加,mycat会自动插入对应的分片上,查询也在mycat下面查询 ; 如果熟悉分片,按区域枚举分片的数据也可以直接在对应的分片下面直接添加;详情见mycat分片文档)

四、连接mycat

Navicat中 用server.xml设置的mycat密码连接mycat(账户为root , mycat端口是8066)

在mycat中 执行mysql脚本中的3mycat

区域按枚举分配,数据量大的,不是区域为主键的用一致性hash分(方便以后扩容),数据量不大的可以设置为全局表,避免跨表join(每个库都同步数据,取的时候从任意一个库中取),其余可以设置为普通表,数据只放到一台数据库上。(单点的情况)

<!--设置编码 -->

server.xml添加:
<property name="charset">utf8</property>

<!--设置schema可以直接在mycat连接里面打开表,否则报schema不存在-->
<schema name="***" checkSQLschema="false" sqlMaxLimit="100" > , false改为true,

mycat默认返回100条,可以用limit限制,也可以在配置文件中配置

===========================================================================================

实际问题:

一般1千万的数据有1个G的内存,在造千万级的数据时候可以用jdbc插入数据库,然后同时开启线程,最快的百度有人已经实现3分多钟插入1个亿的数据,我们实际操作50分钟左右才插入1个亿的数据,有待优化。

navicat里面还有一个数据同步的功能,可以在开发和测试来回切换数据或者是临时存储,为了方便修改了功能和sql语句,免得重新跑数据。

===========================================================================================

sql优化:

就是老一套的索引、缓存、搜索引擎(solr,es)等。

===========================================================================================

最后的啰嗦,分布式数据库才是以后的发展方向:

参考资料:
http://www.sohu.com/a/256862409_268033

===========================================================================================

mycat集群

官方推荐:

   (根据不同的业务场景,mysql可以分为写写分离,读写分离)

### MyCAT 分库分表实现与配置教程 #### 1. MyCAT 分库分表的概念 MyCAT 是一款开源的分布式数据库中间件,支持通过逻辑层来管理物理上的多个数据库实例。其核心功能之一就是分库分表,即将数据按照一定的规则分布在不同的数据库或者表中[^1]。 分库分表的主要目的是解决单机数据库性能瓶颈以及存储容量不足的问题。通过对业务数据进行水平拆分,可以显著提升系统的扩展性和并发处理能力。 --- #### 2. 配置文件说明 MyCAT分库分表主要依赖于以下几个重要的配置文件: - **schema.xml**: 定义逻辑数据库、逻辑表及其对应的物理节点。 - **rule.xml**: 定义分片规则,指定如何将数据分配到不同分片上。 - **server.xml**: 配置全局参数,如线程池大小、连接超时时间等。 这些文件通常位于 MyCAT 的 `conf` 目录下[^3]。 --- #### 3. 创建逻辑数据库和逻辑表 在 schema.xml 中定义逻辑数据库和逻辑表。例如: ```xml <schema name="testDB" checkSQLSchema="false" sqlMaxLimit="100"> <table name="payment_info" dataNode="dn1,dn2" rule="auto-sharding-long"/> </schema> <dataNode name="dn1" dataHost="host1" database="db1"/> <dataNode name="dn2" dataHost="host1" database="db2"/> <dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="localhost" url="jdbc:mysql://192.168.1.1:3306/" user="root" password="password"/> </dataHost> ``` 上述配置表示 `payment_info` 表的数据会根据 `auto-sharding-long` 规则分布到 `db1` 和 `db2` 数据库中[^4]。 --- #### 4. 定义分片规则 分片规则由 rule.xml 文件定义。以下是基于主键范围 (`range-long`) 的分片规则示例: ```xml <tableRule name="auto-sharding-long"> <rule> <columns>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> </function> ``` 其中,`autopartition-long.txt` 文件用于映射具体的分片区间。例如: ``` 0=dn1 1000=dn2 ``` 这表明当 `id` 小于 1000 时,数据会被路由到 `dn1`;大于等于 1000 则被路由到 `dn2`。 --- #### 5. 测试分库分表效果 完成以上配置后,可以通过 MySQL 客户端测试分库分表的效果。例如: ```sql -- 登录 MyCAT mysql -umycat -p123456 -h 192.168.110.145 -P 8066 -- 插入数据 INSERT INTO payment_info(order_id, payment_status) VALUES(1, 1); INSERT INTO payment_info(order_id, payment_status) VALUES(1001, 1); -- 查询数据 SELECT * FROM payment_info; ``` 第一条记录应存放在 `db1`,而第二条记录应存放在 `db2`[^2]。 --- #### 6. 注意事项 - 确保各物理节点之间的网络连通性良好。 - 在设计分片规则时需充分考虑查询场景,避免跨分片的复杂关联操作。 - 如果需要修改现有的分库分表策略,则可能涉及数据迁移工作,建议提前规划并做好备份。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值