专栏首页杨建荣的学习笔记Mycat读写分离配置实践

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即可。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:r13笔记第72天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-09-04

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL replace into的使用细则(r10笔记第48天)

    在Oracle中有merge into的语法,可以达到一个语句完成同时修改,添加数据的功能,MySQL里面没有merge into的语法,却有replace i...

    jeanron100
  • 最近的几个技术问题总结和答疑(八)(r9笔记第82天)

    今天的技术问答是刘晨兄的一个问题,提问来自于我新书中的一个实验,刘晨兄非常认真,对我书中的很多细节都进行了测试。 ? 看到这个错误,如果出现end-of-f...

    jeanron100
  • 大分区表的手工并行优化

    这段时间饱受大分区表的性能之苦,碰到最大的一个分区表有1个t左右,操作起来每个细节都需要格外小心,我这次和大家分享的案例应用的分区表不是很大,有80G左右。但是...

    jeanron100
  • Redis 学习笔记3 - 数据结构

    深刻理解这五种数据结构,它们的工作原理,它们提供的方法,以及怎样用这些数据结构去建模,是学习理解 Redis 的关键。 首先要弄明白这些数据结构的具体含义。

    zhangyunfeiVir
  • python代码检查工具pylint-让你的python更规范

    遇到一个新的问题,总是离不开3W原则(What,Why,hoW),下面是对python代码静态检测工具pylint的学习:

    the5fire
  • Go语言实战笔记(十一)| Go 标志符可见性

    Go的标志符,这个翻译觉得怪怪的,不过还是按这个起了标题,可以理解为Go的变量、类型、字段等。这里的可见性,也就是说那些方法、函数、类型或者变量字段的可见性,比...

    飞雪无情
  • 机器人自我/其他差异:主动推理与镜子中的神经网络学习(CS RO)

    在本文中,我们介绍了ADD-Lib,这是我们高效且易于使用的代数决策图(ADD)框架。ADD-Lib的重点不是其有效地实现其他已建立的ADD框架所采用的单个操作...

    时代在召唤
  • 来自10位成功IT人士的23条经验教训

    我们是从一个只有3个人其他啥都没有的创业公司逐步成长为一家大型的具备可扩展性,业务操作能力,数据库和产品开发的企业。如果你真心醉心于做企业,那么这就应该成为你的...

    一墨编程学习
  • 基本的Oracle模式:将区块链连接到链下世界

    中文摘要:区块链已经发展成为一个用于分散应用程序的平台,具有高完整性、透明度和抗审查和篡改的弹性等优点。然而,区块链是封闭世界的系统,不能访问外部状态。为了克服...

    用户7454122
  • kubernetes(k8s)集群安装calico

    sunsky

扫码关注云+社区

领取腾讯云代金券