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

news2024/9/24 5:31:12

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

文章目录

  • 前言
  • 一、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/bin

export 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 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)]>

在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 -A

Database 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.coloradmin.cn/o/823198.html

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

相关文章

计网第四章网络层错题

4.1 没有要求结点要相邻&#xff0c;可不可靠主要取决于使用的协议&#xff0c;若使用有连接的 就可靠 2.C 本题易误选B 因为大家以为只能用ipv4 但是有特定的路由器可以连接IPv4和IPv6&#xff0c;所以网络层的协议也可以不同 C 路由器无法处理比网络层更高层次的数据 所以…

Redis集群Cluster搭建

Redis集群Cluster搭建 集群框架1、下载redis2.创建Cluster文件3.修改redis配置文件4.启动redis5.链接各个redis6.分配槽位7.添加从机节点&#xff08;备份Redis&#xff09;8.以集群方式登录9.使用开源Redis可视化客户端链接 集群框架 三个集群节点&#xff0c;每个节点有个副本…

Ubuntu安装MySQL 8.0与Navicat

目录 Ubuntu安装MySQL 8.0 1、更新软件包列表 2、安装 MySQL 8.0 3、启动 MySQL 服务 5、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL&#xff0c;输入mysql密码 7、MySQL默认位置 Ubuntu安装Navicat 1、下载 Navicat 2、额外的软件包 3、执行命令 U…

IDEA离线环境搭建远程开发-Windows

公司的云桌面实在太卡&#xff0c;多个微服务项目跑起来&#xff0c;直接无法进行其它编码工作&#xff0c;所以想到使用Idea提供的远程开发功能&#xff0c;将服务运行在服务器&#xff0c;电脑只提供给开发页面展示&#xff0c;提高效率。 环境介绍&#xff1a; 开发环境&…

python——案例六:清空列表用clear()方法实现

案例六&#xff1a;清空列表用clear()方法实现LIST[0,1,2,3,4,5] print(清空前&#xff1a;,LIST) LIST.clear() print(清空后&#xff1a;,LIST)

Carsim的基本功能介绍

Carsim 是一款汽车动力学模拟软件&#xff0c;它可以模拟车辆在路面上的运动和行驶行为&#xff0c;支持用户进行不同情况下的测试和研究。以下小师弟所了解的Carsim最基础的使用方法&#xff1a; 安装 Carsim 软件并打开。 Carsim是一个比较简单容易上手的软件&#xff0c;打…

保姆级教程,Linux服务器docker搭建jenkins持续集成一键部署SpringBoot项目(Gradle)

前言&#xff1a; 在后台项目开发过程从Java延伸到Kotlin开发&#xff0c;从maven pom到gradle&#xff0c;IDEA新项目SpringBoot init框架官方推荐kotlingradle&#xff0c;本章以此为jenkins持续集成做项目部署&#xff0c;服务器为Centos&#xff0c;JDK 17&#xff0c;Spr…

各种运算符

算术运算符 1.双目运算符 */%&#xff1a;从左到右优先级依次降低 一些注意事项&#xff1a; 1若a/b都为整型那么结果也为整型&#xff0c;如果ab其中有一个为实型&#xff0c;结果则为实型 求余运算符注意事项&#xff1a; 1运算对象必须为整数 2运算结果的整数跟左边数字的…

Go项目实现日志按时间及文件大小切割并压缩

关于日志的一些问题: 单个文件过大会影响写入效率&#xff0c;所以会做拆分&#xff0c;但是到多大拆分? 最多保留几个日志文件&#xff1f;最多保留多少天&#xff0c;要不要做压缩处理&#xff1f; 一般都使用 lumberjack[1]这个库完成上述这些操作 lumberjack //info文件wr…

linux用户密码存放在哪个文件

linux用户密码存放在“/etc/shadow”文件中。“/etc/shadow”文件又称为“影子文件”&#xff0c;用于存储Linux系统中用户的密码信息&#xff1b;该文件只有root用户拥有读权限&#xff0c;其他用户没有任何权限&#xff0c;这样就保证了用户密码的安全性。 本教程操作环境&am…

IOS看书最终选择|源阅读转换|开源阅读|IOS自签

环境&#xff1a;IOS想使用 换源阅读 问题&#xff1a;换新手机&#xff0c;源阅读下架后&#xff0c;没有好的APP阅读小说 解决办法&#xff1a;自签APP 转换源仓库书源 最终预览 &#xff1a;https://rc.real9.cn/ 背景&#xff1a;自从我换了新iPhone手机&#xff0c;就无法…

iOS 搭建组件化私有库

一、创建私有库索引 步骤1是在没有索引库的情况下或者是新增索引的时候才需要用到&#xff08;创建基础组件库&#xff09; 首先在码云上建立一个私有库索引&#xff0c;起名为SYComponentSpec 二、本地添加私有库索引 添加私有库索引 pod repo add SYComponentSpec https:/…

fiddler 手机抓包(含https) 完整流程

第一部分&#xff1a;下载并安装fiddler 一.使用任一浏览器搜索【fiddler下载安装】&#xff0c;并下载fiddler 安装包。 二.fiddler安装包下载成功后&#xff0c;将下载的fiddler压缩包解压到自定义文件夹【fiddler】或者解压到当前文件夹下&#xff0c;双击文件夹中的【fidd…

工作记录------单元测试(持续更新)

工作记录------单元测试 之前的工作中从来没有写过单元测试&#xff0c;新入职公司要求写单元测试&#xff0c; 个人觉得&#xff0c;作为程序员单元测试还是必须会写的 于此记录一下首次编写单元测试的过程。 首先引入单元测试相关的依赖 <dependency><groupId>…

二、数据结构7:KMP 模板题+算法模板(KMP字符串)

文章目录 算法模板KMP题目模板 模板题KMP字符串原题链接题目思路题解 算法模板 KMP题目模板 // s[]是长文本&#xff0c;p[]是模式串&#xff0c;n是s的长度&#xff0c;m是p的长度 求模式串的Next数组&#xff1a; for (int i 2, j 0; i < m; i ) {while (j &&…

Kafka3.0.0版本——Broker(Zookeeper服务端存储的Kafka相关信息)

目录 一、启动zookeeper集群及kafka集群服务启动1.1、先启动三台zookeeper集群服务&#xff0c;再启动三台kafka集群服务1.2、使用PrettyZoo连接zookeeper客户端工具 二、在zookeeper服务端存储的Kafka相关信息 一、启动zookeeper集群及kafka集群服务启动 1.1、先启动三台zook…

一篇文章带你彻底搞懂方法重写(override)和重载(overload)—菜鸟教程学习记录

一篇文章带你彻底搞懂方法重写(override)和重载(overload) ​ 这个其实我们在之前的java方法那一章节里面就提到了&#xff0c;这里更加深入一下&#xff0c;并且提供具体的例子。 重写(Override)基本概念&#xff1a; ​ Java方法**重写(Override)**指的是&#xff0c;子类…

02 笔记本电脑m.2硬盘更换

1 工具展示 SN570的2T硬盘。够用了。 对于这台华为&#xff0c;使用的螺丝刀批头是4或5毫米的六边形批头。如果出现打滑的情况&#xff0c;请不要用蛮力哦。 2 更换过程 使用螺丝刀拧走后盖的螺丝&#xff08;为了避免会出问题要再次打开&#xff0c;我到现在还没有把螺丝拧回…

groovy.lang.GroovyRuntimeException:Ambiguous method

目录 问题 根因及解决 问题 今天线上的计算脚本报了个问题&#xff0c;报警如下是 groovy 运行时异常。调用方法 org.springframework.util.CollectionUtils#isEmpty 出现了异常。异常原因是由于方法重载造成了歧义。无法确定如何调用方法 [null]&#xff0c;因为它同时匹配了…

如何隐藏开源流媒体EasyPlayer.js视频H.265播放器的实时录像按钮?

目前我们TSINGSEE青犀视频所有的视频监控平台&#xff0c;集成的都是EasyPlayer.js版播放器&#xff0c;它属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;包括WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#x…