Ubuntu10下MySQL搭建Amoeba_分片
2012-04-12 18:49 听风吹雨 阅读(2597) 评论(1) 编辑 收藏 举报一、背景知识
"Shard" 这个词英文的意思是"碎片",而作为数据库相关的技术用语,"Sharding" 姑且称之为"分片"。
Sharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。
Sharding 基本上是针对开源数据库的扩展性解决方案,很少有听说商业数据库进行 Sharding 的。目前业界的趋势基本上是拥抱 Scale Out,逐渐从 Scale Up 中解放出来。
数据 Sharding 的策略与分区表的方式有很多类似的地方,有基于表、ID 范围、数据产生的时间或是SOA 下理念下的基于服务等众多方式可选择。而与传统的表分区方式不同的是,Sharding 策略和业务结合的更为紧密,成功的 Sharding 必须对自己的业务足够熟悉,进行众多可行性分析的基础上进行,"业务逻辑驱动"。
二、配置过程
(一) 测试环境
Amoeba for MySQL:192.168.1.147
server1:192.168.1.25
server2:192.168.1.30
server3:192.168.1.35
数据库为:DBA_DB,帐号密码统一为:test/123456
(二) 前期准备
1. 验证Amoeba是否安装成功的命令(如下图):/usr/local/amoeba/bin/amoeba
(图1:安装成功)
2. 启动amoeba:/usr/local/amoeba/bin/amoeba start
(图2:启动成功)
(三) 分片配置
1. 修改amoeba.xml,设置登陆amoeba的帐号密码。
<property name="user">testuser</property>
<property name="password">password</property>
2. 测试使用上面帐号是否正常登陆,如果出现上面的图2界面说明设置的帐号密码成功。
#mysql -u testuser -p -h 192.168.1.147 -P 8066
3. 修改dbServers.xml,设置数据库、登陆MySQL的帐号和密码。
<property name="schema">DBA_DB</property>
<property name="user">test</property>
<property name="password">123456</property>
4. 修改dbServers.xml,设置数据库服务器的IP地址和服务器别名。
<dbServer name="server1" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.1.25</property>
</factoryConfig>
</dbServer>
<dbServer name="server2" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.1.30</property>
</factoryConfig>
</dbServer>
<dbServer name="server3" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.1.35</property>
</factoryConfig>
</dbServer>
5. 修改rule.xml,设置分片规则,设置需要分片的表、数据库名、分片的服务器、分片规则:对ID mod 3,分别分片到server1、server2、server3。
<tableRule name="store" schema="DBA_DB" defaultPools="server1,server2,server3">
<rule name="rule1" ruleResult="POOLNAME">
<parameters>ID</parameters>
<expression><![CDATA[
var division = ID%3;
case division when 1 then 'server1';
when 2 then 'server2';
when 0 then 'server3';
end case;
]]></expression>
</rule>
6. 重新启动amoeba,如果出现上面的图2界面说明设置成功。
#mysql -u testuser -p -h 192.168.1.147 -P 8066
7. 如果你已经使用终端登陆了amoeba,那么你需要重启打开终端;如果你使用SQLyog的工具登陆了amoeba,那么你需要关闭链接,再重新链接amoeba;
(四) 验证sharding
1. 插入下面的测试数据
INSERT INTO store(Id,NAME,Scheme,Destination,AddOn)
VALUES (1,'viajar',2,'我的博客',NOW());
INSERT INTO store(Id,NAME,Scheme,Destination,AddOn)
VALUES (2,'viajar',2,'我的博客',NOW());
INSERT INTO store(Id,NAME,Scheme,Destination,AddOn)
VALUES (3,'viajar',2,'我的博客',NOW());
INSERT INTO store(Id,NAME,Scheme,Destination,AddOn)
VALUES (4,'viajar',2,'我的博客',NOW());
2. 登陆server1、server2、server3、amoeba分别验证数据的分布。
(server1)
(server2)
(server3)
(amoeba)
三、注意事项
1. 验证Amoeba是否安装成功的命令:/usr/local/amoeba/bin/amoeba 要全部输入,如果是进入到bin执行amoeba是不行的。
2. #mysql -u root -p -h 127.0.0.1 -P 8066其中root和密码表示的是在amoeba.xml中配置的帐号密码。
3. 当tableRule中没有任何规则能命中该表,将操作tableRule配置的writePools(若没有配置则使用defaultPools)属性中的数据库节点;
4. 当某个表在任何tableRules都没有被路由到,将操作queryRouter配置的writePools(若没有配置则使用defaultPools)属性中的数据库节点。
5. Amoeba的垂直切分的意思是对表进行切分的意思。基于Amoeba的数据垂直切分
四、错误与疑问
1. MySQL的表分区是怎么搭建的?它存在哪些优缺点?
2. 在实际应用的分片策略,例如,博主ID:使用AuthorID作为分片依据列;分类ID:使用ClassId作为分片依据列。这些ID都是UUID值,先对这个ID进行hash取key,再对key取模,再进行分片,Amoeba for MySQL能支持到这样的嘛?
3. MySQL能不能返回HASH值?执行select hash('mypass');有错。
4. Amoeba对联表查询支持?性能如何?
5. 在做分片的时候出现了一个低级错误,那就是在Insert的时候使用UUID();在Amoeba分片规则中使用了3个ID规则,导致每个数据库都进数据了,因为规则无法判断到这个ID是什么,只能到了数据库执行之后才知道,这跟调用存储过程是一样的道理。
五、参考文献
作者:听风吹雨
出处:
http://www.cnblogs.com/gaizai/
邮箱:gaizai@126.com
版权:本文版权归作者和博客园共有
转载:欢迎转载,必须保留原文链接
格言:不喜欢是因为不会 && 因为会所以喜欢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述