mysql基于Amoeba(变形虫)实现读写分离

一、实验环境

1、准备五台主机,其中三台已经实现了Mysql的主从复制(主从复制不再演示,从安装Amoeba开始),一台安装Amoeba,一台用作试验机

  • mysql-master:192.168.200.111
  • mysql-slave1:192.168.200.112
  • mysql-slave2:192.168.200.113
  • Amoeba:192.168.200.114
  • Client:192.168.200.115

2、所有主机关闭安全机制和防火墙。

[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# iptables -F
[[email protected] ~]# setenforce 0

二、在主机Amoeba上安装java环境(192.168.200.114)

1、上传需要的安装包

[[email protected] ~]# ls
amoeba-mysql-binary-2.2.0.tar.gz  jdk-6u14-linux-x64.bin
anaconda-ks.cfg

2、执行.bin文件(就相当于解压.tar包)

[[email protected] ~]# chmod +x jdk-6u14-linux-x64.bin
[[email protected] ~]# ./jdk-6u14-linux-x64.bin
[[email protected] ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6

3、设置开机启动项,添加内容

[[email protected] ~]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6     //声明一个全局变量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   //amoeba的解压路径
export PATH=$PATH:$AMOEBA_HOME/bin   //amoeba的命令

4、jdk安装完成后,java的版本与jdk的版本不同,删除高版本的java程序文件,重新执行一下/etc/profile

[[email protected] ~]# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
[[email protected] ~]# which java
/usr/bin/java
[[email protected] ~]# rm -rf /usr/bin/java
[[email protected] ~]# source /etc/profile
[[email protected] ~]# java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

三、安装并配置Amoeba(192.168.200.114)

1、解压安装包

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

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

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

[[email protected] ~]# mysql -uroot -p123123    //三台主机都要执行
MariaDB [(none)]> grant all on *.* to ‘test‘@‘192.168.200.%‘ identified by ‘123123‘;   //对所有库下的所有表,授权的用户名为test,允许访问的网段为200网段,密码为123123.
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

4、编辑amoeba.xml配置文件

[[email protected] ~]# cd /usr/local/amoeba/
[[email protected] amoeba]# ls
benchmark  changelogs.txt  lib          README.html
bin        conf            LICENSE.txt
[[email protected] amoeba]# cd conf/
[[email protected] conf]# ls
access_list.conf  dbServers.xml    log4j.xml
amoeba.dtd        function.dtd     rule.dtd
amoeba.xml        functionMap.xml  ruleFunctionMap.xml
dbserver.dtd      log4j.dtd        rule.xml
[[email protected] conf]# cp amoeba.xml amoeba.xml.bak
[[email protected] conf]# vim amoeba.xml
30           <property name="user">amoeba</property>      //客户端必须拿这个用户名和密码登录amoeba
32           <property name="password">123123</property>

115          <property name="defaultPool">master</property>   //默认
118          <property name="writePool">master</property>    //写的池,交给master
119          <property name="readPool">slaves</property>     //读的池,交给slaves组

5、编辑dbServer.xml配置文件

[[email protected] conf]# cp dbServers.xml dbServers.xml.bak

[[email protected] ~]# vim /usr/local/amoeba/conf/dbServers.xml
 19                         <!-- mysql port -->
 20                         <property name="port">3306</property>
 21
 22                         <!-- mysql schema -->
 23                         <property name="schema">test</property>
 24
 25                         <!-- mysql user -->
 26                         <property name="user">test</property>
 27
 28                         <!--  mysql password -->
 29                         <property name="password">123123</property>

 45         <dbServer name="master"  parent="abstractServer">
 46                 <factoryConfig>
 47                         <!-- mysql ip -->
 48                         <property name="ipAddress">192.168.200.111</property>
 49                 </factoryConfig>
 50         </dbServer>
 51
 52         <dbServer name="slave1"  parent="abstractServer">
 53                 <factoryConfig>
 54                         <!-- mysql ip -->
 55                         <property name="ipAddress">192.168.200.112</property>
 56                 </factoryConfig>
 57         </dbServer>
 58         <dbServer name="slave2"  parent="abstractServer">
 59                 <factoryConfig>
 60                         <!-- mysql ip -->
 61                         <property name="ipAddress">192.168.200.113</property>
 62                 </factoryConfig>
 63         </dbServer> 

 66         <dbServer name="slaves" virtual="true">    //声明组
 67                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
 68                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
 69                         <property name="loadbalance">1</property>  //组内成员的效果为轮询
 70
 71                         <!-- Separated by commas,such as: server1,server2,server1 -->
 72                         <property name="poolNames">slave1,slave2</property>
 73                 </poolConfig>
 74         </dbServer>

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

nohup:执行命令不依赖于任何终端

[[email protected] ~]# nohup /usr/local/amoeba/bin/amoeba start &   //将命令放到后台运行,不依赖于任何终端

[[email protected] ~]# netstat -lnpt   //查看端口8066
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1366/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1632/master
tcp6       0      0 :::8066                 :::*                    LISTEN      21943/java
tcp6       0      0 127.0.0.1:18195         :::*                    LISTEN      21943/java
tcp6       0      0 :::22                   :::*                    LISTEN      1366/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1632/master 

四、client客户机访问测试(192.168.200.115)

安装mariadb

1、连接数据库测试

[[email protected] ~]# mysql -u amoeba -p123123 -h 192.168.200.114 -P 8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 74675057
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)]> 

2、测试读写分离

master主机上

MariaDB [(none)]> create database db_test;
Query OK, 1 row affected (0.00 sec)

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

建完库之后在两台slave机上查看,能看到新建的库说明主从复制没有问题

3、将两台slave主机上的主从服务给关掉

salve1:
MariaDB [(none)]> stop salve;

-------------------------------------------------------------------------------

slave2:
MariaDB [(none)]> stop salve;

编写测试

master:
MariaDB [db_test]> insert into student values(‘1‘,‘crushlinux‘,‘this_is_master‘);
Query OK, 1 row affected (0.01 sec)

---------------------------------------------------------------------------
slave1:
MariaDB [db_test]> insert into student values(‘2‘,‘crushlinux‘,‘this_is_slave1‘);
Query OK, 1 row affected (0.00 sec)

--------------------------------------------------------------------------
slave2:
Database changed
MariaDB [db_test]> insert into student values(‘3‘,‘crushlinux‘,‘this_is_slave2‘);
Query OK, 1 row affected (0.01 sec)

从client客户机上访问,访问到的是两台salve机的轮询

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

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

4、客户机上添加一个数据,访问,还是读到两台slave机上的

MySQL [db_test]> insert into student values(‘4‘,‘crushlinux‘,‘this_is_client‘);
Query OK, 1 row affected (0.01 sec)

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

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

在client机上写数据时,写交给master主机来处理,两台slave主机没有变化,因为此时主从服务已经停了,所以两台slave机上不会访问到master主机上写入的内容

5、开启主从复制测试

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

-----------------------------------------------------------------------
slave2:
MariaDB [db_test]> start slave;
Query OK, 0 rows affected (0.01 sec)

==========================================

client:
MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    3 | crushlinux | this_is_slave2 |
|    1 | crushlinux | this_is_master |
|    4 | crushlinux | this_is_client |
+------+------------+----------------+
3 rows in set (0.01 sec)

MySQL [db_test]> select * from student;
+------+------------+----------------+
| id   | name       | address        |
+------+------------+----------------+
|    2 | crushlinux | this_is_slave1 |
|    1 | crushlinux | this_is_master |
|    4 | crushlinux | this_is_client |
+------+------------+----------------+
3 rows in set (0.01 sec)

主从复制开启后,两台slave机上可以读取到master主机上写入的数据,client在访问测试的时候就能读到主机上的数据,因为两台slave机是轮询效果,所以能访问到1、2、4或1、3、4

原文地址:https://www.cnblogs.com/tanxiaojuncom/p/11684712.html

时间: 2024-10-12 13:57:20

mysql基于Amoeba(变形虫)实现读写分离的相关文章

MySQL基于 amoeba.xml的读写分离

1.准备两台服务器  centos7 192.168.52.35 192.168.52.36 2.关闭防火墙 [[email protected] ~]# systemctl stop firewalld [[email protected] ~]# setenforce 0 3.两台都下载mysql yum -y install mariadb mariadb-server 4.编辑MySQL配置文件 第一台: [[email protected] ~]# vim /etc/my.cnf [m

mysql基于amoeba配置读写分离

                     Mysql高级集群-读写分离Amoeba                          mysql在配置好主从复制之后,已经达到双机热备和容灾的效果.此博客是建立在主从复制的前提上 ,mysql基于amoeba的配置读写分离在我看来:就是为了达到数据库高可用性,安全性以及高并发,达到 负载均衡的效果.说简单点,我个人觉得意思就是让主服务器轻松点,不易挂掉.还有就是充分利用从服务器.  本人水平有限,望各位大神多多指点指点.我非常乐意听取意见. 此版本

高可用架构篇--MyCat在MySQL主从复制基础上实现读写分离

点击链接加入群[Dubbo技术交流2群]:https://jq.qq.com/?_wv=1027&k=46DcDFI 一.环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso JDK版本:jdk1.7.0_45 MyCat版本:Mycat-server-1.4-release-20151019230038-linux.tar.gz MyCat节点IP:192.168.1.203      主机名:edu-mycat-01  主机配置:4核CPU.4G内存 MySQL版本:

Mysql主从配置,实现读写分离

大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢失的话,后果更是 不堪设想.这时候,我们会考虑如何减少数据库的联接,一方面采用优秀的代码框架,进行代码的优化,采用优秀的数据缓存技术如:memcached,如果资金丰厚的话,必然会想到假设服务器群,来分担主数据库的压力.Ok切入今天微博主题,利用MySQL主从配置,实现读写分离,减轻数据库压力.这种

mysql基于amoeba的读写分离

如何实现mysql读写分离 : 通常来说有两种方式:                      master<--->master  (前读,后写)                                                                          | 1,应用程序层实现                                                                                          

MySQL基于Amoeba实现读写分离

读写分离应用分析: 在企业用户中,在大量的数据请求下,单台数据库将无法承担所有读写操作.解决方法: 配置多台数据库服务器以实现主从复制+读写分离.  1.基于程序代码内部实现 在代码中根据select. insert 进行路由分类,这种方法目前生产环境中应用最广泛.优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支.缺点是需要开发人员能来实现,运维人员无从下手. 2.基于中间代理层实现 代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库. 常

mysql+amoeba 主从复制,读写分离,负载均衡

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

基于mysql主从同步的proxy读写分离

架构示意图            ___ master_mysql(10.10.10.3)        |          |    mysql-proxy(10.10.10.2)   |       |___       |            slave_mysql(10.10.10.4) (一)mysql主从同步 1.mysql-master设置 (1) server-id = 1    //master端ID号 binlog-ignore-db =    //设置不同步的sql库

MySQL 数据库的主从复制与读写分离

在实际生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是安全性.高可用性,还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案来进行部署与实施. MySQL 的主从复制和读写分离两者有着紧密关联,首先要部署主从复制,才能在此基础上进行数据的读写分离. MySQL 主从复制的复制类型1) 基于语句的数据.在主服务器上执行的 SQL 语句,在从服务器上执行同样的