MySql教程

mysql读写分离+mycat集群

本文主要是介绍mysql读写分离+mycat集群,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

 2.优势 基于阿里开源的 Cobar 产品而研发,Cobar 的稳定性、可靠性、优秀的架构和性能以及众 多成熟的使用案例使得 MYCAT 一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能 看到更远。业界优秀的开源项目和创新思路被广泛融入到 MYCAT 的基因中,使得 MYCAT 在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。 MYCAT 背后有一支强大的技术团队,其参与者都是 5 年以上软件工程师、架构师、DBA 等,优秀的技术团队保证了 MYCAT 的产品质量。 MYCAT 并不依托于任何一个商业公司,因此不像某些开源项目,将一些重要的特性封闭在 其商业产品中,使得开源项目成了一个摆设。

 

 

 

 

 

 

 

 

 server.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property>
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property>
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property> <property
name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property> <property
name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">64k</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property> <property
name="useZKSwitch">false</property>
</system>
<!--这里是设置的 kgc 用户和虚拟逻辑库-->
<user name="kgc" defaultAccount="true">
<property name="password">kgc123</property> <property name="schemas">kgc</property>
</user>
</mycat:server>

  schema.xml:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="db_zhu" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="cluster1" database="db_zhu" />
<dataNode name="dn2" dataHost="cluster2" database="db_zhu" />
mysql集群之基于Mycat实现读写分离
<dataHost name="cluster1" maxCon="1000" minCon="10" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="W1" url="192.168.115.188:3306" user="root" password="root">
<readHost host="W1R1" url="192.168.115.188:3307" user="root" password="root" />
</writeHost>
</dataHost>
<dataHost name="cluster2" maxCon="1000" minCon="10" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="W2" url="192.168.115.188:3316" user="root" password="root">
<readHost host="W2R1" url="192.168.115.188:3317" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>

  

rule.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:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="mod-long">
mysql集群之基于Mycat实现读写分离
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <property
name="count">2</property>
</function>
</mycat:rule>

  balance 属性说明: 负载均衡类型,目前的取值有 3 种: 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 没有。

 

 

 

 测试: --创建表,数据 CREATE TABLE `t_user` ( `id` int(32) NOT NULL AUTO_INCREMENT, `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; --测试结果:主库有写入数据,从库会同步数

 

 

 6.配置 master

#搭建 master
#创建目录
mkdir /data/mysql/master02
cd /data/mysql/master02
mkdir conf data
chmod 777 * -R
#创建配置文件
cd /data/mysql/master02/conf
vim my.cnf
#输入如下内容
[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #服务 id,不可重复
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_B
Y_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' #创建容器
docker create --name percona-master02 -v /data/mysql/master02/data:/var/lib/mysql -v
/data/mysql/master02/conf:/etc/my.cnf.d -p 3316:3306 -e MYSQL_ROOT_PASSWORD=root
percona:5.7.23
#启动
docker start percona-master02 && docker logs -f percona-master02
#创建同步账户以及授权
create user 'kgc'@'%' identified by 'kgc';
grant replication slave on *.* to 'kgc'@'%';
flush privileges;
#查看 master 状态
show master status

  7.配置 slave

#搭建从库
#创建目录
mkdir /data/mysql/slave02
cd /data/mysql/slave02
mkdir conf data
chmod 777 * -R
#创建配置文件
cd /data/mysql/slave02/conf
vim my.cnf
#输入如下内容
mysql集群之基于Mycat实现读写分离
[mysqld]
server-id=2 #服务 id,不可重复
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_B
Y_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' #创建容器
docker create --name percona-slave02 -v /data/mysql/slave02/data:/var/lib/mysql -v
/data/mysql/slave02/conf:/etc/my.cnf.d -p 3317:3306 -e MYSQL_ROOT_PASSWORD=root
percona:5.7.23
#启动
docker start percona-slave02 && docker logs -f percona-slave02
#设置 master 相关信息
CHANGE MASTER TO
master_host='192.168.115.211', master_user='kgc', master_password='kgc', master_port=3316, master_log_file='mysql-bin.000003', master_log_pos=737;
#启动同步
start slave;
#查看 master 状态 show slave status

  --创建表,数据 CREATE TABLE `t_user` ( `id` int(32) NOT NULL AUTO_INCREMENT, `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

 

8.配置 mycat

(1) 安装 jdk 环境
(1) sudo mkdir /usr/lib/jvm
(2) 并修改权限
(3)tar -zxvf jdk-8u141-linux-x64.tar.gz -C /usr/lib/jvm
(4)sudo vim ~/.bashrc
文件末尾追加如下内容
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_141
export PATH=$JAVA_HOME/bin:$PATH
mysql集群之基于Mycat实现读写分离
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
(5)使环境变量生效
source ~/.bashrc
(6)设置默认 jdk
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_141/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_141/bin/javac 300
sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.8.0_141/bin/jar 300
sudo update-alternatives --install /usr/bin/javah javah /usr/lib/jvm/jdk1.8.0_141/bin/javah 300
sudo update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/jdk1.8.0_141/bin/javap 300
(7)sudo update-alternatives --config java
(8)测试是否安装成功
java -version
javac -version
(2)
cd /data
mkdir mycat
cd mycat
通过 ftp 方式讲 mycat 安装包放到对应目录中
tar -xvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
mv mycat mycat01 #重命名
cd mycat01
cd conf
修改配置三个配置

  schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="db_zhu" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="cluster1" database="db_zhu" />
<dataNode name="dn2" dataHost="cluster2" database="db_zhu" />
<dataHost name="cluster1" maxCon="1000" minCon="10" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="W1" url="192.168.115.188:3306" user="root" password="root">
mysql集群之基于Mycat实现读写分离
<readHost host="W1R1" url="192.168.115.188:3307" user="root" password="root" />
</writeHost>
</dataHost>
<dataHost name="cluster2" maxCon="1000" minCon="10" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="W2" url="192.168.115.188:3316" user="root" password="root">
<readHost host="W2R1" url="192.168.115.188:3317" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>

  rule.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:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <property
name="count">2</property>
</function>
</mycat:rule>

  server.xml

<?xml version="1.0" encoding="UTF-8"?>
mysql集群之基于Mycat实现读写分离
<!-- - - 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://io.mycat/">
<system>
<property name="useSqlStat">0</property> <!-- 1 为开启实时统计、0 为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1 为开启全加班一致性检测、
0 为关闭 -->
<property name="sequnceHandlerType">2</property>
<!-- <property name="useCompression">1</property>--> <!--1 为开启 mysql 压缩协议
-->
<!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!-- 设 置 模 拟 的
MySQL 版本号-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!-- <property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默认为 type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
<property name="processorBufferPoolType">0</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="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> -->
<!--分布式事务开关,0 为不过滤分布式事务,1 为过滤分布式事务(如果分布式事
务内只涉及全局表,则不过滤),2 为不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
mysql集群之基于Mycat实现读写分离
<!-- off heap for merge/order/group/limit 1 开启 0 关闭
-->
<property name="useOffHeapForMerge">1</property>
<!-- 单位为 m
-->
<property name="memoryPageSize">1m</property>
<!-- 单位为 k
-->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!-- 单位为 m
-->
<property name="systemReserveMemorySize">384m</property>
<!--是否采用 zookeeper 协调切换 -->
<property name="useZKSwitch">true</property>
</system>
<!-- 全局 SQL 防火墙设置 -->
<!-- <firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
<user name="root">
<property name="password">123456</property>
<property name="schemas">db_zhu</property>
mysql集群之基于Mycat实现读写分离
<!-- 表级 DML 权限设置 -->
<!-- <privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
</mycat:server>

  

重新启动 mycat 进行测试:
./startup_nowrap.sh && tail -f ../logs/mycat.log
测试
添加数据测试结果(主库,从库,逻辑库)
可以看到,数据已经从 2 个分片中进行了汇总。
9.Mycat 集群
mycat 做了数据库的代理,在高并发的情况下,会遇到单节点性能问题,所以需要部署多个
mycat 节点。 架构:
mysql集

  

 

 

搭建多节点 mycat:
cp mycat mycat2 -R
vim wrapper.conf
#设置 jmx 端口
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1985 vim server.xml
#设置服务端口以及管理端口
<property name="serverPort">8067</property>
<property name="managerPort">9067</property>
#重新启动服务
./startup_nowrap.sh
tail -f ../logs/mycat.log
多节点的 mycat

  

 

这篇关于mysql读写分离+mycat集群的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!