MySQL读写分离-amoeba

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

1、理论部分

1.1、为什么需要MySQL读写分离

随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上。这时集中式数据库系统表现出它的不足:

1)集中式处理,势必造成性 能瓶颈;

2)应用程序集中在一台计算机上运行,一旦该计算机发生故障,则整个系统受到影响,可靠性 不高;

3)集中式处理引起系统的规模和配置都不够灵活,系统的可扩充性差。在这种形势下,集中式数 据库将向分布式数据库发展。

1.2、MySQL读写分离的架构

wKiom1YR7kbi-uhZAACMH5QEqK0019.jpg

前端:

N个Application Server

后端:

Master <---> Relay Master ---> Muti Slave

1.3、如何实现读写分离

通常来说有两种方式实现读写分离:

1.3.1、应用程序层实现

wKioL1YSVOjwgeuNAAAbKi791Ko993.jpg

1)应用程序层实现指的是在应用程序内部及连接器中实现读写分离。

例如:

com.mysql.jdbc.ReplicationDriver

mysqlnd_ms

2)优点:

程序内部实现读写分离,安装即可使用

减少部署难度

访问压力在一定级别以下,性能很好。

3)缺点:

架构一旦调整,代码要跟着变,不够灵活。

难以实现高级应用,如自动分库、分表。

无法适用于更大型的应用场景。

1.3.2、中间层实现

wKiom1YSVP3jqi4DAABMSkMEtc8370.jpg

1)中间层实现指的是外部中间件程序实现读写分离,例如:

mysql-proxy

amoeba

Atlas(Qihoo360)

Cobar(Alibaba)

TDDL(Taobao)

2)优点:

架构设计上更加灵活。

可在程序上实现一些高级控制,如透明化水平拆分、Failover、流量控制。

依靠一些技术手段提高MySQL性能,如连接池。

3)缺点:

1)需要有一定开发实力和运维团队的支持。

1.4、Amoeba实现读写分离

1.4.1、优点

1)这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。

2)座落与 Client、DB Server(s)之间,对客户端透明。

3)具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。

4)通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多 企业的生产线上面使用。

5)Amoeba目前不支持事务

1.4.2、缺点

1)目前还不支持事务

2)暂时不支持存储过程(近期会支持)

3)不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)

4)暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致

1.5、应用概述

1)MySQL Replication读写分离是很多企业经常使用的技术。

2)读写分离涉及到高负载环境下的MySQL架构设计。

3)读写分离发展过程:简单读写分离->水平拆分读写分离->业务逻辑分离。

4)读写分离常见框架:

M-S

M-S-Muti Slave

M-M-Muti Slave

Muti Master-Muti Master-MutiSlave

5)复杂的架构设计往往与高可用技术整合使用。

2、实验部分

2.1、实验基础

2.1.1、实验环境

以下实验需要“mysql replication(主从复制)(一)MS模式”的实验为基础,如果你没有MS环境,请参阅以下链接。

http://cmdschool.blog.51cto.com/2420395/1696474

2.1.2、实验环境信息

1)MySQL-node(Amoeba实现的数据库分发节点)

ipaddress=10.168.0.110

hostname=sql-a

2)MySQL Master(数据库节点)

ipaddress=10.168.0.103

hostname=sql-m

3)MySQL Slave(数据库节点)

ipaddress=10.168.0.104

hostname=sql-s

2.1.3、yum的安装

In MysQL-node

1
yum -y  install  mysql

2.2、下载源


amoeba下载:

In MySQL-node:

1
2
3
cd  ~
wget http: //download .oracle.com /otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64 . tar .gz?AuthParam=1445836360_be02266de879eb81f370c5e6620e727c
wget http: //sourceforge .net /projects/amoeba/files/Amoeba %20for%20mysql /2 .2.x /amoeba-mysql-binary-2 .2.0. tar .gz /download

以下是官方发布源的地址,请按照自己实际选择:

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

http://sourceforge.net/projects/amoeba/files/

2.3、实验步骤

1)三台服务器均安装MySQL(MySQL-node可指装client)

2)MySQL-node上安装Amoeba

3)配置Amoeba

4)MySQL Master&Slave均需授权MySQL-node可以访问

5)MySQL Master&Slave上创建测试库与测试表

6)测试读写分离

2.3.1、安装Amoeba

Amoeba基于JAVA开发。因此,安装Amoeba还需要同时安装JDK

In MySQL-node

1
2
3
4
5
6
7
8
9
10
tar  zxvf jdk-7u79-linux-x64. tar .gz -C  /usr/local
cd  /usr/local
mv  jdk1.7.0_79/ jdk
echo  'export JAVA_HOME=/usr/local/jdk'  >> ~/.bashrc
. ~/.bashrc
echo  $JAVA_HOME
mkdir  -pv  /usr/local/amoeba
tar  zxvf amoeba-mysql-binary-2.2.0. tar .gz -C  /usr/local/amoeba
cd  /usr/local/amoeba/conf
ls

2.3.2、Amoeba配置文件

Amoeba的配置文件位于程序目录下的conf子目录。通过配置.xml文件,影响Amoeba运行

1)amoeba.xml           Amoeba主配置文件

2)dbServers.xml           数据库节点配置文件

3)functionMap.xml           函数配置文件

4)ruleFunctionMap.xml         规则函数配置文件

5)rule.xml               规则配置文件

6)access_list.conf             访问控制

2.3.3、amoeba.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!--port(默认监听端口)-->
< property  name = "port" >8066</ property >
<!--bind ipAddress(指定监听的逻辑地址)-->
< property  name = "ipAdress" >127.0.0.1</ property >
< property  name = "connectionFactory" >
     < bean  ...>
         <!--缓存大小-->
         < property  name = "sendBufferSize" >128</ property >
         < property  name = "receiveBufferSize" >64</ property >
     </ bean >
</ property >
< property  name = "authenticator" >
     < bean  ...>
         <!--前端应用程序通过Amoeba登录数据库时所使用的用户名和密码-->
         < property  name = "user" >amofu</ property >
         < property  name = "amofp" >amofp</ property >
     </ bean >
</ property >
<!--Amoeba监控报告-->
< service  name = "Amoeba Monitor Server"  ...>
     ...
</ service >
<!--配置读写分离-->
< queryRouter  ...>
     < property  name"defaultPool">Master</ property >
     < property  name"writePool">Master</ property >
     < property  name"readPool">Slave</ property >
</ queryRouter >

2.3.4、dbServers.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!-- 服务器组配置 -->
< dbServer  name = "abstractServer"  abstractive = "true" >
     < factoryConfig  ...>
         <!-- 后端数据库的端口号、默认所查的数据库、用户名和密码 -->
         < property  name = "port" >3306</ property >
         < property  name = "schema" >cmdschool</ property >
         < property  name = "user" >amou</ property >
         < property  name = "password" >amop</ property >
     </ factoryConfig >
</ dbServer >
<!-- 成员服务器1配置 -->
< dbServer  name = "Master"  parent = "abstractServer" >
     < factoryConfig >
         <!-- mysql ip -->
         < property  name = "ipAddress" >10.168.0.103</ property >
     </ factoryConfig >
</ dbServer >
<!-- 成员服务器2配置 -->
< dbServer  name = "Slave"  parent = "abstractServer" >
     < factoryConfig >
         <!-- mysql ip -->
         < property  name = "ipAddress" >10.168.0.104</ property >
     </ factoryConfig >
</ dbServer >
<!-- 服务器池配置 -->
< dbServer  name = "multiPool"  virtual = "true" >
     < poolConfig >
         <!-- Load balancing stategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA -->
         < property  name = "loadbalance" >1</ property >
         <!-- Separated by commas,such as: Master,Slave -->
         < property  name = "poolNames" >Master,Slave</ property >
     </ poolConfig >
</ dbServer >

2.3.5、授权Amoeba访问MySQL

所有前端应用程序都通过Amoeba访问真实数据库。因此,每个数据库都需要创建用户并授权Amoeba访问。

In Master

1
2
mysql>  create  database  cmdschool;
mysql>  create  table  t1(id  varchar (255));

In Master & Slave

1
2
mysql>  grant  all  on  cmdschool.*  to  amou@10.168.0.110 identified  by 'amop' ;
mysql> flush  privileges ;

MySQL-node

1
mysql -h10.168.0.103 -uamou -pamop

2.3.6、运行或停止Amoeba

1
2
3
cd  /usr/src/amoeba/bin
. /amoeba  start&
. /amoeba  stop

错误提示:

The stack size specified is too small, Specify at Least 160k

Error: Could not create the Java Virtual Machine.

Error: A fatal exception has occurred. Program will exit.

解决方法:

vim ./amoeba

默认值:

1
DEFAULT_OPTS= "-server -Xms256m -Xmx256m -Xss128k"

变更为:

1
DEFAULT_OPTS= "-server -Xms256m -Xmx256m -Xss256k"

重启服务:

1
2
. /amoeba  stop
. /amoeba  start&

2.3.7、开启防火墙

vim编辑/etc/sysconfig/iptables

1
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT

重启防火墙

1
/etc/init .d /iptables  restart

2.3.8、测试Amoeba

In Slave

1
mysql> stop slave;

In MySQL-node

1
2
3
4
5
mysql -h10.168.0.110 -uamofu -pamofp -P 8066
use cmdschool
show tables;
insert into t1 values ( "1" ),( "2" ),( "3" );
select  * from t1;

In Slave

1
mysql> start slave;

In MySQL-node

1
select  * from t1;








本文转自 tanzhenchao 51CTO博客,原文链接:http://blog.51cto.com/cmdschool/1701028,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
存储 关系型数据库 MySQL
MySQL 读写分离原理
MySQL 读写分离原理
62 0
MySQL 读写分离原理
|
4月前
|
SQL 关系型数据库 MySQL
小白带你学习linux的mysql服务(主从mysql服务和读写分离三十一)
小白带你学习linux的mysql服务(主从mysql服务和读写分离三十一)
64 0
|
3月前
|
SQL 关系型数据库 MySQL
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
Mycat【Mycat部署安装(核心配置及目录结构、安装以及管理命令详解)Mycat高级特性(读写分离概述、搭建读写分离、MySQL双主双从原理)】(三)-全面详解(学习总结---从入门到深化)
71 0
|
4月前
|
Java 关系型数据库 MySQL
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
40 0
|
30天前
|
关系型数据库 MySQL 数据库
使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤
使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤
59 0
|
4月前
|
关系型数据库 MySQL 数据库
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(一)
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(一)
|
4月前
|
关系型数据库 MySQL Java
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(二)
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(二)
|
4月前
|
SQL 关系型数据库 MySQL
MySQL 读写分离配置实践
MySQL 读写分离配置实践
78 0
MySQL 读写分离配置实践
|
4月前
|
负载均衡 关系型数据库 MySQL
mysql(六)读写分离
MySQL读写分离是一种常见的数据库架构设计模式,旨在提高系统的性能和可用性。它通过将读操作和写操作分离到不同的MySQL实例上来实现。
128 0
|
5月前
|
缓存 NoSQL 关系型数据库
redis 作为 mysql的缓存服务器(读写分离)
redis 作为 mysql的缓存服务器(读写分离)
50 0