mysql读写分离策略

mysql做读写分离有两个步骤:第一步为mysql配置主从复制;第二步用mysql-proxymysql做读写分离。

 

mysql主从复制

为了保证mysql主从复制搭建成功,最好保证两台机器上mysql的版本一致。 在mysql中输入如下命令查看版本信息。

select version();

我使用的两台mysql地址分别为192.168.10.42192.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;

记住其中的FilePosition字段的值,配置从数据库时会使用到。

 

从数据库配置

 

登录到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

为测试使用把48改为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上,masterslave之间通过紫线同步数据。

现在就可以测试读写分离机制是否起作用了。通过如下命令连接到mysql-proxy上。然后停掉192.168.10.49上的slave状态。

 

mysql -uuser -ppassword -h192.168.29.132 -P4040

 

mysql-proxy上,通过sql插入几条数据。可以看到42上的mysql中有新增的数据,49上的mysql没有新增数据。然后在mysql-proxyselect一下,可以看到选出来的结构没有刚才插入的几条数据。

至此,mysql的读写分离就完成了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。