2015年五月月 发布的文章

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分布式文件系统-(配置篇)

[分享]:mysql根据内存自动优化脚本

这个脚本可以根据服务器内存大小来修改/etc/my.cnf配置文件
如果要使用,请根据你自己配置文件情况修改后运行

Memtatol=`free -m | grep 'Mem:' | awk '{print $2}'`
if [ $Memtatol -gt 1500 -a $Memtatol -le 2500 ]; then
sed -i 's/table_open_cache = 128/table_open_cache = 256/g' /etc/my.cnf
sed -i 's/tmp_table_size = 16M/tmp_table_size = 32M/g' /etc/my.cnf
sed -i 's/thread_cache_size = 8/thread_cache_size = 16/g' /etc/my.cnf
sed -i 's/query_cache_size = 8M/query_cache_size = 16M/g' /etc/my.cnf
sed -i 's/innodb_buffer_pool_size = 64M/innodb_buffer_pool_size = 128M/g' /etc/my.cnf
sed -i 's/myisam_sort_buffer_size = 8M/myisam_sort_buffer_size = 16M/g' /etc/my.cnf
sed -i 's/key_buffer_size = 8M/key_buffer_size = 16M/g' /etc/my.cnf
elif [ $Memtatol -gt 2500 -a $Memtatol -le 3500 ]; then
sed -i 's/table_open_cache = 128/table_open_cache = 512/g' /etc/my.cnf
sed -i 's/tmp_table_size = 16M/tmp_table_size = 64M/g' /etc/my.cnf
sed -i 's/thread_cache_size = 8/thread_cache_size = 32/g' /etc/my.cnf
sed -i 's/query_cache_size = 8M/query_cache_size = 32M/g' /etc/my.cnf
sed -i 's/innodb_buffer_pool_size = 64M/innodb_buffer_pool_size = 512M/g' /etc/my.cnf
sed -i 's/myisam_sort_buffer_size = 8M/myisam_sort_buffer_size = 32M/g' /etc/my.cnf
sed -i 's/key_buffer_size = 8M/key_buffer_size = 64M/g' /etc/my.cnf
elif [ $Memtatol -gt 3500 ];then
sed -i 's/table_open_cache = 128/table_open_cache = 1024/g' /etc/my.cnf
sed -i 's/tmp_table_size = 16M/tmp_table_size = 128M/g' /etc/my.cnf
sed -i 's/thread_cache_size = 8/thread_cache_size = 64/g' /etc/my.cnf
sed -i 's/query_cache_size = 8M/query_cache_size = 64M/g' /etc/my.cnf
sed -i 's/innodb_buffer_pool_size = 64M/innodb_buffer_pool_size = 1024M/g' /etc/my.cnf
sed -i 's/myisam_sort_buffer_size = 8M/myisam_sort_buffer_size = 64M/g' /etc/my.cnf
sed -i 's/key_buffer_size = 8M/key_buffer_size = 256M/g' /etc/my.cnf
fi

CentOS僵尸进程查找并kill

今天搭建mfs分布式文件系统时,top后发现有个僵尸进程

top - 15:04:51 up 1 day,  5:21,  1 user,  load average: 1.16, 1.23, 1.26
Tasks: 334 total,   1 running, 332 sleeping,   0 stopped,   1 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  16322528k total,  2887608k used, 13434920k free,   387928k buffers
Swap: 16383996k total,        0k used, 16383996k free,   915296k cached

使用ps命令来查找僵尸进程

ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]’

命令注解:

-A 参数列出所有进程
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数

因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程

运行结果参考如下

[root@ralsun160 /]# ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
Z    22202 27124 [mfs.cgi] 

原来是mfs的cgi图形展示进程.

重启mfscgiserv

mfscgiserv restart

或者

kill HUP 22202

来杀掉这个僵尸进程

Dockerfile:集成ssh和mysql

这个Dockerfile可以自动build集成ssh和mysql的image,并且可以通过修改my.cnf配置文件来自定义mysql数据库目录,同时可以指定ssh密码.
一共需要四个文件

1.Dockerfile:build镜像
2.run.sh :设置ssh,并且可以添加需要自启动的一些服务
3.set_root_pw.sh:启动容器时自定义ssh密码
4.my.cnf :mysql配置文件,可以修改相关参数

注:我在github中也提交了,地址是:https://github.com/insoz/docker-mysql

Dockerfile

FROM centos:centos6
MAINTAINER Fengnian Liu 

RUN yum -y install openssh-server epel-release && \
    yum -y install pwgen && \
    rm -f /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_rsa_key && \
    ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_ecdsa_key && \
    ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key && \
    sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config && \
    sed -i "s/UsePAM.*/UsePAM yes/g" /etc/ssh/sshd_config &&\
    yum -y install mysql mysql-devel mysql-server

VOLUME ["/data/docker/mysql","/data/mysql"]
RUN rm -rf /etc/my.cnf
ADD my.cnf /etc/my.cnf
ADD set_root_pw.sh /set_root_pw.sh
ADD run.sh /run.sh
RUN chmod +x /*.sh
RUN yum clean all

ENV AUTHORIZED_KEYS **None**

EXPOSE 22 3306
CMD ["/run.sh"]

run.sh

#!/bin/bash

if [ "${AUTHORIZED_KEYS}" != "**None**" ]; then
    echo "=> Found authorized keys"
    mkdir -p /root/.ssh
    chmod 700 /root/.ssh
    touch /root/.ssh/authorized_keys
    chmod 600 /root/.ssh/authorized_keys
    IFS=$'\n'
    arr=$(echo ${AUTHORIZED_KEYS} | tr "," "\n")
    for x in $arr
    do
        x=$(echo $x |sed -e 's/^ *//' -e 's/ *$//')
        cat /root/.ssh/authorized_keys | grep "$x" >/dev/null 2>&1
        if [ $? -ne 0 ]; then
            echo "=> Adding public key to /root/.ssh/authorized_keys: $x"
            echo "$x" >> /root/.ssh/authorized_keys
        fi
    done
fi

if [ ! -f /.root_pw_set ]; then
        /set_root_pw.sh
fi
service mysqld start
/usr/bin/mysqladmin -u root password 'insoz'
sed -i "/mysqladmin/d" /run.sh
sed -i "/run/d" /run.sh
exec /usr/sbin/sshd -D

set_root_pw.sh

#!/bin/bash

if [ -f /.root_pw_set ]; then
        echo "Root password already set!"
        exit 0
fi

PASS=${ROOT_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${ROOT_PASS} ] && echo "preset" || echo "random" )
echo "=> Setting a ${_word} password to the root user"
echo "root:$PASS" | chpasswd

echo "=> Done!"
touch /.root_pw_set

echo "========================================================================"
echo "You can now connect to this CentOS container via SSH using:"
echo ""
echo "    ssh -p  root@"
echo "and enter the root password '$PASS' when prompted"
echo ""
echo "Please remember to change the above password as soon as possible!"
echo "========================================================================"

my.cnf

[client]
port		= 3306
socket		= /tmp/mysql.sock
[mysqld]
port		= 3306
socket		= /tmp/mysql.sock
datadir = /data/mysql
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 20M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
query_cache_size = 32M
max_connections=500
wait_timeout=10
max_connect_errors = 100
wait_timeout=2880000
interactive_timeout = 2880000
log-bin=mysql-bin
binlog_format=mixed
server-id	= 1
innodb_data_home_dir = /data/mysql
innodb_data_file_path = ibdata1:500M;ibdata2:500M:autoextend
innodb_log_group_home_dir = /data/mysql
innodb_buffer_pool_size = 2G
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 512M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout

使用说明

docker build

[root@insoz docker-mysql]# docker build -t insoz/mysql:yum .

启动容器

docker run --restart always -d -p 127.0.0.1:22:22 -p 3306:3306 -v /data/docker/mysql:/data/mysql --name DB insoz/mysql:yum

设置数据库文件目录

-v /data/docker/mysql:/data/mysql

设置mysql密码
编辑 run.sh

/usr/bin/mysqladmin -u root password 'insoz'

设置ssh的root密码
启动容器时做如下操作

 docker run -d -p 0.0.0.0:2222:22 -e ROOT_PASS="mypass" insoz/mysql:yum

进入容器

ssh -p 22 root@127.0.0.1
docker exec -it 容器ID /bin/bash

浏览器中的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的一个开源项目,可能有些地方不是很准确