1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > amoeba实现mysql主从读写分离_MySQL+Amoeba实现数据库主从复制和读写分离

amoeba实现mysql主从读写分离_MySQL+Amoeba实现数据库主从复制和读写分离

时间:2023-11-28 12:20:30

相关推荐

amoeba实现mysql主从读写分离_MySQL+Amoeba实现数据库主从复制和读写分离

MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的。通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性。实现数据的读写分离能带来的好处有:

增加物理服务器,提升机器处理能力,也就是拿硬件换性能。

主从只负责各自的读和写,极大程度缓解X锁和S锁争用。

slave可以配置myIasm引擎,提升查询性能以及节约系统开销。

master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步。

slave可以单独设置一些参数来提升其读的性能。

增加冗余,提高可用性。

常见的实现数据库读写分离的方案大致有两种:应用层,代理层

在应用层也就是在代码中进行操作,通过对数据库操作类型的不同手动指定数据源,可以通过AOP的方式进行实现,不过对于一个已经搭建起来并正在运行的系统来说,这个方案应该比较复杂。

另外一种实现方式是通过数据库代理层,代理对应用层呢个是透明的,所有的读写分离操作由代理层来完成,好处就是对于开发应用层来说是透明的,不需要管理数据源,缺点在于应用原来直接访问数据库现在变成了通过代理访问数据库,性能上肯定会有影响,不过如果代理层实现的很优秀的话这个影响应该不大。

通过代理层实现数据库读写分离又有两种方案可供选择,其一是使用MySQL-Proxy,另一种是使用Amoeba。最开始找到的实现方案是基于MySQL-Proxy的,由于它没有配置文件,所要完成的工作需要由Lua脚本来实现,这对于一个Lua门外汉来说压力不小。后来找到的Amoeba实现起来很简单,只需要简单地配置就能实现数据库的读写分离,所以这里记录我通过使用Amoeba来实现数据库读写分离的过程。

Amoeba简介:

Amoeba(变形虫)致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。 通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能。

Amoeba使用:

一、准备工作

amoeba使用java编写,所以运行amoeba的运行环境要安装好java环境,并配置好环境变量,jdk版本要在1.5以上,因为amoeba就是用jdk1.5编写的;我的服务器java版本为1.7。

amoeba是在主从同步的基础上工作的,所以要先配置好MySQL的主从同步功能,我在另一篇日志中记录了我实现Mysql主从同步的过程,可以参考:MySQL主从复制(Master-Slave)实践

amoeba服务器 :虚拟机 ip:182.92.172.80 amoeba版本3.0.5-RC mysql版本5. 5.32 Java环境1.7.0_60 操作系统linux

master服务器 :虚拟机 ip:182.92.172.80 mysql版本5. 5.32 操作系统centos6.5 (和amoeba在同一个服务器上,因为我只用了两个服务器)

slave服务器 :虚拟机 ip:123.57.44.85 mysql版本5.5.39 操作系统centos6.5

二、下载安装amoeba

下载地址:/projects/amoeba/files/Amoeba%20for%20mysql/3.x/,选择最新版本进行下载,我下载的版本为:amoeba-mysql-3.0.5-RC-distribution.zip

安装:把zip安装包解压到自己指定的服务器路径上就可以了,我把它放在了/usr/local/amoeba/amoeba-mysql-3.0.5-RC里面,解压后的文件结构如下图:

三、配置amoeba

Amoeba基础配置介绍:

想象Amoeba作为数据库代理层,它一定会和很多数据库保持通信,因此它必须知道由它代理的数据库如何连接,比如最基础的:主机IP、端口、Amoeba使用的用户名和密码等等。这些信息存储在$AMOEBA_HOME/conf/dbServers.xml中。

Amoeba为了完成数据切分提供了完善的切分规则配置,为了了解如何分片数据、如何将数据库返回的数据整合,它必须知道切分规则。与切分规则相关的信息存储在$AMOEBA_HOME/conf/rule.xml中。

当我们书写SQL来操作数据库的时候,常常会用到很多不同的数据库函数,比如:UNIX_TIMESTAMP()、SYSDATE()等等。这些函数如何被Amoeba解析呢?$AMOEBA_HOME/conf/functionMap.xml描述了函数名和函数处理的关系。

对$AMOEBA_HOME/conf/rule.xml进行配置时,会用到一些我们自己定义的函数,比如我们需要对用户ID求HASH值来切分数据,这些函数在$AMOEBA_HOME/conf/ruleFunctionMap.xml中定义。

Amoeba可以制定一些可访问以及拒绝访问的主机IP地址,这部分配置在$AMOEBA_HOME/conf/access_list.conf中

Amoeba允许用户配置输出日志级别以及方式,配置方法使用log4j的文件格式,文件是$AMOEBA_HOME/conf/log4j.xml。

在开始配置amoeba配置文件之前我们需要先了解为什么要做这些配置工作。

第一,如上第一条所述,Amoeba是通过代理MySQL服务来实现数据库的读写分离的,它必须要知道如何连接到需要被代理的数据库,因此需要被代理的数据库需要创建一个访问用户给amoeba,这样amoeba才能连接到数据库上。

第二,amobea把对客户端也就是应用层是透明的,不管amoeba如何实现的读写分离,它既然把数据库全都给代理了,那它就要为客户端提供一个类似原来mysql那样的连接,客户端就把当它是mysql,它其实是一个虚拟的mysql,对外提供mysql协议,客户端连接amoeba就象连接mysql一样,因此amoeba要为客户端提供一个可供连接的用户账号。

第三,amoeba内部是实现了多数据库的负载均衡、读写分离、可切片的,所以这部分的配置是它功能上的核心配置。

下面就正式开始配置amoeba

所有数据库创建amoeba访问的用户:

mysql>grant all on *.* to 'amoeba'@'182.92.172.80' identified by '123456'#创建用户并授权

mysql>flush privileges; #刷新权限

为了方便统一管理就把所有数据库创建的用户名和密码保持一致了

2.配置conf文件

在amoeba安装目录的conf文件夹下找到dbServer.xml和amoeba.xml文件,这两个文件是需要我们配置的

我的dbServer.xml文件配置如下:

1 <?xml version="1.0" encoding="gbk"?>

2

3

4

5

6

12

13

14

15 ${defaultManager}

16 64

17 128

18

19

20

21

22

23 yj_platform

24

25

26 amoeba

27

28 123456

29

30

31

32 500

33 500

34 1

35 600000

36 600000

37 true

38 true

39 true

40

41

42

43

44

45

46 182.92.172.96

47

48 3306

49

50

51

52

53

54

55 123.57.44.78

56

57 13306

58

59

60

61

71

需要我们关注的元素用标红字体显示出来了,在这里是指几个dbServer元素,需要手动修改的部分用黄色背景表示出来。

第一个dbServer元素其abstractive="true"属性表示这个一个抽象元素可以被其他dbServer元素扩展,类似于java里面的抽象类和类的继承之间的关系。这个dbServer里面配置amoeba连接它所代理的mysql数据库的连接信息,因为之前已经说过为了方便管理把每个数据库为amoeba访问创建的用户都统一了账号,在这里我把端口信息给注释掉了,因为我的slave数据库端口用的不是默认的3306,这种和ip,端口不一样的信息就没办法配置在通用的抽象dbServer里面了。

第二个dbServer取名为"maser",其parent="abstractServer"表示拓展了上面的抽象dbServer,在这里设置的是amoeba连接数据库具体的信息,因为每个数据库的ip肯定是不同的。

同样第三个dbServer取名为“slave”,连接信息是slave服务器。

在下面被我注释掉的第四个dbServer其name="multiPool" virtual="true"属性表示这是一个对多服务器池,这个配置使得amoeba可以把多个读数据库管理成一个读池,把多个写数据库管理成写池,在每个池中amoeba就能够实现负载均衡。由于我的主从同步只设置了一主一从,并不涉及到多个读数据库组成池的情况,所以我就把这个配置注释掉了。

接下来配置amoeba.xml文件,同样放上我的配置文件:

1 <?xml version="1.0" encoding="gbk"?>

2

3

4

5

6

7

8

9

10

11 8066

12

13

14

15

16

17

18

19

20 128

21 64

22

23

24

25

26

27

28 amoeba

29

30 password

31

32

33

34 ${amoeba.home}/conf/access_list.conf

35

36

37

38

39

40

41

42

43

44

45 128

46

47

48 500

49

50

51 utf8

52

53

54 60

55

56

57

58

59

63

64

65 com..AuthingableConnectionManager

66

67

68

69

70

71 ${amoeba.home}/conf/dbServers.xml

72

73

74

75

76

77 ${amoeba.home}/conf/rule.xml

78 ${amoeba.home}/conf/ruleFunctionMap.xml

79

80

81 ${amoeba.home}/conf/functionMap.xml

82 1500

83 slave1

84 master

85 slave1

86 true

87

88

amoeba.xml文件中需要配置的地方也不多,首先要配置的是service标签,其中需要配置的地方有三个port,user,password。这里的端口,用户名和密码其实就是为了虚拟出一个mysql链接做准备的(非真实,amoeba服务器可以不安装真实的mysql数据库),端口默认的事8066,可以修改但是不要跟现有的端口冲突,用户名和密码是客户端连接amoeba虚拟出来的mysql连接的用户名密码,和之前mysql数据库创建给amoeba的用户账号不同。在这里有一个注释掉的ipAddress属性,如果Amoeba所在的服务器在多个网络环境内你可以定义该机器的其中一个IP来指定Amoeba所服务的网络环境,但是如果设置为127.0.0.1将导致其他机器无法访问Amoeba的服务。

之后配置queryRouter标签,这是amoeba真正实现读写分离所产生作用的地方,之前的配置都是为了该处做准备。

该处有三个地方需要我们配置,首先是defaultPool,一些除了SELECT\UPDATE\INSERT\DELETE的语句都会在defaultPool执行。

之后是writePool,这里是配置写库也就是主数据库,在这里是前面dbServer.xml中配置的master。

resdPool配置的是读库,我这里是slave1,如果读库有多个这里可以填读池,也就是我在dbServer.xml中注释掉的那个dbServer配置的信息。在这里就完成了读写分离(主写从读)的配置。我的配置中是把写操作限制在了master中,把读限制在了slave中,如果我把defaultPool改成master的话那么读操作就会在master和slave之间做负载均衡了。

四、配置jvm运行参数

运行在jdk1.7环境中的amoeba要求xss参数必须大于228才能启动JVM

所以在amoeba安装目录下的jvm.properties文件中进行参数设置:

1 # app名字2 APP_NAME=Amoeba-MySQL3

4 # app版本号5 APP_VERSION=3.0.0-beta6

7 # 日志输出路径,log4j中可引用参数 ${project.output}8

9 APP_OUTPUT_PATH=$PROJECT_HOME/logs10

11 # 应用程序的PID文件存放路径, 默认存放在: ${project.home}/${APP_NAME}.pid12

13 #APP_PID_PATH=/temp/logs/$APP_NAME

14

15

16 # 控制台输出到日志文件17

18 APP_CONSOLE_LOG=$APP_OUTPUT_PATH/console.log

19

20

21 # 程序相关的配置参数22

23 #APP_OPTIONS="-DmyParam=value1 -DmyParam2=value2"24

25 # 启动参数26

27 #APP_ARGS="args0 "28

29

30 # JVM相关的参数,包括内存配置、垃圾回收策略31

32 JVM_OPTIONS="-server -Xms512m -Xmx1024m -Xss512k -XX:PermSize=16m -XX:MaxPermSize=96m"33

34

35 # 应用程序忽略的信号列表,以逗号分割,程序shutdown的信号为15(可用 kill -15pid 可让程序文明的shutdown,请不要在这儿填15)36

37 IGNORE_SIGNALS=1,2

如上所有的配置工作就已经完成了,可以看出amoeba所需的全部配置工作还是比较少的。

启动amoeba:

启动脚本在amoeba安装目录的bin目录下运行lancher:

root@iZ25j1wvn7pZ:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin# ./launcher-12-12 21:38:05,748 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA

log4j:WARN ip access configload completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/access_list.conf-12-12 21:38:06,037 INFO net.ServerableConnectionManager - Server listening on /127.0.0.1:8066.-12-12 22:14:44 [INFO] Project Name=Amoeba-MySQL, PID=2596 , System shutdown....-12-12 22:14:48 [INFO] Project Name=Amoeba-MySQL, PID=3324, starting...

log4j:WARN log4j configload completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/log4j.xml-12-12 22:14:49,405 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA

log4j:WARN ip access configload completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/access_list.conf-12-12 22:14:49,664 INFO net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.-12-14 15:02:14 [INFO] Project Name=Amoeba-MySQL, PID=3324 , System shutdown....-12-14 15:02:20 [INFO] Project Name=Amoeba-MySQL, PID=12246, starting...

log4j:WARN log4j configload completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/log4j.xml-12-14 15:02:20,955 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA

log4j:WARN ip access configload completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/access_list.conf-12-14 15:02:21,224 INFO net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.

运行结果如上所示表示启动成功。

之后可以通过amoeba连接到数据库,连接信息如下:

root@iZ25j1wvn7pZ:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin# mysql -h182.92.172.80 -P8066 -uamoeba -ppassword

Welcometo the MySQL monitor. Commands end with ; or\g.

Your MySQL connection idis 2049945506Server version: 5.1.45-mysql-amoeba-proxy-3.0.4-BETA (Ubuntu)

Copyright (c)2000, , Oracle and/or its affiliates. Allrights reserved.

Oracleis a registered trademark of Oracle Corporation and/orits

affiliates. Other names may be trademarksoftheir respective

owners.

Type'help;' or '\h' for help. Type '\c' to clear the currentinput statement.

mysql>

五、amoeba服务测试

从连接的server version 可以看出连接数据可的实例是amoeba-proxy实例不是mysql实例,这样就表示可以通过amoeba的访问账户连接amoeba服务了。之后就可以进行测试了,首先向数据库中添加一条记录,可以看见数据同时更新到master和slave中,主从同步功能是可以用的。之后在slave上停止slave服务,再通过amoeba写入数据,这时amoeba重新读出的数据就没有新插入的数据了,因为主从同步功能已经关掉了,写入的数据在master中,没有同步到slave中,而amoeba读数据是从slave中读取的,因此没有新加入的数据。之后打开slave的同步服务,再在amoeba中读取就可以读到之前添加的数据了。整体测试下来就保证了amoeba实现了读写分离功能。

参考资料:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。