mysql+amoeba 主从复制,读写分离,负载均衡

Amoeba是什么?
Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发,它位于与Client、DBServer(s)之间,对客户端透明。具有 负载均衡、高可用性、SQL过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果 。

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

需求案例:
有三个数据库节点分别命名为Master、Slave1、Slave2如下:
Master: Master (只写)
Slaves:Slave1、Slave2 (2个平等的数据库。只读/负载均衡)
案例实现Master、Slaves之间数据库主从复制、读写分离,负载均衡的高可用Mysql架构。

实验架构图:

系统环境:

数据库主从复制环境部署
一、mster:(10.100.246.241)
yum install -y mariadb
systemctl enable mariadb
systemctl start mariadb
1、修改mysql配置
找到主数据库的配置文件my.cnf(或者my.ini),我的在/etc/mysql/my.cnf,在[mysqld]部分插入如下两行:
[mysqld]
log-bin=mysql-bin //开启二进制日志
server-id=241 //设置server-id

2、重启数据库并重置
systemctl restart mariadb
mysql_secure_installation

3、启mysql,创建用于同步的用户账号,并授予对应的权限
打开mysql会话shell>mysql -uname -ppassword
分别创建两个用户,一个用户授权给slave01和slave02,另一个用户授权给amoeba服务器
slave username:slave ;password:123456
amoeba username:amoeba ;password:123456

mysql>CREATE USER slave@‘10.100.246.%‘ IDENTIFIED BY ‘123456‘;
mysql>GRANT REPLICATION SLAVE ON . TO slave@‘10.100.246.%‘ WITH GRANT OPTION;
mysql>GRANT ALL PRIVILEGES ON . TO amoeba@10.100.246.240 IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;

4、查看master状态,记录二进制文件名(mysql-bin.000002)和位置(245)
SHOW MASTER STATUS;

5、防火墙放行服务及端口

二、slave01和slave02:(10.100.246.242,10.100.246.243)
注:slave02操作步骤除了my.cnf配置里的server-id号不一样,其余操作步骤和slave01一样
yum install -y mariadb
systemctl enable mariadb
systemctl start mariadb
1、更改mysql配置
找到my.cnf配置文件,添加server-id
[mysqld]
server-id=242 //设置server-id,必须唯一;slave02 server-id=243

2、重启数据库并重置
systemctl restart mariadb
mysql_secure_installation

3、打开mysql会话,执行同步SQL语句(需要主服务器主机名,登陆凭据,二进制文件的名称和位置):
CHANGE MASTER TO MASTER_HOST=‘10.100.246.241‘, MASTER_USER=‘slave‘, MASTER_PASSWORD=‘123456‘, MASTER_LOG_FILE=‘mysql-bin.000002‘, MASTER_LOG_POS=245;

4、启动slave同步进程,并查看slave状态
mysql>start slave;
mysql>SHOW SLAVE STATUS;

5、建立amoeba用户,并授予相关权限,为部署amoeba做准备(两台从数据库都要添加)
GRANT ALL PRIVILEGES ON . TO amoeba@10.100.246.240 IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;

6、防火墙放行服务及端口

JDK环境部署:(amoeba使用java编写,所以运行amoeba的运行环境要安装好java环境,并配置好环境变量)
1、卸载系统自带的OpenJDK以及相关的java文件
rpm -aq | grep java
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64 java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64 java-1.7.0-openjdk-headless-1.7.0.141-2.6.10.5.el7.x86_64 java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64
java -version


2、下载最新稳定JDK
【注意】:JDK安装在哪个用户下,就是给哪个用户使用
下载地址为
2.1当前最新版本下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
  历史版本下载地址:  http://www.oracle.com/technetwork/java/javase/archive-139210.html

2.2粘贴地址到浏览器地址栏

根据版本,系统位数,选择tar.gz文件下载 (注:记得勾选license)

2.3下载完成后,将JDK包本地解压,通过winscp上传至amoeba服务器 /usr/java 目录 (注:没有java这个目录可自行建立)
2.4将/java目录中的文件授予执行权限
chmod o+x /usr/java/ -R

3、配置JDK环境变量
在文本的最后一行粘贴如下:
注意JAVA_HOME=/usr/java/jdk-11.0.2 就是你自己的目录
【注】:CentOS6上面的是JAVAHOME,CentOS7是{JAVA_HOME}
vim /etc/profile
#java environment
export JAVA_HOME=/usr/java/jdk-11.0.2
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin

4、刚刚设置的环境变量生效并检查是否安装成功
source /etc/profile 或者 . /etc/profile
java -version

Amoeba环境部署:(10.100.246.240)
一、准备工作
1、amoeba使用java编写,所以运行amoeba的运行环境要安装好java环境,并配置好环境变量,jdk版本要在1.5以上,因为amoeba就是用jdk1.5编写的;我的服务器java版本为11.0.2
2、amoeba是在主从同步的基础上工作的,所以要先配置好MySQL的主从同步功能

二、下载安装amoeba
1、下载地址:https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/3.x/
选择最新版本进行下载;我下载的版本为:amoeba-mysql-3.0.5-RC-distribution.zip

2、下载完成后,在本地将包解压,解压完成后,通过winscp工具将amoeba-mysql-3.0.5-RC文件上传至amoeba服务器/usr/amoeba目录下(注:amoeba目录自行建立)
3、授予该目录执行权限
[root@amoeba amoeba]# chmod o+x amoeba-mysql-3.0.5-RC/ -R

4、防火墙放行端口号

我们在amoeba文件夹中找到conf文件夹,其中我们需要配置的仅有dbServers.xml和amoeba.xm
5、编辑配置 /amoeba-mysql-3.0.5-RC/conf 目录下dbServers.xml文件
首先我们来看下name为abstractServer的dbServer标签,其中abstractive属性为true,意味着这是一个抽象的dbServer定义,可以由其他dbServer定义拓展,类似于抽象类,可以由其他类继承和扩展。其中需要我们手动修改的是端口(port),数据库(schema),用户名(user),密码(password);那么这里应该如何填写呢?本人第一次使用的时候也非常迷糊,其实我们应该填写的就是在master和slave上我们为amoeba服务器创建的用于连接master和slave数据库的用户,因此这里应该填写port——3306(默认端口无修改),schema——bob(bob数据库),user——amoeba(用户名),password——123456(密码)

而abstractServer下方的dbServer就是我们实际中需要使用的,关于dbServer,可以根据自己的情况书写,有几个需要配置的数据库,就填写几个,其中name可以自定义,最好书写有含义的名称,parent就填写abstractServer,因为我们要继承abstractServer,这样我们就可以在abstractServer的基础上进行扩展(继承了port,schema,user和password等属性),只需要添加独有的属性即可。
案列为一主两从,主为master,从一为slave01,从二为slave02。除了各自的dbServer之外,我们还可以新建一个dbServer作为数据库池,用于整合那些功能相同的数据库,案列中slave1和slave2都是从数据库,负责读取操作,我们就可以把它们集中在一起方便调用。其中属性为loadbalance代表负载均衡,默认值是1,代表轮询算法,poolNames属性就是让我们放置那些具有共同功能的dbServer,例如slave1,,slave2,其中不同的dbServer以英文逗号隔开

6、编辑配置 /amoeba-mysql-3.0.5-RC/conf 目录下amoeba.xml文件
配置完成dbSevers.xml之后,我们来配置amoeba.xml,首先我们来配置service标签,需要配置的地方有三点,port,user和password。其中port默认是8066,可以自行更改,但是不要跟现有端口起冲突,如非必要不建议更改。user和password则可以自定义,无需跟master和slave创建的用户一致。这里的端口,用户名和密码其实就是为了虚拟出一个mysql链接做准备的(非真实,amoeba服务器可以不安装真实的mysql数据库)

特别说明:在service标签中有一个被注释的ipAddress属性,该属性用于绑定可以链接amoeba虚拟出来的mysql的具体ip,如果不绑定,则amoeba服务器所在的网络环境(在同一个局域网下,非同一个局域网下未测试)的其他服务器,可以通过amoeba的内网ip进行链接,如果绑定了127.0.0.1,那么只有amoeba服务器可以链接虚拟出来的mysql,这点需要注意

端口,用户名和密码配置完之后,我们来配置queryRouter标签,该标签可以实现真正意义上的读写分离,以上配置均为该标签做准备。其中我们需要手动修改的地方有三处,分别是defaultPool,writePool和readPool。defaultPool配置了默认的数据库节点,一些除了SELECT\UPDATE\INSERT\DELETE的语句都会在defaultPool执行,一般设置为主库。writePool顾名思义就是数据库写库,insert,update和delete操作都将会在此库中执行,一般设置为主库。readPool就是写库。如果是单主单从,则readPool就写从库在dbServers.xml中设置的名称,例如设置为slave01,如果是一主多从,则readPool设置为从数据库池,例如本案例中的multiPool,就是从数据库池,包含slave01和salve02两个从数据库,这样就完成了读写分离(主从)和负载均衡(从一和从二)。至此,amoeba的配置工作已完成

7、配置jvm运行参数
运行在jdk11.0.2环境中的amoeba要求xss参数必须大于228才能启动JVM
所以在amoeba安装目录下的jvm.properties文件中进行参数设置
vim jvm.properties
JVM_OPTIONS="-server -Xms512m -Xmx1024m -Xss512k -XX:PermSize=16m -XX:MaxPermSize=96m"

8、启动脚本
./launcher &

9、将脚本加入开机启动项
vim /etc/profile
./usr/amoeba/amoeba-mysql-3.0.5-RC/bin/launcher &

10、查看java服务
netstat -tnlap | grep java

客户端验证
1、安装mariadb软件
yum install -y mariadb

2、登录amoeba服务器
mysql -h10.100.246.240 -udesktop -P8066 -p

3、测试数据库是否能够写入数据,主从数据是否同步
客户端登录数据库后,进入名为bob的数据库,插入一张表
MySQL [bob]> CREATE TABLE cisco (id int(10),name varchar(10),type varchar(20));
MySQL [bob]> INSERT INTO cisco VALUE (‘1‘,‘ccie‘,‘this_is_master‘);

在主数据库和两台从数据库上查看是否存在建立的table与表中插入的数据,存在则说明写入成功,主从同步成功

4、测试验证两台从数据库是否实现负载均衡(轮询)
slave01:进入bob数据库,在cisco表中插入以下数据
MariaDB [bob]>INSERT INTO cisco VALUE (‘2‘,‘ccie‘,‘this_is_slave01‘);

slave02:进入bob数据库,在cisco表中插入以下数据
MariaDB [bob]>INSERT INTO cisco VALUE (‘2‘,‘ccie‘,‘this_is_slave01‘);

desktop:进入bob数据库,通过命令查看cisco表中数据,因为是轮询负载,所以表中查看数据会在slave01和slave02上来回切换数据
MariaDB [bob]>SELECT * FROM cisco;

5、测试验证读是否限制在slave01和slave02两台从数据库中
5.1临时关闭slave01和slave02与主数据库的同步
MariaDB [bob]> STOP SLAVE;

5.2客户端在cisco数据表中插入一条数据,通过SELECT命令是否能查看插入的数据,不能看见数据,则实验成功

5.3再将slave01和slave02与主数据库的同步开启,验证客户端上是否能够查看到数据
slave01和slave02:MariaDB [bob]> START SLAVE;
desktop:MariaDB [bob]>SELECT * FROM cisco;

参考文献资料:
https://www.cnblogs.com/gl-developer/p/6178608.html
https://github.com/ameizi/DevArticles/issues/141
https://blog.csdn.net/a7442358/article/details/47781089
https://blog.csdn.net/moliyiran/article/details/80274993
http://blog.51cto.com/10316297/2139138
https://www.cnblogs.com/symcious/p/4522571.html
https://www.cnblogs.com/aguncn/p/4313724.html

原文地址:http://blog.51cto.com/byu46123/2351953

时间: 2024-10-25 21:39:19

mysql+amoeba 主从复制,读写分离,负载均衡的相关文章

基于amoeba实现mysql数据库的读写分离/负载均衡

一.Amoeba的简述:[来自百度百科] Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求.与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单). Amoeba相当于一个SQL请求的路由器,目的是为

数据库主从复制,读写分离,负载均衡,分表分库的概念

谢邀,这是个好问题,而且这个问题好在即使概念非常容易理解,但是这几个不同的概念细节太多太多,而且理解了概念,自己要用,又需要做很多的调研评估和开发工作.作为在这个领域爬坑多年的人,我这里就先介绍下概念,再提供几个开源工具和云服务吧.先来说这些架构解决的问题吧,传统数据库如Mysql(以下工具也会以Mysql为主),存在的问题就是单机部署,单进程,这样就存在一些问题:资源利用不灵活,有可能cpu的性能还有富余,但是磁盘已经顶不住读压力或写压力了,有可能磁盘的性能还有富余,但是cpu的性能已经顶不住

Mysql的主从复制读写分离--简单篇

Mysql基础拓扑图: Mysql环境准备: 一台mysql主服务器(安装mysql) 两台mysql从服务器(安装mysql) 一台mysql代理(安装amoeba和java) 一台mysql客户端(mysql客户端) 部署前先关闭所有的iptables,selinux Mysql的主从复制读写分离所需安装包: cmake-2.8.6.tar.gz mysql-5.5.22.tar.gz amoeba-mysql-binary-2.2.0.tar.gz jdk-7u65-linux-x64.t

基于主从复制的Mysql双机热备+amoeba实现读写分离、均衡负载

读写分离指的是客户只能在主服务器上写,只能在从服务器上读,当然了,这也是要看配置,你可以在主服务器配置读的功能,但是在从服务器上只能读不能写,因为从服务器是基于binlog对主服务器的复制,如果在从服务器上写的话,会造成主从不一致的结果.mysql实现读写分离,写的压力虽然没有减少,但是读的压力瞬间就减少了一半. Amoeba的中文意思是阿米巴.变型虫Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy代理服务器.它集中地响应应用的请求,依据用户事先设置的规则

mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)

mysql主从复制与lvs+keepalived实现负载高可用 目录 1.前言    4 2.原理    4 2.1.概要介绍    4 2.2.工作原理    4 2.3.实际作用    4 3方案    4 3.1.环境    4 3.2.架构图    5 3.3.设计原理    6 4.相关软件安装    6 4.配置mysql的主从    7 5.通过lvs+keepalived实现负载与热备,并实现读写分离    8 1.前言 最近研究了下高可用的东西,这里总结一下mysql主从复制读

MyCat 读写分离,负载均衡

docker mysql 主从复制 配合Spring 事务 注意事项 配置好JRE,安装好MYCAT 在mysql主库创建表,会同步到从库 CREATE TABLE `user` ( `id` int(11) NOT NULL, `user` varchar(255) NOT NULL COMMENT '名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mycat schema.xml balance="3",所

Ansible-playbook自动部署mysql的主从复制读写分离

目录结构: Ansible-mysql-replication ├── group_vars │   ├── all │   ├── mysql-proxy │   └── mysql-slave ├── hosts ├── mysql-replication.retry ├── mysql-replication.yml └── roles     ├── amoeba     │   ├── files     │   │   ├── amoeba-mysql-3.0.5-RC-distri

MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)

Mysql Proxy Lua读写分离设置 一.读写分离说明 读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库. 1.设置说明 Master服务器: 192.168.41.196 Slave服务器: 192.168.41.197 Proxy服务器: 192.168.41.203 2.安装Mysql Pro

【实战】Amoeba 代理 MySQL 主从复制 + 读写分离 【提供源码包】

目录简介: 1· Amoeba 的介绍2· MySQL 主从复制原理3· MySQL 读写分离原理4· 实战案例5· 总结归纳 Amoeba 的介绍 1)Amoeba 是什么: 1·Amoeba 的中文名是:变形虫.它是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求. 2·Amoeba相当于一个SQL请求的路由器,目的是为负载均衡.读

利用amoeba实现mysql主从复制读写分离

一般大型网站为了缓解大量的并发访问,会在web端实现负载均衡,但是这是远远不够的.到了数据存储层.数据访问层,如果还是传统的架构,或者只是依靠一台服务器,大量的数据库连接操作,会导致数据库面临崩溃的危险.进而造成数据丢失,后果不堪设想.所以我们会考虑如何减少数据库的连接,一方面进行代码的优化,采用优秀的数据缓存技术如memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力.今天我们就利用MySQL主从配置,实现读写分离,分散数据库的压力.这种方式,很多网站都有应用,今天