为mysql做读写分离有两个步骤:第一步为mysql配置主从复制;第二步用mysql-proxy为mysql做读写分离。
mysql主从复制
为了保证mysql主从复制搭建成功,最好保证两台机器上mysql的版本一致。 在mysql中输入如下命令查看版本信息。
select version();
我使用的两台mysql地址分别为192.168.10.42和192.168.10.49。42上的mysql作为master使用,49上的mysql作为slave使用。
主数据库配置
登录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。
service mysqld restart
mysql重启完成后,以root登录进去,给从数据库分配主数据库的复制权限,命令如下
grant replication slave on *.* to ‘user‘@‘192.168.10.49‘ identified by `password`;
其中“*.*”表示从数据库能够复制主数据库上的哪些库和哪些表,“user”和“password”是主数据库分配给从数据库的用户名和密码,根据需求自己设定,这里仅作示例使用。设置从数据库时要用到这个用户名和密码。
权限分配后输入如下命令可以查看到刚才设置的用户名,密码和ip地址信息。
select host,user,password from mysql.user;
然后查看一下主数据库的状态信息,输入如下命令
show master status;
记住其中的File和Position字段的值,配置从数据库时会使用到。
从数据库配置
登录到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的读写分离,使用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的读写分离就完成了。