这次我来撘下比较流行的读写分离配置,现在好像很火的样子,能大大提升mysql的能力,所以我就学一下。
一,材料准备
三台主机
- altas代理中间件服务器 192.168.1.1
- 主mysql服务器 192.168.1.2
- 从mysql服务器 192.168.1.3
Jmeter
还得自备JDBC桥包
二,安装mysql
三台服务器都需要安装mysql,你会为代理服务器为什么也要装,主要是该服务器会利用某一个mysql的某个包,所以还是得装
sudo apt-get update
sudo apt-get install mysql-server mysql-client
然后根据自己的mysql版本配置UTF-8编码,我的是5.5.6
mysql > select version();
mysql > show variables like 'character_set_%';#查看编码
sudo stop mysql
sudo su
vim /etc/mysql/my.cnf
#在[client]段增加下面代码
default-character-set=utf8
#在[mysqld]段增加下面的代码
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
sudo start mysql
三,配置主从复制
我只是做了个最简单的主从复制,所以想要理解深入的要自己去查看,然后一定要保持所有服务器的3306都可以连通
首先配置主从服务器,代理的mysql服务器不用管,不会用到它
vim /etc/mysql/my.cnf
#添加或修改(如果文件上有)以下属性
bind-address = 0.0.0.0
server-id=1 #主是1,从是2,不要搞混,而且必须唯一
log-bin=mysql-bin
binlog-ignore-db = mysql,information_schema
sudo restart mysql
master授权一个账号给slave读取数据
账:root
密:root(identified by 密码)
在主服务器操作
mysql -uxxx -pxxx
mysql > grant all privileges on *.* to 'root'@'192.168.1.3' identified by 'root';
mysql > flush privileges;
在从机操作测试能否正常连接主机的mysql,能正常连接说明没问题,否则请自行检查端口,这步必须先过,否则后面就会很折磨你自己为什么弄不了
mysql -uroot -proot -h192.168.1.2
好回到主机,这两个属性很重要,等下要用
mysql > show master status;
再去到从机,按照自己配置的账密,还有刚刚那两个属性,配置以下命令输入从机
change master to
master_host='192.168.1.2',#主机
master_user='root',#账
master_password='root',#密
master_log_file='mysql-bin.000001',#二进制文件
master_log_pos=333;
重启从机mysql,并输入一下命令,然后会看到两个YES,那就OK了,如果没有,那就检查防火墙和端口
sudo restart mysql
mysql -uxxx -pxxx
mysql > start slave;
mysql > show slave status\G;
读写分离参考链接推荐:
http://www.jianshu.com/p/bcd01f163bae
http://blog.csdn.net/lc0817/article/details/51163268
四,测试主从复制
首先我们,我们先把主从机的数据库打开
mysql > show databases;
然后我们再主机输入以下命令
mysql > create database test;
mysql > use test;
mysql > create table student ( id int );
mysql > insert into student values(1);
然后分别在主从机下输入以下命令
mysql > show databases;
mysql > use test;
mysql > select * from student;
好了恭喜,读写分离配置初步主从复制完毕。
五,Altas配置
首先分别进入主从机,申请同样账号密码的mysql用户提供给代理服务器使用,我觉得最好和刚才主从链接的账号密码一样咯,这样好记
mysql > grant all privileges on *.* to 'root'@'192.168.1.1' identified by 'root';
上传Atlas-2.2-debian7.0-x86_64.deb到代理机上。
还记得我们刚刚给代理机的账号密码吧?
账:root
密:root (记住这个密码,最主要和主机有关系)
然后打开代理机终端输入以下命令
cd /usr/local/
dpkg -i Atlas-2.2-debian7.0-x86_64.deb
rm -rf Atlas-2.2-debian7.0-x86_64.deb
cd mysql-proxy
bin/encrypt root#这是刚刚所说的密码
#DAJnl8cVzy8= 把这个密码记住,等等配置conf
cd conf
vim test.cnf
配置以下属性
[mysql-proxy]
#这是管理代理的账号密码,这个感觉默认就行了,看自己
#管理接口的用户名
**admin-username **= user
#管理接口的密码
**admin-password **= pwd
#实现管理接口的Lua脚本所在路径
admin-lua-script = /usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
#设置为自己的主机
**proxy-backend-addresses** = 192.168.1.2:3306
#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
#设置只读服务器,其中@后面代表权值,权值越大,抽中为读的几率越高
**proxy-read-only-backend-addresses** = 192.168.1.2:3306@1,192.168.1.3:3306@2
#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true
daemon = true
#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true
keepalive = true
#工作线程数,推荐设置与系统的CPU核数相等
event-threads = 4
#日志级别,分为message、warning、critical、error、debug五个级别
log-level = message
#日志存放的路径
log-path = /usr/local/mysql-proxy/log
#实例名称,用于同一台机器上多个Atlas实例间的区分
instance = test
#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234
#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345
#连接池的最小空闲连接数,应设为event-threads的整数倍,可根据业务请求量大小适当调大或调小
min-idle-connections = 8
#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
#tables = person.mt.id.3
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,此设置项用于多个用户名同时访问同一个Atlas实例的情况,若只有一个用户名则不需要设置该项
#设置刚刚经过转码的密码,其实我也不太了解官方写的什么意思
**pwds** = root:DAJnl8cVzy8=
#默认字符集,若不设置该项,则默认字符集为latin1
**charset** = utf8
#允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
#client-ips = 127.0.0.1, 192.168.1
#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
#lvs-ips = 192.168.1.1
OK,基本配置完成
六,Altas测试
在代理服务器下输入以下命令
/usr/local/mysql-proxy/bin/mysql-proxyd test start
再看看代理服务器能不能正常链接两个服务器,在代理服务器上输入这个命令
mysql -h192.168.1.1 -P2345 -uuser -ppwd
mysql > select \* from help;
mysql > select \* from backends;
可以看到,配置基本完成,其实基本读写分离完成了也可以用了,只要把URL换成这个就行了,和平时链接没区别,
jdbc:mysql://192.168.1.1:1234/test?characterEncoding=UTF-8
,
并用主机的账号密码登录,如果还是不放心,那就看下面这点吧
七,Altas读写分离测试
这里我就说步骤了。
打开apache-jmeter-3.1\bin\jmeter.bat
在主从机上安装sar命令,然后同时输入sar命令来监看这个动态过程
sudo apt-get install sysstat
sar -n DEV 1 10000
可以看到现在很平稳,那么我们回到Jmerter,执行查询语句,留意两机的变化
可以看到,从机几乎2比1主机,也就是说读的话,从机占了绝大部分,而主机只需分担一点点压力就好了,和我们的分压理论下一致了,那么我们再测一下写又会是怎么样
你会看到,怎么从机也会写呢,因为主从复制,那么主机写的时候,从机也在读主机数据,肯定也会运行啊?对把,我们这就达到了读写分离的状态,而且写的明显比读的高,这就表明了读写已经分离了,好了完成了!
参考链接推荐:
https://my.oschina.net/ydsakyclguozi/blog/402444
http://www.cnblogs.com/yyhh/archive/2015/12/29/5084844.html
我已经尝试了好多种中间件,好像mycat,可是我觉得mycat有点深度,如果不好好研究一时没法用,而且我觉得太麻烦了,不能读出大量数据,有限制化,我的业务不能用这个中间件了。其他各有优缺,以待分析。很多人会有这个问题,就是同步延迟,其实就好像分布式一样,会有io传输这种问题,不管哪个中间件,也不太能很好解决这个问题,异步是无法避免,看您怎么看待了。