• MySQL读写分离原理
  • 应用场景
  • 实验前设计
  • 一 、安装Amoeba
    • 1. 所有服务器关闭Firewalld或者进行规则设置并搭建Mysql主从复制环境
      • 搭建主从复制详细步骤链接
    • 2.Amoeba服务器环境安装
      • 补充
    • 3.解压Amoeba
    • 4.配置启动脚本,并设置为系统服务
  • 二、配置Amoeba读写分离,两个Slave读负载均衡
    • 1.在master、slave1和slave2中执行以下操作开放权限给Amoeba
    • 2.修改amoeba.xml配置文件
    • 3.修改代表dbServers.xml配置文件
    • 4.启动Amoeba
  • 三、验证试验结果
    • 1.首先关闭主从同步,去两台从服务器slave1和slave2,关闭同步复制,否则会影响试验验证
    • 2.验证两台从服务器的“只读”效果
      • 2.1在master中插入数据
      • 2.2在slave1中插入数据
      • 2.4去客户机测试
    • 3. 验证master的“只写”功能
      • 3.1首先在客户机写入数据
      • 3.2去master查看表数据
      • 3.3去slave1和slave2查看表数据

MySQL读写分离原理

  • 读写分离就是只在主服务器上写,只在从服务器上读
  • 主数据库处理事务性查询,而从数据库处理select查询
  • 数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库

应用场景

  • 在企业应用中,在大量的数据请求下,单台数据库将无法承担所有的读写操作
  • 配置多台数据库服务器以实现读写分离
  • 在主从复制的基础上实现读写分离

实验前设计

  1. amoeba依赖于java环境,需要预先安装jdk环境
  2. 读写分离基于主从同步复制
  3. 实现主从复制,读写分离需要授权三个用户
    ◆ master授权主从同步账户
    ◆ 所有数据库服务器授权供Amoeba访问的用户
    ◆ Amoeba在amoeba.xml文件中授权客户端访问Amoeba的账户
  4. amoeba有两个主要文件(amoeba.xml和dbservers.xml)

一 、安装Amoeba

1. 所有服务器关闭Firewalld或者进行规则设置并搭建Mysql主从复制环境

搭建主从复制详细步骤链接

2.Amoeba服务器环境安装

安装jdk(因为amoeba是Java写的,所以我们需要安装jdk)

[root@localhost opt]# java -version   //检查java版本
-bash: java: command not found    //没有安装
[root@localhost ~]# ls   //查看jdk安装包
amoeba-mysql-3.0.5-RC-distribution.zip   jdk-8u144-linux-x64.tar.gz
[root@localhost ~]# tar xzvf jdk-8u144-linux-x64.tar.gz -C /opt
[root@localhost ~]# cd /opt
[root@localhost opt]# cp -rv jdk1.8.0_144/ /usr/local/java  //拷贝到/usr/local/目录下便于管理
[root@localhost ~]# vi /etc/profile    //设置环境变量
……省略部分
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib
[root@localhost ~]# java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
补充

因为Amoeba并不是支持所有的Java环境,支持1.5和1.6版本和少部分的1.8版本,因此在安装前需要检查Java版本,若不合适,则需要卸载重新安装。以下是卸载办法
卸载原有的java环境

[root@localhost ~]# java -version    ##确定java版本  1.8.0_181的 有点高
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)[root@localhost ~]# rpm -qa |grep java
java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64          ####卸载
tzdata-java-2018e-3.el7.noarch
python-javapackages-3.4.1-11.el7.noarch
java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64                          ####卸载
javapackages-tools-3.4.1-11.el7.noarch
java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64                      ####卸载
java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_6       ####卸载##查出openjdk相关的文件并且删除它###
[root@localhost ~]#  rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64
[root@localhost ~]#  rpm -e --nodeps java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64
[root@localhost ~]#  rpm -e --nodeps java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64
[root@localhost ~]#  rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_64

3.解压Amoeba

[root@localhost ~]# yum -y install unzip  ##zip格式压缩包需要unzip程序解压
[root@localhost ~]# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
[root@localhost ~]# mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
[root@localhost ~]# chmod -R 755 /usr/local/amoeba/   ##提权限
[root@localhost ~]# vi /usr/local/amoeba/jvm.properties
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k"
//将32行JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss196k -XX:PermSize=16m -XX:MaxPermSize=96m" 进行修改

4.配置启动脚本,并设置为系统服务

[root@localhost ~]# vi /etc/init.d/amoeba   ##编写amoeba启动程序脚本
#!/bin/bash
#chkconfig: 35 62 62
#
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
NAME=Amoeba
AMOEBA_BIN=/usr/local/amoeba/bin/launcher
SHUTDOWN_BIN=/usr/local/amoeba/bin/shutdown
PIDFILE=/usr/local/amoeba/Amoeba-MySQL.pid
SCRIPTNAME=/etc/init.d/amoebacase "$1" in
start)
echo -n "Starting $NAME... "
$AMOEBA_BIN
echo " done"
;;
stop)
echo -n "Stoping $NAME... "
$SHUTDOWN_BIN
echo " done"
;;
restart)
$SHUTDOWN_BIN
sleep 1
$AMOEBA_BIN
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}"
exit 1
;;
esac
[root@localhost ~]# chmod +x /etc/init.d/amoeba
[root@localhost ~]# chkconfig --add amoeba
[root@localhost ~]# chkconfig --list amoeba  ##成功加入启动项
Note: This output shows SysV services only and does not include nativesystemd services. SysV configuration data might be overridden by nativesystemd configuration.If you want to list systemd services use 'systemctl list-unit-files'.To see services enabled on particular target use'systemctl list-dependencies [target]'.amoeba           0:off   1:off   2:off   3:on    4:off   5:on    6:off
[root@localhost ~]# service amoeba start  //开启Amoeba
Ctrl+c    ##放到后台
[root@localhost ~]# netstat -anpt | grep 8066    //检查监听状况,开启成功
tcp6    0     0 :::8066          :::*           LISTEN      28116/java

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

1.在master、slave1和slave2中执行以下操作开放权限给Amoeba

[root@localhost ~]# mysql -uroot -p
……省略部分
mysql> create database test;   //注意,一定要创建和授权账号同名的库,否则后面会出错
Query OK, 1 row affected (0.01 sec)
mysql> GRANT ALL  ON *.* TO test@'20.0.0.%' IDENTIFIED BY 'abc123';   //授权账号test,密码abc123
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;    //重新加载授权
Query OK, 0 rows affected (0.01 sec)

2.修改amoeba.xml配置文件

(代码前面的数字是对应配置文件中的行数,方便查找)

[root@localhost ~]# cd /usr/local/amoeba/conf
[root@localhost conf]# vim amoeba.xml28                                         <property name="user">amoeba</property>29 30                                         <property name="password">abc123</property>83                 <property name="defaultPool">master</property>84                 <property name="writePool">master</property>  //去掉这里的注释85                 <property name="readPool">slaves</property>   //去掉这里的注释

3.修改代表dbServers.xml配置文件

(代码前面的数字是对应配置文件中的行数,方便查找)

     22                         <!-- mysql schema -->23                         <property name="schema">mysql</property>    //amoeba所属库名称,默认是test,这里指定的库名在master数据库中必须要存在,但是5.7版本共数据库是没有test数据库的,因此使用5.7版本,要么在master中创建一个test库,要么改成主数据库中已有的库名,如mysql。24 25                         <!-- mysql user -->26                         <property name="user">test</property>27 28                         <property name="password">abc123</property>43         <dbServer name="master"  parent="abstractServer">44                 <factoryConfig>45                         <!-- mysql ip -->46                         <property name="ipAddress">20.0.0.12</property>47                 </factoryConfig>48         </dbServer>49 50         <dbServer name="slave1"  parent="abstractServer">51                 <factoryConfig>52                         <!-- mysql ip -->53                         <property name="ipAddress">20.0.0.18</property>54                 </factoryConfig>55         </dbServer>56 57         <dbServer name="slave2"  parent="abstractServer">58                 <factoryConfig>59                         <!-- mysql ip -->60                         <property name="ipAddress">20.0.0.19</property>61                 </factoryConfig>62         </dbServer>64         <dbServer name="slaves" virtual="true">65                 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">66                         <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->67                         <property name="loadbalance">1</property>68 69                         <!-- Separated by commas,such as: server1,server2,server1 -->70                         <property name="poolNames">slave1,slave2</property>

4.启动Amoeba

[root@localhost ~]# service amoeba restart
[root@localhost ~]#  netstat -anpt | grep java   //端口开启成功
tcp6       0      0 :::8066                 :::*                    LISTEN      19029/java
……省略部分

三、验证试验结果

1.首先关闭主从同步,去两台从服务器slave1和slave2,关闭同步复制,否则会影响试验验证

[root@localhost ~]# mysql -uroot -p
……省略部分
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

2.验证两台从服务器的“只读”效果

验证设计:
在关闭主从同步的前提下,我们同时在三台服务器中写入数据,客户机应当只读两台从服务器slave的数据,而不会读取master中的数据

2.1在master中插入数据

mysql> use test;
mysql> create table list (name char(16),id char(16));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into list values('master',1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from list;
+-------------+------+
| name   | id   |
+--------+------+
| master | 1    |
+--------+------+
1 row in set (0.00 sec)

2.2在slave1中插入数据

mysql> use test;
mysql> create table list (name char(16),id char(16));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into list values('slave1',2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from list;
+--------+------+
| name   | id   |
+--------+------+
| slave1 | 2    |
+--------+------+
1 row in set (0.00 sec)
(2.3)在slave2中插入数据
mysql> use test;
mysql> create table list (name char(16),id char(16));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into list values('slave2',3);
Query OK, 1 row affected (0.00 sec)
mysql> select * from list;
+--------+------+
| name   | id   |
+--------+------+
| slave2 | 3    |
+--------+------+

2.4去客户机测试

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bbs                |
| myadm              |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
7 rows in set (0.01 sec)MySQL [(none)]> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
MySQL [test]> select * from list;
+--------+------+
| name   | id   |
+--------+------+
| slave1 | 2    |
+--------+------+
1 row in set (0.01 sec)MySQL [test]> select * from list;
+--------+------+
| name   | id   |
+--------+------+
| slave2 | 3    |
+--------+------+
1 row in set (0.01 sec)

3. 验证master的“只写”功能

验证设计:
在客户端写入数据,应该只是在master服务器中写入数据,在没有主从同步的前提下,从服务器应该是没有客户机写入的数据的。

3.1首先在客户机写入数据

MySQL [test]> create table zhang1 (id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.03 sec)
MySQL [test]>  insert into zhang1 values('4','zhang','write_test');
Query OK, 1 row affected (0.04 sec)

3.2去master查看表数据

mysql> select * from zhang1;
+------+-------+------------+
| id   | name  | address    |
+------+-------+------------+
|    4 | zhang | write_test |
+------+-------+------------+
1 row in set (0.00 sec)

3.3去slave1和slave2查看表数据

mysql> select * from zhang1;
ERROR 1146 (42S02): Table 'test.zhang1' doesn't exist

超实用!!MySQL数据库——Amoeba读写分离相关推荐

  1. 徐无忌MySQL笔记:案例实战:如何实现MySQL数据库的读写分离?

    徐无忌MySQL笔记:案例实战:如何实现MySQL数据库的读写分离? 完成:第一遍 1.理想的主从架构实现的效果是怎样的? 主库负责所有读写操作,从库只实现对主库备份功能,这样的主从架构性价比是很低的 ...

  2. linux企业实战 --MySQL数据库之读写分离

    文章目录 1. MySQL读写分离 2. MySQL-proxy实现读写分离 1. MySQL读写分离 Mysql的主从复制和Mysql的读写分离两者有着紧密联系. 首先部署主从复制,只有主从复制完了 ...

  3. 基于amoeba实现mysql数据库的读写分离/负载均衡

    更多博文请关注:没有伞的孩子必须努力奔跑 (www.xuchanggang.cn) 一.Amoeba的简述:[来自百度百科]      Amoeba是一个以MySQL为底层数据存储,并对应用提供MyS ...

  4. MySQL数据库:读写分离

    一.读写分离的原理: 1.实现原理: 读写分离解决的是,数据库的写操作,影响了查询的效率,适用于读远大于写的场景.读写分离的实现基础是主从复制,主数据库利用主从复制将自身数据的改变同步到从数据库集群中 ...

  5. Mysql数据库的读写分离

    读写分离,即在主数据库中进行写操作(也可以进行增.删.改操作),在从数据库中进行读操作.在正常情况下,我们对主数据库进行的是增.删.改.查操作,数据库的写入时间比较长,而查询时间短,所以为了提高数据库 ...

  6. Atlas实现MySQL数据库的读写分离

    在实现了mysql的主从配置后,博主这里准备实现一下mysql的读写分离 这里我选择的是360团队的Atlas作为代理当然还可以使用mycat,one proxy,proxySQL等等开源的中间件,有 ...

  7. MySQL数据库mycat读写分离

    mycat读写分离 Mycat的读写分离是建立在Mysq的主从复制的基础上的 修改配置文件 schema.xml <?xml version="1.0"?> <! ...

  8. mysql读写分离_Mysql数据库09MySQL读写分离

    Mysql数据库09-MySQL读写分离 一.读写分离应用案例分析 在企业用户中,在大量的数据请求下,单台数据库将无法承担所有读写操作.解决方法:配置多台数据库服务器以实现主从复制+读写分离. 二.读 ...

  9. 【数据库七】搭建MySQL主从复制和读写分离详解

    详解搭建搭建MySQL主从复制和读写分离 1.案例实施:搭建MySQL主从复制 1.1 主节点数据库(CentOS 7-5) 1.2 从节点数据库(CentOS 7-6) 1.3 从节点数据库(Cen ...

  10. Django项目配置mysql主从数据库实现读写分离

    1.在配置文件中添加slave数据库的配置 DATABASES = {     'default': {         'ENGINE': 'django.db.backends.mysql',   ...

最新文章

  1. 数据库常用sql语句
  2. 洛谷——P1951 收费站_NOI导刊2009提高(2)
  3. Java 注解 Annotation
  4. STL - bitset
  5. 可视化图形(二):热力图-imshow()
  6. 6显示wan口未插线_WiFi 6到底6不6——华硕 AX56U热血版 路由器评测
  7. 前端学习(270):百度弹性导航
  8. python类的定义和创建_Python类对象的创建和使用
  9. VMware虚拟机中不识别移动硬盘
  10. 【Rayeager PX2分享】OpenCV入门之图像显示
  11. 20145326蔡馨熠《信息安全系统设计》第7周学习总结
  12. 常见计算机录制屏幕软件名称,录制电脑屏幕视频的软件有什么?
  13. Java选择排序(升序和降序)
  14. 的欧美HTML游戏,国外十大HTML5、JavaScript 3D游戏引擎和框架
  15. 鲁大师11月新机排行:只有5款机型发布,OPPO撑起榜单
  16. linux下检测USB的热插拨
  17. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡
  18. 在Linux中查找和删除重复文件的4种方法
  19. windows中mysql服务无法启动
  20. 可视化大屏设计_最高效的大屏展示不只是酷炫

热门文章

  1. Ora-12514原因及处理方法
  2. 计算机搜索功能在分区里失灵,DiskGenius搜索已丢失分区(重建分区表)
  3. 2017腾讯暑期实习生从笔试到面试总结(附带华为、阿里面试经历)
  4. ios手机添加frida软件源
  5. 民谣吉他之新手调音,弦音不对的问题
  6. 聊聊计算和这个世界(上)
  7. 2021基于vscode以及jlink调试esp32最新
  8. GRUB4DOS使用大全
  9. 【2020】年学而思全套暑秋寒春(1376G)
  10. java 登陆界面 报告_java登陆界面实验报告