关于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_listdef 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