运维工程师必备之MySQL数据的主从复制、半同步复制和主主复制详解 原创作品,允许转载,转载时请务必以超链接形式标明文章 ? 原始出处 ? 、作者信息和本声明。否则将追究法律责任。 http://chrinux.blog.51cto.com/6466723/1204586 一、MySQL复制概述 ? ?⑴、
运维工程师必备之MySQL数据的主从复制、半同步复制和主主复制详解原创作品,允许转载,转载时请务必以超链接形式标明文章?原始出处?、作者信息和本声明。否则将追究法律责任。http://chrinux.blog.51cto.com/6466723/1204586
一、MySQL复制概述
? ?⑴、MySQL数据的复制的基本介绍
? ?目前MySQL数据库已经占去数据库市场上很大的份额,其一是由于MySQL数据的开源性和高性能,当然还有重要的一条就是免费~不过不知道还能免费多久,不容乐观的未来,但是我们还是要能熟练掌握MySQL数据的架构和安全备份等功能,毕竟现在它还算是开源界的老大吧!
? ?MySQL数据库支持同步复制、单向、异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
? ?单向复制有利于健壮性、速度和系统管理:
? ?健壮性:主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为备份。
? ?速度快:通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
? ?系统管理:使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
? ?⑵、MySQL数据复制的原理
? ?MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。
? ?每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。
? ?认识到二进制日志只是一个从启用二进制日志的固定时间点开始的记录非常重要。任何设置的从服务器需要主服务器上的在主服务器上启用二进制日志时的数据库拷贝。如果启动从服务器时,其数据库与主服务器上的启动二进制日志时的状态不相同,从服务器很可能失败。
? ?将主服务器的数据拷贝到从服务器的一个途径是使用LOAD DATA FROM MASTER语句。请注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的主服务器上工作。并且,该语句将获得全局读锁定,因此当表正复制到从服务器上时,不可能在主服务器上进行更新。当我们执行表的无锁热备份时,则不再需要全局读锁定。
? ?MySQL数据复制的原理图大致如下:
?
从上图我们可以看出MySQL数据库的复制需要启动三个线程来实现:
? ?其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。
? ?在前面的描述中,每个从服务器有3个线程。有多个从服务器的主服务器创建为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。
? ?这样读取和执行语句被分成两个独立的任务。如果语句执行较慢则语句读取任务没有慢下来。例如,如果从服务器有一段时间没有运行了,当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程远远滞后。如果从服务器在SQL线程执行完所有索取的语句前停止,I/O 线程至少已经索取了所有内容,以便语句的安全拷贝保存到本地从服务器的中继日志中,供从服务器下次启动时执行。这样允许清空主服务器上的二进制日志,因为不再需要等候从服务器来索取其内容。
二、实列说明MySQL的主从复制架构和实现详细过程
? ? ?主从架构数据库的复制图如下:
其配置详细过程如下:
? ?1、环境架构:
? ? ? ?RedHat Linux Enterprise 5.8 ? ? ? ? mysql-5.5.28-linux2.6-i686.tar
? ? ? ?Master:172.16.7.1/16 ? ? ? ? ? ? ? ? Slave:172.16.7.2/16
? ?2 、安装mysql-5.5.28,需要在主节点和备节点上安装mysql
? ? ? ?Master:
? ? ? ?安装环境准备:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
为mysql的安装提供前提环境和初始化安装mysql
创建数据库目录
# mkdir /mydata/data –pv
创建mysq用户
# useradd -r mysql
修改权限
# chown -R mysql.mysql /mydata/data/
使用mysql- 5.5 通用二进制包安装
解压mysql软件包
# tar xf mysql- 5.5 . 28 -linux2. 6 -i686.tar.gz-C /usr/local/
创建连接,为了方便查看mysql的版本等信息
# cd /usr/local/
#ln –sv mysql- 5.5 . 28 -linux2. 6 -i686.tar.gzmysql
修改属主属组
# cd mysql
# chown -R root.mysql ./*
初始化数据库
# scripts/mysql_install_db –user=mysql --datadir=/mydata/data/
提供配置文件
# cp support-files/my-large.cnf /etc/my.cnf
提供服务脚本
# cp support-files/mysql.server/etc/rc.d/init.d/mysqld
添加至服务列表
# chkconfig --add mysqld
# chkconfig --list mysqld
# chkconfig mysqld on
编辑配置文件,提供数据目录
# vim /etc/my.cnf
# The MySQL server? 修改mysqld服务器端的内容
log-bin=master-bin 主服务器二进制日志文件前缀名
log-bin-index=master-bin.index? 索引文件
innodb_file_per_table=<span class="Apple-converted-space">?</span> 1 ?????开启innodb的一表一个文件的设置
server-id?????? =<span class="Apple-converted-space">?</span> 1 ??????????必须是唯一的
datadir =/mydata/data??????? 数据目录路径
启动mysql服务
# servicemysqld start
为了便于下面的测试,设置环境变量
# vim/etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
执行环境变量脚本,使其立即生效
# . /etc/profile.d/mysql.sh
|
?
?
?启动服务并进行相关的测试:
?mysql的安装配置完成,下面增加一个用于同步数据的账户并设置相关的权限吧!
1 2 3 4 |
建立用户账户
mysql> grant replication slave on *.* to<span class="Apple-converted-space">?</span> 'chris' @ '172.16.%.%' ?identified by<span class="Apple-converted-space">?</span> 'work' ;
刷新数据使其生效
mysql> flush privileges;
|
? ?至此我们mysql的Master设置完成,下面进行slave端的设置吧!
? ?Slave:
? ?安装环境配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
创建mysql数据库目录
# mkdir /mydata/data –pv
创建mysql用户
# useradd -r mysql
修改数据目录权限
# chown -R mysql.mysql /mydata/data/
使用mysql- 5.5 通用二进制包安装mysql
解压mysql软件包
# tar xf mysql- 5.5 . 28 -linux2. 6 -i686.tar.gz-C /usr/local/
创建连接,便于查看mysql的版本等信息
# cd /usr/local/
# ln –sv mysql- 5.5 . 28 -linux2. 6 -i686.tar.gzmysql
修改mysql属主属组
# cd mysql
# chown -R root.mysql ./*
初始化mysql数据库
# scripts/mysql_install_db –user=mysql--datadir=/mydata/data/
提供mysql配置文件
# cp support-files/my-large.cnf /etc/my.cnf
提供服务脚本
# cp support-files/mysql.server /etc/init.d/mysqld
添加至服务列表
# chkconfig --add mysqld
编辑配置文件
# vim /etc/my.cnf
# The MySQL server
#log-bin=mysql-bin????? 禁用二进制日志,从服务器不需要二进制日志文件
datadir = /mydata/data? mysql的数据目录
relay-log = relay-log?? 设置中继日志
relay-log-index = relay-log.index? 中继日志索引
innodb_file_per_table =<span class="Apple-converted-space">?</span> 1
server-id?????? =<span class="Apple-converted-space">?</span> 2 ????id不要和主服务器的一样
设置环境变量
# vim/etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
执行此脚本(导出环境变量)
# . /etc/profile.d/mysql.sh
启动服务
# service mysqld start
|
?
? 到这slave服务的mysql安装和配置完成,下面启动slave复制吧,开启之前先查看下从服务上的二进制文件吧
1 2 3 4 5 |
mysql> show master status; #在Master上执行查看二进制文件
在从服务器上开启复制功能
change master to master_host= '172.16.7.1' ,master_user= 'chris' ,master_password= 'work' ,master_log_file= 'master-bin.000001' ,master_log_pos= 407 ;
开启复制功能
mysql>start slave;
|
至此我们的mysql服务器的主从复制架构已经基本完成,下面开启服务并测试测试吧~
在从服务器开启复制进程:mysql>start slave;
? ?至此我们mysql服务器的主从复制架构已经完成,但是我们现在的主从架构并不完善,因为我们的从服务上还可以进行数据库的写入操作,一旦用户把数据写入到从服务器的数据库内,然后从服务器从主服务器上同步数据库的时候,会造成数据的错乱,从而会造成数据的损坏,所以我们需要把从服务器设置成只读~方法如下:
注意:read-only = ON ,这项功能只对非管理员组以为的用户有效!
OK,此致我们的mysql基于主从架构的复制功能已经搭建全部完成~下面介绍下关于mysql数据目录下面各个文件的功能和作用!
? ?由于二进制文件的缓冲区内,当我们的服务器宕机的时候,缓存区内的数据并没有同步到二进制日志文件内的时候,那就悲剧了,缓冲区内的数据就无法找回了,为了防止这种情况的发送,我们通过设置mysql直接把二进制文件记录到二进制文件而不再缓冲区内停留。
sync-binlog = ON 在主服务器上进行设置,用于事务安全
? 从上面我们可以看到从服务器启动的时候其Slave_IO_Running: Yes和Slave_SQL_Running: Yes是自动启动的,但是有时候我们在主服务上进行的误操作等,也会直接同步到从服务器上的,要想恢复那就难了,所以我们需要关闭其自动执行功能,让其能够停止,skip-slave-start = 1 ,让其不开启自动同步,但是遗憾的是mysql5.28上已经没有了,我们可以通过停止相关线程来实现:
mysql>STOP SLAVE 或STOP SLAVE ?IO_THREAF或STOP SLAVE SQL_THREAD
注意:从服务器的所有操作日志都会被记录到数据目录下的错误日志中!
三、MySQL的半同步复制
?
? ?实现半同步复制的功能很简单,只需在mysql的主服务器和从服务器上安装个google提供的插件即可实现,
? ?主服务上使用semisync_master.,从服务器上使用sosemisync_slave.so插件即可实现,插件在mysql通用二进制的mysql/lib/plugin目录内。
其配置步骤如下
1、分别在主从节点上安装相关的插件
master:
1 2 3 |
安装插件:mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME<span class="Apple-converted-space">?</span> 'semisync_master.so' ;
启动模块:mysql> SET GLOBAL rpl_semi_sync_master_enabled =<span class="Apple-converted-space">?</span> 1 ;
设置超时时间:mysql> SET GLOBAL rpl_semi_sync_master_timeout =<span class="Apple-converted-space">?</span> 1000 ;
|
?
1 2 3 4 |
slave:
安装插件:msyql> INSTALL PLUGIN rpl_semi_sync_slave SONAME<span class="Apple-converted-space">?</span> 'semisync_slave.so' ;
启动模块:mysql> SET GLOBAL rpl_semi_sync_slave_enabled =<span class="Apple-converted-space">?</span> 1 ;
重启进程使其模块生效:mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
|
? 上面的设置时在mysql进程内动态设定了,会立即生效但是重启服务以后就会失效,为了保证永久有效,需要把相关配置写到主、从服务器的配置文件my.cnf内:
1 2 3 4 5 6 7 8 |
在Master和Slave的my.cnf中编辑:
# On Master
[mysqld]
rpl_semi_sync_master_enabled= 1
rpl_semi_sync_master_timeout= 1000 ???#此单位是毫秒
# On Slave
[mysqld]
rpl_semi_sync_slave_enabled= 1
|
? 确认半同步功能已经启用,通过下面的操作进行查看
1 2 3 4 5 |
master:
mysql> CREATE DATABASE asyncdb;
master> SHOW STATUS LIKE<span class="Apple-converted-space">?</span> 'Rpl_semi_sync_master_yes_tx' ;
slave> SHOW DATABASES;
其测试过程如下
|
然后把从服务器上的复制进程开启,
? 我们至此已经实现了mysql数据库复制的半同步方式的架构,并且通过测试查看了复制功能,下面我们进行双主模型架构吧。
四、MySQL设置主-主复制:masterslave?
1、在两台服务器上各自建立一个具有复制权限的用户;让两个数据库互为主从的关系
2、修改配置文件:
把上面的连个数据库的配置文件重新配置,其配置如下?
1 2 3 4 5 6 7 8 |
# 主服务器上
[mysqld]
server-id =<span class="Apple-converted-space">?</span> 1
log-bin = mysql-bin
relay-log = relay-mysql
relay-log-index = relay-mysql.index
auto-increment-increment =<span class="Apple-converted-space">?</span> 2 ???????????#每次跳两个数。
auto-increment-offset =<span class="Apple-converted-space">?</span> 1 ??????????????#从 1 开始。
|
1 2 3 4 5 6 7 |
[mysqld]
server-id =<span class="Apple-converted-space">?</span> 2
log-bin = mysql-bin
relay-log = relay-mysql
relay-log-index = relay-mysql.index
auto-increment-increment =<span class="Apple-converted-space">?</span> 2
auto-increment-offset =<span class="Apple-converted-space">?</span> 2
|
? 如果此时两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
master:查看日志文件信息
mysql> show master status;
+------------------+----------+--------------+------------------+
| File???????????? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin. 000001 ?|?????<span class="Apple-converted-space">?</span> 107 ?|????????????? |????????????????? |
+------------------+----------+--------------+------------------+
Slave:查看服务器日志文件信息
mysql> show master status;
+------------------+----------+--------------+------------------+
| File???????????? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin. 000001 ?|?????<span class="Apple-converted-space">?</span> 107 ?|????????????? |????????????????? |
+------------------+----------+--------------+------------------+
1 ?row<span class="Apple-converted-space">?</span> in ?set ?( 0.00 ?sec)
|
?在各个服务器上建立账号和权限,来进行同步设置
1 2 3 |
master:
mysql> GRANT REPLICATION SLAVE ON *.* TO<span class="Apple-converted-space">?</span> 'chrislee' @ '172.16.%.%' ?IDENTIFIED BY<span class="Apple-converted-space">?</span> 'work' ;
mysql> flush privileges;
|
1 2 3 |
slave:
mysql> GRANT REPLICATION SLAVE ON *.* TO<span class="Apple-converted-space">?</span> 'chrisli' @ '172.16.%.%' ?IDENTIFIED BY<span class="Apple-converted-space">?</span> 'work' ;
mysql> flush privileges
|
在各服务器上指定对另一台服务器为自己的主服务器即可:
?
1 2 |
server1
mysql> CHANGE MASTER TO MASTER_HOST= '172.16.7.2' ,MASTER_USER= 'chrisli' ,MASTER_PASSWORD= 'work' ,MASTER_LOG_FILE= 'mysql-bin.000001' ,MASTER_LOG_POS= 344 ;
|
1 2 |
server2:
mysql> CHANGE MASTER TO MASTER_HOST= '172.16.7.1' ,MASTER_USER= 'chrislee' ,MASTER_PASSWORD= 'work' ,MASTER_LOG_FILE= 'mysql-bin.000001' ,MASTER_LOG_POS= 345 ;
|
双主架构配置基本完成,下面在各自上面启动复制进程吧~并进行测试:
?
? ?至此我们通过上面的测试,可以看出已经实现了主主复制的功能~到此我们关于mysql数据库的主从复制、半同步复制和主主复制的架构都已经实现,东西较多~整理的不好,还望包涵~其中的错误还望各位大神指出~
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?chrinux-chris linux
?
本文出自 “Chris On the way” 博客,请务必保留此出处http://chrinux.blog.51cto.com/6466723/1204586

一、SpringBootActuator端点简介1.1什么是Actuator端点SpringBootActuator是一个用于监控和管理SpringBoot应用程序的子项目。它提供了一系列内置的端点(Endpoints),这些端点可以用于查看应用程序的状态、运行情况和运行指标。Actuator端点可以以HTTP、JMX或其他形式暴露给外部系统,便于运维人员对应用程序进行监控、诊断和管理。1.2端点的作用和功能Actuator端点主要用于实现以下功能:提供应用程序的健康检查,包括数据库连接、缓存、

曾几何时,当我还是一名初出茅庐的计算机专业应届生的时候,在招聘网站上浏览了很多招聘贴,眼花缭乱的技术岗位让我摸不着头脑:研发工程师、运维工程师、测试工程师...大学期间专业课马马虎虎,更谈不上有什么技术视野,对于具体从事那个技术方向并没有什么明确的想法。直到一位学长对我说:“做运维吧,做运维不用天天写代码,会玩Liunx就行!比做开发轻松多了!”我选择了相信......入行十多年,吃过很多苦,背了很多锅,弄死过服务器,经历过部门裁员,如果有人现在跟我说做运维比开发简单,那我会

随着互联网的快速发展,企业级应用的复杂度日益增加。针对这种情况,微服务架构应运而生。它以模块化、独立部署、可扩展性高等特点,成为当今企业级应用开发的首选。作为一种优秀的微服务架构,SpringCloud在实际应用中展现出了极大的优势。本文将介绍SpringCloud微服务架构的部署与运维。一、部署SpringCloud微服务架构SpringCloud

运维不要学golang,其原因是:1、golang主要被用于开发高性能和并发性能要求较高的应用程序;2、运维工程师通常使用的工具和脚本语言已经能够满足大部分的管理和维护需求;3、学习golang需要一定的编程基础和经验;4、运维工程师的主要目标是确保系统的稳定和高可用性,而不是开发应用程序。

通过采访和约稿的方式,请运维领域老炮输出深刻洞见,共同碰撞,以期形成一些先进的共识,推动行业更好得前进。这一期我们邀请到的是邹轶,途游游戏运维总监,邹总经常戏称自己是世界500万强企业的运维代表,可见内心中是觉得中小公司的运维建设思路和大型企业是有差别的,今天我们带着几个问题,来请邹总分享一下他的中小公司研运一体化之路。这里是接地气、有高度的《运维百家讲坛》第6期,开讲!问题预览途游是游戏公司,您觉得游戏运维有哪些独特性?面临的最大运维挑战是什么?您又是如何解决这些挑战的?游戏运维的人

过节前我和PG中国社区合作搞了一个关于如何使用D-SMART来运维PG数据库的线上直播,正好我的一个金融行业的客户听了我的介绍,打电话过来聊了聊。他们正在做数据库信创的选型,也试用了多个国产数据库,最后他们准备选择TDSQL。当时我觉得有点意外,他们从2020年就开始在做国产数据库选型,不过好像最初使用TDSQL后的感受并不太好。后来经过沟通才了解到,他们刚开始使用TDSQL的分布式数据库,发现对研发要求太高,所以后来就全部选择TDSQL的集中式MYSQL实例,用下来发现挺好用的。整个数据库云

本文是Uber的工程师GergelyOrosz的文章,原文地址在:https://blog.pragmaticengineer.com/operating-a-high-scale-distributed-system/在过去的几年里,我一直在构建和运营一个大型分布式系统:优步的支付系统。在此期间,我学到了很多关于分布式架构概念的知识,并亲眼目睹了高负载和高可用性系统运行的挑战(一个系统远远不是开发完了就完了,线上运行的挑战实际更大)。构建系统本身是一项有趣的工作。规划系统如何处理10x/100

可观测性一词来源于工程领域,近年来在软件开发领域也日益流行。简而言之,可观测性是指根据外部输出以了解系统内部状态的能力。IBM对可观测性的定义为:通常,可观测性是指基于对复杂系统外部输出的了解就能够了解其内部状态或状况的程度。系统越可观测,定位性能问题根本原因的过程就能越快速且准确,而无需进行额外的测试或编码。在云计算中,可观测性还指对分布式应用系统及支撑其运行的基础设施的数据进行聚合、关联和分析的软件工具和实践,以便对应用系统进行更有效地监控、故障排除和调试,从而实现客户体验优化、服务水平协议


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

WebStorm Mac version
Useful JavaScript development tools

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),
