zoukankan      html  css  js  c++  java
  • Ubuntu10下MySQL搭建Amoeba_分片升级版

    一、背景知识

    Amoeba的简单进行分片,比如对int类型的ID字段进行取模分片,实例可以参考:Ubuntu10下MySQL搭建Amoeba_分片,但是如果ID字段是UUID类型的呢?这个时候我们应该如何分片呢?

    这篇文章将会为你解决这个问题。

    二、搭建过程

    (一) 测试环境

    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取hash再 mod 3,分别分片到server1、server2、server3。

    <tableRule name="blog" schema="DBA_DB" defaultPools="server1,server2,server3"> 

        <rule name="rule1" ruleResult="BOOLEAN">

           <parameters>ID</parameters>

           <expression><![CDATA[ abs(hash(ID)) % 3 = 1]]></expression>

           <defaultPools>server1</defaultPools>

        </rule>

        <rule name="rule2" ruleResult="BOOLEAN">

            <parameters>ID</parameters>

            <expression><![CDATA[ abs(hash(ID)) % 3 = 2]]></expression>

            <defaultPools>server2</defaultPools>

        </rule>

        <rule name="rule3" ruleResult="BOOLEAN">

            <parameters>ID</parameters>

            <expression><![CDATA[ abs(hash(ID)) % 3 = 0]]></expression>

            <defaultPools>server3</defaultPools>

        </rule>

    </tableRule>

    6.      重新启动amoeba,如果出现上面的图2界面说明设置成功。

    7.      如果你已经使用终端登陆了amoeba(#mysql -u testuser -p -h 192.168.1.147 -P 8066),那么你需要重启打开终端;如果你使用SQLyog的工具登陆了amoeba,那么你需要关闭链接,再重新链接amoeba;

    (四) 验证sharding

    1.      登陆到amoeba(147),插入下面的测试数据

    INSERT INTO DBA_DB.blog(ID,Content,Site,AddOn)

    VALUES ('13dd9e58-6507-11e1-ad6c-003018a3e4c6','中国人',1,NOW());

    INSERT INTO DBA_DB.blog(ID,Content,Site,AddOn)

    VALUES ('f69733f4-6506-11e1-ad6c-003018a3e4c6','中国人',1,NOW());

    INSERT INTO DBA_DB.blog(ID,Content,Site,AddOn)

    VALUES ('e4c84838-6502-11e1-ad6c-003018a3e4c6','中国人',1,NOW());

    INSERT INTO DBA_DB.blog(ID,Content,Site,AddOn)

    VALUES ('05218fdc-6507-11e1-ad6c-003018a3e4c6','中国人',1,NOW());

    2.      登陆server1、server2、server3、amoeba分别验证数据的分布。


    (server1:192.168.1.25)


    (server2:192.168.1.30)


    (server3:192.168.1.35)


    (amoeba:192.168.1.147)

    三、注意事项

    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.      amoeba start之后,再用终端连接上mysql,出现了下面的错误:


    这个错误是dbServers.xml中配置的mysql的连接存在问题,可以先使用里面的帐号测试登陆,进一步排除问题。

    2.      下面两个图是启动amoeba的不同界面,为什么会有区别呢?用于调试:


    (图:有及时信息输出)


    (图:回到命令行了)

    3.      MySQL的表分区是怎么搭建的?它存在哪些优缺点?

    4.      在实际应用的分片策略,例如,博主ID:使用AuthorID作为分片依据列;分类ID:使用ClassId作为分片依据列。这些ID都是UUID值,先对这个ID进行hash取key,再对key取模,再进行分片,Amoeba for MySQL能支持到这样的嘛?

    5.      MySQL能不能返回HASH值?执行select hash('mypass');有错。

    6.      Amoeba对联表查询支持?性能如何?

    7.      在做分片的时候出现了一个低级错误,那就是在Insert的时候使用UUID();在Amoeba分片规则中使用了3个ID规则,导致每个数据库都进数据了,因为规则无法判断到这个ID是什么,只能到了数据库执行之后才知道,这跟调用存储过程是一样的道理。

    8.      官网关于hash分片的说明配置是有错误的:第一个,3中的id小写是错误的;第二个,3中的mod是不能识别的;基于Amoeba的数据水平切分


    五、参考文献

    基于Amoeba的数据水平切分

    通过Amoeba对数据进行简单的分片

    Amoeba使用指南

    通过Amoeba对一个数据库实例进行操作

    Amoeba 高级特性

    Amoeba切分规则配置详解

    Amoeba for mysql 0.31发布(读写分离、负载均衡、Failover、数据切分)

  • 相关阅读:
    SpringBoot入门学习(二)
    SpringBoot入门学习(一)
    eclipse调试程序界面简单介绍使用
    利用URLConnection来发送POST和GET请求
    查看用户所属的组
    linux下创建用户,给用户设置密码,给用户授权
    新linux系统上rz 与sz命令不可用
    pom.xml文件报错:web.xml is missing and <failOnMissingWebXml> is set to true
    MySql采用GROUP_CONCAT合并多条数据显示的方法
    Mysql计算时间差
  • 原文地址:https://www.cnblogs.com/gaizai/p/2511831.html
Copyright © 2011-2022 走看看