• mycat练习笔记


    学习要趁早,装逼莫等老。

    刚刚开始接触到mycat, 当然要学习一下了。拿它来设置 mysql 的读写分离,分库分表,以及集群等。

    官网: http://www.mycat.io/  有详情介绍,有Github, 有权威指南pdf 

    我用的 release 1.6.7.1  下载:http://dl.mycat.io/

    我的练习环境: 3台 centos, 1个6.5, 1个6.10, 1个7.5 ( 其实都差不多,没有影响。)

    # hosts
    192.168.112.5 node-5   # mysql-5.7.23 master
    192.168.112.9 hadoopalone   # mycat-1.6.7.1
    192.168.112.7 cent7    # mysql-5.7.25 slave 

    安装2台mysql 5.7  参照: https://www.cnblogs.com/frx9527/p/mysql57.html 

    安装 mycat 

    下载JDK,解压,设置JAVA_HOME环境变量,并测试java -version 成功

    开始 Mycat  

    cd /opt
    wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz
    tar zxf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz
    
    vim /etc/profile
    # 添加一个变量MYCAT_HOME
    export MYCAT_HOME=/opt/mycat
    export PATH=$MYCAT_HOME/bin:$PATH

    添加用户,用于独立运行mycat
    useradd mycat
    passwd mycat
    chown mycat:mycat /opt/mycat

    读写分离

    先来个简单的, 读写分离,需要先开启mysql本身的binlog主从复制,库是 koa_demo , 参照:https://www.cnblogs.com/frx9527/p/bin-log.html

    配置mycat/conf/ 下的 schema.xml 和 server.xml  注意保存为UTF8格式。详细教程可参考官网的Mycat权威指南

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 读写分离 -->
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" ><!--没有逻辑表--></schema>
        <dataNode name="dn1" dataHost="node1" database="koa_demo" /> <!-- koa_demo 真实数据库 -->
    
        <!-- balance=1 在一主多从时有用,一主一从则无法体现 -->
        <dataHost name="node1" maxCon="1000" minCon="10" balance="1"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <writeHost host="node-5" url="node-5:3306" user="root" password="123456">
                <readHost host="cent7" url="cent7:3306" user="root" password="123456" />
            </writeHost>
            <writeHost host="cent7" url="cent7:3306" user="root" password="123456" />
        </dataHost>
    
    </mycat:schema>

     上面的wirteHost是写主机,readHost是读主机,switchType 为1 时,上个wirteHost不能访问则自动切换到下个writeHost,-1不切换。

    假设上面的node-5 (master)当机,那么mycat 还是可以读到readHost即 cent7的数据。但是不能写入。而如果允许切换,则cent7可读可写,因为此时cent7成了writeHost

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
        <property name="useHandshakeV10">1</property>
        <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
        <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
            <property name="sequnceHandlerType">2</property>
        <property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
            <property name="processorBufferPoolType">0</property>
            <!-- 也可将端口改为3306,但要注意端口冲突 -->
                <property name="serverPort">8066</property> 
                <property name="managerPort">9066</property> 
                <property name="idleTimeout">300000</property> 
                <property name="bindIp">0.0.0.0</property> 
                <property name="frontWriteQueueSize">4096</property> 
                <property name="processors">32</property> 
            <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
            <property name="handleDistributedTransactions">0</property>
            <property name="useOffHeapForMerge">1</property>
            <property name="memoryPageSize">64k</property>
            <property name="spillsFileBufferSize">1k</property>
            <property name="useStreamOutput">0</property>
            <property name="systemReserveMemorySize">384m</property>
    
            <!--是否采用zookeeper协调切换  -->
            <property name="useZKSwitch">false</property>
            <property name="strictTxIsolation">false</property>
            <property name="useZKSwitch">true</property>
        </system>
    
    <!-- mycat 用户/密码/逻辑库,不是真实的数据库 -->
        <user name="admin" defaultAccount="true">
            <property name="password">admin</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>
    </mycat:server>

    重启 mycat stop; mycat start

    可以用 netstat -nltp 命令检查是否开启了server中设置的 8066端口. 如果成功,可以用Navicat等客户端连接mycat测试。

    也可以配置 mycat/conf/log4j2.xml文件,将 <loggers>中 <asyncRoot level="debug" includeLocation="true"> 改到debug级别,

    则可以在日志mycat.log中看到更详细的记录。如insert语句将进入 writeHost, select语句将执行在 readHost.等。

    日志级别: all < trace < debug < info < warn < error < fatal < off   越往右级别越高,记录的信息越少。更改级别后需要重启mycat服务.

    也可以使用 python 测试脚本, 前提是需要先安装好 MySQLdb 组件

    运行如果出错:找不到 lib64/libmysqlclient_r.so.16的话,则 ln -s /usr/lib64/mysql/libmysqlclient_r.so.16 /usr/lib64/libmysqlclient_r.so.16

    可能需要的文件:lib64/libmysqlclient_r.so.16  点此下载

    #! /usr/bin/env python
    #encoding=utf-8
    
    import MySQLdb as ms, random
    
    try:
        conn = ms.connect(host='192.168.112.9',port=8066,user='admin',passwd='admin',db='TESTDB',charset='utf8')
        cursor = conn.cursor()
    except ms.Error, e:
        print ("Error1 %d: %s 
    " %(e.args[0],e.args[1]))
        
    try:
        for i in range(20,30):
            insql='''
            insert into test(id, expires, data) values('%s', '%s', '%s') 
            ''' % (i, random.randint(10, 99), random.randint(100, 999))
            print(insql)
            cursor.execute(insql)
            cursor.execute('commit')
            
        for i in range(11,20):
            sqlstr='''
            select * from test where id = %s; ''' %(i)
            cursor.execute(sqlstr)
            res = cursor.fetchall()
            print(res)
            
    except ms.Error, e:
        print ("Error2 %d: %s 
    " %(e.args[0],e.args[1]))
    finally:
        cursor.close()
        conn.close()
        

    管理 mycat 

    ---- 使用server.xml中配置的用户名密码端口连接mycat----
    
    mysql -uadmin -padmin -h127.0.0.1 -P9066
    
    show @@help; -- 帮助
    reload @@config; -- 重载配置
    show @@datanode; -- 查看节点
    show @@datasource; -- 查看真实数据源
    show @@backend;    -- 查看连接情况

    有一个文章是不同的声音。看了觉得有道理。

    MyCat从入门到放弃,文中列举了几种具体应用时的缺点。  https://blog.csdn.net/u013898617/article/details/80402956     https://blog.csdn.net/u013235478/article/details/53178657

  • 相关阅读:
    HDU 5569 matrix
    HDU 2795 Billboard
    HDU 1394 Minimum Inversion Number
    HDU 1754 I Hate It
    HDU 1166 敌兵布阵
    FOJ 2206 函数求解
    hihoCoder 1252 Kejin Game
    hihoCoder 1257 Snake Carpet(很简单的构造方法)
    2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)
    HDU 2485 Destroying the bus stations
  • 原文地址:https://www.cnblogs.com/frx9527/p/mycat.html
Copyright © 2020-2023  润新知