mysql读写分离简单实现-win7

仅为测试,选择在一台机器上装两个tomcat,没有使用常规的两台或多台服务器,读写分离在之前的demo项目中也会结合进去。

一、复制出第二个mysql数据库

1,将你的mysql文件夹直接拷贝到另一个目录。如我的拷贝到了D:\work\mysql\MySQL5

2,修改my.ini文件,修改以下参数:

两个位置需要重新设置端口:

port=3307

路径配置,如:

basedir="D:/work/mysql/MySQL5"

datadir="D:/work/mysql/MySQL5/data"

3,将mysql配置到环境变量

4,在MySQL5路径下shift+右击打开cmd,输入如下:

mysqld --install mysql_slave --defaults-file="D:\work\mysql\MySQL5\my.ini"

5,右击计算机,去“服务”里打开mysql_slave服务,如果报1067错误,查看属性的路径是否正确

6,属性的路径不正确则去注册表修改,home+r,输入regedit,打开注册表,根据路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\...  修改路径,可以仿照原先的mysql路径写法

7,再次去“服务”里启动即可。

(注:win系统的如果是5.7以上的mysql版本,data文件夹默认在 C:\ProgramData\MySQL下,其中ProgramData是隐藏文件夹

二、修改mysql配置

1,主库的my.ini末尾添加如下:

#主为1,如果需要增加Slave库则,此id往后顺延;  
server-id = 1
#要同步的数据库   
binlog-do-db=community_ms
#要生成的二进制日记文件名称 
log-bin=mysql-bin 

第二行配置可以省略,则所有库同步,这里笔者只指定了需要同步的库

2,从库my.ini末尾添加如下:

#主为1,如果需要增加Slave库则,此id往后顺延;  
server-id = 10
#要同步的数据库   
replicate-do-db=community_ms
#要生成的二进制日记文件名称 
log-bin=mysql-bin 

注:这里主要是标记从库的服务id,不能和主库一样,添加时请先查询全部内容,看配置文件是否默认有配置server-id,有则直接修改,没有则添加。

3,打开主库添加用户,并赋予对应权限:

create user 'forslave'@'127.0.0.1' identified by '123456';
GRANT REPLICATION SLAVE,super,reload,file ON *.* TO 'forslave'@'127.0.0.1';
或
grant replication slave,super,reload,file on *.* to [email protected] identified by '123456';  

注:授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";

4,在主库运行:

show master status;

记录File和Position的值。

5,把需要同步的数据库,从主库备份到从库。

6,打开从库,运行如下:

change master to master_host='127.0.0.1',
master_port=3306,
master_user='forslave',
master_password='123456',
master_log_file='mysql-bin.xxx',
master_log_pos=xxx;

注:file和pos即上面记录的值,若提示salve未停止,执行如下:

stop  slave;

7,执行完上诉的change后启动slave:

start slave;

8,查看是否配置成功:

show slave status;

若如下两个参数都为YES则表示两个库从属关系配置完成:


注:若后一个为NO,一般情况是slave没有启动。若前一个为NO一般是my.ini配置出错,或者执行以上命令时,没有按笔者指定的库。如change在主库执行,就会报id重复。若修改了my.ini请重启服务,使其生效。

配置成功后可以对主库执行insert操作,查看插入后否从库也一样新增了数据。

9,其他常用命令如下:

查看服务id:show variables like 'server_id'; 

临时设置服务id:set global server_id=2;

查看mysql库用户:SELECT User, Host, Password FROM mysql.user;

三、读写分离方式

方式一,在项目内,规定sql的写法,例如get,find,select,list开头的方法查询指定的读库,其他的方法走写库。

这种方式实现最简单,但重构性不好,如果修改库得再修改项目代码。

方式二,使用中间件,笔者选择的是mycat,简单介绍请移步笔者的mycat文章,其作用是替用户根据某个路由规则来使用不同的库(不同主机上)。

1,下载mycat:http://dl.mycat.io/1.6.5/

2,解压到非中文路径下

3,配置mycat\conf下的schema.xml,如下:

<?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">
		<table name="t_article" dataNode="dn1" rule="rule1" />
		<table name="t_comment" dataNode="dn1" rule="rule1" />
		<table name="t_favorite_pages" dataNode="dn1" rule="rule1" />
		<table name="t_remind" dataNode="dn1" rule="rule1" />
		<table name="t_type" dataNode="dn1" rule="rule1" />
		<table name="t_users" dataNode="dn1" rule="rule1" />
	</schema>
	<dataNode name="dn1" dataHost="root1" database="community_ms" />

	<!--
		balance:负载均衡类型,目前的取值有 3 种..
			1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
			2. balance="1",当双主双从模式(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及其以后版本有.
		writeType:值为"0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties
		switchType:
			1 默认值,自动切换;
			2 基于 MySQL 主从同步的状态决定是否切换,心跳语句为 show slave status
			3 基于 MySQL galary cluster 的切换机制(适合集群),心跳语句为 show status like ‘wsrep%’.
		dbType:指定后端连接的数据库类型,目前支持二进制的mysq协议,还有其他使用JDBC连接的数据库。例如:mongodb、oracle、spark 等。
		dbDriver:指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。使用native的话,这个值执行的是二进制的mysql协议。其他类型的数据库则需要使用JDBC驱动来支持。
	-->
	<dataHost name="root1" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="123">
			 <readHost host="hostS1" url="127.0.0.1:3308" user="root" password="123" />
			 <readHost host="hostS2" url="127.0.0.1:3307" user="root" password="123456" />
		</writeHost>
	</dataHost>


</mycat:schema>

注:这里笔者没有要分表分库的意思,所有就只有一个分片,分表分库操作后续再单独记录。

4,启动mycat,双击mycat\bin下的startup_nowrap.bat

注:

mycat运行jdk最低要求是1.7;如果报jvm内存错误则修改startup_nowrap.bat,如下:

-Xms512M -Xmx1G

默认是1G和2G,做适当修改即可。

在使用jdk1.8时报错,则删除-XX:MaxPermSize=64M,因为在1.8时候这个属性已经被遗弃。

5,修改项目内连接,笔者配置如下:

<!-- 配置数据源 -->
	<bean id="dataSource"
		class="com.alibaba.druid.pool.DruidDataSource">
		<!--<property name="url" value="jdbc:mysql://localhost:3307/db_community?useUnicode=true&characterEncoding=UTF-8"/>-->
		<property name="url" value="jdbc:mysql://localhost:8066/TESTDB?useUnicode=true&characterEncoding=UTF-8"/>
		<property name="username" value="root"/>
		<property name="password" value="123456"/>
	</bean>

注:mycat默认端口是8066

6,启动项目,打开mycat的debug日志模式,对项目做操作,例如笔者的社区项目,查看主题详情,查看路由是否正确。

注:如果运行报错如下:

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: partition table, insert must provide ColumnList
意思是insert into没有指定列,即不能使用一下语法:
INSERT INTO 表名称 VALUES (值1, 值2,....)

需要使用:

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)




猜你喜欢

转载自blog.csdn.net/gcc_java/article/details/79917121