目录
一、MySQL 主从复制
1.1 主从复制原理
MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。
binlog:binary log,主库中保存所有更新事件日志的二进制文件。binlog
是数据库服务启动的一刻起,保存数据库所有变更记录(数据库结构和内容)的文件。在主库中,只要有更新事件出现,就会被依次地写入到binlog
中,之后会推送到从库中作为从库进行复制的数据源。
binlog输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。 对于每一个即将发送给从库的sql事件,binlog输出线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。
在从库中,当复制开始时,从库就会创建从库I/O线程和从库的SQL线程进行复制处理。
从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。 从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。
从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
1.2 MySQL的扩展
读写分离
复制:每个节点都有相同的数据集,向外扩展,基于二进制日志的单向复制
1.2.1 什么是读写分离
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
MySQL 读写分离原理
读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性操作,而从数据库处理 select 查询。数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。
1.2.2 为何读写分离
因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。但是数据库的“读”(读10000条数据可能只要5秒钟)。所以读写分离,解决的是,数据库的写入,影响了查询的效率。
1.2.3 何时要读写
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。
1.2.4 主从复制与读写分离
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。
mysq支持的复制类型
(1)STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。
(2)ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
(3)MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
1.2 主从复制过程
主从复制的工作过程:
1.Master节点的数据的改变记录成二进制日志(bin log),
2.当Master上的数据发生改变时,则将其改变写入二进制日志中。
3.开启一个slave服务线程传递给从服务器
4.Slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求 Master的二进制事件。
5.同时Master节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至Slave节点本地的中继日志(Relay log)中,Slave节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,即解析成 sql 语句逐一执行,使得其数据和 Master节点的保持一致,最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒。
1.3 主从复制相关线程
主节点:
dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events
从节点:
I/O Thread:向Master请求二进制日志事件,并保存于中继日志中
SQL Thread:从中继日志中读取日志事件,在本地完成重放
1.4 复制功能文件
master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等
relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地relay log日志的对应关系
mariadb-relay-bin.00000#: 中继日志,保存从主节点复制过来的二进制日志,本质就是二进制日志
二、模拟搭建mysql主从复制
2.1 环境配置
(主)master服务器: 192.168.162.100 mysql5.7
(从)slave1服务器: 192.168.162.111 mysql5.7
(从)slave2服务器: 192.168.162.102 mysql5.7
Amoeba服务器: 192.168.162.121 jdk1.6、Amoeba
客户端 服务器: 192.168.162.122 mysql
2.2 实验环境
##关闭防火墙
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
2.3 搭建mysql主从复制
##主服务器搭建时间同步 [root@localhost ~]#yum install ntp -y [root@lppdff ~]# vim /etc/ntp.conf server 127.127.162.0 fudge 127.127.162.0 stratum 8 ##开启服务 [root@lppdff ~]# systemctl start ntpd
##从服务器安装同步服务(111) [root@localhost ~]#yum install ntpdate -y [root@localhost ~]# /usr/sbin/ntpdate 192.168.162.100 5 Dec 15:32:10 ntpdate[2623]: the NTP socket is in use, exiting ##创建计划任务每30分钟同步一次 [root@localhost ~]# crontab -e no crontab for root - using an empty one */30 * * * * /usr/sbin/ntpdate 192.168.162.100
##从服务器时间同步 [root@localhost ~]# yum install ntpdate -y ##开启服务 [root@localhost ~]# systemctl start ntpd ##创建计划任务每30分钟同步一次 [root@localhost ~]# crontab -e no crontab for root - using an empty one */30 * * * * /usr/sbin/ntpdate 192.168.162.100
##主服务器中开启二进制日志 在mysqld末行插入 log-bin=master-bin #开启二进制日志 binlog_format=MIXED #二进制日志格式 log-slave-updates=true #开启从服务器同步 ##重启服务 [root@localhost ~]#systemctl restart mysqld.service ##进入数据库 [root@lppdff system]# mysql -uroot -p123123 ##授权 mysql> grant replication slave on *.* to 'myslave'@'192.168.162.%' identified by '123456'; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec ##查看节点日志位置 mysql> show master status;
##俩台从服务器开启中继 [root@localhost system]# vim /etc/my.cnf server-id = 2 relay-log=relay-log-bin relay-log-index=slave-relay-bin.index ##重启数据库 [root@localhost system]# systemctl restart mysqld.service ##进入数据库 [root@localhost system]# mysql -uroot -p123123 ##添加从服务器日志记录 mysql> change master to master_host='192.168.162.100',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1053; ##开启服务 mysql>start slave; ##查看服务线程 mysql>show slave status\G ##此线程必须为yes #Slave_IO_Running: Yes #Slave_SQL_Running: Yes
验证
在主服务器上创建数据库
从服务器验证
三、搭建Amoeba 实现读写分离
3.1 环境配置
(主)master服务器: 192.168.162.100 mysql5.7
(从)slave1服务器: 192.168.162.111 mysql5.7
(从)slave2服务器: 192.168.162.102 mysql5.7
Amoeba服务器: 192.168.162.121 jdk1.6、Amoeba
客户端 服务器: 192.168.162.122 mysql
3.2 实验配置
3.2.1 配置Amoeba服务器
##配置Amoeba服务器 [root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0 [root@localhost ~]# ##将安装包放入 [root@localhost opt]# ls amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin rh ##拷贝文件 [root@localhost opt]# cp jdk-6u14-linux-x64.bin /usr/local/ [root@localhost opt]# cd /usr/local/ ##添加执行权限 [root@localhost local]# chmod +x /usr/local/jdk-6u14-linux-x64.bin [root@localhost local]#./jdk-6u14-linux-x64.bin #一路回车到底,最后输入yes 自动安装
##修改环境变量 [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 export PATH=$PATH:$AMOEBA_HOME/bin ##改名 [root@localhost local]# mv jdk1.6.0_14/ jdk1.6 ##刷新环境变量 [root@localhost local]# source /etc/profile
##解压amoeba安装包 ##创建目录 [root@localhost opt]#mkdir /usr/local/amoeba [root@localhost opt]#cd /opt/ ##解压文件 [root@localhost opt]#tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba ##添加执行权限 [root@localhost opt]#chmod -R 755 /usr/local/amoeba/
3.2.2 主与服务器配置
##在主和从服务器添加记录,如果主从复制配置完成不需要从在添加 mysql> grant all on *.* to test@'192.168.162.%' identified by '123123'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
3.2.3 amoeba服务器配置
##备份配置文件 [root@localhost local]# cd amoeba/conf/ ##备份全局配置文件 [root@localhost conf]# cp amoeba.xml amoeba.xml.bak ##备份数据库文件 [root@localhost conf]# cp dbServers.xml dbServers.xml.bak
##修改全局配置文件添加记录 [root@localhost conf]# vim amoeba.xml
##修改日志配置文件添加记录 [root@localhost conf]# vim dbServers.xml
开启服务,验证
客户机验证
##客户机使用数据库为mariadb [root@localhost ~]#yum install mariadb mariadb-server.x86_64 -y ##登录 [root@localhost yum.repos.d]# mysql -uamoeba -p123123 -h 192.168.162.121 -P8066
主从复制验证
##关闭服务 mysql> stop slave; Query OK, 0 rows affected (0.00 sec) ##开启日志 在主和从服务器上 mysql> set global general_log=1; ##在客户机添加记录 MySQL [lpp]> insert into a values(1,'abc',20,'man'); ##在主查看日志 [root@lppdff ~]# cd /usr/local/mysql/data/ [root@lppdff data]# tail -f lppdff.log ##在从服务器查看日志 [root@lppdff ~]# cd /usr/local/mysql/data/ [root@lppdff data]# tail -f localhost.log
原文链接:https://blog.csdn.net/fangandpu/article/details/121729416
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/16688