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

一、MySQL读写分离原理

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

dc9b57ef0dc84c8b8c41aa937adec381.png

 二、读写分离实践

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

三、读写分离的实现方式

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

四、安装JDK

① 解压缩包

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

b9d2a9ecb67648b9bbf6a4b107be3be5.png

②编辑/etc/profile

vim /etc/profile

2da5cbd210f04910bfe1e16c5941b15e.png

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

source /etc/profile

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

java -version

d04f9dc7cf2c469aabba882fdf4d9840.png

五、安装Mycat

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

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

8538d090f5434b4a9c70944188580183.png

【配置】

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

f1994f3f79b248a5ab0d51dc732d24bc.png

【 MyCat的架构 】

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

六、配置Mycat

① server.xml的配置

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

959b2eacbf82400e8c590b5a54c16f3c.png

 【各配置参数含义】

2fc3d327ffef4e96bbb4a92fc562cf8e.png

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

b12fd54439f247389b6ac45a891f8c9b.png

 【参数配置说明】

f293c237ee4346ae859731403bd6c91c.png

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

2104d9c1e2204926bf9dabbcdb1e88b5.png

3c4184bab11a49fd9e25bd7ccf71e055.png

830f8477d4594bb3b2394ed591806084.pnge071ee63c2764b80a1aab9d1546532f9.png

七、给从机创建只读用户

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

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

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

afcc5a98eb904cb09679ea63dec240d6.png

八、启动mycat

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

#启动
./mycat start(后台启动) ./mycat console(前台启动)


#停止
./mycat stop


#重启
./mycat restart

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

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

启动正常的结果如下:

f210615929ec4a6fbc55dcff186b5e68.png

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


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

b73a85d4b2ed42c4aaaf56a0b312023b.png

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

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

九、验证读写分离服务

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

957ffe48e45946dc9153aca0166e8639.png

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

bf94af7dda504a478910878a8de0f988.png

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

show @@heartbeat;

7e922ca130974a7f991a45046e16c28c.png

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

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

f75a947f656a4897883acf7cf4f270c4.png

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

28379a3b94ac46448e2c4b83dbd3a15c.png

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

1)关闭了主从复制

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

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

#关闭从机

stop slave;
show slave status\G;

e0f8d1d900244dd685d122576179ee13.png

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

99980378bb764492b52911e1d464cc6d.png261b22708a334995aeaf4d490bb5fbbe.png

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

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

bd274e994ce6455dbe8b1f0c66528d08.png

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

cbd8bb99afbb4d7c910876617801948a.png

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

837cc7979fa04802a508fe3adb8f9680.png

2)不关闭slave的主从复制

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

#开启slave的主从复制

778ed5adc0fb49fcbab3c2f13b7648eb.png

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

19d28f5afc50478b98fbaa0cd1461cb0.png

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

fe7711f85d7e4bc087c95ea2b72d1399.png

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

 42b4d8c1405f45dba3b6869e34a9e271.png

猜你喜欢

转载自blog.csdn.net/weixin_65690979/article/details/130170704