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
[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 ##重启服务
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; ##检查刷新位置
到这边主服务器就不需要再继续下面的操作了
配置从服务器:
服务器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; ##查看功能开启状况
同理从服务器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目录下,进行配置
[aaa@qq.com opt]# cp jdk-6u14-linux-x64.bin /usr/local/ ##拷贝到/usr/local目录下
[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
[aaa@qq.com opt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[aaa@qq.com local]# chmod -R 755 /usr/local/amoeba ##增加权限
[aaa@qq.com local]# /usr/local/amoeba/bin/amoeba ##查看是否安装成功
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; ##刷新一下
从服务器添加相同的用户:
5.再次回到代理服务器先修改主配置文件
[aaa@qq.com usr]# cd /usr/local/amoeba/conf/
[aaa@qq.com conf]# vim amoeba.xml ##修改主配置文件
先配置访问amoeba的用户和密码;在30和32行
开启读写分离池;在117行;配置分离池,写入池和读的池子的名字
6.修改数据库节点的信息配置文件
[aaa@qq.com conf]# vim dbServers.xml ##数据库节点信息配置文件
23行修改:Mysql5.7版本没有test数据库,所以需要修改为mysql数据库;5.5直接忽略
26-29行去掉注释;配置用户和密码
定义主服务器和从服务器的节点:
主服务器节点
从服务器01的节点
从服务器02的节点
配置末尾节点捆绑
[aaa@qq.com conf]# /usr/local/amoeba/bin/amoeba start& ##启动amoeba服务
客户端配置
1.在客户端用yum安装Mysql服务
[aaa@qq.com ~]# setenforce 0 ##关闭防护系统
[aaa@qq.com ~]# systemctl stop firewalld ##关闭防火墙
[aaa@qq.com ~]# yum -y install mysql ##安装mysql服务
[aaa@qq.com ~]# 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.在代理服务器上读取数据;发现是轮询读取的方式去读取的
验证了读写功能是分离的;主服务器负责写入数据;从服务器负责读取数据
上一篇: 爱你的男人,都是这样的 ,你懂吗?
下一篇: 一个人的生活也要好好的
推荐阅读
-
mysql性能优化教程之主从复制与读写分离
-
linux下mysql安装主从复制和实现读写分离
-
MySQL主从复制与读写分离原理及用法详解
-
CentOS服务器平台搭建mysql主从复制与读写分离的方法
-
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
-
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
-
Mysql主从复制与读写分离图文详解
-
一篇文章看懂MySQL主从复制与读写分离
-
Mysql数据库的主从复制与读写分离精讲教程
-
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践_MySQL