分类 应用 下的文章

ELK日志集成

ELK介绍

  • Logstash负责从每台机器抓取日志数据,对数据进行格式转换和处理后,输出到Elasticsearch中存储。
  • Elasticsearch是一个分布式搜索引擎和分析引擎,用于数据存储,可提供实时的数据查询。
  • Kibana是一个数据可视化服务,根据用户的操作从Elasticsearch中查询数据,形成相应的分析结果,以图表的形式展现给用户。

阅读剩余部分 –

Linux进程管理:Supervisor

一.介绍

Supervisord是用Python实现的一款非常实用的进程管理工具。supervisord会帮你把管理的应用程序转成daemon程序,而且可以方便的通过命令开启、关闭、重启等操作,而且它管理的进程一旦崩溃会自动重启,这样就可以保证程序执行中断后的情况下有自我修复的功能。

二.安装配置

supervisor的安装非常简单

1.替换yum源

这里我采用yum来安装,首先,需要替换成阿里云的yum源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum makecache

2.安装相关组件及supervisor

yum install python-setuptools python-setuptools-devel supervisord -y

相关目录

配置文件:/etc/supervisord.conf
进程配置文件:/etc/supervisord/*.conf, 每个进程一个配置文件,根据服务器相关软件修改路径

服务管理

service supervisord start
service supervisord stop
service supervisord restart

修改配置文件
[官方文档]

mkdir /etc/supervisord/   #创建进程管理目录
echo "[include]" >> /etc/supervisord.conf
echo "files = /etc/supervisord/*.conf" >> /etc/supervisord.conf
添加web管理界面
echo "
[inet_http_server]         ; inet (TCP) server disabled by default
port=0.0.0.0:9001        ; (ip_address:port specifier, *:port for all iface)
username=admin              ; (default is no username (open server))
password=123456" >> /etc/supervisord.conf
http://192.168.1.1:9001

三.添加管理进程

cat > /etc/supervisord/gearmand.conf < < EOF
[program:gearmand]
command=/usr/local/sbin/gearmand
priority=1
numprocs=1
autostart=true
autorestar=true
startretries=10
stopsignal=KILL
stopwaitsecs=10
redirect_stderr=true
stdout_logfile=/etc/supervisord/gearmand.log
EOF

[官方文档]

mfs分布式文件系统-(测试篇)

安装篇请看:mfs分布式文件系统-(安装篇)

配置篇请看:mfs分布式文件系统-(配置篇)
mfs测试,接上文

一.删除,回收站测试

1.设置删除文件后空间回收时间
默认回收时间为1天,86400秒

[root@mfsclient data]# mfssettrashtime 86400 /data/mfs
/data/mfs: 86400

查看设置

[root@mfsclient data]# mfsgettrashtime /data/mfs
/data/mfs: 86400

2.trash
删除的文件可以通过trash找回,安装mfsclient后,可以通过 -m 参数来挂载mfsmeta文件系统来查看trash

[root@mfsclient /]# mfsmount /data/mfs -m -H mfsmaster
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@mfsclient /]# cd /data/mfs
[root@mfsclient mfs]# ls
sustained  trash

所有在mfs中被删除的文件都会在trash中,所以要找回时,使用-m参数挂载即可
sustained 是正在被读取的文件,等读取结束后会被删除到trash中
测试trash

[root@mfsclient mfs]# touch insoz.com/index.html
[root@mfsclient mfs]# ls
insoz.com
[root@mfsclient mfs]# rm -rf insoz.com
trash中
[root@mfstrash trash]# ls
00000028|insoz.com  0000002B|insoz.com|index.html  undel
[root@mfstrash trash]#

文件名由一个八位十六进制的数i-node和被删文件的文件名组成,在文件名和i-node之间用|隔开
将这些文件移动到undel目录下,将会恢复原始文件到正确的MooseFS文件系统的路径下

mv 00000030\|insoz.com\|index.html undel/

二.破坏性测试

1.把环境中的数据存储服务器依次停止,剩下一个,整个mfs还能继续提供服务。
然后上传一个文件,把文件副本更改为3,接着依次启动刚被关闭的另外两台数据存储服务器,再关闭刚才没有关闭的那台数据存储服务器,最后验证最后上传的那个文件是否可以正常访问,如果可以,证明文件被同步到多台数据存储服务器了。

三.元数据服务器测试

1.模拟元数据服务器进程被意外结束,执行回复操作
停止元数据服务器
[root@mfsmaster trash]# ps -ef|grep mfsmaster
root 21269 5485 0 13:48 pts/4 00:00:00 grep mfsmaster
mfs 26880 1 0 Jun02 ? 00:10:47 mfsmaster -a
[root@mfsmaster trash]# kill -9 26880
启动元数据服务器

[root@mfsmaster trash]# mfsmaster start
open files limit has been set to: 4096
working directory: /var/lib/mfs
lockfile created and locked
initializing mfsmaster modules ...
exports file has been loaded
topology file has been loaded
loading metadata ...
can't find metadata.mfs - try using option '-a'
init: metadata manager failed !!!
error occured during initialization - exiting

提示初始化数据失败
执行恢复操作

[root@mfsmaster trash]# mfsmaster -a
open files limit has been set to: 4096
working directory: /var/lib/mfs
lockfile created and locked
initializing mfsmaster modules ...
exports file has been loaded
topology file has been loaded
loading metadata ...
loading sessions data ... ok (0.0000)
loading objects (files,directories,etc.) ... ok (0.0354)
loading names ... ok (0.0354)
loading deletion timestamps ... ok (0.0000)
loading quota definitions ... ok (0.0000)
loading xattr data ... ok (0.0000)
loading posix_acl data ... ok (0.0000)
loading open files data ... ok (0.0000)
loading chunkservers data ... ok (0.0000)
loading chunks data ... ok (0.0000)
checking filesystem consistency ... ok
connecting files and chunks ... ok
all inodes: 4
directory inodes: 2
file inodes: 2
chunks: 0
metadata file has been loaded
stats file has been loaded
master < -> metaloggers module: listen on *:9419
master < -> chunkservers module: listen on *:9420
main master server module: listen on *:9421
mfsmaster daemon initialized properly

启动元数据服务器

[root@mfsmaster lib]# mfsmaster start
open files limit has been set to: 4096
working directory: /var/lib/mfs
lockfile created and locked
initializing mfsmaster modules ...
exports file has been loaded
topology file has been loaded
loading metadata ...
loading sessions data ... ok (0.0000)
loading objects (files,directories,etc.) ... ok (0.0354)
loading names ... ok (0.0354)
loading deletion timestamps ... ok (0.0000)
loading quota definitions ... ok (0.0000)
loading xattr data ... ok (0.0000)
loading posix_acl data ... ok (0.0000)
loading open files data ... ok (0.0000)
loading chunkservers data ... ok (0.0000)
loading chunks data ... ok (0.0000)
checking filesystem consistency ... ok
connecting files and chunks ... ok
all inodes: 7
directory inodes: 5
file inodes: 2
chunks: 0
metadata file has been loaded
stats file has been loaded
master < -> metaloggers module: listen on *:9419
master < -> chunkservers module: listen on *:9420
main master server module: listen on *:9421
mfsmaster daemon initialized properly

不出意外客户端会自动恢复挂载信息,并且数据正常
2.模拟进程被意外关闭,并且日志文件被损毁
kill -9 杀掉mfsmaster进程
删除mfs目录,模拟故障,启动元数据服务器,提示初始化数据失败

[root@mfsmaster trash]# mfsmaster start
open files limit has been set to: 4096
working directory: /var/lib/mfs
lockfile created and locked
initializing mfsmaster modules ...
exports file has been loaded
topology file has been loaded
loading metadata ...
can't find metadata.mfs - try using option '-a'
init: metadata manager failed !!!
error occured during initialization - exiting

从元数据日志服务器把备份文件恢复过来
把所有文件名字中的_ml去掉
mv changelog_ml.0.mfs changelog.0.mfs
mv changelog_ml.2.mfs changelog.2.mfs
mv changelog_ml.1.mfs changelog.1.mfs
mv metadata_ml.mfs.back metadata.mfs.back
执行恢复操作

[root@mfsmaster trash]# mfsmaster -a
open files limit has been set to: 4096
working directory: /var/lib/mfs
lockfile created and locked
initializing mfsmaster modules ...
exports file has been loaded
topology file has been loaded
loading metadata ...
loading sessions data ... ok (0.0000)
loading objects (files,directories,etc.) ... ok (0.0354)
loading names ... ok (0.0354)
loading deletion timestamps ... ok (0.0000)
loading quota definitions ... ok (0.0000)
loading xattr data ... ok (0.0000)
loading posix_acl data ... ok (0.0000)
loading open files data ... ok (0.0000)
loading chunkservers data ... ok (0.0000)
loading chunks data ... ok (0.0000)
checking filesystem consistency ... ok
connecting files and chunks ... ok
all inodes: 4
directory inodes: 2
file inodes: 2
chunks: 0
metadata file has been loaded
stats file has been loaded
master < -> metaloggers module: listen on *:9419
master < -> chunkservers module: listen on *:9420
main master server module: listen on *:9421
mfsmaster daemon initialized properly

需要注意的是,metadata.mfs.back 必须与日志文件在一起才能正常恢复
启动元数据服务器

mfsmaster start

客户端挂载,数据正常

mfs分布式文件系统-(配置篇)

安装篇请看:mfs分布式文件系统-(安装篇)
mfs配置,接上文
首先使用hosts解析主机名,如果想启用master高可用和避免单点故障,可以搭建DNS服务器解析主机名

echo "192.168.1.1 mfsmaster" >> /etc/hosts

一.master服务器
配置文件

/etc/mfs/mfsmaster.cfg

工作目录

/var/lib/mfs/

默认配置文件,虽然每行使用的都被注释了.但它们都是默认值,如果要更改,取消注释修改保存即可

# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfsmaster
# LOCK_MEMORY = 0
# NICE_LEVEL = -19
# FILE_UMASK = 027
# DATA_PATH = /var/lib/mfs #数据存放路劲,指元数据的存放路径
# EXPORTS_FILENAME = /etc/mfs/mfsexports.cfg #权限控制文件
# TOPOLOGY_FILENAME = /etc/mfs/mfstopology.cfg
# BACK_LOGS = 50
# BACK_META_KEEP_PREVIOUS = 1
# CHANGELOG_PRESERVE_SECONDS = 1800
# MISSING_LOG_CAPACITY = 100000
# MATOML_LISTEN_HOST = *
# MATOML_LISTEN_PORT = 9419 #用于备份元数据服务器的变化日志.
# MATOCS_LISTEN_HOST = *
# MATOCS_LISTEN_PORT = 9420 #元数据服务器使用9420端口来接受chunkserver的连接
# MATOCS_TIMEOUT = 10
# REPLICATIONS_DELAY_INIT = 300
# CHUNKS_LOOP_MAX_CPS = 100000
# CHUNKS_LOOP_MIN_TIME = 300
# CHUNKS_SOFT_DEL_LIMIT = 10
# CHUNKS_HARD_DEL_LIMIT = 25
# CHUNKS_WRITE_REP_LIMIT = 2,1,1,4
# CHUNKS_READ_REP_LIMIT = 10,5,2,5
# CS_HEAVY_LOAD_THRESHOLD = 100
# CS_HEAVY_LOAD_RATIO_THRESHOLD = 5.0
# CS_HEAVY_LOAD_GRACE_PERIOD = 900
# ACCEPTABLE_PERCENTAGE_DIFFERENCE = 1.0
# PRIORITY_QUEUES_LENGTH = 1000000
# MATOCL_LISTEN_HOST = *
# MATOCL_LISTEN_PORT = 9421 #元数据服务器通过坚挺9421端口来接受MFS远程mfsmount信息
# SESSION_SUSTAIN_TIME = 86400
# QUOTA_TIME_LIMIT = 604800

二.metalogger服务器
配置文件

/etc/mfsmetalogger.cfg

只需要修改一个地方即可
#MASTER_HOST mfsmaster
DATA_PATH=/var/lib/mfs #从元数据服务器取回文件的保存路劲
BACK_LOGS=50 存放备份日志的总个数位50
META_DOWNLOAD_FREQ=24 元数据备份文件下载请求频率,默认为24小时,即每隔一天从元数据服务器(MASTER)下载一个metadata.mfs.back文件。当元数据服务器关闭或者出故障时,matedata.mfs.back文件将消失,那么要恢复整个mfs,则需从metalogger服务器取得该文件。请特别注意这个文件,它与日志文件一起,才能够恢复整个被损坏的分布式文件系统.

三.chunkserver服务器
配置文件

/etc/mfschunkserver.cfg
/etc/mfshdd.cfg

数据存储服务器有两个地方需要修改,一个是mfschunkserver.cfg,另一个是/etc/mfshdd.cfg,每个服务器用来分配给mfs使用的空间最好是一个单独的硬盘或一个raid卷,最低要求是一个分区
1.修改/etc/mfschunkserver.cfg

MASTER_HOST=mfsmaster 元数据服务器的主机名.能够访问到就行
HDD_CONF_FILENAME=/etc/mfs/mfshdd.cfg 分配磁盘空间的配置文件

2.修改/etc/mfshdd.cfg

echo "/data/mfs 2.0TiB" >> /etc/mfs/mfshdd.cfg
chown mfs.mfs -R /data/mfs 给分配目录mfs权限

四.mfs客户端
安转了mfs-client后,直接挂载使用即可

mkdir /data/mfs
mfsmount /data/mfsdata -H mfsmaster

使用df -h 查看挂载信息

[root@mfsclient ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              30G  6.1G   22G  22% /
tmpfs                 3.9G     0  3.9G   0% /dev/shm
/dev/sda1            1008M   53M  904M   6% /boot
/dev/sda6             336G   71G  249G  23% /data
/dev/sda3              20G  172M   19G   1% /home
mfsmaster:9421        2.5T   32G  2.5T   2% /data/mfs

设置文件副本数目

mfssetgoal 3 /data/mfs

检查设置

[root@mfsclient mfs]# touch insoz.com
[root@mfsclient mfs]# mfsgetgoal insoz.com
insoz.com: 3

查看实际拷贝

[root@mfsclient mfs]# mfsfileinfo insoz.com
insoz.com:
        chunk 0: 0000000000000208_00000001 / (id:520 ver:1)
                copy 1: 192.168.1.2:9422
                copy 2: 192.168.1.3:9422

五.设置开机启动,挂载

master服务器
echo "mfsmaster start" >> /etc/rc.local
chunkserver服务器
echo "mfschunkserver start">> /etc/rc.local
metalogger服务器
echo "mfsmetalogger start" >> /etc/rc.local
client服务器
echo "mfsmount /data/mfs -H mfsmaster" >> /etc/rc.local

安装篇请看:mfs分布式文件系统-(安装篇)

mfs分布式文件系统-(安装篇)

配置请看:mfs分布式文件系统-(配置篇)
一.mfs优势
1.通用文件系统.可以直接挂载使用.
2.可以在线扩容,架构扩展性强
3.部署简单(yum)
4.文件对象高可用,可设置任意数量的文件拷贝,而且会加速读写性能
5.提供回收站功能
7.提供web gui监控接口
8.多个master,解决了单点故障问题(2.0版本以上)

二.官方架构图
mfs1

mfs2
三.mfs文件系统结构
四种角色:
1.mfsmaster :负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝
2.mfsmetalogger :负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出问题的时候接替其进行工作
3.mfschunkserver:负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输.
4.mfsclient :通过fuse内核接口挂接远程管理服务器上所管理的数据存储服务器,.看起来共享的文件系统和本地unix文件系统使用一样的效果.
四.环境
os CentOS6.5 x64
master 1台(采用DNS服务器来使用轮询负载,本文暂无,后续测试)
Metaloggers 1台
chunkserver 2台
client 2台
五.安装
1.首先安装appropriate key
包管理

curl "http://ppa.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS

For sysv os family-CentOS6

curl "http://ppa.moosefs.com/MooseFS-stable-el6.repo" > /etc/yum.repos.d/MooseFS.repo

For sysv os family-CentOS7

curl "http://ppa.moosefs.com/MooseFS-stable-rhsystemd.repo" > /etc/yum.repos.d/MooseFS.repo

2.Master Server 安装在master服务器

yum install moosefs-master
yum install moosefs-cli

启动

mfsmaster start
service mfsmaster start

3.Chunkservers 安装在两台chunkserver服务器(可以动态扩展)

yum install moosefs-chunkserver

启动

mfschunkserver start
service moosefs-chunkserver start

4.Metaloggers 安装在metaloggers服务器,建议不要与master安装在一起

yum install moosefs-metalogger

启动

mfs-metalogger start
server moosefs-metalogger start

5.Moosefs CGI 和 moosefs-cgiserv安装

yum install moosefs-cgi moosefs-cgiserv -y

启动

mfscgiserv start
service mfscgiserv start

访问

http://129.168.1.1:9425

6.Clients 安装在需要挂载文件系统的服务器中

yum install moosefs-client

7.将安装的服务都设置开机启动

chkconfig moosefs-master on
chkconfig moosefs-metalogger on
chkconfig moosefs-cgiserv on
chkconfig moosefs-chunkserver on

确认安装

[root@ralsun160 /]# netstat -antlp|grep mfs
tcp        0      0 0.0.0.0:9419                0.0.0.0:*                   LISTEN      16896/mfsmaster
tcp        0      0 0.0.0.0:9420                0.0.0.0:*                   LISTEN      16896/mfsmaster
tcp        0      0 0.0.0.0:9421                0.0.0.0:*                   LISTEN      16896/mfsmaster
tcp        0      0 192.168.1.1:9420         	192.168.1.2:40998           ESTABLISHED 16896/mfsmaster
tcp        0      0 192.168.1.1:9419        	192.168.1.1:50880           ESTABLISHED 16896/mfsmaster
tcp        0      0 192.168.1.1:9421        	192.168.1.3:37691           ESTABLISHED 16896/mfsmaster
tcp        0      0 192.168.1.1:9421         	192.168.1.2:57989           ESTABLISHED 16896/mfsmaster
tcp        0      0 192.168.1.1:9420         	192.168.1.2:51840           ESTABLISHED 16896/mfsmaster
tcp        0      0 192.168.1.1:9421         	192.168.1.3:55082           ESTABLISHED 16896/mfsmaster
tcp        0      0 192.168.1.1:50880       	192.168.1.5:9419            ESTABLISHED 17035/mfsmetalogger

配置请看:mfs分布式文件系统-(配置篇)

浏览器中的Torrent:WebTorrent

一. 介绍

WebTorrent是一个纯JS写的一个基于浏览器的torent客户端
在nood.js中,WebTorrent是一个简单的torrent客户端,使用TCP和UDP来和其他的torrent客户端数据交互.

 

在浏览器中,WebTorrent 使用WebRTC(data channels)来为点对点提供数据传输,它可以在没有浏览器插件,扩展或者安装程序的情况下使用,纯JavaScript.

 

很简单的将脚本 webtorrent.min.js 添加到网站页面中,就可以从使用BitTorrent 协议的WebRTC中将文件取过来,或者 使用基于  browserify(nodojs模块)的  require(‘webtorrent’)
查看  demo apps 和  code examples.

 

如果想要BitTorrent在WebRTC中工作(只是在web中使用p2p传输),我们做了一些协议上的改变,所以,一个基于浏览器的WebTorrent客户端可以只是连接其他支持WebTorrent(或者WebRTC)的客户端.

 

node.js的 WebTorrent模块很快将要可以连接其他使用WebRTC的节点,使它成为第一个”hybrid”客户端,我们希望建立 torrent 客户端( uTorrent, Transmission, Vuze, etc.)也会很快添加对WebTorrent(和WebRTC)的支持,所以,它们也都可以很方便的和其他web中的节点连接.

 

Network

 

警告:这是一个还在pre-alpha(类似于技术预览版,会有很多bug)阶段的软件,请在 WebTorrent关注最新动态

 

二. 软件特点
  • node.js版的Torrent客户端 & 浏览器版的(同样的npm模块)
  • 运行很快速
  • 同时,高效的下载成倍的torrent
  • 纯 JavaScript (没有原生依赖包)
  • 用streams的形式发布文件
    • 按需从网络中寻找文件块(甚至在torrent完成之前)
    • 在连续的文件块和缺少的文件块中迅速切换
  • 支持高级torrent客户端特点
  • 全面的测试套件(支持离线运行,所以非常可靠,非常快)

三. 浏览器特点

  • 在没有插件的情况下,WebRTC data channels 提供了轻便的节点之间的数据传输
  • 没有其他仓库,WebTorrent是一个可以运行在所有web中的P2P软件,它可以在一个域名中运行的同时,也可以连接其他域名中的客户端.
  • 可以在一个<video>标签(webm (vp8,vp9) 或者 mp4 (h264))中Stream视频torrents.
  • 支持Chrome,Firefox和Opera浏览器

四. 支持节点

  • 可以将视频stream到Airplay,Chromecast,VLC player, 或者其他更多的设备,播放器中

五. 安装

安装WebTorrent以供在节点,或者浏览器中使用WebTorrent,用 require(‘webtorrent’),运行:
 npm install webtorrent
安装一个webtorrent命令行程序,运行: 
 npm install webtorrent -g
六. 帮助
  • 在Gitter或者freenode中#webtorrent加入我们以帮助开发者或者一些很牛疯子,科学家,黑客.
  • Create a new issue来提交bugs
  • Fix an issue.注:WebTorrent是一个OPEN Open Source Project!
  • 比特币捐赠 如果你相信这个设想或者希望支持这个项目. 使用Coinbase,或者发送到1B6aystcqu8fd6ejzpmMFMPRqH9b86iiwh (proof)

七. 项目中的WebTorrent

八. 使用

WebTorrent是第一个运行在浏览器中的BitTorrent客户端,使用开放web标准(没有插件,只是HTML5和WebRTC)!很容易就可以开始!
 
browser
可以很简单的下载文件:
var WebTorrent = require('webtorrent')

var client = new WebTorrent()
var magnetUri = '...'

client.add(magnetUri, function (torrent) {
  // Got torrent metadata!
  console.log('Torrent info hash:', torrent.infoHash)

  torrent.files.forEach(function (file) {
    // Get a url for each file
    file.getBlobURL(function (err, url) {
      if (err) throw err

      // Add a link to the page
      var a = document.createElement('a')
      a.download = file.name
      a.href = url
      a.textContent = 'Download ' + file.name
      document.body.appendChild(a)
    })
  })
})
也可以很简单的发送文件:
var dragDrop = require('drag-drop/buffer')
var WebTorrent = require('webtorrent')

var client = new WebTorrent()

// When user drops files on the browser, create a new torrent and start seeding it!
dragDrop('body', function (files) {
  client.seed(files, function onTorrent (torrent) {
    // Client is seeding the file!
    console.log('Torrent info hash:', torrent.infoHash)
  })
})
Streaming HTML5视频? 也很简单!
var WebTorrent = require('webtorrent')

var client = new WebTorrent()
var magnetUri = '...'

client.add(magnetUri, function (torrent) {
  // Got torrent metadata!
  console.log('Torrent info hash:', torrent.infoHash)

  // Let's say the first file is a webm (vp8) or mp4 (h264) video...
  var file = torrent.files[0]

  // Create a video element
  var video = document.createElement('video')
  video.controls = true
  document.body.appendChild(video)

  // Stream the video into the video tag
  file.createReadStream().pipe(video)
})
这里有更多的例子 examples
Browserify
WebTorrent可以很好的和  browserify 一起工作,一个npm模块可以让你使用 node-style require() 来更好的组织你的浏览器代码,并且可以很好的加载用npm安装的模块.
WebTorrent 也可以从一个独立的脚本中获得( webtorrent.min.js)来发布webtorrent到window项目,所以它可以只用一个script标签来使用:
<script src="webtorrent.min.js"></script>
WebTorrent脚本也可以很快的引用,将这个可靠的CDN地址包含在你的网站中:
<script src="https://cdn.jsdelivr.net/webtorrent/latest/webtorrent.min.js"></script>
node.js
WebTorrent也可以运行在node.js中,使用相同的npm模块!
命令行app
$ npm install webtorrent -g
$ webtorrent --help
下载一个torrent:
$ webtorrent magnet_uri
stream 一个torrent 到一个设备,像AirPlay或者chromecast
$ webtorrent magnet_uri --airplay
这里是一些支持的streaming选项:
--airplay               Apple TV
--chromecast            Chromecast
--mplayer               MPlayer
--mpv                   MPV
--omx [jack]            omx [default: hdmi]
--vlc                   VLC
--xbmc                  XBMC
--stdout                standard out [implies --quiet]
API
这个API完全可以相同的运行在节点和浏览器中,

client = new WebTorrent([opts])

创建一个新的WebTorrent
如果 opts 具体说明了,那么默认的选项(在下面)将会被覆盖
{
  dht: Boolean|Object,   // Enable DHT (default=true), or options object for DHT
  maxPeers: Number,      // Max number of peers to connect to per torrent (default=100)
  nodeId: String|Buffer, // DHT protocol node ID (default=randomly generated)
  peerId: String|Buffer, // Wire protocol peer ID (default=randomly generated)
  rtcConfig: Object,     // RTCPeerConnection configuration object (default=STUN only)
  storage: Function,     // custom storage engine, or `false` to use in-memory engine
  tracker: Boolean,      // Whether or not to enable trackers (default=true)
  wrtc: {}               // custom webrtc implementation (in node, specify the [wrtc](https://www.npmjs.com/package/wrtc) package)
}

client.add(torrentId, [opts], [function ontorrent (torrent) {}])

开始下载一个新的torrent,使用  

client.download

 .

torrentId 可以是其中一个:
  • 磁力链接(utf8 字符串)
  • torrent 文件(缓冲)
  • info hash(十六进制字符串或者缓存)
  • 从torrent中分析(从parse-torrent)
  • torrent文件的http/https url地址(字符串)
  • torrent文件的系统路径(字符串)

如果 opts 具体说明了,那么默认的选项(在下面)将会被覆盖

{
  tmp: String,           // Custom folder where files will be downloaded (default=`/tmp/`)
  verify: Boolean        // Verify previously stored data before starting (default=false)
}

client.seed(input, [opts], [function onseed (torrent) {}])

开始seeding一个新的torrent.
input 可以是任何一个:
  • 文件系统中的文件或目录的路径(字符串)
  • W3C File 对象(从一个<input>标签拖拽)
  • W3C FileList 对象 ( 
    File

     对象的基本数组)

  • Node Buffer 对象 (在browser中工作)

或者 一个  

string

  

File

 数组,或者是一个 

Buffer

 对象.

如果  opts   具体说明了,那么它应该包含在选项类型后面:
  • create-torrent 的选项(允许配置创建后的.torrent文件)
  • client.add 的选项(同上)

如果  onseed  具体说明了,它将会在客户端开始seeding的文件的时候called

client.on('torrent', function (torrent) {})

当一个torrent准备好被使用时,(元数据可用并且存储已经准备好了),查看torrent更多的信息使用方法 torrent

client.remove(torrentId, [function callback (err) {}])

从客户端中移除一个torrent.重置所有peers的连接,并且删除所有存储的文件数据.如果   callback 被声明了,那么它将会在文件数据被移除时called

client.destroy([function callback (err) {}])

重置客户端,包含所有torrents和连接到peers.如果  callback  被声明了,那么它将会在客户端优雅关闭后called

client.torrents[...]

客户端中所有torrents的数组

client.get(torrentId)

给出 torrentId  后返回torrent.简单方法.更方便的在  client.torrents  数组中搜寻.如果没有发现torrent,则返回  null

client.ratio

和所有客户端中的torrent进行对比

torrent api

torrent.infoHash

获取torrent的info hash

torrent.magnetURI

获取torrent的磁力链接

torrent.files[...]

torrent中所有文件的数组.

torrent.swarm

所附的 bittorrent-swarm 实例

torrent.remove()

client.remove(torrent)

.  的别名

torrent.addPeer(addr)

在 bittorrent-swarm 之下添加的一个peer实例
如果peer已经被添加了,返回  true  如果peer已经被加载黑名单列表锁定了,则返回 false

torrent.select(start, end, [priority], [notify])

在给出 priority 后, 选择一个地址的种类,开始用 start  结束用 end  ,  notify  是一个选择用新的数据更新后的可选择的回调事件

torrent.deselect(start, end, priority)

torrent.critical(start, end)

标记范围内的要尽快下载, 开始用 start   结束用 end

torrent.createServer([opts])

创建一个http服务器来服务这个torrent中的内容,动态获取所需torrent来满足http请求,支持范围的请求
返回 http.Server  的情况(calling  http.createServer  获取)如果 opts  被声明了,它会跳过 http.createServer  函数.
访问服务器的根  /  将显示连接到单个文件的列表.
var client = new WebTorrent()
var magnetUri = '...'

client.add(magnetUri, function (torrent) {
  // create HTTP server for this torrent
  var server = torrent.createServer()
  server.listen(port) // start the server listening to a port

  // visit http://localhost:<port>/ to see a list of files

  // access individual files at http://localhost:<port>/<index> where index is the index
  // in the torrent.files array

  // later, cleanup...
  server.close()
  client.destroy()
})

file api

file.name

文件名字,torrent的具体说明

file.path

文件路径,torrent的具体说明 例:  some-folder/some-filename.txt

file.length

文件长度(字节)

file.select()

选中的文件将被下载

file.deselect()

取消选中,意味着直到有人为它创建stream之前都不会被下载

stream = file.createReadStream([opts])

为文件创建一个 readable stream.
你可以跳过 opts  ,然后stream 一个文件的碎片
{
  start: startByte,
  end: endByte
}
start  end,都被包括

file.getBuffer(function callback (err, buffer) {})

获取文件的内容作为缓存
文件在网络中被下载的优先级为高,并且文件在准备好后,会调用 callback  .  callback  必须要声明,
并且将作为 Error  或者 null   被缓存
file.getBuffer(function (err, buffer) {
  if (err) throw err
  console.log(buffer) // <Buffer 00 98 00 01 01 00 00 00 50 ae 07 04 01 00 00 00 0a 00 00 00 00 00 00 00 78 ae 07 04 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...>
})

file.getBlobURL(function callback (err, url) {})

获取到一个网址,可在浏览器中引用该文件
文件在网络中被下载的优先级为高,并且文件在准备好后,会调用 callback  .  callback  必须要声明,并且将作为 Error或 null 和Blob URL(字符串)
file.getBlobURL(function (err, url) {
  if (err) throw err
  var a = document.createElement('a')
  a.download = file.name
  a.href = url
  a.textContent = 'Download ' + file.name
  document.body.appendChild(a)
})
所有的都模块都包含在npm WebTorrent中
注:本来翻译自GitHub的一个开源项目,可能有些地方不是很准确

Gmail 失联之后的解决方案

上周四,Gmail 的 IMAP、SMTP、POP3 服务器均已被 Block,这些负责用户收发邮件的关键环节被盯上了,大陆地区用户的 Gmail 账户使用情况进一步恶化,原来只是屏蔽 Gmail(Google) 访问权限,现在可好,翻墙后在桌面、移动各类客户端上也收发不了邮件了,只能访问网页端操作。我们抛开敏感问题不谈,这样的后果会对国内民众的日常工作,学习造成很大影响,平时注册的各类账户推送邮件收不到,发过去的简历也不能及时获取,真是叫人感到懊恼。

遇到这种情况可不要着急换邮箱啊,那成本可高了去,小编在本文推荐几种解决方案,供大伙参考,有简单的,也有略复杂的,根据自身情况选择一个即可,我们的目标就是能正常使用 Gmail :

尝试安装 Mailbox,CloudMagic 等第三方邮件客户端

像 OS X 上的 Unibox,iOS 上的 CloudMagic ,以及通用客户端 Mailbox 都有自己的 Fetching Mail 服务器,会把用户邮件自动采集到自己的服务器再做收发,这种模式就不受某 WALL 的干扰了,你可以无障的使用,对于网络知识匮乏的普通用户来说,这种方案是最容易的成本也是最低的。
CfakepathMailbox
Mailbox Mac 客户端 下载
Mailbox iOS 客户端 下载
CloudMagic 下载

直接在邮件客户端里更换收发服务器地址「173.194.67.108」

当然了,不是每个人都想更换客户端的,一款软件用久了也有形成习惯,要去接受新伙伴没那么容易,根据网友分享,你可以在原有客户端设置里将默认的 IMAP、SMTP 服务器地址改为 「173.194.67.108」,瞬间搞定,不过这个美国 IP 的「寿命」我们就不敢保证了,来看下面这个较稳定的方案。

给系统架设 SOCKS 5 代理

因为 OS X 系统自带 Mail.app 是可以自动走 SOCKS 代理的,所以开启 SOCKS 代理就能 Mail.app 恢复正常,这里推荐 Shadowsocks ,提供公共服务器,还有其他一些商业服务也有提供 SOCKS 5 服务器,这里就不介绍了,以免有广告嫌疑,呵呵。

Shadowsocks 本来是为程序员设计的 VPS 自设代理方案,但她的部署对于外行,或者像我这样的爱好者「微博有人这样嘲笑我」有些复杂,好在今年有其他 Coder 开发了界面操作版,支持自动代理和全局代理两种模式,也非常好用。

>> Shadowsocks 扩展阅读 <<

怎样开启 SOCK5?

在 OS X 偏好设置 – 网络 – 高级 – 代理,找到「SOCKS 代理」,填入 IP 地址与端口号即可。
7AD187E1-1EB2-468D-B90E-4105D22EDE44

有些邮件客户端,像 Foxmail「下载」,本身设置里就能提供 SOCKS 服务器的设置,在 Foxmail 账户设置 – 高级 – 网络代理 里你就能发现。

最后再推荐一个软件 Proxifier,可以将没有提供代理设置的软件走 SOCKS 代理,但这个软件和今天的话题有些扯远了,后面我们会单独开一篇 Proxifier 的使用心得文章。

到网页端设置邮件转发

虽然说客户端不能用了,网页版的 Gmail 还依然健在(这不废话么,难道 Google 会让那帮混蛋给黑了?艹!),我们到网页版的 Gmail 设置里添加一个能收发邮件的「转发邮箱」地址即可,比如 iCloud,网易邮箱,Hotmail,Live 等等。

Cfakepathgmailforwardmail

其他一些参考技术资料

VPN和Sock5代理的区别

Shadowsocks 使用方法

用 Shadowsocks 来做 SOCKS5 代理
[转自]玩法儿