数据库中间件选型思考
官网上安装、配置信息零散,需要使用者收集整理信息,在理解基础上正确配置,才能保证运行成功。这个工作比较耗时,希望读者看到此博客能快速run起来。
网络博客上也有很多人写Mycat和Atlas,绝大多数是针对Mycat和Atlas读写分离场景配置的。对Atlas,奇虎360在GitHub上开源了2个版本,一个版本为纯代理版,支持分表功能,另一个为Sharding版本。本次配置分库分表场景。
MySQL:申请4个节点配置相同(虚拟机或物理机都可以),每个节点创建一个数据库,名称相同都为dbproxy,接着每个库创建一个相同表sbtest1
Mycat:下载Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
Atlas:下载Atlas-sharding_1.0.1-el6.x86_64.rpm
创建一个表:sbtest1
sbtest1表结构为:
CREATE TABLE `sbtest1` (
`id` int(10) unsigned NOT NULL,
`k` int(10) unsigned NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `k_1` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
sbtest1表结构为使用sysbench工具创建生成的,去掉了自增主键设置,后续就可以直接使用扩展版sysbench测试
Mycat服务有2种配置方式,其一为在zookeeper上配置,启动后也会把内容写到*.xml几个文件中,其二是直接到*.xml修改配置,本次采用第二种方式简单方便。
tar xzvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0property>
<property name="useGlobleTableCheck">0property>
<property name="sequnceHandlerType">2property>
<property name="processorBufferPoolType">0property>
<property name="serverPort">8066property>
<property name="managerPort">9066property>
<property name="idleTimeout">300000property>
<property name="bindIp">0.0.0.0property>
<property name="processorExecutor">32property>
<property name="handleDistributedTransactions">0property>
<property name="useOffHeapForMerge">1property>
<property name="memoryPageSize">1mproperty>
<property name="spillsFileBufferSize">1kproperty>
<property name="useStreamOutput">0property>
<property name="systemReserveMemorySize">384mproperty>
<property name="useZKSwitch">trueproperty>
system>
<user name="root">
<property name="password">123456property>
<property name="schemas">testdbproperty>
user>
<user name="user">
<property name="password">123456property>
<property name="schemas">testdbproperty>
<property name="readOnly">trueproperty>
user>
mycat:server>
Mycat会对数据库访问资源进行管理,有2种类型账号,分为管理员、普通用户;管理员负责中间件各种资源管理(后端数据库访问)、查看、分配等,普通用户只能对数据库进行DDL和DML操作。每个用户配置了访问具体数据库资源,由schemas参数决定,未配置则无法访问。
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="testdb" checkSQLschema="false" sqlMaxLimit="10000" >
<table name="sbtest1" primaryKey="id" dataNode="dn01,dn02,dn03,dn04" rule="mod-long" />
schema>
<dataNode name="dn01" dataHost="dbp1" database="dbproxy" />
<dataNode name="dn02" dataHost="dbp2" database="dbproxy" />
<dataNode name="dn03" dataHost="dbp3" database="dbproxy" />
<dataNode name="dn04" dataHost="dbp4" database="dbproxy" />
<dataHost name="dbp1" maxCon="2000" minCon="1000" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="dbpHostM1" url="ip01:3306" user="zhitao" password="iyw_=EseXx94">
writeHost>
dataHost>
<dataHost name="dbp2" maxCon="2000" minCon="1000" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="dbpHostM2" url="ip02:3306" user="zhitao" password="iyw_=EseXx94">
writeHost>
dataHost>
<dataHost name="dbp3" maxCon="2000" minCon="1000" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="dbpHostM3" url="ip03:3306" user="zhitao" password="iyw_=EseXx94">
writeHost>
dataHost>
<dataHost name="dbp4" maxCon="2000" minCon="1000" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="dbpHostM4" url="ip04:3306" user="zhitao" password="iyw_=EseXx94">
writeHost>
dataHost>
mycat:schema>
以上配置了4个逻辑库,只有主库没配从库,如有需要读者可以加上,一个表sbtest1数据切分到4个逻辑库上。其中’rule=”mod-long”‘表示选择取模算法,对应下面的配置
......
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">4property>
function>
......
表示id % 4 = 路由到对应逻辑库上(dbp1|dbp2|dbp3|dbp4)
Atlas配置相对较简单,配置项和文件都比Mycat要少
1.执行如下命令
sudo rpm –i Atlas-XX.el6.x86_64.rpm
默认安装目录:/usr/local/mysql-proxy
2.配置test.cnf
进入conf目录
[mysql-proxy]
admin-username = user
admin-password = 123456
#配置代理或读写分离主库配置
admin-lua-script = /usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
#proxy-backend-addresses = ip01:3306,ip02:3306
#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
#proxy-read-only-backend-addresses = readonlyIP01:3306,readonlyIP02:3306
#示例,配置代理主库配置
proxy-backend-addresses = ipxxx:3306
daemon = true
keepalive = false
#libevent线程数配置
event-threads = 32
log-level = error
#日志路径
log-path = /usr/local/mysql-proxy/log
sql-log = OFF
#代理端口配置,用于操作数据库
proxy-address = 0.0.0.0:1234
#管理端口配置,用于管理资源,监控,系统信息操作、查看等
admin-address = 0.0.0.0:2345
charset = UTF8
wait-timeout = 3600
#Atlas密码需要加密,安装Atlas进入bin目录,执行:./encrypt mysql数据库密码;生成加密串拷贝上去
pwds = zhitao:If2Il8Bd7YgWZ+vzsw3ZlQ==
[shardrule-0]
table = dbproxy.sbtest1
# sharding类型:range或hash,本次
type = hash
# 分片字段名
shard-key = id
# 0:0-999,1:1000-1999 #分片的group,如果是range类型的sharding,则groups的格式是:group_id:id范围。如果是hash类型的sharding,则groups的格式是:group_id。例如groups = 0, 1
groups = 0,1,2,3
[group-0]
# master
proxy-backend-addresses=ip01:3306
[group-1]
proxy-backend-addresses=ip02:3306
[group-2]
proxy-backend-addresses=ip03:3306
[group-3]
proxy-backend-addresses=ip04:3306
注意:配置分库分表时,只有指定的分表才会执行shardrule流程,其他表走正常请求流程,所以要配置proxy-backend-addresses,从库配置视部署情况可选