• mysql架构篇之主从结构之~Mycat-分库分表


    Mycat软件:

    什么是分库分表

    水平分割:

    垂直分隔

    软件介绍:

    mycat是基于Java的分布式数据库系统中间件,为高并发环境的分布式存储提供解决方案

      --适合数据大量写入的存储需求

      --支持MySQL、Oracle、Sqlserver、Mongodb...

        --提供数据读写分离服务

      --提供数据分片服务

      --基于阿里巴巴Cobar进行研发的开源软件

    分片规则

      mycat支持提供10中分片规则

      

    工作过程:

      当mycat收到一个SQL命令时

      1:解析SQL命令涉及到的表

      2:然后看表的陪对,如果有分片规则,则获取SQL命令里分片字段的值,并匹配分片函数,获得分片列表

      3:然后将SQL命令发往对应的数据库服务器去执行

      4:最后收集和处理所有分片结果数据,并返回到客户端

    部署mycat服务:

      

    拓补图结构:

    IP规划

    主机名 角色 数据库 IP  
    client 客户端 192.168.2.11  
    mycat 分片服务器 192.168.2.22  
    mysql1 数据库服务器 db1 192.168.2.33  
    mysql2 数据库服务器 db2 192.168.2.44  
    mysql3 数据库服务器 db3 192.168.2.55  

    部署:

    1:安装JDK

      

    [root@host22 ~]# yum  -y   install  java-1.8.0-openjdk.x86_64     安装运行环境包    
    [root@host22 ~]#tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
    [root@host22 ~]# mv  mycat /usr/local/
    [root@host22 ~]# ls /usr/local/mycat/
    bin  catlet  conf  lib  logs  version.txt
    [root@host22 ~]# 
    设置PATH变量
    [root@host22 mycat]# vim /etc/bashrc 
    export  PATH=/usr/local/mycat/bin:$PATH  添加在最后1行
    :wq
    [root@host22 mycat]# source /etc/bashrc 
    [root@host22 mycat]# which  mycat
    /usr/local/mycat/bin/mycat

    安装文件说明
    bin(命令目录) catlet conf(配置文件目录) lib logs(日志文件) version.txt

     

    配置文件说明
                        mycat服务的配置文件 ls /usr/local/mycat/conf/*.xml
                            schema.xml(指定表使用的分片规则)  
                            rule.xml(分片规则)   
                            server.xml (定义用户名密码逻辑库)
                        分片规则的配置文件
                         ]# ls *.properties   
                         ]# ls *.txt

    注释 <!-- -->
    xml 扩展标记语言 标签要成对出现 单标签要使用 / 闭合

    vim server.xml(使用默认配置) 定义用户 密码 和 逻辑库
    <user 配置项>
    配置项
    </user>

    ]# vim  server.xml            
    <user name="root">
                    <property name="password">123456</property>
                    <property name="schemas">TESTDB</property>
            </user>
    
            <user name="user">
                    <property name="password">user</property>
                    <property name="schemas">TESTDB</property>
                    <property name="readOnly">true</property>
            </user>             
    :wq
    修改schema.xml  (定义使用分片规则存储数据的表)
    [root@host56 ~]# cp /usr/local/mycat/conf/schema.xml /root/            
    
    [root@host56 ~]# wc -l /usr/local/mycat/conf/schema.xml 
    77 /usr/local/mycat/conf/schema.xml
                
    [root@host56 ~]# sed -i '56,77d'  /usr/local/mycat/conf/schema.xml    
    
    [root@host56 ~]# vim  /usr/local/mycat/conf/schema.xml    
    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema .....>
          <schema .....>  定义表名
                 指定表名
                <table ...>  </table>  双标签
                <table .... /> 单标签
          </schema>
            
          <dataNode ....  />  指定数据库服务器的主机名
    
          <dataHost> 数据库服务器的ip地址
                .....
                .....
          </dataHost>  
    </mycat:schema>
    :wq
    <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
    
    <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"
                            rule="sharding-by-intfile" />
                               
    <table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3"
                            rule="sharding-by-intfile">
    
    
    
    36  <dataNode name="dn1" dataHost="mysql53" database="db1" />
    37  <dataNode name="dn2" dataHost="mysql54" database="db2" />
    38  <dataNode name="dn3" dataHost="mysql55" database="db3" />
    
    <dataHost name="mysql53" maxCon="1000" minCon="10" balance="0"writeType="0" 
               dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    
                    <heartbeat>select user()</heartbeat>
                    
                    <writeHost host="hostM1" url="192.168.4.53:3306" user="pljadmin"
                                       password="123qqq...A">
                    </writeHost>
    </dataHost>
    
    <dataHost name="mysql54" maxCon="1000" minCon="10" balance="0"writeType="0" 
               dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    
                    <heartbeat>select user()</heartbeat>
                    
                    <writeHost host="hostM2" url="192.168.4.54:3306" user="pljadmin"
                                       password="123qqq...A">
                    </writeHost>
    </dataHost>
    
    <dataHost name="mysql55" maxCon="1000" minCon="10" balance="0"writeType="0" 
               dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    
                    <heartbeat>select user()</heartbeat>
                    
                    <writeHost host="hostM3" url="192.168.4.55:3306" user="pljadmin"
                                       password="123qqq...A">
                    </writeHost>
    </dataHost>
    :wq
    2.3 配置3台数据库服务器
                      #创建存储数据的库  
                      #添加对应的授权用户
    [root@host53 ~]# mysql -uroot -p789...qqqA -e 'create database db1'                  
    [root@host53 ~]# mysql -uroot -p789...qqqA -e 
    'grant all on *.* to pljadmin@"%" identified by "123qqq...A"'

    允许mycat服务

    mycat start

    [root@host22 ~]# netstat  -utnlp  | grep  8066
    tcp6       0      0 :::8066                 :::*         LISTEN      2666/java 
    三、连接Mycat服务 查看库和表    
            host50   -h192.168.4.56 -uroot  -p123456
            select 
            
    统一拍错时间  
        方法查看日志     [root@host56 ~]# vim /usr/local/mycat/logs/wrapper.log 
    
          检查 schema.xml 
          检查 数据库的配置 
          检查内存和 主机名 是否设置
          
          检查jdk版本 (要把多余的版本 rpe -e  --force  卸载)
    [root@host56 ~]# rpm -qa  | grep -i jdk
    java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
    copy-jdk-configs-3.3-2.el7.noarch
    java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64  正确版本
    [root@host56 ~]#       
          
        以上都改对了 重启mycat服务
          mycat stop  停止服务
          mycat start 启动
          mycat status 查状态
          nsetstat  -utnlp  | grep  8066 看端口
        休息到 11:10 上课         
            
                 3.2  测试配置
                      #客户端连接mycat服务查看定义的库和表,能够查看到库和表就是成功的
    [root@host50 ~]# mysql -h192.168.4.56 -P8066 -uroot -p123456                  
    mysql> show databases;
    mysql> use TESTDB;
    mysql> show tables;
    四、分片规则的使用(根据表使用的分片规则建表 并存储数据)
                                
            4.1 sharding-by-intfile 枚举法 
    给分片字段赋值时,值必须在规则文件定义的值里选择,值会往固定的数据库服务器里存储
     
            查看使用 sharding-by-intfile 枚举法 分片规则,要求表中必须有的表头名
        vim  rule.xml
           <tableRule name="sharding-by-intfile"> 分片规则名
                    <rule>
                            <columns>sharding_id</columns> 分片字段名
                            <algorithm>hash-int</algorithm> 算法名
                    </rule>
            </tableRule>
            
            #查看算法
            <function name="hash-int"
                    class="io.mycat.route.function.PartitionByFileMap"> 调用的java程序
                    <property name="mapFile">partition-hash-int.txt</property> 分片规则配置文件
            </function>
    
            #修改分片规则的配置文件,定义分片字段的值
    [root@host56 ~]# vim  /usr/local/mycat/conf/partition-hash-int.txt
    分片表头的值=数据库服务器编号
    10000=0  # 0 对应 dn1 ---> mysql53 -----> 192.168.4.53   db1
    10010=1  # 1 对应 dn2 ---> mysql54 -----> 192.168.4.54   db2
    10020=2  # 2 对应 dn3 ---> mysql55 -----> 192.168.4.55   db3
    :wq
             #重启mycat服务 让添加生效
       339  mycat  stop
       340  mycat  start
       341  mycat  status
             
                    查看使用枚举分片规则的表,
                vim /usr/local/mycat/conf/schema.xml    
     <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"
                               rule="sharding-by-intfile" />
    
                    并根据规则建表
    [root@host50 ~]# mysql -h192.168.4.56 -P8066 -uroot -p123456
    mysql> use  TESTDB
    create table employee(
    sharding_id int, ID int primary key  auto_increment,
    name char(10),age int , addir char(15));
    
    mysql> desc employee;
    +-------------+----------+------+-----+---------+----------------+
    | Field       | Type     | Null | Key | Default | Extra          |
    +-------------+----------+------+-----+---------+----------------+
    | sharding_id | int(11)  | YES  |     | NULL    |                |
    | ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
    | name        | char(10) | YES  |     | NULL    |                |
    | age         | int(11)  | YES  |     | NULL    |                |
    | addir       | char(15) | YES  |     | NULL    |                |
    +-------------+----------+------+-----+---------+----------------+
    5 rows in set (0.02 sec)
    mod-long 求模法 :根据 分片字段值 与 设定的数字 求模结果  存储数据
                1 找出使用mod-long分片规则存储数据时,表中必须创建的表头名称
                  ]#vim  rule.xml
                  <tableRule name="mod-long">  分片规则名
                      <rule>
                            <columns>id</columns>  表头名
                            <algorithm>mod-long</algorithm>  使用的算法
                      </rule>
                  </tableRule>        
                 
            <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                    <!-- how many data nodes -->
                    <property name="count">3</property> 与数字3做取余计算(数字就是数据库服务器的台数)
            </function>
    
              2 查看使用mod-long分片规则存储数据的表
                
                ]# vim schema.xml  (删除了主键和自增长设置)
    <table name="hotnews" dataNode="dn1,dn2,dn3"  rule="mod-long" />
                :wq
              3 修改了配置文件 要重启服务使其生效
             [root@host56 ~]# mycat  stop
    Stopping Mycat-server...
    Stopped Mycat-server.
    [root@host56 ~]# mycat  start
    Starting Mycat-server...
    [root@host56 ~]# mycat  status
    Mycat-server is running (3741).
    [root@host56 ~]#    
          
             4 客户端连接56服务器建表
    [root@host50 ~]# mysql -h192.168.4.56 -P8066 -uroot -p123456
    mysql> use TESTDB;
    mysql> create table hotnews(id int , 
    title char(10),worker char(10),comment varchar(200));
             5 存储数据
    mysql>insert into hotnews(id ,title,worker,comment)
    values
    (9,"a","a","AA"),(9,"abc","abc","abc"),(9,"cc","cc","cc"),(9,"dd","dd","dd");
    
    mysql>insert into hotnews(id ,title,worker,comment)
    values
    (11,"a","a","AA"),(11,"abc","abc","abc"),(11,"cc","cc","cc"),(11,"dd","dd","dd");
             
    mysql>insert into hotnews(id ,title,worker,comment)
    values
    (10,"a","a","AA"),(10,"abc","abc","abc");
    
    mysql> select  * from  hotnews;
    
    查看表结构 
    [root@host53 ~]# mysql -uroot -p789...qqqA -e 'desc db1.hotnews'
    [root@host54 ~]# mysql -uroot -p123qqq...A -e 'desc db2.hotnews'
    [root@host55 ~]# mysql -uroot -p123qqq...A -e 'desc db3.hotnews'
         
         6 在数据库服务器53 54  55 本机查看数据
           查看数据 每台服务器只存储了部分数据而不是所有行
    [root@host55 ~]# mysql -uroot -p123qqq...A  -e 'select * from  db3.hotnews'
    mysql: [Warning] Using a password on the command line interface can be insecure.
    +------+-------+--------+---------+
    | id   | title | worker | comment |
    +------+-------+--------+---------+
    |   11 | a     | a      | AA      |
    |   11 | abc   | abc    | abc     |
    |   11 | cc    | cc     | cc      |
    |   11 | dd    | dd     | dd      |
    +------+-------+--------+---------+
    [root@host54 ~]# mysql -uroot -p123qqq...A  -e 'select * from  db2.hotnews' 
    [root@host53 ~]# mysql -uroot -p123qqq...A  -e 'select * from  db1.hotnews'    
            
             
             
    总结:    
    分片规则 是mycat 软件自带的 。要把表中的记录,存储在不同数据库服务器的表里,
    需要指定表使用的分片规则,存储数据时,会根据分片规则的计算结果存储到指定
    的数据库器表里。
    
    五、添加新库新表
                    5.1 添加新库GAMEDB
                     vim server.xml
            <user name="root">
                    <property name="password">123456</property>
                    <property name="schemas">TESTDB,GAMEDB</property>
            </user>
    
            <user name="user">
                    <property name="password">user</property>
                    <property name="schemas">TESTDB,GAMEDB</property>
                    <property name="readOnly">true</property>
            </user>
                    :wq
                    
                    5.2 添加表 (表名自定义 但必须唯一)
            vim  schema.xml
            在原有<schema> 标签上方添加如下行
            
    <schema name="GAMEDB" checkSQLschema="false" sqlMaxLimit="100">
         <table name="user" dataNode="dn1,dn2,dn3" rule="mod-long" />
         <table name="reg" dataNode="dn1,dn2,dn3" type="global" />
    </schema>
            :wq
                
                    5.3 重启mycat 服务
    [root@host56 ~]# mycat stop                 
    [root@host56 ~]# mycat start
    Starting Mycat-server...
    [root@host56 ~]# mycat status
    Mycat-server is running (4031).
    [root@host56 ~]# 
                    
                    5.4 连接mycat服务 查看新库新表
    [root@host50 ~]# mysql -h192.168.4.56 -P8066 -uroot -p123456
    mysql> show databases;
    +----------+
    | DATABASE |
    +----------+
    | GAMEDB   |
    | TESTDB   |
    +----------+
    2 rows in set (0.00 sec)
    
    mysql> use GAMEDB;
    mysql> show tables;
    +------------------+
    | Tables in GAMEDB |
    +------------------+
    | reg              |
    | user             |
    +------------------+
    2 rows in set (0.00 sec)
    
    5.5 建表并存储数据
    mysql> use GAMEDB;
    mysql> create table reg( name char(5), password char(6));
    mysql>  insert into reg values("a","123"),("b","123");
    
    mysql> create table user( id  int , name char(5) , addr char(10));
    mysql> insert into user(id ,name,addr) 
    values(11,"a","bj"),(12,"b","sh"),(13,"c","gz");
                
                    5.6 在数据库服务器本机查看数据
    [root@host53 ~]# mysql -uroot -p789...qqqA -e 'select * from  db1.user'
    mysql: [Warning] Using a password on the command line interface can be insecure.
    +------+------+------+
    | id   | name | addr |
    +------+------+------+
    |   12 | b    | sh   |
    +------+------+------+
    [root@host53 ~]#

    结论:建表存储数据的思路:
    1 通过 rule.xml 文件 确定表中必须要有的表头名
    2 确定分片规则使用的算法,来确定分片规则对应的配置文件
    3 在配置文件里定义分片字段的值
    4 查看使用分片规则的表
    5 根据分片规则建表

  • 相关阅读:
    MPSOC之5——开发流程BOOT.BIN
    MPSOC之6——开发流程linux编译
    MPSOC之1——overview、开发板、工具[转载]
    IC设计的前端和后端(转)
    [转载]深入理解JavaScript系列 --汤姆大叔
    xml的特殊字符
    JavaScript 对象
    knockoutjs关于ko.bindingHandlers的updata订阅
    单元测试 unittest 读取文件 (CSV, XML)
    单元测试 unittest 将断言结果生成测试报告
  • 原文地址:https://www.cnblogs.com/ahaocloud/p/14711314.html
Copyright © 2020-2023  润新知