天天看点

mycat学习(一) 使用mycat实现mysql读写分离

1.下载mycat源码

下载地址:https://github.com/MyCATApache/Mycat-Server,我下载的版本是1.7。

下载完成后使用eclipse导入工程,并刷好maven。

2.mysql配置主从同步参考:https://blog.csdn.net/u011943534/article/details/87868939

3.配置resources/server.xml

其中

user

表示mycat的用户名密码,

schemas

表示mycat逻辑库名称,

readOnly

表示此用户只读

<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	<system>   
		<property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	</system>
	
	<user name="root">
		<property name="password">123456</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>

</mycat:server>
           

4.配置schema.xml

schema

说明:

name

与server.xml中schemas一致

dataNode

该属性用于绑定逻辑库到某个具体的database上

dataNode

说明:

name

定义数据节点的名称

dataHost

定义该分片属于哪个数据库实例

database

实际数据库名称

dataHost

说明:

balance

0 不读写分离,1全部的readHost与standbywriteHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。2所有读操作都随机的在writeHost、readhost上分发。3所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力,注意balance=3只在1.4及其以后版本有,1.3没有。

writeType

0所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个

writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties。2所有写操作都随机的发送到配置的writeHost

switchType

-1表示不自动切换,1默认值,自动切换,2基于MySQL主从同步的状态决定是否切换

心跳语句为showslavestatus,3基于MySQLgalarycluster的切换机制(适合集群)

heatbeat

心跳的sql

writeHost

写的实际数据库配置

readHost

读的实际数据库配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
	</schema>
	
	<dataNode name="dn1" dataHost="localhost1" database="test" />
	
	<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="192.168.100.87:3306" user="root" password="ROOT_iscas123">
			<!-- can have multi read hosts -->
			<readHost host="hostS2" url="192.168.100.91:3306" user="root" password="ROOT_iscas123" />
		</writeHost>
		
	</dataHost>

</mycat:schema>
           

5.从

MycatStartup

类启动

6.测试连接

public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.100.88:8066/TESTDB", "root", "123456");
        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery("select name from test1");
        while (resultSet.next()) {
            System.out.println(resultSet.getString("name"));
        }
        resultSet.close();
        statement.close();
        conn.close();
    }
           

7.MYCAT日志报Unknown charsetIndex:255错误

index_to_charset.properties

在配置文件最后加入255=utf8mb4,重启服务即正常

继续阅读