公司项目要做数据库读写分离,直接代码撸读写分离工作量太庞大了,还是考虑用mycat中间件来做。
下载
mycat安装目录
| 目录 | 说明 |
|---|---|
| bin | mycat命令,启动、重启、停止等 |
| catlet | catlet为Mycat的一个扩展功能 |
| conf | 配置文件,核心 |
| lib | 引用jar包 |
| logs | 日志 |
启动
- 运行 bin目录 下的startup_nowrap.bat
#连接mycat
mysql -uroot -p123456 -h127.0.0.1 -P8066
#查看数据库
mysql>show databases;
#切换数据库
mysql>use travelrecord
#查看数据表
mysql>show tables;
配置本地数据库
- schema.xml
# 配置数据库 逻辑表
<schema name="db1" checkSQLschema="true" sqlMaxLimit="100">
<table name="app_user" dataNode="dn1" />
</schema>
# 配置dataNode 数据库名称
<dataNode name="dn1" dataHost="dn119" database="db1" />
# 配置 数据库实例
<dataHost name="dn119" maxCon="1000" minCon="10" balance="0" dbType="mysql"
dbDriver="jdbc">
<heartbeat>select user()</heartbeat>
<writeHost host="mysql119"
url="jdbc:mysql://localhost:3306" user="root" password="1130">
</writeHost>
</dataHost>
- server.xml
# 配置mycat db1的schemas的连接账号
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">db1</property>
</user>
- 测试结果
use db1
show tables;
select * from app_user;
配置读写分离
- 修改 schema.xml
负载均衡类型,目前的取值有 3 种: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 没有。
<dataHost name="dn119" maxCon="1000" minCon="10" balance="3" dbType="mysql"
dbDriver="jdbc">
<heartbeat>select user()</heartbeat>
<writeHost host="hostWrite1"
url="jdbc:mysql://localhost:3306" user="root" password="1130">
<readHost host="hostRead1" url="jdbc:mysql://192.168.0.133:3306" user="root" password="123456" />
</writeHost>
</dataHost>
- 测试结果
#读
mysql>select * from app_user where user_id='10000255';
#写
mysql>update app_user set user_name='testtt3' where user_id='10000255';
核对对应数据表 读库(133)数据没改 写库(localhost)数据已经修改
- 配置bin log 复制
- 主库(localhost)
# my.cnf 调整配置 需要重启
server-id=1
log-bin=mysql-bin
binlog-do-db=hjlottery #需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了ignore忽略的库)
binlog-ignore-db = mysql,information_schema
sync_binlog = 1
# 登录mysql,授予slave从机复制权限
mysql>grant replication slave,replication client on *.* to slave@'192.168.0.215' identified by "slave@123";
- 从库(192.168.0.215)
# my.cnf 调整配置 需要重启
server-id=2
log-bin=mysql-bin
replicate-do-db=hjlottery #需要同步的数据库名。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。
replicate-ignore-db=mysql
slave-skip-errors = all
# 登录slave节点的mysql,进行主从同步设置
mysql>stop slave;
mysql>change master to master_host='192.168.0.119',master_user='slave',master_password='slave@123',master_log_file='mysql-bin.000001',master_log_pos=1349;
mysql>start slave;
mysql>show slave status \G;
#然后把mycat中的读数据库实例改成 从库 再次查询效果
#读
mysql>select * from app_user where user_id='10000255';
#写
mysql>update app_user set user_name='testtt4' where user_id='10000255';
参考:mycat读写分离