linux 下 mysql读写分离 以及跳坑说明

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaofuqiangmycomm/article/details/86482251

linux 下 mysql读写分离

环境要求 liunx 环境

安装 mysql 5.6 ,配置主从

读写分离配置:

http://note.youdao.com/noteshare?id=d807217581990ca42dfd47e562953b0d&sub=D017A68A83D240E4B6C2D0A93A38138C

安装jdk 1.7

https://www.cnblogs.com/Dylansuns/p/6974272.html

安装mycat 1.6

https://blog.csdn.net/zxgmlcj/article/details/78396426

扫描二维码关注公众号,回复: 4921539 查看本文章

配置 hosts文件,绑定主机名 下文配置异常中 有

mycat 启动日志 : log下的 wrapper.log

mycat 的运行日志 : log下的 mycat.log

mycat 日志级别 修改 调试的时候改成debug 模式以方便看调用的是哪个库

<asyncRoot level="debug" includeLocation="true">

两台服务器

172.16.30.151 主 写

172.16.30.153 从 读

配置 1 schema.xml

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">



<!-- <schema name="JJLCRMDB" checkSQLschema="false" sqlMaxLimit="100"> </schema>

逻辑库配置 DB1,DB2是逻辑库并不是真的数据库-->

<schema name="yuanYang" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>

<!-- <schema name="DB2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"/> -->

<!-- 表分片配置在这些 -->

<!--</schema> -->

<!-- 节点配置 db1,db2才是真正的数据库 -->

<dataNode name="dn1" dataHost="host01" database="crm_yuan_yang" />

<!-- <dataNode name="dn2" dataHost="host01" database="crm_jjl" /> -->

<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />

<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />

<dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />

<dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->



<dataHost name="host01" maxCon="1000" minCon="10" balance="3"

writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">

<heartbeat>select user()</heartbeat>

<!-- can have multi write hosts -->

<writeHost host="hostM1" url="172.16.30.151:3306" user="mycommcrm" password="MyComm2016">

<!-- can have multi read hosts -->

<readHost host="hostS1" url="172.16.30.153:3306" user="mycommcrm" password="MyComm2016" />

</writeHost>

<!--主故障,顶替写节点,主正常是分担读压力-->

<writeHost host="hostS2" url="172.16.30.153:3306" user="mycommcrm" password="MyComm2016"></writeHost>

</dataHost>

</mycat:schema>

<!-- 这里面,有两个参数需要注意,balance和 switchType。

其中,balance指的负载均衡类型,目前的取值有4种:

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不负担读压力

switchType指的是切换的模式,目前的取值也有4种:

1. switchType='-1' 表示不自动切换

2. switchType='1' 默认值,表示自动切换

3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status

4. switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。

因此,该配置文件中的balance="1"意味着作为stand by writeHost的hostS1和hostS2将参与select语句的负载均衡,这就实现了主从的读写分离,switchType='-1'意味着当主挂掉的时候,不进行自动切换,即hostS1和hostS2并不会被提升为主,仍只提供读的功能。这就避免了将数据写进slave的可能性,毕竟,单纯的MySQL主从集群并不允许将数据读进slave中,除非配置的是双master。-->

配置2 server.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: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">165535</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>

<!--

off heap for merge/order/group/limit 1开启 0关闭 为 1启不了

-->

<property name="useOffHeapForMerge">0</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>

-->

<!-- 读写用户 用户名 crm_yuan_yang_user密码 MyComm2016 -->

<user name="crm_yuan_yang_user">

<property name="password">MyComm2016</property>

<property name="schemas">yuanYang</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 密码 MyComm2016 -->

<user name="user">

<property name="password">MyComm2016</property>

<property name="schemas">yuanYang</property>

<property name="readOnly">true</property>

</user>



</mycat:server>

3,数据库连接配置

和msql连接配置类似注意mycat 默认的端口号为 8066

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

4,异常汇总

(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.

根据报错信息,怀疑主机名没有绑定

修改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服务

(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;

}

猜你喜欢

转载自blog.csdn.net/zhaofuqiangmycomm/article/details/86482251
今日推荐