分布式的构建

  做为网站访问的生命线(数据访问),当然也可以采用分布式的方法来减轻单台服务器的访问压力。之前有讲过Memcached的分布式,但是Memcached服务器互不通信,所以我们也提过redis的主从分布。这篇文章主要的就是关注分布式服务器的一些基本思想。

  数据库的主从分布:这里我以Mysql为例,当Mysql需要向外扩展的时候的策略则划分为三个部分:复制、拆分以及数据分片 ,而主从分布最主要关注的问题就是主库和从库间的同步。原理如下图:

  

  大致描述一下过程:从服务器的IO线程从主服务器获取二进制日志,并在本地保存为中继日志,然后通过SQL线程来在从上执行中继日志中的内容,从而使从库和主库保持一致。主从同步的详细过程如下:

  1. 主服务器验证连接。

  2. 主服务器为从服务器开启一个线程。

  3. 从服务器将主服务器日志的偏移位告诉主服务器。

  4. 主服务器检查该值是否小于当前二进制日志偏移位。

  5.  如果小于,则通知从服务器来取数据。

  6.  从服务器持续从主服务器取数据,直至取完,这时,从服务器线程进入睡眠,主服务器线程同时进入睡眠。

  7. 当主服务器有更新时,主服务器线程被激活,并将二进制日志推送给从服务器,并通知从服务器线程进入工作状态。

  8. 从服务器SQL线程执行二进制日志,随后进入睡眠状态。

  当然,一主库多备库在少量写和大量读时,可以把读分摊到多个备库上。其实这种配置也有很大的用途:

  1.为不同的角色使用不同的备库。

  2.把一台备库当作待用的主库,除了复制没有其他数据传输。

  3.将一台备库放到远程数据中心,用作灾难恢复。

  4.延迟一个或多个备库,以备灾难恢复。

  5.使用其中一个备库,作为备份、培训、开发或测试使用服务器。

  6.创建日志服务器

  除此之外,Mysql还支持其他的复制拓扑结构,比如说主动-主动模式下的主-主复制;主动-被动模式下的主-主复制(类似于创建一个热备份,但还可以执行读操作,备份,“离线”维护以及升级等);环形复制;主库、分发主库以及备库(在分发主库上表改为blackhole存储引擎)

  对于Mysql的扩展问题还可以使用负载均衡等其他手段去解决,这些内容还得再学习一下,以后也会出博客用自己的语言来描述一下。

  Redis的主从分布:本身也是通过一致性Hash进行分片,优点:Master可以有多个Slave。不会阻塞Master、当一个或多个Slave与Master进行初次同步数据时,Master可以继续处理客户端的请求。相反,Slave在初次同步数据时会阻塞从而不能处理客户端的请求。在Master服务器上禁止数据持久化。

主从同步一般分两个阶段:第一阶段:Slave服务器主动连接到Master服务器。Slave服务器发送SYNC命令到Master服务器请求同步。Master服务器备份数据库到rdb文件。Master把rdb文件传输给Slave服务器。Slave服务器清空数据库数据,把rdb文件数据导入数据库中。 接下来Master把用 户所有操作,通过命令的形式转发给Slave服务器。

  MongoDB分片技术:

    看了MongoDB的自动分片:http://blog.fens.me/mongodb-shard/ 之后觉得MongoDB的分片集群也有很多值得学习的地方。

    当满足如下三个条件其中一个,也可以考虑采用分片:

    (一) 数据集大小接近单个节点的存储容量。

    (二) 活跃数据量接近节点最大内存容量。

    (三) 节点的写请求速度无法满足要求。(读请求速度无法满足要求的时候可以通过读写分离的方式或者replicSet模式)

    分片的组件如下:

    

     mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。

     config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。

     shard,这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做。

  小结:对于MongoDB的学习我还是比较少的。毕竟像Mysql研究的书籍和资料很多。本人英文水平也有待加强,尽量去看看官方的文档。学习更多精华。之后会更新有关MongoDB的博客。

 

  

构建高可用web站点学习(三)的更多相关文章

  1. 构建高可用web站点学习--前言

    前言:本人对于提高web站点的访问量等的有很浓厚的兴趣,也学习了将近一年的时间,希望能总结点东西,虽然很多东西都是从书籍和资料中学习的,而不是原创,但是这是我总结的一点感悟和进行的分类吧.而且可能思路 ...

  2. 构建高可用web站点学习(二)

    web站点的缓存学习 缓存在web应用里面十分常见,也有各种各样的缓存,从请求开始一直到代码处理的阶段都可以采取缓存.下面就逐一介绍: 一.客户端缓存(浏览器和http方面) 前端页面缓存主要遵循ht ...

  3. 构建高可用web站点学习(一)

    单个服务器如何处理请求 web服务器最简单的形式就是一个程序,它侦听HTTP请求,在收到一个HTTP请求之后做出回复.当然在接收请求后服务器所做的东西是我们关注的焦点.在下文中也会提及到node是如何 ...

  4. 构建高可用web站点(五)

    数据库是web站点中重要的应用,放在第四篇是因为之前来不及总结的原因,在之前的文章我看到了无论是Mysql或者是nosql的一些缓存和分布式一些比较扩展性的功能.但是对于单个数据库来说,它的优化也是我 ...

  5. 构建高可用web站点(四)

    首先我们来了解负载均衡的概念:英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡.分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服 ...

  6. 构建高性能WEB站点笔记三

    构建高性能WEB站点笔记三 第10章 分布式缓存 10.1数据库的前端缓存区 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经 ...

  7. 基于docker+etcd+confd + haproxy构建高可用、自发现的web服务

    基于docker+etcd+confd + haproxy构建高可用.自发现的web服务 2016-05-16 15:12 595人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主 ...

  8. Dubbo入门到精通学习笔记(十六):Keepalived+Nginx实现高可用Web负载均衡

    文章目录 Keepalived+Nginx实现高可用Web负载均衡 Keepalived+Nginx实现高可用Web负载均衡 高可用架构篇 Keepalived + Nginx 实现高可用 Web 负 ...

  9. 高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群

    高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群 libnet软件包<-依赖-heartbeat(包含ldirectord插件(需要perl-MailTools的rpm包)) l ...

随机推荐

  1. 在javaweb中通过servlet类和普通类读取资源文件

    javaweb有两种方式读取资源文件 在Servlet中读取,可以使用servletContext,servletContext可以拿到web所有的资源文件,然后随便读,但是这种方法不常用,尽量少在S ...

  2. Java 中的泛型详解-Java编程思想

    Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的 ...

  3. C++中的类和对象(一)

    一,类的概念及封装 1.什么是封装 第一层含义:封装是面向对象程序设计最基本的特性.把数据(属性)和函数(方法)合成一个整体,这在计算机世界中是用类和对象实现的.(把属性和方法进行封装) 第二层含义: ...

  4. Redis 实现用户积分排行榜

    排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如“用户积分榜”.如果没有实效性一直按照总榜来排,可能榜首总是几个老用户,对 ...

  5. Solaris下怎样改动文件创建时间及查询

    Solaris下怎样改动文件创建时间及查询 实验演示: 1.核对时间 [root@S1011:/]# date Tue Jul 15 21:37:01 CDT 2014 --若时间不对请先按例如以下格 ...

  6. C\C++代码优化的27个建议

    1. 记住阿姆达尔定律: funccost是函数func运行时间百分比,funcspeedup是你优化函数的运行的系数. 所以,如果你优化了函数TriangleIntersect执行40%的运行时间, ...

  7. Protobuf的自动反射消息类型的方法

    1. 每个消息头部中带上type name,作为消息的类型标识 2. 通过type name可以找到描述符Descriptor*, FindMessageTypeByName 3. 通过描述符Desc ...

  8. Python简易爬虫

    经常需要下载论文,每次都需要去网页上搜索,然后点击下载,实在麻烦,正好最近刚入门Python,心血来潮,想着写一个爬虫 经过一天查阅资料,基本算是完成了,但是还是不足,比如对知网和万方暂时还不行,但是 ...

  9. Python进阶:函数式编程实例(附代码)

    Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...

  10. C#解leetcode 53.Maximum Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...