Mycat读写分离配置实践

  
工作这些年来,也去了一些地方,有了一些见闻,隐隐感觉很多文化和猫有着千丝万缕的联系。就拿IT行业来说吧,猫有着很高的曝光率,比如大名鼎鼎的
tomcat,是由SUN的软件构架师詹姆斯·邓肯·戴维森开发,并由Sun贡献给Apache软件基金会,他希望这种动物能够自己照顾自己,将其命名为
Tomcat,于是乎这个名字就留下来了。

  在Oracle中我最喜欢查看的一个数据字典试图就是cat,这是典型的猫文化,没有其他的技术意味。

  最早听到mycat的时候,我意味是一个国外的开源项目,但是紧接着发现这竟然是一个国产项目,让我有些激动,而且源代码是基于Java的,我觉得太对我的胃口了。

  下面的猫儿是在泰国皮皮岛的一个早晨碰见的,它睡在门口,眼皮都懒得抬一下。

  mycat这么一个项目,在国内确实很火,在github上也有链接,星标有2000多个。是基于阿里开源的Cobar产品而研发。

  github链接如下:

https://github.com/MyCATApache/Mycat-Server/wiki

  官方的链接如下:

http://dl.mycat.io/目前的版本比较新的是1.6,摸爬滚打这么多年,也算是见证了国内数据库的一个发展,它本身不仅仅支持MySQL,还支持Oracle,PG等,目前MySQL方向用的最为流行。

安装部署

Mycat的安装部署其实很简单,从官方下载对应的安装包即可,大概是15M左右。

下载最新的安装包:

wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

 解压后的安装包内容有60M左右。

安装Mycat很简单,只需要保证Java已经正确安装,如果系统自带,版本不低也可以。

# java -version
java version "1.7.0_45"
OpenJDK Runtime Environment (rhel-2.4.3.3.0.1.el6-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)相应的Java的基础配置也需要在profile文件里对应调整一下。

比如修改.bash_profile文件。

export JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

创建系统级的组和用户

useradd mycat对于安装来说,几乎不需要可以调整,直接把解压后的mycat目录拷贝到/usr/local下即可,然后修改权限。

mv mycat/ /usr/local/
chown mycat:mycat /usr/local/mycat

配置数据库环境

我们需要配置的数据库环境假设是一主三从,可以在一台服务器上搭建模拟,一主三从如果快速搭建部署,可以参考github上我写的一个小脚本,https://github.com/jeanron100/mysql_slaves,分分钟搞定。

假设环境的情况如下:

master:   端口33091
slave1:   端口33092
slave2:   端口33093
slave3:   端口33093

mycat可以实现很多功能,在此先实现一个需求,比如现在有一套环境读多写少,需要提供大量的数据量连接访问。我们就可以创建两个用户mycat_user,负责DML,mycat_read负责查询。create user mycat_user identified by 'mycat';
create user mycat_read identified by 'mycat';

比如有多个数据库,我们就模拟创建3个数据库来。

create database db1;
create database db2;
create database db3;

分配权限的部分如下:

grant select on db1.* to mycat_read;
grant select,insert,delete,update on db1.* to mycat_user;

grant select on db2.* to mycat_read;
grant select,insert,delete,update on db2.* to mycat_user;

grant select on db3.* to mycat_read;
grant select,insert,delete,update on db3.* to mycat_user;赋予从库状态查询的权限,在后面需要用。

mysql> grant replication client on *.* to 'mycat_read'@'%' ;
mysql> grant replication client on *.* to 'mycat_user'@'%' ;

初始化数据

初始化数据库,我还是选用一个经典的标travelrecord,然后插入两行记录。在3个数据库db1,db2,db3中创建。

mysql> create table travelrecord
(id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);

mysql>  insert into travelrecord(id,user_id,traveldate,fee,days)  values(1,@@hostname,20160101,100,10);

mysql> insert into travelrecord(id,user_id,traveldate,fee,days)  values(5000001,@@hostname,20160102,100,10);

mycat配置

 上面的工作做好之后,系统层面,数据库层面的工作就做好了。启动Mycat的命令很简单,比如mycat start,停止Mycat的命 令 mycat stop等等。

  命令很简单,关键在于Mycat的配置,这个才是重点。在mycat/conf目录下有两个文件需要重点关注,一个是server.xml,一个是schema.xml

  server.xml的配置关键内容如下,我们配置了两个用户,所以在这个配置文件里就先按照如下的配置,这里我们配置schema是pxc_schema,先卖个关子。

        <user name="mycat_user">
                <property name="password">mycat</property>
                <property name="schemas">pxc_schema</property>
        </user>
        <user name="mycat_read">
                <property name="password">mycat</property>
                <property name="schemas">pxc_schema</property>
                <property name="readOnly">true</property>
        </user>
</mycat:server>

  schema.xml的内容如下,也做了相应的标注。

<?xml version="1.0"?> 
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 
    <mycat:schema xmlns:mycat="http://io.mycat/">          
        <!-- 定义MyCat的逻辑库 --> 
        <schema name="pxc_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema>       
        <!-- 定义MyCat的数据节点 --> 
        <dataNode name="pcxNode" dataHost="dtHost" database="db1" />                 
        <!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一--> 
        <!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 --> 
        <!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡--> 
        <!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost--> 
        <dataHost name="dtHost" maxCon="500" minCon="20" balance="1" 
            writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 
            <!--心跳检测 --> 
            <heartbeat>show slave status</heartbeat>            
            <!--配置后台数据库的IP地址和端口号,还有账号密码,这里我们可以根据需要来配置,比如一主三从的环境 --> 
            <writeHost host="hostMaster" url="192.168.163.128:33091" user="mycat_user" password="mycat" /> 
            <writeHost host="hostSlave1" url="192.168.163.128:33092" user="mycat_read" password="mycat" /> 
            <writeHost host="hostSlave2" url="192.168.163.128:33093" user="mycat_read" password="mycat" /> 
            <writeHost host="hostSlave3" url="192.168.163.128:33094" user="mycat_read" password="mycat" /> 
        </dataHost> 
</mycat:schema>

检测Mycat的连接情况

Mycat的配置做好了以后,整个工作的80%的任务就完成了,其实关键还是在于Mycat文件的配置,配置不当还是需要反复调试的。

如果验证Mycat的生效呢,我们可以使用8066这个默认端口来连接,如果里面出现mycat的字样,就证明是Mycat设置生效了。

[root@oel64 logs]# mysql -umycat_read -pmycat -P8066  -h192.168.163.128
。。。
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)
。。。
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

我们看看这个用户mycat_read能够访问的数据库,在数据库里应该就是db1,db2,db3,为什么这里出现了pxc_shema呢,其实也可以理解是Mycat在中间过滤的效果,其实这是db1,而db2,db3还没有在Mycat配置文件中体现,所以还没有生效。

mysql> show databases;
+------------+
| DATABASE   |
+------------+
| pxc_schema |
+------------+
1 row in set (0.00 sec)我们就连接到这个pxc_schema数据库。

mysql> use pxc_schema
Database changed

可以看到这个数据库下的表。

mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| travelrecord  |
+---------------+
1 row in set (0.01 sec)

如果验证我们连接到的数据库是启用了Mycat的读写分离呢。我们可以看端口。

mysql> select @@port;
+--------+
| @@port |
+--------+
|  33092 |
+--------+
1 row in set (0.05 sec)

由此我们可以看到,连接到的是33092的端口,即是slave1
可以反复切换,看看这个load balance的方式是否满意。

继续扩展Mycat读写分离的配置

上面的步骤只是简单实现了读写分离的配置,比如我要访问多个数据库,而不仅仅是pxc_schema,该如何配置呢。

我们在server.xml中就需要对schema扩展一下,schema的值是以逗号分隔,配置的细节是在schema.xml里面映射的。

<user name="mycat_user">
                <property name="password">mycat</property>
                <property name="schemas">pxc_schema,db2,db3</property>
        </user>

        如果在schema.xml里面配置多个 逻辑库,就可以配置多个schema键值即可。        

  <schema name="pxc_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema> 
  <schema name="db2" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode2"></schema> 
  <schema name="db3" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode3"></schema>       相应的dataNode也需要扩展映射。  

<dataNode name="pcxNode" dataHost="dtHost" database="db1" /> 
<dataNode name="pcxNode2" dataHost="dtHost" database="db2" /> 
<dataNode name="pcxNode3" dataHost="dtHost" database="db3" />        整个过程完成后,重启一下Mycat即可。

   

时间: 2024-10-02 06:22:42

Mycat读写分离配置实践的相关文章

SQL Server AlwaysOn读写分离配置图文教程

概述 Alwayson相对于数据库镜像最大的优势就是可读副本,带来可读副本的同时还添加了一个新的功能就是配置只读路由实现读写分离:当然这里的读写分离稍微夸张了一点,只能称之为半读写分离吧!看接下来的文章就知道为什么称之为半读写分离. 数据库:SQLServer2014 db01:192.168.1.22 db02:192.168.1.23 db03:192.168.1.24 监听ip:192.168.1.25 配置可用性组 可用性副本概念辅助角色支持的连接访问类型 1.无连接 不允许任何用户连接

MySQL5.6 Replication主从复制(读写分离) 配置完整版_Mysql

MySQL5.6主从复制(读写分离)教程 1.MySQL5.6开始主从复制有两种方式: 基于日志(binlog): 基于GTID(全局事务标示符). 需要注意的是:GTID方式不支持临时表!所以如果你的业务系统要用到临时表的话就不要考虑这种方式了,至少目前最新版本MySQL5.6.12的GTID复制还是不支持临时表的. 所以本教程主要是告诉大家如何通过日志(binlog)方式做主从复制! 2.MySQL官方提供的MySQL Replication教程: http://dev.mysql.com/

MySQL主从同步、读写分离配置步骤_Mysql

现在使用的两台服务器已经安装了MySQL,全是rpm包装的,能正常使用. 为了避免不必要的麻烦,主从服务器MySQL版本尽量保持一致; 环境:192.168.0.1 (Master) 192.168.0.2 (Slave) MySQL Version:Ver 14.14 Distrib 5.1.48, for pc-linux-gnu (i686) using readline 5.1 1.登录Master服务器,修改my.cnf,添加如下内容: server-id = 1 //数据库ID号,

yii2 数据库读写分离配置示例

开始使用数据库首先需要配置数据库连接组件,通过添加 db 组件到应用配置实现("基础的" Web 应用是 config/web.PHP),DSN( Data Source Name )是数据源名称,用于指定数据库信息.如下所示: return [ // ... 'components' => [ // ... 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbna

[PHP] Larval 主从读写分离配置

在DB的连接工厂中找到以下代码 .../vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php /** * Get the read configuration for a read / write connection. * * @param array $config * @return array */ protected function getReadConfig(array $

MySQL5.5读写分离配置的详解

一.服务器配置 主库:192.168.204.132 vim /etc/my.cnf server-id= 1 log-bin=mysql-bin binlog_format=mixed #需要同步的二进制数据库名 binlog-do-db=test #不同步的二进制数据库名 binlog-ignore-db=mysql binlog-ignore-db=performance_schema #可选参数 sync-binlog = 1 #日志保留天数 expire_logs_days = 7 从

云服务器 ECS 配置:利用MySQL读写分离,提升应用数据吞吐性能

利用MySQL读写分离,提升应用数据吞吐性能 背景 一般情况下,对数据库的读和写都在同一个数据库服务器中操作时,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过读写分离来减轻主数据库的负载.本篇文章分别从应用层和系统层来介绍读写分离的实现方法. 应用层实现方法: 应用层中直接使用代码实现,在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以query.find.get等开头的就走读库,其他的走写库. 优点: 1.多数据源切换方便

Magento数据库配置选项,以及mysql 读写分离

1.数据库配置 [mysqld] key_buffer = 512M max_allowed_packet = 64M table_cache = 512 sort_buffer_size = 4M read_buffer_size = 4M read_rnd_buffer_size = 2M myisam_sort_buffer_size = 64M tmp_table_size = 128M query_cache_size = 96M query_cache_type = 1 thread

MySQL主从复制与读写分离

MySQL主从复制与读写分离 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部