构建高可用web站点学习(三)
分布式的构建
做为网站访问的生命线(数据访问),当然也可以采用分布式的方法来减轻单台服务器的访问压力。之前有讲过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站点学习(三)的更多相关文章
- 构建高可用web站点学习--前言
前言:本人对于提高web站点的访问量等的有很浓厚的兴趣,也学习了将近一年的时间,希望能总结点东西,虽然很多东西都是从书籍和资料中学习的,而不是原创,但是这是我总结的一点感悟和进行的分类吧.而且可能思路 ...
- 构建高可用web站点学习(二)
web站点的缓存学习 缓存在web应用里面十分常见,也有各种各样的缓存,从请求开始一直到代码处理的阶段都可以采取缓存.下面就逐一介绍: 一.客户端缓存(浏览器和http方面) 前端页面缓存主要遵循ht ...
- 构建高可用web站点学习(一)
单个服务器如何处理请求 web服务器最简单的形式就是一个程序,它侦听HTTP请求,在收到一个HTTP请求之后做出回复.当然在接收请求后服务器所做的东西是我们关注的焦点.在下文中也会提及到node是如何 ...
- 构建高可用web站点(五)
数据库是web站点中重要的应用,放在第四篇是因为之前来不及总结的原因,在之前的文章我看到了无论是Mysql或者是nosql的一些缓存和分布式一些比较扩展性的功能.但是对于单个数据库来说,它的优化也是我 ...
- 构建高可用web站点(四)
首先我们来了解负载均衡的概念:英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡.分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服 ...
- 构建高性能WEB站点笔记三
构建高性能WEB站点笔记三 第10章 分布式缓存 10.1数据库的前端缓存区 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经 ...
- 基于docker+etcd+confd + haproxy构建高可用、自发现的web服务
基于docker+etcd+confd + haproxy构建高可用.自发现的web服务 2016-05-16 15:12 595人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主 ...
- Dubbo入门到精通学习笔记(十六):Keepalived+Nginx实现高可用Web负载均衡
文章目录 Keepalived+Nginx实现高可用Web负载均衡 Keepalived+Nginx实现高可用Web负载均衡 高可用架构篇 Keepalived + Nginx 实现高可用 Web 负 ...
- 高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群
高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群 libnet软件包<-依赖-heartbeat(包含ldirectord插件(需要perl-MailTools的rpm包)) l ...
随机推荐
- Period II - FZU 1901(KMP->next)
题目大意:给你一个字符串 S ,N = |S|,如果存在一个 P (1<=P<=N),并且满足 s[i] = s[P+i] (i = {0...N-P-1} ),求出来所有的 P 然后输出 ...
- OC类方法和实例方法 及常用的for/in方法
类方法前面有+,实例方法前面有- 类方法和实例方法的区别在于,类方法不能使用实例变量. 使用类方法主要原因有: 1.类方法的使用不依赖于实例化一个对象,也就是说如果一个功能的实现不需要实例化对象,就可 ...
- Solr与Tomcat的整合
solr与tomcat整合有两种方法: 方法一:其整合步骤如下: 1.将solr中的example中的solr拷贝到要作为服务器的位置(我当前创建的目录为D:\Develop\solr\home) 2 ...
- 每个项目单独配置 git 用户
git多账号登陆问题 设置git全局设置: git config --global user.name "your_name" git config --global user. ...
- 分享一个linux和linux的文件传输【scp无密码传输】
很多时候,本地测试服务器想把文件传到线上服务器的时候,很多人都是通过登陆线上服务器ssh 传输,这样挺危险的,很多弊端....所以我找了下方法,发现scp挺好用的! 模拟环境: 192.168.147 ...
- Android基础笔记(十四)- 内容提供者读取联系人
利用内容提供者读取联系人 利用内容提供者插入联系人 内容观察者的原理 利用内容观察者监听系统应用数据库或者自己应用数据库的变化 利用内容提供者读取联系人 读取联系人相对于读取短信来说就复杂非常多了,我 ...
- 1小时学Python脚本
如果我们有这么一项任务:简单測试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200. 思路:用shell编程.(Linux一般是bash而 ...
- Java 理论与实践: 用弱引用堵住内存泄漏---转载
要让垃圾收集(GC)回收程序不再使用的对象,对象的逻辑 生命周期(应用程序使用它的时间)和对该对象拥有的引用的实际 生命周期必须是相同的.在大多数时候,好的软件工程技术保证这是自动实现的,不用我们对对 ...
- Change value of string array at debug eclipse--转
Question: I have an application, but to test something, I need to change value of a String[]. But wh ...
- 为什么app都是异步编程
对本文题目首先需要了解一下什么是异步编程,异步编程即多线程编程. 多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径. 在具体理解多线程之前先看一个都理解的例子: 在系统级别内,程序并排 ...