其他
mycat实践篇-DataNode的分布问题
DataNode代表MySQL数据库上的一个Database,因此一个分片表的DataNode的分布可能有以下几种:
- 都在一个DataHost上
- 在几个DataHost上,但有连续性,比如dn1到dn5在Server1上,dn6到dn10在Server2上,依次类推
- 在几个DataHost上,但均匀分布,比如dn1,dn2,d3分别在Server1,Server2,Server3 上,dn4到dn5又重复如此
一般情况下,不建议第一种,二对于范围分片来说,在大多数情况下,最后一种情况最理想,因为当一个表的数据均匀分布在几个物理机上的时候,跨分片查询或者随机查询,都是到不同的机器上去执行,并行度最高,IO竞争也最小,因此性能最好。
当我们有几十个表都分片的情况下,怎样设计DataNode的分布问题,就成了一个难题,解决此难题的最好方式是试运行一段时间,统计观察每个DataNode上的SQL执行情况,看是否有严重不均匀的现象产生,然后根据统计结果,重新映射DataNode到DataHost的关系。
Mycat 1.4增加了distribute函数,可以用于Table的dataNode属性上,表示将这些dataNode在该Table的分片规则里的引用顺序重新安排,使得他们能均匀分布到几个DataHost上:
<table name="oc_call" primaryKey="ID" dataNode="distribute(dn1$0-372,dn2$0-372)" rule="latest-month-calldate" />其中dn1xxx与dn2xxxx是分别定义在DataHost1上与DataHost2上的377个分片。