mysql基于amoeba读写分离
1:基于Amoeba 读写分离
在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是安全性,高可用还是并发等各个方面都不能完全满足实际需求的,因此一般来说都是通过主从复制的方式来同步数据,再通过读写分离来提供数据的高并发负载能力这样的方案来进行部署。
简单来说,读写分离就是只在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库。
(1):目前最常见的MySQL读写分离方案有两种:
<1>:基于程序代码内部实现
在代码中根据select,insert进行路由分类,这类方法也是目前大型生产环境应用最广泛的,优点是性能最好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手
<2>:基于中间代理层实现
代理一般位于客户端和数据库服务器之间,代理服务器接到客户端请求后通过判断转发到后端数据库,代表性程序:
《1》:mysql-proxy为mysql开发早期开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境。
《2》:Amoeba(变形虫)该程序由java语言及逆行开发,阿里巴巴将其应用于生产环境,它不支持事物和存储过程。
通过程序代码实现mysql读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对时代改动就较大,像这种应用一般会考虑使用代理层来实现。
MySQL master 192.168.100.10
MySQL slave 192.168.100.20
MySQL slave 192.168.100.30
MySQL amoeba 192.168.100.40
MySQL client 192.168.100.50
Amoeba(变形虫)项目开源框架于2008年发布一款Amoeba for mysql软件,这个软件致力于mysql的分布式数据库前端代理层,主要为应用层访问mysql的时候充当SQL路由功能,并具有负载均衡,高可用性,SQL过滤,读写分离,可路由到相关的目标数据库,可并发请求多台数据库,通过Amoeba能够完成多数据源的高可用,负载均衡,数据切片的功能,目前Amoeba已经在很多企业的生产线上使用。
部署:
(2):在主机amoeba 上安装JDK环境
《1》:rz 上传JDK软件包,amoeba 软件包,epel 软件包
《2》:chmod +x jdk**** 加权限
《3》:./jdk-6u31-linux-x64.bin 执行
《4》:mv jdk1.6.0_31 /usr/local/jdk1.6 移动
《5》:vim /etc/profile 编辑文件
《6》:添加:
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 提前给amoeba 配置
《7》:rm -rf /usr/bin/java 删除
《8》:source /etc/profile 生效
《9》:java -version 查看版本
(2): 安装amoeba
《1》:mkdir /usr/local/amoeba 创建解压文件
《2》:tar xf amoeba ….. -C /usr/local/amoeba
《3》: chmod -R 755 /usr/local/amoeba 加权限
(3):配置amoeba 读写分离,两个slave 读负载均衡
在 master ,slave1 ,slave2 服务中配置amoeba 的访问授权
《1》:grant all on *.* to 'test'@'192.168.100.%' identified by '123.com';
《2》:flush privileges;
《3》:cd /usr/local/amoeba/conf 切换目录
《4》:vim 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>
《5》:vim dbServers.sml 编辑
<!-- 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>
《6》:/usr/local/amoeba/bin/amoeba start & 启动
《7》:netstat -lnpt |grep 8066 查看端口
(4):安装client 客户端
《1》:yum -y installl mariadb mariadb-devel mariadb-server 安装
《2》:访问amoeba
在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)
mysql基于amoeba读写分离相关推荐
- Mysql基于Amoeba_读写分离搭架
一.Amoeba简介 Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基 ...
- mysql读写分离_MySQL基于amoeba读写分离实验
=========================================== 主从复制只是一个同步数据的方式 读写分离:只在主的上面写,只在从的上面读 读写分离方案:[1]基于程序代码内部 ...
- amoeba mysql读写分离_mysql数据库-基于amoeba读写分离
环境: 主机A( huangzp2):172.16.115.157 主机B( huangzp3):172.16.115.100 主机C( huangzp4):172.16.115.87 说明: 依赖于 ...
- 50、mysql基于mysql-proxy读写分离实战
一.主从配置 192.168.130.61 master 192.168.130.62 slave 192.168.130.63 proxy master配置 [mysqld] socket=/tmp ...
- Mysql 基于 Amoeba 的 读写分离
首先说明一下amoeba 跟 MySQL proxy在读写分离的使用上面的区别: 在MySQL proxy 6.0版本 上面如果想要读写分离并且 读集群.写集群 机器比较多情况下,用mysql pro ...
- 【MySQL】Spring Boot项目基于Sharding-JDBC和MySQL主从复制实现读写分离(8千字详细教程)
目录 前言 一. 介绍 二. 主从复制 1. 原理 2. 克隆从机 3. 克隆从机大坑 4. 远程登陆 5. 主机配置 6. 从机配置 7. 主机:建立账户并授权 8. 从机:配置需要复制的主机 9. ...
- Ubuntu10下MySQL搭建Amoeba_读写分离
一.背景知识 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明.具有负载均衡.高可用性.sql过滤.读写分离.可路由相关 ...
- 使用mysql-proxy 快速实现mysql 集群 读写分离
使用mysql-proxy 快速实现mysql 集群 读写分离 2011-12-29 17:03 目前较为常见的mysql读写分离分为两种: 1. 基于程序代码内部实现:在代码中对select操作分发 ...
- MySQL主从复制与读写分离配置及实操
MySQL主从复制与读写分离 一.MySQL主从复制 1.复制类型 2.工作过程 二.MySQL读写分离 1.定义 2.存在意义 3.作用时间 4.原理 5.类型 基于程序代码内部实现 基于中间代理层 ...
- 如何进行MySQL主从复制与读写分离的配置
MySQL主从复制与读写分离 什么是读写分离? 为什么要读写分离呢? 什么时候要读写分离? 主从复制与读写分离 mysq支持的复制类型 主从复制的工作过程 MySQL主从复制延迟 MySQL主从复制实 ...
最新文章
- Spartan-6的存储元件、多路复用器、快速先行进位逻辑、算术逻辑
- matlab腔内光子寿命,mcFORnp matlab环境下,利用蒙特卡洛模拟光子包在生物组织内的光路传输 271万源代码下载- www.pudn.com...
- 2010.9.29 今日问题
- 互联网晚报 | 1月26日 星期三 | 春晚正式入驻视频号;小红书合并社区与电商业务;中国电信5G消息正式商用...
- Solaris上的开发环境安装及设置
- 直播App测试重点问题 - 服务器压力
- 简单十步让你全面理解SQL
- linux中的设备名称和设备号
- PAT 乙级 1043. 输出PATest(20) Java版
- c语言游戏角色建立,(c语言)游戏中由人物各种信息组成的结构体
- iphone已停用怎么解锁_iPhone X已停用 连接iTunes 怎么办
- 随手记---Pharming
- tar,bz2,bzip等格式解压缩命令汇总
- python的pynput模块控制鼠标、键盘和监听鼠标、键盘事件
- 算法偏见是什么_处理人工智能的偏见如何使算法公平公正
- 工业相机——选型及参数
- icloud账户如何注销_如何从您的iCloud帐户中删除设备
- FastAPI上传POST嵌套JSON对象及List列表BaseModel,python
- 安卓模拟器之王genymotion图文安装教程
- 怎样才能成为一名优秀的软件开发者
热门文章
- 在nginx中使用proxy protocol协议
- 第六章、面向对象的PHP
- 硬盘分区表错误与解决办法
- 图像的一些基本概念整理
- ExcelVBA之InputBox方法
- Operator学习笔记
- linux下载info安装包,Linux软件包安装(rpm、yum、apt-get)
- 天天酷跑php源码_run 模仿“天天酷跑”的游戏功能,涉及引擎编程,Libgdx 结构。图像绘制和动画,地图编 Game Engine 271万源代码下载- www.pudn.com...
- Gauntlet风险评级上线: DeFi杠杆率多高?会不会崩盘?
- Java处理音频文件wav转mp3/mp3转wav