您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > heisenberg开发手册
Heisenberg分库分表开发指南Heisenberg结构Heisenberg是基于mysql协议一个分库分表中间件服务器,其上层应用不需要关心相关的分库分表,而直接使用heisenberg的shard功能环境搭建Maven+JDK部署好svncheckout下载到本地后,Mvnpackage之在本地target里会生成一个heisenberg-server-1.0.1.zip文件解压之目录结构如下:进入conf目录进入bin目录shstartup.sh开启服务数据库搭建这个就自然不必说百度有个很好的初始化工具:主从,建库神马的都可以这里提供下我建的二个库(主从):Master:cq02-mco-lctest00.cq02.baidu.com:8701root/st0078Slave:cq02-mco-lctest01.cq02.baidu.com:8701root/st0078分库表配置进入conf文件夹,见下面日志配置vilog4j.xml将相关的日志改为infoRoot也改为infoAlarm的保持为error即可。Server配置Viserver.xml处理器配置systempropertyname=serverPort8166/propertypropertyname=managerPort8266/propertypropertyname=initExecutor16/propertypropertyname=timerExecutor4/propertypropertyname=managerExecutor4/propertypropertyname=processors4/propertypropertyname=processorHandler8/propertypropertyname=processorExecutor8/propertypropertyname=clusterHeartbeatUser_HEARTBEAT_USER_/propertypropertyname=clusterHeartbeatPass_HEARTBEAT_PASS_/property/systemserverPort为服务端口,即对上层应用的端口managerPort为管理端口,即管理的监听端口,用于操作服务器一些配置等initExecutor为初始化的线程个数timerExecutor心跳执行线程个数managerExecutor管理执行线程个数processors应用接收处理器核数processorHandler应用接收处理类个数processorExecutor应用接收处理线程个数clusterHeartbeatUser和clusterHeartbeatPass不必改,用于集群的认证方式使用应用用户密码username=brucexxpropertyname=passwordst0078/propertypropertyname=schemastrans_shard/property/userBrucexx为自定义应用用户名,st0078为自定义应用密码Schemas为自定义schema,具体见schema.xml中,这里的schemas可为多个,以逗号分隔集群设定clusternodename=cobar1propertyname=host127.0.0.1/propertypropertyname=weight1/property/nodenodename=cobar2propertyname=host127.0.0.1/propertypropertyname=weight1/property/node/cluster这里定义了集群结点的一些结点,仅限于使用heisenbergjdbcdriver做集群负载的,这里会定义一些集群信息,这里面heisenberg会自动管理踢除相应的结点白名单限制quarantinehostname=1.2.3.4propertyname=usertest/property/host/quarantine上面是只能test用户进行登陆schema配置mysql数据源dataSourcename=transDStype=mysqlpropertyname=locationlocation10.58.49.14:8701/db$0-9/location/propertypropertyname=userroot/propertypropertyname=passwordst0078/propertypropertyname=sqlModeSTRICT_TRANS_TABLES/property/dataSource这里指定的mysql的数据源,后面$0-9是一种自定义的缩略写法也可以在property里面定义多个location,比如:propertyname=locationlocation10.58.49.14:8701/db0/locationlocation10.58.49.14:8701/db1/locationlocation10.58.49.14:8701/db2/location/property效果是一样的Shard结点配置Shard结点相当于一个逻辑结点,提供给外部相关的schema,对应于数据源有主/备/灾,dataNodename=transDNpropertyname=dataSource!--主库--dataSourceReftransDS$0-9/dataSourceRef!--备库--dataSourceReftransSlaveDS$0-9/dataSourceRef!--灾库--dataSourceReftransSlaveDS$0-9/dataSourceRef!--slave,暂无--!--dataSourceRefds_shard_slave$0-3/dataSourceRef--/propertypropertyname=rwRule![CDATA[m:0,s:1]]/propertypropertyname=poolSize256/propertypropertyname=heartbeatSQLselectuser()/property/dataNode属性dataSource第一个是主库,第二个备库,第三个灾库,需要多少配置多少个读写分离规则rwRule,m和s代表读取的比例,表示主库读取为0,从库读取1,这样直接读写分离,如果是1:1的话相当读取各1:1的比例池大小poolSize为到mysqlDB的连接数和心跳sqlheartbeatSQL,无特殊需求保持不变Schema配置schemaname=trans_shardtablename=trans_online,trans_content,trans_tbdataNode=transDN$0-9rule=rule1//schematrans_shard提供的schema,对应于server.xml中的名字下面会有多个需要分库的表,tablename=trans_onlinedataNode=transDN$0-9rule=rule1/这里必须要把需要分库分表的内容写出来,当然,如果不分库表也是可以的tablename=”tbxxxdataNode=transDN0ruleRequired=”false”/分库分表rule先上配置virule.xmlruletableRulename=rule1columnsTRANS_ID/columnsdbRuleListdbRule![CDATA[#set($start=$TRANS_ID.length()-2)###set($end=$TRANS_ID.length()-1)##$stringUtil.substring($TRANS_ID,$start,$end)]]/dbRule/dbRuleListtbRuleListtbRule![CDATA[#set($start=$TRANS_ID.length()-2)##$stringUtil.substring($TRANS_ID,$start)]]/tbRule/tbRuleList!--00-99100个表,每个表属于哪个结点MapInteger,SetString--tbPrefix![CDATA[defmap=[:];for(inti=0;i10;i++){deflist=[];for(intj=0;j10;j++){list.add(i++j);}map.put(i,list);};returnmap;]]/tbPrefix/tableRule/rule其中columnsTRANS_ID/columns可以有多个,以逗号分隔这个列名必须要大写分库分表使用velocity语法渲染,表前缀采用groovy进行初始化分库规则配置dbRuleListdbRule![CDATA[#set($start=$TRANS_ID.length()-2)###set($end=$TRANS_ID.length()-1)##$stringUtil.substring($TRANS_ID,$start,$end)]]/dbRule/dbRuleList分库规则dbRuleList可以有多个dbRule,当第一个不满足时,可以用第二个,当然这个效率不好,如果有规则区分,尽量再写一个rule,dbRule最后的结果是表的前缀比如分库分表库名为db0-db9,那么这个dbRule渲染时取到TRANS_ID这个为后,在脚本里计算出取倒数第2位为库后缀分表规则配置tbRuleListtbRule![CDATA[#set($start=$TRANS_ID.length()-2)##$stringUtil.substring($TRANS_ID,$start)]]/tbRule/tbRuleList这个和上面分库一样了,以倒数1,2位为库的后缀有个潜规则就是需要保证全局的表名不能重复比如db0有个trans_tb00,db1就不能有叫trans_tb00的表表初始化!--00-99100个表,每个表属于哪个结点MapInteger,SetString--tbPrefix![CDATA[defmap=[:];for(inti=0;i10;i++){deflist=[];for(intj=0;j10;j++){list.add(i++j);}map.put(i,list);};returnmap;]]/tbPrefix需要初始化个表,其中key为db的下标索引,比如db0的下标为0,list为每个库里的表后缀名目录是为了初始化定义这些库表服务器部署注意事项1.使用bin/startup.sh脚本启动即可2.集群负载使用bvs3.必须要通过heisenberg直接连接mysqlDB,如果通过dbproxy又隔了一层,效率会低很多性能初测结果年前测试约2300TPS,和客户端连接数有关,heisenberg服务器未到瓶颈,load在0.0-0.2之间,二台物理mysqlload已经到0.9-2.0,由于时间原
本文标题:heisenberg开发手册
链接地址:https://www.777doc.com/doc-2875962 .html