读写分离

  • 读写分离

    • 读写分离的分类

    • 中间件软件

    • 实验需求

    • 实验详细步骤

    • amoeba软件

读写分离的分类

  • 垂直扩展

    • 一台服务器跑的业务达到瓶颈了,就增加一台服务器,还是不够也在增加一台服务器,这就是垂直扩展

  • 水平扩展

    • 当一服务器达到瓶颈以后,则增加够多的服务器集群来共同的来完成这一件事情就是水平扩展

  • 特殊水平扩展=读写分离

    • 当一服务器达到瓶颈以后,则增加够多的服务器集群,从中拿出一个服务器专门写的操作、其他的服务器则专门 用用户读取的操作

    • mysql不支持读写分离;需要使用一个软件中间件

    • 中间件:分布式应用软件借用的在不同技术之间共享资源的一种程序

    • 例如java写的程序直接挂载到web上去使用,因为web不是很好支持java程序,如果想两者之间进行很好的数据交流通信;需要在两者之间加上中间件软件

    • 中间件软件: TUXEDO WEBSHPERE WEBLOGIC(目前主流) tomact

    • 例如:公司开放的软件能正常的运行在网站上就需要中间件的软件才能正常使用

  • 读写分离原理

    • 当用户访问连接mysql的连接到的MYSQL,想做读写的操作的时候,而是连接到中间件的软件上,中间件软件上。在中间件软件在判断用户的这个操作是读取的操作还是写的操作,如果是读取的操作则直接交给读取的mysql服务器;如是是写的操作也把请求交给写的mysql服务器上;这样就数据库读写分离了。

    • 中间件:分布式应用中,用来在不同技术之间共享资源的服务器。

    • 分布式:将一个服务器处理不了的数据,交给多个服务器进行处理

中间件软件

  • mysql proxy 官方版本支持读写分离、故障转移、不支持海量数据

    • 如果想使用mysql proxy 这软件的时候;必须把操作写入LUAJI脚本上才能执行,使用复杂,

  • atlas 读写分离、支持扩展、支持ip地址过滤

    • 性能差: 正常的用户去访问mysql服务器和通过proxy软件相比proxy性能会降低30-35%

    • 响应时间:跟正常相比速度要1.5-2倍

    • 不支持配置参数的动态加载:比如修改网站参数、必须停机加载;比如7X24的网站就不能使用

amoeba软件
  • 开源

  • 读写分离、

  • 水平分割

  • 原本在一张表中存的是大量数据,把一张表拆分;可以分别的把每个字段里面的内容存放左不同的主机上,

    • 例如:一张表把name的字段的数据存在A1的数据上供用户来访问;info的字段又放在另外一个A2上供用户访问读取;用户想访问info字段里面的数据的时候,关联数据的是通过SQL路由来查找原来一张表里面的数据的,从而降低服务器的性能

    • 垂直分割以及数据整合

  • SQL路由

    • 性能和响应时间损失较小

    • 软件开发了陈思儒,阿里巴巴

    • 目录阿里使用的COBAR分离中间件软件,半开源

实验需求

  • 需要三台计算机

  • 两台mysql主机实现主从同步;保持数据一致

  • 一台主机安装amoeba(阿米吧)

  • 首先在A和B主机上安装MYSQL软件;在到C主机上安装mysql客服端

    实验详细步骤

  •     
  • MYSQL读写分离_第1张图片

  • MYSQL读写分离_第2张图片

  • MYSQL读写分离_第3张图片

  • MYSQL读写分离_第4张图片

  • 启动登录amoeba服务

    • [root@zhaolu_3 bin]# vim amoeba

    • 58行 DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss256k” 不修改服务不能启动

    • [oot@zhaolu_3 bin]# nohup bash -x /usr/local/amoeba/bin/amoeba & 放入后台执行

  • 安装mysql

    • [root@localhost ~]# mysql -u root -p -h 192.168.117.154 -p 9000 #ip地址就是本机的ip地址

  • 测试

    • mysql> usr test;

    • mysql> create table a1 (id int , name char(20));

    • mysql> insert into a1 values (‘slave’);

    • mysql> select * from a1; 查看是否有数据

    • 在主mysql ——> mysql> use test;

    • mysql> create table a1 (id int , name char(20));

    • mysql> insert into a1 values (‘master’);

    • mysql> stop slave;

    • 首先在从服务先关闭同步

    • 然后在主服务器中创建一个表,在表中插入数据

    • 然后在从服务器test库中创建一个表里面插入数据、

  • 登录amoeba

    • [root@localhost ~]# mysql -u root -p -h 192.168.117.154 -p 9000 #ip地址就是本机的ip地址

    • mysql> select * from al; 都查看几次看是否有轮循的效果,

  • 比如数据库读的压力大,写的压力小;为了降低数据库的读的压力;可以在amoeba的主配置文件中修改设置写的服务器也可以读取操作、比如主服务器上读一次,在到从服务器上读取3次,从而就可以减轻一点读取服务器的压力

    • [root@zhaolu_3 amoeba]# vim /usr/local/amoeba/conf/amoeba.xml

    • [root@zhaolu_3 amoeba]# ps axu | grep amoeba

    • root 29519 1.0 7.3 1075540 55608 pts/1 Sl 06:57 0:08 /amoeba/jdk/bin/java -server -Xms256m -Xmx256m -Xss256k -Damoeba.home=/usr/local/amoeba -Dclassworlds.conf=/usr/local/amoeba/bin/amoeba.classworlds -classpath /usr/local/amoeba/lib/classworlds-1.0.jar org.codehaus.classworlds.Launcher

    • [root@zhaolu_3 amoeba]# kill -9 29519 杀死进程以后

    • [root@zhaolu_3 ~]# nohup bash -x /usr/local/amoeba/bin/amoeba 重启服务

    • [root@zhaolu_3 amoeba]# ps axu | grep amoeba 查看一下进程是否已经产生

    • [root@zhaolu_3 amoeba]# mysql -uroot -p -h 192.168.117.154 -P 9000

    • mysql> use test; 计入test数据库

    • mysql> select * from a1; 多查询几次看是否有轮询3次读的操作在轮询一次写的操作

    • [root@localhost ~]# vim /usr/local/amoeba/conf/amoeba.xml 进入配置文件中修改

    • 153 

      server1,server2,server2,server2

       意思就是说轮询三次读取的操作,在轮询一个写的操作

    • 杀死进程