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)上