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=2 -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一定要启用参数,5.7可以不启用
MySQL命令:
CHANGE MASTER TO
MASTER_HOST= 'master_host_ip',
MASTER_USER= 'repl',
MASTER_PASSWORD = 'password',
MASTER_AUTO_POSITION=1;
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 = 100;
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 '123456';
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=1 --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='123456',
MASTER_LOG_FILE='mysql-bin.000017',
MASTER_LOG_POS=663;
MASTER_LOG_FILE和MASTER_LOG_POS的值从全备文件中的CHANGE MASTER中获取
以上复制链路的配置完成。
启动slave:
mysql> start slave;
检查是否启动成功状态:
mysql> show slave status \G
显示:
Relay_Master_Log_File: mysql-bin.000017Slave_IO_Running:YesSlave_SQL_Running: Yes
说明启动成功了,可以在主服务器上插入数据,在从服务上查看数据是否同步过来了。
六. 主从复制的一些缺点
虽然主从复制增加了一个数据库副本,但从数据库和主数据库的数据最终会是一致的。之所以说是最终一致,因为MySQL复制是异步的,正常情况下主从复制数据之间会有一个微小的延迟。
通过这个数据库副本看似解决了数据库单点问题,但并不完美:因为这种架构下,如果主服务器宕机,需要手动切换从服务器,业务中断不能忍受,不能满足应用高可用的要求。
如大家对内容有更多想法及建议,欢迎留言交流~
推荐一个交流学习群:614478470 快来点击加入 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
MySQL主从复制虽好,能完美解决数据库单点问题吗?的更多相关文章
- MySQL主从复制解决数据库单点问题
一.单个数据库服务器的缺点 数据库服务器存在单点问题: 数据库服务器资源无法满足增长的读写请求: 高峰时数据库连接数经常超过上限. 二.如何解决单点问题 增加额外的数据库服务器,组建数据库集群: 同一 ...
- 一个响应式数据库框架SQLBrite,完美解决数据库和UI的同步更新!
相信小伙伴们在开发中或多或少都可能遇到过这样的问题:打开一个应用后,为了快速响应,先将数据库中的数据呈现给用户,然后再去网络上请求数据,请求成功之后将数据缓存至数据库,同时更新UI,但是我们经常会这样 ...
- MySQL主从复制架构使用方法
原文:MySQL主从复制架构使用方法 一. 单个数据库服务器的缺点 数据库服务器存在单点问题 数据库服务器资源无法满足增长的读写请求 高峰时数据库连接数经常超过上限 二. 如何解决单点问题 增加额外的 ...
- MySQL入门篇(四)之MySQL主从复制
一.MySQL主从复制原理 随机站点访问量的鞥集啊,单台的MySQL服务器压力也不断地增加,此时需要对MySQL进行优化,如果在MySQL优化无明显改善时期,可以使用高可用.主从复制.读写分离.分库分 ...
- 数据库集群 MySQL主从复制
MySQL主从复制 本节内容我们联系使用MySQL的主从复制功能配置Master和Slave节点,验证数据MySQL的数据同步功能. 因为要使用多个MySQL数据库,所以不建议在电脑上安装多个MySQ ...
- Mysql主从(主从不同步解决办法,常见问题及解决办法,在线对mysql做主从复制)
一.主从不同步解决办法 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. show master status; 也正常. mys ...
- 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)(转)
这篇文章给大家介绍关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)的相关资料,还给大家收集些关于MySQL会出现中文乱码原因常见的几点,小伙伴快来看看吧 最近两天做项目总是被乱码问题困 ...
- 基于Git的数据库sql文件的管理——完美解决团队sql操作协同问题
目录 基于Git的数据库sql文件的管理--完美解决团队sql操作协同问题 1.产生背景 2.之前没用Git管理数据库出现的问题 2.1 用同一个库调试带来的问题 3.解决方案 3.1 Sql文件的创 ...
- mysql主从复制实现数据库同步
mysql主从复制相信已经用得很多了,但是由于工作原因一直没怎么用过.趁着这段时间相对空闲,也就自己实现一遍.尽管互联网上已有大把类似的文章,但是自身实现的仍然值得记录. 环境: 主服务器:cento ...
随机推荐
- CListCtrl颜色设置
动态改变listctrl 单元格背景及文字颜色 m_listshow.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列 m_listsh ...
- Redis之基本使用
基本介绍 Redis是一种key-value存储形式的非关系型数据库,也是一个强大的内存型存储系统,但是它比传统的Memcached 更灵活,支持更多的数据类型,同时也可以持久化. 支持的数据类型 先 ...
- ASM: Active Shape Models--Their Training and Application
这篇论文的前半部分基本就是论文<Training Models of Shape from Sets of Examples>的全部内容,只不过多两个应用示例,后半部分在PDM模型的基础上 ...
- Android studio 远程服务调用
https://blog.csdn.net/bond_zhe/article/details/50971021
- tar打包
进入到目录里,执行下面的命令,可以把目录内的所有内容打包 tar -cvf 111.tar *
- Java开发规范总结
Service / DAO 层方法命名规约: 1 ) 获取单个对象的方法用 get 做前缀.2 ) 获取多个对象的方法用 list 做前缀.3 ) 获取统计值的方法用 count 做前缀.4 ) 插 ...
- python操作email
python操作email 参考链接: python官网imaplib: https://docs.python.org/2/library/imaplib.html Python 用IMAP接收邮件 ...
- python拼接multipart/form-data类型post请求格式
# 最近要做form-data类型接口,大多数这种格式用来文件上传,但是我们公司就是用这种格式传输请求数据. # 百度了一些基本都是files方式的,可是我们需要data=方式的.下面自己来拼接,代码 ...
- kali,parrot最新更新debain源
deb http://mirrors.163.com/debian/ jessie main non-free contribdeb http://mirrors.163.com/debian/ je ...
- Linux部署Java环境
一. yum安装jdk (1) 搜索jdk安装包 yum search java|grep jdk (2) 下载jdk1.8,下载之后默认的目录为: /usr/lib/jvm/ yum install ...