使用Mycat 作简单的读写分离html
本来使用的是amoeba作的读写分离,可是amoeba早已经中止了维护,有问题也没有办法解决,而且不支持双主多重模式.最近mycat又很是火热.以为用mycat替换现有的amoeba.java
舒适提示:mysql
配置mycat以前请作好准备工做,统一各个数据库的字符集.而且最好使用mysql5.6的版本进行配置.以避免觉得版本问题带来不少未知的麻烦!linux
mycat的官网网址sql
http://www.mycat.org.cn/数据库
我使用的是mycat的1.6的Linux安装包vim
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 服务器
#解压后放到/usr/local下 负载均衡
mv mycat /usr/localurl
检查是否已经配置好了java的环境变量
若是你还没用配置好,需先配置.
接下来修改mycat的配置文件
cd /usr/local/mycat/conf
配置文件很是多,若是只是简单配置在不一样的服务器上进行读写分离只须要配置两个文件
server.xml 和 schema.xml
找到这一段
</system>
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
这里配置了两个能够来链接的用户
用户1 test 密码test 给予了此用户TESTDB数据库的权限
用户2 user 密码user 给予了此用户TESTDB数据库的只读权限
注意
A : 这里的testdb 不必定是你数据库上的真实库名.能够任意指定.只要和接下来的schema.xml的配置文件中的库名统一便可
B:这里的配置的用户名和密码,是咱们 链接mycat的用户名和密码,和 schema.xml中配置的 链接真实mysql的用户名和密码 不必定同样
.由于咱们如今只作库的读写分离,没用分库 没用分表这些东西.
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="192.168.1.100:3306" user="root" password="asdf1@34">
<readHost host="hostS1" url="192.168.1.101:3306" user="root" password="asdf1@34" />
</writeHost>
<writeHost host="hostS1" url="192.168.1.101:3306" user="root"
password="asdf1@34"/>
</dataHost>
下载地址:
https://www.tapd.cn/22121161/documents/show/1122121161001000020
一, <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
这里TESTDB 就是咱们对外声称的咱们有数据库的名称 必须和server.xml中的用户指定的数据库名称一致
添加一个dataNode="dn1" 是指定了咱们这个库只在dn1上.没有进行分库
二, <dataNode name="dn1" dataHost="localhost1" database="realdb_test_name" />
这里只须要改database的名字 realdb_test_name 就是你真实数据库服务上的数据库名 .
根据你本身的数据库名进行修改.
三,<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
这里只须要配置四个地方 balance="1"与writeType="0" ,switchType=”1”
a. 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 不负担读压力,注意 balance=3 只在 1.4 及其之后版本有, 1.3 没有。
b. writeType 属性
负载均衡类型,目前的取值有 3 种:
1. writeType="0", 全部写操做发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
writeHost,从新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
2. writeType="1",全部写操做都随机的发送到配置的 writeHost。
3. writeType="2",没实现。
c. switchType 属性
-1:表示不启用主从切换;
1:为默认值,自动切换;心跳检测语句,通常为select user();
2:基于主从同步的状态,决定是否切换,与show slave status心跳对应;
3:基于多住galary集群切换,与show status like 'wsrep%'对应;
d. Seconds_Behind_Master主从复制时延,当Seconds_Behind_Master>slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到好久以前的旧数据
建议组合值:
balance="1" writeType="0" switchType="2"
四,
<writeHost host="hostM1" url="192.168.1.100:3306" user="root" password="asdf1@34">
<readHost host="hostS1" url="192.168.1.101:3306" user="root" password="asdf1@34" />
</writeHost>
这里是配置的咱们的两台读写服务器IP地址访问端口和 访问用户的用户名和密码
主要就是这两个配置文件,配置完成.们试试可否正常启动
cd /usr/local/mycat/bin
./mycat start
这里可使用Navicat for MySQL,来尝试链接一下,能链接成功.若是没有链接成功过,有错误的话会在/logs/mycat.log中去查看
1,记得给你的防火墙开端口默认的mycat端口是8066
2,若是你在链接数据库的时候日志文件中一直报错错
错误:
Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
这个时候估计是你的数据库的帐号和密码错误了.因此IP被锁
.首先须要去数据库执行flush hosts;命令清除 被锁死的IP
3,错误:
java.lang.IllegalArgumentException: Invalid DataSource:0
明显是连接后面的MYSQL有问题,可是MYSQL配置也没错,后来发现MYSQL新安装之后是不能用-h 127.0.0.1来登陆,只能sock登陆,因此登陆mysql后修改ROOT用户,update user set host = '%' where user = 'root'; ,重启服务后一切正常了
4,错误mycat.log中: Unknown charsetIndex:224
说明是字符集问题引发的数据库不能链接成功
vim index_to_charset.properties
编辑配置文件中 设置224的字符集
好比个人数据库中 224=utf8mb4
设置完成后再重启服务就能够了!