amoeba实现MySQL读写分离
amoeba实现MySQL读写分离
准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为192.168.131.136。三台服务器操作系统为RHEL6.4 x86_64,为最小化安装,
Java环境下载地址(仅供参考)Java Archive Downloads - Java SE 6
amoeba 下载地址(仅供参考)amoeba - Browse Files at SourceForge.net
主从配置使用通用二进制包,版本为MySQL5.7.26。三台服务器均关闭防火墙和SELINUX。
一、主机A和主机B做主从同步
1、安装MySQL
# tar xf mysql-5.7.26-linux-glibc2.5-x86_64.tar.gz
# useradd -M -s /sbin/nologin mysql
# yum -y install libaio-devel
# mv mysql-5.7.26-linux-glibc2.5-x86_64/ /usr/local/mysql
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data/ --basedir=/usr/local/mysql/
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# vim /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# service mysqld start
# chkconfig mysqld on
# mysql -uroot password
# echo "PATH=${PATH}:/usr/local/mysql/bin" >> /etc/profile
# source /etc/profile
# ss -tunlp | grep 3306
2、配置主从同步
①主机A配置
# vim /etc/my.cnf
server-id=1
log-bin=mysql-bin
log-bin-index=mysql-bin.index
max-binlog-size=100M
# service mysqld restart
# mysql -u root –p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'wdd'@'192.168.131.%' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;
mysql> SHOW MASTER STATUS;

②主机B配置
# vim /etc/my.cnf
server-id=2
relay-log=relay-bin
relay-log-info-file=relay-log.info
# service mysqld restart
# mysql -u root –p
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.131.129',
MASTER_USER='wdd',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=405;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;

mysql> GRANT ALL PRIVILEGES ON *.* TO 'wdd'@'192.168.131.%' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;
二、主机C作为中间件
1、搭建amoeba运行环境
# mkdir /amoeba
# tar xf jdk-7u40-linux-x64.gz -C /amoeba/
# vim /etc/profile
JAVA_HOME=/amoeba/jdk1.7.0_40
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export CLASSPATH
# source /etc/profile
# yum -y install java
# java –version
2、安装amoeba
# unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba
# chmod -R +x /usr/local/amoeba/bin/
3、配置amoeba文件
# cd /usr/local/amoeba/conf/
# vim amoeba.xml
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
#更改的第一个区域
<server>
<!-- proxy server绑定的端口 -->
<property name="port">8066</property>
<!-- proxy server绑定的IP -->
<property name="ipAddress">192.168.131.136</property>
<!-- proxy server net IO Read thread size -->
<property name="readThreadPoolSize">20</property>
<!-- proxy server client process thread size -->
<property name="clientSideThreadPoolSize">30</property>
<!-- mysql server data packet process thread size -->
<property name="serverSideThreadPoolSize">30</property>
<!-- socket Send and receive BufferSize(unit:K) -->
<property name="netBufferSize">128</property>
<!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
<property name="tcpNoDelay">true</property>
<!-- 对外验证的用户名 -->
<property name="user">root</property>
<!-- 对外验证的密码 -->
<property name="password">123456</property>
<!-- query timeout( default: 60 second , TimeUnit:second) -->
<property name="queryTimeout">60</property>
</server>
<!--
每个ConnectionManager都将作为一个线程启动。
manager负责Connection IO读写/死亡检测
-->
<connectionManagerList>
<connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
<property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>
<!--
default value is avaliable Processors
<property name="processors">5</property>
-->
</connectionManager>
</connectionManagerList>
<dbServerList>
<!--
一台mysqlServer 需要配置一个pool,
如果多台 平等的mysql需要进行loadBalance,
平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool
简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig
或者自己写一个ObjectPool。
-->
#更改的第二个区域《配置master端登录的信息》
<dbServer name="server1">
<!-- PoolableObjectFactory实现类 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端口 -->
<property name="port">3306</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">192.168.131.129</property>
<property name="schema">test</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">wdd</property>
<!-- 用于登陆mysql的密码 -->
<property name="password">123456</property>
</factoryConfig>
<!-- ObjectPool实现类 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
#更改的第四个区域《配置master和slave负载均衡池(pool)》
<dbServer name="master" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server1</property>
</poolConfig>
</dbServer>
#更改的第三个区域《配置slave端登录的信息》
<dbServer name="server2">
<!-- PoolableObjectFactory实现类 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>
<!-- 真实mysql数据库端口 -->
<property name="port">3306</property>
<!-- 真实mysql数据库IP -->
<property name="ipAddress">192.168.131.130</property>
<property name="schema">test</property>
<!-- 用于登陆mysql的用户名 -->
<property name="user">wdd</property>
<!-- 用于登陆mysql的密码 -->
<property name="password">123456</property>
</factoryConfig>
<!-- ObjectPool实现类 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>
#更改的第五个区域《配置master和slave读写分离》
<dbServer name="slave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
<property name="poolNames">server2</property>
注:上面可以写成<property name="poolNames">server2,server2,server2,server1</property>,也就是说server1和server2都加入读,但是server1:server2=1:3,也就是读一次server1读三次server2
</poolConfig>
</dbServer>
</dbServerList>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>
<property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>
<property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slave</property>
<property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>
4、修改log4j.xml 取消日志文件生成(太大了,磁盘很容易满)
# vim log4j.xml
<param name="file" value="${amoeba.home}/logs/project.log"/>
改成
<param name="file" value="<![CDATA[${amoeba.home}/logs/project.log>/dev/null]]>"/>
5、修改amoeba启动脚本
# vim /usr/local/amoeba/bin/amoeba
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
改为
DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"
6、启动Amoeba脚本
# nohup bash -x /usr/local/amoeba/bin/amoeba & #放入后台运行
# cat nohup.out #查看日志看是否启动成功
# ps -ef | grep amoeba | grep -v grep #查看进程是否启动成功

三、测试读写分离是否成功
1、主机C
# yum -y install mysql
# mysql -u root -p -P 8066 -h 192.168.131.136
![]()
2、主机A主服务器操作
# mysql -u root –p
mysql> use test;
mysql> create table info(
id int(10) unsigned not null auto_increment primary key,
name char(20));
mysql> show tables;

3、主机B从服务器操作
# mysql -u root –p
mysql> use test;
mysql> show tables;

mysql> STOP SLAVE; #为了看到试验结果,停止从服务器
4、主机A操作
mysql> insert into info values (1,'master');
5、主机B操作
mysql> insert into info values (2,'slave');
6、主机C进行测试
mysql> use test; #进行读操作
mysql> select * from info;

mysql> insert into info values (3,'wdd');
7、主机A进行操作
mysql> select * from info; #进行写操作查询

相关文章:
amoeba实现MySQL读写分离
amoeba实现MySQL读写分离 准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为192.168.131.136。三台服务器操作系统为RHEL6.4 x86_64,为…...
angr学习-入门篇
前言: 资源链接:GitHub - jakespringer/angr_ctf(题库仓库,里面有个讲解angr的PPT,里面有官方的题解很详细) GitHub - Hustcw/Angr_Tutorial_For_CTF: angr tutorial for ctf 安装: 关于angr…...
基于java SpringBoot和HTML的博客系统
随着网络技术渗透到社会生活的各个方面,传统的交流方式也面临着变化。互联网是一个非常重要的方向。基于Web技术的网络考试系统可以在全球范围内使用互联网,可以在本地或异地进行通信,大大提高了通信和交换的灵活性。在当今高速发展的互联网时…...
动态sql以及常用的标签
什么是动态sql: 指根据不同的条件生成不同的sql 搭建环境: 建表: create table blog( id varchar(50) not null comment 博客id, title varchar(100) not null comment 博客标题, author varchar(30) not null comment 博客作者, create_ti…...
DID以及社交网络中的ZKP
1. 引言 本文关键术语为: Decentralized Identity (DID,去中心化身份) or self-sovereign identity (SSI,自治身份) :是一个基于开放标准的框架,使用自主、独立的标识符和可验证证书,实现可信的数据交换。…...
基于SWAT-MODFLOW地表水与地下水耦合
耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果,SWAT作为一个地表水模型可以较好的模拟主要的水文过程,包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等,但是对于地下水部分的模拟相对粗糙,考虑到SWAT…...
2023拒绝内卷!两年转行网络安全真实看法!
我目前转行网络安全两年,没啥天分,全靠努力,基本能够得上中级的水平了。看到大家对转行网络安全挺感兴趣,也有挺多争议,想把我的建议和经验告诉大家。 有很多人觉得网络安全已经饱和了,现在选择这个工作&a…...
【SA8295P 源码分析】57 - libDSI_MAX96789_0.so驱动库 之 QDI_Panel_Init 显示屏初始化函数 代码分析
【SA8295P 源码分析】57 - libDSI_MAX96789_0.so驱动库 之 QDI_Panel_Init 显示屏初始化函数 代码分析 一、QDI_Panel_Init() 显示屏初始化函数:Panel_DSI_MAX96789_0_Init()二、QDI_Panel_SetPower() 显示屏初始化:Panel_DSI_MAX96789_0_PowerLCD()三、QDI_Panel_GetInfo() …...
IDEA偶尔编译的时候不识别lombok
偶尔IDEA启动项目的时候会识别不到lombok,识别不到get()跟set()方法 方案 在settings添加下面代码 -Djps.track.ap.dependenciesfalse...
rust学习-构建服务器
单线程server 服务器会依次处理每一个请求,在完成第一个连接的处理之前不会处理第二个连接 // cat main.rs use std::io::prelude::*; use std::net::TcpListener; use std::net::TcpStream;fn main() {let listener TcpListener::bind("127.0.0.1:7878&quo…...
Java并发----进程、线程、并行、并发
一、进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 当一个程序被运行…...
【计算机网络】第 4 课 - 物理层
欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、物理层的基本概念 2、物理层协议的主要任务 3、物理层任务 4、总结 1、物理层的基本概念 在计算机网络中,用来…...
深入理解MVVM架构模式
MVVM原理 MVVM是一种用于构建用户界面的软件架构模式,它的名称代表着三个组成部分:Model(模型)、View(视图)和ViewModel(视图模型)。MVVM的主要目标是将应用程序的UI与其底层数据模…...
配置IPv6 over IPv4手动隧道示例
组网需求 如图1所示,两台IPv6主机分别通过SwitchA和SwitchC与IPv4骨干网络连接,客户希望两台IPv6主机能通过IPv4骨干网互通。 图1 配置IPv6 over IPv4手动隧道组网图 配置思路 配置IPv6 over IPv4手动隧道的思路如下: 配置IPv4网络。配置接…...
Vue3--->组合式API与Pinia
目录 使用create-vue搭建 1、使用create-vue创建项目 2、项目目录和关键文件 组合式API 1、组合式API - setup选项 2、组合式API - reactive和ref函数 3、组合式API - computed 4、组合式API - watch 1、基础使用 - 侦听单个数据 2、基础使用 - 侦听多个数据 3、immediate&…...
三言两语说透柯里化和反柯里化
JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化的概念、实现原理和应用场景,然后介绍反柯里化的概念、实现原理和应用场景,通过大量的代码示例帮助读…...
细讲TCP三次握手四次挥手(四)
常见面试题 为什么TCP连接的时候是3次?2次不可以吗? 因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据…...
HarmonyOS/OpenHarmony元服务开发-配置卡片的配置文件
卡片相关的配置文件主要包含FormExtensionAbility的配置和卡片的配置两部分: 1.卡片需要在module.json5配置文件中的extensionAbilities标签下,配置FormExtensionAbility相关信息。FormExtensionAbility需要填写metadata元信息标签,其中键名称…...
mac安装nacos,M1芯片
第一步,官网下载 》nacos官网 去github中下载对应的版本,本人下载的是1.4.1版本 在这儿选择其他的版本,下面这里选择 tar.gz 压缩包 解压后放到一个非中文的目录下,我选择在 user目录下面创建一个other目录,将使用的环…...
老板说把跳针改过去,什么是主板跳针
最近骑车拍了很多视频,把电脑磁盘堆满了,想着买一条固态SSD卡扩展一下。 一咬牙一跺脚,直接安排,毫不犹豫。顺带加装了无限网卡和蓝牙5.2。 收到后立马安装。安装完发现识别不到新磁盘 确认安装没问题。然后就去问固态硬盘的客服 …...
Windows下用CMake和VS编译gRPC 1.72.0,我踩过的那些坑(附完整依赖库列表)
Windows平台下gRPC 1.72.0编译实战:从CMake配置到VS链接错误的系统化解法 最近在Windows平台上手动编译gRPC 1.72.0的经历可谓是一波三折。作为一个长期在Linux环境下工作的开发者,这次回到Windows平台进行gRPC编译,遇到了不少特有的挑战。本…...
《常见三维CAD模型表示法》
表示法核心思想 / 定义数据结构 / 关键特点优点缺点CAD中的应用场景常见软件 / 文件格式B-rep (边界表示)通过精确记录物体的边界(顶点、边、面)及其拓扑关系(邻接、归属)来定义实体包含几何信息(点坐标、曲线方程、曲…...
Kandinsky-5.0-I2V-Lite-5s性能调优教程:采样步数24平衡效率与质量实测
Kandinsky-5.0-I2V-Lite-5s性能调优教程:采样步数24平衡效率与质量实测 1. 模型简介与核心能力 Kandinsky-5.0-I2V-Lite-5s是一款专为单卡环境优化的轻量级图生视频模型。它能够将静态图片转化为约5秒时长的动态视频(24fps),只需…...
如何组合seo关键词
如何组合SEO关键词 在当今的数字营销环境中,如何组合SEO关键词成为了每一个网站运营者的首要任务。这不仅决定了网站的可见度,还直接影响到流量和最终的转化率。本文将详细探讨如何组合SEO关键词,以实现最佳的搜索引擎优化效果。 什么是SEO…...
张毕贺的音乐故事《越说越明》
张毕贺的音乐故事,始于一把吉他,成于不懈创作,最终汇成一条连接梦想与大众的河流。他的音乐历程,既是个人才华的绽放,也是对音乐教育与本土文化推广的坚定投入。 音乐之路:从翻唱走红到原创深耕 张毕贺的…...
宝塔部署前后端时,配置域名与ssl证书
创建文件夹1.后端部署部署之后点击设置这步骤最关键# HTTP反向代理相关配置开始 >>>location ~ /purge(/.*) {proxy_cache_purge cache_one $Host$request_uri$is_args$args;}location / {proxy_pass http://127.0.0.1:8773;proxy_set_header Host $Host:$server_port…...
OpenClaw故障排查大全:千问3.5-27B接口调用常见错误解决
OpenClaw故障排查大全:千问3.5-27B接口调用常见错误解决 1. 开篇:当OpenClaw遇上千问3.5-27B 上周深夜,我的OpenClaw突然罢工了——一个原本运行良好的自动化脚本在调用千问3.5-27B模型时频繁报错。作为个人效率工具的重度用户,…...
Doorkeeper与Rails Engines集成终极指南:如何在大型项目中组织认证模块
Doorkeeper与Rails Engines集成终极指南:如何在大型项目中组织认证模块 【免费下载链接】doorkeeper Doorkeeper is an OAuth 2 provider for Ruby on Rails / Grape. 项目地址: https://gitcode.com/gh_mirrors/do/doorkeeper Doorkeeper是一个强大的OAuth …...
Symfony Monolog Bundle终极指南:如何快速搭建专业日志系统
Symfony Monolog Bundle终极指南:如何快速搭建专业日志系统 【免费下载链接】monolog-bundle Symfony Monolog Bundle 项目地址: https://gitcode.com/gh_mirrors/mo/monolog-bundle Symfony Monolog Bundle是Symfony框架中一款强大的日志管理工具࿰…...
开发环境配置实战:通过Anaconda Prompt高效管理虚拟环境与Jupyter内核
1. 为什么需要Anaconda Prompt管理虚拟环境 作为数据科学领域的开发者,我经历过无数次Python环境混乱带来的痛苦。记得有一次在交付项目前,突然发现本地运行的模型在服务器上完全无法复现,排查了半天才发现是numpy版本不兼容的问题。这种经历…...
