关于mysql的mycat中间件安装配置与python使用mycat例子

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/helloxiaozhe/article/details/81771561

关于mysql的mycat中间件安装配置与python使用mycat例子

MyCAT是mysql中间件,Mycat数据库分库分表中间件国内最活跃的、性能最好的开源数据库中间件! 它是一款开源的Mysql企业级集群应用,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之。于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显。

MyCAT提供了类似Mysql的接口,可以平滑的将单机Mysql迁移到Mysql集群上,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。
这篇文章主要是MyCAT的入门部署和python使用。
一,什么是mycat

一个彻底开源的,面向企业应用开发的大数据库集群

支持事务、ACID、可以替代MySQL的加强版数据库

一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

一个新颖的数据库中间件产品

以上是官方说明。其实就是数据库的连接池。mysql proxy也是一种连接池,但是效率很低。

二,mycat 安装

1,下载地址mycat

2,安装mycat

# tar zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

我下载的是Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz

三,进行mycat配置的前提是已经配置好了,MySQL数据库主从架构,如下:

1、前提是已经配置了MySQL的主从关系,如下:

在192.168.1.120上MySQL命令行窗口,查看如下:

mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|       121 |      | 3306 |       120 | b8f1101c-9131-11e8-a9bd-000c294283ad |
|       122 |      | 3306 |       120 | deb94f66-8cfa-11e8-a1f4-000c29accb8e |
|       130 |      | 3306 |       120 | bab165c8-a093-11e8-93ba-000c29e026cb |
+-----------+------+------+-----------+--------------------------------------+
3 rows in set (0.00 sec)

在192.168.1.130上MySQL命令行窗口,查看如下:
mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|       120 |      | 3306 |       130 | c6e0ee48-90e9-11e8-8adb-000c29ba5130 |
|       131 |      | 3306 |       130 | ad97775c-a093-11e8-8ba8-000c295e5725 |
+-----------+------+------+-----------+--------------------------------------+
2 rows in set (0.00 sec)

最终架构为(以IP后一段称呼该主机):

120和130是互为主从
120的从节点为121和122
130的从节点是131

四,配置mycat

1,配置server.xml

# vim    /home/hadoop/software/mycat/conf/server.xml //添加以下内容

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
        - you may not use this file except in compliance with the License. - You 
        may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
        - - Unless required by applicable law or agreed to in writing, software - 
        distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
        WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
        License for the specific language governing permissions and - limitations 
        under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
        <system>
        <property name="defaultSqlParser">druidparser</property>
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!-- <property name="processorBufferChunk">40960</property> -->
        <!-- 
        <property name="processors">1</property> 
        <property name="processorExecutor">32</property> 
         -->
                <!--默认是65535 64K 用于sql解析时最大文本长度 -->
                <!--<property name="maxStringLiteralLength">65535</property>-->
                <!--<property name="sequnceHandlerType">0</property>-->
                <!--<property name="backSocketNoDelay">1</property>-->
                <!--<property name="frontSocketNoDelay">1</property>-->
                <!--<property name="processorExecutor">16</property>-->
                <!-- 
                        <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
                <property name="mutiNodePatchSize">100</property> 亿级数量排序批量
                        <property name="processors">32</property> <property name="processorExecutor">32</property> 
                        <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> -->
        </system>
        
        <user name="root">  #//mycat用户名
                <property name="password">root</property>   //mycat密码
                <property name="schemas">mstest</property>   //mycat虚拟数据库名
                <property name="benchmark">10000</property>   //benchmark:限制前端的整体连接数量,如果值是0表示不限制
        </user>

        <user name="user">
                <property name="password">user</property>
                <property name="schemas">mstest</property>
                <property name="readOnly">true</property>  //只读
        </user>
        <!-- 
        <quarantine> 
           <whitehost>
              <host host="127.0.0.1" user="mycat"/>
              <host host="127.0.0.2" user="mycat"/>
           </whitehost>
       <blacklist check="false"></blacklist>
        </quarantine>
        -->

</mycat:server>
                      
                      
在这里要注意,默认的虚拟数据名是TESTDB,如果schema.xml里面没有配置TESTDB,那就要把TESTDB改成schema.xml里面有的虚拟数据名。
这里定义的用户名和密码,虚拟数据库名,并不是在mysql中真实存在的。

2,配置schema.xml

# vim    /home/hadoop/software/mycat/conf/schema.xml //添加以下内容

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

     <schema name="mstest" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">  </schema>   //定义虚拟数据库名mytest

        <dataNode name="dn1" dataHost="localhost1" database="test" />  //真实数据库名test

            <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="localhost:3306" user="root" password="xx@123456">    //真实数据库的连接方式
                        <!-- can have multi read hosts -->
                        <readHost host="hostS2" url="192.168.1.121:3306" user="root" password="xx@123456" />   //同上
                        <readHost host="hostS2" url="192.168.1.122:3306" user="root" password="xx@123456" />   //同上
                </writeHost>

                <writeHost host="hostM2" url="192.168.1.130:3306" user="root" password="xx@123456">
                         <!-- can have multi read hosts -->
                        <readHost host="hostM2S1" url="192.168.1.131:3306" user="root" password="xx@123456" />
               </writeHost>   
</mycat:schema>

mycat的配置参数,相当的多。重点说一下 balance="1"与writeType="0"

a. balance 属性负载均衡类型,目前的取值有 4 种:

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

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

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

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

b. writeType 属性

负载均衡类型,目前的取值有 3 种:

1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个

writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .

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

3. writeType="2",没实现。

具体参数:http://mycat.io/document/Mycat_V1.6.0.pdf

3,配置主从服务器,就不在这儿说了,博客中有

4,添加真实用户

grant all privileges on test.* to root@"192.168.%" identified by 'xx@123456';
flush privileges


在120,130二台机器上添加用户。

5,测试真实用户连接,确保schema.xml中配置的真实用户,能连上真实的数据库。注意防火墙。

五,启动mycat

1,常用参数
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态

2,启动,并查看mycat

# ./mycat start
Starting Mycat-server...
 
# netstat -tpnl |grep 8066
tcp 0 0 :::8066 :::* LISTEN 31728/java
 
# ./mycat status
Mycat-server is running (31726).
六,测试读写分离

# mysql -u root -p -P 8066 -h 127.0.0.1 //一定要带上127.0.0.1

七,小结

mycat支持 mysql的分表,分片等等,但是不建议使用。mycat支持的集群不多,如果能配合MHA使用就比较牛B了。


八、python通过中间件mycat操作mysql代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import MySQLdb


class MyCatClass(object):
    def __init__(self):
        # 打开数据库连接
        #用户名和密码失败塑造出无法访问
        # self.__conn_db = MySQLdb.connect("192.168.1.120", "work", "xx@123456", charset='utf8', port=3306, db='test')
        # 以下是成功写法
        # 方法一
        # self.__conn_db = MySQLdb.connect(user='root', passwd='root', host='192.168.1.120', port=8066,db='mstest',charset='utf8')
        # 方法二
        # self.__conn_db = MySQLdb.connect(user='user', passwd='user', host='192.168.1.120', port=8066, db='mstest', charset='utf8')
        # 方法三
        config = {
            'host': '192.168.1.120',
            'port': 8066,
            'user': 'root',
            'passwd': 'root',
            'db': 'mstest',
            'charset': 'utf8'
        }
        self.__conn_db = MySQLdb.connect(**config)

        # 使用cursor()方法获取操作游标
        self.__cursor = self.__conn_db.cursor()

    # 使用execute方法执行SQL语句
    def excute_db(self,in_sql="SELECT VERSION()"):
        num=self.__cursor.execute(in_sql)
        if num>0:
            data_list = self.__cursor.fetchall()
        return data_list

    def show_dataset(self):
        sql="select * from stu_info"
        data_list=self.excute_db(in_sql=sql)
        print data_list
        for each in data_list:
            print each
            for e in each:
                print e
    def insert_data(self):
        sql_insert='''insert stu_info(name,age) values('0813',520)'''
        self.__cursor.execute(sql_insert)
        self.__conn_db.autocommit(True)
        # self.__conn_db.commit()

    def __del__(self):
        self.__cursor.close()


if __name__ == '__main__':
    obj_handle_mycat = MyCatClass()
    print obj_handle_mycat.excute_db()
    obj_handle_mycat.show_dataset()
    obj_handle_mycat.insert_data()
    obj_handle_mycat.show_dataset()

 参考:http://www.php.cn/mysql-tutorials-363510.html
            https://www.jianshu.com/p/f15d64fcb2f3

猜你喜欢

转载自blog.csdn.net/helloxiaozhe/article/details/81771561
今日推荐