转自:https://www.cnblogs.com/phpstudy2015-6/p/6687480.html#_label0
https://blog.csdn.net/huanghanqian/article/details/50916988
阅读目录
1、简介
当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来。然而我们有很多办法可以缓解数据库的压力。分布式数据库、负载均衡、读写分离、增加缓存服务器等等。这里我们将采用读写分离技术进展缓解数据库的压力。
其中实现读写分离的技术有很多方法,这里我们将采用mysql-proxy这个中间软件来实现。这个软件中含有一个读写分离的lua文件,这也是我们使用mysql-proxy实现读写分离必用的文件,它需要lua解析器进行解析。因此我们还需要安装一个lua解析器。
2、基本环境
三台linux虚拟主机
Linux版本CentOS6.6、MySQL 5.5
mysql-proxy-0.8.5
lua-5.1.4
ip:192.168.95.11(写)、192.168.95.12(读)、192.168.95.13(mysql-proxy)
3、配置主从复制
详细可以参考:mysql主从复制与主主复制
http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label2
粗略介绍一下数据库的主从复制的配置:
第一步:
在192.168.95.11中创建一个192.168.95.12主机中可以登录的MySQL用户
用户:mysql12
密码:mysql12
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql12’@’192.168.95.12’ IDENTIFIED BY ‘mysql12’; mysql>FLUSH PRIVILEGES;
第二步:
查看192.168.95.11MySQL服务器二进制文件名与位置
mysql>SHOW MASTER STATUS;
第三步:
告知二进制文件名与位置
在192.168.95.12中执行:
mysql> change master to -> master_host='192.168.95.11', -> master_user='mysql12', -> master_password='mysql12', -> master_log_file='mysql-bin.000124', -> master_log_pos=586;
第四步:
在192.168.95.12中
mysql>SLAVE START; #开启复制
mysql>SHOW SLAVE STATUS\G #查看主从复制是否配置成功
主从复制配置成功!
(注意:上面Relicate_Do_DB:aa表示主从复制只针对数据库aa【这是我之前设置的就没改了】,这里就不讲这个了,要想去了解学医这个的话可以参考文章http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7)
4、MySQL读写分离配置
百度云下载:链接:http://pan.baidu.com/s/1slTl18L 密码:9j0m
4.1、安装lua
官网下载:http://www.lua.org/download.html
Lua 是一个小巧的脚本语言。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。
一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
1)、安装lua需要依赖很多软件包。
可以通过rpm -qa | grep name检查以下软件是否安装:
gcc*、gcc-c++*、autoconf*、automake*、zlib*、libxml*、ncurses-devel*、libmcrypt*、libtool*、flex*、pkgconfig*、libevent*、glib*
若缺少相关的软件包,可通过yum -y install方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh方式安装。(我的话一般是直接在系统光盘软件库中找到直接rpm安装的,有些找不到,则先在网上下载然后在ftp传给linux再进行安装)
2)、依赖软件安装完毕后则进行编译安装lua
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。
官网下载:http://www.lua.org/download.html(下载源码包)
# wget http://www.lua.org/ftp/lua-5.1.4.tar.gz # tar zxvf lua-5.1.4.tar.gz # cd lua-5.1.4 # make linux # make install # export LUA_CFLAGS="-I/usr/local/include" LUA_LIBS="-L/usr/local/lib -llua -ldl" LDFLAGS="-lm" (我安装的时候是直接在光盘软件库中找到,直接rpm安装)
4.2、安装mysql-proxy
1)、首先查看linux版本确认是32位还是64为系统
查看linux内核版本
# cat /etc/issue
查看linux版本
# cat /proc/version
2)、按系统位数下载(上面百度云链接64位的文件)
3)、安装
# tar –zxvf mysql-proxy-0.8.5- linux-rhel5-x86-64bit.tar.gz # mkdir /usr/local/mysql-proxy # cp ./ mysql-proxy-0.8.5-linux-rhel5-x86-64bit/* /usr/local/mysql-proxy # cd /usr/local/mysql-proxy
安装成功
5、MySQL读写分离测试
1)、修改rw-splitting.lua文件
修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离
#cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ./
# vi rw-splitting.lua
2)、修改完成后,启动mysql-proxy
# cd /usr/local/mysql/bin # ./mysql-proxy --proxy-read-only-backend-addresses=192.168.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua &
参数:
--proxy-read-only-backend-addresses #只读服务器地址(ip)
--proxy-backend-addresses #服务器地址(主服务器)
--proxy-lua-script #lua脚本路劲
& #表示后台执行
3)、创建用于读写分离的数据库连接用户
用户名:proxy1
密 码:321
mysql>grant all on *.* to 'proxy1'@'192.168.95.13' identified by '321'; mysql>use aa; mysql>create table tab1(id int auto_increment,name varchar(32) not null,primary key(id));
【因为已经开启了主从复制所以,11、12主机mysql中都创建了这个用户】
4)、测试登陆账号proxy1@192.168.95.13进行添加数据
可以使用任意ip客户端登陆这个账号
在192.168.95.13登陆:
# ./mysql -u proxy1 -P4040 -h192.168.95.13 –p
在两个mysql中查看结果:一致
结果表明:账号使用
(ps:id是自增长,之前高主主复制的时候更改了配置文件,还没更改回来,就将就用着先吧)
5)、关闭12mysql的从复制
mysql> stop slave;
6)、证明写分离
使用proxy1@192.168.95.13账号打开多个客户端进行插入数据
打开三个mysql客户端分别插入2条数据:
mysql> insert into tab1 (name) values('stop_slave11111'); …. mysql> insert into tab1 (name) values('stop_slave6666’);
查看:
分别登陆11mysql与12mysql查看aa.tab1中的数据
主数据库:
从数据库:
结果中显示插入的数据存在与主数据库,而从数据库没有,所以证明写能够分离。
7)、证明读分离
使用proxy1@192.168.95.13账号登陆mysql,查看aa.tab1中的数据
mysql>use aa; mysql>select*from tab1;
结果中显示只有从数据库的数据,结合上面的测试,可以证明读分离。
6、建议
为了方便启动与管理mysql-proxy可以创建mysql-proxy服务管理脚本
下面这个管理脚本仅适合以上我给出的安装路径位置
【此管理脚本需要按照自己的安装路径做出相应的修改方可使用】
1 #!/bin/sh 2 3 # 4 # mysql-proxy This script starts and stops the mysql-proxy daemon 5 # 6 # chkconfig: - 78 30 7 # processname: mysql-proxy 8 # description: mysql-proxy is a proxy daemon to mysql 9 10 # Source function library. 11 . /etc/rc.d/init.d/functions 12 13 #PROXY_PATH=/usr/local/bin 14 PROXY_PATH=/usr/local/mysql-proxy/bin 15 16 prog="mysql-proxy" 17 18 # Source networking configuration. 19 . /etc/sysconfig/network 20 21 # Check that networking is up. 22 [ ${NETWORKING} = "no" ] && exit 0 23 24 # Set default mysql-proxy configuration. 25 #PROXY_OPTIONS="--daemon" 26 27 PROXY_OPTIONS="--proxy-read-only-backend-addresses=192.168.95.12:3306 --proxy-backend-addresses=192.168.95.11:3306 --proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua" 28 29 PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid 30 31 # Source mysql-proxy configuration. 32 if [ -f /etc/sysconfig/mysql-proxy ]; then 33 . /etc/sysconfig/mysql-proxy 34 fi 35 36 PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH 37 # By default it's all good 38 RETVAL=0 39 40 # See how we were called. 41 case "$1" in 42 start) 43 # Start daemon. 44 echo -n $"Starting $prog: " 45 $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --daemon --pid-file=$PROXY_PID --user=root --log-level=debug --log-file=/usr/local/mysql-proxy/log/mysql-proxy.log 46 RETVAL=$? 47 echo 48 if [ $RETVAL = 0 ]; then 49 touch /var/lock/subsys/mysql-proxy] 50 echo "ok" 51 fi 52 ;; 53 stop) 54 # Stop daemons. 55 echo -n $"Stopping $prog: " 56 killproc $prog 57 RETVAL=$? 58 echo 59 if [ $RETVAL = 0 ]; then 60 rm -f /var/lock/subsys/mysql-proxy 61 rm -f $PROXY_PID 62 fi 63 ;; 64 restart) 65 $0 stop 66 sleep 3 67 $0 start 68 ;; 69 condrestart) 70 [ -e /var/lock/subsys/mysql-proxy ] && $0 restart 71 ;; 72 status) 73 status mysql-proxy 74 RETVAL=$? 75 ;; 76 *) 77 echo "Usage: $0 {start|stop|restart|status|condrestart}" 78 RETVAL=1 79 ;; 80 esac 81 exit $RETVAL
#---我将mysql-proxy服务管理脚本放在了/usr/local/mysql-proxy/init.d/文件夹里
#---给执行权限,建立相应目录 #chmod +x /usr/local/mysql-proxy/init.d/mysql-proxy #mkdir /usr/local/mysql-proxy/run #mkdir /usr/local/mysql-proxy/log
#cd /usr/local/mysql-proxy/init.d/
#---启动mysql-proxy
#./mysql-proxy start
#---停止mysql-proxy
#./mysql-proxy stop
#---重启mysql-proxy
#./mysql-proxy restart
一些相关参数:
PROXY_PATH=/usr/local/mysql-proxy/bin //定义mysql-proxy服务二进制文件路径
--proxy-read-only-backend-addresses=192.168.95.12:3306 //定义后端只读从服务器地址
--proxy-backend-addresses=192.168.95.11:3306 //定义后端主服务器地址
--proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua //定义lua读写分离脚本路径
PROXY_PID=/usr/local/mysql-proxy/run/mysql-proxy.pid //定义mysql-proxy PID文件路径
--daemon //定义以守护进程模式启动
--keepalive //使进程在异常关闭后能够自动恢复【上面的管理脚本没有加上此参数】
--user=root //以root用户身份启动服务
--log-level=debug //定义log日志级别,由高到低分别有(error|warning|info|message|debug)
--log-file=/usr/local/mysql-proxy/log/mysql-proxy.log //定义log日志文件路径
(以上是自己的一些见解与总结,若有不足或者错误的地方请各位指出)
作者:那一叶随风
amoeba安装及读写分离配置(windows版)
在做体系结构作业时,需要实现一个大数据量,对响应速度要求比较高的网站,类似于淘宝。需要使用分布式数据库,负载均衡和读写分离技术。我经过搜索,发现开源的amoeba非常轻便好用。而且是淘宝的某个大牛研发的,支持国产哈哈!主要是中文文档看上去很方便,而且文档写得也挺清晰详细的,易上手。
一、amoeba的安装
1.准备环境
电脑必须已安装并配置好jdk。目前Amoeba经验证在JavaTM SE 1.5和Java SE 1.6能正常运行,(可能包括其他未经验证的版本),文档上是这么说,不过我用的是最新的jdk1.8也是完全可行的。所以1.5版本之后应该都是可以的。本文所使用操作系统为Windows7 64位,amoeba版本为2.2.0,anoeba所在服务器ip为192.168.1.102,后端数据库为mysql-5.6.24,两台MySQL数据库所在服务器ip分别为127.0.0.1和192.168.1.104。
2.下载安装
到此网址下载amoeba:http://sourceforge.net/projects/amoeba/files/,下载后是压缩包形式,在电脑目录中创建一个文件夹命名为amoeba,将压缩包解压到此文件夹中,解压后的文件如下图所示:
3.启动amoeba
打开cmd,进入amoeba的bin目录,运行输入命令amoeba
如果看到:amoeba start|stop 就代表安装成功了(注意:如果是amoeba 3.0及3.0以上的版本,输入此命令会显示不存在该命令,因为3.0的版本的命令不是amoeba,而是launcher。我这里的版本是amoeba 2.0,所以可以用amoeba命令。)
二、amoeba的配置
#/* Amoeba总共有7个配置文件,分别如下:
#/* Amoeba主配置文件($AMOEBA_HOME/conf/amoeba.xml),用来配置Amoeba服务的基本参数,如Amoeba主机地址、端口、认证方式、用于连接的用户名、密码、线程数、超时时间、其他配置文件的位置等。
#/* 数据库服务器配置文件($AMOEBA_HOME/conf/dbServers.xml),用来存储和配置Amoeba所代理的数据库服务器的信息,如:主机IP、端口、用户名、密码等。
#/* 切分规则配置文件($AMOEBA_HOME/conf/rule.xml),用来配置切分规则。
#/* 数据库函数配置文件($AMOEBA_HOME/conf/functionMap.xml),用来配置数据库函数的处理方法,Amoeba将使用该配置文件中的方法解析数据库函数。
#/* 切分规则函数配置文件($AMOEBA_HOME/conf/ruleFunctionMap.xml),用来配置切分规则中使用的用户自定义函数的处理方法。
#/* 访问规则配置文件($AMOEBA_HOME/conf/access_list.conf),用来授权或禁止某些服务器IP访问Amoeba。
#/* 日志规格配置文件($AMOEBA_HOME/conf/log4j.xml),用来配置Amoeba输出日志的级别和方式。
# 配置后端mysql 服务器连接[dbServer.xml]
配置amoeba中的dbServer.xml(后端mysql 服务器连接配置)
打开conf文件夹下的dbServer.xml,需要更改的有以下几个地方:
1.设置abstractserver,里面定义了要代理的mysql服务器的用户名和密码(密码遮住不给你们看啦!)
2.添加两个dbServer,继承自abstractserver,一个代表主数据库,一个代表从数据库。
3.配置数据库池。
dbServer.xml配置完毕。
4. 配置 Amoeba 监听端口[amoeba.xml]
配置监听IP,登录账户和密码(密码不给看)
读写分离配置:
amoeba.xml配置完毕。
5. 配置 Amoeba 插入规则[rule.xml]
rule.xml配置完毕。
三、amoeba启动与读写分离测试
1.启动amoeba:
首先,确认对被代理的Mysql数据库拥有有远程登录权限,没有的话通过以下命令赋予权限:(密码设置的123)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.102' IDENTIFIED BY '123' WITH GRANT OPTION;
在命令行中进入当前目录,输入amoeba start启动amoeba。
2.新开一个命令行,输入以下命令登录>mysql -uroot -h 192.168.1.102 -P8066 -p,密码是123,如果可以正常登录,则amoeba配置成功。
3.分别在两台后端数据库服务器的test数据库中新建一个test表,插入不同数据,这里分别插入的是100,101和102,在登录amoeba的命令提示符中输入
insert into test.test (id) values (100);
insert into test.test (id) values (101);
insert into test.test (id) values (102);
插入3次,发现第一次插入了master服务器的数据库表,第二次插入了slave服务器的数据库表,第三次又插入了master的数据库表。id为偶数插入master,id为奇数插入slave,与我们之前在rule.xml中配置的一致。
插入之后,再输入语句:
select * from test.test;
会出现100,101,102,所有服务器中数据库里数据。
所以之前插入的三条数据虽然被分片到了不同的数据库节点,但Amoeba的合并工作使得它们看起来像在一个库里,也因此可见Amoeba对客户端的透明。.