MySQL读写分离--mysql-proxy和amoeba

静态分离:直接将服务器地址写入程序

动态分离:通过代理服务器对数据进行读写操作,由代理服务器判定读写操作,在主服务器上写数据,在

从服务器上读数据。

好处:只在一台服务器上进行读或写操作,可以减少服务器的工作量,提高效率和服务器性能

进行写操作时(在代理服务器上操作语句,写入master),slave利用主从复制同步数据

三台服务器:主服务器10.0.10.1、从服务器10.0.10.2、代理服务器10.0.10.3

两种方法实现:使用MySQL-proxy实现、使用amoeba实现

1、使用mysql-proxy实现读写分离

# ./mysql-proxy --proxy-backend-addresses=10.0.10.1:3306 --proxy-read-only-backend-addresses=10.0.10.2:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon --user=mysql --log-level=warning --log-file=/var/log/mysql-proxy.log --max-open-files=2048 --event-threads=4 --proxy-address=10.0.10.3:3306

--proxy-backend-addresses            指定主服务器地址(写数据)

--proxy-read-only-backend-addresses  指定从服务器地址(读数据)

--proxy-lua-script                   指定用于读写分离的脚本程序

--daemon                             指定以守护进程的方式运行

--user=mysql                         指定运行的用户

--log-level                          指定日志记录级别

--log-file                           指定日志文件位置

--max-open-files                     指定最大可打开的文件数,受操作系统限制

--event-threads                      设置工作线程数

--proxy-address                      设置监听的本机地址和端口

获取mysql-proxy帮助

# ./mysql-proxy --help         \\基本选项帮助

# ./mysql-proxy --help-proxy   \\代理选项帮助

在主从服务器上分别对代理服务器进行授权,使代理服务器能够使用主从服务器上的此用户进行连接主从。

mysql> grant all on *.* to ‘repuser‘@‘10.0.10.3‘ identified by ‘123123‘;

mysql> flush privileges;

2、使用amoeba实现读写分离

(1)安装jdk

# tar xf jdk-7u51-linux-x64.tar.gz -C /usr/local/

# mv jdk1.7.0_51 java

(2)编辑/etc/profile文件,设置java环境变量

# vim /etc/profile

放在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL之前

JAVA_HOME="/usr/local/java"

CLASS_PATH="/usr/local/java/jre:/usr/local/java/lib"

export JAVA_HOME CLASS_PATH

PATH="$PATH:/usr/local/amoeba/bin:/usr/local/java/bin"

# source /etc/profile

(3)查看和调整java的默认版本

# java -version

[[email protected] local]# which java

/usr/bin/java               \\本身有java 的路径填/usr/bin/java

# alternatives --install /usr/local/java/bin/java java /usr/local/java/bin/java 100  \\在系统中登记java版本和设置优先级

# alternatives --display java   \\显示java信息

# alternatives --config java    \\设置java的默认版本

(4)安装和配置amoeba实现读写分离

# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/

# mv amoeba-mysql-3.0.5-RC amoeba

# vim dbServers.xml    \\定义后端服务器信息    与主从服务器相连

<property name="sendBufferSize">256</property>    \\设置发送缓冲区大小

<property name="receiveBufferSize">256</property> \\设置接收缓冲区大小

<property name="port">3306</property>       \\设置后端服务器端口

<property name="schema">zz</property>     \\设置代理默认连接的数据库

<property name="user">root</property>

<property name="password">123123</property>  \\设置连接后端服务器的密码

===

<dbServer name="master1"  parent="abstractServer">  \\定义后端服务器(主服务器)

<factoryConfig>

<property name="ipAddress">10.0.10.1</property>

</factoryConfig>

</dbServer>

<dbServer name="slave1"  parent="abstractServer">  \\定义后端服务器 (从服务器)

<factoryConfig>

<property name="ipAddress">10.0.10.2</property>

</factoryConfig>

</dbServer>

===

<dbServer name="master" virtual="true">   \\定义服务器池

<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

<property name="loadbalance">1</property>  \\定义负载均衡算法

<property name="poolNames">master1</property> \\添加服务器,多个用逗号隔开

</poolConfig>

</dbServer>

<dbServer name="slave" virtual="true">  \\定义服务器池

<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

<property name="loadbalance">1</property>

<property name="poolNames">slave1</property>

</poolConfig>

</dbServer>

======

# vim amoeba.xml       \\定义代理信息

<property name="port">3306</property>   \\设置代理服务器监听的端口

<property name="ipAddress">10.0.10.3</property> \\设置代理监听的地址

<property name="user">root</property>  \\设置代理服务器使用的用户名

<property name="password">123123</property>  \\设置代理服务器使用的密码

<property name="defaultPool">master</property>  \\设置默认的服务器池,一般除

select,insert,update,delete等的其它操作都在默认的服务器进行

<property name="writePool">master</property>  \\执行写操作的服务器池

<property name="readPool">slave</property>    \\执行读操作的服务器池

<property name="needParse">true</property>

# vim jvm.properties   \\设置java内存分配信息

JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss512k -XX:PermSize=32m -XX:MaxPermSize=128m"

# vim access_list.conf  \\定义访问控制列表

10.0.10.100:no

10.0.*.*:yes

(5)启动amoeba

#cd /usr/local/amoeba/bin

#./launcher &

关闭amoeba

#./shutdowm

(6)实现数据分割

水平分割:将关键字段按特定的算法存放到不同的服务器

垂直分割:将数据按业务的不同分别保存到不同的服务器

水平分割

# vim rule.xml

<tableRule name="stu" schema="zz" defaultPools="master1,master2">

<rule name="rule1">

<parameters>id</parameters>

<expression><![CDATA[ id % 2 == 0 ]]></expression>

<defaultPools>master1</defaultPools>

<readPools>master1</readPools>

<writePools>master1</writePools>

</rule>

<rule name="rule2">

<parameters>id</parameters>

<expression><![CDATA[ id % 2 == 1 ]]></expression>

<defaultPools>master2</defaultPools>

<writePools>master2</writePools>

<readPools>master2</readPools>

</rule>

</tableRule>

====

在代理服务器上操作

[[email protected] ~]# mysql -u root -h 10.0.10.3 -paixocm -e "insert into zz.stu(id,name) values(1,‘张三‘)"

[[email protected] ~]# mysql -u root -h 10.0.10.3 -paixocm -e "insert into zz.stu(id,name) values(2,‘李四‘)"

[[email protected] ~]# mysql -u root -h 10.0.10.3 -paixocm -e "insert into zz.stu(id,name) values(3,‘王五‘)"

[[email protected] ~]# mysql -u root -h 10.0.10.3 -paixocm -e "insert into zz.stu(id,name) values(4,‘赵六‘)"

mysql> select * from stu;

+----+--------+

| id | name   |

+----+--------+

|  2 | 李四 |

|  4 | 赵六 |

+----+--------+

mysql> select * from stu;

+----+--------+

| id | name   |

+----+--------+

|  1 | 张三 |

|  3 | 王五 |

+----+--------+

=======

垂直分割

<tableRule name="user_info" schema="weblog" readPools="slave1" writePools="master1" />

<tableRule name="user_info" schema="webchat" readPools="slave2" writePools="master2"/>

时间: 2024-10-12 15:24:26

MySQL读写分离--mysql-proxy和amoeba的相关文章

企业 - mysql 读写分离(proxy)

                                                              MySQL Proxy MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包括:负载平衡,故障.查询分析,查询过滤和修改等等. MySQL Proxy就是这么一个中间层代理,简单的说,MySQL Proxy就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,

Mysql读写分离-Mysql router

原理:MySQL router根据端口来区分读写,把连接读写端口的所有请求发往master,连接只读端口的所有请求以轮询方式发往多个slave,从而实现读写分离 主:   SQL-Master      192.168.200.101/24 从:   SQL-Slave      192.168.200.102/24,192.168.200.103/24 mysql-router 192.168.200.104/24 使用rpm安装mysql-router rpm -ivh https://de

keepalived+amoeba+mysql-mmm+mysql实现mysql读写分离及高可用

最近尝试了一下mysql的读写分离和高可用的搭建.搭好之后体验了一下,效果还不错.这里跟大家分享一下. 1.首先介绍一下mysql-mmm这个工具是干嘛使的? 众所周知,mysql自身提供了AB复制.我们也可以很轻松的实现master-master双向复制,同时再为其中的一个master节点搭建一个slave库.这样就实现了master1与master2之间的双向复制,同时master1与slave1之间主从复制这样的架构.这样整个体系中就存在两个master,正常情况下只有一个master对外

MySQL 读写分离 (基于Amoeba)

一.MySQL读写分离原理 主数据库处理事务性查询,从数据库处理select查询.数据库复制用来把事务性查询导致的变更同步到从数据库中. 二.最为常见的读写分离有两种: 1.基于程序代码实现 在代码中根据select,insert进程路由分类: 优点:性能好,因为在代码中实现,不需要额外的硬件设备: 缺点:需要开发人员来实现,对代码改动比较大,不适合大型复杂应用: 2.基于代理层实现 MySQL-Proxy:隶属于MySQL开源项目: Amoeba:Amoeba是一个以MySQL为底层数据存储,

使用amoeba实现mysql读写分离

使用amoeba实现mysql读写分离 amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求.与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便 amoeba使用java所研发,但是amoeba不支持分布式事物(据说现在最新版本已经支持事物),如果用到分布式事物的话不建议使用amoeba. mys

Amoeba实现Mysql读写分离

环境规划 Amoeba读写分离器 172.16.254.144/16 Mysql服务器(master) 172.16.254.150/16 Mysql服务器(slave) 172.16.254.151/16 一.先实现mysql主从复制,在master上使用yum安装mysql [[email protected] mysql]# yum -y install mysql mysql-server 启用二进制日志,编辑/etc/my.cnf在[mysqld]下添加如下行: log-bin = /

关于Mysql Proxy LUA实现Mysql读写分离

关于Mysql Proxy LUA读写分离是本文要介绍的内容,主要是来了解Mysql Proxy LUA的学习内容,具体内容来看本文详解,先来下载匹配的版本: http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/ 下载最新版的二进制版本以mysql-proxy-0.8.0-linux-glibc2.3-x86-32bit为例.www.lua.org 下载lua. 1.通过mysql代理mysql-proxy来实现mysql的读写分离. MyS

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

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

Amoeba实现Mysql读写分离部署文档

以下所有理解纯属个人理解,如若有误欢迎指出,不胜感激--o(∩_∩)o 两台服务器配置MYSQL主从复制实现数据高可用,这时读与写操作都有由master服务器来完成的,而从服务器只是复制了mster服务器的数据,这时可以利用一台服务器配置Amoeba实现mysql读写分离, master负责写,slave负责读取,当然 也可以有多个salve-- 从而减轻master服务器的压力,实现负载分摊: 拓扑图: Mysql主从复制原理: 两台mysql服务器一个作为master一个为slave:mas

mysql读写分离amoeba实现

用amoeba配合mysql主从构建mysql读写分离 1 mysql主从配置 mysql master192.168.11.177 mysql slave192.168.11.178 amoeba 主机192.168.11.179 俩台虚拟机上 yum install mysqlmysql-serevr mysql-devel(没有用,防止以后用) /etc/init.d/mysqldstart mysqladmin -u rootpassword '123456' chkconfig mys