MySQL主从复制与读写分离原理和实验

MySQL主从复制原理:

●基于语句的复制

●MySQL的复制类型

  • 基于语句的复制
  • 基于行的复制:会读取表的信息;复制到另一个表中
  • 混合类型的复制,会结合日志去复制

MySQL主从复制的工作过程
在这里插入图片描述
●1.主服务器需要开启二进制日志功能(Binary log);数据更新,以时间和位置的形式写到二进制日志文件当中。

●2.利用I/O线程(输入输出流),利用这个线程从二进制日志文件中读取相关的步骤信息,加载到线程当中,会把信息写入到Relay log(中继日志)中

●3.这时中继日志里面记录了二进制日志文件的信息,从服务器通过SQL线程从中继日志文件中读取同步的信息,保存到自己的数据库中

●4.所以从服务器按照中继日志去更新信息的。

主从复制实验

实验环境

●首先准备3台centos系统的虚拟机;都提前安装了mysql数据库服务;这边mysql版本为5.7

  • 主服务器的IP地址:192.168.148.135
  • 从服务器01的IP地址:192.168.148.136
  • 从服务器02的IP地址:192.168.148.137

推荐步骤

先将服务器的主机名字改掉便于区分,并且都将防火墙规则清空,关闭防护系统;开启Mysql服务
主服务器:
在这里插入图片描述
从服务器1
在这里插入图片描述
从服务器2
在这里插入图片描述

[root@master ~]# systemctl start mysqld.service     ##开启服务
[root@master ~]# netstat -ntap | grep 3306         ##查看端口是否开启

主服务器配置:
1.开启二进制日志文件,并且server id不能相同

[root@master ~]# vim /etc/my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
..............
server-id = 11           ##配置server id不能相同
log-bin=master-bin       ##配置二进制日志
log-slave-updates=ture      ##配置允许中继日志找二进制日志同步更新
[root@master ~]# systemctl restart mysqld.service    ##重启服务

在这里插入图片描述
2.创建从服务器找主服务器的账号

[root@master ~]# mysql -uroot -p123456      ##登入数据库       
mysql> grant replication slave on *.* to 'myslave'@'192.168.148.%' identified by '123456';
##创建账号myslave允许148网段的从服务器来同步
mysql> flush privileges;     ##刷新数据库
mysql> show master status;       ##检查刷新位置  

到这边主服务器就不需要再继续下面的操作了
在这里插入图片描述
配置从服务器:
服务器01
1.开启二进制日志文件,并且server id不能相同

[root@slave01 ~]# vim /etc/my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
..............
server-id=22             ##配置server id为22
relay-log=relay-log-bin       ##从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index         ##定义relay-log的位置和名称

[root@slave01 ~]# systemctl restart mysqld.service      ##重启服务

服务器02:
这边步骤和01是一样的,有一点server id不能和01相同

[root@slave02 ~]# vim /etc/my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
..............
server-id=23             ##配置server id为23;server id不能相同
relay-log=relay-log-bin       ##从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index         ##定义relay-log的位置和名称
[root@slave01 ~]# systemctl restart mysqld.service      ##重启服务

2.在从服务器01的mysql中配置连接主服务器

[root@slave01 ~]# mysql -uroot -p123456
mysql> change master to master_host='192.168.148.135',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;
##配置master的IP地址;master的使用用户和密码;master的二进制日志文件和位置
mysql> start slave;       ##开启同步功能
mysql> show slave status\G;    ##查看功能开启状况

在这里插入图片描述
同理从服务器02也是相同的配置方法

mysql> show slave status\G;    ##查看功能开启状况

在这里插入图片描述
3.这时回到主服务器写入数据做测试

mysql> create database test;               ##创建一个test库
mysql> create table home (id int(4),name char(10));        ##创建一个表作为测试
mysql> insert into home values (1,'zhangsan');            ##写入用户’zhangsan

在这里插入图片描述
从服务器01:
在这里插入图片描述
从服务器02:
在这里插入图片描述
总结:实验验证成功

MySQL读写分离:

为什么要有读写分离
●因为数据库的存储引擎会基于表锁定;或者基于行锁定,就会导致写入数据的时候不能读取;读取数据的时候不能写入;两者不能同时进行;而且不支持高并发;所以就需要读写分离

读写分离原理

  • 1.amoeba代理服务器去负责读写分离分配哪个服务器写;哪个服务器去读
  • 2.主服务器负责去写;从服务器负责去读
  • 3.如果有多台读取服务器;会使用轮询读取的方式

开设3个账户

  • 1.读写分离当中需要创建第一个权限账户,允许从服务器能够来同步主服务器的内容
  • 2.需要开设第二个账户用于读写分离;主服务器和从服务器都要开;授权amoeba服务器来访问
  • 3.开设第三个账户用于客户端去访问代理服务器amoba

在这里插入图片描述

读写分离实验

实验环境

在这里插入图片描述
接着主从复制的实验;再准备2台centos系统的虚拟机;

  • 主服务器的IP地址:192.168.148.135
  • 从服务器01的IP地址:192.168.148.136
  • 从服务器02的IP地址:192.168.148.137
  • 代理服务器的IP地址:192.168.148.132 软件包:jdk;amoeba
  • 客户端的IP地址:192.168.148.133

推荐步骤

代理服务器:
1.先用xftp将jdk和amoeba工具包放到opt目录下,进行配置
在这里插入图片描述
[root@localhost opt]# cp jdk-6u14-linux-x64.bin /usr/local/ ##拷贝到/usr/local目录下
在这里插入图片描述

[root@localhost local]# chmod +x jdk-6u14-linux-x64.bin    ##给jdk增加权限
[root@localhost local]# ./jdk-6u14-linux-x64.bin 
...期间一直空格,直到要输入yes
Do you agree to the above license terms? [yes or no]
Yes

[root@localhost local]# mv jdk1.6.0_14/ jdk1.6       ##修改jdk的名字,方便管理

2.设置环境变量

[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      ##amoeba的家目录
export PATH=$PATH:$AMOEBA_HOME/bin         ##amoeba的命令文件
[root@localhost local]# source /etc/profile        ##声明环境变量让其生效

3.创建amoeba的目录,将amoeba解压

[root@localhost opt]# mkdir /usr/local/amoeba

在这里插入图片描述
[root@localhost opt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
在这里插入图片描述

[root@localhost local]# chmod -R 755 /usr/local/amoeba         ##增加权限
[root@localhost local]# /usr/local/amoeba/bin/amoeba      ##查看是否安装成功

在这里插入图片描述
4.##在三台mysql服务器添加权限和用户开放给amoeba访问##
主服务器:

mysql> grant all on *.* to test@'192.168.148.%' identified by '123.com';
192.168.148.0段的代理服务器,使用test用户身份,密码“123.com”来访问主从服务器的库和表并且拥有所有权限
mysql> flush privileges;    ##刷新一下

从服务器添加相同的用户:
在这里插入图片描述
5.再次回到代理服务器先修改主配置文件
[root@localhost usr]# cd /usr/local/amoeba/conf/
在这里插入图片描述
[root@localhost conf]# vim amoeba.xml ##修改主配置文件
先配置访问amoeba的用户和密码;在30和32行
在这里插入图片描述
开启读写分离池;在117行;配置分离池,写入池和读的池子的名字
在这里插入图片描述
6.修改数据库节点的信息配置文件
[root@localhost conf]# vim dbServers.xml ##数据库节点信息配置文件
23行修改:Mysql5.7版本没有test数据库,所以需要修改为mysql数据库;5.5直接忽略
在这里插入图片描述
26-29行去掉注释;配置用户和密码
在这里插入图片描述
定义主服务器和从服务器的节点:
主服务器节点
在这里插入图片描述
从服务器01的节点
在这里插入图片描述
从服务器02的节点
在这里插入图片描述
配置末尾节点捆绑
在这里插入图片描述
[root@localhost conf]# /usr/local/amoeba/bin/amoeba start& ##启动amoeba服务
在这里插入图片描述
客户端配置
1.在客户端用yum安装Mysql服务

[root@localhost ~]# setenforce 0       ##关闭防护系统
[root@localhost ~]# systemctl stop firewalld        ##关闭防火墙
[root@kehu ~]# yum -y install mysql               ##安装mysql服务

在这里插入图片描述
[root@kehu ~]# mysql -u amoeba -p123456 -h 192.168.148.132 -P8066 ##创建的用户去登录amoeba服务器;指定用户;密码;和代理服务器的IP地址和端口号
在这里插入图片描述
2.在客户服务器上创建一个test2的数据库,去查看别的服务器上是否都有了
MySQL [(none)]> create database test2;
在这里插入图片描述
主服务器master
在这里插入图片描述
从服务器01:
在这里插入图片描述
从服务器02:
在这里插入图片描述
验证主服务器是用于写入数据
1.在从服务器上将slave功能关闭
从服务器01
在这里插入图片描述
从服务器02
在这里插入图片描述
2.在客户端服务器上写入数据,并且在主从服务器上查看
在这里插入图片描述
主服务器:
在这里插入图片描述
从服务器01:
在这里插入图片描述
从服务器02:
在这里插入图片描述
验证读服务器负责读取数据
1.在两个从服务器中插入数据
从服务器01
在这里插入图片描述
从服务器02
在这里插入图片描述
2.在代理服务器上读取数据;发现是轮询读取的方式去读取的
在这里插入图片描述
验证了读写功能是分离的;主服务器负责写入数据;从服务器负责读取数据

猜你喜欢

转载自blog.csdn.net/Cpureman/article/details/108256914
今日推荐