mysql读写分离策略

为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的读写分离就完成了。

时间: 2024-10-31 11:21:28

mysql读写分离策略的相关文章

构建高性能web之路------mysql读写分离实战

一个完整的mysql读写分离环境包括以下几个部分: 应用程序client database proxy database集群 在本次实战中,应用程序client基于c3p0连接后端的database proxy.database proxy负责管理client实际访问database的路由策略,采用开源框架amoeba.database集群采用mysql的master-slave的replication方案.整个环境的结构图如下所示: 实战步骤与详解 一.搭建mysql的master-slave

使用Amoeba实现mysql读写分离机制

Amoeba的实用指南 http://docs.hexnova.com/amoeba/ 如何实现mysql读写分离 : 通常来说有两种方式: 1,应用程序层实现 2,中间件层实现 应用层实现 应用层实现是指在应用程序内部及连接器中实现读写分离. 例如: com.mysql.jdbc.replicationdriver mysqlnd_ms 优点: 程序内部实现读写分离,安装即可使用 减少部署难度. 访问压力在一定级别以下,性能很好. 缺点: 架构一旦调整,代码要更这变, 不够灵活. 难以实现高级

mycat实现MySQL读写分离

mycat实现MySQL读写分离 mycat是什么 Mycat是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而Mycat并没有存储引擎,所以并不是完全意义的分布式数据库系统.Mycat是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务.对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集群构成了整个完整的数据库存储. Mycat的几个典型的应用场景: 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换: 分表分库,对于超过

采用Atlas mysql 读写分离工具

前阵子测试了360开源出来的Atlas,总的来说挺好的,这里先标记下,备用.听说amoeba也不错,大牛还给我推荐了一篇文章,也先留着. 测试了下atlas的性能,挺给力的. 在并发2000时,atlas会提示I have no server backend,closing connection.判断应为mysql不能及时提供空闲连接导致,但atlas并未出现任何瓶颈.但是,atlas自身没有断开mysql连接的设置,完全依赖于mysql自身的超时时间. 其读写分离策略是除了完全的读请求,其余的

利用amoeba实现mysql读写分离

参考: http://my.oschina.net/u/1169079/blog/390726 http://douya.blog.51cto.com/6173221/1607493 一 安装环境: 三台centos6.7 64位的系统 192.168.127.130   从数据库 192.168.127.131   主数据库 192.168.127.134  amoeba 二 安装过程 (下面的1-3的所以操作都在amoeba服务器上面) 1 首先安装jdk环境,下载,安装,设置环境变量 vi

实现MySQL读写分离,MySQL性能调优

实现MySQL读写分离 1.1 问题 本案例要求配置2台MySQL服务器+1台代理服务器,实现MySQL代理的读写分离: 用户只需要访问MySQL代理服务器,而实际的SQL查询.写入操作交给后台的2台MySQL服务器来完成 其中Master服务器允许SQL查询.写入,Slave服务器只允许SQL查询 1.2 方案 使用4台RHEL 7.2虚拟机,如图-1所示.其中192.168.4.10.192.168.4.20分别作为MySQL主.从服务器,是整个服务的后端:另一台 192.168.4.100

Database基础(六):实现MySQL读写分离、MySQL性能调优

一.实现MySQL读写分离 目标: 本案例要求配置2台MySQL服务器+1台代理服务器,实现MySQL代理的读写分离: 用户只需要访问MySQL代理服务器,而实际的SQL查询.写入操作交给后台的2台MySQL服务器来完成 其中Master服务器允许SQL查询.写入,Slave服务器只允许SQL查询 方案: 使用4台RHEL 7.2虚拟机,如下图所示.其中192.168.4.10.192.168.4.20分别作为MySQL主.从服务器,是整个服务的后端:另一台 192.168.4.100作为MyS

实现MySQL读写分离 部署集群基础环境(有图)

实现MySQL读写分离 部署集群基础环境 1 实现MySQL读写分离1.1 问题 本案例要求配置2台MySQL服务器+1台代理服务器,实现MySQL代理的读写分离: 用户只需要访问MySQL代理服务器,而实际的SQL查询.写入操作交给后台的2台MySQL服务器来完成 其中Master服务器允许SQL查询.写入,Slave服务器只允许SQL查询 1.2 方案 使用4台RHEL 7.2虚拟机,如图-1所示.其中192.168.4.10.192.168.4.20分别作为MySQL主.从服务器,是整个服

基于MYCAT中间件实现MYSQL读写分离

基于mycat实现mysql读写分离 完成主从复制的配置 /* 主节点:192.168.47.101 从节点:192.168.47.102 */ /*mycat为同一网段客户端*/ /* 修改主节点基础配置文件 */ /* */ [mysqld] server-id=101 log-bin /*重启服务 */ #systemctl restart mariadb /*创建从节点的账号 */ CREATE USER 'xie'@'192.168.47.102' IDENTIFIED BY '123