Skip to main content

3-16

1 Node 分布式

Cap 理论

一个分布式系统最多可满足:一致性、可用性、分区容忍性的其中两项

进程与线程

  • 进程:一个独立的程序,是操作系统分配资源的最小单位
  • 线程:是进程中执行运行的最小单位

Node 特性

  • 单线程
  • 异步 I/O
  • 事件驱动

Node 分布式

  • Nginx:调度,负载均衡
  • Node 集群:处理业务
  • Redis:同步状态

image-20230316212856485

Node 多线程运行

cluster 模块,一个主线程,多个 worker 线程,通过算法协调 worker 之间的

[1][【已完结】最新 node 分布式大全](https://www.bilibili.com/video/BV1bg411x7Xm?p=3&spm_id_from=pageDriver&vd_source=4065bea3d3139c3fda8b128a6a3a90a7)

2 for of 如何获取索引

for (const [index, item] of arr.entries()) {
// ...
}

3 加载字体示例

https://fonts.googleapis.com/css?family=Open+Sans:100,400,400i,600,800

[1][转换字体格式](https://transfonter.org/)

4 docker redis with password

redis 设置密码

docker run -d \
-h redis \
-v $PWD/redis:/data \
-p 6380:6379 \
--name my-redis2 \
--restart always \
redis redis-server --appendonly yes --requirepass "ginlink"
docker run -d \
-h redis \
-v $PWD/redis:/data \
-p 6379:6379 \
--name redis-nst \
--restart always \
redis redis-server --appendonly yes
docker run -d \
-h redis \
-v $PWD/redis:/data \
-p 6379:6379 \
--name redis \
--restart always \
redis redis-server --appendonly yes --requirepass "8HHoDacSmzIF"

5 小程序局部刷新

思想:1.同组件,删除一个元素时,给元素打标记,UI 层根据该标记显示或隐藏 2.跨组件同理,将数据放状态管理器中 3.同组件虚拟列表同理 4.跨组件虚拟列表,暂无解决方案

[1][微信小程序 setData 局部刷新列表](https://www.cnblogs.com/liangyuji/p/13509598.html)

6 mongo 设置密码

6.1 mongo 单机设置密码

docker run -d \
-p 27017:27017 \
-v ~/data/mongo/mongo_chatgpt:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=admin \
--name mongo_chatgpt \
mongo \
--replSet rs0

注意 \ 后面不能有空格

6.1 mongo 副本集设置密码

cd ~
mkdir -p /root/mongodb_test/mongo_cluster/config
cd /root/mongodb_test/mongo_cluster/config
vim /root/mongodb_test/mongo_cluster/config/mongod.conf
# mongod.conf

# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
#storage:
# dbPath: /data/db
# engine:
# wiredTiger:

# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/log/mongo.log

# network interfaces
#net:
# port: 27017
# bindIp: 127.0.0.1


# how the process runs
#processManagement:
# timeZoneInfo: /usr/share/zoneinfo

# 安全项先保持注释状态,配好集群后放开。mongo.key后面步骤里会有生成。
# security:
# keyFile: /etc/mongo/mongo.key
# authorization: enabled

#operationProfiling:

# 配副本集名
replication:
replSetName: "rs0"

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:
cd ..

# 增加启动脚本 mongo_node1.sh
vim run_mongo_cluster_node1.sh

docker run --name mongo_node1 \
-h mongo_node1 \
-v /root/mongodb_test/mongo_cluster/data/node1:/data/db \
-v /root/mongodb_test/mongo_cluster/log/node1:/data/log \
-v /root/mongodb_test/mongo_cluster/config:/etc/mongo \
-p 27017:27017 \
--restart=always \
-d mongo \
--config /etc/mongo/mongod.conf

# 增加启动脚本 mongo_node2.sh
docker exec -it mongo_node1 mongosh

# 设置集群,主要,这里填写的公网ip,如果填内网ip,会导致其他无法正常访问该服务
# 原因未知
rs.initiate({
_id: 'rs0',
members: [
{ _id: 0, host: '110.42.130.99:27017' },
{ _id: 1, host: '110.42.130.99:27018' },
],
});

# 设置密码
use admin

db.createUser({user:"ginlink",pwd:"xxx",roles:[{role:'root',db:'admin'}]})

# 停止容器
docker stop mongo_node1
docker stop mongo_node2

# 打开授权
vim /root/mongodb_test/mongo_cluster/config/mongod.conf

# 增加访问文件
openssl rand -base64 756 > /root/mongodb_test/mongo_cluster/config/mongo.key
sudo chown 999 /root/mongodb_test/mongo_clusterconfig/config/mongo.key
sudo chmod 400 /root/mongodb_test/mongo_clusterconfig/config/mongo.key

# 打开容器
docker start mongo_node1
docker start mongo_node2

[1][用 Docker 搭建 MongoDB 集群(副本集)并启用认证用户名密码登录](https://www.jianshu.com/p/92b1f01977eb)

7 Nestjs 有哪些异常

  1. HttpException:HTTP 异常,用于表示 HTTP 响应中的错误状态码,例如 400、401、404 等。可以在控制器中抛出 HttpException,Nest.js 将自动处理并生成相应的 HTTP 响应。
  2. BadRequestException:用于表示客户端发送了无效请求的异常,通常与 HTTP 状态码 400(Bad Request)一起使用。
  3. UnauthorizedException:用于表示未经授权的请求的异常,通常与 HTTP 状态码 401(Unauthorized)一起使用。
  4. NotFoundException:用于表示请求的资源不存在的异常,通常与 HTTP 状态码 404(Not Found)一起使用。
  5. ForbiddenException:用于表示请求的操作不被允许的异常,通常与 HTTP 状态码 403(Forbidden)一起使用。
  6. InternalServerErrorException:用于表示服务器内部错误的异常,通常与 HTTP 状态码 500(Internal Server Error)一起使用。
  7. RpcException:用于表示 RPC 调用失败的异常,例如使用 Microservices 时发生的错误。
  8. WebSocketException:用于表示 WebSocket 连接错误的异常,例如连接关闭或消息发送失败。

8 Nestjs 如何指定内容到 dist 中?

[1] https://docs.nestjs.com/cli/monorepo#assets

Nestjs 不会自动输出一些杂项,要输出指定内容到 dist,需要配置 assets 字段,例如:复制 resources/* 到 dist/src 中(整个 resources 目录被复制到 dist/src 中)

{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"assets": [
{
"include": "resources/*",
"outDir": "dist/src"
}
]
}
}

9 Shell 中 ; 和 && 以及 || 区别?

  • command1 ; command2 的意思是先执行 command1,然后再执行 command2,不管 command1 的执行结果是什么。也就是说,无论 command1 是否成功执行,command2 都会被执行。

  • command1 && command2 的意思是先执行 command1,如果 command1 成功执行(返回 0),则执行 command2,否则不执行 command2。也就是说,如果 command1 执行失败,则 command2 不会被执行。

  • || 则表示 1 失败 则执行 2

10 Nginx

功能:1.反向代理 2.负载均衡

格式

有 4 种格式,权重依次降低

server {
# 1.全匹配(=),例如:匹配/a路径
location = /a {
echo '/a';
}
# 2.以什么开头(&~),例如:匹配以/a开头路径
location ^~ /a {
echo '^~ /a';
}
# 3.正则(~),例如:匹配任何非单词的路径
location ~ /\W {
echo '~ /\W';
}
# 4.跟2原理一样,但写法不同,例如:匹配任何/开头的路径
location / {
echo 'hello';
}
}

反向代理

server {
# 将/a代理到3000端口/a路径
location /a {
proxy_pass http://localhost:3000;
}
# 将/a代理到3000端口的/路径
location /a/ {
proxy_pass http://localhost:3000/;
}
}

注意上面两种写法的差异

负载均衡

http {
upstream group1 {
# 3001服务器和3002服务器轮流接受访问
server localhost:3001 weight=1;
server localhost:3002 weight=1;
}

server {
location /a/ {
proxy_pass http://group1/;
}
}
}

nginx 负载均衡的三种方式:1、轮询模式;2、最少连接;3、ip_hash

  • 轮询模式

    普通轮询方式

    该方式是默认方式,轮询适合服务器配置相当,无状态且短平快的服务使用。另外在轮询中,如果服务器挂掉,会自动剔除该服务器,该方式适合服务器配置相当,无状态且短平快的服务使用,也适用于图片服务器集群和纯静态页面服务器集群。

    权重轮询方式

    如果在 upstream 中配置的 server 参数后追加 weight 配置,则会根据配置的权重进行请求分发。此策略可以与 least_conn 和 ip_hash 结合使用,适合服务器的硬件配置差别比较大的情况。

  • 最少连接

    轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn 这种方式就可以达到更好的负载均衡效果,适合请求处理时间长短不一造成服务器过载的情况。

  • ip_hash

    上述 weight 权重模式方式存在一个问题,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。

    可以采用 ip_hash 指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 不能跨服务器的问题。

[1][nginx 负载均衡的三种方式](https://worktile.com/kb/ask/29615.html)

11 CI/CD

常见 CI/CD 工具:1.Jenkins 2.Travis

Jenkins

缺点:需要一台服务器

12 计算机网络

计算机网络分了几层,其中 数据链路层、网络层 为重点

image-20230331085407735