为mysql作读写分离有两个步骤:第一步为mysql配置主从复制;第二步用mysql-proxy为mysql作读写分离。mysql
为了保证mysql主从复制搭建成功,最好保证两台机器上mysql的版本一致。 在mysql中输入以下命令查看版本信息。linux
select version();
我使用的两台mysql地址分别为192.168.10.42和192.168.10.49。42上的mysql做为master使用,49上的mysql做为slave使用。sql
登陆192.168.10.42,找到mysql的配置文件my.cnf。打开my.cnf在[mysqld]下面加入以下内容数据库
log-slow-queries=mysql-slow.log log-error=mysql.err log-bin=mysql-bin server-id=1
上面的配置主要是为了开启主数据库的二进制日志功能,在添加时最好先浏览一下my.cnf这个文件,由于有的属性可能已经存在了。添加完成后保存退出,而后重启mysql。ubuntu
service mysqld restart
mysql重启完成后,以root登陆进去,给从数据库分配主数据库的复制权限,命令以下tcp
grant replication slave on *.* to 'user'@'192.168.10.49' identified by `password`;
其中“*.*”表示从数据库可以复制主数据库上的哪些库和哪些表,“user”和“password”是主数据库分配给从数据库的用户名和密码,根据需求本身设定,这里仅做示例使用。设置从数据库时要用到这个用户名和密码。ide
权限分配后输入以下命令能够查看到刚才设置的用户名,密码和ip地址信息。测试
select host,user,password from mysql.user;
而后查看一下主数据库的状态信息,输入以下命令lua
show master status;
记住其中的File和Position字段的值,配置从数据库时会使用到。spa
登陆到191.168.10.49,找到mysql的配置文件my.cnf,在[mysqld]下面加入以下内容
log-slow-queries=mysql-slow.log log-error=mysql.err log-bin=mysql-bin server-id=10
添加前最好浏览下这个文件的原有配置,若是已经配置够就不用再配置了。保存退出后,重启mysql服务
service mysqld restart
测试从数据库是否能用主数据分配的用户名和密码登陆到主数据库。
mysql -uuser -ppassword -h192.168.10.42
若是不能登陆,先检查一下可否ping通。若是可以ping桶,再检查一下192.168.10.42上的防火墙是否配置了3306端口。没有,则在iptables中添加3306端口的放行策略,而后重启iptables。
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
重启iptables
service iptables restart
这样,应该就能够登录到主数据库了。
以root登陆从数据库,配置slave信息
change master to master_host='192.168.10.42', master_user='user' , master_password='password', master_log_file='mysql-bin.000005', master_log_pos=3065;
而后开启从数据库的slave状态。
slave start;
查看slave信息。
show slave status\G;
若是Slave_IO_Running与Slave_SQL_Running为YES,则slave状态开启成功。不然,根据mysqld.log日志查看具体缘由。
到此,mysql的主从复制就设置好了。在主数据库上添加删除几条数据,能够在从数据库上一样的操做。停掉从数据库的slave状态
slave stop;
再往主数据库中添加删除数据,这些操做就不会影响到从数据库了。
mysql的读写分离,使用mysql-proxy来实现。而mysql-proxy而依托lua脚本,因此机器上密码安装lua。
安装mysql-proxy的机器为192.168.29.132。
操做系统为ubuntu14.1。
mysql-proxy的版本为mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit.tar.gz。
由于咱们使用的是ubuntu因此安装lua的方式就很简单了。
apt-get install lua
能够根据本身的系统选择相应的方式安装lua,保证lua命令可以执行就能够了。mysql-proxy的版本也要根据本身的操做系统进行相应的选择。
把mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit.tar.gz上传到/home/mysql_proxy目录下,解压
tar zxvf mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit.tar.gz cd mysql-proxy-0.8.2-linux-glibc2.3-x86-64bit cp share/doc/mysql-proxy/rw-splitting.lua ./ vi rw-splitting.lua
找到以下片断
if not proxy.global.config.rwsplit then proxy.global.config.rwsplit = { min_idle_connections = 4, max_idle_connections = 8, is_debug = false } end
为测试使用把4和8改成1。在生产环境中根据需求可作相应的修改。修改后以下图
如今就能够启动mysql-proxy了,命令以下
./bin/mysql-proxy --proxy-read-only-backend-addresses=192.168.10.49:3306 --proxy-backend-addresses=192.168.10.42:3306 --proxy-lua-script=rw-splitting.lua
控制台没有错误输出则启动正常。
mysql-proxy的侦听端口为4040,因此在192.168.29.132这台机器上要开放4040端口。在iptables文件中添加以下内容
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4040 -j ACCEPT
重启iptables
service iptables restart
输入以下命令,能够查看端口侦听情况。
netstat -anp | grep 4040
因为mysql-proxy架设在192.168.29.132这台机器上,还须要在主数据库中配置这台机器的权限,命令以下。
grant all on *.* to 'user'@'192.168.29.132' identified by 'password';
如今mysql读写分离就完成了,结构图以下
应用程序链接到mysql-proxy上,全部的写请求经过红线发送到master mysql上,全部的读请求经过蓝线发送到slave mysql上,master和slave之间经过紫线同步数据。
如今就能够测试读写分离机制是否起做用了。经过以下命令链接到mysql-proxy上。而后停掉192.168.10.49上的slave状态。
mysql -uuser -ppassword -h192.168.29.132 -P4040
在mysql-proxy上,经过sql插入几条数据。能够看到42上的mysql中有新增的数据,49上的mysql没有新增数据。而后在mysql-proxy上select一下,能够看到选出来的结构没有刚才插入的几条数据。
至此,mysql的读写分离就完成了。