audit.sh

Use PROMPT_COMMAND for bash, and precmd for zsh.

mkdir -p /var/log/.audit
touch /var/log/.audit/audit.log
chown nobody:nobody /var/log/.audit/audit.log
chmod 002 /var/log/.audit/audit.log
chattr +a /var/log/.audit/audit.log

Save to /etc/profile.d/audit.sh

HISTSIZE=500000
HISTTIMEFORMAT=" "
export HISTTIMEFORMAT
export HISTORY_FILE=/var/log/.audit/audit.log
export PROMPT_COMMAND='{ curr_hist=`history 1|awk "{print \\$1}"`;last_command=`history 1| awk "{\\$1=\"\" ;print}"`;user=`id -un`;user_info=(`who -u am i`);real_user=${user_info[0]};login_date=${user_info[2]};login_time=${user_info[3]};curr_path=`pwd`;login_ip=`echo $SSH_CONNECTION | awk "{print \\$1}"`;if [ ${login_ip}x == x ];then login_ip=- ; fi ;if [ ${curr_hist}x != ${last_hist}x ];then echo -E `date "+%Y-%m-%d %H:%M:%S"` $user\($real_user\) $login_ip [$login_date $login_time] [$curr_path] $last_command ;last_hist=$curr_hist;fi; } >> $HISTORY_FILE'
echo "local6.*  /var/log/commands.log" > /etc/rsyslog.d/commands.conf
systemctl restart rsyslog.service
precmd() { eval 'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history | tail -n1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"' }

GitHub Actions Canceled Unexpectedly

How to Activate Noise Cancellation with One AirPod

Settings - Accessibility - AirPods, toggle on Noise Cancellation with One AirPod.

AirPods Pro 开启单只降噪:设置 - 辅助功能 - AirPods,打开 一只 AirPod 入耳时使用降噪

[转]服务端高并发分布式架构演进之路

原文 服务端高并发分布式架构演进之路,本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则。

  1. 0
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11
  13. 12
  14. 13
  15. 14

架构设计的原则:

  1. N+1设计。系统中的每个组件都应做到没有单点故障;
  2. 回滚设计。确保系统可以向前兼容,在系统升级时应能有办法回滚版本;
  3. 禁用设计。应该提供控制具体功能是否可用的配置,在系统出现故障时能够快速下线功能;
  4. 监控设计。在设计阶段就要考虑监控的手段;
  5. 多活数据中心设计。若系统需要极高的高可用,应考虑在多地实施数据中心进行多活,至少在一个机房断电的情况下系统依然可用;
  6. 采用成熟的技术。刚开发的或开源的技术往往存在很多隐藏的bug,出了问题没有商业支持可能会是一个灾难;
  7. 资源隔离设计。应避免单一业务占用全部资源;
  8. 架构应能水平扩展。系统只有做到能水平扩展,才能有效避免瓶颈问题;
  9. 非核心则购买。非核心功能若需要占用大量的研发资源才能解决,则考虑购买成熟的产品;
  10. 使用商用硬件。商用硬件能有效降低硬件故障的机率;
  11. 快速迭代。系统应该快速开发小功能模块,尽快上线进行验证,早日发现问题大大降低系统交付的风险;
  12. 无状态设计。服务接口应该做成无状态的,当前接口的访问不依赖于接口上次访问的状态。

Google Code Review Guide

  1. 原则:给出技术上的建议,而不是个人偏好
  2. 写一个好的 commit:
    1. 第一行,改动的简短摘要
    2. 空行
    3. 详细提交信息
  3. 小修改,多提交
    1. 方便 review/merge/roll back
    2. 利于好的代码设计,减少 bug
  4. Code review 看什么?
    1. 设计
    2. 功能实现是否正确,以及复杂度
    3. 测试
    4. 命名,注释,代码风格,文档等
  5. 尽早 review,尽快 review
  6. 好的 code review comment
    1. Be kind
    2. 只指出问题,让开发人员自己决定怎么修改
    3. Encourage developers to simplify code

如何写出优雅的 Golang 代码

原文是一篇非常赞的工程总结,推荐。这里记录一些笔记

  1. 代码规范,gofmt, goimports, golangci-lint 等,配合 CI 自动化
  2. 目录结构 Standard Go Project Layout
    1. /pkg 可以被外部使用包模块
    2. /internal 私有模块,不可被外部使用
    3. 不要有 /src 目录
    4. /cmd 生成可执行文件
    5. /api 对外提供的 API 模块
    6. 不要有 model/controller 这样的模块,按照职责拆分,面向接口开发
  3. 不要在 init 做资源初始化,比如 rpc/DB/Redis 等,因为 init 会被隐式执行,会默默初始化资源连接
  4. 推荐的做法是 Client + NewClient,显式初始化连接
  5. init 阶段适合做一些简单、轻量的前置条件判断,比如 flag 设置
  6. 使用 GoMock/sqlmock/httpmock/monkey 做 mock + 测试

Simple techniques to optimise Go programs 介绍了一些简单却非常高效的性能提升方法:

  • Avoid using structures containing pointers as map keys for large maps, use ints or bytes
  • Use strings.Builder to build up strings
  • Use strconv instead of fmt.Sprintf

Power of g in Vim

:[range]g[!]/pattern/cmd

! means do not match pattern, cmd list:

  • d: delete
  • m: move
  • t: copy, or co
  • s: replace

for more info:

动态添加/删除 Hadoop DataNode

添加节点

  1. NameNode 添加节点 etc/hadoop/slaves
  2. 同步 etc/hadoop 配置
  3. 在新节点 ./sbin/hadoop-daemon.sh start datanode
  4. 在 NameNode 刷新 hdfs dfsadmin -refreshNodes

删除节点

  1. etc/hadoop/excludes 写入要删掉的节点地址
  2. 修改 etc/hadoop/hdfs-site.xml:
  <property>
    <name>dfs.hosts.exclude</name>
    <value>/home/web/hadoop/etc/hadoop/excludes</value>
  </property>
  1. 修改 etc/hadoop/mapred-site.xml, 这个是下线 nodemanager
  <property>
    <name>mapred.hosts.exclude</name>
    <value>/home/web/hadoop/etc/hadoop/excludes</value>
    <final>true</final>
  </property>
  1. 修改 etc/hadoop/slaves,去掉要删除的节点
  2. 同步 etc/hadoop/excludesetc/hadoop/slaves 到所有 NameNode
  3. 在 NameNode 执行 hdfs dfsadmin -refreshNodes
  4. hdfs dfsadmin -report 查看要删除的节点状态变化 Normal -> Decommission in progress -> Decommissioned
  5. 在要删除的节点 ./sbin/hadoop-daemon.sh stop datanode,等待 Admin State 变更为 Dead

检查节点

hdfs fsck / 检查文件系统信息,正常是 Status: HEALTHY,如果 Status: CORRUPT 说明 blocks 有损坏,其中 Missing blocks 表示有丢失,但有备份,Missing blocks (with replication factor 1) 表示 block 损坏丢失也没有备份,不可恢复。

可以用 hdfs fsck / -delete 来检查并删除有损坏的 blocks.

调整 JournalNode

  1. 修改 etc/hadoop/hdfs-site.xml:
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/cluster</value>
  </property>
  1. 同步到所有节点
  2. 如果是新增节点,要同步 dfs.journalnode.edits.dir 下 edits 文件
  3. 在调整的 journalnode 节点启动/关停: ./sbin/hadoop-daemon.sh start journalnode
  4. 重启 standby NameNode: sbin/hadoop-daemon.sh stop|start namenode
  5. 切换节点为 active: hdfs haadmin -failover nn1 nn2,重启其他 namenode
  6. 检查 NN 状态 hdfs haadmin -getServiceState nn1

调整 NodeManager

  1. 修改 etc/hadoop/yarn-site.xml
  <property>
    <name>yarn.resourcemanager.nodes.exclude-path</name>
    <value>/home/pubsrv/hadoop/etc/hadoop/excludes</value>
  </property>
  1. 同步到 ResourceManager
  2. 重启 ResourceManager,sbin/yarn-daemon.sh stop|start resourcemanager
  3. 修改 excludes,添加要删除的节点地址
  4. yarn rmadmin -refreshNodes
  5. yarn node -list -all 检查

调整 Spark 节点

Using special SSH key for Git

In ~/.ssh/config:

host github.com
    HostName github.com
    IdentityFile ~/.ssh/id_rsa_github
    User git

don’t forget chmod 600 ~/.ssh/config

Or, use GIT_SSH_COMMAND environment variable:

export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null"

Regex Unicode Scripts

  1. \p{Han} 匹配中文、日语文字,支持简繁体。
  2. \p{Common} 匹配符号
  3. \p{Latin} 匹配拉丁语系
  4. 需要 grep perl 支持,即 grep -P "\p{Han}",或者 rg/ag.
echo '中文/繁體/片仮名/かたかな/カタカナ/katakana' | rg "\p{Han}"   > 中文 繁體 片仮名
echo '中文@mail.com' | rg "\p{Common}"                                > @ .
echo '中文@mail.com' | rg "\p{Latin}"                                 > mail com

Unicode Scripts for more.