读写分离介绍
读写分离适合于读特别多的场景,一台只写,一台只读,提高读的效率。
实现的思路
前提:
读写分离建立在两台机器上,并且这两台机器是做了主从复制的,主库只写,从库只读,从而实现的。
实现:
第一种:
在主库创建一个只写的用户,而从库创建一个只写的用户,让程序去连接不同的服务器可达到读写分离的效果。
第二种:
通过代理软件,这种的好处是程序不需要关心写和读的操作分别连接的哪台服务器,只管往代理机器发即可,代理软件进行判断发往不同的mysql服务器。
通过代理实现的软件有:mysql-proxy,amoeba
代理方式的实现
图解:
环境:
需要开三台机器。
192.168.101 # 主库-只写
192.168.102 # 从库-只读
192.168.100 # 代理
安装lua脚本语言:
# 这个是mysql-proxy需要的
官方下载地址:
http://www.lua.org/ftp/
(1)安装依赖 yum install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make readline-devel -y (2)下载包 wget http://www.lua.org/ftp/lua-5.3.5.tar.gz -P /opt/ (3)解压包 cd /opt/ tar xf lua-5.3.5.tar.gz (4)修改Makefile文件 cd /opt/lua-5.3.5/ vi Makefile # 设置 INSTALL_TOP= /usr/local/lua (5)编译 make linux && make install (6)添加环境变量 vim /etc/profile 添加: export LUA_HOME=/usr/local/lua export PATH=$PATH:$LUA_HOME/bin 环境变量生效: source /etc/profile
安装mysql-proxy:
(1) 下载mysql-proxy包
wget https://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -P /opt/
(2) 解压包和创建软连接
tar xf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit mysql-proxy085
(3) 创建logs目录
mkdir /opt/mysql-proxy085/logs
(4) 添加环境变量
echo "PATH=/opt/mysql-proxy085/bin/:$PATH" >> /etc/profile
source /etc/profile
(5) 配置代理文件
vim /etc/mysql-proxy.cnf
配置内容:
[mysql-proxy] # 运行mysql-proxy用户 user=root # mysql-proxy连接后端mysql服务器的用户 admin-username=mysql_proxy_user # mysql-proxy连接后端mysql服务器的密码 admin-password=123456 # 代理的监听地址端口,默认端口4040 proxy-address=0.0.0.0:3307 #指定后端主master写入数据 proxy-backend-addresses=192.168.1.101:3306 #指定后端从slave读取数据 proxy-read-only-backend-addresses=192.168.1.102:3306 #指定读写分离配置文件位置 proxy-lua-script=/opt/mysql-proxy085/share/doc/mysql-proxy/rw-splitting.lua #日志位置 log-file=/opt/mysql-proxy085/logs/mysql-proxy.log #定义log日志级别,由高到低分别有(error|warning|info|message|debug) log-level=debug #以守护进程方式运行 daemon=true #mysql-proxy崩溃时,尝试重启 keepalive=true
# 配置参数自行修改
(6) 修改配置文件权限
chmod 660 /etc/mysql-proxy.cnf
(7) 主库添加授权用户
grant all privileges on *.* to ‘mysql_proxy_user‘@‘192.168.1.%‘ identified by ‘123456‘;
flush privileges;
(8) 启动代理
mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
(9) 连接通过代理账户连接代理开启的ip及端口
注:前提你连接的这台机器得弄个mysql客户端
# 测试的话:mysql包解压了,添加环境变量即可
# 后端的话:直接通过模块就连接1.100机器3307端口即可
mysql -umysql_proxy_user -p123456 -h192.168.1.100 --port=3307
(10) 成功
注:lua是必须要安装的
试验结果:
注:写操作,主从两台机器都会操作,因为他们是主从复制的。
想要看出效果需要修改lua脚本,因为它有限制(表示多少连接才开启读写分离):
vim /opt/mysql-proxy085/share/doc/mysql-proxy/rw-splitting.lua
# min_idle_connnections参数表示最少多少个连接,才开始读写分离
查询读写次数的sql语句:
show global status where Variable_name in(‘com_select‘,‘com_insert‘,‘com_delete‘,‘com_update‘);
show global staus like ‘com_select‘; # 单个的