mycat实现MySQL读写分离

mycat实现MySQL读写分离mycat是什么?

Mycat是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而Mycat并没有存储引擎,所以并不是完全意义的分布式数据库系统。Mycat是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集群构成了整个完整的数据库存储。

一、Mycat的几个典型的应用场景: 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换;

分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;

多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;

表系统,借助于Mycat的分表能力,处理大规模报表的统计;

代替Hbase,分析大数据;

作为海量数据实时查询的一种简单有效方案,比如 100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择;

单纯的MyCAT读写分离,配置最为简单,支持读写分离,主从切换分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;

多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;

报表系统,借助于Mycat的分表能力,处理大规模报表的统计替代Hbase,分析大数据,作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择。

实现读写分离

  1. 实验环境centos 6.5
192.168.1.11 http服务(discuz论坛)

192.168.1.103 mycat服务

192.168.1.21 master_mysql

192.168.1.23 slave_mysql
  1. 配置mysql主从
  2. 在master-mysql服务器的配置文件[mysqld]下加如下两句:
#vim/etc/my.cnf[mysqld]server-id=1log-bin=mysql-bin
# /etc/init.d/mysqld start  //重启服务器
  1. 登陆master-mysql服务器,进行用户授权并查看状态:
mysql>GRANTREPLICATIONSLAVEON*.*TO'dianel'@'%'IDENTIFIEDBY'dianel';
QueryOK,0rowsaffected(0.15sec)mysql>showmasterstatus;
+------------------+----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
|mysql-bin.000012|6045464|||
+------------------+----------+--------------+------------------+
1rowinset(0.00sec)
  1. 配置slave-mysql, 在配置文件中[mysqld]下添加下面语句,并重启服务器
#vim/etc/my.cnf[mysqld]server-id=2
#/etc/init.d/mysqld restart

接下来登陆slave-mysql服务器:进行主服务master-mysql认证。命令为:

CHANGE MASTER TO master_host='192.168.1.21',master_user='dianel',master_password='dianel',master_log_file='mysql-bin.000012',master_log_pos=6045464;
其中master_host,master_user....等都要和master-mysql一一对应.

然后slave start开启从服务器。

并 SHOW SLAVE STATUS/G;查看主从状态。

如果Slave_IO_Running: Yes Slave_SQL_Running: Yes
这两个线程都为yes即表示mysql主从成功。
mysql>CHANGE MASTER TO master_host='192.168.1.21',master_user='dianel',master_password='dianel',master_log_file='mysql-bin.000012',master_log_pos=6045464;
QueryOK,0rowsaffected(0.04sec)

mysql>SLAVE START;
QueryOK,0rowsaffected(0.00sec)

mysql>SHOW SLAVE STATUS/G;

***************************1.row***************************
Slave_IO_State:Waitingformastertosendevent
Master_Host:192.168.1.21
Master_User:dianel
Master_Port:3306
Connect_Retry:60
Master_Log_File:mysql-bin.000012
Read_Master_Log_Pos:6045464
Relay_Log_File:localhost-relay-bin.000002
Relay_Log_Pos:253
Relay_Master_Log_File:mysql-bin.000012
Slave_IO_Running:
Slave_SQL_Running:

接下来在master-mysql上授权root用户密码:GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
  1. 安装mycat 安装mycat之前。需要先准备好jdk环境。

下载jdk-8u144-linux-x64.tar.gz包, 点击jdk下载。

解压:

# tar -zxf jdk-8u144-linux-x64.tar.gz
# mkdir-p /usr/java/
# mv jdk1.8.0_144/ /usr/java/

配置java环境变量。/etc/profile中添加如下语句:

export JAVA_HOME=/usr/java/jdk1.8.0_144/

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin

使环境变量立即生效并验证是否安装成功:

# source /etc/profile
# java-version

接下来下载和安装mycat:

# wget 下载地址
# tar xzf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
# mv mycat/ /usr/local/
#ls /usr/local/mycat/bin
cat letconfliblogsversion.txt

修改Mycat服务器参数调整和用户授权的配置文件server.xml。主要修改配置段如下:

# vim /usr/local/mycat/conf/server.xml

<username="jiajie1">
<propertyname="password">jiajie1</property>
<propertyname="schemas">TESTDB</property>

</user>

<username="jiajie2">
<propertyname="password">jiajie2</property>
<propertyname="schemas">TESTDB</property>
<propertyname="readOnly">true</property>
</user>

#创建jiajie1,jiajie2两个用户用于连接mycat中间件。

#用户名jiajie1密码jiajie1.对逻辑数据库TESTDB具有增删改查的权限,也即WEB连接MyCAT的用户名和密码。

#用户名jiajie2密码jiajie2该用户对逻辑数据库TESTDB只读的权限; 修改逻辑库定义和表及分片定义的配置文件schema.xml。

#vim/usr/local/mycat/conf/schema.xml

<?xmlversion="1.0"?>
<!DOCTYPEmycat:schemaSYSTEM"schema.dtd">
<mycat:schemaxmlns:mycat="http://io.mycat/">

<schemaname="TESTDB"checkSQLschema="false"sqlMaxLimit="1000"dataNode="dn1">

</schema>
<dataNodename="dn1"dataHost="localhost1"database="discuz"/>
<dataHostname="localhost1"maxCon="2000"minCon="1"balance="3"writeType="1"dbType="mysql"dbDriver="native"switchType="1"slaveThreshold="100">
<heartbeat>selectuser()</heartbeat>
<writeHosthost="hostM1"url="192.168.1.21:3306"user="root"password="123456">
<!--canhavemultireadhosts-->
<readHosthost="hostS1"url="192.168.1.23:3306"user="root"password="123456"/>
</writeHost>
</dataHost>
</mycat:schema>

schema.xml配置文件详解:

<?xmlversion="1.0"?>xml文件格式;
<!DOCTYPEmycat:schemaSYSTEM"schema.dtd">文件标签属性;
<mycat:schemaxmlns:mycat="http://io.mycat/">Mycat起始标签
<schemaname="testdb"checkSQLschema="false"sqlMaxLimit="1000"dataNode="dn1"></schema>
配置逻辑库,与server.xml指定库名保持一致,绑定数据节点dn1;
<dataNodename="dn1"dataHost="localhost1"database="discuz"/>
添加数据节点dn1,设置数据节点host名称,同时设置数据节点真实database为discuz;
<dataHostname="localhost1"maxCon="2000"minCon="1"balance="3"writeType="1"dbType="mysql"dbDriver="native"switchType="1"slaveThreshold="100">
数据节点主机,绑定数据节点,设置连接数及均衡方式、切换方法、驱动程序、连接方法;
Balance均衡策略设置:
1)balance=0不开启读写分离机制,所有读操作都发送到当前可用writehost;
2)balance=1全部的readHost与standbywriteHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡
3)balance=2所有读操作都随机的在readhost和writehost上分发;
4)balance=3所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力。
writeType写入策略设置
1)writeType=0,所有写操作发送到配置的第一个writeHost;
2)writeType=1,所有写操作都随机的发送到配置的writeHost;
3)writeType=2,不执行写操作。
switchType策略设置
1)switchType=-1,表示不自动切换;
2)switchType=1,默认值,自动切换;
3)switchType=2,基于MySQL主从同步的状态决定是否切换;
4)switchType=3,基于MySQLgalarycluster的切换机制(适合集群)(1.4.1),心跳语句为showstatuslike'wsrep%'。
<heartbeat>selectuser()</heartbeat>检测后端MYSQL实例,SQL语句;
<writeHosthost="hostM1"url="192.168.1.21:3306"user="root"password="123456"><readHosthost="hostS1"url="192.168.1.23:3306"user="root"password="123456"/></writeHost>
指定读写请求,同时转发至后端MYSQL真实服务器,配置连接后端MYSQL用户名和密码(该用户名和密码为MYSQL数据库用户名和密码);
</dataHost>数据主机标签;</mycat:schema>mycat结束标签;

mycat配置完毕。启动并查看端口8066和9066端口是否起来:

# /usr/local/mycat/bin/mycat start

# ss-tnl|egrep "8066|9066" LISTEN0100:::8066:::*
LISTEN0100:::9066:::*

#注意:如果没有这两个端口没有启动,查看java环境是否生效。

#8066是用于web连接mycat.
#9066是用于SA|DBA管理端口.

接下来以8066登陆查看数据库:

# mysql -h192.168.1.103 -ujiajie1 -pjiajie1 -P8066

mysql>showdatabases;
+----------+|DATABASE|
+----------+|TESTDB|
+----------+1rowinset(0.01sec)

以9066登陆查看数据源:

# mysql -h192.168.1.103 -ujiajie1 -pjiajie1 -P9066
mysql>[email protected]@datasource;
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
|DATANODE|NAME|TYPE|HOST|PORT|W/R|ACTIVE|IDLE|SIZE|EXECUTE|READ_LOAD|WRITE_LOAD|
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
|dn1|hostM1|mysql|192.168.1.21|3306|W|0|0|2000|0|0|0|
|dn1|hostS1|mysql|192.168.1.23|3306|R|0|0|2000|0|0|0|
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
2rowsinset(0.00sec)
  1. 配置http服务: 修改httpd中discuz的配置文件。将dbhost,dbuser,dbpw,dbname中的参数改为和mycat一一对应。实现读写分离。重启服务.
# vim /var/www/html/config/config_global.php$_config=array();

//----------------------------CONFIGDB-----------------------------//
$_config['db']['1']['dbhost']='';
$_config['db']['1']['dbuser']=';
$_config['db']['1']['dbpw']='';
$_config['db']['1']['dbcharset']='utf8';
$_config['db']['1']['pconnect']='0';
$_config['db']['1']['dbname']='';
$_config['db']['1']['tablepre']='pre_';
$_config['db']['slave']='';
$_config['db']['common']['slave_except_table']='';

#注意:数据库名字为mycat的逻辑数据库

#/etc/init.d/httpd restart

这时你在论坛进行浏览和发帖操作。再通过9066登陆查看,读和写的次数如下。证明读写分离成功。
# mysql -h192.168.1.103 -ujiajie1 -pjiajie1 -P9066

mysql>[email protected]@datasource;
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
|DATANODE|NAME|TYPE|HOST|PORT|W/R|ACTIVE|IDLE|SIZE|EXECUTE|READ_LOAD|WRITE_LOAD|
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
|dn1|hostM1|mysql|192.168.1.21|3306|W|0|1|2000|51|0||
|dn1|hostS1|mysql|192.168.1.23|3306|R|0|1|2000|79||0|
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
2rowsinset(0.02sec)
mysql>[email protected]@datasource;
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
|DATANODE|NAME|TYPE|HOST|PORT|W/R|ACTIVE|IDLE|SIZE|EXECUTE|READ_LOAD|WRITE_LOAD|
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
|dn1|hostM1|mysql|192.168.1.21|3306|W|0|2|2000|151|0||
|dn1|hostS1|mysql|192.168.1.23|3306|R|0|2|2000|255||0|
+----------+--------+-------+--------------+-----+------+--------+------+------+---------+-----------+------------+
2rowsinset(0.01sec)
  1. 扩展

MyCAT 简易入门

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏破晓之歌

Redis安装和初步使用 原

获取安装包:https://github.com/MSOpenTech/redis

2072
来自专栏云计算教程系列

如何在一个Ubuntu 16.04服务器上将Nginx配置为Web服务器和Apache的反向代理

Apache和Nginx是两种常用的PHP开源Web服务器。当托管具有不同要求的多个网站时,在同一虚拟机上运行它们会很有用。在单个系统上运行两个Web服务器的一...

2303
来自专栏三木的博客

Openstack Trove概要

Trove简介 Openstack Trove是openstack为用户提供的数据库即服务(DBaaS)。所谓DBaaS,即trove既具有数据库管理的功能,又...

3227
来自专栏IMWeb前端团队

web性能优化之:no-cache与must-revalidate深入探究

引言 稍微了解HTTP协议的前端同学,相比对Cache-Control不会感到陌生,性能优化时经常都会跟它打交道。 常见的值有有private、public、n...

3299
来自专栏三杯水

系统重启后nginx reload不生效原因分析

这是一种比较少见,困扰我很久的问题,虽然这个问题很简单,但是找到根本原因还是费了不少时间,现在把分析过程分享如下。

3152
来自专栏hbbliyong

Intellij IDEA 使用Spring-boot-devTools无效解决办法

相信大部分使用Intellij的同学都会遇到这个问题,即使项目使用了spring-boot-devtools,修改了类或者html、js等,idea还是不会自动...

2755
来自专栏云计算教程系列

如何在一个Ubuntu 18.04服务器上将Nginx配置为Web服务器和Apache的反向代理

Apache和Nginx是目前比较流行的两种常用于PHP的开源Web服务器。当托管具有不同要求的多个网站时,在同一虚拟机上运行它们会很有用。在单个系统上运行两个...

5950
来自专栏JavaEE

VMware虚拟机、centos以及securecrt的安装前言:vmware虚拟机:centos:secureCRT

43112
来自专栏程序员同行者

构建NTP时间服务器

2452
来自专栏乐沙弥的世界

基于CentOS 7配置Nginx反向代理

Nginx作为反向代理服务器被广泛使用在各大互联网企业。它简单易用,可以根据业务的需求将其不同的业务类型代理至不同的服务器,将整个站点请求压力按类型分摊到不同的...

2752

扫码关注云+社区

领取腾讯云代金券