Mysql数据库09-MySQL读写分离

一、读写分离应用案例分析

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

二、读写分离实现方法

1、基于程序代码内部实现

在代码中根据select、insert进行路由分类,这种方法目前生产环境中应用最广泛。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支。缺点是需要开发人员能来实现,运维人员无从下手。

2、基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库。

常见的代理服务器:

·MySQL-Proxy

·Amoeba

三、Amoeba软件介绍

1、Amoeba简介

Amoeba(变形虫),致力于MySQL的分布式数据库前端代理,主要为应用层访问MySQL的时充当SQL路由功能,能够将相关的SQL路由到目标数据库

2、Amoeba特点

·负载均衡

·高可用性

·SQL过滤

·读写分离

·可并发请求多台数据库

四、Amoeba实现MySQL读写分离案例

实验环境:

amoeba:192.168.2.10/24

mysql-master:192.168.2.11/24

mysql-slave1:192.168.2.12/24

mysql-slave2:192.168.2.13/24

client:192.168.2.100/24

先实现MySQL数据库的主从复制,方法详见上一章,此处略

1、安装Amoeba上安装Java环境(推荐安装jdk1.5或1.6,不建议安装1.7版本)

[root@amoeba ~]# ls

amoeba-mysql-binary-2.2.0.tar.gz  install.log         jdk-6u14-linux-x64.bin

anaconda-ks.cfg                   install.log.syslog

[root@amoeba ~]# chmod +x jdk-6u14-linux-x64.bin

[root@amoeba ~]# ./jdk-6u14-linux-x64.bin

一路空格,输入yes,回车完成

[root@amoeba ~]# ls

amoeba-mysql-binary-2.2.0.tar.gz  install.log        jdk1.6.0_14

anaconda-ks.cfg                   install.log.syslog  jdk-6u14-linux-x64.bin

[root@amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6

[root@amoeba ~]# vim /etc/profile

在最后添加:

export JAVA_HOME=/usr/local/jdk1.6

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

export AMOEBA_HOME=/usr/local/amoeba/

export PATH=$PATH:$AMOEBA_HOME/bin

[root@amoeba ~]# . /etc/profile

[root@amoeba ~]# 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)

2、安装配置Amoeba

[root@amoeba ~]# mkdir /usr/local/amoeba

[root@amoeba ~]# tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/

[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/

[root@amoeba ~]# /usr/local/amoeba/bin/amoeba

amoeba start|stop              //出现此行用法说明,证明配置无误

如果出现以下信息表示错误:

The stack size specified is too small, Specify at least 160k

Could not create the Java virtual machine.

当出现以上报错信息解决方法是:

[root@amoeba ~]# vi /usr/local/amoeba/bin/amoeba

修改58行的Xss参数:

58 DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"

修改如下:

58 DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"

3、配置amoeba实现mysql-slave1、slave2读负载均衡

在三台MySQL服务器上对amoeba授权

mysql> grant all on *.* to 'admin'@'192.168.2.%' identified by '123';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

编辑amoeba.xml配置文件,设置读写分离

[root@amoeba ~]# cd /usr/local/amoeba/conf/

[root@amoeba conf]# ls

access_list.conf  dbserver.dtd   functionMap.xml  rule.dtd

amoeba.dtd        dbServers.xml  log4j.dtd        ruleFunctionMap.xml

amoeba.xml        function.dtd   log4j.xml        rule.xml

[root@amoeba conf]# cp amoeba.xml amoeba.xml.origin

[root@amoeba conf]# vim amoeba.xml

118066       //默认端口8066,无需修改

30amoeba       //设置一个用户,后面客户端访问时使用

32123456              //设置登录密码

115 master       //默认的服务器池

117master       //写服务器池

118slaves              //读服务器池

把注释   -->删掉,如下图

编辑dbServer.xml配置文件,设置登录MySQL服务器的用户及密码、MySQL服务器节点的IP地址、负载均衡算法

[root@amoeba conf]# cp dbServers.xml dbServers.xml.origin

[root@amoeba conf]# vim dbServers.xml

20 3306              //设置MySQL连接端口,默认3306

26admin              //设置访问MySQL服务器所用的用户名

27 123       //设置访问MySQL服务器所用的密码

43master"  parent="abstractServer">       //设置MySQL服务器及IP地址

46192.168.2.11

50slave1"  parent="abstractServer">

53 192.168.2.12

56slave2"  parent="abstractServer">

59192.168.2.13

63               //在amoeba.xml文件中设置的readPool

69 slave1,slave2       //前面定义的服务器节点名

4、启动amoeba

[root@amoeba ~]# /usr/local/amoeba/bin/amoeba start &

[root@amoeba ~]# jobs

[1]+  Running                 /usr/local/amoeba/bin/amoeba start &

[root@amoeba ~]# netstat -anpt |grep java

tcp        0      0 ::ffff:127.0.0.1:54481      :::*                        LISTEN      1563/java

tcp        0      0 :::8066                     :::*                        LISTEN      1563/java

tcp        0      0 ::ffff:192.168.2.10:58065   ::ffff:192.168.2.11:3306    ESTABLISHED 1563/java

tcp        0      0 ::ffff:192.168.2.10:54815   ::ffff:192.168.2.13:3306    ESTABLISHED 1563/java

tcp        0      0 ::ffff:192.168.2.10:53496   ::ffff:192.168.2.12:3306    ESTABLISHED 1563/java

5、测试

此时的三台MySQL服务器是主从备份的:

在mysql-master创建db_test库及该库下的test表

mysql> create database db_test;

Query OK, 1 row affected (0.00 sec)

mysql> use db_test;

Database changed

mysql> create table test(id int(10),name varchar(20));

Query OK, 0 rows affected (0.07 sec)

可以在slave1和slave2上查看到该库

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| db_test            |

| mysql              |

| performance_schema |

| test               |

+--------------------+

5 rows in set (0.01 sec)

在slave1、slave2服务器上停止主从备份:

mysql> stop slave;

Query OK, 0 rows affected (0.02 sec)

在mater上添加表内容

mysql> insert into test values(1,'master');

Query OK, 1 row affected (0.03 sec)

此前在服务器上同步了表,所以在从服务器上可以直接手动插入其他内容

在slave1上:

mysql> use db_test;

Database changed

mysql> insert into test values(2,'slave1');

Query OK, 1 row affected (0.06 sec)

在slave2上:

mysql> use db_test;

Database changed

mysql> insert into test values(3,'slave2');

Query OK, 1 row affected (0.00 sec)

在客户机上进行读测试:

[root@client ~]# yum -y install mysql              //安装mysql客户端

[root@client ~]# mysql -uamoeba -p123456 -h192.168.2.10  -P8066

(1)读测试:

mysql> select * from db_test.test;

+------+--------+

| id   | name   |

+------+--------+

|    2 | slave1 |

+------+--------+

1 row in set (0.01 sec)

mysql> select * from db_test.test;

+------+--------+

| id   | name   |

+------+--------+

|    3 | slave2 |

+------+--------+

1 row in set (0.01 sec)

此时读取数据库数据时,轮询的方式从slave1、slave2上读取

(2)写测试:

在客户端录入数据:

mysql> insert into db_test.test values(4,'client');

Query OK, 1 row affected (0.01 sec)

在master服务器上查看是否写入:

mysql> select * from db_test.test;

+------+--------+

| id   | name   |

+------+--------+

|    1 | master |

|    4 | client |

+------+--------+

2 rows in set (0.00 sec)

此时写入数据到数据库时,会写入到主服务器,不会写到从服务器上,实现了读写分离。

至此,可以验证,通过amoeba实现了MySQL的读写分离,写入数据仅会写入到mysql-master服务器上,读取数据,则以轮询的方式从slave1、slave2两台服务器上读取数据,实现了负载均衡。

mysql读写分离_Mysql数据库09MySQL读写分离相关推荐

  1. thinkphp读写mysql的枷锁_thinkphp5 数据库配置读写分离

    mysql配置主从数据库同步成功后,接下来就要在程序中配置数据库来实现读写分离啦 我们这里用的thinkphp5框架 配置读写分离非常简单 return [ // 数据库类型 'type' => ...

  2. mysql driver 读写分离_Mysql主从复制和读写分离实践

    1.主从复制 原理 MySQL之间数据复制的基础是二进制日志文件(binary log file).一台MySQL数据库一旦启用二 进制日志后,其作为master,它的数据库中所有操作都会以" ...

  3. mysql主从与读写分离_MySQL主从复制与读写分离

    MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中, ...

  4. mysql主从复制读写分离_MySQL主从复制与读写分离的工作原理

    一.mysql主从复制的工作原理 1.mysq支持的复制类型 1)基于语句的复制.在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高. 2)基于行的复制 ...

  5. mysql断网_mysql数据库断网链接

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  6. mysql 关闭锁_mysql数据库取消锁

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  7. mysql 表上限_mysql 数据库表的上限

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. mysql case默认_MySQL数据库架构和同步复制流程

    在分布式系统里面,往往制约整个系统发展的瓶颈点就是数据库,所以数据库的架构和高可用以及数据库的切分都是我们值得花大力气去学习的. 首先我们来说说数据库的架构. 1.mysql主从架构,如图: 这种架构 ...

  9. mysql密码安全级别_Mysql数据库的安全性问题释疑

    数据库系统的安全性包括很多方面.由于很多情况下,数据库服务器容许客户机从网络上连接,因此客户机连接的安全对MySQL数据库安全有很重要的影响. 不在客户机的命令行上提供密码 使用mysql.mysql ...

最新文章

  1. php nuke是什么,Php Nuke For Donkeys
  2. 4月25日日志(4.25)
  3. alpine linux 执行文件崩溃 报错 找不到/lib/x86_64-linux-gnu/libc.so 解决方法
  4. Docker 私有仓库最简便的搭建方法
  5. struts2.1.8,hibernate3.3.2,spring2.5 整合需要哪些jar包
  6. totorisgit与git两种方式pushpull文件
  7. springboot集成mybatis源码分析-mybatis的mapper执行查询时的流程(三)
  8. u盘安装linux 7.4,U盘自动化安装CentOS7.4
  9. camera(23)---camera 客观测试 Imatest教程--白平衡测试
  10. 微信公众号JSSDK中的wx.ready()和wx.error()问题
  11. 一本名不符实的.NET书籍: Game Engine Toolset Development
  12. go - 发布订阅模型
  13. H5_0020:判断安卓苹果平台
  14. 190407每日一句
  15. 浅谈事件委托(事件代理)和事件冒泡
  16. 显示图片的html 页面,HTML基础——网站图片显示页面
  17. mysql next key_关于mysql next-key锁的一些个人理解
  18. Not annotated parameter overrides @NonNullApi parameter
  19. 【iOS】应用跳转到系统应用
  20. Web服务器性能测试工具介绍

热门文章

  1. iptables与tomcat
  2. 【原创】自动更新程序2--更新程序的主窗体(技术:spring.net+三层架构+webservice+IrisSkin2换肤)...
  3. OSPF中DR和BDR作用简述
  4. Vue3 的学习教程汇总、源码解释项目、支持的 UI 组件库、优质实战项目
  5. linux shell脚本的执行方式与区别
  6. linux fedora安装、运行mybase7.3.5报错:error while loading shared libraries: libpng12.so.0
  7. helm部署kafka完整记录
  8. Python Django 日期增减API
  9. python3 三角函数
  10. 十道常见的MyBatis 面试题