proxy实现 mysql 读写分离

实现 mysql 读写分离


图解:


环境:
iptables 和 selinux 关闭
proxy:test2 172.25.1.2
Master: test3 172.25.1.3
Slave:test4 172.25.1.4
环境已经实现 test3(master) 和 test4(slave) 的主从复制

Server2:

[root@test2 ~]# ls
mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@test2 ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C
/usr/local
[root@test2 ~]# cd /usr/local
[root@test2 local]# ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy

[root@test2 local]# vim ~/.bash_profile

[root@test2 local]# source ~/.bash_profile            //使环境变量生效
[root@test2local]# cd /usr/local/mysql-proxy/share/doc/mysql-proxy
[root@test2mysql-proxy]# vim rw-splitting.lua                    //修改读写分离 lua 脚本

mysql proxy 会检测客户端连接, 当连接没有超过 max_idle_connections 值时, 不会进
行读写分离, 即查询操作会发生到 master 上。

[root@test2 local]# cd /usr/local
[root@test2 local]# cd mysql-proxy
[root@test2 mysql-proxy]# mkdir conf
[root@test2 mysql-proxy]# cd conf
[root@test2 conf]# vim mysql-proxy.conf

[mysql-proxy]
user=root
proxy-address=0.0.0.0:3306
proxy-backend-addresses=172.25.254.11:3306
proxy-read-only-backend-addresses=172.25.254.12:3306
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
log-level=debug
daemon=true
keepalived=true

[root@test2conf]#mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf

[root@test2 conf]# mkdir ../logs
[root@test2 conf]# chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf             //配置文件必须是 660 权限
[root@test2 conf]# mysql-proxy  --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf         //再次执行启动配置文件


[root@test2 conf]# netstat -antlp          //查看端口

主备 mysql 开启服务
Test3 和 test4 都需要做解压 mysql 并已搭建好主备模式


Test3:

mysql> grant insert,update on westos.* to cxx@'%' identified by '@Caoxingxing123';
mysql> show master status;
mysql> show slave status;



 

Test4:

mysql> stop slave;
mysql>change master to master_host='172.25.1.3',master_user='repl',master_password='@Caoxingxing123', master_auto_position=1;
mysql> start slave


mysql> show slave status\G;

Test3:

mysql> show databases;

 

mysql> CREATE DATABASE westos;
mysql> USE westos;
mysql> CREATE TABLE userlist(
-> username varchar(10) not null,
-> password varchar(30) not null
-> );
mysql> select * from userlist;

Test4:

mysql> show databases;

mysql> use westos;
mysql> select * from userlist;                    //数据库已经同步过来了

客户端测试:

[root@foundation1 ~]# mysql -u root -h 172.25.1.2 -p              //会出现如下情况
ERROR 1045 (28000): Unknown error 1045


//注意:root 用户需要在 master 和 slave 做授权
test3 和 test4 都需要执行

mysql> grant insert,update on westos.* to cxx@'%' identified by  '@Caoxingxing123';

//再次尝试登陆

[root@foundation1 ~]# mysql -h 172.25.1.2 -u cxx -p westos

MySQL [(none)]> use westos;
MySQL [westos]> show tables;

MySQL [westos]> insert into userlist values('user1','111');

 

MySQL [westos]> select * from userlist;            //只能写不能读


master 和 slave 端都可以查看到刚插入的数据
Test3:

Test4:


当连接一个时:
test3:通过监控查看连接情况

[root@test3 ~]# yum install lsof -y
[root@test3 ~]# lsof -i :3306                 //下载所需的监控


test4:通过监控查看连接情况

[root@test4 ~]# yum install lsof -y
[root@test4 ~]# lsof -i :3306


当连接两个时:

[kiosk@foundation1 ~]$ mysql -h 172.25.1.2 -u cxx -p westos              //加一个  

Test3:

[root@test3 mysql]# lsof -i :3306         

Test4:

[root@test4 mysql]# lsof -i :3306

当连接三个时(此时已超过最大连接数):

[kiosk@foundation1 ~]$ mysql -h 172.25.1.2 -u cxx -p westos

Test3:


Test4:


此时在最后一个连接的客户端写数据

MySQL [westos]> insert into userlist values ('user2','222');

Test3 查看数据:


Test4 查看数据:

实现了读写分离,当读数据的时候第三个连接到的是test4 ,但
写数据时自动连接 test3 从而保存数据。
总结:
首先连接的是 master,所以此时是对 master 读写,还没有读写分离,只有当连接数
大于设置的最大连接数时才会出现读写分离。
之前设置了最大连接数为 2,最小连接数为 1。所以默认为当连接数(客户端访问量)
为 1 时,连接的是 master,连接数为 2 时,连接的也是 master;只有当连接数大于 2 时,
后面连接的为 slave,且当读的时候访问的是 slave,写的时候访问的是 master(原因是:
master 和 slave 主从同步是单向的,所以写数据的时候如果写到 slave,slave 是不会同步
给 master 的。读的话就可以,因为数据的一致性, slave 和 master 的数据始终是相同的)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值