Mysql的读写分离

1、什么是读写分离?

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。

2、为什么要读写分离?

因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。

3、什么时候读写分离?

数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。当然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎。

基于主从复制进行 mysql 的读写分离
操作环境:linux7.3

 master:server1:IP 192168.122.1
 slave:server2:IP 192.168.122.2
 mysql proxy :server3:IP 192.168.122.3

进行mysql proxy的安装配置

将mysql-proxy安装包进行解压,并移动到指定目录下

在mysql proxy

[root@serve3 mnt]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz 
[root@serve3 mnt]# mv mysql-proxy-0.8.5-linux-el6-x86-64bit /usr/local/mysql-proxy

mysql-proxy配置文件的编写

vim /etc/mysql-proxy.conf
 [mysql-proxy]
 user=root   
 proxy-address=0.0.0.0:3306   # 本机监听的地址及端口
 proxy-backend-addresses=192.168.122.1:3306
                              # 配置读写服务器,IP及端口
 proxy-read-only-backend-addresses=192.168.122.2:3306
                              # 配置只读服务器,IP及端口
 proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
                              # 用这个lua脚本来实现读写分离
 admin-lua-script=/usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua                    
                              # admin模块的lua脚本
 log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
                              # 服务日志
 log-level=debug              # 日志模式设置为debug模式,方便调试
 keepalive=true               # 持续连接
 daemon=true                  # 打入后台

在这里插入图片描述

在/usr/local/mysql-proxy/路径中建立对应的logs目录,否则在开启服务时会出现报错
还要将mysql-proxy的配置文件的权限修改为660,否则在开启服务器时会有权限问题。

	 mkdir /usr/local/mysql-proxy/logs/
	 chmod 660 /etc/mysql-proxy.conf 

在这里插入图片描述

修改读写分离的lua脚本

cd /usr/local/mysql-proxy/share/doc/mysql-proxy/
 vim rw-splitting.lua 
 38 if not proxy.global.config.rwsplit then
 39         proxy.global.config.rwsplit = {
 40                 min_idle_connections = 1,
 41                 max_idle_connections = 2,
 42 
 43                 is_debug = false
 44         }
 45 end

在这里插入图片描述

启动mysql-proxy

/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf 

查看端口是否和服务一起开启

		netstat -tnlp

测试
在物理机上安装mysql客户端
在物理机上打开三个shell,都通过server3连接数据库进行如下操作

[root@foundation26 ~]# mysql -h 192.168.122.3 -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.24-log MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| westos             |
+--------------------+
5 rows in set (0.00 sec)

MySQL [(none)]> select * from westos.userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user1    | 123      |
+----------------------+
2 rows in set (0.00 sec)

保证master和slave的状态是开启的
在物理机上通过server3连接数据库,向数据库的表中插入新的数据信息

MySQL [(none)]> use westos;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [westos]> insert into userlist values('user2','222');
Query OK, 1 row affected (0.08 sec)

在server1(主)和server2(从)上都可以看到添加的信息
在这里插入图片描述

注意:
在master端可以看到数据,说明写操作是在server1(master)上,而在server2上看到数据,是因为server1和server2是主从复制关系。(不能说明server2可以进行写操作)

测试读写分离:
关闭server2(slave)

mysql> stop slave;
Query OK, 0 rows affected (0.05 sec)

物理机添加新的信息,在master上可以查看到,slave上无法看到

MySQL [westos]> insert into userlist values('user3','333');
Query OK, 1 row affected (0.37 sec)

master上查看
在这里插入图片描述
而在slave上无法看到
在这里插入图片描述
其他测试方法:
关掉server1(master)的mysql,开启server2的slave
在server1

	systemctl stop mysql

在server2

mysql> start slave;

在物理机上连接数据库,发现插入数据失败
说明读写分离成功,写操作在master(server1)上
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值