1主5从mysql数据库_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服务器:

e6fceb8ffca07c7e2b97f99e97f67ae9.png

slave 服务器:

5fd37e8384b7e4cfac5e023b708c8e8c.png

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. 先对主服务器进行配置

eb1f9a1bf110ffe5a5ab2ee7b9db43d4.png

由于主服务器一直在运行着,在生产环境中主服务器是很少会重启的,如果主服务器重启,会造成正常的业务访问的中断,所以在服务器启动之前就启动了二进制日志。

这里不需要重启主服务器了,由于主服务器的默认server_id=1,我们虽然在配置文件中更改了它的值 ,但实际运行环境中并没有改变。

我们可以查看一下当前server_id:

mysql> show variables like '%server_id%';

可以通过以下命令动态的进行修改:

mysql> set global server_id = 100;

2. 再对从服务器进行配置

ff976bb089a5f12e3033b1c50c19b694.png

修改完从服务器配置后,重启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 

初始化完成后,准备。

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.000017

Slave_IO_Running:Yes

Slave_SQL_Running: Yes

说明启动成功了,可以在主服务器上插入数据,在从服务上查看数据是否同步过来了。

六. 主从复制的一些缺点

虽然主从复制增加了一个数据库副本,但从数据库和主数据库的数据最终会是一致的。之所以说是最终一致,因为MySQL复制是异步的,正常情况下主从复制数据之间会有一个微小的延迟。

通过这个数据库副本看似解决了数据库单点问题,但并不完美:因为这种架构下,如果主服务器宕机,需要手动切换从服务器,业务中断不能忍受,不能满足应用高可用的要求。

如大家对内容有更多想法及建议,欢迎留言交流~作者:听风

来源:https://www.cnblogs.com/huchong/p/10253522.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基本对象类型

文章目录python对象类型1.数字2.字符串3.列表4.字典5.元组6.文件7.其他核心类型python对象类型 1.数字 例子 >>> 123222 345 >>> 1.5*399 598.5 >>> 2**10 1024 >>> 3.1415*2 6.283 >>> 9.99991 10.9999 >>> import …

html响应式五栏布局,HTML – 响应式2列CSS布局,包括固定宽度的侧边栏?

在任何地方找不到解决方案(我猜这一定是一个非常常见的问题).我正在创建一个带侧边栏的响应式设计,其中侧边栏需要具有200px的固定宽度并且具有未知高度.我怎样才能使主要内容区占据所有剩余的宽度,而不会有任何不当行为.最接近我的是以下内容,但问题在于侧边栏可以与页脚重叠.…

js语句连接mysql数据库_js中require()的用法----JS如何连接数据库执行sql语句或者建立数据库连接池...

var vue require(vue);引入vue的意思,commonjs的写法。node都是用require来载入模块的,可以看看webpackvue。require()可以调用模块。这不是就把vue模块命了个名吗?nodejs的写法,引入vue模块并命名为vue的意思。前端的东西&#…

(DFS)迷宫问题

题目: 从s到t,.意味着可以走,*意味着不能走,如果能走,输出路径,如果不能走,输出no。 输入: 5 6 ....S* .***.. .*..*. *.***. .T....输出: ....m* …

惠普z6计算机进不去桌面,HP Z6 桌面工作站 | HP® HK 惠普香港

Intel、Thunderbolt 及 Xeon 均為 Intel Corporation 於美國及/或其他國家或地區的商標。Microsoft 及 Windows 為 Microsoft Corporation 於美國及/或其他國家或地區的註冊商標或商標。NVIDIA 是 NVIDIA Corporation 在美國及其他國家或地區的商標及/或註冊商標。USB Type-C™…

mysql定义条件和处理_mysql sql存储过程条件定义与处理

一、条件定义DECLARE condition_name CONDITION FOR condition_valecondition_value:sqlstate[value] sqldata_value |mysql教程_error_code二、条件处理DECLARE htype HANDLER FOR cond_value[...] sp_statementhandtype_value:sqlstate [value] saltate_value|contentname|sq…

(DFS)跳马

题目: 马走日,不考虑别马脚,问马能否从S走到T,其中‘#’表示不能落下,‘.’表示能落下 输入: .#....#S# ..#.#.#.. ..##.#..# ......##. ...T..... ...#.#... ...#..... ...###... ......... .##......输…

长沙医学院学位计算机考试内容,湖南长沙医学院2017年9月计算机等级考试报名时间...

长沙医学院2017年下半年第49次全国计算机等级考试(以下简称NCRE)将于2017年9月23至25日举行。为做好本次考试报名及相关考务工作,现将有关事项通知如下:一、报名时间:2016年6月7日—2016年6月18日,逾期不接受任何理由的补报名。二…

(递推)常用递推式总结及实现

常用递推式 后面问题的解可以由前面问题的解递推而来,每一项都与前面若干项有一定关联。它是一种用若干步可以重复的简单运算来描述复杂问题的方法。 爬楼梯和兔子问题和斐波那契:f(n)f(n−1)f(n−2);f(1)1,f(2)1f(n)f(n-1)f(n-2) ; f(1)1,f(2)1 f(n)f…

mysql建表语句utf-8_mysql 创建utf-8数据集

之前数据库都是默认的‘latin1 ’,由于业务需求,需要把数据集修改为utf-8(1)创建一个新的数据库,并设置默认的格式为utf-8CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;(2) 将这个yourdbname 数据…

html读取servlet,简单html与servlet交互(HTML利用servlet读取txt)

1.usercheck.htmlhref"../lib/ligerUI/skins/Aqua/css/usertext.css" rel"stylesheet"type"text/css" />填写用户名/>id"verifyButton"/>>2.usertext.css.userClass {border: 1px solid red ;background-image:url(../../…

mysql dnslog_dnslog小技巧

一、dnslog利用场景主要针对无回显的情况。Sql-BlindRCESSRFRFI(Remote File Inclusion)二、原理将dnslog平台中的特有字段payload带入目标发起dns请求,通过dns解析将请求后的关键信息组合成新的三级域名带出,在ns服务器的dns日志中显示出来。三、案例展…

卷积积分

文章目录卷积积分信号的时域分解卷积公式卷积积分定义卷积积分图解法:卷积的性质:常用卷积重要公式卷积求解方法用梳状函数卷积产生周期信号矩形脉冲的卷积产生三角形和梯形脉冲自相关互相关函数定义相关与卷积卷积积分 本质:信号分解 f(t)…

2019哈佛计算机专业录取,2019哈佛大学早申请录取数据公布 录取率再降1个点仅为13.4%...

出结果了,出结果了,作为美国在全球范围内最负盛名的哈佛大学,与近日公布2019美国本科申请提前录取的相关数据。今年哈佛大学本科学院向6,968位在2023届提前录取轮次申请人中的935位发出了录取通知,申请录取率约为13.4%&#xff0c…

mysql master 监控_可用于监控 mysql Master Slave 状态的python代码

代码如下:import osimport sysimport MySQLdbdef getStatus(conn):query ” SHOW SLAVE STATUS “# print querycursor conn.cursor()cursor.execute(query)result cursor.fetchall()return result[0]def resolve(conn):cursor conn.cursor()query1 “set global sql_slav…

python类和oop基础知识

文章目录oop:面向对象程序设计python类的特点:oop基本概念:1.属性继承搜索:2.类和实例:3.类方法调用4.编写类树5.代码重用oop:面向对象程序设计 1.类:一些函数的包,这些函数大量使用并处理内置对象类型。 2.类的设计…

计算机语言中tc是什么,新人必须了解的几个TC常用语和脚本基础知识!

基础知识TC常用语一,函数在百度百科中是这样解释函数的:函数(function)表示每个输入值对应唯一输出值的一种对应关系。在计算机定义中函数过程中的这些语句用于完成某些有意义的工作——通常是处理文本,控制输入或计算数值。通过在程序代码中引入函数名称和所需的参…

mysql中pi是什么意思_MySQL 基础知识与常用命令

MySQLMySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL在过去由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在Inte…

科幻计算机类小说,短篇科幻小说推荐 | 黄金时代的五部科幻杰作

编注:本文是少数派读书月「我读过的好书」征文活动的入围文章。本文仅代表作者本人观点,少数派对标题和排版略作调整。想了解如何参与本次读书征文,赢取各种丰厚奖品,你可以 点此查看 活动规则和奖品清单。文章包含五个故事的情节…

数据结构:单链表

文章目录链表:单链表的实现及操作:1.指针描述的单链表L存储结构2.查找L的第i个元素,将其值赋值给e3.在L的第i个位置之前插入元素e4.在L中,删除第i个元素,并返回其值e5.输入n个元素,建立带头节点的单链表L6.…