一、MySQL读写分离原理
读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。
二、读写分离实践
绝大多数的企业的应用场景对于数据库来说都是读多写少,比如微博,明星发一条微 博,上千万人读。所以为了分担数据库压力,做负载均衡,首先考虑到的就是读写分离,读写分离基于上面实现的主从复制,使用主库作为写库,从库为读库,提高数据库性能,提高IO性能。
三、读写分离的实现方式
为了实现读写分离,出现了很多解决方案,其中比较流行的是采用中间件做为 Proxy,保持应用层代码不随数据库的变动而发生变化,这里包括Amoeba、Atlas、 Cobar、Mycat、MySQL Proxy等,而Mycat是目前开源的数据库中间件中比较成熟的解决方案。
四、安装JDK
① 解压缩包
tar -xzvf jdk-8u161-linux-x64.tar.gz -C /usr/local/java
②编辑/etc/profile
vim /etc/profile
使用source命令使修改即时生效,无需重启服务器:
source /etc/profile
③ 查看是否安装成功,有版本号就是安装成功了;
java -version
五、安装Mycat
MyCat的安装部署 Mycat的安装其实只要解压压缩包就可以,非常简单。
【安装完成后,目录如下】:
【配置】
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:
【 MyCat的架构 】
Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服 务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。
六、配置Mycat
① server.xml的配置
将最后删除和修改成下面的样子
【各配置参数含义】
② schema.xml的配置
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="nebula" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/> <dataNode name="dn1" dataHost="auth" database="mytest" /> <dataHost name="auth" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM" url="192.168.198.142:3306" user="root" password="Nebula@123"> <readHost host="hostS" url="192.168.198.148:3306" user="root" password="Nebula@123" /> </writeHost> </dataHost> </mycat:schema>
【参数配置说明】
【下面是关于每个节点的配置说明】
七、给从机创建只读用户
读库的用户test是添加的mysql用户,只具有读权限的用户:
主机具有写权限,从机只具有读权限;
create user 'test'@'%' identified with mysql_native_password by 'Nebula@123'; GRANT select ON *.* TO 'test'; flush privileges;
八、启动mycat
① Mycat的启动也非常简单,进入到mycat下的bin目录下:
#启动 ./mycat start(后台启动) ./mycat console(前台启动) #停止 ./mycat stop #重启 ./mycat restart
【如果在启动时发现异常,在logs目录中查看日志】
- wrapper.log 为程序启动的日志,启动时的问题看这个
- mycat.log 为脚本执行时的日志,SQL脚本执行报错后的具体错误内容,查看这个文件。
- mycat.log是最新的错误日志,历史日志会根据时间生成目录保存。
启动正常的结果如下:
【mycat启动后,执行命令不成功,可能实际上配置有错误,导致后面的命令没有很好 的执行。】
mycat成功启动会有高亮显示的两个端口
8066是业务端口,可以对mycat连接的虚拟数据库进行增删改查;
9066是管理端口,查看心跳等;
九、验证读写分离服务
① 连接mycat的9066端口查看心跳
② 右击mycat,点击命令行界面可以输入sql语句
③ 输入命令查看心跳是否正常,RS_CODE为1是正常
show @@heartbeat;
可以看到hostM拥有W写权限,hostS拥有R读权限
④ 使用navicat连接mycat,如下图所示,注意端口为8066。
连接成功则会出现如下的绿色,否则请检查:
④ 测试读,有两种思路来验证:
1)关闭了主从复制
- 在从数据中关闭slave(即关闭主从复制);
- 然后在mycat管理端中往某个表中插入 一条数据;
- 再使用select查询该表,可以看到查询出来的结果中并没有新的那条数据。
(解释:因为关闭了主从复制,插入新数据在主库进行,而查询的是从库,为此 不会查询到新插入的数据);
#关闭从机
stop slave; show slave status\G;
#原本主从机的table_2表中均没有数据;
#在mycat上给table_2插入一条数据,然后查看表
【我们发现明明插入成功了但是查看表却没有数据,这时因为我们关闭了主从连接,数据不会从主机同步到从机的,而从机具有读权限,主机具有写权限,相当于我们在mycat上查看数据库是查看的从机,写入数据是给主机写数据,所以查看table_2表是没有数据的,因为查看的是从机的table_2表】
#在mysql上查看table_2表,发现数据插入成功;
#在mysql上查看table_2表,发现是没有数据;
2)不关闭slave的主从复制
不关闭slave的主从复制,直接在从库中修改表中的某个值,而主库的值不变,直 接使用查询表数据时会发现查询出来的结果是从库表中的数据;
#开启slave的主从复制
#这里给在从库上给table_2插入一条数据
#查看主库的table_2表,发现主库的数据没变
#在mycat上查询,发现查询的是从库的table_2表的数据;