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
49 | log-bin=mysql-bin |
---|---|
57 | server-id = 10 |
58 | log-slave-update = true |
配置从文件
[root@centos02 ~]# vim /etc/my.cnf
49 | log-bin=mysql-bin |
---|---|
58 | relay-log = relay-log-bin |
57 | server-id = 20 |
59 | relay-log-index = slave-relay-bin.index |
[root@centos03 ~]# vim /etc/my.cnf
49 | log-bin=mysql-bin |
---|---|
58 | relay-log = relay-log-bin |
57 | server-id = 30 |
59 | relay-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复制
再去测试机上查看
测试成功 读分离