zoukankan      html  css  js  c++  java
  • 一、MyCat的搭建

    一、什么是mycat

    简单直接点就是,MyCat其实就是一个数据库的中间件!一般我们都是app直接到数据库!有了MyCat以后,就是app到MyCat然后再访问数据库。

    mycat是个中间件,它负责连接管理mysql,应用程序连接mycat,把mycat当作mysql服务那样连接操作。

    linux系统的搭建

    简介:

    MyCat是java开发的,所以安装前要在你的系统的先安装jdk1.7以上的版本才可以。

    一、JDK安装

    安装步骤:

    1、wget安装方式

    起步搭建jdk1.7以上版本的java环境!然后下载mycat并且安装,修改配置然后启动mycat。

    wget http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz
    

     ls查看下载压缩包名并解压 (1、pwd 可查看当前下载目录和解压目录在root   2、yum install tar )

    tar -zxvf jdk-8u131-linux-x64.tar.gz
    

    2、yum 安装方式

    1、搜索JDK安装包

     yum search java|grep jdk
    

      

    2、安装

     yum install java-1.8.0-openjdk-src.x86_64
    

     3、测试安装结果

    java -version       通过yum默认安装的路径为  /usr/lib/jvm  可以通过cd  /usr/lib/jvm   命令 查看

     二、MyCat安装

    官网:http://www.mycat.io/
    

      

    2、wget获取(使用pwd命令查看下载到当前的路径)

    wget http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
    

     3、解压

    tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
    

    4、环境变量配置

    vi /etc/profile 添加
    export MYCAT_HOME=/home/mycat
    使环境变量生效source /etc/profile
    

    5、启动mycat

    进入mycat/bin目录,执行./mycat start    用ps -ef|grep mycat查看下进程
    
    暂时先不管,mysql的监听端口是3306,mycat的监听端口是8066,检查下8066是不是在监听中
    

      

     6、进程已启动端口被监听,接下来查看mycat的默认账号和密码以及配置server.xml

    cd /home/mycat
    cat conf/server.xml
    

      

    配置了2个用户,一个是root,一个是user,接下来使用navicat连接
    

      

    7、配置 server.xml   vim conf/server.xml 无权限

    授权chmod -R 777 mycat
    

      

    8、MyCat配置文件介绍

    conf/rule.xml 定义分片规则
    conf/schema.xml 定义逻辑库、表以及分片节点等内容
    conf/server.xml 定义用户授权及服务器参数相关配置
    

      8.1配置schema

    <?xml version="1.0"?>  #第一行必须是XML文件的第一个元素且前面不能空格。 否则报错"[xX][mM][lL]" 的处理指令目标
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://org.opencloudb/">
    
            <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
             #TESTDB 是MyCat默认的一个测试逻辑数据库,需要在此节点下定义逻辑表,但在这里只是指定表的名称,并不对表进行详细的定义。
             #下面这条语句就是指逻辑表tb_user_info将在dn1,dn2,dn3上创建 使用的分片规则是  auto-sharding-long
                    <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
            </schema>
            <dataNode name="dn1" dataHost="192.168.2.130" database="db1" />
            <dataNode name="dn2" dataHost="192.168.2.130" database="db2" />
            <dataNode name="dn3" dataHost="192.168.2.130" database="db3" />
            <dataHost name="192.168.2.130" 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.2.130:3306" user="root"
                            password="root123">
                    </writeHost>
            </dataHost>
    </mycat:schema>

      此时在schema.xml中配置好的表名,实际上只是一个逻辑的表,这个表在物理数据库中并不存在,需要在MyCat通过Create Table 来创建这个表,执行Create语句以后,MyCat会在真实MySql配置的数据库中创建表。

      8.2auto-sharding-long分片规则的实现原理

        <tableRule name="auto-sharding-long">
                <rule>
                        <columns>id</columns>
                        <algorithm>rang-long</algorithm>
                </rule>
        </tableRule>
    
        <function name="rang-long" class="org.opencloudb.route.function.AutoPartitionByLong">
                <property name="mapFile">autopartition-long.txt</property>
        </function>
    

      可见这个TableRule是通过id 来进行分片的,分片的算法是rang-long,算法中使用了autopartition-long.txt

    查看文本命令 cat autopartition-long.txt
    

      

    # range start-end ,data node index
    # K=1000,M=10000.
    0-500M=0
    500M-1000M=1
    1000M-1500M=2
    

      K表示1000条记录,M表示10000条记录,上面的三个配置就是0~500万的记录会存在数据库db1的表中,500万~1000万会存在db2的表中,1000万~1500万会存在db3的表中。

    9、TESTDB 是MyCat默认的一个测试逻辑数据库,需要在此节点下定义逻辑表,但在这里只是指定表的名称,并不对表进行详细的定义。

    三、Mysql安装

    1、参考安装即可

    https://www.cnblogs.com/huiyi0521/p/10113280.html
    

    2、解决支持远程连接mysql 

    mysql> use mysql
    mysql> select t.host from user t where t.user='root';
    +--------------+
    |  host        |
    +--------------+
    |  localhost   |
    +--------------+
    

     这个返回结果说明现在 root 用户只允许在服务器的本地登录。 
    执行如下命令: 

    mysql>update user set host='%' where user='root';
    

    然后重启 MySQL 服务就可以了。 

    四、实践

    1、登录物理数据库,创建db1、db2、db3

    create database db1;
    create database db2;
    create database db3;
    

    2、客户端连接mycat,注意连接的是mycat而不是物理数据库,mycat默认端口号8066

    mysql -uroot -p123456 -h127.0.0.1 -P8066 -DTESTDB
    

     注意-P、-D需要大写,-h 后面必须是ip,使用localhost会出错

    3、查看表,默认显示schema.xml中配置的表,实际上此时物理数据库没有表,所以查询employee会出错 

     show databases;
    

     4、修改mycat_homeconfschema.xml中的url、user、password ,然后重新启动

    ./mycat restart 重启服务 
    

    5、表分片-mycat中,创建employee表,插入数据

    create table employee (id int not null primary key,name varchar(100),sharding_id int not null);
    insert into employee(id,name,sharding_id) values(1,'leader us',10000);
    insert into employee(id,name,sharding_id) values(2, 'me',10010);
    insert into employee(id,name,sharding_id) values(3, 'mycat',10000);
    insert into employee(id,name,sharding_id) values(4, 'mydog',10010);
    

      mycat中,执行计划显示来自两个数据节点,与schema.xml中配置的一致 

    explain select * from employee;

    物理数据库中,mycat创建了employee表,查看数据,可以发现数据实现了分片 

    注意:

    schema.xml 配置schema、datanode、datahost 
        schema就是逻辑数据库,它包含table(逻辑表),表中有对应的datanode、分片规则
        datanode,就是逻辑数据库,含有物理数据库名字
        datahost,就是物理数据库的ip地址,用户名、密码等
    server.xml 配置连接mycat的用户名、密码、数据库名
    rule.xml 分片规则
    

     

     将物理数据库的某个数据库作为一个节点,与mycat逻辑数据表关联,操作mycat某个逻辑表即操作在该多个节点的某个表对应,实现将逻辑表在多个节点进行数据切片(切片规则根据id)

        MyCAT 定义了一种特殊的表逻辑表也称全局表:

      1、全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性

      2、全局表的查询操作,只从一个节点获取

      3、全局表可以跟任何一个表进行 JOIN 操作

     

     6、查询数据

    6.1读的配置

    读写配置一样

    select * from  employee;
    或者 select * from  employee where id=3;
    

     对我来说就是查询操作就是查询mycat的逻辑表跟普通表操作一样

     

    7、节点扩展-分片迁移

      7.1 配置文件修改以及分片节点的位置(切片节点位置就是更改物理库节点名不变)

    7.2业务切换-表进行加锁 注意:在业务量小的时候,比如凌晨,进行切换

       先在db5、db6之上做flush table命令将dn2.employee内存中数据刷到磁盘中,并重新加载mycat:

    7.2.1  先在dh1上127.0.0.1刷磁盘

    mysql> flush table dn2.employee with read lock;      //或者两个切片 flush table dn2.employee,dn3.employee with read lock;
    Query OK, 0 rows affected (0.00 sec)
    

    7.2  解锁表

    mysql> unlock tables;               
    Query OK, 0 rows affected (0.00 sec)
    

      

    7.3 然后重新加载mycat,使改动的新配置的分片到新实例上生效

    mysql> reload @@config;
    Query OK, 1 row affected (0.08 sec)
    Reload config success

      

     7.4查看切片是否完整

    mysql> explain select * from travelrecord;  
    

     7.2和7.3 都失败了 我直接    ./mycat restart 重启服务   (缺少平滑启动和锁定)   

     那是因为7.2命令是在mysql里面执行的,

        7.3是在 mycat 9066管理端口里执行   mysql -uroot -p123456 -h127.0.0.1 -P9066

    插入测试

    insert into employee(id,name,sharding_id) values(5, 'mycat',10000);
    insert into employee(id,name,sharding_id) values(6, 'mydog',10010);
    

      

    8切片规则- 三个节点 n1 、n2、n3 ,n1 满了新增n4 替换n1来插入,然后n1节点保留且切片规则只允许只读不允许插入即可解决。

  • 相关阅读:
    [bzoj4408][Fjoi2016]神秘数
    BZOJ1102: [POI2007]山峰和山谷Grz
    BZOJ1098: [POI2007]办公楼biu
    BZOJ1097: [POI2007]旅游景点atr
    GDOI2018 新的征程
    BZOJ2084: [Poi2010]Antisymmetry
    回文树详解
    Codeforces739E. Gosha is hunting
    一道题17
    LOJ#6002. 「网络流 24 题」最小路径覆盖
  • 原文地址:https://www.cnblogs.com/fger/p/10387593.html
Copyright © 2011-2022 走看看