小言_互联网的博客

MySQL—数据库的读写分离

301人阅读  评论(0)

1. 什么是读写分离

MySQL读写分离是指让master处理写操作,让slave处理读操作,非常适用于读操作量比较大的场景,可减轻master的压力。

使用mysql-proxy实现mysql的读写分离,mysql-proxy实际上是作为后端mysql主从服务器的代理,它直接接受客户端的请求,对SQL语句进行分析,判断出是读操作还是写操作,然后分发至对应的mysql服务器上。

2. 为什么要读写分离

因为数据库的写操作相对读操作是比较耗时的,所以数据库的读写分离,解决的是数据库的写入,影响了查询的效率。

3. 读写分离的实现

实验环境:

  • selinux and firewalld disabled
  • server1:172.25.254.1(master)
  • server2:172.25.254.2(slave)
  • server3:172.25.254.3(mysql-proxy)

server1和server2要实现主从复制,这里就不多赘述了,详情见上一篇博文

mysql-proxy配置:

step1 配置mysql-proxy,创建主配置文件:

tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/
cd /usr/local/
ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit mysql-proxy
cd /usr/local/mysql-proxy
mkdir conf
cd conf/	
vim mysql-proxy.conf	#创建配置文件
写入下面内容:注意不要加注释,否则会报错

  1 [mysql-proxy]
  2 user=root ##运行mysql-proxy用户
  3 proxy-address=0.0.0.0:3306 ##mysql-proxy运行ip和端口
  4 proxy-read-only-backend-addresses=172.25.254.2:3306 ##slave:只读
  5 proxy-backend-addresses=172.25.254.1:3306 ##master:可读写
  6 proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ##lua脚本地址
  7 pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid
  8 plugins=proxy
  9 log-file=/usr/local/mysql-proxy/log/mysql-proxy.log #日志位置
 10 log-level=debug #定义log日志级别,由高到低分别有(error|warning|info|message|debug)
 11 daemon=true ##打入后台 
 12 keepalive=true ##mysql-proxy崩溃时,尝试重启(持续连接)

step2 建立目录存放读写分离的日志:

mkdir /usr/local/mysql-proxy/log


step3 修改读写分离配置文件:

vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
修改以下内容:
 40                 min_idle_connections = 1,  #最小连接数
 41                 max_idle_connections = 2,  #最大连接数,最大连接数大于2时发生读写分离

step4 给文件设置权限,再启动mysql-proxy(否则会启动失败):

chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf	#修改权限
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf	#启动mysql-proxy
cat /usr/local/mysql-proxy/log/mysql-proxy.log	#查看到server1和server2已经添加上 
netstat -antlp	#查看端口3306打开


step5 在master上授权一个新的用户:

mysql> grant insert,update,select on *.* to yy@'%' identified by 'Redhat.123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> use westos;
Database changed

mysql> create table userinfo (
    -> username varchar(10) not null,
    -> phonenum varchar(10) not null);
Query OK, 0 rows affected (0.04 sec)

mysql> desc userinfo;

step6 在proxy端监控3306端口情况,确保读写分离启动:

yum install lsof-4.87-4.el7.x86_64 -y
lsof -i:3306


step7 使用真机通过server3连接数据库,直到lsof监控到读写分离出现:

mysql -h 172.25.254.3 -uyy -pRedhat.123	#打开几个shell多连接几次

注意:真机中如果没有mysql,直接用yum install mariadb-server安装

测试:

step1 master和slave状态都开启:

在真机中通过server3连接数据库:

mysql -h 172.25.254.3 -uyy -pRedhat.123
use westos;
insert into userinfo values ('user1','111');	#插入数据
select * from userinfo;


注意:此时可以成功插入看到数据,并不能判断实现了读写分离

step2 关闭server2(slave):

stop slave;

在真机插入数据,却不能查看到数据,而在master上可以查看到插入的数据:

insert into userinfo values ('user2','222');
select * from userinfo;

开启server2的slave:

start slave;

在真机中再次select,可以查看到刚才插入的数据:

select * from userinfo;

说明:实现读写分离,读操作是在server2(slave)上

step3 关掉server1(master):

systemctl stop mysqld

在物理机上连接数据库,发现插入数据失败:

insert into userinfo values ('user3','333');


说明:实现读写分离,写操作在server1(master)上


转载:https://blog.csdn.net/weixin_45775963/article/details/104774565
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场