日期:2017-02-24

更新:2021-09-13

平台:Centos 7

最新安装

请务必使用UFW防火墙添加客户端使用的IP和SS服务的端口,如果是阿里云机器务必卸载安骑士

一键安装

wget --no-check-certificate https://raw.githubusercontent.com/lanlandezei/shadowsocks-libev/main/install.sh && chmod +x install.sh && bash install.sh

使用 snap 安装

# install snap

# Adding EPEL to CentOS 8
dnf install epel-release
dnf upgrade

# Adding EPEL to CentOS 7
yum install epel-release

# install
yum install snapd -y
systemctl enable --now snapd.socket

# install shadowsocks
snap install shadowsocks-libev --edge

vim /var/snap/shadowsocks-libev/common/etc/shadowsocks-libev/config.json

# 修改配置端口
# 使用下面推荐配置

# 启动
systemctl start snap.shadowsocks-libev.ss-server-daemon.service
systemctl restart snap.shadowsocks-libev.ss-server-daemon.service && systemctl status snap.shadowsocks-libev.ss-server-daemon.service

# 查看状态
systemctl status snap.shadowsocks-libev.ss-server-daemon.service

# 开机启动
systemctl enable snap.shadowsocks-libev.ss-server-daemon.service

# 排查错误
journalctl -u snap.shadowsocks-libev.ss-server-daemon.service

# alias
snap alias shadowsocks-libev.ss-server ss-server

推荐的Shadowsocks-libev服务器配置

{
    "server":["::0","0.0.0.0"],
    "server_port":4433,
    "encryption_method":"chacha20-ietf-poly1305",
    "password":"55hrNuBSPjnm9r0R0tHgSw==",
    "mode":"tcp_only",
    "fast_open":false
}

旧版2017安装

两行代码快速安装, 注意系统装 centos 7

wget --no-check-certificate -O shadowsocks-libev.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev.sh

chmod +x shadowsocks-libev.sh && ./shadowsocks-libev.sh

# 卸载
./shadowsocks-libev.sh uninstall

# 使用命令
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
查看状态:/etc/init.d/shadowsocks status

其他

锐速 > BBR TCP 网络优化

优化

  1. 主要通过第一次 TCP 握手后服务器产生 Cookie 作为后续 TCP 连接的认证信息,客户端通过 TCP 再次连接到服务器时,可以在 SYN 报文携带数据(RFC793),降低了握手频率,可避免恶意攻击并大幅降低网络延迟(参考)
echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
sysctl -e -p
  1. 改善 TCP 拥塞算法

HTTP 协议在传输层使用 TCP 协议,TCP 丢包重传机制算法的不同会大幅影响科学上网速度;

vim /etc/sysctl.conf
net.ipv4.tcp_congestion_control = bbr 这一行(若没有请手动添加)
net.core.default_qdisc = fq
#将网络拥塞队列算法设置为性能和延迟最佳的fq_codel

sysctl -e -p

其后接的算法主要有 cubic,hybla,bbr 等
cubic  #由bic算法衍化而来,适用于低丢包率网络
hybla  #卫星链路使用的算法,适用于高延迟,高丢包率的网络
bbr    #由Google开源的算法,适用于低延迟,较低丢包率的网络(需要手动配置*)
  1. 内核优化
vim sysctl.conf

fs.file-max = 1024000
#系统所有进程一共可以打开的句柄数(bytes)
kernel.msgmnb = 65536
#进程通讯消息队列的最大字节数(bytes)
kernel.msgmax = 65536
#进程通讯消息队列单条数据最大的长度(bytes)
kernel.shmmax = 68719476736
#内核允许的最大共享内存大小(bytes)
kernel.shmall = 4294967296
#任意时间内系统可以使用的共享内存总量(bytes)

编辑和写入如下代码,限制用户档案的体积大小,提高系统稳定性,完成后保存

vim /etc/security/limits.conf

*                soft    nofile           512000
#用户档案警告体积大小(bytes)
*                hard    nofile          1024000
#用户档案最大体积大小(bytes)

  1. TCP 的各种优化
vim sysctl.conf

net.core.rmem_max = 12582912
#设置内核接收Socket的最大长度(bytes)
net.core.wmem_max = 12582912
#设置内核发送Socket的最大长度(bytes)
net.ipv4.tcp_rmem = 10240 87380 12582912
#设置TCP Socket接收长度的最小值,预留值,最大值(bytes)
net.ipv4.tcp_rmem = 10240 87380 12582912
#设置TCP Socket发送长度的最小值,预留值,最大值(bytes)
net.ipv4.ip_forward = 1
#开启所有网络设备的IPv4流量转发,用于支持IPv4的正常访问
net.ipv4.tcp_syncookies = 1
#开启SYN Cookie,用于防范SYN队列溢出后可能收到的攻击
net.ipv4.tcp_tw_reuse = 1
#允许将等待中的Socket重新用于新的TCP连接,提高TCP性能
net.ipv4.tcp_tw_recycle = 0
#禁止将等待中的Socket快速回收,提高TCP的稳定性
net.ipv4.tcp_fin_timeout = 30
#设置客户端断开Sockets连接后TCP在FIN等待状态的实际(s),保证性能
net.ipv4.tcp_keepalive_time = 1200
#设置TCP发送keepalive数据包的频率,影响TCP链接保留时间(s),保证性能
net.ipv4.tcp_mtu_probing = 1
#开启TCP层的MTU主动探测,提高网络速度
net.ipv4.conf.all.accept_source_route = 1
net.ipv4.conf.default.accept_source_route = 1
#允许接收IPv4环境下带有路由信息的数据包,保证安全性
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
#拒绝接收来自IPv4的ICMP重定向消息,保证安全性
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
#禁止发送在IPv4下的ICMP重定向消息,保证安全性
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
#关闭反向路径回溯进行源地址验证(RFC1812),提高性能
net.ipv4.icmp_echo_ignore_broadcasts = 1
#忽略所有ICMP ECHO请求的广播,保证安全性
net.ipv4.icmp_ignore_bogus_error_responses = 1
#忽略违背RFC1122标准的伪造广播帧,保证安全性
net.ipv6.conf.all.accept_source_route = 1
net.ipv6.conf.default.accept_source_route = 1
#允许接收IPv6环境下带有路由信息的数据包,保证安全性
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
#禁止接收来自IPv6下的ICMPv6重定向消息,保证安全性
net.ipv6.conf.all.autoconf = 1
#开启自动设定本地连接地址,用于支持IPv6地址的正常分配
net.ipv6.conf.all.forwarding = 1
#开启所有网络设备的IPv6流量转发,用于支持IPv6的正常访问

今天来看曾今的方案(2017-04-11),貌似还适用

项目迭代推进方案(v0.0.2)

前言

为了推进杭州研发部的日常开发工作的管理,特制定此方案,供大家参考讨论。

调研相关产品

主要有 2 种模式 - 列表模式:更好地组织、细分和管理任务,适用于一般项目管理 - 看板模式:擅长处理流程化任务,适用于产品研发、用户支持等场景

团队组织方式

  1. 每个迭代周期会根据当前的任务计划产品需求将团队拆分成不同的 Feature Team
  2. 指定出各个 Feature TeamFeature Owner
  3. Feature Owner 负责整个迭代的进度协调和资源协调
  4. Feature Owner 的指定指定原则为其本身工作与其他人需要最多协调的同学担任
  5. 另外为了让每一个同学得到锻炼,Feature Owner 会优先让没有得到锻炼的同学担任

工作计划

  1. 季度为周期
    • 明确每个季度杭州整个部门的任务计划
    • 设定整体的路线图(Roadmap)和里程碑(Milestone
    • 设定各个小组的质量标准
  2. 任务计划涵盖
    • 公司业务和产品相关计划
    • 技术计划
  3. 每个开发小组,制定出详细的任务计划
    • 季度计划(RoadmapMilestone
    • 月度计划
    • 每周迭代计划

迭代管理

  1. 管理工具
    • Teambition
    • TAG 标签,合理运用标签,方便筛选查询任务
      • 需求
      • UI
      • Android
      • iOS
      • 前端
      • PHP
      • Go
      • Node
      • BigData
      • Machine Learning
    • 任务分组分:
      • 需求板
      • BUG
      • 相关项目分类
  2. 迭代流程
    • 产品人员制定产品需求,并将其罗列到任务看板需求板
    • 产品召集相关人员进行需求评审,讨论确定需求,同时讨论出本次迭代的 Feature Owner
    • 需求评审结束后,产品将讨论确定后的需求更新到 Teambition 中,Feature Owner 将产品需求拆解成开发需求并列出开发计划,并通知相关参与人员
    • Feature Owner 负责整个开发期间的进度协调和资源协调
    • 每个迭代上线后, Feature Owner 汇总 Feature 问题,并总结相关经验,参与迭代的相关人员给 Feature Owner 评分(4.8 以上小礼物奖励)

晨会 Review

  1. 每天早上 9 点 40 组织大家晨会
  2. 晨会原则上以 Feature Team 为单位展开或者按
  3. 晨会主要回顾昨天的工作计划和几天的计划,重点说明被 Block 的部分和需要资源协调的部分
  4. 汇总日报到betty

Bugtrace

  1. 将线上 Bug 统一提交到 TeambitionBugtrace 的任务看板中,以 TAG 分类
  2. 每周的任务迭代需要将看板中的 Bug 作为任务项之一持续修复

工程师文化

  1. Wiki
    • 业务 Wiki
      • 一些关键业务接口或者功能必须文档化
    • 知识 Wiki
      • 鼓励大家分享工作相关的高质量技术文章
      • 可以原创也可以转载
  2. 编码质量
    • 制定出各个语言的 Code Style,并且严格执行
    • 可以适当的开展 Code Review 活动,提高大家对代码的质量要求

需求

存储设备(移动硬盘、NAS、PC)存着大量文件,如何进行统一管理是个工程问题

需求可能有:

  1. 公司内网局域网分享需求
  2. 家庭内网分享需求

工具

  1. chfs

地址

官网提供了各个版本,可以安装到各个系统(pc,软路由 和 nas)

CuteHttpFileServer/chfs是一个免费的、HTTP协议的文件共享服务器,使用浏览器可以快速访问。

它具有以下特点:

  • 单个文件,核心功能无需其他文件
  • 跨平台运行,支持主流平台:Windows,Linux和Mac
  • 界面简洁,简单易用
  • 支持扫码下载和手机端访问,手机与电脑之间共享文件非常方便
  • 支持账户权限控制和地址过滤
  • 支持快速分享文字片段
  • 支持webdav协议
  • 支持一部分视频,图片预览
  1. miniserve

地址

miniserve is a small, self-contained cross-platform CLI tool that allows you to just grab the binary and serve some file(s) via HTTP. Sometimes this is just a more practical and quick way than doing things properly.

  1. minio

地址

这个已经是完整的工程项目了,类似 oss

非常适合自建

应用场景

  1. 我的软路由挂载了多个移动硬盘,外网或者内网想直接访问里面视频和图片(chfs,miniserve)
  2. 我想自建图床(minio)

install

etcd-install.sh

ETCD_VER=v3.4.14

# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GITHUB_URL}

rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test

curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz

/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version

mv /tmp/etcd-download-test/etcd /usr/local/bin/
mv /tmp/etcd-download-test/etcdctl /usr/local/bin/

Configure the etcd on all nodes

create etcd.service

创建新用户,可选

sudo groupadd --system etcd
sudo useradd -s /sbin/nologin --system -g etcd etcd

sudo mkdir -p /var/lib/etcd/
sudo mkdir /etc/etcd
sudo chown -R etcd:etcd /var/lib/etcd/

创建启动服务

# 节点别名 ETCD_NAME=$(hostname -s)
ETCD_NAME="etcd-main"

# 制定网卡,获取内网 ip
INT_NAME="eth0"
ETCD_HOST_IP=$(ip addr show $INT_NAME | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

# 外网IP
ETCD_HOST_IP_OUT=47.99.136.83

# 多节点IP配置, 需要在 `/etc/hosts` 配置 `etcd1` `etcd2` `etcd3` 的 `ip` 地址, 内网可连填内网,不可连填外网
17.0.0.1 etcd1
17.0.0.2 etcd2
17.0.0.3 etcd3

# 服务配置
cat <<EOF | sudo tee /etc/systemd/system/etcd.service
[Unit]
Description=etcd service
Documentation=https://github.com/etcd-io/etcd

[Service]
Type=notify
User=root
ExecStart=/usr/local/bin/etcd \\
  --name ${ETCD_NAME} \\
  --data-dir=/var/lib/etcd \\
  --initial-advertise-peer-urls http://${ETCD_HOST_IP}:2380 \\
  --listen-peer-urls http://0.0.0.0:2380 \\
  --listen-client-urls http://0.0.0.0:2379 \\
  --advertise-client-urls http://${ETCD_HOST_IP}:2379,http://${ETCD_HOST_IP_OUT}:2380 \\
  --initial-cluster-token etcd-cluster-0 \\
  --initial-cluster ${ETCD_NAME}=http://${ETCD_NAME}:2380,etcd1=http://etcd1:2380 \\
  --initial-cluster-state new \

[Install]
WantedBy=multi-user.target
EOF


sudo systemctl daemon-reload
sudo systemctl enable etcd
sudo systemctl start etcd
sudo systemctl status etcd

或者手动启动

./etcd --name etcd0 --initial-advertise-peer-urls http://10.0.64.100:2380 \
  --listen-peer-urls http://0.0.0.0:2380 \
  --listen-client-urls http://0.0.0.0:2379  \
  --advertise-client-urls http://10.0.64.100:2379,http://125.94.39.48:2380 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster etcd0=http://10.0.64.100:2380,etcd1=http://10.0.64.101:2380,etcd2=http://10.0.64.102:2380 \
  --initial-cluster-state new >> etcd.log 2>&1 &

注意事项:

  1. 启动服务中用户,User=etcd 或者 root
  2. 配置中: –name 属性 和 –initial-cluster 的 ${ETCD_NAME} 要对应的上
  3. 内外网:advertise-client-urls 内网 ip 和外网 ip 网卡不一致需要把 2 个都带上, 如:–advertise-client-urls http://10.0.64.100:2379,http://125.94.39.48:2380

其他:安全设置和防火墙开关

# For CentOS / RHEL Linux distributions, set SELinux mode to permissive.

sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

# RHEL / CentOS / Fedora firewalld
sudo firewall-cmd --add-port={2379,2380}/tcp --permanent
sudo firewall-cmd --reload

# Ubuntu/Debian
sudo ufw allow proto tcp from any to any port 2379,2380

测试节点 Test Etcd Cluster installation

# cli
etcdctl member list --write-out=table
etcdctl endpoint health

# cmd
etcdctl set /message "Hello World"
etcdctl get /message

# api
export ETCDCTL_API=3
#内网访问
etcdctl  --endpoints=http://10.0.64.100:2379,http://10.0.64.101:2379,http://10.0.64.102:2379 member list
#公网访问
etcdctl  --endpoints=http://125.94.39.48:2379,http://125.94.39.105:2379,http://59.37.136.50:2379 member list
curl http://125.94.39.48:2379/v2/keys/message

增加新节点

  1. 在现有集群接点添加新节点
  2. 新节点启动 etcd

现有集群:

  1. 配置 hosts 如: sht-sgmhadoopdn-04
  2. etcdctl member add sht-sgmhadoopdn-04 –peer-urls=”http://sht-sgmhadoopdn-04:2380”

新节点启动:

  1. 带上所有 ETCD_INITIAL_CLUSTER 进行启动

将各节点 etcd.conf 配置文件的变量 ETCD_INITIAL_CLUSTER 添加新节点信息,然后依次重启。

参考

etcd doc

手把手教你 Etcd 的云端部署 2019 年 10 月 16 日

etcd 集群添加节点

Tutorial: Set up a Secure and Highly Available etcd Cluster