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