Posts

在4年前加入GLODON的时候,当时我们正在从传统的CS,单体的中心数据库,私有数据中心 向分布式,混合云架构演进。我们现在构建,部署,运营分布式关系/图像/键值数据库, 分布式检索,基于HDFS和对象存储的大数据分析平台。

在这个过程中,打心里认为学到的最重要的一个简单概念:日志。有时候我们叫它预写日志, 提交日志或事务日志。日志伴随着计算机出现就一直存在,是分布式数据系统和实时应用 架构的核心。

你不会完全理解数据库,NoSQL,键值存储,复制,paxos共识,hadoop,版本控制等任务 软件系统,除非完全理解日志。然而大部分程序员其实对日志并不熟悉。本贴将带你一步步 了解日志,包括什么是日志,如何有效的使用日志,通过日志来构建数据集成,实时数据处理 等业务系统。

第一个部分:什么是日志

日志可能是最简单的存储抽象。它是一个只可追加的,完全按照时间顺序记录的数据序列。 新的记录追加到日志存储的末尾。读取的时候从左向右处理。每一条记录条目分配了一个 唯一的日志序列号。

日志的存储次序定义了时间的概念,因为左边的日志条目始终比右边的日志存储的时间更早。 日志条目唯一序列号可以看做日志条目时间戳。把这个顺序定义为时间咋一看觉得奇怪,但 这个属性很方便的和特定的物理时钟隔离开来。这个属性很快证明是分布式系统所必须的。

日志条目的内容和格式不是本贴讨论内容要重点关心的。而且我们也不能无限的追加记录, 因为存储空间的限制。我们晚点开会谈到这一点。

因此,日志和文件,数据表没有根本不同。文件是字节数组,数据表是记录数组,日志只是 一个特定的类型的文件或数据表:日志数组按时间排序。

到此,你可能奇怪,我们有啥必要讨论如此简单的东西?只可追加的日志序列到底和数据系统 在哪些方面有关联呢?答案是日志有一个特殊的目的:记录什么时间发生了什么事。对分布式 系统来说,在很多方面,这都是核心问题。

但在我们继续讨论之前,让我先澄清一个让人困惑的事情。每一个程序员应该对另一种日志定义 非常熟悉并经常使用:非结构化的错误日志或跟踪日志,这些日志由应用程序利用syslog或 log4j写到本地文件系统。这类日志我们叫做应用日志。应用日志是我要描述的日志的退化形式。 他俩最大的区别是应用日志主要是用来运维开发人员读取使用,而我描述的数据日志主用来被 程序访问。

数据库日志

我不知道数据库日志的真正起源,可能就像二分查找一样,因为太过于简单,发明者都没有意识 到这是一个发明。它最早在IBM的System R中使用,用作各种数据结构和索引在崩溃的后同步。 为了保证数据的原子性和持久性,数据库把要修改的记录在提交前先写入日志。日志记录发生了什么 ,是每个数据表或索引表的历史投影。因为日志被立即写入存储盘,被作为系统崩溃发生后进行 系统恢复有效的数据来源。

慢慢的,日志的使用范围从ACID的实现细节扩展到数据库间的数据复制机制。实践证明,这些 本地数据库数据的变更记录正是要保持远程的数据库副本同步所必需的。Oracle, MySQL和 PostgreSQL都有日志传送协议,在从库上做数据库复制。

分布式系统日志

日志解决的两个问题:变更顺序和数据分发,在分布式数据系统中更加重要。对数据变更顺序的 达成一致是这些系统设计的核心问题。

以日志为中心作为分布式系统的解决思路,源于一个简单的观察结果,我称之为状态机复制规则:

如果两个相同的,”确定性”的程序从相同的状态启动,以相同的顺便获取 相同的输入,他俩会产生相同的输出并以相同的状态结束

“确定性”是指程序处理不依赖于时间,不会因为任何其他的带外的输入影响其处理结果。那些 输出结果依赖线程的执行顺序,或者API调用*gettimeofday*,或其他不可重复的调用的程序 都是非”确定性”。

机器里面的数据是程序的状态的表示,任务处理完后,无论是数据留在才内存,还是在磁盘。

以相同的顺序产生的相同输入这一点提醒我们:这就是日志上场了。这是一个直觉概念: “确定性”的程序会从相同的日志产生相同的结果。

分布式应用看来一个相当直观思路就是:实现一个分布式一致性的日志,作为输入分发到多个 机器上处理相同的任务的程序。日志的目的就是排除输入流产生的所有非确定性输出,保证 每个处理输入流的程序副本保持在相同的状态。

如果你理解了这一点,关于这个规则就没有多深奥或多复杂啦,它或多或少的等于说:确实性的 处理过程是确定性的。然而,我认为它只是分布式系统设计更通用的设计工具之一。

以日志为中心的分布式设计的一个亮点,以时间戳为索引的日志成为程序副本的状态的时钟。 你可以用一个数字来描述一个程序副本:该副本处理的最近日志条目的时间戳。时间戳和日志 一起唯一的快照了副本的完整状态。

不同应用组的人描述日志的使用可能有所不同,数据库组的人经常区分物理日志和逻辑日志, 物理日志记录每行改变的内容,逻辑日志记录导致改变的SQL命令(CRUD)。

分布式系统文献经常把处理和复制划分为两大类别:状态机模式和主备模式。状态机模式 经常指双活,对输入请求做日志记录,每一个副本处理每一个请求。主备模式和状态机模式 有稍微的差别,主备模式为推举一个主节点,主节点会按顺便处理请求,并把处理结果的 状态作为日志同步到从节点。

变更日志101:

参考

[1] What every software engineer should know about real-time data’s unifying abstraction

https://git-lfs.github.com/

version notes some only works on 1.13 kubeadm version: &version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", GitCommit:"721bfa751924da8d1680787490c54b9179b1fed0", GitTreeState:"clean", BuildDate:"2019-02-16T15:29:34Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"} Starting with Kubernetes 1.12, the K8S.gcr.io/kube-${ARCH}, K8S.gcr.io/etcd and K8S.gcr.io/pause images don’t require an -${ARCH} suffix get all Pending pods kubectl get pods --field-selector=status.phase=Pending images list kubeadm config images list -v 4 I0217 07:28:13.305268 14495 interface.go:384] Looking for default routes with IPv4 addresses I0217 07:28:13.307275 14495 interface.go:389] Default route transits interface "enp0s3" I0217 07:28:13.

track http redirection http://wubigo.com/post -> http://wubigo.com/post/ -> https://wubigo.com/post/ curl -IL http://wubigo.com/post HTTP/1.1 301 Moved Permanently Location: https://wubigo.com/post Via: 1.1 varnish X-Cache: HIT X-Cache-Hits: 1 HTTP/1.1 200 OK Content-Length: 0 HTTP/1.1 301 Moved Permanently Strict-Transport-Security: max-age=31556952 Location: http://wubigo.com/post/ Access-Control-Allow-Origin: * X-Cache: HIT X-Cache-Hits: 1 HTTP/1.1 301 Moved Permanently Location: https://wubigo.com/post/ X-Cache: HIT X-Cache-Hits: 1 HTTP/1.1 200 OK Access-Control-Allow-Origin: * Cache-Control: max-age=600 X-Cache: HIT X-Cache-Hits: 1 main goal HTTP/2’s multiplexed connections, allowing multiple streams of data to reach all the endpoints independently.

安装mc

https://dl.min.io/client/mc/release/windows-amd64/mc.exe

mc config host add b2 http://192.168.1.3:9000   B2_keyID B2_applicationKey

  • 本地文件同步到b2

    mc cp -r . b2/wubigo/
    

安装S3CMD

https://github.com/s3tools/s3cmd/releases/download/v2.0.2/s3cmd-2.0.2.tar.gz

sudo python setup.py install

~/.s3cfg

# Setup endpoint
host_base = http://192.168.1.3:9000
host_bucket = http://192.168.1.3:9000
bucket_location = us-east-1
use_https = True

# Setup access keys
access_key =  Q3AM3UQ867SPQQA43P2F
secret_key = zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG

# Enable S3 v4 signature APIs
signature_v2 = False
  • 同步本地文件到B2

    s3cmd sync . s3://wubigo/
    

总结

在不进行任何优化的情况下,s3cmd比mc传输速度快好几倍

检查域名使用的名字服务器

https://lookup.icann.org/

更改名字服务器

更改名字服务器需通过域名注册服务商进行更改

端到端VXLAN(unicast)

ip a

ip link add vxlan0 type vxlan \
    id 42 \
    dstport 4789 \
    remote 10.12.0.172 \
    local 10.12.2.95 \
    dev eth0


ip -d link show dev vxlan0



ip addr add 192.168.8.101/24 dev vxlan0
ip link set vxlan0 up


ip r
default via 10.12.0.1 dev eth0
10.12.0.0/21 dev eth0  proto kernel  scope link  src 10.12.2.95
192.168.8.0/24 dev vxlan0  proto kernel  scope link  src 192.168.8.101


bridge fdb | grep vxlan0

ip neigh

多播vxlan(multicast)

git clone https://git.zx2c4.com/wireguard-go

创建函数

  • 分配角色

    zip function.zip index.js
    
    aws lambda create-function --function-name sns-db-function \
    --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \
    --role arn:aws:iam::465691908928:role/fn-case-role
    

发布测试消息到SNS git clone https://github.com/wubigo/node-fn/blob/master/fn-case/sns_publishtotopic.js node sns_publishtotopic.js Message MESSAGE_TEXT send sent to the topic arn:aws:sns:ap-northeast-1:465691908928:func-topic MessageID is 8b5c90f2-0c74-5985-8a34-c676c0370f73 根据MessageID查看函数执行结果 The $ in [$LATEST] needs to be escaped…[\$LATEST]. aws logs describe-log-groups --query logGroups[*].logGroupName aws logs describe-log-streams --log-group-name '/aws/lambda/my-function' --query logStreams[*].logStreamName aws logs get-log-events --log-group-name '/aws/lambda/my-function' --log-stream-name '2019/12/31/[$LATEST]7467497f9cdb4078a876ab889797793c' { "ingestionTime": 1577764111252, "timestamp": 1577764096184, "message": "2019-12-31T03:48:16.183Z\tc01c9f5e-6c33-40a1-a6d9-c11ab248ab48\tINFO\tEVENT\n{\n \"Records\": [\n {\n \"EventSource\": \"aws:sns\",\n \"EventVersion\": \"1.0\",\n \"EventSubscriptionArn\": \"arn:aws:sns:ap-northeast-1:465691908928:func-topic:2e0e0d95-f1c8-47bd-90ff-40ca4129794b\",\n \"Sns\": {\n \"Type\": \"Notification\",\n \"MessageId\": \"5f80d26e-bdeb-579f-bc81-84ea7ad4e2ae\",\n \"TopicArn\": \"arn:aws:sns:ap-northeast-1:465691908928:func-topic\",\n \"Subject\": null,\n \"Message\": \"MESSAGE_TEXT\",\n \"Timestamp\": \"2019-12-31T03:48:15.

https://medium.com/people-ai-engineering/building-a-data-lake-in-aws-9c1fb3876e23

https://towardsdatascience.com/building-a-data-pipeline-from-scratch-on-aws-35f139420ebc

restore snapshot shell snapshot.sh !#/bin/bash wget https://nodejs.org/dist/v12.13.1/node-v12.13.1-linux-x64.tar.xz tar xvf node-v12.13.1-linux-x64.tar.xz export PATH=/home/ubuntu/node-v12.13.1-linux-x64/bin:$PATH wget https://manning-content.s3.amazonaws.com/download/0/ddbbd36-251d-42ef-9934-55e5a881a336/FinalSourceCode.zip sudo apt update sudo apt install unzip unzip FinalSourceCode.zip mv Final\ Source\ Code/ sls sudo apt install python-pip pip install awscli which aws_completer cp ~/.bashrc ~/.bashrc_orig tee -a ~/.bashrc <<-'EOF' complete -C '/home/ubuntu/.local/bin/aws_completer' aws export PATH=/home/ubuntu/node-v12.13.1-linux-x64/bin:$PATH EOF aws configure npm install claudia -g claudia -v 5.11.0 cd chapter-03 npm install claudia create \ --region ap-northeast-1 \ --api-module api packaging files npm install -q --no-audit --production npm WARN pizza-api@1.

Debugging the Build Process Gatsby’s build and develop steps run as a Node.js application which you can debug using standard tools for Node.js applications. Debugging with Node.js’ built-in console console.log(args) VS Code Debugger (Auto-Config) Preferences: Type node debug into the search bar. Make sure the Auto Attach option is set to on. launch.json launch.json { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes.

Client Side Rendering(CSR) Rendering an app in a browser, generally using the DOM The initial HTML rendered by the server is a placeholder and the entire user interface and data rendered in the browser once all your scripts load. PROS Rich site interactions Fast rendering after the initial load Partial real-time updates Cheaper to host & scale CONS SEO and index issues Mostly initial bundle.js load duration Performance issues on old mobile devices/slow networks Social Media crawlers and sharing problems (SMO) Server Side Rendering(SSR) Server rendering generates the full HTML for a page

安装两种方式 从最新源代码发布版安装 git设置代理 [user] email = [email protected] name = bigo [http] proxy = http://127.0.0.1:49210 sslverify = false 系统代理 set HTTP_PROXY=http://127.0.0.1:49210/ set HTTPS_PROXY=http://127.0.0.1:49210/ 安装 go get github.com/minio/minio MAKE mkdir -p $GOPATH/src/github.com/minio cd $GOPATH/src/github.com/minio git clone https://github.com/minio/minio.git cd minio/ git checkout RELEASE.2020-01-03T19-12-21Z make -n test go install -v mkdir -p /home/bigo/go/bin which golint 1>/dev/null || (echo "Installing golint" && GO111MODULE=off go get -u golang.org/x/lint/golint) which staticcheck 1>/dev/null || (echo "Installing staticcheck" && wget --quiet https://github.

JavaScript Arrow Functions

https://zendev.com/2018/10/01/javascript-arrow-functions-how-why-when.html

微服务安全要点

  • 通信链路加密
  • 灵活的服务访问控制,包括细粒度访问策略
  • 访问日志审计
  • 服务提供方可替代性(batteries included)和可集成性

基本概念

  • 安全标识

在K8S,安全标识(service account)代表一个用户,一个服务或一组服务。

  • 安全命名

安全命名定义可运行服务的安全标识

微服务认证

  • 传输层认证
  • 终端用户认证

每一个终端请求通过JWT(JSON Web Token)校验, 支持Auth0, Firebase。

https://medium.facilelogin.com/securing-microservices-with-oauth-2-0-jwt-and-xacml-d03770a9a838

AWS leverages a standard JSON Identity and Access Management (IAM) policy document format across many services to control authorization to resources and API actions terraform https://www.terraform.io/docs/providers/aws/r/iam_role_policy.html resource "aws_iam_role_policy" "s3_policy" { name = "s3_policy" role = "${aws_iam_role.lambda_s3_role.id}" policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "ListObjectsInBucket", "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::bucket-name"] }, { "Sid": "AllObjectActions", "Effect": "Allow", "Action": "s3:*Object", "Resource": ["arn:aws:s3:::bucket-name/*"] } ] } EOF } resource "aws_iam_role" "lambda_s3_role" { name = "lambda_s3_role" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Principal": { "Service": "lambda.

运行环境 terraform -v Terraform v0.12.16 + provider.aws v2.39.0 创建函数 main.js 'use strict' exports.handler = function(event, context, callback) { var response = { statusCode: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' }, body: '<p>Hello world!</p>' } callback(null, response) } zip ../example.zip main.js 上传 awslocal s3api create-bucket --bucket=terraform-serverless-example awslocal s3 cp example.zip s3://terraform-serverless-example/v1.0.0/example.zip 创建资源 lambda.tf resource "aws_lambda_function" "example" { function_name = "ServerlessExample" # The bucket name as created earlier with "aws s3api create-bucket" s3_bucket = "terraform-serverless-example" s3_key = "v1.

Normally, ${SNAP_DATA} points to /var/snap/microK8S/current. snap.microK8S.daemon-docker, is the docker daemon started using the arguments in ${SNAP_DATA}/args/dockerd

$snap start microK8S
$microK8S.docker pull registry.cn-beijing.aliyuncs.com/google_containers/pause:3.1
$microK8S.docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 K8S.gcr.io/pause:3.1


for resource under namespace kube-system all-namespaces don’t include kube-system

$microK8S.kubectl describe po calico-node-4sq5r --namespace=kube-system

https://events.static.linuxfound.org/sites/events/files/slides/2016%20-%20Linux%20Networking%20explained_0.pdf