一、mysql配置主从复制
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
我这里是一主一从配置
配置主库 (master)
在mysql的my.ini配置文件添加以下信息
server-id = 200 binlog-do-db=XXX log-bin=mysql-bin
重启数据库
停止mysql: net stop mysql2
启动mysql: net start mysql2
(这里需要注意 我用mysql2 是因为我安装了两个mysql 我使用的是mysql2)
创建授权复制用户
grant replication slave on *.* to ‘用户名‘@‘192.168.1.%‘ identified by ‘密码‘; flush privileges; show master status
配置从库
从库的my.ini配置文件添加以下信息
server_id=185 relay-log-index=slave-relay-bin.index relay-log=slave-relay-bin slave-skip-errors=all
配置完成重启从库mysql。
change master to配置和改变slave服务器用于连接master服务器的参数,
以便slave服务器读取master服务器的binlog及slave服务器的relay log。
同时也更新master info及relay log info信息库。
change master to master_host=‘192.168.1.1‘, master_user=‘主库账号‘, master_password=‘主库密码‘, master_port=3307, master_log_file=‘.000001‘, master_log_pos=154;
配置完成后启动slave
启动命名 start slave;
图上两个为Yes就大工告成。
二、配置myCat
mycat是一个数据库中间件,也可以理解为是数据库代理。在架构体系中是位于数据库和应用层之间的一个组件。
下载完解压即可
读写分离只要配置server和schema就够了
打开conf找到以下两个文件
server配置连接MyCat的用户及权限
schemas里是逻辑库名 并非真实数据库名与schema的schema保持一致
schema配置
balance类型
0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
1:全部的readHost与stand by writeHost参与select语句的负载均衡,
2:所有读操作都随机在writeHost、readHost上分发
3:所有读请求随机分发到writeHost对应的readHost执行,writeHost不负担读压力
<schema name="DB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"> <!-- auto sharding by id (long) --> <!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置--> <!--fetchStoreNodeByJdbc 启用ER表使用JDBC方式获取DataNode--> </schema> <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="localhost1" database="真实数据库名" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <!-- <heartbeat>show slave status</heartbeat>--> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <!-- 主库 增删改 --> <writeHost host="hostM1" url="192.168.1.XXX:3307" user="root" password="123456"> <!-- 从库 --> <readHost host="hostS1" url="192.168.1.XXX:3307" user="root" password="123456"></readHost> </writeHost> <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --> </dataHost>
三、测试主从复制读写分离
127是我本地的mysql 也就是主库(master),185是从库(slave)
我在主库创建了一个demo表 ,然后复制过去从库了 刷新以下myCat-185的textedb就能看到。
在主从插入一条数据。
接着刷新从库,从库已经复制了主库的信息了
连接mycat进行测试 3066是我mycat的端口
在mycat插入一条数据
刷新127和185的数据库就能看到 都已经有数据了。
查询是不会查主库的 ,测试一下在从库添加一条数据。
这条数据是插在185数据库上的 ,在127数据库是没有的 使用mycat测试