先做mysql主从复制
不提了
部署mycat
一、安装mycat
1.1 、从Mycat官网下载安装包:http://dl.mycat.org.cn/1.6.7.1/
1.2、把下载好的安装包上传解压
tar -zxvf Mycat-server-1.6.7.4-test-20191022170541-linux.tar.gz
[root@localhost mycat]# ll
总用量 12
drwxr-xr-x. 2 root root 190 8月 25 09:33 bin
drwxrwxrwx. 2 root root 6 6月 24 2019 catlet
drwxrwxrwx. 4 root root 4096 8月 25 15:18 conf
drwxr-xr-x. 2 root root 4096 8月 25 09:33 lib
drwxrwxrwx. 3 root root 92 8月 25 13:57 logs
drwxr-xr-x. 2 root root 6 8月 25 11:27 tmlogs
-rwxrwxrwx. 1 root root 227 6月 27 2019 version.txt
二、配置mycat
2.1、配置server.xml
cd mycat/conf
vim server.xml
更改以下配置
<!-- 全局SQL防火墙设置 -->
<!--白名单可以使用通配符%或着*-->
<!--例如<host host="127.0.0.*" user="root"/>-->
<!--例如<host host="127.0.*" user="root"/>-->
<!--例如<host host="127.*" user="root"/>-->
<!--例如<host host="1*7.*" user="root"/>-->
<!--这些配置情况下对于127.0.0.1都能以root账户登录-->
<firewall>
<whitehost>
<host host="127.0.0.1" user="用户3,用户1,用户2"/>
<host host="ip" user="用户1,用户2"/>
<host host="ip" user="用户1,用户2"/>
<host host="ip" user="用户3,用户1"/>
<host host="ip" user="用户3,用户1"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
<!-- <user name="dev_sa" defaultAccount="true">
<property name="password">密码</property>
<property name="schemas">自定义库名</property>
-->
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
<!--
</user>
-->
<user name="用户3">
<property name="password">密码</property>
<property name="schemas">自定义库名1</property>
<property name="readOnly">true</property>
</user>
<user name="用户1">
<property name="password">密码</property>
<property name="schemas">自定义库名</property>
<!-- 表级 DML 权限设置 -->
<!-- dml权限顺序为:insert(新增),update(修改),select(查询),delete(删除), 1111,0为禁止权限,1为开启权限。下面配置的表都禁止删除-->
<privileges check="true">
<schema name="自定义库名" dml="0000" >
<table name="表名1" dml="1110"></table>
<table name="表名2" dml="1110"></table>
<table name="表名3" dml="1110"></table>
<table name="表名4" dml="1110"></table>
<table name="表名5" dml="1110"></table>
</schema>
</privileges>
</user>
<user name="用户2">
<property name="password">密码</property>
<property name="schemas">自定义库名1,自定义库名2,自定义库名3</property>
</user>
需跟schema.xml里面的schema标签的name对应,如果需要配置多个schema,可以用,隔开。我们将schemas设置成自定义库名.
2.2、配置schema.xml
vim schema.xml
更改以下配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="自定义库名1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="自定义库名2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
<schema name="自定义库名3" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="自定义库名1" />
<dataNode name="dn2" dataHost="localhost1" database="自定义库名2" />
<dataNode name="dn3" dataHost="localhost1" database="自定义库名3" />
<!-- balance="1"表示读写分离。writeType="0"代表所有写操作发送到配置的第一个 writeHost。switchType="1"代表自动切换 -->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 心跳检测 -->
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<!-- 读写分离 -->
<writeHost host="hostM1" url="主库ip:端口号" user="mycat连接mysql的用户名"
password="密码">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="从库ip:端口号" user="mycat连接mysql的用户名" password="密码" />
</writeHost>
<!-- 主从切换 -->
<writeHost host="hostM2" url="从库ip:端口号" user="mycat_app"
password="密码">
</writeHost>
<!-- 当主库宕机时,从库充当主库,进行读写操作 -->
</dataHost>
</mycat:schema>
2.3、schema.xml 注意事项
schema.xml文件中有三点需要注意:balance="1",writeType="0" ,switchType="1"
schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:
balance="0": 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上。
balance="1": 读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与 select语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select语句的负载均衡
balance="2": 读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、 readhost 上分发。
balance="3": 读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性,负载均衡类型,目前的取值有 3 种
writeType="0" 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
writeType="1"所有写操作都随机的发送到配置的 writeHost。
writeType="2"没实现。
对于事务内的SQL默认走写节点
以 /*balance*/ 开头,可以指定SQL使用特定负载均衡方案。例如在大环境开启读写分离的情况下,特定强一致性的SQL查询需求;slaveThreshold:近似的主从延迟时间(秒)Seconds_Behind_Master < slaveThreshold ,读请求才会分发到该Slave,确保读到的数据相对较新。schema.xml中的writeType的取值决定了负载均衡对写操作的处理:
writeType="0":所有的写操作都发送到配置文件中的第一个write host。(第一个write host故障切换到第二个后,即使之后修复了仍然维持第二个为写库)。推荐取0值,不建议修改.
主从切换(双主failover):switchType 属性
如果细心观察schem.xml文件的话,会发现有一个参数:switchType,如下配置:<dataHost name="237_15" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 参数解读
switchType="-1": 不自动切换
switchType="1": 默认值,自动切换
switchType="2": 基于MySQL主从同步的状态来决定是否切换。需修改heartbeat语句(即心跳语句):show slave status
switchType="3": 基于Mysql Galera Cluster(集群多节点复制)的切换机制。需修改heartbeat语句(即心跳语句):show status like ‘wsrep%‘
dbType属性
指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库。例如:mongodb、oracle、spark等。
dbDriver属性指定连接后端数据库使用的
Driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。其他类型的数据库则需要使用JDBC驱动来支持。从1.6版本开始支持postgresql的native原始协议。如果使用JDBC的话需要将符合JDBC 4标准的驱动JAR包放到MYCAT\lib目录下,并检查驱动JAR包中包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的Driver类名,例如:com.mysql.jdbc.Driver。
2.4 其他配置文件作用
1、log4j2.xml
<asyncRoot level="debug" includeLocation="true">
将mycat的日志输出级别改完debug(默认是info级别),在conf/log4j2.xml里配置,然后去查询去添加数据在/logs/mycat.log日志文件里查看sql被路由到了哪个服务器上
2、dnindex.properties
[root@ecs-e209-0617611 conf]# cat dnindex.properties
#update
#Fri Aug 27 12:00:39 CST 2021
localhost1=0
该配置文件下的内容为当前‘写操作‘使用的是schema.xml配置文件中的第几个writeHost。0为第一个。本配置中,如果localhost1=1,那么。写操作使用的是从库。主库可能挂了。
3、wrapper.log
启动mycat失败,报错日志。/mycat/logs/wrapper.log
三、Mycat服务启动
[root@Mycat-node ~]# cd /data/mycat/bin/
[root@Mycat-node bin]#
[root@Mycat-node bin]# ./mycat start #开启
[root@Mycat-node bin]# ./mycat stop #关闭
[root@Mycat-node bin]# ./mycat restart #重启
[root@Mycat-node bin]# ./mycat status #查看启动状态
[root@Mycat-node bin]# ./mycat console #前台运行
[root@Mycat-node bin]# ./mycat pause #暂停
mycat启动后,执行命令不成功,可能实际上配置有错误,导致后面的命令没有很好的执行。``如果在启动时发现异常,在logs目录中查看日志。
[root@Mycat-node ~]# cd /data/mycat/logs/
[root@Mycat-node logs]# ls
2018-07 mycat.log mycat.pid wrapper.log
- wrapper.log 为程序启动的日志,启动时的问题看这个
- mycat.log 为脚本执行时的日志,SQL脚本执行报错后的具体错误内容,查看这个文件。mycat.log是最新的错误日志,历史日志会根据时间生成目录保存。
mycat端口号:8066
四、动态加载配置文件
1. 登上mycat所在机器
2. mysql -u用户名 -p密码 -P9066 -h192.168.0.1
3. 执行命令
会加载schema.xml配置的调整。
mysql>reload @@config;
刷新全部配置
mysql>reload @@config_all;