用cobar搭建分布式数据库 .

时间:2022-08-06 04:13:47

周末针对最新的项目需求进行cobar的搭建并针对实际状况做了demo演示

一、需求

1、大数据量,邮件发送记录需要记录,一年可能累计4亿的数据

2、需要按照邮箱进行邮件发送明细的查询以及发送记录的查询


二、问题

1、单库分表分区已经解决不了存储以及查询问题

2、只能进行一致性hash的策略进行数据存储以及查询,放弃了一些便利性查询统计


三、实施方案,数据库采用mysql,使用cobar针对分区库和主库进行整合

整合步骤如图,看不清可以下载附件看


四、相关配置文件以及工具文件如下

1、操作指南:edm-cobar操作指南.txt

[html] view plaincopyprint?
  1. 1、mysql -h192.168.20.65 -uroot -p1q2w3e -P8066  
  2. 2、show databases;  
  3. 3、use edm;  
  4. 4、show tables;  
  5.   
  6.   
  7.   
  8. note:  
  9. 1、cobar server作为代理,安装在20.65上,并且以root/1q2w3e为口令,8066为服务端口提供了数据库代理服务  
  10. 具体路径/usr/local/cobar***  
  11. 2、我们的数据库可以以这个代理服务器为访问端口,按照email这个字符串进行水平的hash路由到各个水平节点上  
  12. 3、对于不需要水平拆分的表,我们也可以直接通过20.65提供的这个edm服务访问  
  13.   
  14. warning:  
  15. 1、直接用sqlyog软件访问这个代理数据库可能会报错,因为获取数据问题。不过我们可以直接通过cmd来查询。  
  16. 2、我们的数据校验,可以通过直接访问各个节点进行数据校验  
  17.    


2、实施策略图片:EDM分布式数据库策略之Cobar.jpeg

用cobar搭建分布式数据库 .

3、cobar的相关配置文件:rule.xml,schema.xml,server.xml

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!--  
  3.  - Copyright 1999-2012 Alibaba Group.  
  4.  -    
  5.  - Licensed under the Apache License, Version 2.0 (the "License");  
  6.  - you may not use this file except in compliance with the License.  
  7.  - You may obtain a copy of the License at  
  8.  -    
  9.  -      http://www.apache.org/licenses/LICENSE-2.0  
  10.  -    
  11.  - Unless required by applicable law or agreed to in writing, software  
  12.  - distributed under the License is distributed on an "AS IS" BASIS,  
  13.  - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  14.  - See the License for the specific language governing permissions and  
  15.  - limitations under the License.  
  16. -->  
  17. <!DOCTYPE cobar:schema SYSTEM "schema.dtd">  
  18. <cobar:schema xmlns:cobar="http://cobar.alibaba.com/">  
  19.   
  20.   <!-- schema定义 -->  
  21.   <schema name="edm" dataNode="dnEdm">  
  22.     <table name="email_info" dataNode="dn_shardx$0-7,dn_shardy$0-7" rule="email_rule" />  
  23.     <table name="email_info_detail" dataNode="dn_shardx$0-7,dn_shardy$0-7" rule="email_rule" />  
  24.   </schema>  
  25.   
  26.   <!-- 数据节点定义,数据节点由数据源和其他一些参数组织而成。-->  
  27.   <dataNode name="dnEdm">  
  28.     <property name="dataSource">  
  29.       <dataSourceRef>db_edmx[0]</dataSourceRef>  
  30.     </property>  
  31.   </dataNode>  
  32.   
  33.   <dataNode name="dn_shardx">  
  34.     <property name="dataSource">  
  35.       <dataSourceRef>db_edmx$1-8</dataSourceRef>  
  36.     </property>  
  37.   </dataNode>  
  38.   
  39.   <dataNode name="dn_shardy">  
  40.     <property name="dataSource">  
  41.       <dataSourceRef>db_edmy$0-7</dataSourceRef>  
  42.     </property>  
  43.   </dataNode>  
  44.   
  45.   <!-- 数据源定义,数据源是一个具体的后端数据连接的表示。-->  
  46.   <dataSource name="db_edmx" type="mysql">  
  47.     <property name="location">  
  48.       <!--edm  总库-->  
  49.       <location>192.168.20.182:3306/edm_hd</location>  
  50.   
  51.       <location>192.168.20.182:3306/edmshard$1-8</location>  
  52.   
  53.     </property>  
  54.     <property name="user">root</property>  
  55.     <property name="password">your_password</property>  
  56.     <property name="sqlMode">STRICT_TRANS_TABLES</property>  
  57.   </dataSource>  
  58.   
  59.   <dataSource name="db_edmy" type="mysql">  
  60.     <property name="location">  
  61.       <location>192.168.119.158:3306/edmshard$9-16</location>  
  62.     </property>  
  63.     <property name="user">root</property>  
  64.     <property name="password">your_password</property>  
  65.     <property name="sqlMode">STRICT_TRANS_TABLES</property>  
  66.   </dataSource>  
  67. </cobar:schema>  

[html] view plaincopyprint?
  1. <!DOCTYPE cobar:rule SYSTEM "rule.dtd">  
  2. <cobar:rule xmlns:cobar="http://cobar.alibaba.com/">  
  3.   
  4.   <!-- 路由规则定义,定义什么表,什么字段,采用什么路由算法 -->  
  5.   <tableRule name="email_rule">  
  6.     <rule>  
  7.       <columns>email</columns>  
  8.       <algorithm><![CDATA[ efunc(${email}) ]]></algorithm>  
  9.     </rule>  
  10.   </tableRule>  
  11.   
  12.   <!-- 路由函数定义 -->  
  13.   <function name="efunc" class="com.alibaba.cobar.route.function.PartitionByString">  
  14.     <property name="partitionCount">16</property>  
  15.     <property name="partitionLength">64</property>  
  16.   </function>  
  17.   
  18. </cobar:rule>  

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!--  
  3.  - Copyright 1999-2012 Alibaba Group.  
  4.  -    
  5.  - Licensed under the Apache License, Version 2.0 (the "License");  
  6.  - you may not use this file except in compliance with the License.  
  7.  - You may obtain a copy of the License at  
  8.  -    
  9.  -      http://www.apache.org/licenses/LICENSE-2.0  
  10.  -    
  11.  - Unless required by applicable law or agreed to in writing, software  
  12.  - distributed under the License is distributed on an "AS IS" BASIS,  
  13.  - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  14.  - See the License for the specific language governing permissions and  
  15.  - limitations under the License.  
  16. -->  
  17. <!DOCTYPE cobar:server SYSTEM "server.dtd">  
  18. <cobar:server xmlns:cobar="http://cobar.alibaba.com/">  
  19.     
  20.   <!-- 系统参数定义,服务端口、管理端口,处理器个数、线程池等。 -->  
  21.   <!--  
  22.   <system>  
  23.     <property name="serverPort">8066</property>  
  24.     <property name="managerPort">9066</property>  
  25.     <property name="initExecutor">16</property>  
  26.     <property name="timerExecutor">4</property>  
  27.     <property name="managerExecutor">4</property>  
  28.     <property name="processors">4</property>  
  29.     <property name="processorHandler">8</property>  
  30.     <property name="processorExecutor">8</property>  
  31.     <property name="clusterHeartbeatUser">_HEARTBEAT_USER_</property>  
  32.     <property name="clusterHeartbeatPass">_HEARTBEAT_PASS_</property>  
  33.   </system>  
  34.   -->  
  35.   
  36.   <!-- 用户访问定义,用户名、密码、schema等信息。 -->  
  37.   <user name="root">  
  38.     <property name="password">1q2w3e</property>  
  39.     <property name="schemas">edm</property>  
  40.   </user>  
  41.   <!--  
  42.   <user name="root">  
  43.     <property name="password"></property>  
  44.   </user>  
  45.   -->  
  46.   
  47.   <!-- 集群列表定义,指定集群节点的主机和权重,用于集群间的心跳和客户端负载均衡。 -->  
  48.   <!--   
  49.   <cluster>  
  50.     <node name="cobar1">  
  51.       <property name="host">127.0.0.1</property>  
  52.       <property name="weight">1</property>  
  53.     </node>  
  54.   </cluster>  
  55.    -->  
  56.      
  57.   <!-- 隔离区定义,可以限定某个主机上只允许某个用户登录。 -->  
  58.   <!--  
  59.   <quarantine>  
  60.     <host name="1.2.3.4">  
  61.       <property name="user">test</property>  
  62.     </host>  
  63.   </quarantine>  
  64.   -->  
  65.   
  66. </cobar:server>  


4、测试数据文件:edm_demo.sql



5、生成测试sql的java类:GenShardSql.java  你可以自己生成测试数据以及测试库了

package com.gen.sql;

public class GenShardSql {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

//通过cobar进行数据展示
String a="use edm;";
System.out.println(a);

System.out.println("/**==================================================**/");
GenShardSql gss=new GenShardSql();
//清理主库以及分区库
gss.clearDate();

System.out.println("/**==================================================**/");
//给主库增加数据
gss.println_edm_hd(100);
System.out.println("/**==================================================**/");
//给分区库增加数据
gss.println_email_info(100);
System.out.println("/**==================================================**/");

gss.println_email_info_detail(100);
System.out.println("/**==================================================**/");
//修改数据
gss.modifyEmailData(1, 16, 88888);

//初始化分区库
gss.initdb(1, 16);

}

public void clearDate(){
//清理主库
String del="delete from edm_users;";
System.out.println(del);

//清理分区库
del="delete from email_info;";
System.out.println(del);
//清理分区库
del="delete from email_info_detail;";
System.out.println(del);
}

public void println_email_info(int num){
String a="";
for(int i=0;i<num;i++){
a="insert into email_info(email,num,note) values (\'hdedm"+i+"@hc360.com\',"+i+",\'aa\');";
System.out.println(a);
}
}

public void println_email_info_detail(int num){
String b="";
for(int i=0;i<num;i++){
b="insert into email_info_detail(email,num_a,num_b) values ('hdedm"+i+"@hc360.com',"+i+","+-i+");";
System.out.println(b);
}
}


public void println_edm_hd(int num){
String a="use edm;";
System.out.println(a);
String b="";
for(int i=0;i<num;i++){
b="insert into edm_users(name,email,password,grouptype,dateline) values (\'edm_hd"+i+"\',\'edm_hd"+i+"@hc360.com\',\'psw"+i+"\',\'1\',UNIX_TIMESTAMP(CURRENT_TIMESTAMP));";
System.out.println(b);
}


}
/**初始化分区DB*/
public void initdb(int start,int end){
for(int i=start;i<=end;i++){
String create="create database if not exists `edmshard"+i+"`;";
String use="USE `edmshard"+i+"`;";
String drop1="DROP TABLE IF EXISTS `email_info`;";
String c_t1="CREATE TABLE `email_info` ( `email` varchar(300) CHARACTER SET utf8 DEFAULT NULL, `num` int(10) DEFAULT NULL, `note` varchar(500) CHARACTER SET utf8 DEFAULT NULL,`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";

String drop2="DROP TABLE IF EXISTS `email_info_detail`;";
String c_t2="CREATE TABLE `email_info_detail` ( `email` varchar(300) COLLATE utf8_unicode_ci DEFAULT NULL, `num_a` int(10) DEFAULT 0, `num_b` int(10) DEFAULT 0, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";


System.out.println(create);
System.out.println(use);
System.out.println(drop1);
System.out.println(c_t1);
System.out.println(drop2);
System.out.println(c_t2);

System.out.println("/**==================================================**/");
}

}


/**
* 根据邮箱更改某个分区的数据
* */
public void modifyEmailData(int start,int end,int val){
String ms="";
for(int i=start;i<end;i++){
ms="update email_info ei set ei.num="+val+", ei.create_time=now() where ei.email=\'hdedm"+i+"@hc360.com\';";
System.out.println(ms);
}
System.out.println("/**==================================================**/");
for(int i=start;i<end;i++){
ms="update email_info_detail eid set eid.num_a="+val+", eid.create_time=now() where eid.email=\'hdedm"+i+"@hc360.com\';";
System.out.println(ms);
}
System.out.println("/**==================================================**/");
}
}