超详细搭建Mysql5.5读写分离

Amoeba简介

Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的 时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发。座落与 Client、DB Server(s)之间,对客户端透明。具有负载均衡、高可用性、SQL 过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。 通过Amoeba你能够完成多数据源的高可用、负载均衡、数据切片的功能,目前Amoeba已在很多 企业的生产线上面使用。

Amoeba优势

Amoeba主要解决以下问题:
数据切分后复杂数据源整合
提供数据切分规则并降低数据切分规则给数据库带来的影响
降低数据库与客户端连接
读写分离路由

Amoeba不足

目前还不支持事务
暂时不支持存储过程
不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致:

工作原理


服务器端责主从复制,两台负责读、一台负责写,写的操作交给了主服务器,同时同步从服务器。客户端负责读写分离,应用客户端发送SQL的请求(包含了读写)发给代理层Amoeba,Amoeba读写分流,分开了,最关键的是Amoeba,相当于路由,打开两道门,一个读,一个写。

搭建思路

  • 主从同步验证
  • 验证允许Amoeba访问数据库
  • 允许客户端访问Amoeba

读写分离实现方式

基于程序代码内部实现
在代码中根据select、insert进行路由分类(select、insert各写入对应的服务器),这类方法目前生产环境应用最广泛。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支
基于中间代理层实现
代理一般位于客户端和服务器端之间,代理服务器接到客户端请求后通过判断后转发到后端数据库
MySQL-Proxy
Amoeba

实验环境

主机名称 IP地址 操作系统 主要软件 网络连接模式
master 192.168.100.71 CentOS 7.4 x86_64 mysql-5.5.24.tar.gz NAT
slave01 T192.168.100.72 CentOS 7.4 x86_64 mysql-5.5.24.tar.gz NAT
slave02 192.168.100.73 CentOS 7.4 x86_64 mysql-5.5.24.tar.gz NAT
amoeba 192.168.100.74 CentOS 7.4 x86_64 jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz NAT
client 192.168.100.75 CentOS 7.4 x86_64 mysql-5.5.24.tar.gz NAT

搭建步骤

一、安装部署Amoeba

1、安装Java环境

[[email protected] ~]# chmod +x jdk-6u14-linux-x64.bin #赋予执行权限

[[email protected] ~]# ./jdk-6u14-linux-x64.bin #执行jdk,一路回车,输入yes

[[email protected] ~]# mv jdk1.6.0_14/ /usr/local/jdk #将解压缩包剪切到其他位置

[[email protected] ~]# vim /etc/profile #配置系统环境变量

末行添加:
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin

[[email protected] ~]# source /etc/profile #重新读取系统环境变量配置文件

[[email protected] ~]# java -version

2、安装并配置Amoeba软件

[[email protected] ~]# mkdir /usr/local/amoeba #创建amoeba安装目录

[[email protected] ~]# tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ #解压amoeba软件

[[email protected] ~]# chmod 755 /usr/local/amoeba/ -R #递归修改权限

[[email protected] ~]# /usr/local/amoeba/bin/amoeba #查看amoeba安装状态

二、部署读写分离

1、主、从三台服务器授权Amoeba访问权限

mysql> grant all on *.* to ‘admin‘@‘192.168.100.%‘ identified by ‘123‘;
mysql> flush privileges;

2、编辑Amoeba主配置文件

[[email protected] ~]# cd /usr/local/amoeba/conf/
[[email protected] conf]# vim amoeba.xml


认证器元素标签,客户端通过认证器设置的账号密码,进行认证,连接amoeba
 <property name="authenticator"> #约27行左右
 <property name="user">amoeba</property>  #约30行左右,设置客户端连接amoeba的账户
 <property name="password">123</property> #32行左右,设置客户端连接amoeba的密码

设置mysql群集
 <property name="defaultPool">master</property> #约115行,编辑,设置默认地址池
 <property name="writePool">master</property>   #约118行,关闭注释,写池子
 <property name="readPool">slaves</property>    #约119行,关闭注释,读池子
 注意这里定义的池子还要在dbServer.xml数据库配置文件中再次引用定义

3、编辑Amoeba数据库配置文件

[[email protected] conf]# vim dbServers.xml

添加连接数据库配置
<dbServer name="abstractServer" abstractive="true"> #约13行,找到此标签
<property name="user">admin</property> #约26行,编辑连接数据库账户
<property name="password">123</property> #约29行左右,打开注释,编辑连接数据库账户密码

 添加三台数据库服务器
<dbServer name="master"  parent="abstractServer"> #45行左右,指定master服务器
          <factoryConfig>
             <property name="ipAddress">192.168.100.71</property> #指定主服务器IP地址
        </factoryConfig>
 </dbServer>

 <dbServer name="slave1"  parent="abstractServer"> #45行左右,编辑指定slave01服务器
        <factoryConfig>
             <property name="ipAddress">192.168.100.72</property> #指定01从服务器IP地址
        </factoryConfig>
 </dbServer>

 <dbServer name="slave2"  parent="abstractServer"> #添加slave02服务器
        <factoryConfig>
             <property name="ipAddress">192.168.100.73</property> #指定从02服务器IP地址
        </factoryConfig>
 </dbServer>

设置mysql群集
 <dbServer name="slaves" virtual="true"> #约65行,找到群集标签,设置群集名称slaves
    <property name="loadbalance">1</property> #负载均衡策略。"1"代表轮询;"2"代表加权轮询;"3"代表高可用
    <property name="poolNames">slave1,slave2</property> #定义集群池成员
 ……

4、启动Amoeba

[[email protected] ~]# /usr/local/amoeba/bin/amoeba start &

三、测试读写分离

1、Client端连接Amoeba

[[email protected] ~]# mysql -uamoeba -p123 -h192.168.100.74 -P 8066

2、在Master上创建一个表,同步到各从服务器上以及关闭各从服务器的Slave功能

[[email protected] ~]# mysql -uroot -p123 #登陆master服务器
mysql> use db_test;
mysql> create table student(id int(10),name varchar(10),address varchar(20))ENGINE=InnoDB DEFAULT CHARSET=utf8;

[[email protected] ~]# mysql -uroot -p #登陆slave01服务器
mysql> use db_test;
mysql> show tables;

mysql> stop slave;#清除slave,停止主从同步
mysql> show slave status\G;

[[email protected] ~]# mysql -uroot -p #登陆slave02服务器
mysql> use db_test;
mysql> show tables;

mysql> stop slave;#清除slave,停止主从同步
mysql> show slave status\G;

3、三台服务器分别插入测试数据

mysql> use db_test;
mysql> insert into student values(‘1‘,‘userAAAAA‘,‘this is master‘);#master服务器添加数据

mysql> use db_test;
mysql> insert into student values(‘2‘,‘userBBBBB‘,‘this is slave_1‘);#slave01服务器添加数据

mysql> use db_test;
mysql> insert into student values(‘3‘,‘userCCCCC‘,‘this is slave_2‘);#slave02服务器添加数据

4、Client查询相应数据

[[email protected] ~]# mysql -uamoeba -p123 -h192.168.100.74 -P 8066 #连接Amoeba

5、Client执行插入操作

mysql> insert into db_test.student values(‘4‘,‘userDDDDD‘,‘write test‘);

[[email protected] ~]# mysql -uroot -p -e ‘select from db_test.student‘

[[email protected] ~]# mysql -uroot -p -e ‘select
from db_test.student‘

[[email protected] ~]# mysql -uroot -p -e ‘select * from db_test.student‘

原文地址:http://blog.51cto.com/11905606/2171394

时间: 2024-10-12 11:42:44

超详细搭建Mysql5.5读写分离的相关文章

mysql5.5 读写分离 半同步

读写分离 一般我们从服务器端是只负责客户的读请求的,主服务端负责写请求的.那么配置下吧!    首先查看下从服务器端的只读方式是否打开.    mysql> show global variables like 'read%';    +----------------------+---------+    | Variable_name        | Value   |    +----------------------+---------+    | read_buffer_size

基于SQL Server搭建主从复制实现读写分离实战演练

一.课程介绍 读写分离(主从同步)从字面意思就可以理解,就是把对数据库的读操作和写操作分离开.读写分离在网站发展初期可以一定程度上缓解读写并发时产生锁的问题,将读写压力分担到多台服务器上.读写分离的基本原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.随着系统的业务量不断增长数据多了之后,对数据库的读.写就会很多.分库减少单台数据库的压力.本文以MS SQL Server数据库为例主库负责写数据.读数据.读库仅负责读数据.写

CentOS 6.8搭建mysql-proxy实现读写分离

CentOS 6.8搭建mysql-proxy实现读写分离: 下载网址:http://ftp.ntu.edu.tw/MySQL/Downloads/MySQL-Proxy 注:1.10.0.1.2为mysql-proxy服务器ip2.效果是1个写,2个读 tar zxfv mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /space mv /space/mysql-proxy-0.8.5-linux-el6-x86-64bit /space/mys

GTID及mysql-proxy实现mysql5.6读写分离

GTID说明: MySQL 5.6引入的GTID(Global Transaction IDs)使得其复制功能的配置.监控及管理变得更加易于实现,且更加健壮. 要在MySQL 5.6中使用复制功能,其服务配置段[mysqld]中于少应该定义如下选项: binlog-format:二进制日志的格式,有row.statement和mixed几种类型: 用于启动GTID及满足附属的其它需求: log-slave-updates:当从服务器复制时是否启用二进制日志 gtid-mode:是否启用gtid功

超详细搭建SVN+Nginx+PHP+MySQL+MFS服务构建社交网站

简介 公司的社交网站采用PHP语言开发,为了管理PHP程序员开发的代码,上级领导要求搭建SVN服务器进行版本控制.社交网站的第一个版本部署在LNMP平台上,前端为Nginx,通过fastcgi协议访问后端的PHP服务器.为了保证数据安全,要求搭建MySQL数据库主从集群. 社交网站包含用户的相册功能,允许用户上传照片,上传照片需要使用共享存储来存放.公司决定使用MFS分布式文件系统,并将MFS挂载到PHP服务器的相关目录下. 实验环境 主机名称 操作系统 IP地址 主要软件 Nginx Cent

MySQL5.5读写分离之mysql-proxy

通常一个网站在初期访问量都比较小,所以一般的小架构足以支撑.但是,当网站逐渐发展起来后,随之而来的是大量的访问,这时候最先出现的瓶颈就是数据库了.因为数据的写入读取操作(I/O)是集群中响应速度最慢的,所以在集群建设时就要规划好后端存储架构. 后端存储数据库架构普遍是主从复制,这样解决了数据备份问题.但是,由前端来的读写请求都要经过主库,量小没问题,当量大到超过主库的性能极限时,主库分分钟会宕机. 为了避免主库宕机这种灾难性事件的发生,读写分离的设计诞生了!把写的请求只交给主库,读的请求由主库和

MySQL5.6 读写分离

一:读写分离架构图 二:安装配置MySQL-Proxy 三:测试读写分离 四:添加MySQL-Proxy 为系统服务 1.1读写分离架构图 1.Slave-1不接收写,也不接收读 2.Slave-1有中继日志,也有二进制日志,因为它需要接收Slave-1发送过来的数据,又要把数据发送给其它从服务器,但是它不需要存储数据. 3.因为Slave-1不需要存储数据,所以使用black hole存储引擎 2.1下载MySQL-Proxy http://dev.mysql.com/downloads/my

图文并茂超详细搭建memcache缓存服务器(nginx+php+memcache+mysql)

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 一.MemCache简述 session MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度. MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串.对象等)所使用的k

图文并茂超详细搭建redis缓存服务器(nginx+tomcat+redis+mysql实现session会话共享)

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 一.redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会