基于Amoeba读写分离(三十六)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、pandas是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结


前言

今天要学的是基于Amoeba读写分离。Amoeba是一个开源的关系型数据库管理系统,它支持读写分离的架构。在Amoeba中,读操作和写操作可以被分发到不同的节点上进行处理,以提高系统的性能和可扩展性。Amoeba的读写分离架构包括主节点和从节点。主节点负责处理写操作,而从节点负责处理读操作。主节点和从节点之间通过复制机制保持数据的一致性。当应用程序需要执行写操作时,它将请求发送到主节点。主节点在完成写操作后,会将数据的副本复制到从节点上。这样,应用程序可以立即从主节点中获得最新的数据。当应用程序需要执行读操作时,它可以选择直接向主节点发送请求,或者向从节点发送请求。如果应用程序向主节点发送读请求,主节点会立即返回最新的数据。如果应用程序向从节点发送读请求,从节点会检查是否有最新的数据副本可用。如果有,则从节点会返回最新的数据副本;如果没有,则从节点会向主节点请求最新的数据,并在获得数据后返回给应用程序。通过读写分离架构,Amoeba可以分担主节点的读写压力,提高系统的并发处理能力。同时,读操作可以通过从节点进行处理,减少了主节点的负载,提高了系统的性能和吞吐量。总结起来,基于Amoeba的读写分离架构可以提高数据库系统的性能和可扩展性。通过将读操作和写操作分发到不同的节点上进行处理,可以有效地分担主节点的负载,提高系统的并发处理能力。


提示:以下是本篇文章正文内容,下面案例可供参考

一、概述

在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是安全性,高可用还是并发等各个方面都不能完全满足实际需求的,因此一般来说都是通过主从复制的方式来同步数据,再通过读写分离来提供数据的高并发负载能力这样的方案来进行部署。

简单来说,读写分离就是只在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库。

目前最常见的MySQL读写分离方案有两种:

  1. 基于程序代码内部实现

在代码中根据select,insert进行路由分类,这类方法也是目前大型生产环境应用最广泛的,优点是性能最好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手

  1. 基于中间代理层实现

代理一般位于客户端和数据库服务器之间,代理服务器接到客户端请求后通过判断转发到后端数据库,代表性程序:

(1)mysql-proxy为mysql开发早期开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境。

(2)Amoeba(变形虫)该程序由java语言及逆行开发,阿里巴巴将其应用于生产环境,它不支持事物和存储过程。

MySQL Master IP:192.168.200.111

MySQL Slave1 IP:192.168.200.112

MySQL Slave2 IP:192.168.200.113

MySQL Amoeba IP:192.168.200.114

MySQL Client IP:192.168.200.115

 

 

Amoeba(变形虫)项目开源框架于2008年发布一款Amoeba for mysql软件,这个软件致力于mysql的分布式数据库前端代理层,主要为应用层访问mysql的时候充当SQL路由功能,并具有负载均衡,高可用性,SQL过滤,读写分离,可路由到相关的目标数据库,可并发请求多台数据库,通过Amoeba能够完成多数据源的高可用,负载均衡,数据切片的功能,目前Amoeba已经在很多企业的生产线上使用。

二、实验:

1、在主机Amoeba上安装java环境

因为Amoeba是基于jdk1.5版本开发的,所以官方推荐使用1.5或者1.6版本,高版本不建议使用。

[root@localhost ~]# chmod +x jdk-6u31-linux-x64.bin
[root@localhost ~]# ./jdk-6u31-linux-x64.bin
[root@localhost ~]# mv jdk1.6.0_31/ /usr/local/jdk1.6
[root@localhost ~]# vim /etc/profile
export 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/binexport AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin[root@localhost ~]# rm -rf /usr/bin/java
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

2、安装并配置Amoeba

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

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

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

MariaDB [(none)]> grant all on *.* to 'test'@'192.168.200.%' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

编辑amoeba.xml配置文件

[root@localhost ~]# vim /usr/local/amoeba/conf/amoeba.xml
30                                   <property name="user">amoeba</property>
32                                  <property name="password">123456</property>
115                 <property name="defaultPool">master</property>
118                 <property name="writePool">master</property>
119                 <property name="readPool">slaves</property>

编辑dbServer.xml配置文件

[root@localhost ~]# vim /usr/local/amoeba/conf/dbServers.xml<!-- mysql port --><property name="port">3306</property><!-- mysql schema --><property name="schema">test</property><!-- mysql user --><property name="user">test</property><!--  mysql password --><property name="password">123.com</property><dbServer name="master"  parent="abstractServer"><factoryConfig><!-- mysql ip --><property name="ipAddress">192.168.200.111</property></factoryConfig></dbServer><dbServer name="slave1"  parent="abstractServer"><factoryConfig><!-- mysql ip --><property name="ipAddress">192.168.200.112</property></factoryConfig></dbServer><dbServer name="slave2"  parent="abstractServer"><factoryConfig><!-- mysql ip --><property name="ipAddress">192.168.200.113</property></factoryConfig></dbServer><dbServer name="slaves" virtual="true"><poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"><!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--><property name="loadbalance">1</property><!-- Separated by commas,such as: server1,server2,server1 --><property name="poolNames">slave1,slave2</property></poolConfig></dbServer>

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

[root@localhost ~]# /usr/local/amoeba/bin/amoeba start &
[root@localhost ~]# netstat -lnpt | grep 8066
tcp6       0      0 :::8066                 :::*                    LISTEN      10099/java[root@localhost ~]# netstat -anpt | grep 3306
tcp6       0      0 192.168.200.114:46412   192.168.200.111:3306    ESTABLISHED 10099/java          
tcp6       0      0 192.168.200.114:47708   192.168.200.112:3306    ESTABLISHED 10099/java          
tcp6       0      0 192.168.200.114:47892   192.168.200.113:3306    ESTABLISHED 10099/java    

在Client上进行访问测试

[root@localhost ~]# yum -y install mariadb mariadb-devel

然后可以通过代理访问MySQL

[root@localhost ~]# mysql -uamoeba -p123456 -h 192.168.200.114 -P 8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2037510537
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0 MariaDB ServerCopyright (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)]>

在MySQL主服务器上创建一个表,会自动同步到各个从服务器上,然后关掉各个服务器上的Slave功能,在分别插入语句测试。

主服务器

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

分别在两台从服务器上

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Rich               |
| mysql              |
| performance_schema |
| sampdb             |
| test               |
+--------------------+
6 rows in set (0.00 sec)MariaDB [(none)]> use Rich;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
MariaDB [Rich]> show tables;
+----------------+
| Tables_in_Rich |
+----------------+
| student        |
+----------------+
1 row in set (0.00 sec)MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.01 sec)

Master

MariaDB [(none)]> use Rich;
MariaDB [Rich]> insert into student values('1','Rich','this_is_master');
Query OK, 1 row affected (0.00 sec)

Slave1

MariaDB [(none)]> use Rich;
MariaDB [Rich]> insert into student values('2','Rich','this_is_slave1');
Query OK, 1 row affected (0.00 sec)

Slave2

MariaDB [(none)]> use Rich;
MariaDB [Rich]> insert into student values('3','Rich','this_is_slave2');
Query OK, 1 row affected (0.00 sec)

操作测试:

在测试机上第1次查询结果

MySQL [Rich]> select * from student;
+------+------+----------------+
| id   | name | address        |
+------+------+----------------+
|    2 | Rich | this_is_slave1 |
+------+------+----------------+
1 row in set (0.00 sec)

在测试机上第2次查询结果

MySQL [Rich]> select * from student;
+------+------+----------------+
| id   | name | address        |
+------+------+----------------+
|    3 | Rich | this_is_slave2 |
+------+------+----------------+
1 row in set (0.02 sec)

在测试机上第3次查询结果

MySQL [Rich]> select * from student;
+------+------+----------------+
| id   | name | address        |
+------+------+----------------+
|    2 | Rich | this_is_slave1 |
+------+------+----------------+
1 row in set (0.03 sec)

测试写操作:

在Client上插入一条语句:

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

但在Client上查询不到,最终只有在Master上才能看到这条语句内容,说明写操作在master服务器上

MariaDB [Rich]> select * from student;
+------+------+----------------+
| id   | name | address        |
+------+------+----------------+
|    1 | Rich | this_is_master |
|    4 | Rich | write_test     |
+------+------+----------------+
3 rows in set (0.00 sec)

由此验证,已经实现了MySQL读写分离,目前所有的写操作都在Master主服务器上,用来避免数据的不同步,所有的读操作都平分给了Slave从服务器,用来分担数据库压力。

分别在两台从服务器上启用slave功能

MariaDB [Rich]> start slave;
Query OK, 0 rows affected (0.00 sec)

现在在Client测试机上查看

MySQL [Rich]> select * from student;
+------+------+----------------+
| id   | name | address        |
+------+------+----------------+
|    3 | Rich | this_is_slave2 |
|    1 | Rich | this_is_master |
|    4 | Rich | write_test     |
+------+------+----------------+
4 rows in set (0.00 sec)

总结

以上就是今天要讲的内容,好好练哦!

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

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

相关文章

Spark性能调优之数据序列化

前言 在使用Spark进行数据开发的时候,避不开的一个问题就是性能调优。网上一搜一大堆所谓的调优策略很多作者自己都不知所云,导致读者看了后只会更加困惑。我们在研究一个技术的时候第一手资料永远都请参考官网,官网对性能优化不一定是最全甚至最优,但是可以解决大部分问题…

六、初始化和清理(4)

本章概要 数组的初始化 动态数组创建可变参数列表 枚举类型 数组初始化 数组是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。数组是通过方括号下标操作符 [] 来定义和使用的。要定义一个数组引用&#xff0c;只需要在类型名加上方括号&#xf…

NestJS 的 拦截器 学习

拦截器会用到RxJs&#xff0c;所以在学习拦截器之前可以先了解一下它。 拦截器是使用Injectable()装饰器装饰的类并且实现了接口NestInterceptor。 拦截器受到 AOP(面向切面编程)技术的启发&#xff0c;具有如下的功能&#xff1a; 在方法执行之前/之后绑定额外的逻辑转换函…

express学习笔记2 - 三大件概念

中间件 中间件是一个函数&#xff0c;在请求和响应周期中被顺序调用&#xff08;WARNING&#xff1a;提示&#xff1a;中间件需要在响应结束前被调用&#xff09; 路由 应用如何响应请求的一种规则 响应 / 路径的 get 请求&#xff1a; app.get(/, function(req, res) {res…

以beam search为例,详解transformers中generate方法(上)

以beam search为例&#xff0c;详解transformers中generate方法&#xff08;上&#xff09; 1. generate的代码位置2. GenerationMixin概览3. generate签名4. generate过程4.1 读取并更新generation config4.2 补充没有传入的参数4.3 定义模型输入4.4 定义模型的其他参数4.5 对…

Mysql存储过程基本语法

目录 存储过程MYSQL基础语法游标&#xff08;作用范围存储过程&#xff09;事务&#xff08;Demo&#xff09;其他操作Demo 存储过程 MYSQL 基础语法 #创建存储过程 #参数格式 #in输入参数 out输出参数 inout既可以输入也可以输出 create or replace procedure 存储过程名…

react常用知识点

React是一个用于构建用户界面的JavaScript库。以下是React常用的知识点&#xff1a; 组件&#xff1a;React将用户界面分解成小而独立的组件&#xff0c;每个组件都有自己的状态和属性&#xff0c;并且可以通过组合这些组件来构建复杂的用户界面。 // 函数组件示例 function We…

torch.load 报错 ModuleNotFoundError 或 AttributeError

Python 3.11.3 (main, Apr 7 2023, 19:25:52) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin Type "help", "copyright", "credits" or "license" for more information.正常情况下&#xff0c;我们会使用 torch.save 保存模型的 …

向 Maven 中央仓库上传一个修改过的基于jeecg的autoPOI的 jar包记录

1、注册https://issues.sonatype.org/账号 下面就代表注册好了&#xff0c;同时提交的工单也通过了 2、这里主要是goupId 需要进行认证&#xff0c;需要到域名注册商近一个txt的解析&#xff0c;以便确保这个是你的 通过下面来验证你的域名信息&#xff0c;这里主要是上面的工…

git命令分类合集

配置 git config --global user.name <name>&#xff1a;设置全局用户名 git config --global user.email <email>&#xff1a;设置全局用户邮箱 git config --global core.editor <editor>&#xff1a;设置全局文本编辑器创建与克隆仓库 git init&#xf…

面试题:说一说深拷贝和浅拷贝?

JavaScript中存在两大数据类型&#xff1a; 基本类型 和 引用类型 基本类型数据保存在在栈内存中 引用类型数据保存在堆内存中&#xff0c;引用数据类型的变量是一个指向堆内存中实际对象的引用&#xff0c;存在栈中 深拷贝和浅拷贝都只针对于引用类型。 一、 浅拷贝&#xff1…

【2023年11月第四版教材】《第1章-信息化发展之<3 现代化创新发展>》

第1章-信息化发展之&#xff1c;3 现代化创新发展&#xff1e; 3 现代化创新发展3.1 农业现代化3.2 两化融合&#xff08;17下2&#xff09;&#xff08;18下2&#xff09; &#xff08;22下12)3.3 智能制造3.4 消费互联网 3 现代化创新发展 3.1 农业现代化 要素具体内容农业…

Cpp7 — 继承和多态

继承 -------- 面向对象的三大特性之一 面向对象的三大特性&#xff1a;封装、继承、多态 封装&#xff1a;把数据和方法都封装在一起&#xff0c;想给你访问的变成共有&#xff0c;不想给访问的&#xff0c;写成私有。 继承&#xff1a;继承是类设计层次的复用 多态&#…

[SQL挖掘机] - 索引

介绍: 当你在数据库中进行查询时&#xff0c;索引是一种用于提高查询性能的重要工具。索引是对表中的一列或多列进行排序的数据结构&#xff0c;它可以快速定位到满足特定条件的记录&#xff0c;从而减少了查询所需的时间和资源。 在数据库中使用索引的主要好处包括&#xff…

【AGI】Copilot AI编程辅助工具安装教程

1. 基础激活教程 GitHub和OpenAI联合为程序员们送上了编程神器——GitHub Copilot。 但是&#xff0c;Copilot目前不提供公开使用&#xff0c;需要注册账号通过审核&#xff0c;我也提交了申请&#xff1a;这里第一期记录下&#xff0c;开启教程&#xff0c;欢迎大佬们来讨论…

通向架构师的道路之apache性能调优

一、总结前一天的学习 在前两天的学习中我们知道、了解并掌握了Web Server结合App Server实现单向Https的这样的一个架构。这个架构是一个非常基础的J2ee工程上线布署时的一种架构。在前两天的教程中&#xff0c;还讲述了Http服务 器、App Server的最基本安全配置&#xff08;…

java 数组的使用

数组 基本介绍 数组可以存放多个同一类型的数据&#xff0c;数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数组就是一组数据。 数组的使用 1、数组的定义 方法一 -> 单独声明 数据类型[] 数组名 new 数据类型[大小] 说明&#xff1a;int[] a new int…

C/C++算法——散列表

1、散列表介绍 散列表的英文叫Hash Table&#xff0c;我们平时也叫它哈希表或者Hash 表。散列表用的是数组支持按照下标随机访问数据的特性&#xff0c;所以散列表其实就是数组的一种扩展&#xff0c;由数组演化而来。可以说&#xff0c;如果没有数组&#xff0c;就没有散列表。…

【SpringBoot】85、SpringBoot中Boolean类型数据转0/1返回序列化配置

在 SpringBoot 中,前端传参数 0,1,后端可自动解析为 boolean 类型,但后端返回前端 boolean 类型时,却无法自动转换为 0,1,所以我们需要自定义序列化配置,将 boolean 类型转化为 0,1 1、类型对应 boolean 类型有false,true对应的 int 类型0,12、序列化配置 import com.f…

iOS——锁与死锁问题

iOS中的锁 什么是锁锁的分类互斥锁1. synchronized2. NSLock3. pthread 递归锁1. NSRecursiveLock2. pthread 信号量Semaphore1. dispatch_semaphore_t2. pthread 条件锁1. NSCodition2. NSCoditionLock3. POSIX Conditions 分布式锁NSDistributedLock 读写锁1. dispatch_barri…