页: 前页 1 2 3 ...61 62 63 64 65 66 67 68 69 后页

几种数据存储及其缓存的结构/架构(一)

2009年2月11日

         很久没有写东西了,一直想好好总结总结。想了想还是先从数据中心来说起,同时呢,同大家共同了解一下数据缓存和分布部署的东东。写的不好,各位看官尽管拍砖,手下留情 :)

 

         05年的时候做过这样一个项目,纯粹的高可用+略微有点高效率的mysql部署架构,目前这种结构在sina内部基本上已经遍地开花了,到处都在用了,因为需要需要借用这样的结构,所以,先做一下简单的说明。

一、      单数据中心的mysql高可用架构

  关键字:mysql     replication      master                    slave         master-backup       mon         perl

         DNS

         这是2006年初完成的项目,经过后来同事的大力改进,目前已经遍布在sina主要的数据中心。

(一)   架构图

 

(二)            系统结构说明

如上图所示,该系统由:

1)    DNS服务器群组、

2)    MON监控服务器群组

3)    MYSQL服务器集群

组成。web群组通过交换机访问DMM结构中的任何服务器。

(三)            系统服务流程描述、负载均衡与故障监控原理

1)      MYSQL服务器集群是基于MYSQL本身MASTER/SLAVE的结构实现的扩展,在MYSQLREPLICATION机制实现读写分离的基础上,MONMASTER SERVER进行监控,保障故障的及时发现,并触发MASTER SERVER的切换功能,实现故障的自动处理,保障MASTER SERVER的持续运行,集群中MASTER SERVER有两台,实现ACTIVE/STANDBY的结构。

2)      MYSQL SLAVE SERVER提供数据的只读服务,WEB服务器的几乎所有应用数据是从SLAVE SERVER群组中取得的。

3)      MON的监控群组ACTIVE/STANDBY的结构,是通过MON的远程监控功能实现的,实现MON监控服务的故障自动切换,保障MON的持续稳定运行。

4)      MON监控到MASTER SERVER的服务出现故障的时候,MON通过触发监控程序,在DNS SERVER的记录中进行更新,更新该记录所指向的IPSTANDBY SERVERIP地址,并修改MYSQL集群中所有SLAVE SERVER的配置,更改其配置中MASTER SERVERIP地址。从而,WEB服务器再次进行数据库写操作的时候,连接将建立到原STANDBY 状态的服务器上。

5)      MONSLAVE SERVER群组中的所有的服务器进行监控,当监控发现其中某台服务器不能正常提供服务时,MON通过触发相应的程序,在DNS的记录中将该服务器的IP去掉。则WEB服务器访问数据库前查询DNS的时候,DNS返回的IP地址组中,将不再包含该IP

6)      当数据库中有数据需要update或是有新数据insert到数据库等写操作的时候,WEB SERVER通过DNS查询到MYSQL MASTERIP地址,然后通过该IP同数据库MASTER SERVER进行通信,进行相应的数据库操作。

7)      WEB服务器需要连接数据库取得数据的时候,首先通过数据库读库的域名由DNS随机分配一个SLAVE SERVERIP地址,然后WEB服务器通过该IP地址连接数据库,并取得所需数据。

(四)            效果:

目前线上服务器运行的效果是100%,但是应该能够承诺到全年服务时间在4999.99%

 

(五)            缺点:

chunsheng web服务, 互联网, 开源, 服务器, 系统 , , ,

关于sizeof()的简单解析

2009年2月9日

在所有说明之前,先给出一道题目:

int a=256;
printf("%d\n", sizeof(++a));
printf("%d\n", a);

那么到底打印的是多少呢?

应该是4和256,第一个答案大家应该已经没有问题了,但是为什么在++a以后,a的数值还是没有发生变化呢?因为sizeof()是一个运算符,在其中的所有的运算都是无效的,所以++a根本就没有运行。

上面的一个例子提醒我们,虽然sizeof看这简单,但是其中还是有很多的问题值得讨论的:

一、sizeof的概念
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。

二、sizeof的使用方法 
1、用于数据类型 

sizeof使用形式:sizeof(type)

数据类型必须用括号括住。如sizeof(int)。

2、用于变量 

sizeof使用形式:sizeof(var_name)或sizeof var_name

变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。

注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。

如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。

三、sizeof的结果 
sizeof操作符的结果类型是size_t,它在头文件 <stddef.h>

中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

1、若操作数具有类型char、unsigned char或signed char,其结果等于1。

ANSI C正式规定字符类型为1字节。

2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、 float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、 2、 4、4、4、8、10。

3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。

4、当操作数具有数组类型时,其结果是数组的总字节数。

5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。

让我们看如下结构:

struct {char b; double x;} a;

在某些机器上sizeof(a)=12,而一般sizeof(char)+ sizeof(double)=9。

这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。

6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

四、sizeof与其他操作符的关系 
sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。

五、sizeof的主要用途 
1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

void *malloc(size_t size),

size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:

void * memset(void * s,int c,sizeof(s))。

六、建议 
由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。

fulin 开发平台, 杂项

页: 前页 1 2 3 ...61 62 63 64 65 66 67 68 69 后页
页: 前页 1 2 3 ...61 62 63 64 65 66 67 68 69 后页