代码地址:
https://github.com/brucexx/heisenberg
其优点: 分库分表与应用脱离,分库表如同使用单库表一样
减少db 连接数压力
热重启配置
可水平扩容
遵守Mysql原生协议
无语言限制,mysqlclient,c,java等都可以使用
Heisenberg服务器通过管理命令可以查看,如连接数,线程池,结点等,并可以调整
采用velocity的分库分表脚本进行自定义分库表,相当的灵活
之前在组里有做过简单的分享,这段时间稍微轻松了点,先分享出来,看有没有更好的idea在这块有所提升
下面开始介绍heisenberg
1.heisenberg总体架构
首先这块架构:
应用对于heisenberg集群来说就是mysql客户端,
而heisenberg也是集成了mysql的原生协议,所以对于应用来说,就相当于单库单表的数据源
无论是mysql客户端,c,jdbc驱动等都可以访问heisenberg服务器,由服务器把分库分表的工作给做掉了
访问heisenberg集群可以通过像lvs,F5等负载软件/设备解决,
其实一台heisenberg的性能是相当的赞了,我压力到2320TPS load 都还只有0.1-0.3左右(CPU 8core,16G),由于找不到mysql物理机器了,只得做罢
服务端内部结构:
其中FrontConnectionFactory为面向应用的连接管理,ManagerConnectionFactory为面向heisenberg服务器内部管理的一些连接管理,比如更改配置后热重启,关闭 某个连接等功能
mysql协议贯穿于应用程序与mysql服务器,最终解析为相关的mysql数据包, 授权包,注册包等
当heisenberg服务器接收到SQL语句后,通过AST语法解析 解析成 DML,DCL,DDL类型以及相关列名的值等等,然后通过ServerRouter这一层,经过分库分表的切分,最终将切分好的语句放入对应数据结点进行执行
分库分表的切分,为了满足各种通用性灵活性,使用了velocity和groovy 2种语法来支持,其中groovy是初始化表和库和映射关系的,只在加载时初始化一次;而velocity是用来渲染对应的分库和分表规则的。
OK,知道了原理,那么开始说明如何使用分库分表吧
2.heisenberg开发
Maven +JDK 部署好
https://github.com/brucexx/heisenberg
下载到本地后,
Mvn package 之
在本地target里会生成一个heisenberg-server-1.0.0.zip 文件
解压之 unzip heisenberg-server-1.0.0.zip
进入conf目录
有下面几个目录
conf
---log4j.xml
---rule.xml
---schema.xml
---server.xml
log4j.xml就不介绍了
sql_route.log就是分库表切分的时间
sql_execute.log 为sql总执行时间
server.xml
"serverPort">8166 "managerPort">8266 "initExecutor">16 "timerExecutor">4 "managerExecutor">4 "processors">4 "processorHandler">8 "processorExecutor">8 "clusterHeartbeatUser">_HEARTBEAT_USER_ "clusterHeartbeatPass">_HEARTBEAT_PASS_
|
serverPort为服务端口,即对上层应用的端口
managerPort为管理端口,即管理的监听端口,用于操作服务器一些配置等
initExecutor 为初始化的线程个数
timerExecutor 心跳执行线程个数
managerExecutor管理执行线程个数
processors应用接收处理器核数
processorHandler 应用接收处理类个数
processorExecutor 应用接收处理线程个数
clusterHeartbeatUser和clusterHeartbeatPass 不必改,用于集群的认证方式使用
"brucexx"> "password">st0078 "schemas">trans_shard
|
Brucexx为自定义应用用户名,st0078为自定义应用密码
Schemas为自定义schema,具体见schema.xml中,
这里的schemas可为多个,以逗号分隔
白名单限制:
test
|
schema.xml配置
mysql数据源
"transDS" type="mysql"> "location"> 10.58.49.14:8701/db$0-9
"user">root "password">st0078 "sqlMode">STRICT_TRANS_TABLES
|
这里指定的mysql的数据源,后面$0-9是一种自定义的缩略写法
也可以在property里面定义多个location,比如:
"location"> 10.58.49.14:8701/db0 10.58.49.14:8701/db1 10.58.49.14:8701/db2
|
效果是一样的
Shard结点配置
Shard结点相当于一个逻辑结点,提供给外部相关的schema,对应于数据源有
主/备/灾,
"transDN"> "dataSource">
transDS$0-9
transSlaveDS$0-9
transSlaveDS$0-9
"rwRule">m:0,s:1 "poolSize">256 "heartbeatSQL">select user()
|
属性dataSource 第一个是主库,第二个备库,第三个灾库,需要多少配置多少个
读写分离规则rwRule,m和s代表读取的比例,表示主库读取为0,从库读取1,这样直接读写分离,如果是1:1的话相当读取各1:1的比例
池大小poolSize为到mysqlDB的连接数和心跳sql heartbeatSQL,无特殊需求保持不变
Schema配置
"trans_shard">
"trans_online, trans_content, trans_tb "dataNode="transDN$0-9"rule="rule1"/>
trans_shard 提供的schema,对应于server.xml中的名字 下面会有多个需要分库的表, "trans_online"dataNode="transDN$0-9"rule="rule1"/> 这里必须要把需要分库分表的内容写出来,当然,如果不分库表也是可以的
”tbxxx"dataNode="transDN0" ruleRequired=”false”/
rule.xml分库分表规则配置,其中columns,dbRuleList,tbRuleList里面的列名要保持大写
首先先上一个整体配置
其中dbRuleList 为分库规则
分库规则dbRuleList可以有多个dbRule,当第一个不满足时,可以用第二个,当然这个效率不好,如果有规则区分,尽量再写一个rule, dbRule 最后的结果是表的前缀 比如分库分表 库名为db0-db9,那么这个dbRule渲染时
取到TRANS_ID 这个为后,在脚本里计算出取倒数第2位为库后缀 比如上图的分库为
分表规则配置
这个和上面分库一样了,以倒数1,2位为库的后缀 如下图:
有个潜规则就是 需要保证全局的表名不能重复 比如db0有个trans_tb00,db1就不能有叫trans_tb00的表
表初始化
需要初始化个表,其中key为db的下标索引,比如db0 的下标为0, list为每个库里的表后缀名
目录是为了初始化定义这些库表
如何使用呢? 通过命令行 这里就不用讲了,wms_shard就是在server.xml里面配置的逻辑分库分表的数据源schema,应用只要访问这个就好了
show tables;也可以看到自己的一些表信息
ok.
mysql> select * from t_user_id_map; +-----------+---------------------------+-----------+------------+---------------------+---------------------+ | F_uid | F_uname | F_enabled | F_user_id | F_create_time | F_modify_time | +-----------+---------------------------+-----------+------------+---------------------+---------------------+ | 105001050 | @8230762802717b6a723fe9cd | 1 | 1287824017 | 2014-03-10 15:38:44 | 2014-03-10 15:38:44 | | 62000 | | 1 | 533885000 | 2014-03-26 23:02:31 | 2014-03-26 23:02:31 | | 86000 | | 1 | 237406000 | 2014-03-27 01:04:23 | 2014-03-27 01:04:23 | | 96000 | | 1 | 767684000 | 2014-03-27 00:30:32 | 2014-03-27 00:30:32 | | 130000 | | 1 | 506552000 | 2014-03-27 15:57:31 | 2014-03-27 15:57:31 | | 149000 | | 1 | 868483000 | 2014-03-27 15:50:09 | 2014-03-27 15:50:09 | | 179000 | | 1 | 245626000 | 2014-03-26 21:33:46 | 2014-03-26 21:33:46 | 当没有指定分库分表规则时,是进行的全表扫描,当然我们可以通过学习 mysql> explain select * from t_user_id_map; +-----------+----------------------------------- | DATA_NODE | SQL +-----------+----------------------------------- | wmsDN[0] | select * from t_user_id_map_00_0 | wmsDN[0] | select * from t_user_id_map_00_1 | wmsDN[0] | select * from t_user_id_map_00_2 | wmsDN[0] | select * from t_user_id_map_00_3 | wmsDN[0] | select * from t_user_id_map_00_4 | wmsDN[0] | select * from t_user_id_map_00_5 | wmsDN[0] | select * from t_user_id_map_00_6 | wmsDN[0] | select * from t_user_id_map_00_7 | wmsDN[0] | select * from t_user_id_map_00_8 | wmsDN[0] | select * from t_user_id_map_00_9 | wmsDN[1] | select * from t_user_id_map_01_0 | wmsDN[1] | select * from t_user_id_map_01_1 | wmsDN[1] | select * from t_user_id_map_01_2 | wmsDN[1] | select * from t_user_id_map_01_3 | wmsDN[1] | select * from t_user_id_map_01_4 | wmsDN[1] | select * from t_user_id_map_01_5 | wmsDN[1] | select * from t_user_id_map_01_6 | wmsDN[1] | select * from t_user_id_map_01_7 | wmsDN[1] | select * from t_user_id_map_01_8 | wmsDN[1] | select * from t_user_id_map_01_9 | wmsDN[2] | select * from t_user_id_map_02_0 .... 这边表很多,其中dataNode是我们里面对应的结点
mysql> select * from t_user_id_map where f_uid=196606999; +-----------+---------+-----------+-----------+---------------------+---------------------+ | F_uid | F_uname | F_enabled | F_user_id | F_create_time | F_modify_time | +-----------+---------+-----------+-----------+---------------------+---------------------+ | 196606999 | | 1 | 749331999 | 2014-04-04 14:46:58 | 2014-04-04 14:46:58 | +-----------+---------+-----------+-----------+---------------------+---------------------+ 1 row in set (0.04 sec) 这边配置的是按F_uid最后三位分库分表的,dbRuleList配置的是倒数2,3位, tbRuleList配置的是最后1位
我们看下是怎么路由的
mysql> explain select * from t_user_id_map where f_uid=196606999; +-----------+---------------------------------------------------------+ | DATA_NODE | SQL | +-----------+---------------------------------------------------------+ | wmsDN[99] | select * from t_user_id_map_99_9 where f_uid=196606999 | +-----------+---------------------------------------------------------+ 1 row in set (0.03 sec)
可以看到data_node --> wmsDN[99] ,分库位 t_user_id_map_99_9 对应的表 |
http://blog.sina.com.cn/s/blog_56d988430102vdfo.html
相关推荐
**MySQL分库分表中间件Heisenberg详解** 在数据库设计中,随着业务的发展和数据量的增加,单个数据库往往难以承受高并发和大数据量的处理压力,这时就需要引入分库分表策略来优化系统性能。Heisenberg是一款开源的...
Atlas作为一个中间件,能够将应用程序和MySQL数据库之间的细节隐藏起来,让应用开发者无需关心底层数据库的复杂操作,如读写分离、分库分表等。DBA的维护工作对前端应用透明,可以轻松地进行数据库的上下线操作而不...
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
,,基于SMO的三相PMSM无速度传感器控制(基于反正切函数) ,核心关键词:SMO(滑模观测器); 三相PMSM(永磁同步电机); 无速度传感器控制; 反正切函数; 控制系统。,基于SMO算法的三相PMSM无速度传感器反正切函数控制
网络文化互动中的舆论引导与危机应对
人力资源+大数据+薪酬报告+涨薪调薪,在学习、工作生活中,越来越多的事务都会使用到报告,通常情况下,报告的内容含量大、篇幅较长。那么什么样的薪酬报告才是有效的呢?以下是小编精心整理的调薪申请报告,欢迎大家分享。相信老板看到这样的报告,一定会考虑涨薪的哦。
内容概要:本文全面探讨了大学生沉迷网络游戏的现状及成因,强调该问题已严重影响大学生的学业和个人发展。据统计显示,中国大学生网络游戏成瘾患病率超过15%,问题广泛且严重。分析指出沉迷原因涵盖个人因素(如自我管理能力缺失、逃避现实压力)、家庭因素(例如家庭教育缺失和家庭氛围不和谐)、学校因素(如大学管理松散和校园文化活动匮乏),以及社会因素(例如网游设计吸引人和监管部门不严)。基于以上成因,提出了多层次综合治理方案,包括但不限于强化家庭教育和沟通、改善大学管理模式、丰富校园文化、加强网络游戏审查力度和社会心理健康辅导等方面的对策。 适用人群:本研究适用于高校辅导员、心理学家、教育政策决策人员,以及关心青年成长的社会各界人士。 使用场景及目标:本文旨在引起社会对该问题的关注,并为教育界和其他相关群体提供了详细的参考资料用于制定相应的干预措施,以减少大学生游戏成瘾情况的发生。此外,也可供家长学习科学育子知识。 其他说明:除了直接提出具体治理办法外,还特别提到了营造健康的网络文化环境的重要性,提倡多方协作共促学生健康发展。同时呼吁进一步加强对网络游戏产业的研究与管理,确保产业的良性发展的同时也能
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用
TI维也纳整流器设计.rar
自驾游中的手机APP推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
视讯镜头专利复现,基本复现
,,OMRON CP1H PLC脉冲控制三轴伺服, 码垛机,实际项目,程序结构清析,有完整的注释,重复功能做成FB功能块,在其它项目可以导出直接用,MCGS触摸屏程序,有电气CAD图纸。 ,关键词:OMRON CP1H PLC;脉冲控制;三轴伺服;码垛机;程序结构清晰;完整注释;FB功能块;MCGS触摸屏程序;电气CAD图纸。,OMRON PLC三轴伺服脉冲控制程序:结构清晰、注释完整,FB功能块可复用,配合MCGS触摸屏及CAD图纸的实际项目应用
是一款基于JAVA的串口调试工具,支持波特率9600-115200,仅供参考学习使用,
,,CO2激光切割机雕刻机打标机写字机喷涂机巡边机控制软件,包含上位机和控制板,也可源码 视频展示只体现工作流程和加工效果,如果激光功率足够大最快速度能跑到每秒两米 支持文件格式说明: 控制版和上位机通信接口为百兆以太网接口,数据载体为标准TCP协议 1.g代码 2.打印图片 3.plt格式文件 4.激光机在切割有效线条时匀速切割 5.有效线条切割速度和空程速度分别设置 6.空程运行具备加减速控制 7.图片打印时上位机界面实时显示打印进度 8.打开的图片和图形文件可鼠标缩放和拖动 9.图片格式转并保存转完成的指定格式图片 10.手动回原点控制 ,核心关键词: CO2激光切割机; 雕刻机; 打标机; 写字机; 喷涂机; 巡边机; 控制软件; 上位机; 控制板; 源码; 视频展示; 工作流程; 加工效果; 激光功率; 速度; 两秒; 文件格式; g代码; 打印图片; plt格式文件; 有效线条切割; 空程速度设置; 加减速控制; 上位机界面实时显示; 图片缩放和拖动; 图片格式转换; 手动回原点控制。 关键词用分号隔开: CO2激光切割机; 喷涂机; 控制软件; g代码; 图片格式转
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。