- 浏览: 1336055 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
MySQL Replication的实现原理
要想用好一个系统,理解其实现原理是非常重要的事情,只有理解了其实现原理,我们才能够扬长避短,合理的利用,才能够搭建出最适合我们自己应用环境的系统,才能够在系统实施之后更好的维护他。MySQL Replication 可以说是在目前 MySQL 数据库的实际应用场景中最为常见的Scale Out 手段了,这里就针对其实现原理做一个简单的分析。
一、 Replication 线程
Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在 Master 端。
要实现 MySQL 的 Replication ,首先必须打开 Master 端的Binary Log(mysql-bin.xxxxxx)功能,否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。
MySQL 复制的基本过程如下:
1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;
3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”
4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。
实际上,在老版本中,MySQL 的复制实现在 Slave 端并不是由 SQL 线程和 IO 线程这两个线程共同协作而完成的,而是由单独的一个线程来完成所有的工作。但是 MySQL 的工程师们很快发现,这样做存在很大的风险和性能问题,主要如下:
首先,如果通过一个单一的线程来独立实现这个工作的话,就使复制 Master 端的,Binary Log日志,以及解析这些日志,然后再在自身执行的这个过程成为一个串行的过程,性能自然会受到较大的限制,这种架构下的 Replication 的延迟自然就比较长了。
其次,Slave 端的这个复制线程从 Master 端获取 Binary Log 过来之后,需要接着解析这些内容,还原成 Master 端所执行的原始 Query,然后在自身执行。在这个过程中,Master端很可能又已经产生了大量的变化并生成了大量的 Binary Log 信息。如果在这个阶段 Master 端的存储系统出现了无法修复的故障,那么在这个阶段所产生的所有变更都将永远的丢失,无法再找回来。这种潜在风险在Slave 端压力比较大的时候尤其突出,因为如果 Slave 压力比较大,解析日志以及应用这些日志所花费的时间自然就会更长一些,可能丢失的数据也就会更多。
所以,在后期的改造中,新版本的 MySQL 为了尽量减小这个风险,并提高复制的性能,将 Slave 端的复制改为两个线程来完成,也就是前面所提到的 SQL 线程和 IO 线程。最早提出这个改进方案的是Yahoo!的一位工程师“Jeremy Zawodny”。通过这样的改造,这样既在很大程度上解决了性能问题,缩短了异步的延时时间,同时也减少了潜在的数据丢失量。
当然,即使是换成了现在这样两个线程来协作处理之后,同样也还是存在 Slave 数据延时以及数据丢失的可能性的,毕竟这个复制是异步的。只要数据的更改不是在一个事务中,这些问题都是存在的。
如果要完全避免这些问题,就只能用 MySQL 的 Cluster 来解决了。不过 MySQL的 Cluster 知道笔者写这部分内容的时候,仍然还是一个内存数据库的解决方案,也就是需要将所有数据包括索引全部都 Load 到内存中,这样就对内存的要求就非常大的大,对于一般的大众化应用来说可实施性并不是太大。当然,在之前与 MySQL 的 CTO David 交流的时候得知,MySQL 现在正在不断改进其 Cluster 的实现,其中非常大的一个改动就是允许数据不用全部 Load 到内存中,而仅仅只是索引全部 Load 到内存中,我想信在完成该项改造之后的 MySQL Cluster 将会更加受人欢迎,可实施性也会更大。
MySQL Replication的集群系统搭建
最近发现公司的服务器很不安全,第一由于是数据中转,很讲究时效性,也就是上午的备份对下午来说一点意义都没有.第二只有 1台服务器,我始终认为一台服务器是绝对不够安全的,比如每台服务器出现故障的概率是千分之一,那么2台同时出现故障的概率大约只有百万分之一!于是,在 我的强烈要求下从公司又分得一台服务器,intel至强4核4g内存,500g硬盘,看起来应该还不错,呵呵
之所以选择mysql replication不选择mysql cluster第一服务器数量有限,第二,要解决的问题仅仅是备份问题.
Replication 是一个异步复制过程,共有3个线程,其中2个(1个sql和1个io)在slave端,拧一个io线程想master端,实现replication必须 先打开master端的binary log即二进制日志.复制过程实际就是slave从master获取二进制日志,然后按照日志中的顺序一次执行.
接下来开始搭建我的replication复制系统很简单的master-slave系统,大致有4步,1),安装系统,主服务器上主准备工.2)主服务器备份数据,3)从服务器安装备份数据,4)从服务器配置.
首先将两台服务器都升级到最新的5.1.40,选择最新版,还是基于安全考虑的,编译如下,很简单的配置:
./configure --prefix=/home/mysql \
--without-debug \
--enable-thread-safe-client \
--enable-assembler \
--enable-profiling \
--with-mysqld-ldflags=-all-static \
--with-client-ldflags=-all-static \
--with-charset=latin1 \
--with-extra-charsets=utf8,gbk \
--with-plugins=partition,csv,federated,heap,innobase,myisammrg,myisam,ndbcluster \
--with-mysqld-user=mysql \
--without-embedded-server \
--with-server-suffix=-xiao7ng \
--with-unix-socket-path=/home/mysql/sock/mysql.sock
服务器果然不错,不到1个小时就编译安装完成,速度有点惊人,呵呵.
创建一个用于复制到账户,该账户应该拥有复制权限grant replication slave on *.* to 'username'@'host' identified by 'password'.
在主服务器上备份数据有很多,具体百度,这里讲两个简单的,第一冷备份,关掉mysql服务,人后拷贝数据文件,第二热备份.
第一种先要看下主服务器的当前日志名和偏移量,然后没啥说的命令如下:
mysql>flush tables with read lock;
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000018 | 221 | test | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
$tar cvf data.tar ./data
mysql>unlock tables;
第二种用mysqldump,innodb的麻烦些要用到ibback工具
mysql>flush tables with read lock;
$mysqldump –uroot –p –master-data dbname>/path/to/bak.sql
去的bak.sql后然后执行
$grep “CHANGE MASTER” bak.sql
CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000018’,MASTER_LOG_POS=221;
再把备份的数据集拷贝到从服务器上,然后对于第一种非常简单,直接把数据放到数据目录下,即可
第二种使用mysql工具即可
$mysql –uroot –p -Ddbname
不过启动的时候应如下启动bin/mysqld_safe --user=mysql –skip-slave-start &或者启动后在执行
mysql>stop slave;
否则报错.
这些完成后就是设置从服务器,主服务器的ip,用户名,密码,端口号也可以在my.cnf里设置
命令大概是:
mysql>CHANGE MASTER TO
->MASTER_HOST='10.1.1.251',
->MASTER_PORT=3306;
->MASTER_USER='slave',
->MASTER_PASSWORD='slave',
->MASTER_LOG_FILE='mysql-bin.000018',
->MASTER_LOG_POS=106;
执行之后,用start slave启动复制进程
可以用show slave status查看当前状态
如果发现错误,应该打开错误日志去查看错误信息,不在赘述,值得注意的是MASTER_LOG_FILE和MASTER_LOG_POS容易出错,这也是大部分,replication搭建错误的原因.
至于replication的原理呀,复制级别,复杂架构,运维等其实mysql手册都有,建议使用最新英文版的,权威,更新快.这里只是一个简单的例子
发表评论
-
mysql主从热备配置(含innodb)终极版
2012-12-25 13:10 2659转自 http://blogread.cn/it/articl ... -
sqlite3中的数据类型
2012-12-10 21:37 1349(转)http://www.cnblogs.com/kfqco ... -
Mac下MySql卸载方法
2012-09-10 23:57 1064Mac下MySql卸载方法 mac下mysql的D ... -
mac os x mysql数据库utf8配置
2012-09-10 23:29 2291进入mysql console: 输入 mysql& ... -
ON DUPLICATE KEY UPDATE
2012-08-07 01:47 1100(转自)http://blog.csdn.net/kesaih ... -
MySQL单列索引和组合索引的区别介绍
2012-08-07 01:31 1112(转自)http://blog.cs ... -
centos下MySQL主从同步配置
2012-08-03 13:14 1565(转自)http://apps.hi.baidu.com ... -
sql语句中left join、inner join中的on与where的区别
2012-06-13 13:24 1267table a(id, type): id t ... -
分组取前N记录
2012-05-31 16:24 1133(转)http://blog.csdn.net/ac ... -
如何一条sql语句取出分组数据中值最大的
2012-05-30 23:59 2375--按某一字段分组取最大(小)值所在行的数据(2007-10- ... -
存储过程与函数的区别
2011-09-28 19:35 1166... -
RMAN备份方案
2011-07-21 10:29 2067RMAN备份方案 RMAN也可以进行联机备份,而且备份与恢 ... -
oracle
2011-04-06 17:46 1055学习笔记 -
PLSQL Developer + Oracle客户端简易安装方法
2011-03-17 00:10 14394Oracle 10g绿色客户端 pl ... -
SELECT INTO FROM与INSERT INTO SELECT
2011-01-26 15:52 34151.INSERT INTO SELECT语句 ... -
浅谈unique列上插入重复值的MySQL解决方案
2011-01-25 11:33 1784本文的unique列上插入重复值解决方案,主要基于MySQL平 ... -
:Oracle 中对Merge语句的增强 和去重复新增
2011-01-25 11:11 2332在Oracle 10g之前,merge语句支持匹配更新和不匹配 ... -
单行函数(仅对单个表达式或一行进行处理)
2011-01-23 18:49 1278例如:select sum(qty) from sales ... -
oracle中的事务控制命令
2011-01-23 18:45 2128事务提交有显示提交:使用commit命令来提交所有未提交的更新 ... -
oracle全文检索
2011-01-23 18:18 61641.全文检索和普通检索的区别 不使用Oracle text功 ...
相关推荐
以上就是对MGR集群搭建手册的主要知识点的总结。总的来说,MGR是一个非常强大和灵活的MySQL集群解决方案,但同时也有一些限制和要求。在搭建MGR集群之前,需要仔细阅读和理解这些知识点,以确保集群的正常运行。
1. MySQL Replication 技术:MySQL Replication 技术是实现高可用集群系统的核心技术之一。通过 MySQL Replication,可以将两台 MySQL Server 互相将对方作为自己的 Master,自己又同时作为对方的 Slave,这样就实现...
本文将详细介绍如何使用Mysql、Haproxy、Mycat、PXC、Zookeeper实现高可用集群,涵盖了整个架构图、应用程序的访问流程、数据的读写分离、负载均衡、数据库节点的搭建、Zookeeper的应用等多个方面。 整体架构图 在...
MySQL 8 MGR 集群的原理是基于分布式数据库系统的思想,将多个 MySQL 实例组成一个集群,每个实例都可以独立地提供数据库服务。当某个实例出现故障时,其他实例可以继续提供服务,从而实现高可用性。 二、安装和...
虚拟化平台下MySQL数据库集群的搭建 本文将介绍虚拟化平台下MySQL数据库集群的搭建过程,探讨 Galera Cluster for MySQL 的解决方案,以提高数据的安全性和高可用性。虚拟化技术的应用可以提高计算机的工作效率,...
在搭建MySQL主从集群前,首先需要准备好部署环境。这包括: - **防火墙设置**:确保防火墙规则允许MySQL的通信端口(默认为3306)开放,以便主从服务器间的数据传输。 - **用户和用户组设置**:创建一个专门用于...
MySQL 数据库与 SQL 优化 + 集群 + 负载均衡 MySQL 数据库与 SQL 优化是提高数据库性能的...合理的数据库结构设计、索引设置、查询语句优化、存储引擎选择、集群搭建和负载均衡可以提高数据库性能、可用性和安全性。
MySQL Group Replication是一种高可用性和高可扩展性的解决方案,它允许在MySQL集群中实现多主复制,即每个节点都可以读写,并且数据更改会在所有成员之间自动同步。本手册将指导您如何在单机上搭建MySQL 5.7.17的...
MySQL的分布式集群通常指的是MySQL InnoDB Cluster,这是一种基于Group Replication的高可用性和可扩展性解决方案。InnoDB Cluster结合了Group Replication和原生InnoDB存储引擎的优势,提供了一种强一致性的多主...
### MySQL高可用集群MGR组复制集群介绍及搭建说明 #### 一、资源概述 本文档旨在为用户提供一份详尽的MySQL高可用集群MGR(组复制)集群介绍及搭建指南。MySQL组复制(MySQL Group Replication, MGR)是一项基于...
本资源主要介绍了MYSQL企业整合解决方案中的mysql集群搭建-主从配置的实现过程,涵盖了主从复制的原理、配置信息、搭建步骤等方面的知识点。 一、主从复制原理 MYSQL中的主从复制是指将一台主服务器的数据实时同步...
本篇文章将详细讲解如何在离线环境下,利用Mycat和MySQL搭建一个读写分离的集群。Mycat是一款开源的分布式数据库中间件,它能够实现数据库的水平扩展,而MySQL则是广泛使用的开源关系型数据库。 首先,我们来了解...
搭建Mysql-mmm+mysql 5.6双主高可用集群的案例环境需要准备Centos7.4系统,mysql-5.6.36.tar.gz等软件包,以及4台主机分别作为master1、master2、slave1、slave2和1台监控节点。搭建步骤包括部署ntp服务和域名解析、...
- 实现对MySQL Replication的管理和监控。 - 定期检查Master的状态,一旦Master出现故障,则触发自动故障转移过程。 - 选择一个新的Master节点,确保服务的连续性。 #### 二、MHA工作原理 MHA的工作原理主要...
主从复制的基本原理是:在一个MySQL集群中,有一个主服务器负责接收所有写操作,而其他从服务器通过复制主服务器的二进制日志(binlog)来同步数据,实现数据的一致性。这样,从服务器可以用于只读查询,减轻主...
### OneSQL 集群搭建与 MySQL 主从复制详解 #### 一、OneSQL 集群搭建 ##### 1. 下载与安装 - **下载**:首先,需要访问OneSoft公司的官方网站(http://www.onexsoft.com/?page_id=3391#toggle-id-3)获取最新...
MySQL集群通常基于主从复制(Master-Slave Replication)或主主复制(Master-Master Replication)的技术实现。主从复制是其中最常见的一种方式,它通过将主数据库上的事务操作记录(即二进制日志)发送到一个或多个...
文档内容显示了MHA服务角色、提供的工具、工作原理,以及实现MHA集群搭建的详细步骤,包括准备Replication环境、安装配置MHA、启动和测试MHA故障转移、修复复制集群以及新节点上线等操作。 在深入知识点之前,我们...
### MySQL 5.8 Group Replication + F5 实现高并发集群搭建 #### 环境配置与需求 本文档将详细介绍如何通过 MySQL 5.8 的 Group Replication(MGR)结合 F5 负载均衡器来构建一个高可用、高并发的数据库集群。该...