欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

使用amoeba实现mysql读写分离

程序员文章站 2022-05-22 08:42:38
...

使用amoeba实现mysql读写分离 amoeba 是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、 读写分离 、高可用性等需求。与MySQ

使用amoeba实现mysql读写分离

amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便

amoeba使用java所研发,但是amoeba不支持分布式事物(据说现在最新版本已经支持事物),如果用到分布式事物的话不建议使用amoeba。

mysql-proxy支持分布式事物 但需要自己开发样本,如果必须支持事物的话,必须将其大事物切割成小事物并且都在单机上完成,不建议用分布式,那么amoeba就可以发挥作用了,此外amoeba还提供了监控机制,可以监听后端数据库是否存活

Amoeba主要解决以下问题:

·数据切分后复杂数据源整合

·提供数据切分规则并降低数据切分规则给数据库带来的影响

·降低数据库与客户端连接

·读写分离路由

原理就不再进行描述了,我们直接来部署amoeba

规划

首先mysql一主一从都工作在内网中,面向用户的只有amoeba节点,amoeba需要监听在3306端口,以模拟mysql的方式监听用户的请求

服务器角色

服务器IP

Amoeba

10.12.33.57

Mysql-Master

10.12.33.58

Mysql-Slave

10.12.33.59

配置JDK环境

由于amoeba是由java所研发,所以首先需要安装jdk环境

[root@test tools]#chmod +x jdk-6u31-linux-x64-rpm.bin

[root@test tools]#./jdk-6u31-linux-x64-rpm.bin

配置环境变量

[root@test tools]# cat/etc/profile.d/java.sh

exportJAVA_HOME=/usr/java/latest

export PATH=$JAVA_HOME/bin:$PATH

[root@test tools]#source /etc/profile

[root@test tools]# echo $JAVA_HOME

/usr/java/latest

[root@test tools]# java-version

java version"1.6.0_31"

Java(TM) SE RuntimeEnvironment (build 1.6.0_31-b04)

Java HotSpot(TM) 64-BitServer VM (build 20.6-b01, mixed mode)

安装amoeba

[root@test ~]# cd/usr/local/amoeba-mysql-2.2.0/

[root@test ~]# cd /usr/local/amoeba-mysql-2.2.0

[root@testamoeba-mysql-2.2.0]# tar xf amoeba-mysql-binary-2.2.0.tar.gz

[root@node3amoeba-mysql-2.2.0]# ll
total 3148
-rw-r--r-- 1 root root 3161433 Jul 31 10:33 amoeba-mysql-binary-2.2.0.tar.gz
drwxr-xr-x 2 root root 4096 Jul 31 10:33 benchmark #
压力测试工具
drwxr-xr-x 2 root root 4096 Feb 29 2012 bin #二进制程序所在位置
-rw-r--r-- 1 root root 3976 Aug 29 2012 changelogs.txt
drwxr-xr-x 2 root root 4096 Jul 31 10:33 conf #配置文件路径
drwxr-xr-x 3 root root 4096 Jul 31 10:33 lib #jar包所在路径
-rw-r--r-- 1 root root 34520 Aug 29 2012 LICENSE.txt
-rw-r--r-- 1 root root 2031 Aug 29 2012 README.html

对我们而言只需要 dbServers.xml以及dbServers.xml 这两个文件即可

将amoeba加入至环境变量

[root@testamoeba-mysql-2.2.0]# cat /etc/profile.d/amoeba.sh

exportAMOEBA_HOME=/usr/local/amoeba-mysql-2.2.0/

exportPATH=$AMOEBA_HOME/bin:$PATH

[root@test amoeba-mysql-2.2.0]#!source

source /etc/profile

配置Mysql主从环境

[root@node2 tools]# tarxf mysql-5.6.13-linux-glibc2.5-x86_64.tar.gz
[root@node2 tools]# mv mysql-5.6.13-linux-glibc2.5-x86_64 /usr/local/mysql

[root@node2 mysql]#useradd -r mysql

[root@node2 mysql]#chown -R root.mysql ./*

创建数据目录

[root@node2 mysql]#mkdir /data/mydata -p

更改数据目录权限

[root@node2 mysql]#chown -R mysql.mysql /data/

[root@node1 mysql]# cpsupport-files/mysql.server /etc/init.d/mysqld

[root@node1 mysql]#chmod +x /etc/init.d/mysqld

复制配置文件,但是注意的是5.6的my-default.cnf 中没有任何的内容,如果有需求,则需要将5.5的配置文件复制到5.6上即可,否则要自行提供配置

如果我们不提供配置也可以启动,因为默认都是有设定好的参数

修改my.cnf

[root@node1 ~]# grep -v'#' /etc/my.cnf | grep -v "^$"

[client]

port = 3306

socket = /tmp/mysql.sock

[mysqld]

port = 3306

socket = /tmp/mysql.sock

skip-external-locking

key_buffer_size = 256M

max_allowed_packet = 1M

table_open_cache = 256

sort_buffer_size = 1M

read_buffer_size = 1M

read_rnd_buffer_size =4M

myisam_sort_buffer_size= 64M

thread_cache_size = 8

query_cache_size= 16M

thread_concurrency = 2

datadir = /mydata/data

log-bin=mysql-bin

binlog_format=row

server-id= 58

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=4

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log_events=1

report-port=3306

report-host=node1

[mysqldump]

quick

max_allowed_packet =16M

[mysql]

no-auto-rehash

[myisamchk]

key_buffer_size = 128M

sort_buffer_size = 128M

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

将配置文件复制到slave节点并修改参数:

server-id= 59

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=4

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log_events=1

report-port=3306

report-host=node2

保存退出,并在各节点初始化mysql数据库

[root@node1 mysql]#scripts/mysql_install_db --user=mysql --datadir=/mydata/data/

[root@node1 mysql]# ls/mydata/data/

ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index performance_schema test

启动mysql数据库

[root@node2 mysql]#/etc/init.d/mysqld start

连接mysql 查看主节点状态

mysql> show masterstatus;

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

| File | Position | Binlog_Do_DB |Binlog_Ignore_DB | Executed_Gtid_Set |

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

| mysql-bin.000003| 151 | | | |

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

1 row in set (0.00 sec)

在主库授权

mysql> grantreplication slave,replication client on *.* to 'reluser'@'10.12.33.%'identified by 'replpass';

Query OK, 0 rowsaffected (0.00 sec)

mysql> flushprivileges;

Query OK, 0 rowsaffected (0.00 sec)

基于GTID模型的时候启动从节点比较独特

切换至从节点

mysql> CHANGE MASTERTOMASTER_HOST='10.12.33.58',MASTER_USER='reluser',MASTER_PASSWORD='replpass',MASTER_AUTO_POSITION=1;

Query OK, 0 rowsaffected, 2 warnings (0.03 sec)

开启slave功能

mysql> start slave;

Query OK, 0 rows affected,1 warning (0.00 sec)

查看是否同步

mysql> show slavestatus\G

***************************1. row ***************************

Slave_IO_State: Waiting formaster to send event

Master_Host: 10.12.33.58

Master_User: reluser

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000003

Read_Master_Log_Pos: 556

Relay_Log_File:node2-relay-bin.000002

Relay_Log_Pos: 766

Relay_Master_Log_File: mysql-bin.000003

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

验证主从是否同步

在主库创建数据库或表,并在从库上查看是否被同步

mysql> createdatabase hello;

Query OK, 1 rowaffected (0.00 sec)

在从库上查看是否被同步

mysql> show databases;

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

| Database |

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

| information_schema |

| hello |

| mysql |

| performance_schema |

| test |

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

5 rows in set (0.01sec)

验证完毕,目前主从同步已没有问题,接下来配置Amoeba

Amoeba配置文件简解

[root@node3 local]# cp-fra amoeba-mysql-2.2.0 amoeba-mysql-2.2.0.bak

[root@node3 local]# cdamoeba-mysql-2.2.0/conf

amoeba.xml配置说明

首先段 说明代理参数

而后有很多 来定义服务,所以段中会定义很多

当amoeba代理用户向后端访问的时候,其自己指定以哪个用户和密码向后端访问,而我们向后端访问的用户是否应该具有前端用户所访问具有相关属性及权限

为了使其简化,后端的数据库节点需保持一致,但是这样也有一定风险,如果其中一台机器被攻破,所有其他服务器都会有风险

修改面向连接的端口

[root@node3 conf]# vimamoeba.xml

#将端口改为3306

3306

#监听端口,将端口只监听于内网

10.12.33.57

查询路由

#因为需要配置读写分离,由谁读谁写都需要路由的

服务名称来自于dbserver.xml

编辑dbserver

[root@node3 conf]# vimdbServers.xml

每个名称都是由dbserver参数进行定义的,如下所示:

而且多个dbserver可以放到一个组内,可对其实现负载均衡的效果,如下所示:


127.0.0.1





127.0.0.1

说明定义了组内包含了多个服务器,而且服务器是虚拟机的



多个服务器之间还可以实现loadbalance ,算法为1 ,1为rr 2为基于权重rr 3为sver1 和 sver2 做高可用

1


server1

对我们现在而言,我们暂时不需要负载均衡

配置Amoeba并实现单点读操作

准备环境

服务器角色

服务器IP

Amoeba

10.12.33.57

Mysql-Master

10.12.33.58

首先登陆Mysql服务器对其数据库授权使其拥有读写权限

mysql> grant all on*.* to 'root'@'10.12.33.%' identified by 'mypass';

Query OK, 0 rowsaffected (0.00 sec)

mysql> flushprivileges;
Query OK, 0 rows affected (0.00 sec)

查看用户信息

mysql> show grants for 'root'@'10.12.33.%';

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

| Grants forroot@10.12.33.% |

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

| GRANT ALL PRIVILEGESON *.* TO 'root'@'10.12.33.%' IDENTIFIED BY PASSWORD'*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |

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

1 row in set (0.00 sec)

修改amoeba配置,编辑dbServer.xml

配置监听端口以及公共继承用户名

3306 #启动端口
test #默认打开的库
root #用户名
mypass #定义的连接密码

配置后端mysql节点

node1" parent="abstractServer">

10.12.33.58

修改调用server

node1

保存退出并更改amoeba配置文件

修改queryRouter 默认将我们的请求路由到定义的组内

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

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

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

1500

server1

#加入以下参数,或将参数注释去掉

node1

true

定义客户端连接amoeba的时候的密码

#注意的是这里不是链接至数据库的密码而是链接amoeaba的密码,而后amoeaba代理用户去连接mysql,因此在dbServer中定义的是amoeba本身到mysql服务器中请求使用的账号密码

这里定义用户名为root密码为hello

root

hello

&nbs

使用amoeba实现mysql读写分离

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。