欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-02 10:09:18
...

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服务
主服务器:
MySQL主从复制与读写分离原理和实验
从服务器1
MySQL主从复制与读写分离原理和实验
从服务器2
MySQL主从复制与读写分离原理和实验

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

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

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

MySQL主从复制与读写分离原理和实验
2.创建从服务器找主服务器的账号

[aaa@qq.com ~]# 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;       ##检查刷新位置  

到这边主服务器就不需要再继续下面的操作了
MySQL主从复制与读写分离原理和实验
配置从服务器:
服务器01
1.开启二进制日志文件,并且server id不能相同

[aaa@qq.com ~]# 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的位置和名称

[aaa@qq.com ~]# systemctl restart mysqld.service      ##重启服务

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

[aaa@qq.com ~]# 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的位置和名称
[aaa@qq.com ~]# systemctl restart mysqld.service      ##重启服务

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

[aaa@qq.com ~]# 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;    ##查看功能开启状况

MySQL主从复制与读写分离原理和实验
同理从服务器02也是相同的配置方法

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

MySQL主从复制与读写分离原理和实验
3.这时回到主服务器写入数据做测试

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

MySQL主从复制与读写分离原理和实验
从服务器01:
MySQL主从复制与读写分离原理和实验
从服务器02:
MySQL主从复制与读写分离原理和实验
总结:实验验证成功

MySQL读写分离:

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

读写分离原理

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

开设3个账户

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

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

读写分离实验

实验环境

MySQL主从复制与读写分离原理和实验
接着主从复制的实验;再准备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目录下,进行配置
MySQL主从复制与读写分离原理和实验
[aaa@qq.com opt]# cp jdk-6u14-linux-x64.bin /usr/local/ ##拷贝到/usr/local目录下
MySQL主从复制与读写分离原理和实验

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

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

2.设置环境变量

[aaa@qq.com 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的命令文件
[aaa@qq.com local]# source /etc/profile        ##声明环境变量让其生效

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

[aaa@qq.com opt]# mkdir /usr/local/amoeba

MySQL主从复制与读写分离原理和实验
[aaa@qq.com opt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
MySQL主从复制与读写分离原理和实验

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

MySQL主从复制与读写分离原理和实验
4.##在三台mysql服务器添加权限和用户开放给amoeba访问##
主服务器:

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

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

[aaa@qq.com ~]# setenforce 0       ##关闭防护系统
[aaa@qq.com ~]# systemctl stop firewalld        ##关闭防火墙
[aaa@qq.com ~]# yum -y install mysql               ##安装mysql服务

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

相关标签: Mysql数据库