> 文章列表 > 【Linux】MySQL高可用之Mysql读写分离实践

【Linux】MySQL高可用之Mysql读写分离实践

【Linux】MySQL高可用之Mysql读写分离实践

一、MySQL读写分离原理

读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。

【Linux】MySQL高可用之Mysql读写分离实践

 二、读写分离实践

绝大多数的企业的应用场景对于数据库来说都是读多写少,比如微博,明星发一条微 博,上千万人读。所以为了分担数据库压力,做负载均衡,首先考虑到的就是读写分离,读写分离基于上面实现的主从复制,使用主库作为写库,从库为读库,提高数据库性能,提高IO性能。

三、读写分离的实现方式

为了实现读写分离,出现了很多解决方案,其中比较流行的是采用中间件做为 Proxy,保持应用层代码不随数据库的变动而发生变化,这里包括Amoeba、Atlas、 Cobar、Mycat、MySQL Proxy等,而Mycat是目前开源的数据库中间件中比较成熟的解决方案。

四、安装JDK

① 解压缩包

tar -xzvf jdk-8u161-linux-x64.tar.gz -C /usr/local/java

【Linux】MySQL高可用之Mysql读写分离实践

②编辑/etc/profile

vim /etc/profile

【Linux】MySQL高可用之Mysql读写分离实践

 使用source命令使修改即时生效,无需重启服务器:

source /etc/profile

 ③ 查看是否安装成功,有版本号就是安装成功了;

java -version

【Linux】MySQL高可用之Mysql读写分离实践

五、安装Mycat

MyCat的安装部署 Mycat的安装其实只要解压压缩包就可以,非常简单。

【安装完成后,目录如下】: 

【Linux】MySQL高可用之Mysql读写分离实践

【配置】

Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:

【Linux】MySQL高可用之Mysql读写分离实践

【 MyCat的架构 】

Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服 务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。

六、配置Mycat

① server.xml的配置

将最后删除和修改成下面的样子

【Linux】MySQL高可用之Mysql读写分离实践

 【各配置参数含义】

【Linux】MySQL高可用之Mysql读写分离实践

② 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>

【Linux】MySQL高可用之Mysql读写分离实践

 【参数配置说明】

【Linux】MySQL高可用之Mysql读写分离实践

【下面是关于每个节点的配置说明】

【Linux】MySQL高可用之Mysql读写分离实践

【Linux】MySQL高可用之Mysql读写分离实践

【Linux】MySQL高可用之Mysql读写分离实践【Linux】MySQL高可用之Mysql读写分离实践

 

 

 

 

七、给从机创建只读用户

读库的用户test是添加的mysql用户,只具有读权限的用户:

主机具有写权限,从机只具有读权限;

create user 'test'@'%' identified with mysql_native_password by
'Nebula@123';
GRANT select ON *.* TO 'test';
flush privileges;

【Linux】MySQL高可用之Mysql读写分离实践

八、启动mycat

① Mycat的启动也非常简单,进入到mycat下的bin目录下:

#启动
./mycat start(后台启动) ./mycat console(前台启动)#停止
./mycat stop#重启
./mycat restart

【如果在启动时发现异常,在logs目录中查看日志】

  • wrapper.log 为程序启动的日志,启动时的问题看这个
  • mycat.log 为脚本执行时的日志,SQL脚本执行报错后的具体错误内容,查看这个文件。
  • mycat.log是最新的错误日志,历史日志会根据时间生成目录保存。

启动正常的结果如下:

【Linux】MySQL高可用之Mysql读写分离实践

 【mycat启动后,执行命令不成功,可能实际上配置有错误,导致后面的命令没有很好 的执行。】


mycat成功启动会有高亮显示的两个端口

【Linux】MySQL高可用之Mysql读写分离实践

8066是业务端口,可以对mycat连接的虚拟数据库进行增删改查;

9066是管理端口,查看心跳等;

九、验证读写分离服务

① 连接mycat的9066端口查看心跳

【Linux】MySQL高可用之Mysql读写分离实践

 ② 右击mycat,点击命令行界面可以输入sql语句

【Linux】MySQL高可用之Mysql读写分离实践

③ 输入命令查看心跳是否正常,RS_CODE为1是正常

show @@heartbeat;

【Linux】MySQL高可用之Mysql读写分离实践

 可以看到hostM拥有W写权限,hostS拥有R读权限

 ④ 使用navicat连接mycat,如下图所示,注意端口为8066。

【Linux】MySQL高可用之Mysql读写分离实践

 连接成功则会出现如下的绿色,否则请检查:

【Linux】MySQL高可用之Mysql读写分离实践

④ 测试读,有两种思路来验证:

1)关闭了主从复制

  1. 在从数据中关闭slave(即关闭主从复制);
  2. 然后在mycat管理端中往某个表中插入 一条数据;
  3. 再使用select查询该表,可以看到查询出来的结果中并没有新的那条数据。

(解释:因为关闭了主从复制,插入新数据在主库进行,而查询的是从库,为此 不会查询到新插入的数据);

#关闭从机

stop slave;
show slave status\\G;

【Linux】MySQL高可用之Mysql读写分离实践

 #原本主从机的table_2表中均没有数据;

【Linux】MySQL高可用之Mysql读写分离实践【Linux】MySQL高可用之Mysql读写分离实践

#在mycat上给table_2插入一条数据,然后查看表

【我们发现明明插入成功了但是查看表却没有数据,这时因为我们关闭了主从连接,数据不会从主机同步到从机的,而从机具有读权限,主机具有写权限,相当于我们在mycat上查看数据库是查看的从机,写入数据是给主机写数据,所以查看table_2表是没有数据的,因为查看的是从机的table_2表】

【Linux】MySQL高可用之Mysql读写分离实践

 #在mysql上查看table_2表,发现数据插入成功;

【Linux】MySQL高可用之Mysql读写分离实践

  #在mysql上查看table_2表,发现是没有数据;

【Linux】MySQL高可用之Mysql读写分离实践

2)不关闭slave的主从复制

不关闭slave的主从复制,直接在从库中修改表中的某个值,而主库的值不变,直 接使用查询表数据时会发现查询出来的结果是从库表中的数据;

#开启slave的主从复制

【Linux】MySQL高可用之Mysql读写分离实践

#这里给在从库上给table_2插入一条数据

【Linux】MySQL高可用之Mysql读写分离实践

 #查看主库的table_2表,发现主库的数据没变

【Linux】MySQL高可用之Mysql读写分离实践

 #在mycat上查询,发现查询的是从库的table_2表的数据;

 【Linux】MySQL高可用之Mysql读写分离实践