mysql基于Amoeba(变形虫)实现读写分离

news2024/11/25 18:34:58

一,Amoeba介绍

1、什么是amoeba?

​ Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。

主要解决:

• 降低 数据切分带来的复杂多数据库结构

• 提供切分规则并降低 数据切分规则 给应用带来的影响

• 降低db 与客户端的连接数

• 读写分离

2、为什么要用Amoeba

目前要实现mysql的主从读写分离,主要有以下几种方案:

1、 通过程序实现,网上很多现成的代码,比较复杂,如果添加从服务器要更改多台服务器的代码。

2、 通过mysql-proxy来实现,由于mysql-proxy的主从读写分离是通过lua脚本来实现,目前lua的脚本的开发跟不上节奏,而写没有完美的现成的脚本,因此导致用于生产环境的话风险比较大,据网上很多人说mysql-proxy的性能不高。

二、实验环境

1、准备五台主机,其中三台已经实现了Mysql的主从复制(主从复制不再演示,从安装Amoeba开始),一台安装Amoeba,一台用作试验机

  • mysql-master:192.168.200.111

  • mysql-slave1:192.168.200.112

  • mysql-slave2:192.168.200.113

  • Amoeba:192.168.200.114

  • Client:192.168.200.115

2、所有主机关闭安全机制和防火墙。

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0

二、在主机Amoeba上安装java环境(192.168.200.114)

1、上传需要的安装包

[root@amoeba ~]# ls
amoeba-mysql-binary-2.2.0.tar.gz  jdk-6u14-linux-x64.bin
anaconda-ks.cfg

2、执行.bin文件(就相当于解压.tar包)

[root@amoeba ~]# chmod +x jdk-6u14-linux-x64.bin 
[root@amoeba ~]# ./jdk-6u14-linux-x64.bin 
[root@amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6

3、设置开机启动项,添加内容

[root@amoeba ~]# vim /etc/profile 
export JAVA_HOME=/usr/local/jdk1.6     //声明一个全局变量JAVA_HOME,安装路径为/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib   //更新类的搜索路径
export PATH=$PATH:$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$HOME/bin
​
export AMOEBA_HOME=/usr/local/amoeba   //amoeba的解压路径
export PATH=$PATH:$AMOEBA_HOME/bin   //amoeba的命令

4、jdk安装完成后,java的版本与jdk的版本不同,删除高版本的java程序文件,重新执行一下/etc/profile

[root@amoeba ~]# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
[root@amoeba ~]# which java
/usr/bin/java
[root@amoeba ~]# rm -rf /usr/bin/java 
[root@amoeba ~]# source /etc/profile
[root@amoeba ~]# java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

三、安装并配置Amoeba(192.168.200.114)

1、解压安装包

[root@amoeba ~]# mkdir /usr/local/amoeba
[root@amoeba ~]# tar -xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/

2、配置Amoeba的读写分离,两个Slave读负载均衡

在Master、Slave1、Slave2服务器中配置Amoeba的访问授权

[root@mysql-m ~]# mysql -uroot -p123123    //三台主机都要执行
MariaDB [(none)]> grant all on *.* to 'test'@'192.168.200.%' identified by '123123';   //对所有库下的所有表,授权的用户名为test,允许访问的网段为200网段,密码为123123.
Query OK, 0 rows affected (0.01 sec)
​
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

4、编辑amoeba.xml配置文件

[root@amoeba ~]# cd /usr/local/amoeba/
[root@amoeba amoeba]# ls
benchmark  changelogs.txt  lib          README.html
bin        conf            LICENSE.txt
[root@amoeba amoeba]# cd conf/
[root@amoeba conf]# ls
access_list.conf  dbServers.xml    log4j.xml
amoeba.dtd        function.dtd     rule.dtd
amoeba.xml        functionMap.xml  ruleFunctionMap.xml
dbserver.dtd      log4j.dtd        rule.xml
[root@amoeba conf]# cp amoeba.xml amoeba.xml.bak
[root@amoeba conf]# vim amoeba.xml
30           <property name="user">amoeba</property>      //客户端必须拿这个用户名和密码登录amoeba
32           <property name="password">123123</property>
​
115          <property name="defaultPool">master</property>   //默认
118          <property name="writePool">master</property>    //写的池,交给master
119          <property name="readPool">slaves</property>     //读的池,交给slaves组

5、编辑dbServer.xml配置文件

[root@amoeba conf]# cp dbServers.xml dbServers.xml.bak
​
[root@amoeba ~]# vim /usr/local/amoeba/conf/dbServers.xml
 19                         <!-- mysql port -->
 20                         <property name="port">3306</property>
 21 
 22                         <!-- mysql schema -->
 23                         <property name="schema">test</property>
 24 
 25                         <!-- mysql user -->
 26                         <property name="user">test</property>
 27 
 28                         <!--  mysql password --> 
 29                         <property name="password">123123</property>
​
  45         <dbServer name="master"  parent="abstractServer">
 46                 <factoryConfig>
 47                         <!-- mysql ip --> 
 48                         <property name="ipAddress">192.168.200.111</property>
 49                 </factoryConfig>
 50         </dbServer>
 51 
 52         <dbServer name="slave1"  parent="abstractServer">
 53                 <factoryConfig>
 54                         <!-- mysql ip --> 
 55                         <property name="ipAddress">192.168.200.112</property>
 56                 </factoryConfig>
 57         </dbServer>
 58         <dbServer name="slave2"  parent="abstractServer">
 59                 <factoryConfig>
 60                         <!-- mysql ip -->
 61                         <property name="ipAddress">192.168.200.113</property> 
 62                 </factoryConfig>
 63         </dbServer> 
​
​
 66         <dbServer name="slaves" virtual="true">    //声明组
 67                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
 68                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
 69                         <property name="loadbalance">1</property>  //组内成员的效果为轮询
 70                         
 71                         <!-- Separated by commas,such as: server1,server2,server1 -->
 72                         <property name="poolNames">slave1,slave2</property>
 73                 </poolConfig>
 74         </dbServer>

6、配置无误后,启动Amoeba软件,默认端口为TCP协议8066

nohup:执行命令不依赖于任何终端

[root@amoeba ~]# nohup /usr/local/amoeba/bin/amoeba start &   //将命令放到后台运行,不依赖于任何终端
​
[root@amoeba ~]# netstat -lnpt   //查看端口8066
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1366/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1632/master         
tcp6       0      0 :::8066                 :::*                    LISTEN      21943/java          
tcp6       0      0 127.0.0.1:18195         :::*                    LISTEN      21943/java          
tcp6       0      0 :::22                   :::*                    LISTEN      1366/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1632/master 

四、client客户机访问测试(192.168.200.115)

安装mariadb

1、连接数据库测试

[root@client ~]# mysql -u amoeba -p123123 -h 192.168.200.114 -P 8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 74675057
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 MariaDB Server
​
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
​
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
​
MySQL [(none)]> 

2、测试读写分离

master主机上

MariaDB [(none)]> create database db_test;
Query OK, 1 row affected (0.00 sec)
​
MariaDB [(none)]> use db_test;
Database changed
MariaDB [db_test]> create table student (id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.01 sec)

建完库之后在两台slave机上查看,能看到新建的库说明主从复制没有问题

3、将两台slave主机上的主从服务给关掉

salve1:
MariaDB [(none)]> stop salve;
​
-------------------------------------------------------------------------------
​
slave2:
MariaDB [(none)]> stop salve;

编写测试

master:
MariaDB [db_test]> insert into student values('1','crushlinux','this_is_master');
Query OK, 1 row affected (0.01 sec)
​
---------------------------------------------------------------------------
slave1:
MariaDB [db_test]> insert into student values('2','crushlinux','this_is_slave1');
Query OK, 1 row affected (0.00 sec)
​
--------------------------------------------------------------------------
slave2:
Database changed
MariaDB [db_test]> insert into student values('3','crushlinux','this_is_slave2');
Query OK, 1 row affected (0.01 sec)

从client客户机上访问,访问到的是两台salve机的轮询

MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    2 | crushlinux | this_is_slave1 |
+------+------------+----------------+
1 row in set (0.00 sec)
​
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    3 | crushlinux | this_is_slave2 |
+------+------------+----------------+
1 row in set (0.01 sec)

4、客户机上添加一个数据,访问,还是读到两台slave机上的

MySQL [db_test]> insert into student values('4','crushlinux','this_is_client');
Query OK, 1 row affected (0.01 sec)
​
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    2 | crushlinux | this_is_slave1 |
+------+------------+----------------+
1 row in set (0.01 sec)
​
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    3 | crushlinux | this_is_slave2 |
+------+------------+----------------+
1 row in set (0.02 sec)

在client机上写数据时,写交给master主机来处理,两台slave主机没有变化,因为此时主从服务已经停了,所以两台slave机上不会访问到master主机上写入的内容

5、开启主从复制测试

slave1:
MariaDB [db_test]> start slave;
Query OK, 0 rows affected (0.00 sec)
​
-----------------------------------------------------------------------
slave2:
MariaDB [db_test]> start slave;
Query OK, 0 rows affected (0.01 sec)
​
==========================================
​
client:
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    3 | crushlinux | this_is_slave2 |
|    1 | crushlinux | this_is_master |
|    4 | crushlinux | this_is_client |
+------+------------+----------------+
3 rows in set (0.01 sec)
​
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    2 | crushlinux | this_is_slave1 |
|    1 | crushlinux | this_is_master |
|    4 | crushlinux | this_is_client |
+------+------------+----------------+
3 rows in set (0.01 sec)

主从复制开启后,两台slave机上可以读取到master主机上写入的数据,client在访问测试的时候就能读到主机上的数据,因为两台slave机是轮询效果,所以能访问到1、2、4或1、3、4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】顺序表与线性表之ArrayList

目录 一、顺序表与线性表的概念 1、顺序表 2、线性表 二、Java里的集合类之ArrayList 1、ArrayList与顺序表 2、认识ArrayList 1.构造方法 2.常用方法 3.遍历ArrayList的几个方法 4.扩容机制 三、模拟实现ArrayList 1、字段 2、构造方法 3、常用方法 1.判满 2.判…

10.1、Django入门

文章目录预备知识MVC模式和MTV模式MVC模式MTV 模式Django框架Django框架简介Django框架的应用启动后台admin站点管理数据库迁移创建管理员用户管理界面本地化创建并使用一个应用bookapp预备知识 HTTP协议就是客户端和 服务器端之间数据传输的格式规范&#xff0c;格式简称为“…

教你搭建FTP文件共享服务器

一、什么是FTP FTP—文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;是用于在网络上进行文件传输的一套标准协议&#xff0c;它工作在 OSI 模型的第七层&#xff0c; TCP 模型的第四层&#xff0c; 即应用层&#xff0c; 客户在和服务器建立连接前…

BCN基团TAMRA-BCN-PEG4-endo,endo-BCN-PEG4

中文名&#xff1a;endo-BCN-四聚乙二醇-四甲基罗丹明 英文名&#xff1a;endo-BCN-PEG4-TAMRA&#xff0c;TAMRA-BCN-PEG4-endo CAS号&#xff1a;N/A 化学式&#xff1a;C46H56N4O10 分子量&#xff1a;824.97 产品描述&#xff1a; TAMRA-BCN-PEG4-endo包含 TARMA 染料和 …

分布式系统(数据复制与一致性)

文章目录ReplicationCAP ConjectureData-centric Consistency ModelsSequential ConsistencyCausal ConsistencyEntry ConsistencyEventual ConsistencyClient-centric Consistency ModelsMonotonic Read ConsistencyMonotonic Writes ConsistencyRead Your Writes Consistency…

Python学习基础笔记五十三——单继承

1、派生属性&#xff1a; 当然子类也可以添加自己的新的属性或者在这里重新定义这些属性&#xff08;不会影响到父类&#xff09;&#xff0c;需要注意的是&#xff0c;一旦重新定义了自己的属性且与父类重名&#xff0c;那么调用新增的属性&#xff0c;就以自己为准了。 例1…

在Windows中使用Nginx配置部署springboot+vue项目

Nginx 链接&#xff1a;https://pan.baidu.com/s/1c-9JJ3e63rNNeSRuEFh0Ow?pwdaamb 提取码&#xff1a;aamb 配置 解压后进入到 conf 目录下&#xff0c;修改 nginx.conf 文件&#xff0c;将下面的内容直接复制粘贴进去即可。 events {worker_connections 1024; ## Defa…

分享即时通讯音视频开发编码标准

即时通讯应用中的实时音视频技术&#xff0c;几乎是IM开发中的最后一道高墙。原因在于&#xff1a;实时音视频技术 音视频处理技术 网络传输技术 的横向技术应用集合体&#xff0c;而公共互联网不是为了实时通信设计的。 视频通讯过程是视频和音频的实时双向完整通讯过程。在…

java学习day62(乐友商城)商品规格设计与商品查询的页面实现

1.商品规格数据结构 乐优商城是一个全品类的电商网站&#xff0c;因此商品的种类繁多&#xff0c;每一件商品&#xff0c;其属性又有差别。为了更准确描述商品及细分差别&#xff0c;抽象出两个概念&#xff1a;SPU和SKU&#xff0c;了解一下&#xff1a; 1.1.SPU和SKU SPU&…

恒温恒湿实验室(房)建设、设计SICOLAB

通用实验室是指适用于多学科的以实验台规模进行经常性科学研究和实验工作的实验室&#xff0c;其夏季空气调节室内计算参数为温度 26&#xff5e;28℃&#xff0c;相对湿度小于 65%&#xff0c;在规范中没有对温湿度控制精度及洁净度做相关要求。专用实验室是指有特定环境要求&…

C++基础学习三

目录儿六、分支语句和逻辑操作符6.1 if语句6.1.1 if6.1.2 if-else6.1.3 if-else if-else6.2 逻辑表达式6.2.1 逻辑或||6.2.2 逻辑与&&6.2.3 逻辑非!6.2.4 逻辑操作符的其他表示方式6.3 字符函数库cctype6.4 三目/元操作符6.5 switch语句6.5.1 switch引入枚举常量6.6 br…

【OpenCall】ICASSP2023通用会议理解及生成挑战赛邀请函

ICASSP2023 通用会议理解及生成挑战赛(General Meeting Understanding and Generation Challenge,缩写为 MUG)是ICASSP2023 系列大挑战(SPGC)之一&#xff0c;由魔搭ModelScope社区、阿里巴巴达摩院语音实验室&语言技术实验室&#xff0c;阿里云天池联合浙江大学数字媒体计…

Linux基本搭建和操作

Linux基本搭建和操作1、创建三台虚拟机2、创建使用SSH远程连接3、实现IP地址与主机名的映射4、关闭和禁用防火墙5、创建目录结构6、压缩打包7、安装软件包安装jdk安装mysql8、创建脚本文件9、运行脚本文件10、免密登录配置11、远程拷贝文件1、创建三台虚拟机 序号虚拟机名称静…

高效技巧-打表法

打表法 打表是一种典型的用空间换时间的技巧 一般指将所有可能需要用到的结果事先计算出来&#xff0c;这样后面需要用到时就可以直接查表获得。 打表常见的用法有如下几种: ①在程序中一次性计算出所有需要用到的结果&#xff0c;之后的查询直接取这些结果这个是最常用到的…

开源之路——如何发布属于自己的npm包

开源之路——如何发布属于自己的npm包1、前言2、起步2.1、初始化项目2.2、安装webpack相关依赖2.3、添加入口文件和封装方法2.4、设置源2.5、添加用户2.6、发布3、使用1、前言 在进行开发的过程当中&#xff0c;难免会出现一些重复性的工作&#xff0c;例如说我们要对一个数组…

电脑如何格式化重装系统

​众所周知&#xff0c;默认情况下&#xff0c;计算机重新安装系统将设置格式化磁盘。如果您选择其他需要格式化的硬盘&#xff0c;您必须如何操作&#xff1f;一般来说&#xff0c;我们是pe手动格式磁盘可以避免立即格式化硬盘造成的一些问题。让我们谈谈如何格式化硬盘重做系…

【软件测试】测试的天花板?资深测试怎么一路爬的......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试职业的天花板是…

脑图谱的验证方法

方法 目的 与其他分割比较区域内的同质性 比较不同分割的平均区域内同质性 有约束的几何扰动比较 验证分割区域内部的功能同质性 留一交叉验证 验证相似矩阵的稳定性 剪影宽度silhouette width (SI) 计算簇内和簇外的功能信号相似性差异 骰子系数dice coefficient 衡…

G1D36-import-keras.save_model-code-沐沐的调参课

1、python导入函数 https://zhuanlan.zhihu.com/p/64893308 服了 https://blog.csdn.net/weixin_45195364/article/details/119857246?spm1001.2101.3001.6650.6&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-1198572…

OSCS开源安全周报第22期:NuGet 仓库中被发现 13.5 万个包含钓鱼地址的组件包

本周安全态势综述 OSCS 社区共收录安全漏洞15个&#xff0c;公开漏洞值得关注的是 Jenkins Google Login Plugin 存在开放重定向漏洞&#xff08;CVE-2022-46683&#xff09;&#xff0c;Netty <4.1.86.Final 存在拒绝服务漏洞&#xff08;CVE-2022-41881&#xff09;&…