LVS DR/TUN real server VIP配置

在LVS的DR/TUN模式中,需要在real server上配置与LVS Director相同的VIP,这样real server才能接受和处理LVS Director转发过来的数据包。

但是这样一个网络内就有多台主机拥有VIP,当有数据包的目的IP地址是VIP时,该传输给那台主机?显然我们希望是由LVS Director接收。

那么就相当于real server需要对其他主机隐藏自己拥有VIP的事实,这可以通过ARP机制实现:当real server接收到目的IP地址是VIP的ARP广播请求包时,不做出回应。

现在的Linux内核支持通过两个参数配置网卡接口对ARP的请求和响应做出不同的处理:

  1. arp_announce: 在ARP请求数据包中该包含哪个源IP地址定义不同的限制级别。
  2. arp_ignore: 对ARP请求包中目的IP地址定义不同的限制级别。

Read more...

2015-04-25

理解Linux操作系统——file system、I/O subsystem、Network subsystem

学习自《Linux性能分析》

虚拟文件系统


Virtual Files System (VFS)是位于用户进程和各类Linux文件系统实现之间的抽象接口层。

vfs


Read more...

2015-04-22

理解Linux操作系统——Process和Memory

学习自《Linux性能分析》

Linux 进程管理


Process:an instance of execution that runs on a processor.

Linux操作系统通过进程描述符task_struct结构体管理进程。

process task_struct


Read more...

2015-04-20

Storm 基础知识

官方手册:Storm Manual

Storm Cluster 集群


节点:快速失败、无状态

  • master node: Nimbus,负责分发代码到集群中,为机器分配工作,监控异常。
  • worker node: Supervisor,监听Nimbus为其分配工作,运行工作进程。
  • Nimbus和Supervisor之间的交互通过Zookeeper集群协调,它们的状态都保存在Zookeeper或者本地磁盘上。

storm cluster


Read more...

2015-04-19

Keepalived避免无用的failover

通常情况下,当主挂掉时,从会自动切换为主。当主上的服务恢复时,则会再次抢占成为主,这里就发生了一次不必要的failover。

为了解决上述情况,可以在主的配置中vrrp_instance增加nopreempt。

实验


注意:确保实验机器防火墙不会过滤掉vrrp协议的数据包。


Read more...

2015-04-19

APUE学习笔记六——守护进程

守护进程没有控制终端,所以说它们是在后台运行的,其终端名设置为问号。

大多数用户层守护进程都是进程组的组长进程以及会话的首进程,而且是这些进程组和会话中的唯一进程。

用户层守护进程的父进程是init进程。

编程规则


  1. 调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0);
  2. 调用fork,然后使父进程exit。这样做实现了以下几点。第一,如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止会让shell认为这条命令已经执行完毕。第二,虽然子进程继承了父进程的进程组ID,但获得了一个新的进程ID,这就保证了子进程不是一个进程组的组长进程。这是下面将要进行的setsid调用的先决条件。
  3. 调用setsid创建一个新会话。发生:a、成为新会话的首进程b、成为一个新进程组的组长进程c、没有控制终端。
  4. 将当前工作目录更改为根目录或某个合适的位置。
  5. 关闭不需要的文件描述符。
  6. 某些守护进程打开/dev/null使其具有文件描述符0、1和2,这样,任何一个试图读标准输入、写标准输出或标准错误输出的操作都不会产生任何效果。

Read more...

2014-09-04 Linux系统编程

APUE学习笔记五——线程

概念


每个线程都包含有表示执行环境所必需的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。一个进程的所有信息对该进程的所有线程都时共享的,包括可执行程序的代码、程序的全局内存和堆内存、栈以及文件描述符。

线程的标识和创建


  • pthread_equal():比较两个线程ID;
  • pthread_self():获得自身的线程ID;
  • pthread_create():创建线程,新线程继承调用线程的浮点环境和信号屏蔽字,但是该线程的挂起信号集(尚未递送的信号)会被清除。

线程的终止


  1. 线程可以简单地从启动例程中返回,返回值是线程的退出码;
  2. 线程可以被同一进程中的其他线程取消;
  3. 线程调用pthread_exit。

pthread_jon将阻塞等待指定线程终止。

线程可以通过调用pthread_cancel函数请求取消同一进程中的其他线程。

在默认情况下,线程的终止状态会保存直到对该线程调用pthread_join。如果线程已经被分离,线程的底层存储资源可以在线程终止时立即被收回。调用pthread_detach分离线程。


Read more...

2014-08-30 Linux系统编程