一、MySQL读写分离原理
- 读写分离就是只在主服务器上写,只在从服务器上读
- 主数据库处理事务性查询,而从数据库处理select查询
- 数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库
二、应用场景
- 在企业用户中,在大量的数据请求下,单台数据库将无法承担所有的读写操作
- 配置多台数据库服务器以实现读写分离
- 在主从复制的基础上实现读写分离
三、读写分离示例
环境:
1、3台Mysql服务器,部署好mysql服务(1台主服务器,2台从服务器)
2、3台服务器间搭建主从复制:https://blog.csdn.net/ML908/article/details/103914159
3、1台amoeba代理服务器
4、1台客户机
5、所有服务器关闭防火墙
思路:
需要有三个账户
1、从服务器找主服务器同步数据用的账户
2、amoeba访问mysql用的账户
3、客户端访问amoeba用的账户
主服务器(master) | 192.168.17.157 |
---|---|
从服务器(slave 1) | 192.168.17.150 |
从服务器(slave 2) | 192.168.17.135 |
代理服务器(amoeba) | 192.168.17.130 |
客户机(client) | 192.168.17.158 |
1、配置
#首先把mysql装好,或者装mariadb也可以
[root@amoeba ~]# yum install mysql -y
[root@amoeba ~]# systemctl stop firewalld.service
[root@amoeba ~]# setenforce 0
#挂载并安装jdk文件
[root@amoeba ~]# mkdir /abc
[root@amoeba ~]# mount.cifs //192.168.17.1/mysql /abc
Password for root@//192.168.17.1/mysql:
[root@amoeba ~]# cd /abc
[root@amoeba abc]# ls
amoeba-mysql-binary-2.2.0.tar.gz mha4mysql-manager-0.57.tar.gz mysql-5.7.17.tar.gz SQLyog10.rar
boost_1_59_0.tar.gz mha4mysql-node-0.57.tar.gz navicatformysql.rar
cmake-2.8.6.tar.gz mysql-5.6.36.tar.gz ruby-2.4.1.tar.gz
jdk-6u14-linux-x64.bin mysql-5.7.17.msi ruby安装.png
[root@amoeba abc]# cp jdk-6u14-linux-x64.bin /usr/local/
[root@amoeba abc]# cd /usr/local/
[root@amoeba local]# ls
bin boost etc games include jdk-6u14-linux-x64.bin lib lib64 libexec mysql sbin share src
[root@amoeba local]# ./jdk-6u14-linux-x64.bin (按enter/空格 yes)
[root@amoeba local]# mv jdk1.6.0_14/ /usr/local/jdk1.6
#配置环境变量
[root@amoeba 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@amoeba local]# source /etc/profile //生效
[root@amoeba local]# mkdir /usr/local/amoeba //创建工作目录
[root@amoeba local]# cd /abc
[root@amoeba abc]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ //将amoeba解压到工作目录
[root@amoeba abc]# chmod -R 755 /usr/local/amoeba/ //为amoeba设置权限
[root@amoeba abc]# /usr/local/amoeba/bin/amoeba //调用命令验证
amoeba start|stop //安装成功
[root@amoeba abc]#
#在三台mysql服务器上添加权限开放给amoeba访问
允许使用test用户从17段的主机验证123.com的密码后登陆mysql节点
mysql> grant all on *.* to test@'192.168.17.%' identified by'123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)
#回到amoeba服务器进行配置
#更改主配置文件
[root@amoeba abc]# cd /usr/local/amoeba
[root@amoeba amoeba]# vim conf/amoeba.xml
#数据库的配置文件
[root@amoeba amoeba]# vim conf/dbServers.xml
#启动amoeba(amoeba属于持续性开启,所以放在后台运行开启。会自动开启监控)
#重新开一个远程连接,可以验证状态
2、验证
#客户端验证,安装mysql
[root@client ~]# yum install mysql -y
[root@client ~]# systemctl stop firewalld.service
[root@client ~]# setenforce 0
#连接amoeba服务器 指定端口8066
[root@client ~]# mysql -u amoeba -p123456 -h 192.168.17.130 -P8066
#前面我们已经做过主从同步,所以现在主服务器及两个从服务器中的数据库是一致的
#关闭两台从服务器(关闭主从复制)
查看状态,两个YES 现在变成了NO
#现在我们来验证读写分离
在客户机上进入user库info表中添加记录
主服务器中是可以看到添加的记录,而两个从服务器是没有的
我们分别在两个从服务器中添加记录
现在我们再到客户端去查看info数据表内容
小结:现在就验证了读写分离。在客户端上查询info表,第一次会向从服务器1读数据,第二次会向从服务器2读取 (轮询读取,挨个读取服务器 ,流量均摊)
总结:在客户端连接数据库后写入的数据只有主会记录,从服务器并不会记录。开启主从复制的情况下,从服务器会向主服务器同步(两个从服务器之间不会相互同步)
来源:CSDN
作者:ML908
链接:https://blog.csdn.net/ML908/article/details/103922253