目录

一、MySQL 主从复制

1.1 主从复制原理

1.2 MySQL的扩展

1.2.1 什么是读写分离

1.2.2 为何读写分离

1.2.3 何时要读写

1.2.4 主从复制与读写分离

1.2 主从复制过程

1.3 主从复制相关线程

1.4 复制功能文件

二、模拟搭建mysql主从复制

2.1 环境配置

2.2 实验环境

2.3 搭建mysql主从复制

三、搭建Amoeba 实现读写分离

3.1 环境配置

3.2 实验配置

3.2.1 配置Amoeba服务器

3.2.2 主与服务器配置

3.2.3 amoeba服务器配置


一、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.1005 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 

MySQL 集群Cluster相关推荐

  1. 6 MySQL 集群Cluster

    文章目录 6 MySQL 集群Cluster 6.1 MySQL 主从复制 6.1.1 主从复制架构和原理 6.1.1.1 服务性能扩展方式 6.1.1.2 MySQL的扩展 6.1.1.3 复制的功 ...

  2. MySQL数据库(九) 集群 Cluster 和性能优化

    文章目录 6 MySQL 集群 Cluster 6.1 MySQL主从复制 6.1.1 主从复制架构和原理 6.1.2 实现主从复制配置 6.1.3 主从复制相关 6.1.4 实现级联复制 6.1.5 ...

  3. mysql 集群实践_MySQL Cluster集群探索与实践

    MySQL集群是一种在无共享架构(SNA,Share Nothing Architecture)系统里应用内存数据库集群的技术.这种无共享的架构可以使得系统使用低廉的硬件获取高的可扩展性. MySQL ...

  4. MySQL Cluster(MySQL 集群) 初试(转)

    作/译者:叶金荣(imysql#imysql.com>),来源:http://imysql.com,欢迎转载. 作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请 ...

  5. MySQL Cluster(MySQL 集群) 初试

    MySQL Cluster 是MySQL适合于分布式计算环境的高实用.高冗余版本.它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器.在MyQL 5.0及 ...

  6. mysql cluster java_Java学习笔记(十):MySQL集群安装配置

    需要安装软件(所有的节点都必须安装,不需要安装mysql mysql-server,mysql-cluster有自带的): mysql-cluster-gpl-7.3.7-linux-glibc2.5 ...

  7. mysql集群初始化配置_集群Cluster MySQL的安装配置和使用

    集群Cluster MySQL的安装配置和使用 发布时间:2020-05-28 14:20:03 来源:亿速云 阅读:233 作者:鸽子 MySQL Cluster MySQL集群 基本概念: &qu ...

  8. mysql 集群 qps_MySQL Cluster:如何通过扩展为MySQL带来2亿QPS

    本篇文章的目的在于介绍MySQL Cluster--也就是MySQL的一套内存内.实时.可扩展且具备高可用性的版本.在解决标题中所提到的每秒2亿查询处理能力问题之前,我们先对MySQL集群的背景信息及 ...

  9. CentOS 7安装MySQL集群-GALERA CLUSTER 4 FOR MYSQL 8 RELEASE

    CentOS 7安装MySQL集群-GALERA CLUSTER 4 FOR MYSQL 8 RELEASE 文章目录 CentOS 7安装MySQL集群-GALERA CLUSTER 4 FOR M ...

  10. Galera Cluster: 一种新型的高一致性MySQL集群架构

    2019独角兽企业重金招聘Python工程师标准>>> 1. 何谓Galera Cluster 何谓Galera Cluster?就是集成了Galera插件的MySQL集群,是一种新 ...

最新文章

  1. Spring Boot与Redis的集成
  2. 解决Caused by: java.lang.NoSuchMethodException: com.mchange.v2.c3p0.cfg.C3P0Config.init()的总结...
  3. 24款非常实用的CSS3工具终极收藏
  4. 苹果面试8大难题及答案
  5. 区间数值计数(洛谷P1980题题解,Java语言描述)
  6. 神经网络如何进行深度估计?
  7. Maven 依赖中 scope 详解
  8. 微博计数:从关系服务到访问计数, Redis 持续优化支撑万亿级访问(含 PPT)
  9. 如何计算一组数据的波动幅度_如何用Excel计算一个投资组合(双资产/三资产)的波动率?...
  10. 关于解决MyEclipse的耗内存的办法
  11. tomcat多种部署项目方法总结
  12. SpringCachemanager使用Cache(redis作为缓存中间件)
  13. 科普下Tippy.js - 开源且高度可做空间php的气泡翻译器
  14. Exp4 恶意代码分析 20154328 常城
  15. OpenGL学习书籍推荐
  16. android在ctwap下播放视频,退出播放,切换到ctnet下,视频一直缓冲无法播放
  17. 自动关闭当前的Fragment返回上一个Fragment该如何实现
  18. 经典的期货量化交易策略大全(含源代码)
  19. 《Python自然语言处理(第二版)-Steven Bird等》学习笔记:第02章 获得文本语料和词汇资源
  20. 武汉大学1987级计算机专业,武汉大学信息管理学院

热门文章

  1. 两种内点法,障碍函数法(Barrier Method)和原始对偶法(Primal-Dual Method)
  2. 1.直流无刷电机BLDC转速计算推论
  3. Java CRC32基本使用
  4. 移动光猫获取管理员密码过程记录(吉比特TEWA-272G)
  5. [Matlab科学计算] 绘制B样条基函数
  6. 使用UIImageView实现加载GIF图片
  7. 试用版:springboot集成pageoffice实现word在线预览可编辑
  8. 在线word预览方案
  9. 西门子atch指令详解_西门子plc指令中文详解
  10. 数据结构与算法:二路归并排序(合并排序)