分布式的构建

  做为网站访问的生命线(数据访问),当然也可以采用分布式的方法来减轻单台服务器的访问压力。之前有讲过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. Android应用开发学习之画廊视图

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 画廊视图Gallery能按水平方向显示一组图片,并可以拖动图片.下面我们来看一个使用画廊视图的例子,其运行效果如下: ...

  2. 常用颜色大全---RGB值及中英文名称

    ■■■■■ #DC143C Crimson 深红/猩红 ■■■■■ #FFF0F5 LavenderBlush 淡紫红 ■■■■■ #DB7093 PaleVioletRed 弱紫罗兰红 ■■■■■ ...

  3. 在cmd窗口下运行Java程序时无法找到主类的解决办法

    我是Java的初学者,昨天在cmd窗口下运行一段Java程序时总是有问题,可以编译但无法执行. 也就是javac时正确,一旦java时就不对了,提示找不到或无法加载主类,经百度谷歌再加上自己的摸索终于 ...

  4. Linux基础系列—Linux内核源码目录结构

    /** ****************************************************************************** * @author    暴走的小 ...

  5. Android客户端与服务端交互之登陆示例

    Android客户端与服务端交互之登陆示例 今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的 1.后台 ...

  6. 【开源java游戏框架libgdx专题】-01-libgdx介绍

    libgdx是一款开源的java游戏框架,而且还实现了Desktop/Android/BlackBerry/iOS/HTML5这些些平台的跨平台开发.官方网址:https://libgdx.badlo ...

  7. windows安装服务

    我安装了windows服务的时候监控其他机子的时候,我在调试的时候用的是Account是其他用户是可以正常的,但是安装成服务的时候,老是被拒绝. 后来我将Account改成NetworkService ...

  8. 移动页面缩放方法之(三)rem布局

    <!DOCTYPE HTML> <html lang="zh-cn"> <head> <meta http-equiv="Con ...

  9. AIDL跨进程通信

    Android跨进程通信会用到AIDL,当然跨进程通信不一定要用AIDL,像广播也是可以的,当然这里用到AIDL相对比较安全一些: AIDL允许传递基本数据类型(Java 的原生类型如int/long ...

  10. LINQ:使用Take和Skip实现分页

    随便找的,还没有试过代码. class Program { static int Main() { //每页大小 ; //页码 ; //源数据 string[] names = { "贤静& ...