mysql主从复制和读写分离

MySQL主从复制和读写分离

1.MySQL主从复制原理
MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复
制完成了,才能在此基础上进行数据的读写分离。

1 ) MySQL支持的复制类型
(1)基于语句的复制。在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySOL
默认采用基于语句的复制,效率比较高。
(2)基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
(3)混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时.就会采
用基于行的复制。
2)复制的工作过程

(1)在每个事务更新数据完成之前,Master在二进制日志记录这些改变。写入二进制日志完成
后,Master通知存储引擎提交事务。
(2)Slave将Master的Binry log复制到其中继日志。首先,Slave开始一个工作线程——/0线
程,I/О线程在Master上打开一个普通的连接,然后开始Binlog dump process。Binlog dump process
从Master的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待Master产生新的事件.I/O
线程将这些事件写入中继日志。
(3)SaL slave thread(SQL从线程〉处理该过程的最后一步。SQL线程从中继日志读取事件,
并重放其中的事件而更新Slave的数据,使其与Master中的数据一致。只要该线程与/О线程保持一
致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新
操作不能在Slave 上并行操作。

2.MySQL读写分离原理

1)基于程序代码内部实现
在代码中根据select,insert_进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是
性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来
实现,运维人员无从下手。
2)基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端的请求后通过判断后转发到后端数
据库,有两个代表性程序。
(1)MySQL-Proxy。MySQL_Proxy为MySQL开源项目,通过其自带的lua脚本进行SOL判断,虽
然是MySQL官方产品,但是MySQL官方并不建议将MySOL—Proxy用到生产环境。
(2)Amoeba(变形虫)。由陈思儒开发,其曾就职于阿里巴巴。该程序用Java语言进行开发,
阿里巴巴将其用于生产环境。它不支持事务和存储过程
经过上述简单的比较,通过程序代码实现MSQL读写分离自然是一个不错的选择,但是并不是
所有的应用都适合在程序代码中实现读写分离,例如一些大型复杂的Java应用,如果在程序代码中
实现读写分离对代码改动就较大,所以,像这种大型复杂的应用一般会考虑使用代理层来实现。

1、准备服务器

3台mysql

1台amoeba

1台测试机

2、搭建mysql服务器

1、配置mysql

https://blog.csdn.net/weixin_46298214/article/details/108885414

2、配置主从复制

配置主文件

[root@centos01 ~]# vim /etc/my.cnf

49log-bin=mysql-bin
57server-id = 10
58log-slave-update = true

配置从文件

[root@centos02 ~]# vim /etc/my.cnf

49log-bin=mysql-bin
58relay-log = relay-log-bin
57server-id = 20
59relay-log-index = slave-relay-bin.index

[root@centos03 ~]# vim /etc/my.cnf

49log-bin=mysql-bin
58relay-log = relay-log-bin
57server-id = 30
59relay-log-index = slave-relay-bin.index
3、重启服务 配置主服务器指定授权账户
mysql> grant replication slave on *.* to 'slave'@'192.168.100.%' identified by 'pwd@123';
mysql> show master status;

在这里插入图片描述

4、配置从复制主服务器
mysql> change master to master_host='192.168.100.10',master_user='slave',
master_password='pwd@123',master_log_file='mysql-bin.000003',master_log_pos=401;
mysql> start slave;
mysql> show slave status\G;

在这里插入图片描述

mysql> change master to master_host='192.168.100.10',master_user='slave',
master_password='pwd@123',master_log_file='mysql-bin.000003',master_log_pos=401;
mysql> start slave;
mysql> show slave status\G;

在这里插入图片描述

3、插入数据测试主从复制

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4、安装amoeba 配置jdk

[root@centos04 ~]# cp /mnt/jdk-6u14-linux-x64.bin /usr/src/
[root@centos04 ~]# mkdir /usr/local/amoeba
[root@centos04 ~]# tar zxf /mnt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@centos04 src]# ./jdk-6u14-linux-x64.bin
[root@centos04 src]# mv jdk1.6.0_14/ /usr/local/jdk
[root@centos04 ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$CLAASSPATH:$JAVA_HOME/JRE/BIN:$PATH:$HOME/bin/
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin/
export AMOEBA=/usr/local/amoeba
export PATH=$PATH:$AMOEBA/bin

在这里插入图片描述

配置授权账户

mysql> grant all on . to ‘test’@‘192.168.100.%’ identified by ‘pwd@123’;

在这里插入图片描述

5、配置amoeba

[root@centos04 ~]# vim /usr/local/amoeba/conf/amoeba.xml

在这里插入图片描述
在这里插入图片描述

[root@centos04 ~]# vim /usr/local/amoeba/conf/dbServers.xml
在这里插入图片描述

在这里插入图片描述

启动服务

[root@centos04 ~]# /usr/local/amoeba/bin/amoeba start&

在这里插入图片描述

6、安装测试

[root@centos05 ~]# yum -y install mariadb

[root@centos05 ~]# mysql -uamoeba -ppwd@123 -h 192.168.100.40 -P8066

在这里插入图片描述

测试写

关闭从服务器的slave复制

在这里插入图片描述在这里插入图片描述

用测试机插入数据

在这里插入图片描述

去主和从查看是否有数据

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

只有主有数据从没有 测试成功 写分离

测试读

关闭从服务器的slave复制

在这里插入图片描述在这里插入图片描述

在测试机查看数据 发现没有数据

在这里插入图片描述

打开从服务器slave复制

在这里插入图片描述在这里插入图片描述

再去测试机上查看

在这里插入图片描述
测试成功 读分离

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值