2013年11月

OS X下能访问网页但ping不通域名

昨晚碰到一个奇葩的问题,所有网页的浏览都正常,QQ也正常,明明可以打开网站,但是ping那个网站就是显示不通,无法解析。一看就知道本地的DNS查找有问题,修改了reslov.conf加了8.8.8.8还是没用,这我就纳闷了。还有奇怪的,QQ音乐和AppStore也打不开,都是无法连接网络。但是我用nslookup都是可以的,直接pingIP也是没问题。这真是诡异了,今天无意中发现了mDNSResponder
这个东西,这个东西估计是MAC OS X自定义的一个DNS解析,linux下是没这个的,直接就是根据hosts和resolv.conf来解析的。我ps aux了下没发现有这个程序在跑,我就找到/System/Library/LaunchDaemons/com.apple.mDNSResponder.plist,发现里面是启动/usr/sbin/mDNSResponder的设置,我手动运行了还是不对。然后查看了下系统日志,/var/log/system.log

- 阅读剩余部分 -

Hadoop HDFS和MapReduce测试

Hadoop的MapReduce应该是属于核心的编程框架,到目前为止我还不是特别懂,只能按照网上的步骤一点实践,就和学一门新语言第一个程序是HelloWorld一样。前文已经介绍了Hadoop的安装,这里就HDFS和MapReduce的测试。

HDFS测试


在HDFS中新建一个文件夹,并把本地文件copy到HDFS新建的文件夹
cd hadoop路径
bin/hadoop dfs -mkdir /tmp/firefoxbug
bin/hadoop dfs -put /opt/run.log /tmp/firefoxbug
bin/hadoop dfs -ls /tmp/firefoxbug

- 阅读剩余部分 -

Elasticsearch集群搭建

之前对于CDN的日志处理模型是从
logstash agent==>>redis==>>logstash index==>>elasticsearch==>>kibana3,对于elasticsearch集群搭建,可以把索引进行分片存储,一个索引可以分成若干个片,分别存储到集群里面,而对于集群里面的负载均衡,副本分配,索引动态均衡(根据节点的增加或者减少)都是elasticsearch自己内部完成的,一有情况就会重新进行分配。
下面先是介绍几个关于elasticsearch的几个名词

- 阅读剩余部分 -

Hadoop安装

听了这么久的Hadoop,终于要开始玩了,好幸福的说。不水了,Hadoop到底能怎么用我还没研究,只是安装了下。这里大概介绍下Hadoop,它是一组项目,在下面有好多个开源的牛逼组件。HDFS是下面的一个分布式存储项目,主要是文件存储,它设计就是来存储大文件,整个HDFS就是一套文件系统,但是它的Block特别大,默认是64M,HDFS会有自己的Backup。HDFS主要分成两部分,一部分是管理中心,叫做NameData,这类似linux文件系统的super blocks,用来管理所有的DataNode,DataNode就是真正用来存储实际的数据内容的。而NameData会管理好文件的索引,存储,还有backup。

- 阅读剩余部分 -

logstash+elasticsearch+kibana3+redis分布式搭建

之前的logstash都是单机模式,把几个组件都安装在一台机器上,这一次把每个组件都安装到独立的server上,下面是架构图。

logstash
日志通过syslog-ng传输到logstash的agent端,agent主要就是负责接收日志,然后把日志放到redis,redis在这里的作用就是一个队列,主要是日志的缓存,redis是以内存做缓存的,一段时间存到磁盘上。在redis另一端是logstash index,这端主要是从redis取出日志,然后进行filter和output,filter就是对日志进行切割,匹配,过滤,logstash index这里可以是集群的,都从redis拿就行。取出来之后output可以到elasticsearch,elasticsearch也可以是集群,专门做索引。在最前端就是kibana3,再js里面配置从elasticsearch的端口读取数据,呈现到前端。

- 阅读剩余部分 -

logstash kibana3显示坐标

按照之前logstash+kibana3 GeoIP地理位置那样配置出来的geo地理位置里有经度和纬度,但是是独立开来的。在官网的demo上可以有coordinates的字段,只要是以数组的形式显示经纬度。下面是logstash的配置,在kibana3上呈现坐标形式。

filter {
geoip {
   source => "source_ip"
   type => "linux-syslog"
   add_tag => [ "geoip" ]
   add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
   add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
}

mutate {
    convert => [ "[geoip][coordinates]", "float" ]
}

下面是显示后的效果

- 阅读剩余部分 -

Python redis操作

首先安装python redis扩展模块 yum install python-redis

#!/usr/bin/env python2.6
#-*- coding: utf-8 -*-

# Author : firefoxbug
# E-Mail : wanghuafire@gmail.com
# Blog   : www.firefoxbug.net
# Function : put or get log dictionary from redis-server

import redis  

global redis_q

class RedisQueue(object):
    """Simple Queue with Redis Backend"""
    def __init__(self,**redis_kwargs):
        """The default connection parameters are: host='localhost', port=6379, db=0"""
        self.__db= redis.Redis(**redis_kwargs)
#       self.key = '%s:%s' %(namespace, name)  

    def qsize(self,key):
        """Return the approximate size of the queue."""
        return self.__db.llen(key)

    def empty(self):
        """Return True if the queue is empty, False otherwise."""
        return self.qsize() == 0  

    def put(self,key,item):
        """Put item into the queue."""
        self.__db.rpush(key, item)  

    def get(self,key,block=True, timeout=None):
        """Remove and return an item from the queue.  

        If optional args block is true and timeout is None (the default), block
        if necessary until an item is available."""
        if block:
            item = self.__db.blpop(key, timeout=timeout)
        else:
            item = self.__db.lpop(key)  

        if item:
            item = item[1]
        return item  

    def get_nowait(self):
        """Equivalent to get(False)."""
        return self.get(False) 

def connect2redis(host='127.0.0.1'):
    global redis_q
    redis_q = RedisQueue()

if __name__ == '__main__':
    redis_q = RedisQueue(host='127.0.0.1')
    i = 0
    while True:
                redis_q.put('test2','hello world')
        print redis_q.get('test2')

redis-2.6安装

在使用redis2.4和redis2.6过程中,发现一个问题,在redis-cli里输入 keys * 参看键值的时候,2.4版本会卡住,应该是阻塞的,2.6就不是,留个笔记吧。。。

#!/bin/bash

wget http://download.redis.io/releases/redis-2.6.16.tar.gz
tar zxvf redis-2.6.16.tar.gz
cur_dir=$(pwd)
cd redis-2.6.16
make
cp src/redis-server /usr/sbin/
cp src/redis-cli /usr/bin/
cp utils/redis_init_script /etc/init.d/redis
curl -L https://bitbucket.org/ptylr/public-stuff/raw/41d5c8e87ce6adb34aa16cd571c3f04fb4d5e7ac/etc/init.d/redis > /etc/init.d/redis
mkdir -p /etc/redis
mkdir -p /var/redis
mkdir -p /var/lib/redis
mv ${cur_dir}/redis.conf /etc/
redis-server /etc/redis.conf

redis.conf配置文件在附件redis

Nginx反向代理和php解析配置

Nginx纯反向代理配置

upstream  firefoxbug{
        ip_hash; 
        server 10.161.171.87:80;
        server 10.160.55.81;
        server 10.160.55.93;
}

server {
    server_name         www.firefoxbug.net firefoxbug.net;
    listen              80;
    gzip                on;


    error_log           /home/logs/www_firefoxbug_net_error.log error;
    access_log          /home/logs/www_firefoxbug_net_access.log;

    ## Bypass For All
    location / {
        proxy_redirect      off;
        proxy_pass          http://firefoxbug; 
        proxy_set_header Host   $host;
        proxy_set_header    X-Real-IP       $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

- 阅读剩余部分 -