读写分离的基础是主从复制,在我的笔记MySQL5.7主从复制环境搭建以及介绍了搭建的方法,下面我们来在此基础上搭建MyCat的读写分离环境,本片笔记只是简单的环境搭建,并不涉及原理以及更多高级的配置。
一、读写分离实现方式
实现方式有很多,但是不外乎分为内部配置和使用中间件,下面列举几个常用的方法:
1.配置多个数据源,根据业务需求访问不同的数据,指定对应的策略:增加,删除,修改操作访问对应数据,查询访问对应数据,不同数据库做好的数据一致性的处理。由于此方法相对易懂,简单,不做过多介绍
2.动态切换数据源,根据配置的文件,业务动态切换访问的数据库:此方案通过Spring的AOP,AspactJ来实现动态织入,通过编程继承实现Spring中的AbstractRoutingDataSource,来实现数据库访问的动态切换,不仅可以方便扩展,不影响现有程序,而且对于此功能的增删也比较容易。
3.通过mycat来实现读写分离:使用mycat提供的读写分离功能,mycat连接多个数据库,数据源只需要连接mycat,对于开发人员而言他还是连接了一个数据库(实际是mysql的mycat中间件),而且也不需要根据不同业务来选择不同的库,这样就不会有多余的代码产生。
这里用第三种方式实现。
二、开始搭建
环境
centos7、MySQL5.7、mycat1.6
1、安装jdk运行环境
Mycat是java语言编写的,需要jdk的运行环境。
yum install java-1.8.0-openjdk.x86_64
2、下载Mycat
我这里是先进入/usr/local 目录下,然后用wget命令下载。
wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
版本大家可以取官网(http://www.mycat.org.cn/) 上找。
3、解压
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
4、修改配置文件
这里主要修改两个,在conf目录下。
server.xml
schema.xml
server.xml主要配置连接的用户密和虚拟库库,schema.xml配置的是对应的真实库,默认超级多内容,但是这篇博文不深入了解,直接把全部无关的配置都删掉,用下面的配置即可。
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<user name="root">
<property name="password">123456</property>
<property name="schemas">test</property>
</user>
</mycat:server>
user 用户配置节点
—name 登录的用户名,也就是连接Mycat的用户名
—password 登录的密码,也就是连接Mycat的密码
—schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test" checkSQLschema="false" sqlMaxLimit="100">
<table name="user" dataNode="db_node"/>
</schema>
<dataNode name="db_node" dataHost="db_host" database="test" />
<dataHost name="db_host" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.157.6:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.157.7:3306" user="root" password="123456"/>
</writeHost>
</dataHost>
</mycat:schema>
对于<dataHost>
标签,它里面重要的参数列举如下:
balance指的负载均衡类型,目前的取值有4种:
- balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
- balance=”1”,全部的readHost与stand bywriteHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
- balance=”2”,所有读操作都随机的在writeHost、readhost上分发。
- balance=”3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
注意:balance=3只在1.4及其以后版本有,1.3没有。writeType属性:
1.writeType=”0”,所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties.
2.writeType=”1”,所有写操作都随机地发送到配置的writeHost,1.5以后废弃不推荐。switchType指的是切换的模式,目前的取值也有4种:
- switchType=’-1’ 表示不自动切换
- switchType=’1’ 默认值,表示自动切换
- switchType=’2’ 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
- switchType=’3’基于MySQLgalary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%’。
5、启动
当然我们可以进入到log4j2的配置文件将日志级别改为debug,这样我们就可以看到详细的执行过程啦。
cd /usr/local/mycat/bin/
./mycat start
这里你可能会发现启动不了,看日志
vi /usr/local/mycat/logs/wrapper.log
会看到如下错误;
ERROR | wrapper | 2020/06/16 06:08:58 | Startup failed: Timed out waiting for a signal from the JVM.
ERROR | wrapper | 2020/06/16 06:08:58 | JVM did not exit on request, terminated
INFO | wrapper | 2020/06/16 06:08:58 | JVM exited on its own while waiting to kill the application.
STATUS | wrapper | 2020/06/16 06:08:58 | JVM exited in response to signal SIGKILL (9).
超时?好吧去修改配置文件。
vi /usr/local/mycat/conf/wrapper.conf
最后加入:
wrapper.startup.timeout=300
保存,再启动,终于可以了,用navicat测试,发现正常连接。
初次搭建就到这里了,后面会有详细的笔记记录以及怎么用springboot测试!