zoukankan      html  css  js  c++  java
  • Linux系统装mycat

    最近在Linux系统中装载了一下mycut,记录过程以及所遇到的异常

    首先是mycut的压缩包,直接放到linux中解压即可

    链接:https://pan.baidu.com/s/1qo7z4tNvkkK5kFacE_FRjw
    提取码:rvym
    也可以自己下载 :http://dl.mycat.io/1.6-RELEASE/

    使用mycat做读写分离,分库分表的前提是数据库集群以及配置好主从复制

    服务器

    IP

    说明

    Mycat

    192.168.87.130

    mycat服务器,连接数据库时,连接此服务器

    database1

    192.168.87.128(主)

    物理数据库1,真正存储数据的数据库

    database2

    192.168.87.129(从)

    物理数据库2,真正存储数据的数据库

    database3

    192.168.87.131(从)

    物理数据库3,真正存储数据的数据库

    JDK

    mycat是基于java语言编写的,所以我们需要配置jdk

    目录:

    目录

    说明

    bin

    mycat命令,启动、重启、停止等

    catlet

    catlet为Mycat的一个扩展功能

    conf

    Mycat 配置信息,重点关注

    lib

    Mycat引用的jar包,Mycat是java开发的

    logs

    日志文件,包括Mycat启动的日志和运行的日志。

    问题一:Linux下部署安装的mysql,默认不忽略表明大小写,需要自己在etc 下的my.cnf中配置 lower_case_table_names=1 使得linux环境下musql忽略表明大小写,避免之后找不到表而报错

    主要需要配置的文件有:

    文件

    说明

    server.xml

    Mycat的配置文件,设置账号、参数等

    schema.xml

    Mycat对应的物理数据库和数据库表的配置

    rule.xml

    Mycat分片(分库分表)规则

    环境变量:

    MyCat在linux中部署启动时,需要在linux系统环境变量中配置MYCAT_HOME,linux中的环境变量配置文件在/etc/profile文件中

    修改环境变量:

    如果还在多态linux系统中组建的mycat集群,那需要在myCat Server所在的服务器上配置对其他Ip和主机名字的映射配置方式如下:

    vim /etc/hosts

    ip                       主机名:

    192.168.136.128     zy01

    192.168.136.129     zy02

     编辑完成后保存文件即可

    MyCut日志:在/logs/mycut.log,我配置过程中主要看的是warapper.log文件,可以查看据图的错误原因。

    配置过程

    dept表

    水平拆分

    两个物理数据库(192.168.136.128从服务器,192.168.136.129从服务器)中都有dept表,程序执行具体的增删改查时将根据分片规则去确定到底使用哪一个物理数据库

    user表

    垂直拆分

    只在一个物理数据库(192.168.136.128从)有,程序执行时会自动去这个数据库执行

    Student表

    垂直拆分

    只在一个物理数据库(192.168.136.129从)有,程序执行时会自动去这个数据库执行

    修改server.xml

      <user name="zzy">

                    <property name="password">123456</property>

                    <property name="schemas">zzy_table</property>

                    <property name="readOnly">false</property>

            </user>

    参数

    说明

    user

    用户配置节点

    --name

    登录的用户名,也就是连接Mycat的用户名

    --password

    登录的密码,也就是连接Mycat的密码

    --schemas

    数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,db2

    --privileges

    配置用户针对表的增删改查的权限,具体见文档

    说明:在这里的设计的账号:zzy,密码123456,数据库zzy_table(这个是需要与schema.xml文件中的name对应)

    需要将之前的user标签删除自己进行配置 

     Schema.xml

    我是将原来的schema.xml文件改了个名字,然后copy了一份,在新的文件里面进行配置了如下的步骤

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">

    <!-- 数据库配置,与server.xml中的数据库对应 -->
    <schema name="zzy_table" checkSQLschema="false" sqlMaxLimit="100">
    <table name="user" dataNode="dn1" />
    <table name="student" dataNode="dn2" />
    <!-- dept进行分片,分为两个数据库存储,分片规则是mod-long,不指定自增 -->
    <table name="dept" primaryKey="d_id" dataNode="dn1,dn2" rule="mod-long" />
    </schema>

    <!-- 分片配置 -->
    <dataNode name="dn1" dataHost="test1" database="zzy_table" />
    <dataNode name="dn2" dataHost="test2" database="zzy_table" />

    <!-- 物理数据库配置 -->
    <dataHost name="test1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
    <heartbeat>select user();</heartbeat>
    <writeHost host="zy01" url="192.168.136.129:3306" user="root" password="123456">
    </writeHost>
    </dataHost>

    <dataHost name="test2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
    <heartbeat>select user();</heartbeat>
    <writeHost host="zy02" url="192.168.136.130:3306" user="root" password="123456">
    </writeHost>
    </dataHost>

    </mycat:schema>

    参数

    说明

    schema

    数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应

    dataNode

    分片信息,也就是分库相关配置

    dataHost

    物理数据库,真正存储数据的数据库

    schema:

    属性

    说明

    name

    逻辑数据库名,与server.xml中的schema对应

    checkSQLschema

    数据库前缀相关设置,建议看文档,这里暂时设为false

    sqlMaxLimit

    select 时默认的limit,避免查询全表

    table:

    属性

    说明

    name

    表名,物理数据库中表名

    dataNode

    表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name

    primaryKey

    主键字段名,自动生成主键时需要设置

    autoIncrement

    是否自增

    rule

    分片规则名,具体规则下文rule详细介绍

    dataNode

    属性

    说明

    name

    节点名,与table中dataNode对应

    datahost

    物理数据库名,与datahost中name对应

    database

    物理数据库中数据库名

    dataHost:

    属性

    说明

    name

    物理数据库名,与dataNode中dataHost对应

    balance

    均衡负载的方式

    balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。

    balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。

    balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。

    balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。

    writeType

    写入方式

    writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .

    writeType="1",所有写操作都随机的发送到配置的 writeHost。

    writeType="2",没实现。

    dbType

    数据库类型

    heartbeat

    心跳检测语句,注意语句结尾的分号要加。

    rule.xml配置:

    主要关注rule属性,rule属性的内容来源于rule.xml这个文件,Mycat支持10种分表分库的规则,基本能满足你所需要的要求.table中的rule属性对应的就是rule.xml文件中tableRule的name,具体有哪些分表和分库的实现,建议还是看下文档。我这里选择的mod-long就是将数据平均拆分。因为我后端是两台物理库,所以rule.xml中mod-long对应的function count为2,见下面部分代码:

    测试:

    进入bin目录

    ./mycat start

    这次安装碰到的异常:

    1:linux防火墙没有关闭,导致远程连接数据库出问题,这也是一个疏忽。

    2:

     图是因为在连接之前没有将实体数据库中的表创建好,可能是由于Navicat的版本问题。

    3 :

    原因:出现此消息的原因通常是你的cpu在大约30秒内达到100%。

    解决:

    到你的wrapper.conf文件,以增加超时时间,从而防止JVM被终止。设置此值后,你需要重新启动服务器。

    wrapper.startup.timeout=300000   

    wrapper.ping.timeout=300000

    如果还是报错,就将时间调至最大 1728000

    4:8066端口占用问题

    Navicat连接Mycat

      

     这是Navicat中新建mysql连接的配置信息。用户名是自己在server.xml中配置的 端口8066,。

    写测试程序

    跟写之前的jdbc一模一样,只不过吧用户名密码换成Mycat的

    package com.zhiyou100.jdbc;

     

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.PreparedStatement;

     

    public class TestMycat {

     

        public static void main(String[] args) throws Exception {

            Class.forName("com.mysql.jdbc.Driver");

            // mycat的用户名

            String username = "zzy";

            // mycat的密码

            String password = "123456";

            // mycat的连接地址

            String url = "jdbc:mysql://192.168.136.131:8066/zzy_table";

            Connection conn = DriverManager.getConnection(url,username,password);

            String sql1 = "insert into dept (d_name,d_desc) values ('mycat研发部2','客户端插入2')";

            String sql2 = "insert into user (u_name,u_desc) values ('u_lisi','客户端插入用户lisi')";

            String sql3 = "insert into student (s_name,s_desc) values ('s_zs','客户端插入学生zs')";

            PreparedStatement ps1 = conn.prepareStatement(sql1);

            PreparedStatement ps2 = conn.prepareStatement(sql2);

            PreparedStatement ps3 = conn.prepareStatement(sql3);

            ps1.execute();

            ps2.execute();

            ps3.execute();

            ps1.close();

            ps2.close();

            ps3.close();

            conn.close();

        }

     

    }

    BUG:插入dept表数据时时需要显示的给d_id赋值

    dept表在两个逻辑数据库设计为d_id主键自增

    其余的User和Student表自己设置主键自增

    结果分析

    Mycat逻辑库中的数据

    逻辑库中每个表都有有数据

    下次尝试 : 不让mycat管理主键,即不指定主键,自增属性,只指定分库节点和分片规则

    https://blog.51cto.com/13476134/2114125

    成功!!!

    演示 : 读写分离

    Mycat实现数据的读写分离需要数据库集群有主从复制

    ip

    状态

    解释

    192.168.136.128

    主服务器

    t_order表

    主服务器主做写入操作,主服务器,创建了表,从服务器自动复制

    192.168.136.129

    从服务器

    t_order表

    从服务器主做查询操作,

    192.168.136.131

    从服务器

    t_order表

    从服务器主做查询操作,与上一个查询负载均衡

    192.168.136.130

    Mycat逻辑库

    做读写分离,读操作的负载均衡

    1. dataHost标签balance=3 读写分离,

      2.<writeHost>中配置<readHost>

     

      3.测试读写

      4.修改从库,确定是从 从库查询的数据

      5.修改Mycat的日志级别:默认为INFO,修改为debug

     

     

     

    Server.xml

    <user name="qsj">

                    <property name="password">123456</property>

                    <property name="schemas">zzy_table2</property>

                    <property name="readOnly">false</property>

            </user>

    与上分库分表的一致

    Schema.xml

    将之前的分库分表的schema.xml改名字为schema-fenkufenbiao.xml

    做读写分离

    再创建一个schema.xml

    vim schema.xml

    <?xml version="1.0"?>

    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">

    <mycat:schema xmlns:mycat="http://io.mycat/">

             <!-- 数据库配置,与server.xml中的数据库对应 -->

        <schema name="zzy_table2" checkSQLschema="false" sqlMaxLimit="100">

            <table name="t_order" dataNode="dn1"  />

        </schema>

             <!-- 分片配置 -->

        <dataNode name="dn1" dataHost="test1" database="zzy_table2" />

             <!-- 物理数据库配置 -->

             <!-- balance="3" 读写分离-->

        <dataHost name="test1" maxCon="1000" minCon="10" balance="3"  writeType="0" dbType="mysql" dbDriver="native">

            <heartbeat>select user();</heartbeat>

                       <!-- 写入的服务器:主服务器 -->

            <writeHost host="zy01"  url="192.168.136.128:3306" user="root" password="123456">

                                <!-- 查询的服务器:两个从服务器 -->

                                <readHost host="zy02"  url="192.168.136.129:3306" user="root" password="123456"></readHost>

                                <readHost host="zy04"  url="192.168.136.131:3306" user="root" password="123456"></readHost>

                               

            </writeHost>

        </dataHost>

    </mycat:schema>

    启动Mycat

    时间比较长

    Navicat连接上

    效果

    在mycat中插入数据,查看主服务器中的表,有数据,两个从服务器也都复制了主服务器上的数据.

             在mycat中查询数据,查看wrapper.log日志确定执行的哪一个数据库

             或者修改从服务器数据,多次查询查看效果

    BUG

             表名 :不用使用关键字 比如说order ,因为关键字 order by的原因,mycat会解析表名出错! 改为t_order

    总结

             分库分表 : 就是在<schema>中配置table,然后指定数据库节点,和分片规则

             读写分离 : 就是在<dataHost>中配置balance>0 和writeType 属性

    我会慢慢更新一下Java 的学习知识,在我所写的内容中有不懂的可以直接私信我。
  • 相关阅读:
    小小的蜗牛有大大的梦想
    Spring整合的quartz任务调度的实现方式
    HDU/HDOJ 2612 Find a way 双向BFS
    在静态库中,实现自动的初始化与卸载接口
    CF 316C2(Tidying Up-二分图最大边权)
    Qt线程同步操作用QWaitCondition QMutex
    MQ、JMS以及ActiveMQ
    微博分享利器
    discuz清空session,导致session保存机制失败,session无法更新与解决
    路由器和交换机的综合实验(1)
  • 原文地址:https://www.cnblogs.com/interflow/p/11589226.html
Copyright © 2011-2022 走看看