MySQL主从复制解决数据库单点问题
一、单个数据库服务器的缺点
数据库服务器存在单点问题;
数据库服务器资源无法满足增长的读写请求;
高峰时数据库连接数经常超过上限。
二、如何解决单点问题
增加额外的数据库服务器,组建数据库集群;
同一集群中的数据库服务器需要具有相同的数据;
集群中的任一服务器宕机后,其它服务器可以取代宕机服务器。
三、MySQL主从复制架构
1、主库将变更写入到主库的binlog中
一些MySQL版本并不会开启二进制日志,所以一定要检查是否开启;
如果刚开始没有开启,后面再进行开启的话,需要重启数据库才能生效,而且数据库的重启往往会对业务造成很大的影响;
尽管二进制日志对性能有稍许的影响,所以还是建议大家无论是否使用复制功能,都要开启MySQL二进制日志,因为增量备份也需要二进制日志。
2、从库的IO线程在指定位置读取主库binlog内容存储到本地的中继日志(Relay Log)中
要完成二进制日志的传输过程,MySQL会在从服务器上启动一个工作线程,称为IO线程,这个IO线程会跟主数据库建立一个普通的客户端连接,然后在主服务器上启动一个特殊的二进制转储线程称为binlogdown线程。
从库上的IO线程通过这个二进制转储线程来读取主库上的二进制事件,如果该事件追赶上主库,则会进入sleep状态,直到主库发起信号通知有新事件产生时,才会被唤醒,relay log的格式和binlog格式是完全相同的,
可以使用mysqlbinlog来读取relay log中的内容。
3、从库的SQL线程读取Relay Log日志中的内容,并在从库中重放
SQL线程所执行的事件,我们可以通过配置选项来决定是否要写入到从服务器的二进制日志中。
目前MySQL支持两种复制类型:
基于二进制日志点的复制
基于GTID的复制(MySQL>=5.7推荐使用)
四、MySQL主从配置步骤
1、配置主从数据库服务器参数
有些参数配置后需要数据库重启才能生效,为了不影响数据库的正常使用,我们最好在服务器上线的同时就把参数都配置好。特别是master服务器的参数,更应该作为服务器初始参数来进行配置。
master服务器:

slave 服务器:

2、在master服务器上创建用于复制的数据库账号
用于IO线程连接master服务器获取binlog日志,需要* REPLICATION SLAVE** 权限:
create user 'repl'@'ip段' identified by 'password';
grant replication slave on *.* to 'repl'@'ip段';
3、备份master服务器上的数据并初始化slave服务器数据
建议主从数据库服务器采用相同的MySQL版本;
建议使用全库备份的方式初始化slave数据。
采用相同版本的好处:
我们可以使用全备的方式来初始化slave数据,还可以避免不同版本之间的差异造成数据库同步失败的问题。
如果我们使用的主从复制的服务器MySQL版本不同,则一定要注意master上的版本一定要低于slave服务器,不然同步的时候就可能出现错误。
由于我们演示过程中的MySQL服务器都是使用的MySQL5.7,所以我们可以使用全备的方式进行:
mysqldump --master-data= -uroot -p -A --single-transaction -R --triggers
4、启动基于日志点的复制链路
在slave服务器上运行,MySQL命令:
CHANGE MASTER TO MASTER_HOST= 'master_host_ip', MASTER_USER= 'repl', MASTER_PASSWORD = 'password', MASTER_LOG_FILE='mysql_log_file_name', MASTER_LOG_POS=xxxxxx;
5、启动基于GTID的复制链路
GTID:全局事务ID,GTID可以保证每一个在主上提交的事务,在复制集群中可以生成一个唯一的ID值,要使用基于GTID的复制,我们要在主从复制的配置文件中同时加入以下配置项。
MySQL配置:
gtid_mode=on
# 是否启动gtid模式,启动了此模式会在二进制日志中会额外记录每个事务的GTID标识符 enforce-gtid-consistency
# 强制gtid一致性,用于保证启动gtid后事务的安全 log-slave-updates = on
# mysql5.6一定要启用参数,.7可以不启用
MySQL命令:
CHANGE MASTER TO MASTER_HOST= 'master_host_ip', MASTER_USER= 'repl', MASTER_PASSWORD = 'password', MASTER_AUTO_POSITION=;
GTID复制的限制:
无法再使用create table ... select语句建立表,只能先create表,再insert数据;
无法在事务中使用create temporary table建立临时表;
无法使用关联更新同时更新事务表和非事务表。
4和5中选一个执行即可。
五. MySQL主从复制演示
1. 先对主服务器进行配置

由于主服务器一直在运行着,在生产环境中主服务器是很少会重启的,如果主服务器重启,会造成正常的业务访问的中断,所以在服务器启动之前就启动了二进制日志。
这里不需要重启主服务器了,由于主服务器的默认server_id=1,我们虽然在配置文件中更改了它的值 ,但实际运行环境中并没有改变。
我们可以查看一下当前server_id:
mysql> show variables like '%server_id%';
可以通过以下命令动态的进行修改:
mysql> set global server_id = ;
2. 再对从服务器进行配置

修改完从服务器配置后,重启MySQL服务器。如果使用的是MySQL5.7版本的需要注意:
MySQL5.7增加了server-uuid值,默认情况下载auto.cnf文件中,如果是使用的镜像的方式安装,可能大家的uuid一样 ,所以需要把auto.cnf文件删除掉。MySQL重启后会自动重新生成uuid的值,这样就可以保证不同服务器上的MySQL实例的uuid的值是不一样的;
如果server-uuid的值相同,主从复制会出现问题。
以上我们就完成了主从复制的配置,接下来我们要在主服务器上建立复制账号。
3. 在MySQL主服务器上建立MySQL复制账号
mysql> create user 'dba_repl'@'192.168.3.%' identified by ''; mysql> grant replication slave on *.* to 'dba_repl'@'192.168.3.%';
4. 建立好复制账号以后,通过mysql主服务器上的全备初始化从服务器上数据
进行全备:
[root@localhost data]# cd /data/db_backup/ [root@localhost db_backup]# mysqldump -uroot -p --master-data= --single-transaction --routines --triggers --events --all-databases > all.sql Enter password:
将其拷贝到从服务器上:
[root@localhost db_backup]# scp all.sql root@192.168.3.101:/root
在从服务器上恢复备份进行初始化:
[root@Node2 ~]# mysql -uroot -p < all.sql
初始化完成后,准备。
5. 从服务器进行基于日志点的复制链路的配置
mysql> change master to
master_host='192.168.3.100',
master_user='dba_repl',
master_password='',
MASTER_LOG_FILE='mysql-bin.000017',
MASTER_LOG_POS=;
MASTER_LOG_FILE和MASTER_LOG_POS的值从全备文件中的CHANGE MASTER中获取
以上复制链路的配置完成。
启动slave:
mysql> start slave;
检查是否启动成功状态:
mysql> show slave status \G
显示:
Relay_Master_Log_File: mysql-bin.000017
Slave_IO_Running:Yes
Slave_SQL_Running: Yes
说明启动成功了,可以在主服务器上插入数据,在从服务上查看数据是否同步过来了。
六. 主从复制的一些缺点
虽然主从复制增加了一个数据库副本,但从数据库和主数据库的数据最终会是一致的。之所以说是最终一致,因为MySQL复制是异步的,正常情况下主从复制数据之间会有一个微小的延迟。
通过这个数据库副本看似解决了数据库单点问题,但并不完美:因为这种架构下,如果主服务器宕机,需要手动切换从服务器,业务中断不能忍受,不能满足应用高可用的要求。
手动切换的问题可以了解一下keepalived
看到了好文章就摘下来了。下面是文章的源出处
文章转自:https://mp.weixin.qq.com/s/3daDORzzNGphiS_dXd8gGw
MySQL主从复制解决数据库单点问题的更多相关文章
- MySQL主从复制虽好,能完美解决数据库单点问题吗?
一.单个数据库服务器的缺点 数据库服务器存在单点问题: 数据库服务器资源无法满足增长的读写请求: 高峰时数据库连接数经常超过上限. 二.如何解决单点问题 增加额外的数据库服务器,组建数据库集群: 同一 ...
- mysql主从复制实现数据库同步
mysql主从复制相信已经用得很多了,但是由于工作原因一直没怎么用过.趁着这段时间相对空闲,也就自己实现一遍.尽管互联网上已有大把类似的文章,但是自身实现的仍然值得记录. 环境: 主服务器:cento ...
- MySQL主从复制-指定数据库复制
在/etc/my.cnf添加需要进行同步的数据库信息 #需要进行同步的数据库 #replicate-do-db=custmgr #replicate-do-db=sdata #replicate-ig ...
- MySQL主从复制
Mysql主从复制介绍 MySQL支持单向.双向.链式级联.实时.异步复制.在复制过程中,一台服务器充当服务器(Master),而一个或多个其它的服务器充当从服务器(Slave). 复制可以是单向:M ...
- mysql主从复制的一些东西的整理
最近给新上线的项目进行主从结构的搭建,因此整理些有用的东西出来,供作记录: 一.mysql主从复制的一般配置步骤: 1.准备两台数据库环境,或者单台多实例的环境,能够正常的启动和登陆. 2.配置my. ...
- 八、linux-mysql的mysql主从复制原理和实战
1.mysql主从复制介绍 mysql支持单向.双向.链式级联.实时.异步复制,在复制过程中,一台服务器充当主服务器(Master),而一个或多个其它服务器充当从服务器(Slave). 复制:单向同步 ...
- 数据库集群 MySQL主从复制
MySQL主从复制 本节内容我们联系使用MySQL的主从复制功能配置Master和Slave节点,验证数据MySQL的数据同步功能. 因为要使用多个MySQL数据库,所以不建议在电脑上安装多个MySQ ...
- Mysql实现企业级数据库主从复制架构实战
场景 公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公司业务中断,损失100万,老王做出深刻反省,公司 ...
- 项目实战7—Mysql实现企业级数据库主从复制架构实战
Mysql实现企业级数据库主从复制架构实战 环境背景:公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公 ...
随机推荐
- iOS 基础
layoutSubviews: layoutSubviews是对sbuviews的重新布局,比如,我们想更新子视图的位置,可以通过调用layoutSubviews方法(不能直接调用) layoutSu ...
- php中的释放语句unset和释放函数mysql_free_result()
首先要强调的一点是unset在php中已经不再是一个函数了,既然不是函数,那么就没有了返回值,所以用的时候不能够用unset的返回值来做判断. 其次,在函数中,unset只能销毁局部变量,并不能销毁全 ...
- 2018-2019-2 《网络对抗技术》Exp4 恶意代码分析 Week6 20165233
Exp4 恶意代码分析 实验内容 一.基础问题 1.如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. 使用wi ...
- IOUtils总结
参考:https://www.cnblogs.com/xing901022/p/5978989.html 常用的静态变量 在IOUtils中还是有很多常用的一些变量的,比如换行符等等 public s ...
- EventUtil——跨浏览器的事件对象
. 首页 博客园 联系我 前言:什么是EventUtil?. EventUtil对象全见. addHandler方法. removeHandler方法. event对象与getEvent方法. tar ...
- TP5常量
预定义常量 EXT 类库文件后缀(.php) THINK_VERSION 框架版本号 路径常量 DS 当前系统的目录分隔符 THINK_PATH 框架系统目录 ROOT_PATH 框架应用根目录 AP ...
- 5.mybatis实战教程(mybatis in action)之五:与spring3集成(附源码)
转自:https://blog.csdn.net/nnn9223643/article/details/41962097 在 这一系列文章中,前面讲到纯粹用mybatis 连接数据库, 然后 进行增删 ...
- SpringMVC + Mybatis 多数据源配置
比较常用的配置,多数据源.主从等等. 大概的逻辑是: 1.spring-mybatis.xml中配置多个数据源 2.使用Spring提供的AbstractRoutingDataSource类来根据请求 ...
- mysql 存储过程实例
--存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数 create procedure p_procedurecode(in sumdate varchar(1 ...
- Spring cron 定时调度配置
IDEA 或者 STS http://spring.io/guides/gs/scheduling-tasks/ spring mvc : 结构: Seconds Minutes Hours Day ...