amhere's blog


  • 首页

  • 归档

  • 标签

日志系统之rsyslog

发表于 2018-04-17 |

关于Rsyslog:

Rsyslog 可以理解为一个 sysklogd 的多线程增强版,其在 sysklogd 的基础上扩展了很多其他功能,如:数据库支持(Mysql、Oracle、PostgreSQL等)、日志内容筛选、定义日志格式模板等。除了默认的 UDP 协议外,Rsyslog 还支持 TCP 协议来接受日志。可以对输出的文件进行自动压缩并支持多个TCP侦听以及性能方面的提升。使用 Rsyslog 可以有效减轻系统磁盘IO,并且其支持TCP传输非常可靠,可以对日志进行过滤,提取有效日志。

rsyslog可以设置模块,一种类型的日志设置成一个模块,多线程来运行

rsyslog经常被用来做集中式日志服务器,就是基于很好的通讯,下面通过案例讲解:

首先在两台机器安装rsyslog,一台作为client,一台作为server

apt-get install rsyslog

修改日志服务器的配置文件,注释掉这几行:

#$ModLoad imudp
#$UDPServerRun 514
#$ModLoad imtcp
#$InputTCPServerRun 514

重启rsyslog

sudo /etc/init.d/rsyslog restart

修改日志客户端的配置文件:

vi /etc/hosts

添加日志服务器的ip和主机名,可以ping通进行验证

vi /etc/rsyslog.conf

在最后加上如下行,目的是让Linux写日志的同时写一份到远端的服务器机器上

*.*         @主机名

重启服务

$ sudo /etc/init.d/rsyslog restart

验证:在客户端日志输入:

logger "hi,man"

在服务端:

tail -f /var/log/syslog

同样输出相应的语句

ps:rsyslog在我的本本机出现过一个问题,就是修改了配置之后,重启rsyslog,我使用

service rsyslog restart

是不成功的,只能kill掉这个进程,然后重启rsyslog才成功,不知道是不是个例

/etc/init.d/rsyslog start

Kubernutes初上手

发表于 2018-02-05 |

首先在mac上安装但节点版本的kubernutes,但节点安装使用minikube

brew cask install minikube

启动minikube还要安装virtualBox,然后执行

minikube start

javabuildpack改造

发表于 2018-01-31 |

Buildpack作为开源软件是PaaS平台cloudfoundry的给应用打包,提供运行时环境的工具,Javabuildpack是提供Java应用运行时和框架的组件,使用ruby脚本语言,不过Java应用不都是依赖tomcat,也有的是用play等容器运行,,即使是tomcat,每个应用也可能做了定制化的改造,比如修改tomcat参数、一个tomcat运行几个war包,都是很常见,事无巨细,所以buildpack不可能照顾全面,这里面对一些需求对官网源码的改造

bin

detect 对应用监测阶段,检测应用类型,是否有合适的组件和容器去运行应用

compile 编译阶段,把应用和buildpack融合,类似把应用拷贝到tomcat下面

release 容器打包成droplet并启动,读取启动参数,执行启动命令

首先是应用有对tomcat进行改动

buildpack本身是对tomcat的一些配置进行了替换,在buildpack的resources/tomcat/conf下面

context.xml

logging.properities

server.xml

这三个文件和tomcat不一样,为了应用在cloudfoundry上运行,进行的改造,我们如果想使用自己的tomcat,就需要把conf下面的配置替换到droplet中,在tomcat.rb中,在启动命令之前执行

'`\cp /home/vcap/app/路径/* /home/vcap/app/.java-buildpack/tomcat/conf/;`',

Javabuildpack使用的是软连接,而不是拷贝操作,这块因为一些应用在tomcat里运行,通过软连接的方式无法运行成功,或者不能加载一些模版,这块把软连接的操作改成了拷贝的操作

oracle-jre的buildpack制作

发表于 2018-01-31 |

Javabuildpack的默认运行时环境是openjdk,而平时工作经常使用的是oracle jre,这让一些应用经常会出现莫名其妙的问题。所以制作oracle版本的buildpack

在官方文档中显示

To use Oracle JRE instead of OpenJDK without forking java-buildpack, set environment variable:

cf set-env JBP_CONFIG_COMPONENTS ‘{ jres: [ “JavaBuildpack::Jre::OracleJRE” ] }’ cf set-env JBP_CONFIG_ORACLE_JRE ‘{ jre: { repository_root: ““ } }’

这个不是离线版本的buildpack,不过可以指定repo中的oracle jre,那么肯定也可以通过编译的方式制作offline版本的buildpack,思路是这样的,先把oracle jre下载下来,因为oracle不能作为repo被指定,然后上传到文件服务器或者本地搭建文件服务器

首先在oracle官网下载对应的oracle版本,自身服务器是ubuntu14.04,所以使用了jre1.8.0_161 x64位的版本,下载到本地

创建oracle-buildpack文件夹,拷贝jre到文件夹中

配置nginx,搭建本地文件服务器

server{
    listen    5550;
    location ~* \.(html|css|js|png|jpg|gif|ico|jar|war|tar|gz|yml)$ {
        root /Users/ssy/workspace/oracle-buildpack;
    }
}

在同级目录下创建yml文件

vim index.yml 

写入

1.8.0_161: http://localhost:5550/jre-8u161-linux-x64.tar.gz

1.8.0_161是你下载jre的版本号,后面的地址是文件服务器地址

注意按照yml的格式书写,冒号后面一个空格

接下来下载buildpack源码

git clone https://github.com/cloudfoundry/java-buildpack.git
git checkout v3.1

修改config/oracle_jre.yml 文件

jre:
  version: 1.8.0_161
  repository_root: http://localhost:5550/

修改config/components.yml文件

#  - "JavaBuildpack::Jre::OpenJdkJRE"
- "JavaBuildpack::Jre::OracleJRE"

编译buildpack

export BUNDLE_PATH="./vendor"
bundle install
bundle exec rake clean package OFFLINE=true PINNED=true

在buildpack文件夹下面打包好的buildpack

tips:cloudfoundry javabuildpack一个offline版本中openjdk支持的有mac版本、linux14.04、linux16.04等等很多版本却没有oracle版本,oracle版本的buildpack会和openjdk版本的有差异,比如killjvm等,这些在buildpack的使用中满满再踩坑

docker入门(二)

发表于 2018-01-30 |

新版本的docker17.12.0以上(仅限mac edge版本),内含有kubernutes,如果本地想使用kubernutes,通过下载最新的测试版本docker,就可以不用minikube去安装kubernutes了

不过从stable版本更新到edge版本注意,stable版本本地所有的image都会被清空!!!

这个时候发现我的kubernutes怎么一直处于starting状态,开始以为是网络问题,打开vpn,发现还是run不起来,于是去minikube看issue,发现需要64G内存的空间,恍然大悟,虽然docker客户端版本安装kubernutes没有说是开源的minikube,不过原理应该差不多,开始清理电脑空间。。。

docker入门

发表于 2018-01-29 |

在mac下运行docker:https://download.docker.com/mac/stable/Docker.dmg 在docker的官网下载mac版本的安装包

安装,运行:

docker info

查看docker的基础信息,这些可以在preferences中进行重新配置

运行一个tank小应用在docker中

docker pull index.tenxcloud.com/tenxcloud/tomcat

这里使用的是tenxcloud的仓库,也可以使用docker hub,这里面mac有个小坑,如果使用官方hub,需要登入docker,不过需要使用账号而不是邮箱登入

运行

docker container ls

发现没有container,说明这个时候只是拉了一个镜像而已,运行:

docker tag index.tenxcloud.com/tenxcloud/tomcat tomcat-1

给这个镜像起个tomcat-1的名字,启动这个镜像

docker run -p 5000:8080 --name container1 tomcat-1

启动这个镜像,在container1中运行,docker中的8080端口映射到宿主机的5000端口

把一个tank应用放到container1中运行下

docker exec -it container1 /bin/bash

查看container1的容器路径结构,需要把应用放到tomcat/webapps下面

docker cp tank.war container1:tomcat/webapps

docker会自动重启,访问 localhost:5000/tank 就可以访问到应用了

关闭容器

docker stop container1

利用容器创建镜像

docker commit -m "tank应用" -a "youflint" 0416d433fb80 youflint/basehub

这回在看本地的镜像,发现就会有刚刚创建的,然后把镜像上传到docker hub

所以的镜像存储在/Users/ssy/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux 这个位置里

docker run=docker create+docker start

关于镜像:
只读的,无状态的,一个镜像永远不可改变?

kubernetes如何启动docker容器?

docker image的只读模型和分层模型不了解

kubernutes本身解决了docker的一下几个缺点,而这几点是我应该去思考的

容器与容器之间如何发现与通信?
如何决定在哪运行以及运行多少个容器?
如何获取容器运行的日志与运行状态信息?
如何部署新的镜像?
容器崩溃时都发生了什么?
如何只将特定的一部分容器暴露在公网或者内网环境下?

机器学习(一)

发表于 2017-12-27 |

数据工具基本工具集

Jupyter

这个系列主要使用python,pip是python比较有名的包管理器,python2.7默认安装了easy_install.py,可以通过这个安装pip

sudo easy_install pip

ipython是加强的python shell,安装

pip install --user IPython

Jupyter整合了ipython-notebook,Jupyter运行python,R,文档和统计界面化都很方便

pip install --user jupyter

启动notebook,显示当前路径的文件,可以很方便的编辑“.ipynb”文件

python -m IPython notebook  

Numpy

用python实现的科学计算包,提供很多高级数值编程工具,可以创建数组和数据的基本操作,比如:切片、转置、求特征向量

Scipy

Scipy一般都是操控Numpy数组来进行科学计算,所以可以说是基于Numpy之上了。Scipy有很多子模块可以应对不同的应用,例如插值运算,优化算法、图像处理、数学统计等。

  • scipy.cluster 向量量化
  • scipy.constants 数学常量
  • scipy.fftpack 快速傅里叶变换
  • scipy.integrate 积分
  • scipy.interpolate 插值
  • scipy.io 数据输入输出
  • scipy.linalg 线性代数
  • scipy.ndimage N维图像
  • scipy.odr 正交距离回归
  • scipy.optimize 优化算法
  • scipy.signal 信号处理
  • scipy.sparse 稀疏矩阵
  • scipy.spatial 空间数据结构和算法
  • scipy.special 特殊数学函数
  • scipy.stats 统计函数

Pandas

pannel data analysis(面板数据分析)。pandas是基于numpy构建的,为时间序列分析提供了很好的支持。pandas中有两个主要的数据结构,一个是Series(相当于列向量),另一个是DataFrame(矩阵)。

创建案例:

输入,创建series

1
2
3
4
5
6
7
import pandas as pd
import numpy as np
step_data = [3620, 7891, 9761,
3907, 4338, 5373]
step_counts = pd.Series(step_data,
name='steps')
print(step_counts)

输出:

0    3620
1    7891
2    9761
3    3907
4    4338
5    5373
Name: steps, dtype: int64

添加时间索引

1
2
3
step_counts.index = pd.date_range("20150329",
periods=6)
print(step_counts)

输出:

2015-03-29    3620
2015-03-30    7891
2015-03-31    9761
2015-04-01    3907
2015-04-02    4338
2015-04-03    5373
Freq: D, Name: steps, dtype: int64

根据索引查询

1
print(step_counts['2015-04-01 '])

输出:

3907

可以查询某月的,对时间序列很友好

1
print(step_counts['2015-04'])

输出

2015-04-01    3907
2015-04-02    4338
2015-04-03    5373
Freq: D, Name: steps, dtype: int64

查询类型

1
print(step_counts.dtype)

输出:

int64

空的赋值

1
2
step_counts[1:3] = np.NaN
print(step_counts)

输出:

2015-03-29    3620.0
2015-03-30       NaN
2015-03-31       NaN
2015-04-01    3907.0
2015-04-02    4338.0
2015-04-03    5373.0
Freq: D, Name: steps, dtype: float64

创建DataFrame,zip放回一个tuple列表

1
2
3
4
5
6
cycling_data = [10.7, 0, None, 2.4, 15.3, 10.9, 0, None]
joined_data = list(zip(step_data,
cycling_data))
print(joined_data)
activity_df = pd.DataFrame(joined_data)
print(activity_df)

输出:

[(3620, 10.7), (7891, 0), (9761, None), (3907, 2.4), (4338, 15.3), (5373, 10.9)]
      0     1
0  3620  10.7
1  7891   0.0
2  9761   NaN
3  3907   2.4
4  4338  15.3
5  5373  10.9

创建时间索引,和列名

1
2
active_df = pd.DataFrame(joined_data,index=pd.date_range("20171229",periods=6),columns=['Walking','Cycling'])
print(active_df)

输出:

            Walking  Cycling
2017-12-29     3620     10.7
2017-12-30     7891      0.0
2017-12-31     9761      NaN
2018-01-01     3907      2.4
2018-01-02     4338     15.3
2018-01-03     5373     10.9

loc是根据dataframe的具体标签选取列,iloc是根据标签所在的位置,从0开始计数。iloc[:,],”,”前面是行的索引,后面是列的索引

1
print(active_df.loc['2017-12-31'])

输出:

Walking    9761.0
Cycling       NaN
Name: 2017-12-31 00:00:00, dtype: float64

-3表示取倒数第三行

1
print(active_df.iloc[-3])

输出

Walking    3907.0
Cycling       2.4
Name: 2018-01-01 00:00:00, dtype: float64

表示取[0,3)行,前闭后开,第一列

1
print(active_df.iloc[0:3,0])

输出:

2017-12-29    3620
2017-12-30    7891
2017-12-31    9761
Freq: D, Name: Walking, dtype: int64

区域链入门

发表于 2017-12-26 |

区域链简介

是指用去中心化的方法来共同维护数据库,每个区块包含系统在一定时间的全部信息,比特币是目前区域链应用最知名的。

传统的交易都有第三方的监管来构建买卖双方的信任,比特币去中心化,使得第三方的监管变成了全网,一次交易通知所有的节点,这么看,肯定比单一的第三方更值得信任,不过也会收到51%攻击,因为区块被恶意伪造,超过51%的赞成票,虚假的交易记录会被认可,所以比特币使用消耗大量算力来避免这种攻击,因为计算使用的资源超过交易收益。区域链采用单向hash算法,严格按照时间排序,改变单一区块会被其他节点否决,从而保证安全。

区域链的几个特点:

  • 集体维护:系统的数据快所有节点维护
  • 高度透明:开源
  • 匿名:信任解决,不需要实名

mac下安装私有链

切换到ethereum第三方库

brew tap ethereum/ethereum

安装geth

brew install ethereum

验证geth安装成功

geth -h

创建一条私有链

mkdir ethereum

vi genesis.json

同https://github.com/ethereum/go-ethereum

{
  "config": {
        "chainId": 0,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x20000",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000042",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

初始化私有链

geth --datadir "./" init genesis.json

启动geth

geth --datadir "./" --nodiscover console 2>>geth.log

输入,查看第一个区块信息

> eth.getBlock(0)

Cloudfoundry Java-Buildpack源码分析

发表于 2017-12-26 |

Java-buildpack介绍

在CloudFoundry中,最后打成的那个可以运行的包,称为droplet,任何一个DEA拿到这个droplet,解压然后start即可。那具体应该如何打包?打包过程应该是运行一系列的脚本吧,这个脚本在哪里?一般来讲,脚本文件为了备份和版本化需求我们一般会放到git或svn上,嗯,现在可以解释什么叫buildpack了:它是一坨脚本,一般是放到git上作为一个project的形态存在,这坨脚本的作用是把用户写好的程序(CloudFoundry中一般称为app)、及其依赖的环境、配置、启动脚本等打包成droplet,这个过程称之为stage。
Java-buildpack是用ruby写的,这里分析的是java-buildpack-offline-v3.1

Java-buildpack源码分析

获取代码

java-buildpack的源码在gitlab上获取:

git clone https://github.com/cloudfoundry/java-buildpack    

目录结构

java-buildpack的主要目录结构如下:

|---bin         
|---config      
|---lib         
|---resource

其中bin下面三个部分:

  • detect 检测阶段主要监测应用类型,应用使用的运行时和组件依赖
  • compile 编译,把应用所需的运行时和依赖的组件和应用进行融合
  • release 打包阶段,并输出应用的启动命令

detect源码分析

$stdout.sync = true  #设置标准输出
$stderr.sync = true  #设置错误输出
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)  #加载lib下面的类库,$LOAD_PATH,功能就是java中的classpath

require 'java_buildpack/buildpack'  #require累似java中的import

build_dir = ARGV[0]  #全局数组ARGV,接受命令行参数

components = JavaBuildpack::Buildpack.with_buildpack(build_dir, 'Detect failed with exception %s') do |buildpack|  
  buildpack.detect  #JavaBuildpack模块Buildpack类with_buildpack方法下执行buildpack的回调函数
end.compact  #删除nil元素

if components.empty?
  abort  #终止进程
else
  str = components.join(' ')
  puts str.length > 255 ? str.slice(0..251) + '...' : str
end

compile源码分析

$stdout.sync = true
$stderr.sync = true
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)

require 'java_buildpack/buildpack'

build_dir = ARGV[0]

JavaBuildpack::Buildpack.with_buildpack(build_dir, 'Compile failed with exception %s') do |buildpack|
  buildpack.compile  #调用buildpack类中的compile方法
end

release源码分析

$stdout.sync = true
$stderr.sync = true
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)

require 'java_buildpack/buildpack'

build_dir = ARGV[0]

output = JavaBuildpack::Buildpack.with_buildpack(build_dir, 'Release failed with exception %s') do |buildpack|
  buildpack.release
end

puts output  #输出返回值                                           
12
amhere

amhere

19 日志
4 标签
© 2020 amhere
由 Hexo 强力驱动
主题 - NexT.Pisces