天天看点

cobar配置安装

1、下载cobar http://code.alibabatech.com/wiki/display/cobar/release

2、进入cobar-server-1.2.4目录,可以看到Cobar的主要目录如下:

bin    #包含Cobar的启动、重启、停止等脚本文件

conf   #包含Cobar所有配置文件

lib    #包含Cobar及其依赖的jar文件

logs   #包含Cobar所有日志文件

3、Cobar的所有配置文件全部放在conf目录中,进入conf目录,可以看到:

server.xml   #Cobar系统、用户、集群等相关配置

schema.xml   #schema,dataNode,dataSource相关配置

rule.xml     #分布式规则定义

log4j.xml    #日志相关配置

4、mysql中数据准备

    配置两台机器的mysql,ip地址分别为:192.168.1.110 、 192.168.1.113 端口为3306 用户名 root 密码为空。我们需要在 192.168.1.110上创建database:dbtest1,dbtest2,dbtest3;table:tb1(在dbtest1上),tb2(dbtest2、dbtest3上)。在192.168.1.113上创建database:dbtest31,dbtest32;table:tb1(dbtest31上),tb2(dbtest32上)

数据库创建脚本:

#########################################192.168.1.110

#创建dbtest1

drop database if exists dbtest1;

create database dbtest1;

use dbtest1;

#在dbtest1上创建tb1

create table tb1(

id int not null,

gmt datetime);

#创建dbtest2

drop database if exists dbtest2;

create database dbtest2;

use dbtest2;

#在dbtest2上创建tb2

create table tb2(

id int not null,

val varchar(256));

#创建dbtest3

drop database if exists dbtest3;

create database dbtest3;

use dbtest3;

#在dbtest3上创建tb2

create table tb2(

id int not null,

val varchar(256));

#########################################192.168.1.113

#创建dbtest31

drop database if exists dbtest1;

create database dbtest1;

use dbtest31;

#在dbtest1上创建tb1

create table tb1(

id int not null,

gmt datetime);

#创建dbtest32

drop database if exists dbtest2;

create database dbtest2;

use dbtest32;

#在dbtest2上创建tb2

create table tb2(

id int not null,

val varchar(256));

5、配置schema.xml

参考:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=7671478

请确保机器上设置了JAVA环境变量JAVA_HOME

<!--定义schema db_single, 该schema未做分布式存储,类似于5.1节中schema逻辑层次图中的db2-->

<!--对schema db_single所有表的访问均路由到dnTest1 上执行-->

<!--<schema name="db_single" dataNode="dnTest1"/>-->

<!--定义schema db_shard-->

<!--所有除tb1,tb2之外表的访问都路由到dnTest1 去执行-->

<schema name="db_shard" dataNode="dnTest1">

 <!--对tb1的访问会根据规则tb1Rule路由到dnTest1,dnTest1的某一个或某几个datanode执行-->

 <table name="tb1" dataNode="dnTest1,dnTest1" rule="rule1" />

 <!--对tb2的访问会根据规则string_val_2路由到dnTest2,dnTest3,dnTest5的某一个或两个datanode执行-->

 <table name="tb2" dataNode="dnTest2,dnTest3,dnTest5" rule="rule1" />

</schema>

 <!--rule1,将会在rule.xml的tableRule中定义,可以不想同-->

<!--数据节点由主、备数据源,心跳,连接池等配置组成。-->

  <!--数据节点名称-->

  <dataNode name="dnTest1">

    <property name="dataSource">

      <!--第一行dataSourceRef表示主数据源-->

      <dataSourceRef>dsTest[0]</dataSourceRef>

      <!--第二行dataSourceRef表示备数据源-->

      <!--<dataSourceRef>ds_single_slave</dataSourceRef>-->

      <!--如果需要一主多备的情况,可以将第二备数据源配置在第三行,以此类推-->

      <!--<dataSourceRef>ds_single_slave2</dataSourceRef>-->

    </property>

    <!--Cobar与后端数据源连接池大小设置-->

    <!--<property name="poolSize">256</property>-->

    <!--Cobar通过心跳来实现后端数据源HA,一旦主数据源心跳失败,便切换到备数据源上工作-->

    <!--Cobar心跳是通过向后端数据源执行一条SQL语句,根据该语句的返回结果判断数据源的运行情况-->

    <!--<property name="heartbeat">select user()<property>-->

  </dataNode>

   <dataNode name="dnTest2">

    <property name="dataSource">

      <dataSourceRef>dsTest[1]</dataSourceRef>

    </property>

  </dataNode>

<dataNode name="dnTest3">

    <property name="dataSource">

      <dataSourceRef>dsTest[2]</dataSourceRef>

    </property>

  </dataNode>

<dataNode name="dnTest4">

    <property name="dataSource">

      <dataSourceRef>dsTest[3]</dataSourceRef>

    </property>

  </dataNode>

<dataNode name="dnTest5">

    <property name="dataSource">

      <dataSourceRef>dsTest[4]</dataSourceRef>

    </property>

  </dataNode>

<!-- 数据源定义,数据源是一个具体的后端数据连接的表示。-->

  <!--数据源的名称与类型,Cobar暂时只支持mysql这种类型-->

  <dataSource name="dsTest" type="mysql">

    <!--连接的地址,端口和schema名称-->

    <property name="location">

        <location>192.168.1.110:3306/dbtest1</location>

     <location>192.168.1.110:3306/dbtest2</location>

     <location>192.168.1.110:3306/dbtest3</location>

     <location>192.168.1.113:3306/dbtest31</location>

     <location>192.168.1.113:3306/dbtest32</location>

    </property>

     <!--连接用户名,密码-->

    <property name="user">root</property>

    <property name="password"></property>

    <!--连接的SQL模式-->

    <property name="sqlMode">STRICT_TRANS_TABLES</property>

  </dataSource>

此处要注意开启远程连接root用户的权限

grant all privileges on *.* to root#'%'

6、配置rule.xml

tableRule

tableRule主要作用是用来判断SQL语句路由到哪些datanode执行,Cobar是通过在SQL中提取一个或多个字段的值,并根据这些字段的值来决定路由到哪个库执行。因此,tableRule定义两个要素:

1)按表中的哪个字段路由?------下文中我们称此字段为路由字段

2)有了字段值,如何路由?------即路由函数

<tableRule name="rule1">

    <rule>

      <!--id为路由字段-->

      <columns>id</columns>

      <!--func1 是路由函数,参数为id-->

      <algorithm><![CDATA[func1(${id})]]></algorithm>

    </rule>

</tableRule>

function

参考:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=7671871

<!--定义function名称,如果路由字段是字符串类型,对应class路径为com.alibaba.cobar.route.function.PartitionByString-->

  <function name="func" class="com.alibaba.cobar.route.function.PartitionByString">

    <!--该路由函数将1024分成多少个区段-->

    <property name="partitionCount">4</property>

    <!--每一区段的长度, 满足4 * 256 = 1024-->

    <property name="partitionLength">256</property>

    <!--字符串需要先取hash值再做映射,这里定义取字符串的哪一部分子串做hash-->

    <!--:8表示子串的下标,意思是取路由字段的前8个字符做hash,该语法与python取字符串下标方式相同-->

    <property name="hashSlice">:8</property>

  </function>

 <function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong">

    <!--该路由函数将1024分成多少个区段-->

    <property name="partitionCount">2</property>

    <!--每一区段的长度, 满足4 * 256 = 1024-->

    <property name="partitionLength">512</property>

    <!--字符串需要先取hash值再做映射,这里定义取字符串的哪一部分子串做hash-->

  </function>

7、配置server.xml

System

<!--system中包含系统参数定义,服务端口、管理端口,处理器个数、线程池等定义-->

<!--这些配置都有默认值,一般情况下用户可以完全不用配置-->

<system>

    <!--端口定义,如果没有端口冲突,可不用配置-->

    <!--Cobar服务端口, 通过此端口执行SQL语句,默认值8066-->

    <property name="serverPort">8066</property>

    <!--Cobar管理端口,通过此端口执行Cobar管理命令, 默认值9066-->

    <property name="managerPort">9066</property>

    <!--Cobar内部处理器个数,线程池等定义,默认值为Cobar所在机器处理器个数-->

    <!--这些配置主要影响Cobar内部处理性能,可在做性能优化时调整-->

    <property name="initExecutor">16</property>

    <property name="timerExecutor">4</property>

    <property name="managerExecutor">4</property>

    <property name="processors">4</property>

    <property name="processorHandler">8</property>

    <property name="processorExecutor">8</property>

    <!--Cobar与Cobar间心跳的用户名和密码, 默认值即是_HEARTBEAT_USER_和_HEARTBEAT_PASS_-->

    <!--如果两台Cobar之间需要心跳,这两项配置必须相同,一般不建议自行配置,使用默认值即可-->

    <property name="clusterHeartbeatUser">_HEARTBEAT_USER_</property>

    <property name="clusterHeartbeatPass">_HEARTBEAT_PASS_</property>

  </system>

User

<!--Cobar的用户定义,包括用户名,密码以及访问权限设置,可以配置任意多个用户-->

  <!--普通用户配置-->

  <user name="test">                            <!--用户名-->

    <property name="password">test</property>   <!--密码-->

    <!--Cobar对用户进行了简单的权限控制,可定义用户对某些schema是否有访问权限-->

    <!--这里不区分读写权限,一旦拥有访问权限,便是读写权限-->

    <!--以逗号分隔多个schema, test用户只能访问db_single和db_shard两个Cobar定义的schema-->

    <property name="schemas">db_single,db_shard</property>

  </user>

  <!--超级用户配置,超级用户是指对所有schema都有访问权限的用户-->

  <!—

<user name="root1">

 <property name="password">root</property>

-->

 

 <!--不配置任何访问权限,表示对所有schema都有访问权限-->

 <!--

  </user>

  <user name="root2">

 <property name="password">root</property>

-->

 

    <!--配置为空同样表示对所有schema都有访问权限-->

    <!-<property name="schemas"></property>

  </user>-->

Cluster

在实际应用中,经常需要部署一个Cobar集群,我们称集群中的一台Cobar为一个Cobar节点。

<!--组建一个Cobar集群,只需在cluster配置中把所有Cobar节点(注意:包括当前Cobar自身)都配置上便可-->

<cluster>

    <!--node名称,一个node表示一个Cobar节点,一旦配置了node,当前Cobar便会向此节点定期发起心跳,探测节点的运行情况-->

    <node name="cobar1">

      <!--Cobar节点IP, 表示当前Cobar将会向192.168.1.110上部署的Cobar发送心跳-->

      <property name="host">192.168.1.110</property>

      <!--节点的权重,用于客户端的负载均衡,用户可以通过命令查询某个节点的运行情况以及权重-->

      <property name="weight">1</property>

    </node>

    <!--当前Cobar将会向192.168.1.113上部署的Cobar发送心跳-->

    <node name="cobar2">

      <property name="host">192.168.1.113</property>

      <property name="weight">2</property>

    </node>

    <!--用户还可以将Cobar节点分组,以便实现schema级别的细粒度负载均衡-->

    <group name="group12">

      <property name="nodeList">cobar1,cobar2</property>

    </group>

</cluster>

用户只需登录Cobar的服务端口(8066),运行Cobar自带的查询命令show cobar_cluster,便可查询集群中所有节点的运行情况以及权重,并根据查询结果做负载均衡。

mysql -h192.168.1.110 -utest -ptest -P8066

mysql>show cobar_cluster;  #查询cluster配置中正常的Cobar节点

+---------------+--------+

| HOST          | WEIGHT |

+---------------+--------+

| 192.168.1.110   |      1 |

| 192.168.1.113   |      2 |

+---------------+--------+

注意:

1)如果需要配置Cobar集群,当前Cobar自身也需要作为一个节点配置在cluster中,Cobar不会默认向自己发心跳;

2)show cobar_cluster只显示cluster配置中得正常Cobar节点,如果节点异常(如超时或错误),结果中便不会包含此节点。

8、访问方式

由于Cobar遵循MySQL协议,访问Cobar的方式与访问MySQL数据库完全相同。

支持MySQL命令行方式访问

#命令行

mysql -h192.168.1.110 -utest -ptest -P8066 -Ddb_shard

转载于:https://www.cnblogs.com/wuzp/archive/2012/08/29/2661436.html