linux 下 mysql读写分离
环境要求 liunx 环境
一,安装 mysql 5.6 ,配置主从
http://note.youdao.com/noteshare?id=d807217581990ca42dfd47e562953b0d&sub=D017A68A83D240E4B6C2D0A93A38138C
二,安装jdk 1.7 并在wrapper.conf中配置java位置
https://www.cnblogs.com/Dylansuns/p/6974272.html
在mycat/conf/wrapper.conf 下增加:
wrapper.java.command=java安装目录/bin/java
例如:wrapper.java.command=/home/hadoop/software/jdk1.8.0_181/bin/java
三,安装mycat 1.6
地址1:
链接:https://pan.baidu.com/s/1qsjEWrNLMcyJYWMborSRHw
提取码:6z2j
地址2
https://github.com/MyCATApache/Mycat-download
参考:https://blog.csdn.net/zxgmlcj/article/details/78396426
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
四,配置 hosts文件
修改hosts文件,绑定主机名
最后一行加 172.16.30.151 server1
# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.30.151 server1
五,mycat的日志
mycat 启动日志 : log下的 wrapper.log
mycat 的运行日志 : log下的 mycat.log
mycat 日志级别 修改 conf 下的 log4j2.xml
调试的时候改成debug 模式以方便看调用的是哪个库
(生产服务器日志级别记得一定要调低)
六,mycat常用命令 https://www.cnblogs.com/parryyang/p/5606071.html
启动 与停用
进入 /mycat/bin 下
启动: ./mycat start 停用:./mycat stop
七 , 读写分离配置
两台服务器
172.16.30.151 主 写
172.16.30.153 从 读
配置 1 schema.xml
select user()
八,数据库连接配置
配置完server.xml 后在数据库链接配置文件中配置
jdbc.url=jdbc:mysql://172.16.30.151:8066/yuanYang?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
jdbc.username=crm_yuan_yang_user
jdbc.password=MyComm2016
//(mycat 默认的端口号为 8066)
八,异常汇总
(1)Mycat1.6启动报NumberFormatException解决方案
解决方案:off heap for merge/order/group/limit 1开启 0关闭 --->修改配置文件值为: 0
(2)mycat启动报Unable to start JVM: No such file or directory
解决方法:原因可能是JVM参数没有配置或者配置错误
处理方案:
在mycat/conf/wrapper.conf 下增加:
wrapper.java.command=java安装目录/bin/java
例如:wrapper.java.command=/home/hadoop/software/jdk1.8.0_181/bin/java
(3)mycat 启动失败 The specified size exceeds the maximum representable size JVM exited while loading the a
解决办法:#最大内存不足Xmx4G,设置相关启动的配置文件
vi /usr/local/mycat/conf/wrapper.conf
wrapper.java.additional.10=-Xmx4G
wrapper.java.additional.11=-Xms1G
改为:
wrapper.java.additional.10=-Xmx512M
wrapper.java.additional.11=-Xms64M
再次启动,正常:
(4)mycat启动报错:JVM exited while loading the application.根据报错信息,怀疑主机名没有绑定,绑定主机名后重启就行了
上文有说到
(5) 启动成后但 代码不是从 153 读服务器 里读的
关闭事务:
事务内部的一切操作都会走写节点,所以读
操作不要加事务,如果读延时较大,使用根据主从延时的读写分离
service 层 的读方法前加 @Transactional(propagation=Propagation.NOT_SUPPORTED)
例如:
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public OaNotify get(String id) {
OaNotify entity = dao.get(id);
return entity;
}
(6)批量更新插入时sql 长度不能够太大 没用mycat 之前我5000条更新成功 ,用了之后失败,改到2000条才 成功,
修改相关配置 maxStringLiteralLength ,processorBufferLocalPercent ,processorBufferPool 的大小都没成功 ,
如果哪位大神知道该怎么做请留言,感激不尽
(7)读写分离造成脏读的问题,就是A库写,B库读,A库写完再同步到B库中有个很小的时间差,如果A写完立马读B,B中的数据还是旧数据,没从A同步过来
解决方案查看下面链接 http://www.cnblogs.com/beyondbit/p/6879949.html
mysql 升级到 5.7版本有并行复制的机制,同时写入A和B ,彻底解决此问题,https://www.cnblogs.com/langdashu/p/6125621.html 可我们生产用的是5.6 想哭的感觉............
(8)生产运行一段时间报sql错误 :Cause: java.sql.SQLException: Got error 28 from storage engine
df -h 查看磁盘占用情况,
发现 /dev/sda3占用了100%,
那么我们du -s -h ./*看下目录的占用情况 ,
发现 wrapper.log 360多G我的天 ,干掉这日志文件之后就恢复了,
因为有tomcat的日志这个mycat日志个人感觉关掉就行,调试的时候看一下,生产上没必要
进入mycat/conf vim wrapper.log
找到 loglevel全部改为 NONE ,有三处
wrapper.console.loglevel=NONE
wrapper.logfile.loglevel=NONE
wrapper.syslog.loglevel=NONE
然后重启就关掉了 不是改为 off ,是 NONE和 log4j 的日志级别不一样
https://blog.csdn.net/d6619309/article/details/73740146
(9)mycat调用带输出参数的存储过程:
https://blog.csdn.net/zhaofuqiangmycomm/article/details/88182200