码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2019-02-20 09:26:14      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:下载地址   抽象类   files   default   int   images   从库   软件   lap   

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

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

标签:下载地址   抽象类   files   default   int   images   从库   软件   lap   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!