keepalived工作原理和配置说明

keepalived是什么

keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。

keepalived工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级选举一个backup当master。这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

keepalived的配置文件

keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。

global_defs区域

主要是配置故障发生时的通知对象以及机器标识

global_defs {
    notification_email {
        a@abc.com
        b@abc.com
        ...
    }
    notification_email_from alert@abc.com
    smtp_server smtp.abc.com
    smtp_connect_timeout 30
    enable_traps
    router_id host163
}
  • notification_email 故障发生时给谁发邮件通知。
  • notification_email_from 通知邮件从哪个地址发出。
  • smpt_server 通知邮件的smtp地址。
  • smtp_connect_timeout 连接smtp服务器的超时时间。
  • enable_traps 开启SNMP陷阱(Simple Network Management Protocol)。
  • router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。

static_ipaddress和static_routes区域

static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。

static_ipaddress {
    10.210.214.163/24 brd 10.210.214.255 dev eth0
    ...
}
static_routes {
    10.0.0.0/8 via 10.210.214.1 dev eth0
    ...
}

以上分别表示启动/关闭keepalived时在本机执行的如下命令:

# /sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0
# /sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0

注意: 请忽略这两个区域,因为我坚信你的机器肯定已经配置了IP和路由。

vrrp_script区域

用来做健康检查的,当时检查失败时会将vrrp_instancepriority减少相应的值。

vrrp_script chk_http_port {
    script "</dev/tcp/127.0.0.1/80"
    interval 1
    weight -10
}

以上意思是如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。

vrrp_instance和vrrp_sync_group区域

vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。

vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:

两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。

vrrp_sync_group VG_1 {
    group {
        inside_network   # name of vrrp_instance (below)
        outside_network  # One for each moveable IP.
        ...
    }
    notify_master /path/to_master.sh
    notify_backup /path/to_backup.sh
    notify_fault "/path/fault.sh VG_1"
    notify /path/notify.sh
    smtp_alert
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    use_vmac <VMAC_INTERFACE>
    dont_track_primary
    track_interface {
        eth0
        eth1
    }
    mcast_src_ip <IPADDR>
    lvs_sync_daemon_interface eth1
    garp_master_delay 10
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        10.210.214.253/24 brd 10.210.214.255 dev eth0
        192.168.1.11/24 brd 192.168.1.255 dev eth1
    }
    virtual_routes {
        172.16.0.0/12 via 10.210.214.1
        192.168.1.0/24 via 192.168.1.1 dev eth1
        default via 202.102.152.1
    }
    track_script {
        chk_http_port
    }
    nopreempt
    preempt_delay 300
    debug
    notify_master <STRING>|<QUOTED-STRING>
    notify_backup <STRING>|<QUOTED-STRING>
    notify_fault <STRING>|<QUOTED-STRING>
    notify <STRING>|<QUOTED-STRING>
    smtp_alert
}
  • notify_master/backup/fault 分别表示切换为主/备/出错时所执行的脚本。
  • notify 表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递三个参数($1 = “GROUP”|”INSTANCE”,$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。
  • smtp_alert 表示是否开启邮件通知(用全局区域的邮件设置来发通知)。
  • state 可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
  • interface 节点固有IP(非VIP)的网卡,用来发VRRP包。
  • use_vmac 是否使用VRRP的虚拟MAC地址。
  • dont_track_primary 忽略VRRP网卡错误。(默认未设置)
  • track_interface 监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项)
  • mcast_src_ip 修改vrrp组播包的源地址,默认源地址为master的IP。(由于是组播,因此即使修改了源地址,该master还是能收到回应的)
  • lvs_sync_daemon_interface 绑定lvs syncd的网卡。
  • garp_master_delay 当切为主状态后多久更新ARP缓存,默认5秒。
  • virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播。

注意: 同一网段中virtual_router_id的值不能重复,否则会出错,相关错误信息如下。

Keepalived_vrrp[27120]: ip address associated with VRID not present in received packet :
one or more VIP associated with VRID mismatch actual MASTER advert
bogus VRRP packet received on eth1 !!!
receive an invalid ip number count associated with VRID!
VRRP_Instance(xxx) ignoring received advertisment...

可以用这条命令来查看该网络中所存在的vrid:tcpdump -nn -i any net 224.0.0.0/8

  • priority 用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100)。
  • advert_int 发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)。
  • authentication 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
  • virtual_ipaddress vip,不解释了。
  • virtual_routes 虚拟路由,当IP漂过来之后需要添加的路由信息。
  • virtual_ipaddress_excluded 发送的VRRP包里不包含的IP地址,为减少回应VRRP包的个数。在网卡上绑定的IP地址比较多的时候用。
  • nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动。

首先nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。我个人推荐使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。

当使用track_script时可以不用加nopreempt,只需要加上preempt_delay 5,这里的间隔时间要大于vrrp_script中定义的时长。

  • preempt_delay master启动多久之后进行接管资源(VIP/Route信息等),并提是没有nopreempt选项。

virtual_server_group和virtual_server区域

virtual_server_group一般在超大型的LVS中用到,一般LVS用不过这东西,因此不多说。

virtual_server IP Port {
    delay_loop <INT>
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind NAT|DR|TUN
    persistence_timeout <INT>
    persistence_granularity <NETMASK>
    protocol TCP
    ha_suspend
    virtualhost <STRING>
    alpha
    omega
    quorum <INT>
    hysteresis <INT>
    quorum_up <STRING>|<QUOTED-STRING>
    quorum_down <STRING>|<QUOTED-STRING>
    sorry_server <IPADDR> <PORT>
    real_server <IPADDR> <PORT> {
        weight <INT>
        inhibit_on_failure
        notify_up <STRING>|<QUOTED-STRING>
        notify_down <STRING>|<QUOTED-STRING>
        # HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
        HTTP_GET|SSL_GET {
            url {
                path <STRING>
                # Digest computed with genhash
                digest <STRING>
                status_code <INT>
            }
            connect_port <PORT>
            connect_timeout <INT>
            nb_get_retry <INT>
            delay_before_retry <INT>
        }
    }
}
  • delay_loop 延迟轮询时间(单位秒)。
  • lb_algo 后端调试算法(load balancing algorithm)。
  • lb_kind LVS调度类型NAT/DR/TUN
  • virtualhost 用来给HTTP_GET和SSL_GET配置请求header的。
  • sorry_server 当所有real server宕掉时,sorry server顶替。
  • real_server 真正提供服务的服务器。
  • weight 权重。
  • notify_up/down 当real server宕掉或启动时执行的脚本。
  • 健康检查的方式,N多种方式。
  • path 请求real serserver上的路径。
  • digest/status_code 分别表示用genhash算出的结果和http状态码。
  • connect_port 健康检查,如果端口通则认为服务器正常。
  • connect_timeout,nb_get_retry,delay_before_retry分别表示超时时长、重试次数,下次重试的时间延迟。

其他选项暂时不作说明。

keepalived主从切换

主从切换比较让人蛋疼,需要将backup配置文件的priority选项的值调整的比master高50个点,然后reload配置文件就可以切换了。当时你也可以将master的keepalived停止,这样也可以进行主从切换。

keepalived仅做HA时的配置

请看该文档同级目录下的配置文件示例。

说明:
10.210.214.113 为keepalived的备机,其配置文件为113.keepalived.conf
10.210.214.163 为keepalived的主机,其配置文件为163.keepalived.conf
10.210.214.253 为Virtual IP,即提供服务的内网IP地址,在网卡eth0上面
192.168.1.11 为模拟的提供服务的公网IP地址,在网卡eth1上面

用tcpdump命令来捕获的结果如下:

17:20:07.919419 IP 10.210.214.163 > 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 200, authtype simple, intvl 1s, length 20

LVS+Keepalived配置

注Keepalived与LVS结合使用时一般还会用到一个工具ipvsadm,用来查看相关VS相关状态,关于ipvsadm的用法可以参考man手册。

10.67.15.95为keepalived master,VIP为10.67.15.94,配置文件为95-lvs-keepalived.conf
10.67.15.96为keepalived master,VIP为10.67.15.94,配置文件为96-lvs-keepalived.conf
10.67.15.195为real server

注意:

当使用LVS+DR+Keepalived配置时,需要在real server上添加一条iptables规则(其中dport根据情况添加或缺省):

# iptables -t nat -A PREROUTING -p tcp -d 10.67.15.94 --dport 80 -j REDIRECT

当使用LVS+NAT+Keepalived配置时,需要将real server的默认路由配置成Director的VIP10.67.15.94,必须确保client的请求是通过10.67.15.94到达real server的。

安装keepalived

从keepalived官网下载合适的版本,解压并执行如下命令完成安装。

# cd keepalived-xxx
# ./configure --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --mandir=/usr/share
# make && make install

你也可以打成RPM包,然后安装。

说明

我们用到的HA场景如下: 两台主机host113和host163,内网IP在eth1网卡上,分别是10.210.214.113和10.210.214.163,VIP为公网IP在eth0上,IP地址是202.102.152.253,网关为202.102.152.1。当VIP在host113上提供服务时,host113上的默认路由为202.102.152.1,提供服务的端口为202.102.152.253:443。host113发生故障需要将VIP及服务切回到host163上的时候,需要以下几步,第一将VIP接管过来,第二添加默认路由202.102.152.1,第三启动在端口202.102.152.253:443上的服务。

如此一来,keepalived需要另外的脚本来完成添加默认路由和启动服务工作,这点和heartbeat中的resources是相同的。目前我进行了测试,发现keepalived速度要比heartbeat快,也就是说效率比heartbeat高。并且,最重要的一点,keepalived支持多个backup。

不要问我为何有以上需求。要为两个不同的域名提供https服务,由于SSL证书问题,必须有两个公网IP地址分别绑定443端口。

当然,通过SNI也可以实现一个公网IP绑定443端口来为多个域名提供https服务,但是这需要浏览器支持(M$的IE浏览器不支持)。(nginx/apache

吐槽

keepalived的主从切换比较让人蛋疼,需要修改配置文件或停止一方的运行。但是由于keepalived是通过vrrp协议来实现failover(故障转移)的,因此也决定了手动主从切换的不便。

keepalived的文档也很旧了,一直都找不到合适的文档,之前我就一直忽略了vrrp_script这个区域,导致很多事情想不通。

另外,我发现我越来越喜欢keepalived了。。。

Sqoop框架学习

一、Sqoop基础:连接关系型数据库与Hadoop的桥梁

1.1 Sqoop的基本概念

Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易。Apache Sqoop正在加紧帮助客户将重要数据从数据库移到Hadoop。随着Hadoop和关系型数据库之间的数据移动渐渐变成一个标准的流程,云管理员们能够利用Sqoop的并行批量数据加载能力来简化这一流程,降低编写自定义数据加载脚本的需求。

Apache SqoopSQL-to-Hadoop) 项目旨在协助 RDBMS 与 Hadoop 之间进行高效的大数据交流。用户可以在 Sqoop 的帮助下,轻松地把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中;同时也可以把数据从 Hadoop 系统里抽取并导出到关系型数据库里。因此,可以说Sqoop就是一个桥梁,连接了关系型数据库与Hadoop。

1.2 Sqoop的基本机制

Sqoop中一大亮点就是可以通过hadoop的mapreduce把数据从关系型数据库中导入数据到HDFS。Sqoop架构非常简单,其整合了Hive、Hbase和Oozie,通过map-reduce任务来传输数据,从而提供并发特性和容错。Sqoop的基本工作流程如下图所示:

 

Sqoop在import时,需要制定split-by参数。Sqoop根据不同的split-by参数值来进行切分,然后将切分出来的区域分配到不同map中。每个map中再处理数据库中获取的一行一行的值,写入到HDFS中(由此也可知,导入导出的事务是以Mapper任务为单位)同时split-by根据不同的参数类型有不同的切分方法,如比较简单的int型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来确定划分几个区域。 比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分别为1000和1,而num-mappers为2的话,则会分成两个区域(1,500)和(501-100),同时也会分成2个sql给2个map去进行导入操作,分别为select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000。最后每个map各自获取各自SQL中的数据进行导入工作。

二、Sqoop实践:MySQL->HDFS/HDFS->MySQL

2.1 Sqoop的安装配置

(1)下载sqoop安装包:这里使用的是1.4.3版本,已经上传至网盘中(http://pan.baidu.com/s/1pJ7gfxh

(2)解压sqoop安装包:tar -zvxf sqoop-1.4.3.bin__hadoop-1.0.0.tar.gz

(3)设置环境变量:vim /etc/profile ,增加以下内容

export SQOOP_HOME=/usr/local/sqoop
export PATH=.:$HADOOP_HOME/bin:$SQOOP_HOME/bin:$HIVE_HOME/bin:$PIG_HOME/bin:$HBASE_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH

最后是环境变量生效:source /etc/profile

(4)将mysql的jdbc驱动mysql-connector-java-5.1.10.jar复制到sqoop项目的lib目录下:

cp mysql-connector-java-5.1.10.jar /usr/local/sqoop/lib

(5)重命名配置文件:在${SQOOP_HOME}/conf中执行命令

mv sqoop-env-template.sh sqoop-env.sh

(6)【可选】修改配置文件:vim sqoop-env.sh

#Set path to where bin/hadoop is available

export HADOOP_COMMON_HOME=/usr/local/hadoop/

#Set path to where hadoop-*-core.jar is available

export HADOOP_MAPRED_HOME=/usr/local/hadoop

#set the path to where bin/hbase is available export

HBASE_HOME=/usr/local/hbase

#Set the path to where bin/hive is available

export HIVE_HOME=/usr/local/hive

#Set the path for where zookeper config dir is

export ZOOCFGDIR=/usr/local/zookeeper

2.2 数据导入:MySQL->HDFS

这里假设我们已经在hadoop-master服务器中安装了MySQL数据库服务,并使用默认端口3306。需要注意的是,sqoop的数据库驱动driver默认只支持mysql和oracle,如果使用sqlserver的话,需要把sqlserver的驱动jar包放在sqoop的lib目录下,然后才能使用drive参数。

(1)MySQL数据源:mysql中的hive数据库的TBLS表,这里使用学习笔记17《Hive框架学习》里边Hive的数据库表。

(2)使用import命令将mysql中的数据导入HDFS:

首先看看import命令的基本格式:

  sqoop             ##sqoop命令

import             ##表示导入

–connect jdbc:mysql://ip:3306/sqoop    ##告诉jdbc,连接mysql的url

–username root                                     ##连接mysql的用户名

–password admin                                 ##连接mysql的密码

–table mysql1                                        ##从mysql导出的表名称

–fields-terminated-by ‘\t’                        ##指定输出文件中的行的字段分隔符

-m 1                                                       ##复制过程使用1个map作业

–hive-import                                          ##把mysql表数据复制到hive空间中。如果不使用该选项,意味着复制到hdfs中

然后看看如何进行实战:这里将mysql中的TBLS表导入到hdfs中(默认导入目录是/user/<username>)

sqoop import –connect jdbc:mysql://hadoop-master:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’

最后看看是否成功导入了HDFS中:可以看到TBLS表存入了多个map任务所生成的文件中

(3)刚刚看到了默认是由多个map来进行处理生成,可以设置指定数量的map任务。又由于sqoop默认不是追加方式写入,还可以设置其为追加方式写入已有文件末尾:

sqoop import –connect jdbc:mysql://hadoop0:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’  –null-string ‘**’  -m 1 –append

(4)还可以将MySQL中的数据导入Hive中(你设定的hive在hdfs中的存储位置,我这里是/hive/):

首先得删掉刚刚导入到hdfs中的文件数据:

hadoop fs -rmr /user/root/*

然后再通过以下命令导入到hive中:

sqoop import –connect jdbc:mysql://hadoop-master:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’ -m 1 –append  –hive-import

最后看看是否导入到了hive目录(/hive/)中:

(5)还可以对指定数据源进行增量导入:所谓增量打入,就是导入上一次导入后数据源新增的那部分数据,例如:上次导入的数据是id从1~100的数据,那么这次就只导入100以后新增的数据,而不必整体导入,节省了导入时间。下面的命令以TBL_ID字段作为判断标准采用增量导入,并记录上一次的最后一个记录是6,只导入6以后的数据即可。

sqoop import –connect jdbc:mysql://hadoop0:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’  –null-string ‘**’  -m 1 –append  –hive-import  –check-column ‘TBL_ID’ –incremental append –last-value 6

2.3 数据导出:HDFS->MySQL

(1)既然要导出到MySQL,那么首先得要有一张接收从HDFS导出数据的表。这里为了示范,只创建一个最简单的数据表TEST_IDS,只有一个int类型的ID字段。

(2)使用export命令进行将数据从HDFS导出到MySQL中,可以看看export命令的基本格式:

sqoop

export                                        ##表示数据从hive复制到mysql中

–connect jdbc:mysql://ip:3306/sqoop   ##告诉jdbc,连接mysql的url

–username root          ##连接mysql的用户名

–password admin        ##连接mysql的密码

–table mysql2                                        ##mysql中的表,即将被导入的表名称

–export-dir ‘/user/root/warehouse/mysql1’  ##hive中被导出的文件目录

–fields-terminated-by ‘\t’    ##hive中被导出的文件字段的分隔符

 

注意:导出的数据表必须是事先存在的  

(3)准备一个符合数据表规范的文件ids并上传到HDFS中,作为导出到MySQL的数据源:这个ids里边只有10个数字

复制代码
1
2
3
4
5
6
7
8
9
10
复制代码

(4)export实战:将HDFS中的ids导出到mysql中的TEST_IDS数据表中

sqoop export –connect jdbc:mysql://hadoop-master:3306/hive  –username root –password admin –table TEST_IDS –fields-terminated-by ‘\t’ –export-dir ‘/testdir/input/ids’

最后查看是否导入到了mysql中的TEST_IDS数据表中:

2.4 创建job,运行job

刚刚我们使用了import和export命令进行了常规的导入导出操作,但是每次都要我们使用那么长的命令不太容易记忆。于是,我们可以将其创建为一个job,每次需要使用时只需要记住job名,运行job即可。

这里以导入为例,创建一个job名为myjob1的job:

sqoop job –create myjob1  — import –connect jdbc:mysql://hadoop-master:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’  -m 1 –append

可以通过命令查看是否存在job:sqoop job –list

执行刚刚创建的job:

sqoop job –exec myjob1

但是,我们发现上面的设置后还需要我们输入密码,这样便无法做到真正的自动执行job。

于是,我们做一点小小的配置(hive-site.xml)修改:将下面的xml配置的注释移除即可

复制代码
  <!--  -->
  <property>
    <name>sqoop.metastore.client.record.password</name>
    <value>true</value>
    <description>If true, allow saved passwords in the metastore.
    </description>
  </property>
复制代码

移除之后,还需要将刚刚那个job删除掉,重新创建job后才可以无密码自动执行。

sqoop job –delete myjob1

sqoop job –create myjob1 — import –connect jdbc:mysql://hadoop-master:3306/hive  –username root –password admin –table TBLS –fields-terminated-by ‘\t’  -m 1 –append

sqoop job –exec myjob1

出处:http://www.cnblogs.com/edisonchou/

Sqoop——数据传输工具

一、Sqoop简介与部署

  1. Sqoop是一款开源的工具,主要用于在HADOOP不传统的数据库(mysql、postgresql等)进行数据的传递,可以将一个关系型数据库(例如:MySQL、Oracle、Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
    Sqoop中一大亮点就是可以通过hadoop的mapreduce把数据从关系型数据库中导入数据到HDFS。
  2. Sqoop1架构

    QQ截图20160120182115.jpg-121.6kB

    • 版本号为1.4.x为sqoop1
    • 在架构上:sqoop1使用sqoop客户端直接提交的方式
    • 访问方式:CLI控制台方式进行访问
    • 安全性:命令或脚本中指定用户数据库名及密码
  3. Sqoop2架构

    QQ截图20160120182204.jpg-110.8kB

    • 版本号为1.99x为sqoop2
    • 在架构上:sqoop2引入了sqoop server,对connector实现了集
      中的管理
    • 访问方式:REST API、 JAVA API、 WEB UI以及CLI控制台方式进
      行访问
    • CLI方式访问,会通过交互过程界面,输入的密码信息丌被看到,
      同时Sqoop2引入基亍角色的安全机制

    Sqoop2比Sqoop多了一个Server端。

  4. Sqoop1与Sqoop2对比

    QQ截图20160120182356.jpg-221.6kB

  5. Sqoop验证安装
    1. [root@master bin]# sqoop help
    2. Warning: /opt/cloudera/parcels/CDH-5.3.8-1.cdh5.3.8.p0.5/bin/../lib/sqoop/../accumulo does not exist! Accumulo imports will fail.
    3. Please set $ACCUMULO_HOME to the root of your Accumulo installation.
    4. 16/01/20 18:31:21 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.3.8
    5. usage: sqoop COMMAND [ARGS]
    6. Available commands:
    7. codegen Generate code to interact with database records
    8. create-hive-table Import a table definition into Hive
    9. eval Evaluate a SQL statement and display the results
    10. export Export an HDFS directory to a database table
    11. help List available commands
    12. import Import a table from a database to HDFS
    13. import-all-tables Import tables from a database to HDFS
    14. import-mainframe Import datasets from a mainframe server to HDFS
    15. job Work with saved jobs
    16. list-databases List available databases on a server
    17. list-tables List available tables in a database
    18. merge Merge results of incremental imports
    19. metastore Run a standalone Sqoop metastore
    20. version Display version information
    21. See 'sqoop help COMMAND' for information on a specific command

      测试Sqoop导入/导出MySQL

      1. 准备环境
        • mysql-connector-java
          mysql-connector-java-5.1.34-bin.jar放入sqoop/lib/下面(低于此版本mysql连接器可能会有异常)
        • mysql数据库允许远程连接
          Linux下执行mysql命令登录测试是否mysql允许远程访问:
          mysql –h mysql-server-ip –u username –p database
          如果没有权限,在mysql命令行中执行:
          grant all PRIVILEGES on *.* to root@’hostname’ identified by ‘password’; flush privileges;
        • 测试sqoop是否可以连接到mysql
          Sqoop测试命令,显示当前可用的数据库:
          sqoop list-databases --connect jdbc:mysql://mysql-server-ip:3306/ --username root --password <password>

          1. # 将mysql-*.jar放入sqoop目录中
          2. [root@master tmp]# cp mysql-connector-java-5.1.35.jar /opt/cloudera/parcels/CDH-5.3.8-1.cdh5.3.8.p0.5/lib/sqoop
          3. [root@master tmp]# cp mysql-connector-java-5.1.35.jar /opt/cloudera/parcels/CDH-5.3.8-1.cdh5.3.8.p0.5/lib/sqoop2
          4. # 用sqoop查看数据库
          5. [root@master tmp]# sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username root --password root
          6. Warning: /opt/cloudera/parcels/CDH-5.3.8-1.cdh5.3.8.p0.5/bin/../lib/sqoop/../accumulo does not exist! Accumulo imports will fail.
          7. Please set $ACCUMULO_HOME to the root of your Accumulo installation.
          8. 16/01/20 20:47:19 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.3.8
          9. 16/01/20 20:47:19 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
          10. 16/01/20 20:47:20 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
          11. information_schema
          12. cm
          13. hive
          14. mysql
          15. navigator_audit_server
          16. navigator_metadata_server
          17. reports_manager
          18. test
          19. # 用于测试的数据库表结构及数据内容
          20. mysql> use test
          21. Reading table information for completion of table and column names
          22. You can turn off this feature to get a quicker startup with -A
          23. Database changed
          24. mysql> describe user_info;
          25. +--------+--------------+------+-----+---------+----------------+
          26. | Field | Type | Null | Key | Default | Extra |
          27. +--------+--------------+------+-----+---------+----------------+
          28. | id | int(11) | NO | PRI | NULL | auto_increment |
          29. | name | varchar(100) | YES | | NULL | |
          30. | gender | varchar(10) | YES | | NULL | |
          31. | grade | int(20) | YES | | NULL | |
          32. +--------+--------------+------+-----+---------+----------------+
          33. 4 rows in set (0.00 sec)
          34. mysql> select * from user_info;
          35. +----+----------+--------+-------+
          36. | id | name | gender | grade |
          37. +----+----------+--------+-------+
          38. | 1 | redskirt | m | 100 |
          39. | 2 | honey | m | 90 |
          40. | 3 | lw | m | 92 |
          41. | 4 | nicholas | m | 99 |
          42. | 5 | sasaki | m | 99 |
          43. +----+----------+--------+-------+
          44. 5 rows in set (0.00 sec)
      2. mysql数据导入HDFS
        • 全表导入(单map串行导入)
        1. sqoop import --connect jdbc:mysql://mysql-serverip:3306/sqoop --username root --password root --table user_info -m 1

        参数解析:
        --connect:JDBC连接URL
        --username:连接数据库用户名
        --password:连接数据库密码
        --table:要读取的表
        -m:map并行读取的数量
        含义:读取user_info表数据到HDFS集群,并叧通过一个map任务
        注意:此Sqoop命令没有指定HDFS目录,默认数据会放在/user/{user.name}/{–table参数指定表名}目录下。

        1. [root@master tmp]# sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password root --table user_info -m 1
        2. mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
        3. Query OK, 0 rows affected (0.06 sec)
        4. mysql> flush privileges;
        5. Query OK, 0 rows affected (0.02 sec)

        在YARN上可看到完成的MapReduce任务

      3. QQ截图20160120213128.png-59.2kB
      4. # HDFS中查看结果
      5. [root@master tmp]# hadoop fs -cat /user/root/user_info/part-m-00000
      6. 1,redskirt,m,100
      7. 2,honey,m,90
      8. 3,lw,m,92
      9. 4,nicholas,m,99
      10. 5,sasaki,m,99
  • Select语句导入
  1. sqoop import --connect jdbc:mysql://mysql-serverip:3306/test --username root --password root --query 'select * from user_info where id <5 and $CONDITIONS' --split-by id --target-dir /user/root/mysql/user_info -m 2

参数解析:
--query: 导入过程使用SQL语句
--split-by:表中的那一列作为任务分配列并列:有id列1,2,3,4, 5,6,-m选项为2,那么将分为1,2,3记录通过一个map任务来执行,4,5,6,通过另一个map任务来执行
--target-dir: 指定HDFS上存放数据目录
where $CONDITIONS: 当使用--query的时候需要有$CONDITIONS

  1. [root@master tmp]# sqoop import --connect jdbc:mysql://master:3306/test --username root --password root --query 'select * from user_info where id <5 and $CONDITIONS' --split-by id --target-dir /user/root/mysql/user_info -m 2
  2. # 查看导入结果
  3. [root@master tmp]# hadoop fs -cat /user/root/mysql/user_info/part-m-00000
  4. 1,redskirt,m,100
  5. 2,honey,m,90

QQ截图20160121000902.png-61.4kB

    • Select语句导入空值处理
    1. sqoop import --connect jdbc:mysql://mysql-serverip:3306/sqoop --username root --password root --query 'select * from user_info where $CONDITIONS' --split-by id --target-dir /data/sqoop/mysql/user_info -m 2 --null-string '' --null-non-string ''

    参数解析:
    当从数据库中拉取过来的数据存在空值,默认Sqoop会设置为null,通过下面参数,来替换null值。
    举例语句中,null值,设置为了空:
    --null-string:string类型替换为第一个”中指定的值
    --null-non-string:非string类型替换为第二个”中指定的值

    1. mysql> select * from user_info;
    2. +----+----------+--------+-------+
    3. | id | name | gender | grade |
    4. +----+----------+--------+-------+
    5. | 1 | redskirt | m | 100 |
    6. | 2 | honey | m | 90 |
    7. | 3 | lw | m | 92 |
    8. | 4 | nicholas | m | 99 |
    9. | 5 | sasaki | m | 99 |
    10. | 6 | NULL | NULL | NULL |
    11. +----+----------+--------+-------+
    12. 6 rows in set (0.00 sec)
    13. [root@master tmp]# hadoop fs -rmr /user/root/mysql/user_info
    14. [root@master tmp]# sqoop import --connect jdbc:mysql://master:3306/test --username root --password root --query 'select * from user_info where $CONDITIONS' --split-by id --target-dir /user/root/mysql/user_info -m 2 --null-string '' --null-non-string ''
    15. [root@master tmp]# hadoop fs -cat /user/root/mysql/user_info/part-m-00000
    16. 1,redskirt,m,100
    17. 2,honey,m,90
    18. 3,lw,m,92
    19. [root@master tmp]# hadoop fs -cat /user/root/mysql/user_info/part-m-00001
    20. 4,nicholas,m,99
    21. 5,sasaki,m,99
    22. 6,,,
    • 导入库下所有语句
    1. sqoop import-all-tables --connect jdbc:mysql://mysql-serverip:3306/sqoop --username root --password root

    参数解析:
    import-all-tables:导入指定库下面所有的表

    1. [root@master tmp]# hadoop fs -rmr /user/root/user_info
    2. [root@master tmp]# sqoop import-all-tables --connect jdbc:mysql://master:3306/test --username root --password root

    QQ截图20160121111208.jpg-241.4kB

    • 指定某些列导入HDFS
    1. sqoop import --connect jdbc:mysql://master:3306/test --username root --password root --table user_info --target-dir /user/root/user_info -m 1 --null-string '' --null-non-string '' --columns id,name

    参数解析:
    --columns:指定导出哪几列

    1. [root@master tmp]# hadoop fs -rmr /user/root/user_info
    2. [root@master tmp]# sqoop import --connect jdbc:mysql://master:3306/test --username root --password root --table user_info --target-dir /user/root/user_info -m 1 --null-string '' --null-non-string '' --columns id,name
    3. [root@master tmp]# hadoop fs -cat /user/root/user_info/part-m-00000
    4. 1,redskirt
    5. 2,honey
    6. 3,lw
    7. 4,nicholas
    8. 5,sasaki
    9. 6,
  1. HDFS数据导入mysql
    • 数据导出到mysql表
    1. sqoop export --connect jdbc:mysql://mysql-serverip:3306/test --username root --password root --table user_info_ --fields-terminated-by ',' --export-dir /user/root/mysql/user_info --input-null-string '' --input-null-non-string ''

    参数解析:
    export:从HDFS导出mysql(或其他RDBMS)
    --table:mysql当中表
    --fields-terminated-by:源数据字段分隔符
    --export-dir:源数据HDFS上位置

    1. # 创建目标表结构
    2. mysql> use test;
    3. Reading table information for completion of table and column names
    4. You can turn off this feature to get a quicker startup with -A
    5. Database changed
    6. mysql> create table if not exists user_info_(
    7. -> id int(11) not null primary key auto_increment,
    8. -> name varchar(50)
    9. -> );
    10. Query OK, 0 rows affected (0.00 sec)
    11. # 执行导出
    12. [root@master tmp]# sqoop export --connect jdbc:mysql://master:3306/test --username root --password root --table user_info_ --fields-terminated-by ',' --export-dir /user/root/mysql/user_info --input-null-string '' --input-null-non-string ''
    13. # 查看数据库
    14. mysql> select * from user_info_;
    15. +----+----------+
    16. | id | name |
    17. +----+----------+
    18. | 1 | redskirt |
    19. | 2 | honey |
    20. | 3 | lw |
    21. | 4 | nicholas |
    22. | 5 | sasaki |
    23. | 6 | NULL |
    24. +----+----------+
    25. 6 rows in set (0.00 sec)
    • Batch模式数据导入到mysql表
    1. sqoop export -Dsqoop.export.records.per.statement=10 -- connect jdbc:mysql://mysql-server-ip:3306/sqoop --username root --password root --table user_info_bak --fields-terminatedby ',' --export-dir /user/root/mysql/user_info

    参数解析
    --Dsqoop.export.records.per.statement=10指定每10条数据执行一次insert类似 INSERT INTO xxx VALUES (), (), (), …
    或是
    --Dsqoop.export.records.per.transaction=10指定每次事务多少条记录被insert,类似BEGIN; INSERT, INSERT, …. COMMIT

    • HDFS数据对mysql表做更新
    1. sqoop export --connect jdbc:mysql://mysql-serverip:3306/sqoop --username sqoop --password sqoop --table user_info_bak --update-key id --fields-terminated-by ',' --export-dir /user/root/mysql/user_info

    参数解析
    --update-key id指定根据那个列进行更新,也可指定多列,用逗号分隔。
    相当于:

    1. update user_info_bak set name=‘xxx’… where id=“1’;
    2. update user_info_bak set name=‘ yyy’… where id=“2’;
    • HDFS导出mysql表空值处理
    1. sqoop export --connect jdbc:mysql://mysql-serverip:3306/sqoop --username sqoop --password sqoop --table user_info --input-null-string '' --input-null-non-string ''

    参数解析
    同导入的含义相同
    --input-null-string:会被翻译成数据库中string列NULL的值
    --input-null-non-string:被翻译成数据库中非string列NULL的值

三、导入Hbase,Hive场景

  1. mysql数据导入Hive
    • mysql直接导入到hive
    1. sqoop import --connect jdbc:mysql://master:3306/tmpbase --username root --password password --table user_info --hive-import -hive-database default --hive-table user_info_bak

    参数解析:
    --hive-import:该次导入任务为导向hive
    --hive-table:要导入的hive表
    --hive-database:导入的hive库
    注意两边表结构要一致

  2. mysql数据导入Hbase
    • mysql直接导入到hbase
    1. sqoop import --connect jdbc:mysql://master:3306/tmpbase --username root --password password --table user_info --hbase-table user_info --column-family f --hbase-createtable

    参数解析:
    --hbase-table:要导入的hbase表
    --column-family:指定hbase表中列族
    --hbase-create-table:如果HBase表没有创建,自行创建
    注意:实际使用效率较差,小数据量情况下使用(100百万以下数据,可以尝试使用)

    • Mysql bulk load方式导入到hbase
    1. sqoop import --connect jdbc:mysql://master:3306/tmpbase --username root --password password --table user_info --hbase-table user_info --column-family f --hbase-createtable --hbase-bulkload

    参数解析:
    --hbase-table:要导入的hbase表
    --column-family:指定hbase表中列族
    --hbase-create-table:如果HBase表没有创建,自劢创建
    --hbase-bulkload:以bulkload方式导入HBase,而非直接put

四、Sqoop增量导入

  1. Sqoop Append增量模式
    ppend模式:追加模式,必须是数值字段(1,2,3,4)
    适用范围:有自增序列

    1. sqoop import --connect jdbc:mysql://mysql-serverip:3306/sqoop --username root --password root --query 'select * from user_info where $CONDITIONS' --split-by id --target-dir /data/sqoop/ -m 1 --incremental append -- check-column grade --last-value 80

    参数解析:
    --incremental:指定sqoop增量模式
    --check-column:指定增量的列
    --last-value:指定列值从那一行开始

  2. Sqoop Lastmodified增量模式
    Lastmodified模式:根据时间戳更新模式。
    适用范围:有自增序列

    1. sqoop import --connect jdbc:mysql://msyql-serverip:3306/sqoop --username root --password root --query 'select * from user_info where $CONDITIONS' --split-by id --target-dir /data/sqoop -m 1 --incremental lastmodified --check-column c_date --append --last-value '2015-03-05 01:16:18'

    参数解析:
    --incremental:指定sqoop增量模式
    --check-column:指定增量的列(datatime类型)
    --last-value:指定从那一段时间到当前开始
    --c_date:datetime

五、Sqoop Job定义

  1. Sqoop定义任务
    • 定义user_info Job
    1. sqoop job --create user_info -- import --connect jdbc:mysql://mysql-server-ip:3306/sqoop --username root --password root --table user_info -m 1

    参数解析:
    sqoop job –create:将创建一个Job名字为user_info

  2. Sqoop执行任务及修改Job参数
    • 执行定义的 Job
    1. sqoop job -exec user_info

    参数解析:
    sqoop job -exec:将执行已经定义好的user_info覆盖定义Job的默认参数
    sqoop job -exec user_info -- -m 3:覆盖之前存在的参数-m 1为-m 3

解决zookeeper问题:Error contacting service. It is probably not running

今天部署了一个3台机器的zookeepe集群后,查看机器的集群状态时出现问题,截图如下:

Image
实际上,这个集群是正确启动的,我从每个机器的日志里看到了集群的选举过程和最终结果,知道谁是leader,并且某些zk目录节点已经被应用写成功了 。从这个情况来看,应该是集群成功启动了,但是zkServer.sh status无法执行成功。
在网上搜了下,有以下几种说法:
1 zkServer.sh里的nc命令有问题
可能是机器上没有安装nc命令,还有种说法是在zkServer.sh里找到这句:
STAT=`echo stat | nc localhost $(grep clientPort “$ZOOCFG” | sed -e ‘s/.*=//’) 2> /dev/null| grep Mode`

在nc与localhost之间加上 -q 1 (是数字1而不是字母l)

可是我的zookeeper版本是3.4.6,zkServer.sh里根本没有这一句(获取状态的语句没有用nc命令)
2 日志目录没有创建
这种说法是因为zoo.cfg文件指定了zookeeper日志目录,但是这个目录需要自己先手工创建好,如果没有先创建好,则会出现问题。
但是,我的zookeeper日志目录是提前创建好的,日志文件里已经有内容了,而且没有出现任何错误。
看来我只能自己想办法解决。zookeeper 3.4.6执行zkServer.sh status命令时,获取当前机器状态的语句是这样的:
    STAT=`”$JAVA” “-Dzookeeper.log.dir=${ZOO_LOG_DIR}” “-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}” \
-cp “$CLASSPATH” $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain \
$clientPortAddress $clientPort srvr 2> /dev/null    \
| grep Mode`
如果STAT变量为空,则会显示:
Error contacting service. It is probably not running.
然后退出,代码如下:
    if [ “x$STAT” = “x” ]
then
echo “Error contacting service. It is probably not running.”
exit 1
else
echo $STAT
exit 0
fi
利用shell的debug模式,这段代码执行过程如下:
++ grep Mode
++ /usr/local/java/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp ‘/usr/local/zookeeper-3.4.6/bin/../build/classes:/usr/local/zookeeper-3.4.6/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../conf:’ org.apache.zookeeper.client.FourLetterWordMain localhost $’2182\r’ srvr
+ STAT=
+ ‘[‘ x = x ‘]’
+ echo ‘Error contacting service. It is probably not running.’
Error contacting service. It is probably not running.
+ exit 1
可见STAT变量确实为空,导致输出Error contacting service. It is probably not running.并且退出。
“$JAVA” “-Dzookeeper.log.dir=${ZOO_LOG_DIR}” “-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}” \
-cp “$CLASSPATH” $JVMFLAGS org.apache.zookeeper.client.FourLetterWordMain \
$clientPortAddress $clientPort srvr 2> /dev/null
在执行过程中实际的命令如下:
/usr/local/java/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp ‘/usr/local/zookeeper-3.4.6/bin/../build/classes:/usr/local/zookeeper-3.4.6/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../conf:’ org.apache.zookeeper.client.FourLetterWordMain localhost $’2182\r’ srvr
于是,我直接执行了这一段命令,终于发现一些问题,如下图所示:
Image1
执行过程中报出异常:
in thread “main” java.lang.NumberFormatException: For input string: “2182
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at org.apache.zookeeper.client.FourLetterWordMain.main(FourLetterWordMain.java:76)
看来应该是端口号:$’2182\r’造成的,这不是一个合法的数字。端口号$’2182\r’是怎么来的呢?在zkServer.sh里有这么一句:
clientPort=`grep “^[[:space:]]*clientPort[^[:alpha:]]” “$ZOOCFG” | sed -e ‘s/.*=//’`
grep “^[[:space:]]*clientPort[^[:alpha:]]” “$ZOOCFG” | sed -e ‘s/.*=//’在执行过程中,实际命令如下:
grep ‘^[[:space:]]*clientPort[^[:alpha:]]’ /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg | sed -e ‘s/.*=//’
单独执行这行命令,实际上执行结果的确是2182这个纯数字,不知道为什么整个zkServer.sh执行时,clientPort变成了$’2182\r’。因为时间比较紧,这个问题就暂时放下。我直接将clientPort=`grep “^[[:space:]]*clientPort[^[:alpha:]]” “$ZOOCFG” | sed -e ‘s/.*=//’`改为clientPort=”2182″,因为我的zookeeper端口不是2181而是2182。

关于负载均衡集群

一,什么负载均衡
一个新网站是不要做负载均衡的,因为访问量不大,流量也不大,所以没有必要搞这些东西。但是随着网站访问量和流量的快速增长,单台服务器受自身硬件条件的限制,很难承受这么大的访问量。在这种情况下,有二种方案可以选择:
1,对单台服务器的硬件进行更新,由双核的变成四核的,内存加大等。
2,增加服务器的台数,来分担服务器的负担。以实现增加网络带宽,增加服务器的处理能力的目的。
第一种方法可以理解为纵向发展,这种方法总是有限。第二种方法才是解决问题的正确选择
实现负载均衡的方法,大至分为二个方向,一种是用软件来实现负载均衡,另一种是硬件实现负载均衡(包括结合硬件和软件)
用软件来实现负载均衡,实现负载均衡的过程,自身也要消耗一些系统资源,响应时间增加。例如:LVS,nginx,haproxy,apache等这些基于应用层 的负载均衡软件,适合那些访问量不是特别大的网站。如果像sina,163这样大访量的网站,用硬件来实现负载均衡是最明志的选择。
负载均衡的算法很多,有根据请求数来进行负载均衡的,有根IP来负载均衡的,有根据流量的等等。我经常会用的二种算法。
一个是根据请求数
a,可以实现各台服务器都能比较平均分担客户的请求,其中一台服务器down掉的话也不会造成不好的影响。
b,服务器间的状态要同步,如session,需要其他手段来同步这些状态。
一个是根据IP
a,ip_hash算法可以把一个ip映射到一台服务器上,这样可以解决session同步的问题
b,ip_hash也有不好的地方就是,假如其中的一台服务器down掉的话,映射到这台的服务器的用户就郁闷了。
c,ip_hash容易导致负载不均衡的情况,现在河蟹政府对google的搜索关键词进行过滤,你会经常发现google打不开,但是过一会就好了。这让那些google的爱好者们郁闷不已,很多用户都到国外找代理去了,狗急跳墙,人急帆樯。如果这样的话,这些代理会被分到同一个服务器,会导致负载不均衡 ,甚至失效。

二,什么是会话保持,有什么作用
会话保持是指在负载均衡器上有一种机制,在作负载均衡的同时,还保证同一用户相关连的访问请求会被分配到同一台服务器上。
会话保持有什么作用呢,举例说明一下
如果有一个用户访问请求被分配到服务器A,并且在服务器A登录了,并且在很短的时间,这个用户又发出了一个请求,如果没有会话保持功能的话,这个用户的请求很有可能会被分配到服务器B去,这个时候在服务器B上是没有登录的,所以你要重新登录,但是用户并不知道自己的请求被分配到了哪里,用户的感觉就是登录了,怎么又要登录,用户体验很不好。
还有你在淘宝上面买东西,从登录=》拍得东西=》添加地址=》付款,这是一个一系列的过程,也可以理解成一次操作过程,所有这一系列的操作过程都应当由一台服务器完成,而不能被负载均衡器分配到不同的服务器上。
会话保持都会有时间的限制(映射到固定某一台的服务器除外,如:ip_hash),各种负载均衡工具都会提供这种会话保持时间的设置,LVS,apache等。连php语言都提供了会话保持时间的设定session.gc_maxlifetime
会话保持时间的设定要大于session生存时间的设定,这样可以减少需要同步session的情况,但是不能杜绝。所以同步session还是要做的。

三,session同步
为什么要进行session同步,说会话保持的时候已经提到了。具体方法请参考web集群时session同步的3种方法

web集群时session同步的3种方法

在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是登录状态。所以本文就根据这种情况给出三种不同的方法来解决这个问题:
一,利用数据库同步session
在做多服务器session同步时我没有用这种方法,如果非要用这种方法的话,我想过二种方法:
1,用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件服务器上,用户访问web服务器时,会去这个专门的数据库check一下session的情况,以达到session同步的目的。
2,这种方法是把存放session的表和其他数据库表放在一起,如果mysql也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。
说明:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。上面的二种方法,第一点方法较好,把放session的表独立开来,减轻了真正数据库的负担
二,利用cookie同步session
session是文件的形势存放在服务器端的,cookie是文件的形势存在客户端的,怎么实现同步呢?方法很简单,就是把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。你访问web服务器A,产生了session把它放到cookie里面了,你访问被分配到web服务器B,这个时候,web服务器B先判断服务器有没有这个session,如果没有,在去看看客户端的cookie里面有没有这个session,如果也没有,说明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到web服务器B,这样就可以实现session的同步了。
说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的。

三,利用memcache同步session
memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的sessoin都可以放到这个”内存池”中,其他的都可以使用。
优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。
缺点:memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

四,总结
上面三种方法都是可行的
第一种方法,最影响系统速度的那种,不推荐使用;
第二种方法,效果不错,不过安全隐患一样的存在;
第三种方法,个人觉得第三种方法是最好的,推荐大家使用;

大数据究竟是什么?

在写这篇文章之前,我发现身边很多IT人对于这些热门的新技术、新趋势往往趋之若鹜却又很难说的透彻,如果你问他大数据和你有什么关系?估计很少能 说出一二三来。究其原因,一是因为大家对新技术有着相同的原始渴求,至少知其然在聊天时不会显得很“土鳖”;二是在工作和生活环境中真正能参与实践大数据 的案例实在太少了,所以大家没有必要花时间去知其所以然。

我希望有些不一样,所以对该如何去认识大数据进行了一番思索,包括查阅了资料,翻阅了最新的专业书籍,但我并不想把那些零散的资料碎片或不同理解论述简单规整并堆积起来形成毫无价值的转述或评论,我很真诚的希望进入事物探寻本质。

如果你说大数据就是数据大,或者侃侃而谈4个V,也许很有深度的谈到BI或预测的价值,又或者拿Google和Amazon举例,技术流可能会聊起 Hadoop和Cloud Computing,不管对错,只是无法勾勒对大数据的整体认识,不说是片面,但至少有些管窥蠡测、隔衣瘙痒了。……也许,“解构”是最好的方法。

怎样结构大数据?

首先,我认为大数据就是互联网发展到现今阶段的一种表象或特征而已,没有必要神话它或对它保持敬畏之心,在以云计算为代表的技术创新大幕的衬托下,这些原本很难收集和使用的数据开始容易被利用起来了,通过各行各业的不断创新,大数据会逐步为人类创造更多的价值。

其次,想要系统的认知大数据,必须要全面而细致的分解它,我着手从三个层面来展开:

36大数据

第一层面是理论,理论是认知的必经途径,也是被广泛认同和传播的基线。我会从大数据的特征定义理解行业对大数据的整体描绘和定性;从对大数据价值的 探讨来深入解析大数据的珍贵所在;从对大数据的现在和未来去洞悉大数据的发展趋势;从大数据隐私这个特别而重要的视角审视人和数据之间的长久博弈。

第二层面是技术,技术是大数据价值体现的手段和前进的基石。我将分别从云计算、分布式处理技术、存储技术和感知技术的发展来说明大数据从采集、处理、存储到形成结果的整个过程。

第三层面是实践,实践是大数据的最终价值体现。我将分别从互联网的大数据,政府的大数据,企业的大数据和个人的大数据四个方面来描绘大数据已经展现的美好景象及即将实现的蓝图。

 和大数据相关的理论

Ø 特征定义

最早提出大数据时代到来的是麦肯锡:“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。人们对于海量数据的挖掘和运用,预示着新一波生产率增长和消费者盈余浪潮的到来。”

业界(IBM 最早定义)将大数据的特征归纳为4个“V”(量Volume,多样Variety,价值Value,速Velocity),或者说特点有四个层面:第一, 数据体量巨大。大数据的起始计量单位至少是P(1000个T)、E(100万个T)或Z(10亿个T);第二,数据类型繁多。比如,网络日志、视频、图 片、地理位置信息等等。第三,价值密度低,商业价值高。第四,处理速度快。最后这一点也是和传统的数据挖掘技术有着本质的不同。

其实这些V并不能真正说清楚大数据的所有特征,下面这张图对大数据的一些相关特性做出了有效的说明。

36大数据

古语云:三分技术,七分数据,得数据者得天下。先不论谁说的,但是这句话的正确性已经不用去论证了。维克托·迈尔-舍恩伯格在《大数据时代》一书中 举了百般例证,都是为了说明一个道理:在大数据时代已经到来的时候要用大数据思维去发掘大数据的潜在价值。书中,作者提及最多的是Google如何利用人 们的搜索记录挖掘数据二次利用价值,比如预测某地流感爆发的趋势;Amazon如何利用用户的购买和浏览历史数据进行有针对性的书籍购买推荐,以此有效提 升销售量;Farecast如何利用过去十年所有的航线机票价格打折数据,来预测用户购买机票的时机是否合适。

那么,什么是大数据思维?维克托·迈尔-舍恩伯格认为,1-需要全部数据样本而不是抽样;2-关注效率而不是精确度;3-关注相关性而不是因果关系。

阿里巴巴的王坚对于大数据也有一些独特的见解,比如,

“今天的数据不是大,真正有意思的是数据变得在线了,这个恰恰是互联网的特点。”
“非互联网时期的产品,功能一定是它的价值,今天互联网的产品,数据一定是它的价值。”
“你千万不要想着拿数据去改进一个业务,这不是大数据。你一定是去做了一件以前做不了的事情。”

特别是最后一点,我是非常认同的,大数据的真正价值在于创造,在于填补无数个还未实现过的空白。

有人把数据比喻为蕴藏能量的煤矿。煤炭按照性质有焦煤、无烟煤、肥煤、贫煤等分类,而露天煤矿、深山煤矿的挖掘成本又不一样。与此类似,大数据并不在“大”,而在于“有用”。价值含量、挖掘成本比数量更为重要。

Ø 价值探讨

大数据是什么?投资者眼里是金光闪闪的两个字:资产。比如,Facebook上市时,评估机构评定的有效资产中大部分都是其社交网站上的数据。

如果把大数据比作一种产业,那么这种产业实现盈利的关键,在于提高对数据的“加工能力”,通过“加工”实现数据的“增值”。

Target 超市以20多种怀孕期间孕妇可能会购买的商品为基础,将所有用户的购买记录作为数据来源,通过构建模型分析购买者的行为相关性,能准确的推断出孕妇的具体临盆时间,这样Target的销售部门就可以有针对的在每个怀孕顾客的不同阶段寄送相应的产品优惠卷。

Target的例子是一个很典型的案例,这样印证了维克托·迈尔-舍恩伯格提过的一个很有指导意义的观点:通过找出一个关联物并监控它,就可以预测 未来。Target通过监测购买者购买商品的时间和品种来准确预测顾客的孕期,这就是对数据的二次利用的典型案例。如果,我们通过采集驾驶员手机的GPS 数据,就可以分析出当前哪些道路正在堵车,并可以及时发布道路交通提醒;通过采集汽车的GPS位置数据,就可以分析城市的哪些区域停车较多,这也代表该区 域有着较为活跃的人群,这些分析数据适合卖给广告投放商。

不管大数据的核心价值是不是预测,但是基于大数据形成决策的模式已经为不少的企业带来了盈利和声誉。

从大数据的价值链条来分析,存在三种模式:

1- 手握大数据,但是没有利用好;比较典型的是金融机构,电信行业,政府机构等。

2- 没有数据,但是知道如何帮助有数据的人利用它;比较典型的是IT咨询和服务企业,比如,埃森哲,IBM,Oracle等。

3- 既有数据,又有大数据思维;比较典型的是Google,Amazon,Mastercard等。

未来在大数据领域最具有价值的是两种事物:1-拥有大数据思维的人,这种人可以将大数据的潜在价值转化为实际利益;2-还未有被大数据触及过的业务领域。这些是还未被挖掘的油井,金矿,是所谓的蓝海。

Wal-Mart作为零售行业的巨头,他们的分析人员会对每个阶段的销售记录进行了全面的分析,有一次他们无意中发现虽不相关但很有价值的数据,在 美国的飓风来临季节,超市的蛋挞和抵御飓风物品竟然销量都有大幅增加,于是他们做了一个明智决策,就是将蛋挞的销售位置移到了飓风物品销售区域旁边,看起 来是为了方便用户挑选,但是没有想到蛋挞的销量因此又提高了很多。

还有一个有趣的例子,1948年辽沈战役期间,司令员林彪要求每天要进行例常的“每日军情汇报”,由值班参谋读出下属各个纵队、师、团用电台报告的 当日战况和缴获情况。那几乎是重复着千篇一律枯燥无味的数据:每支部队歼敌多少、俘虏多少;缴获的火炮、车辆多少,枪支、物资多少……有一天,参谋照例汇 报当日的战况,林彪突然打断他:“刚才念的在胡家窝棚那个战斗的缴获,你们听到了吗?”大家都很茫然,因为如此战斗每天都有几十起,不都是差不多一模一样 的枯燥数字吗?林彪扫视一周,见无人回答,便接连问了三句:“为什么那里缴获的短枪与长枪的比例比其它战斗略高?”“为什么那里缴获和击毁的小车与大车的 比例比其它战斗略高?”“为什么在那里俘虏和击毙的军官与士兵的比例比其它战斗略高?”林彪司令员大步走向挂满军用地图的墙壁,指着地图上的那个点说: “我猜想,不,我断定!敌人的指挥所就在这里!”果然,部队很快就抓住了敌方的指挥官廖耀湘,并取得这场重要战役的胜利。

这些例子真实的反映在各行各业,探求数据价值取决于把握数据的人,关键是人的数据思维;与其说是大数据创造了价值,不如说是大数据思维触发了新的价值增长。

Ø 现在和未来

我们先看看大数据在当下有怎样的杰出表现:

  • 大数据帮助政府实现市场经济调控、公共卫生安全防范、灾难预警、社会舆论监督;
  • 大数据帮助城市预防犯罪,实现智慧交通,提升紧急应急能力;
  • 大数据帮助医疗机构建立患者的疾病风险跟踪机制,帮助医药企业提升药品的临床使用效果,帮助艾滋病研究机构为患者提供定制的药物;
  • 大数据帮助航空公司节省运营成本,帮助电信企业实现售后服务质量提升,帮助保险企业识别欺诈骗保行为,帮助快递公司监测分析运输车辆的故障险情以提前预警维修,帮助电力公司有效识别预警即将发生故障的设备;
  • 大数据帮助电商公司向用户推荐商品和服务,帮助旅游网站为旅游者提供心仪的旅游路线,帮助二手市场的买卖双方找到最合适的交易目标,帮助用户找到最合适的商品购买时期、商家和最优惠价格;
  • 大数据帮助企业提升营销的针对性,降低物流和库存的成本,减少投资的风险,以及帮助企业提升广告投放精准度;
  • 大数据帮助娱乐行业预测歌手,歌曲,电影,电视剧的受欢迎程度,并为投资者分析评估拍一部电影需要投入多少钱才最合适,否则就有可能收不回成本;
  • 大数据帮助社交网站提供更准确的好友推荐,为用户提供更精准的企业招聘信息,向用户推荐可能喜欢的游戏以及适合购买的商品。

其实,这些还远远不够,未来大数据的身影应该无处不在,就算无法准确预测大数据终会将人类社会带往到哪种最终形态,但我相信只要发展脚步在继续,因大数据而产生的变革浪潮将很快淹没地球的每一个角落。

比如,Amazon的最终期望是:“最成功的书籍推荐应该只有一本书,就是用户要买的下一本书。”

Google也希望当用户在搜索时,最好的体验是搜索结果只包含用户所需要的内容,而这并不需要用户给予Google太多的提示。

而当物联网发展到达一定规模时,借助条形码、二维码、RFID等能够唯一标识产品,传感器、可穿戴设备、智能感知、视频采集、增强现实等技术可实现 实时的信息采集和分析,这些数据能够支撑智慧城市,智慧交通,智慧能源,智慧医疗,智慧环保的理念需要,这些都所谓的智慧将是大数据的采集数据来源和服务 范围。

未来的大数据除了将更好的解决社会问题,商业营销问题,科学技术问题,还有一个可预见的趋势是以人为本的大数据方针。人才是地球的主宰,大部分的数据都与人类有关,要通过大数据解决人的问题。

比如,建立个人的数据中心,将每个人的日常生活习惯,身体体征,社会网络,知识能力,爱好性情,疾病嗜好,情绪波动……换言之就是记录人从出生那一刻起的每一分每一秒,将除了思维外的一切都储存下来,这些数据可以被充分的利用:

  • 医疗机构将实时的监测用户的身体健康状况;
  • 教育机构更有针对的制定用户喜欢的教育培训计划;
  • 服务行业为用户提供即时健康的符合用户生活习惯的食物和其它服务;
  • 社交网络能为你提供合适的交友对象,并为志同道合的人群组织各种聚会活动;
  • 政府能在用户的心理健康出现问题时有效的干预,防范自杀,刑事案件的发生;
  • 金融机构能帮助用户进行有效的理财管理,为用户的资金提供更有效的使用建议和规划;
  • 道路交通、汽车租赁及运输行业可以为用户提供更合适的出行线路和路途服务安排;

……

当然,上面的一切看起来都很美好,但是否是以牺牲了用户的自由为前提呢?只能说当新鲜事物带来了革新的同时也同样带来了“病菌”。比如,在手机未普 及前,大家喜欢聚在一起聊天,自从手机普及后特别是有了互联网,大家不用聚在一起也可以随时随地的聊天,只是“病菌”滋生了另外一种情形,大家慢慢习惯了 和手机共渡时光,人与人之间情感交流仿佛永远隔着一张“网”。

Ø 大数据隐私

你或许并不敏感,当你在不同的网站上注册了个人信息后,可能这些信息已经被扩散出去了,当你莫名其妙的接到各种邮件,电话,短信的滋扰时,你不会想 到自己的电话号码,邮箱,生日,购买记录,收入水平,家庭住址,亲朋好友等私人信息早就被各种商业机构非法存储或贱卖给其它任何有需要的企业或个人了。

更可怕的是,这些信息你永远无法删除,它们永远存在于互联网的某些你不知道的角落。除非你更换掉自己的所有信息,但是这代价太大了。

用户隐私问题一直是大数据应用难以绕开的一个问题,如被央视曝光过的分众无线、罗维邓白氏以及网易邮箱都涉及侵犯用户隐私。目前,中国并没有专门的 法律法规来界定用户隐私,处理相关问题时多采用其他相关法规条例来解释。但随着民众隐私意识的日益增强,合法合规地获取数据、分析数据和应用数据,是进行 大数据分析时必须遵循的原则。

说到隐私被侵犯,爱德华•斯诺登应该占据一席之地,这位前美国中央情报局(CIA)雇员一手引爆了美国“棱镜计划”(PRISM)的内幕消息。“棱 镜”项目是一项由美国国家安全局(NSA)自2007年起开始实施的绝密电子监听计划,年耗资近2000亿美元,用于监听全美电话通话记录,据称还可以使 情报人员通过“后门”进入9家主要科技公司的服务器,包括微软、雅虎、谷歌、Facebook、PalTalk、美国在线、Skype、YouTube、 苹果。这个事件引发了人们对政府使用大数据时对公民隐私侵犯的担心。

再看看我们身边,当微博,微信,QQ空间这些社交平台肆意的吞噬着数亿用户的各种信息时,你就不要指望你还有隐私权了,就算你在某个地方删除了,但也许这些信息已经被其他人转载或保存了,更有可能已经被百度或Google存为快照,早就提供给任意用户搜索了。
因此在大数据的背景下,很多人都在积极的抵制无底线的数字化,这种大数据和个体之间的博弈还会一直继续下去……

专家给予了我们一些如何有效保护大数据背景下隐私权的建议:1-减少信息的数字化;2-隐私权立法;3-数字隐私权基础设施(类似DRM数字版权管理);4-人类改变认知(接受忽略过去);5-创造良性的信息生态;6-语境化。

但是这些都很难立即见效或者有实质性的改善。

比如,现在有一种职业叫删帖人,专门负责帮人到各大网站删帖,删除评论。其实这些人就是通过黑客技术侵入各大网站,破获管理员的密码然后进行手工定 向删除。只不过他们保护的不是客户的隐私,而大多是丑闻。还有一种职业叫人肉专家,他们负责从互联网上找到一个与他们根本就无关系用户的任意信息。这是很 可怕的事情,也就是说,如果有人想找到你,只需要两个条件:1-你上过网,留下过痕迹;2-你的亲朋好友或仅仅是认识你的人上过网,留下过你的痕迹。这两 个条件满足其一,人肉专家就可以很轻松的找到你,可能还知道你现在正在某个餐厅和谁一起共进晚餐。

当很多互联网企业意识到隐私对于用户的重要性时,为了继续得到用户的信任,他们采取了很多办法,比如google承诺仅保留用户的搜索记录9个月,浏览器厂商提供了无痕冲浪模式,社交网站拒绝公共搜索引擎的爬虫进入,并将提供出去的数据全部采取匿名方式处理等。

在这种复杂的环境里面,很多人依然没有建立对于信息隐私的保护意识,让自己一直处于被滋扰,被精心设计,被利用,被监视的处境中。可是,我们能做的 几乎微乎其微,因为个人隐私数据已经无法由我们自己掌控了,就像一首诗里说到的:“如果你现在继续麻木,那就别指望这麻木能抵挡得住被”扒光”那一刻的惊 恐和绝望……”

 和大数据相关的技术

Ø 云技术

大数据常和云计算联系到一起,因为实时的大型数据集分析需要分布式处理框架来向数十、数百或甚至数万的电脑分配工作。可以说,云计算充当了工业革命时期的发动机的角色,而大数据则是电。

云计算思想的起源是麦卡锡在上世纪60年代提出的:把计算能力作为一种像水和电一样的公用事业提供给用户。

如今,在Google、Amazon、Facebook等一批互联网企业引领下,一种行之有效的模式出现了:云计算提供基础架构平台,大数据应用运行在这个平台上。

业内是这么形容两者的关系:没有大数据的信息积淀,则云计算的计算能力再强大,也难以找到用武之地;没有云计算的处理能力,则大数据的信息积淀再丰富,也终究只是镜花水月。

那么大数据到底需要哪些云计算技术呢?

这里暂且列举一些,比如虚拟化技术,分布式处理技术,海量数据的存储和管理技术,NoSQL、实时流数据处理、智能分析技术(类似模式识别以及自然语言理解)等。

云计算和大数据之间的关系可以用下面的一张图来说明,两者之间结合后会产生如下效应:可以提供更多基于海量业务数据的创新型服务;通过云计算技术的不断发展降低大数据业务的创新成本。

36大数据

如果将云计算与大数据进行一些比较,最明显的区分在两个方面:

第一,在概念上两者有所不同,云计算改变了IT,而大数据则改变了业务。然而大数据必须有云作为基础架构,才能得以顺畅运营。

第二,大数据和云计算的目标受众不同,云计算是CIO等关心的技术层,是一个进阶的IT解决方案。而大数据是CEO关注的、是业务层的产品,而大数据的决策者是业务层。

Ø 分布式处理技术

分布式处理系统可以将不同地点的或具有不同功能的或拥有不同数据的多台计算机用通信网络连接起来,在控制系统的统一管理控制下,协调地完成信息处理任务—这就是分布式处理系统的定义。

以Hadoop(Yahoo)为例进行说明,Hadoop是一个实现了MapReduce模式的能够对大量数据进行分布式处理的软件框架,是以一种可靠、高效、可伸缩的方式进行处理的。

而MapReduce是Google提出的一种云计算的核心计算模式,是一种分布式运算技术,也是简化的分布式编程模式,MapReduce模式的 主要思想是将自动分割要执行的问题(例如程序)拆解成map(映射)和reduce(化简)的方式, 在数据被分割后通过Map 函数的程序将数据映射成不同的区块,分配给计算机机群处理达到分布式运算的效果,在通过Reduce 函数的程序将结果汇整,从而输出开发者需要的结果。

再来看看Hadoop的特性,第一,它是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处 理。其次,Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。Hadoop 还是可伸缩的,能够处理 PB 级数据。此外,Hadoop 依赖于社区服务器,因此它的成本比较低,任何人都可以使用。

你也可以这么理解Hadoop的构成,Hadoop=HDFS(文件系统,数据存储技术相关)+HBase(数据库)+MapReduce(数据处理)+……Others

Hadoop用到的一些技术有:

  • HDFS: Hadoop分布式文件系统(Distributed File System) - HDFS (HadoopDistributed File System)
  • MapReduce:并行计算框架
  • HBase: 类似Google BigTable的分布式NoSQL列数据库。
  • Hive:数据仓库工具,由Facebook贡献。
  • Zookeeper:分布式锁设施,提供类似Google Chubby的功能,由Facebook贡献。
  • Avro:新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制。
  • Pig:大数据分析平台,为用户提供多种接口。
  • Ambari:Hadoop管理工具,可以快捷的监控、部署、管理集群。
  • Sqoop:用于在Hadoop与传统的数据库间进行数据的传递。

说了这么多,举个实际的例子,虽然这个例子有些陈旧,但是淘宝的海量数据技术架构还是有助于我们理解对于大数据的运作处理机制:

淘宝大数据

如上图所示,淘宝的海量数据产品技术架构分为五个层次,从上至下来看它们分别是:数据源,计算层,存储层,查询层和产品层。

数据来源层。存放着淘宝各店的交易数据。在数据源层产生的数据,通过DataX,DbSync和Timetunel准实时的传输到下面第2点所述的“云梯”。
计算层。在这个计算层内,淘宝采用的是Hadoop集群,这个集群,我们暂且称之为云梯,是计算层的主要组成部分。在云梯上,系统每天会对数据产品进行不同的MapReduce计算。
存储层。在这一层,淘宝采用了两个东西,一个使MyFox,一个是Prom。MyFox是基于MySQL的分布式关系型数据库的集群,Prom是基于Hadoop Hbase技术的一个NoSQL的存储集群。
查询层。在这一层中,Glider是以HTTP协议对外提供restful方式的接口。数据产品通过一个唯一的URL来获取到它想要的数据。同时,数据查询即是通过MyFox来查询的。

最后一层是产品层,这个就不用解释了。

Ø 存储技术

大数据可以抽象的分为大数据存储和大数据分析,这两者的关系是:大数据存储的目的是支撑大数据分析。到目前为止,还是两种截然不同的计算机技术领域:大数据存储致力于研发可以扩展至PB甚至EB级别的数据存储平台;大数据分析关注在最短时间内处理大量不同类型的数据集。

提到存储,有一个著名的摩尔定律相信大家都听过:18个月集成电路的复杂性就增加一倍。所以,存储器的成本大约每18-24个月就下降一半。成本的不断下降也造就了大数据的可存储性。

比如,Google大约管理着超过50万台服务器和100万块硬盘,而且Google还在不断的扩大计算能力和存储能力,其中很多的扩展都是基于在廉价服务器和普通存储硬盘的基础上进行的,这大大降低了其服务成本,因此可以将更多的资金投入到技术的研发当中。

以Amazon举例,Amazon S3 是一种面向 Internet 的存储服务。该服务旨在让开发人员能更轻松的进行网络规模计算。Amazon S3 提供一个简明的 Web 服务界面,用户可通过它随时在 Web 上的任何位置存储和检索的任意大小的数据。 此服务让所有开发人员都能访问同一个具备高扩展性、可靠性、安全性和快速价廉的基础设施,Amazon 用它来运行其全球的网站网络。再看看S3的设计指标:在特定年度内为数据元提供 99.999999999% 的耐久性和 99.99% 的可用性,并能够承受两个设施中的数据同时丢失。

S3很成功也确实卓有成效,S3云的存储对象已达到万亿级别,而且性能表现相当良好。S3云已经拥万亿跨地域存储对象,同时AWS的对象执行请求也 达到百万的峰值数量。目前全球范围内已经有数以十万计的企业在通过AWS运行自己的全部或者部分日常业务。这些企业用户遍布190多个国家,几乎世界上的 每个角落都有Amazon用户的身影。

Ø 感知技术

大数据的采集和感知技术的发展是紧密联系的。以传感器技术,指纹识别技术,RFID技术,坐标定位技术等为基础的感知能力提升同样是物联网发展的基 石。全世界的工业设备、汽车、电表上有着无数的数码传感器,随时测量和传递着有关位置、运动、震动、温度、湿度乃至空气中化学物质的变化,都会产生海量的 数据信息。

而随着智能手机的普及,感知技术可谓迎来了发展的高峰期,除了地理位置信息被广泛的应用外,一些新的感知手段也开始登上舞台,比如,最新 的”iPhone 5S”在home键内嵌指纹传感器,新型手机可通过呼气直接检测燃烧脂肪量,用于手机的嗅觉传感器面世可以监测从空气污染到危险的化学药品,微软正在研发 可感知用户当前心情智能手机技术,谷歌眼镜InSight新技术可通过衣着进行人物识别。

除此之外,还有很多与感知相关的技术革新让我们耳目一新:比如,牙齿传感器实时监控口腔活动及饮食状况,婴儿穿戴设备可用大数据去养育宝 宝,Intel正研发3D笔记本摄像头可追踪眼球读懂情绪,日本公司开发新型可监控用户心率的纺织材料,业界正在尝试将生物测定技术引入支付领域等。

其实,这些感知被逐渐捕获的过程就是就世界被数据化的过程,一旦世界被完全数据化了,那么世界的本质也就是信息了。

就像一句名言所说,“人类以前延续的是文明,现在传承的是信息。”

大数据的实践

Ø 互联网的大数据

互联网上的数据每年增长50%,每两年便将翻一番,而目前世界上90%以上的数据是最近几年才产生的。据IDC预测,到2020年全球将总共拥有 35ZB的数据量。互联网是大数据发展的前哨阵地,随着WEB2.0时代的发展,人们似乎都习惯了将自己的生活通过网络进行数据化,方便分享以及记录并回 忆。

互联网上的大数据很难清晰的界定分类界限,我们先看看BAT的大数据:

百度拥有两种类型的大数据:用户搜索表征的需求数据;爬虫和阿拉丁获取的公共web数据。搜索巨头百度围绕数据而生。它对网页数据的爬取、网页内容 的组织和解析,通过语义分析对搜索需求的精准理解进而从海量数据中找准结果,以及精准的搜索引擎关键字广告,实质上就是一个数据的获取、组织、分析和挖掘 的过程。搜索引擎在大数据时代面临的挑战有:更多的暗网数据;更多的WEB化但是没有结构化的数据;更多的WEB化、结构化但是封闭的数据。

阿里巴巴拥有交易数据和信用数据。这两种数据更容易变现,挖掘出商业价值。除此之外阿里巴巴还通过投资等方式掌握了部分社交数据、移动数据。如微博和高德。

腾讯拥有用户关系数据和基于此产生的社交数据。这些数据可以分析人们的生活和行为,从里面挖掘出政治、社会、文化、商业、健康等领域的信息,甚至预测未来。

在信息技术更为发达的美国,除了行业知名的类似Google,Facebook外,已经涌现了很多大数据类型的公司,它们专门经营数据产品,比如:

  • Metamarkets:这家公司对Twitter、支付、签到和一些与互联网相关的问题进行了分析,为客户提供了很好的数据分析支持。
  • Tableau:他们的精力主要集中于将海量数据以可视化的方式展现出来。Tableau为数字媒体提供了一个新的展示数据的方式。他们提供了一个免费工具,任何人在没有编程知识背景的情况下都能制造出数据专用图表。这个软件还能对数据进行分析,并提供有价值的建议。
  • ParAccel:他们向美国执法机构提供了数据分析,比如对15000个有犯罪前科的人进行跟踪,从而向执法机构提供了参考性较高的犯罪预测。他们是犯罪的预言者。
  • QlikTech:QlikTech旗下的Qlikview是一个商业智能领域的自主服务工具,能够应用于科学研究和艺术等领域。为了帮助开发者对这些数据进行分析,QlikTech提供了对原始数据进行可视化处理等功能的工具。
  • GoodData:GoodData希望帮助客户从数据中挖掘财富。这家创业公司主要面向商业用户和IT企业高管,提供数据存储、性能报告、数据分析等工具。
  • TellApart:TellApart和电商公司进行合作,他们会根据用户的浏览行为等数据进行分析,通过锁定潜在买家方式提高电商企业的收入。
  • DataSift:DataSift主要收集并分析社交网络媒体上的数据,并帮助品牌公司掌握突发新闻的舆论点,并制定有针对性的营销方案。这家公司还和Twitter有合作协议,使得自己变成了行业中为数不多可以分析早期tweet的创业公司。
  • Datahero:公司的目标是将复杂的数据变得更加简单明了,方便普通人去理解和想象。

举了很多例子,这里简要归纳一下,在互联网大数据的典型代表性包括:

1-用户行为数据(精准广告投放、内容推荐、行为习惯和喜好分析、产品优化等)
2-用户消费数据(精准营销、信用记录分析、活动促销、理财等)
3-用户地理位置数据(O2O推广,商家推荐,交友推荐等)
4-互联网金融数据(P2P,小额贷款,支付,信用,供应链金融等)
5-用户社交等UGC数据(趋势分析、流行元素分析、受欢迎程度分析、舆论监控分析、社会问题分析等)

Ø 政府的大数据

近期,奥巴马政府宣布投资2亿美元拉动大数据相关产业发展,将“大数据战略”上升为国家意志。奥巴马政府将数据定义为“未来的新石油”,并表示一个 国家拥有数据的规模、活性及解释运用的能力将成为综合国力的重要组成部分,未来,对数据的占有和控制甚至将成为陆权、海权、空权之外的另一种国家核心资 产。

在国内,政府各个部门都握有构成社会基础的原始数据,比如,气象数据,金融数据,信用数据,电力数据,煤气数据,自来水数据,道路交通数据,客运数 据,安全刑事案件数据,住房数据,海关数据,出入境数据,旅游数据,医疗数据,教育数据,环保数据等等。这些数据在每个政府部门里面看起来是单一的,静态 的。但是,如果政府可以将这些数据关联起来,并对这些数据进行有效的关联分析和统一管理,这些数据必定将获得新生,其价值是无法估量的。

具体来说,现在城市都在走向智能和智慧,比如,智能电网、智慧交通、智慧医疗、智慧环保、智慧城市,这些都依托于大数据,可以说大数据是智慧的核心 能源。从国内整体投资规模来看,到2012年底全国开建智慧城市的城市数超过180个,通信网络和数据平台等基础设施建设投资规模接近5000亿元。“十 二五”期间智慧城市建设拉动的设备投资规模将达1万亿元人民币。大数据为智慧城市的各个领域提供决策支持。在城市规划方面,通过对城市地理、气象等自然信 息和经济、社会、文化、人口等人文社会信息的挖掘,可以为城市规划提供决策,强化城市管理服务的科学性和前瞻性。在交通管理方面,通过对道路交通信息的实 时挖掘,能有效缓解交通拥堵,并快速响应突发状况,为城市交通的良性运转提供科学的决策依据。在舆情监控方面,通过网络关键词搜索及语义智能分析,能提高 舆情分析的及时性、全面性,全面掌握社情民意,提高公共服务能力,应对网络突发的公共事件,打击违法犯罪。在安防与防灾领域,通过大数据的挖掘,可以及时 发现人为或自然灾害、恐怖事件,提高应急处理能力和安全防范能力。

另外,作为国家的管理者,政府应该有勇气将手中的数据逐步开放,供给更多有能力的机构组织或个人来分析并加以利用,以加速造福人类。比如,美国政府 就筹建了一个data.gov网站,这是奥巴马任期内的一个重要举措:要求政府公开透明,而核心就是实现政府机构的数据公开。截止目前,已经开放了有 91054 个datasets;349citizen-developed apps;137 mobile apps;175 agencies and subagencies;87 galleries;295 Government APIs。

Ø 企业的大数据

企业的CXO们最关注的还是报表曲线的背后能有怎样的信息,他该做怎样的决策,其实这一切都需要通过数据来传递和支撑。在理想的世界中,大数据是巨 大的杠杆,可以改变公司的影响力,带来竞争差异、节省金钱、增加利润、愉悦买家、奖赏忠诚用户、将潜在客户转化为客户、增加吸引力、打败竞争对手、开拓用 户群并创造市场。

那么,哪些传统企业最需要大数据服务呢?抛砖引玉,先举几个例子:1) 对大量消费者提供产品或服务的企业(精准营销);2) 做小而美模式的中长尾企业(服务转型);3) 面临互联网压力之下必须转型的传统企业(生死存亡)。

对于企业的大数据,还有一种预测:随着数据逐渐成为企业的一种资产,数据产业会向传统企业的供应链模式发展,最终形成“数据供应链”。这里尤其有两 个明显的现象:1) 外部数据的重要性日益超过内部数据。在互联互通的互联网时代,单一企业的内部数据与整个互联网数据比较起来只是沧海一粟;2) 能提供包括数据供应、数据整合与加工、数据应用等多环节服务的公司会有明显的综合竞争优势。

对于提供大数据服务的企业来说,他们等待的是合作机会,就像微软史密斯说的:“给我提供一些数据,我就能做一些改变。如果给我提供所有数据,我就能拯救世界。”

然而,一直做企业服务的巨头将优势不在,不得不眼看新兴互联网企业加入战局,开启残酷竞争模式。为何会出现这种局面?从 IT 产业的发展来看,第一代 IT 巨头大多是 ToB 的,比如 IBM、Microsoft、Oracle、SAP、HP这类传统 IT 企业;第二代 IT 巨头大多是ToC 的,比如 Yahoo、Google、Amazon、Facebook 这类互联网企业。大数据到来前,这两类公司彼此之间基本是井水不犯河水;但在当前这个大数据时代,这两类公司已经开始直接竞争。比如 Amazon 已经开始提供云模式的数据仓库服务,直接抢占 IBM、Oracle 的市场。这个现象出现的本质原因是:在互联网巨头的带动下,传统 IT 巨头的客户普遍开始从事电子商务业务,正是由于客户进入了互联网,所以传统 IT 巨头们不情愿地被拖入了互联网领域。如果他们不进入互联网,他们业务必将萎缩。在进入互联网后,他们又必须将云技术,大数据等互联网最具有优势的技术通过 封装打造成自己的产品再提供给企业。

以IBM举例,上一个十年,他们抛弃了PC,成功转向了软件和服务,而这次将远离服务与咨询,更多地专注于因大数据分析软件而带来的全新业务增长 点。IBM执行总裁罗睿兰认为,“数据将成为一切行业当中决定胜负的根本因素,最终数据将成为人类至关重要的自然资源。”IBM积极的提出了“大数据平 台”架构。该平台的四大核心能力包括Hadoop系统、流计算(StreamComputing)、数据仓库(Data Warehouse)和信息整合与治理(Information Integration and Governance)

IBM大数据

另外一家亟待通过云和大数据战略而复苏的巨头公司HP也推出了自己的产品:HAVEn,一个可以自由扩展伸缩的大数据解决方案。这个解决方案由HP Autonomy、HP Vertica、HP ArcSight 和惠普运营管理(HP OperationsManagement)四大技术组成。还支持Hadoop这样通用的技术。HAVEn不是一个软件平台,而是一个生态环境。四大组成 部分满足不同的应用场景需要,Autonomy解决音视频识别的重要解决方案;Vertica解决数据处理的速度和效率的方案;ArcSight解决机器 的记录信息处理,帮助企业获得更高安全级别的管理;运营管理解决的不仅仅是外部数据的处理,而是包括了IT基础设施产生的数据。

36大数据
Ø 个人的大数据

个人的大数据这个概念很少有人提及,简单来说,就是与个人相关联的各种有价值数据信息被有效采集后,可由本人授权提供第三方进行处理和使用,并获得第三方提供的数据服务。

举个例子来说明会更清晰一些:

未来,每个用户可以在互联网上注册个人的数据中心,以存储个人的大数据信息。用户可确定哪些个人数据可被采集,并通过可穿戴设备或植入芯片等感知技 术来采集捕获个人的大数据,比如,牙齿监控数据,心率数据,体温数据,视力数据,记忆能力,地理位置信息,社会关系数据,运动数据,饮食数据,购物数据等 等。用户可以将其中的牙齿监测数据授权给XX牙科诊所使用,由他们监控和使用这些数据,进而为用户制定有效的牙齿防治和维护计划;也可以将个人的运动数据 授权提供给某运动健身机构,由他们监测自己的身体运动机能,并有针对的制定和调整个人的运动计划;还可以将个人的消费数据授权给金融理财机构,由他们帮你 制定合理的理财计划并对收益进行预测。当然,其中有一部分个人数据是无需个人授权即可提供给国家相关部门进行实时监控的,比如罪案预防监控中心可以实时的 监控本地区每个人的情绪和心理状态,以预防自杀和犯罪的发生。

以个人为中心的大数据有这么一些特性:

1- 数据仅留存在个人中心,其它第三方机构只被授权使用(数据有一定的使用期限),且必须接受用后即焚的监管。
2- 采集个人数据应该明确分类,除了国家立法明确要求接受监控的数据外,其它类型数据都由用户自己决定是否被采集。
3- 数据的使用将只能由用户进行授权,数据中心可帮助监控个人数据的整个生命周期。

展望过于美好,也许实现个人数据中心将遥遥无期,也许这还不是解决个人数据隐私的最好方法,也许业界对大数据的无限渴求会阻止数据个人中心的实现, 但是随着数据越来越多,在缺乏监管之后,必然会有一场激烈的博弈:到底是数据重要还是隐私重要;是以商业为中心还是以个人为中心。

自:36大数据

cal – 显示日历

用途说明

cal命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。“阳历”又名“太阳历”,系以地球绕行太阳一周为 一年,为西方各国所通用,故又名“西历”。我国从辛亥革命后即自民国元年采用阳历,故又名曰“国历”。为与我国旧有之历相对称,故又名曰“新历”。 1949年正式规定公元纪年。

公历的前身是古罗马凯撒修订的儒略历。根据儒略历的规定,每4年有1个闰年,闰年为366日,其余3年(称为平年)各有365日。公元年数能被 4除得尽的是闰年。儒略历1年平均长365.25 日,比实际公转周期的365.2422日长11分14秒,即每400年约长3日。这样到公元16世纪时已经积累了有10天误差。可以明显感觉到两至两分提 前了。在此情况下,教皇格列高里十三世于1582年宣布改历。先是一步到位把儒略历1582年10月4日的下一天定为格列历10月15日,中间跳过10 天。同时修改了儒略历置闰法则。除了保留儒略历年数被4除尽的是闰年外。增加了被100除得尽而被400除不尽的则不是闰年的规定。这样的做法可在400 年中减少3个闰年。在格列高里历历法里,400年中有97个闰年(每年366日)及303个平年(每年365日),所以每年平均长365.2425日,与 公转周期的365.2422日十分接近。可基本保证到公元5000年前误差不超过1天。

常用参数

cal命令不带参数只显示当前月份的日历。

-1      显示一个月的月历(Display single month output. This is the default.)
-3      显示系统前一个月,当前月,下一个月的月历(Display prev/current/next month output.)
-s       显示星期天为一个星期的第一天,默认的格式(Display Sunday as the first day of the week. This is the default.)
-m     显示星期一为一个星期的第一天(Display Monday as the first day of the week.)
-j       显示儒略日(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)(Display Julian dates (days one-based, numbered from January 1).)
-y      显示当前年份的日历(Display a calendar for the current year.)

使用示例

示例一 显示当前月份的日历

请见谅,JavaEye显示的比较乱,要是能显示等宽字体就好了。

[root@new55 ~]# cal
十一月 2010
日 一 二 三 四 五 六
1  2  3  4  5  6
7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

[root@new55 ~]# cal -j
十一月 2010
日   一   二   三   四   五   六
305 306 307 308 309 310
311 312 313 314 315 316 317
318 319 320 321 322 323 324
325 326 327 328 329 330 331
332 333 334
注:此处显示自1月1日的天数。
[root@new55 ~]# cal -m
十一月 2010
一 二 三 四 五 六 日
1  2  3  4  5  6  7
8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
注:此处星期一显示在第一列。
[root@new55 ~]#

示例二 显示当前月份及前后月份的日历

[root@new55 ~]# cal -3
十月 2010            十一月 2010           十二月 2010
日 一 二 三 四 五 六  日 一 二 三 四 五 六  日 一 二 三 四 五 六
1  2      1  2  3  4  5  6            1  2  3  4
3  4  5  6  7  8  9   7  8  9 10 11 12 13   5  6  7  8  9 10 11
10 11 12 13 14 15 16  14 15 16 17 18 19 20  12 13 14 15 16 17 18
17 18 19 20 21 22 23  21 22 23 24 25 26 27  19 20 21 22 23 24 25
24 25 26 27 28 29 30  28 29 30              26 27 28 29 30 31
31
[root@new55 ~]#

 

示例三 显示今年的日历

[root@new55 ~]# cal -y
2010

一月                   二月                   三月
日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六
1  2       1  2  3  4  5  6       1  2  3  4  5  6
3  4  5  6  7  8  9    7  8  9 10 11 12 13    7  8  9 10 11 12 13
10 11 12 13 14 15 16   14 15 16 17 18 19 20   14 15 16 17 18 19 20
17 18 19 20 21 22 23   21 22 23 24 25 26 27   21 22 23 24 25 26 27
24 25 26 27 28 29 30   28                     28 29 30 31
31
四月                   五月                   六月
日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六
1  2  3                      1          1  2  3  4  5
4  5  6  7  8  9 10    2  3  4  5  6  7  8    6  7  8  9 10 11 12
11 12 13 14 15 16 17    9 10 11 12 13 14 15   13 14 15 16 17 18 19
18 19 20 21 22 23 24   16 17 18 19 20 21 22   20 21 22 23 24 25 26
25 26 27 28 29 30      23 24 25 26 27 28 29   27 28 29 30
30 31
七月                   八月                   九月
日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六
1  2  3    1  2  3  4  5  6  7             1  2  3  4
4  5  6  7  8  9 10    8  9 10 11 12 13 14    5  6  7  8  9 10 11
11 12 13 14 15 16 17   15 16 17 18 19 20 21   12 13 14 15 16 17 18
18 19 20 21 22 23 24   22 23 24 25 26 27 28   19 20 21 22 23 24 25
25 26 27 28 29 30 31   29 30 31               26 27 28 29 30

十月                  十一月                 十二月
日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六
1  2       1  2  3  4  5  6             1  2  3  4
3  4  5  6  7  8  9    7  8  9 10 11 12 13    5  6  7  8  9 10 11
10 11 12 13 14 15 16   14 15 16 17 18 19 20   12 13 14 15 16 17 18
17 18 19 20 21 22 23   21 22 23 24 25 26 27   19 20 21 22 23 24 25
24 25 26 27 28 29 30   28 29 30               26 27 28 29 30 31
31

[root@new55 ~]#

 

示例四 显示指定年月的日历

[root@new55 ~]# cal 10 2009
十月 2009
日 一 二 三 四 五 六
1  2  3
4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

[root@new55 ~]# cal 9 1752
九月 1752
日 一 二 三 四 五 六
1  2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

注:1752年9月比正常情况少了11天。1582年2月,罗马教廷要求从1582 年10月中减去10天,因此1852年10月4日后面紧跟着就是15日。在意大利、西班牙等国家都这样处理了。其他天主教国家也很快跟着这么做了,但是新 教国家不愿意修改,而且希腊等东正教国家直到20世纪初才修改,所以这个改革在英国及其殖民地(包括美国)在1752年9月才被执行。这样1752 年9月2日后面跟着的就是1752年9月14日。这就是为什么cal会生成上面输出的原因了。

重启openstack的服务命令集合

重启openstack的整个服务

openstack-service restart
  • 1

1. 重启dashboard

service httpd  restart 
service memcached restart
  • 1
  • 2

2. 重启 ceilometer

2.1 cinder

service mongod restart
  • 1

2.2 controller

service  openstack-ceilometer-api  restart    
service openstack-ceilometer-notification restart
service openstack-ceilometer-central  restart
service openstack-ceilometer-collector  restart
service openstack-ceilometer-alarm-evaluator  restart
service openstack-ceilometer-alarm-notifier restart
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.3 compute

service  openstack-nova-compute restart
  • 1

2.4 controller

service  openstack-glance-api restart
service  openstack-glance-registry restart
  • 1
  • 2

Block Storage service

2.5 controller node

service   openstack-cinder-api restart
service   openstack-cinder-scheduler restart
  • 1
  • 2

2.6 cinder

service    openstack-cinder-volume  restart
  • 1

3. 重启Fuel服务

docker restart  fuel-core-6.1-nailgun
docker restart fuel-core-6.1-keystone
docker restart fuel-core-6.1-rsync
docker restart fuel-core-6.1-mcollective
docker restart fuel-core-6.1-ostf
docker restart fuel-core-6.1-astute
docker restart fuel-core-6.1-rsyslog
docker restart fuel-core-6.1-postgres
docker restart fuel-core-6.1-rabbitmq
docker restart fuel-core-6.1-nginx
docker restart fuel-core-6.1-cobbler
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4. 重启 Neutron 服务

4.1 控制节点

service openstack-nova-api restart
service openstack-nova-scheduler restart
service openstack-nova-conductor restart
service neutron-server restart
  • 1
  • 2
  • 3
  • 4

4.2 网络节点

service openvswitch restart
service neutron-openvswitch-agent restart(fuel控制节点默认stop)
service neutron-l3-agent restart(fuel控制节点默认stop)
service neutron-dhcp-agent restart(fuel控制节点默认stop)
service neutron-metadata-agent restart(fuel控制节点默认stop)
  • 1
  • 2
  • 3
  • 4
  • 5

4.3 计算节点

service neutron-openvswitch-agent restart
service openvswitch restart
  • 1
  • 2

5. 重启cinder服务

5.1 控制节点

service openstack-cinder-api restart
service openstack-cinder-scheduler restart
  • 1
  • 2

5.2 存储节点

service openstack-cinder-volume restart
  • 1

6. 重启glance服务

6.1 控制节点

service openstack-glance-api restart
service openstack-glance-registry restart
  • 1
  • 2

7. 重启Swift服务

7.1 控制节点

service openstack-swift-proxy restart
service memcached restart
  • 1
  • 2

7.2 存储节点

service openstack-swift-account restart
service openstack-swift-account-auditor restart
service openstack-swift-account-reaper restart
service openstack-swift-account-replicator restart
service openstack-swift-container restart
service openstack-swift-container-auditor restart
service openstack-swift-container-replicator restart
service openstack-swift-container-updater restart
service openstack-swift-object restart
service openstack-swift-object-auditor restart
service openstack-swift-object-replicator restart
service openstack-swift-object-updater restart
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

8. 重启Nova服务

8.1 控制节点

service openstack-nova-api restart
service openstack-nova-cert restart
service openstack-nova-consoleauth restart
service openstack-nova-scheduler restart
service openstack-nova-conductor restart
service openstack-nova-novncproxy restart
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

8.2 计算节点

service libvirtd restart
service openstack-nova-compute restart

sql语句

一、基础

1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname

3、说明:备份sql server
— 创建 备份数据的 device
USE master
EXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:\mssql7backup\MyNwind_1.dat’
— 开始 备份
BACKUP DATABASE pubs TO testBack

4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

根据已有的表创建新表: 
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table tabname

6、说明:增加一个列
Alter table tabname add column col type

:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col) 
8、说明:创建索引create [unique] index idxname on tabname(col….)
删除索引:drop index idxname

注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:
select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新
:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ —like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT
运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT
运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left (outer) join
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right (outer) join: 
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full/cross (outer) join
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
12、分组:Group by:
一张表,一旦分组 完成后,查询后只能得到组相关的信息。
组相关的信息:(统计信息) count,sum,max,min,avg  分组的标准)
  在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
在selecte统计函数中的字段,不能和普通的字段放在一起;

13、对数据库进行操作:
分离数据库
 sp_detach_db;附加数据库sp_attach_db 后接表明,附加需要完整的路径名
14.如何修改数据库的名称:
sp_renamedb ‘old_name’, ‘new_name’

 

二、提升

1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:
select * into b from a where 1<>1(仅用于SQlServer)
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in ‘”&Server.MapPath(“.”)&”\data.mdb” &”‘ where..

4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2

9、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where …..

12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff(‘minute’,f开始时间,getdate())>5

13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
具体实现:
关于数据库分页:

declare @start int,@end int

@sql  nvarchar(600)

set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’

exec sp_executesql @sql
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引

14、说明:前10条记录
select top 10 * form table1 where 范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、说明:包括所有在 TableA中但不在 TableB和TableC中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、说明:随机取出10条数据
select top 10 * from tablename order by newid()

18、说明:随机选择记录
select newid()

19、说明:删除重复记录
1),
delete from tablename where id not in (select max(id) from tablename group by col1,col2,…)
2),select distinct * into temp from tablename
delete from tablename
insert into tablename select * from temp
评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段

alter table tablename
–添加一个自增列
add  column_b int identity(1,1)
delete from tablename where column_b not in(
select max(column_b)  from tablename group by column1,column2,…)
alter table tablename drop column column_b

20、说明:列出数据库里所有的表名
select name from sysobjects where type=’U’ // U代表用户

21、说明:列出表里的所有的列名
select name from syscolumns where id=object_id(‘TableName’)

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when ‘A’ then pcs else 0 end),sum(case vender when ‘C’ then pcs else 0 end),sum(case vender when ‘B’ then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3

23、说明:初始化表table1

TRUNCATE TABLE table1

24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

三、技巧

1、1=1,1=2的使用,在SQL语句组合时用的较多

“where 1=1” 是表示选择全部    “where 1=2”全部不选,
如:
if @strWhere !=”
begin
set @strSQL = ‘select count(*) as Total from [‘ + @tblName + ‘] where ‘ + @strWhere
end
else
begin
set @strSQL = ‘select count(*) as Total from [‘ + @tblName + ‘]’
end

我们可以直接写成

错误!未找到目录项。
set @strSQL = ‘select count(*) as Total from [‘ + @tblName + ‘] where 1=1 安定 ‘+ @strWhere 2、收缩数据库
–重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
–收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE

3、压缩数据库
dbcc shrinkdatabase(dbname)

4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login ‘update_one’,’newname’,’oldname’
go

5、检查备份集
RESTORE VERIFYONLY from disk=’E:\dvbbs.bak’

6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB(‘dvbbs’,repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO

7、日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE tablename — 要操作的数据库名
SELECT  @LogicalFileName = ‘tablename_log’, — 日志文件名
@MaxMinutes = 10, — Limit on time allowed to wrap log.
@NewSize = 1  — 你想设定的日志文件的大小(M)

Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT ‘Original Size of ‘ + db_name() + ‘ LOG is ‘ +
CONVERT(VARCHAR(30),@OriginalSize) + ‘ 8K pages or ‘ +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + ‘MB’
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter    INT,
@StartTime DATETIME,
@TruncLog   VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = ‘BACKUP LOG ‘ + db_name() + ‘ WITH TRUNCATE_ONLY’

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
— Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) — time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN — Outer loop.
SELECT @Counter = 0
WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN — update
INSERT DummyTrans VALUES (‘Fill Log’) DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT ‘Final Size of ‘ + db_name() + ‘ LOG is ‘ +
CONVERT(VARCHAR(30),size) + ‘ 8K pages or ‘ +
CONVERT(VARCHAR(30),(size*8/1024)) + ‘MB’
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

8、说明:更改某个表
exec sp_changeobjectowner ‘tablename’,’dbo’

9、存储更改全部表

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS

DECLARE @Name    as NVARCHAR(128)
DECLARE @Owner   as NVARCHAR(128)
DECLARE @OwnerName   as NVARCHAR(128)

DECLARE curObject CURSOR FOR
select ‘Name’    = name,
‘Owner’    = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name

OPEN   curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + ‘.’ + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
— select @name,@NewOwner,@OldOwner

FETCH NEXT FROM curObject INTO @Name, @Owner
END

close curObject
deallocate curObject
GO
10、SQL SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
案例
有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:

Name     score

Zhangshan   80

Lishi       59

Wangwu      50

Songquan    69

while((select min(score) from tb_table)<60)

begin

update tb_table set score =score*1.01

where score<60

if  (select min(score) from tb_table)>60

  break

 else

    continue

end

 

数据开发-经典
1.按姓氏笔画排序:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多

2.数据库加密:
select encrypt(‘原始密码’)
select pwdencrypt(‘原始密码’)
select pwdcompare(‘原始密码’,’加密后密码’) = 1–相同;否则不相同 encrypt(‘原始密码’)
select pwdencrypt(‘原始密码’)
select pwdcompare(‘原始密码’,’加密后密码’) = 1–相同;否则不相同

3.取回表中字段:
declare @list varchar(1000),
@sql nvarchar(1000)
select @list=@list+’,’+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name=’表A’
set @sql=’select ‘+right(@list,len(@list)-1)+’ from 表A’
exec (@sql)

4.查看硬盘分区:
EXEC master..xp_fixeddrives

5.比较A,B表是否相等:
if (select checksum_agg(binary_checksum(*)) from A)
=
(select checksum_agg(binary_checksum(*)) from B)
print ‘相等’
else
print ‘不相等’

6.杀掉所有的事件探察器进程:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT ‘kill ‘+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN(‘SQL profiler’,N’SQL 事件探查器’)
EXEC sp_msforeach_worker ‘?’

7.记录搜索:
开头到N条记录
Select Top N * From 表
——————————-
NM条记录(要有主索引ID)
Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID   Desc
———————————-
N到结尾记录
Select Top N * From 表 Order by ID Desc
案例
例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录。

select top 10 recid from A where recid not  in(select top 30 recid from A)

分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。

select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。

解决方案

1,用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题

2,在那个子查询中也加条件:select top 30 recid from A where recid>-1

例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
set @s = ‘select top 1 * from T   where pid not in (select top ‘ + str(@count-1) + ‘ pid  from  T)’

print @s      exec  sp_executesql  @s

9:获取当前数据库中的所有用户表
select Name from sysobjects where xtype=’u’ and status>=0

10:获取某一个表的所有字段
select name from syscolumns where id=object_id(‘表名’)

select name from syscolumns where id in (select id from sysobjects where type = ‘u’ and name = ‘表名’)

两种方式的效果相同

11:查看与某一个表相关的视图、存储过程、函数
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like ‘%表名%’

12:查看当前数据库中所有存储过程
select name as 存储过程名称 from sysobjects where xtype=’P’

13:查询用户创建的所有数据库
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name=’sa’)
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01

14:查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where table_name = ‘表名’

15:不同服务器数据库之间的数据操作

创建链接服务器

exec sp_addlinkedserver   ‘ITSV ‘, ‘ ‘, ‘SQLOLEDB ‘, ‘远程服务器名或ip地址 ‘

exec sp_addlinkedsrvlogin  ‘ITSV ‘, ‘false ‘,null, ‘用户名 ‘, ‘密码 ‘

–查询示例

select * from ITSV.数据库名.dbo.表名

–导入示例

select * into 表 from ITSV.数据库名.dbo.表名

以后不再使用时删除链接服务器

exec sp_dropserver  ‘ITSV ‘, ‘droplogins ‘

 

连接远程/局域网数据(openrowset/openquery/opendatasource)

–1、openrowset

–查询示例

select * from openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)

–生成本地表

select * into 表 from openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)

 

–把本地表导入远程表

insert openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)

select *from 本地表

–更新本地表

update b

set b.列A=a.列A

from openrowset( ‘SQLOLEDB ‘, ‘sql服务器名 ‘; ‘用户名 ‘; ‘密码 ‘,数据库名.dbo.表名)as a inner join 本地表 b

on a.column1=b.column1

–openquery用法需要创建一个连接

–首先创建一个连接创建链接服务器

exec sp_addlinkedserver   ‘ITSV ‘, ‘ ‘, ‘SQLOLEDB ‘, ‘远程服务器名或ip地址 ‘

–查询

select *

FROM openquery(ITSV,  ‘SELECT *  FROM 数据库.dbo.表名 ‘)

–把本地表导入远程表

insert openquery(ITSV,  ‘SELECT *  FROM 数据库.dbo.表名 ‘)

select * from 本地表

–更新本地表

update b

set b.列B=a.列B

FROM openquery(ITSV,  ‘SELECT * FROM 数据库.dbo.表名 ‘) as a

inner join 本地表 b on a.列A=b.列A

 

–3、opendatasource/openrowset

SELECT   *

FROM   opendatasource( ‘SQLOLEDB ‘,  ‘Data Source=ip/ServerName;User ID=登陆名;Password=密码 ‘ ).test.dbo.roy_ta

–把本地表导入远程表

insert opendatasource( ‘SQLOLEDB ‘,  ‘Data Source=ip/ServerName;User ID=登陆名;Password=密码 ‘).数据库.dbo.表名

select * from 本地表