proxy实现 mysql 读写分离
實現(xiàn) mysql 讀寫分離
圖解:
環(huán)境:
iptables 和 selinux 關閉
proxy:test2 172.25.1.2
Master: test3 172.25.1.3
Slave:test4 172.25.1.4
環(huán)境已經(jīng)實現(xiàn) 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??????????? //使環(huán)境變量生效
[root@test2local]# cd /usr/local/mysql-proxy/share/doc/mysql-proxy
[root@test2mysql-proxy]# vim rw-splitting.lua??????????????????? //修改讀寫分離 lua 腳本
mysql proxy 會檢測客戶端連接, 當連接沒有超過 max_idle_connections 值時, 不會進
行讀寫分離, 即查詢操作會發(fā)生到 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 ? ? ? ? //再次執(zhí)行啟動配置文件
[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;??????????????????? //數(shù)據(jù)庫已經(jīng)同步過來了
客戶端測試:
[root@foundation1 ~]# mysql -u root -h 172.25.1.2 -p????????????? //會出現(xiàn)如下情況
ERROR 1045 (28000): Unknown error 1045
//注意:root 用戶需要在 master 和 slave 做授權
test3 和 test4 都需要執(zhí)行
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 端都可以查看到剛插入的數(shù)據(jù)
Test3:
Test4:
當連接一個時:
test3:通過監(jiān)控查看連接情況
[root@test3 ~]# yum install lsof -y
[root@test3 ~]# lsof -i :3306???????????????? //下載所需的監(jiān)控
test4:通過監(jiān)控查看連接情況
[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
當連接三個時(此時已超過最大連接數(shù)):
[kiosk@foundation1 ~]$ mysql -h 172.25.1.2 -u cxx -p westos
Test3:
Test4:
此時在最后一個連接的客戶端寫數(shù)據(jù)
MySQL [westos]> insert into userlist values ('user2','222');
Test3 查看數(shù)據(jù):
Test4 查看數(shù)據(jù):
實現(xiàn)了讀寫分離,當讀數(shù)據(jù)的時候第三個連接到的是test4 ,但
寫數(shù)據(jù)時自動連接 test3 從而保存數(shù)據(jù)。
總結:
首先連接的是 master,所以此時是對 master 讀寫,還沒有讀寫分離,只有當連接數(shù)
大于設置的最大連接數(shù)時才會出現(xiàn)讀寫分離。
之前設置了最大連接數(shù)為 2,最小連接數(shù)為 1。所以默認為當連接數(shù)(客戶端訪問量)
為 1 時,連接的是 master,連接數(shù)為 2 時,連接的也是 master;只有當連接數(shù)大于 2 時,
后面連接的為 slave,且當讀的時候訪問的是 slave,寫的時候訪問的是 master(原因是:
master 和 slave 主從同步是單向的,所以寫數(shù)據(jù)的時候如果寫到 slave,slave 是不會同步
給 master 的。讀的話就可以,因為數(shù)據(jù)的一致性, slave 和 master 的數(shù)據(jù)始終是相同的)。
總結
以上是生活随笔為你收集整理的proxy实现 mysql 读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: memcache
- 下一篇: mysql 主从复制 和基于gtid的m