MySQL读写分离

浪尽此生 提交于 2020-01-11 01:39:06

配置知识点

MySQL读写分离原理

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

实验概述

在数据库服务应用中,在大量的数据请求下,单台数据库将无法承担所有的读写操作

  • 配置多台数据库服务器以实现读写分离
  • 本实验在主从复制的基础上实现读写分离

配置MySQL读写分离

1、实验拓扑图如下
在这里插入图片描述

主机名 IP地址
主服务器 192.168.150.240
从服务器1 192.168.150.158
从服务器2 192.168.150.238
amoeba 192.168.150.181
客户机 192.168.150.241

2、所有服务器关闭Firewalld或者进行规则设置
3、搭建MySQL主从复制环境

4、Amoeba服务器环境安装
(1)安装jdk(版本1.6)

[root@localhost abc]# cp jdk-6u14-linux-x64.bin /usr/local
[root@localhost abc]# cd /usr/local
[root@localhost local]# ./jdk-6ul4-linux-x64.bin			//执行安装jdk,按提示安装
[root@localhost local]# mv jdk1.6.0_14/ /usr/local/jdk1.6
#部署环境变量
[root@localhost local]# vim /etc/profile
#在末行添加
export JAVA_HOME=/usr/local/jdk1.6
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

[root@localhost local]# source /etc/profile 

(2)安装amoeba软件

[root@localhost ~]# mkdir /usr/local/amoeba						//创建amoeba工作目录
[root@localhost abc]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
[root@localhost mnt]# chmod -R 755 /usr/local/amoeba			//设置权限
[root@localhost mnt]# /usr/local/amoeba/bin/amoeba				//使用amoeba启动脚本,提示"amoeba start|stop"说明安装成功
amoeba start|stop

5、配置amoeba读写分离,两个slave读负载均衡
(1)在mysql主从服务器上添加权限开放给amoeba访问

mysql> grant all on *.* to test@'192.168.150.%' identified by '123.com';
Query OK, 0 rows affected (0.02 sec)

(2)更改amoeba主配置文件

[root@localhost ~]# vim /usr/local/amoeba/conf/amoeba.xml
#设置客户端登陆的账户名和密码
 30											<property name="user">amoeba</property>
 31 
 32                                         <property name="password">123456</property>
#设置默认池为主服务器,写入池为主服务器,读取池为从服务器
115                 <property name="defaultPool">master</property>
116 
117                 <!-- -->
118                 <property name="writePool">master</property>
119                 <property name="readPool">slaves</property>

(3)更改amoeba数据库配置文件

[root@localhost ~]# vim /usr/local/amoeba/conf/dbServers.xml
#更改amoeba访问mysql服务器的登陆账户和密码
 26                         <property name="user">test</property>
 27 
 28                         <!--  mysql password -->
 29                         <property name="password">123.com</property>
#指明主从服务器的IP地址
 45         <dbServer name="master"  parent="abstractServer">
 46                 <factoryConfig>
 47                         <!-- mysql ip -->
 48                         <property name="ipAddress">192.168.150.240</property>
 49                 </factoryConfig>
 50         </dbServer>
 51 
 52         <dbServer name="slave1"  parent="abstractServer">
 53                 <factoryConfig>
 54                         <!-- mysql ip -->
 55                         <property name="ipAddress">192.168.150.158</property>
 56                 </factoryConfig>
 57         </dbServer>
 58 
 59         <dbServer name="slave2"  parent="abstractServer">
 60                 <factoryConfig>
 61                         <!-- mysql ip -->
 62                         <property name="ipAddress">192.168.150.238</property>
 63                 </factoryConfig>
 64         </dbServer>
#声明从服务器包含的节点
 66         <dbServer name="slaves" virtual="true">
······省略部分内容
 72                         <property name="poolNames">slave1,slave2</property>

6、启动amoeba软件

[root@localhost ~]# /usr/local/amoeba/bin/amoeba start &
[root@localhost ~]# netstat -natp | grep 8066
tcp6       0      0 :::8066                 :::*                    LISTEN      66072/java       

7、测试读写分离
(1)建立测试客户端

#安装mysql服务器
[root@localhost ~]# yum install mysql -y
#登陆amoeba服务器
[root@localhost ~]# mysql -u amoeba -p123456 -h 192.168.150.181 -P8066
#查看数据库
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| bao                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.02 sec)

(2)在主服务器上创建表info,自动同步到从服务器上

#在主服务器上创建新表info
mysql> create table info ( 
    -> id int(4) not null primary key,                                     
    -> name varchar(10) not null);                                         
Query OK, 0 rows affected (0.03 sec)
#在另外两台从服务器上可查看到数据表
mysql> show tables;
+---------------+
| Tables_in_bao |
+---------------+
| info          |
+---------------+
1 row in set (0.00 sec)

(3)两台从服务器数据库中关闭主从复制

mysql> stop slave;
Query OK, 0 rows affected (0.02 sec)

(4)分别在三台主从服务器上的info表中插入不同的数据

#主服务器
mysql> insert into info (id,name) values (1,'zhangsan');
#从服务器1
mysql> insert into info (id,name) values (2,'lisi');
#从服务器2
mysql> insert into info (id,name) values (3,'wangwu');

(5)使用客户机多次查询info表中的新数据,查看读负载均衡效果

#测试发现只能读取到从服务器的数据,而且是轮询读取
MySQL [bao]> select * from info;
+----+------+
| id | name |
+----+------+
|  2 | lisi |
+----+------+
1 row in set (0.01 sec)

MySQL [bao]> select * from info;
+----+--------+
| id | name   |
+----+--------+
|  3 | wangwu |
+----+--------+
1 row in set (0.00 sec)

(6)客户机在info表中插入新的数据,并分别在主从服务器上查看,只有主服务器中有数据

#使用客户机插入新的数据
MySQL [bao]> insert into info (id,name) values (4,'zhaoliu');
Query OK, 1 row affected (0.02 sec)
#只有主服务器中有数据
mysql> select * from info;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  4 | zhaoliu  |
+----+----------+
2 rows in set (0.00 sec)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!