Maison >base de données >tutoriel mysql >使用amoeba实现mysql读写分离
使用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
#监听端口,将端口只监听于内网
查询路由
#因为需要配置读写分离,由谁读谁写都需要路由的
服务名称来自于dbserver.xml
编辑dbserver
[root@node3 conf]# vimdbServers.xml
每个名称都是由dbserver参数进行定义的,如下所示:
而且多个dbserver可以放到一个组内,可对其实现负载均衡的效果,如下所示:
说明定义了组内包含了多个服务器,而且服务器是虚拟机的
多个服务器之间还可以实现loadbalance ,算法为1 ,1为rr 2为基于权重rr 3为sver1 和 sver2 做高可用
对我们现在而言,我们暂时不需要负载均衡
配置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
配置监听端口以及公共继承用户名
配置后端mysql节点
修改调用server
保存退出并更改amoeba配置文件
修改queryRouter 默认将我们的请求路由到定义的组内
#加入以下参数,或将参数注释去掉
定义客户端连接amoeba的时候的密码
#注意的是这里不是链接至数据库的密码而是链接amoeaba的密码,而后amoeaba代理用户去连接mysql,因此在dbServer中定义的是amoeba本身到mysql服务器中请求使用的账号密码
这里定义用户名为root密码为hello
&nbs