[root@localhost ~]# whereis ssh
ssh: /usr/bin/ssh /etc/ssh /usr/share/man/man1/ssh.1.gz
[root@localhost ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
[root@localhost ~]# cp /usr/bin/ssh /usr/bin/ssh.bak
[root@localhost ~]# strings /usr/bin/ssh |grep OpenSSH
OpenSSH_7.4p1
OpenSSH_7.4
OpenSSH_2.3.0*
OpenSSH_2.3.*
OpenSSH_2.5.3*
OpenSSH_3.*
OpenSSH_4*
OpenSSH_5*
OpenSSH_6.6.1*
OpenSSH_6.5,OpenSSH_6.6
OpenSSH*
OpenSSH-2.0,OpenSSH-2.1,OpenSSH_2.1,OpenSSH_2.2
OpenSSH_2.5.0p1,OpenSSH_2.5.1p1
OpenSSH_2.5.0,OpenSSH_2.5.1,OpenSSH_2.5.2*
OpenSSH_2.,OpenSSH_3.0,OpenSSH_3.1*
[root@localhost ~]# sed -i 's/OpenSSH_7.4/OpenSSH_9.4/g' /usr/bin/ssh
[root@localhost ~]# ssh -V
OpenSSH_9.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
IP子网与C段测试
A:192.168.56.134/26 B:192.168.56.194/24
分判断是否同一子网
由于设备A的子网是192.168.56.128到192.168.56.191,而设备B虽然在一个更大的子网范围(192.168.56.0到192.168.56.255),但其实际IP地址192.168.56.194不在设备A的子网范围内。
结论
A ping B 不通信
B ping A 不通信
设备A和设备B不在同一个子网内。若没有路由器或其他网络设备来转发它们之间的数据包,它们是无法直接通信的。
企业CxO数据库选型应该回答清楚的 15 个问题
1、这款数据库的发展历史
2、是不是适合我们当前的场景
3、是不是符合长期发展需求(数据量维度, 数据模型维度, 数据类型, 计算, 检索维度)
4、公司内部有没有会用这款产品的, 有多深
5、公司内部有没有有没有熟悉这个产品的数据库架构师
6、有没有会管理、优化的
7、有没有开发依赖的生态产品, 是否符合公司技术栈, 使用这个产品的时间成本。
8、有没有外部商业化售后服务
9、是否符合行业合规要求
10、有哪些用户在用这个产品
11、数据库源代码生命力 (开源社区的运作逻辑, 是否可以长久运作, 核心组组成,为什么贡献,提交代码的流程,代码质量,全球有多少内核开发者, 有多少国家在贡献, 代码掌握在谁手里, 开源许可, 有没有那个国家控制, 有没有那个公司控制)
12、这款数据库处于什么发展周期(上升, 下降?)
13、这款数据库未来的发展方向
14、以上数据如何量化,对比其他数据库, 有没有更合适的其他数据库产品
15、这款数据库的人才库分布如何?
1)应用开发(SQL)人才
2)应用框架开发人才
3)管理人才
4)数据库架构师人才
5)数据库底座内核开发
6)数据库应用内核开发
7)数据库服务提供商
私有部署类向日葵的RustDesk
RustDesk端口说明:
hbbs – RustDesk ID注册服务器
hbbr – RustDesk 中继服务器
- hbbs 监听21115(tcp) —-是hbbs用作NAT类型测试
- 21116(tcp/udp) —-是hbbs用作ID注册与心跳服务
- 21118(tcp) —-是hbbs用作TCP打洞与连接服务
- hbbr 监听21117(tcp) —-是hbbr用作中继服务
- 21119(tcp) 、21119(tcp) —-21118和21119是为支持网页客户端,暂时可以关闭。
Docker私有部署部署方式一:
sudo docker image pull rustdesk/rustdesk-server
sudo docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -vpwd:/root -td --net=host rustdesk/rustdesk-server hbbs -r
sudo docker run --name hbbr -p 21117:21117 -p
21118:21118 21119:21119 -vpwd:/root -td --net=host rustdesk/rustdesk-server hbbr
Docker私有部署方式二:Docker-compose
version: '3'
networks:
rustdesk-net:
external: false
services:
hbbs:
container_name: hbbs
ports:
- 21115:21115
- :21116 # 自定义 hbbs 映射端口
- :21116/udp # 自定义 hbbs 映射端口
image: rustdesk/rustdesk-server
command: hbbs -r : # 填入个人域名或 IP + hbbr 暴露端口
volumes:
- :/root # 自定义挂载目录
networks:
- rustdesk-net
depends_on:
- hbbr
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
hbbr:
container_name: hbbr
ports:
- :21117 # 自定义 hbbr 映射端口
image: rustdesk/rustdesk-server
command: hbbr
volumes:
- :/root # 自定义挂载目录
networks:
- rustdesk-net
restart: unless-stopped
deploy:
resources:
limits:
memory: 64M
Tinc简介
一. Tinc简介
Tinc VPN 是一个虚拟专用网络(VPN)守护进程,它使用隧道和加密技术在互联网上的主机之间创建一个安全的私有网络。Tinc VPN 在网络层工作,因此无需对现有软件进行修改和配置。它的数据通讯经过加密和压缩,能避免敏感数据和隐私的泄露。
二. Tinc的特点:
- 跨平台与IPv6 支持
- 加密,认证和压缩:所有流量都可以选择使用 zlib 或 LZO 进行压缩,使用 LibreSSL 或 OpenSSL 对流量进行加密,并使用消息认证码和序列号保护流量不被篡改。
- 自动全网状路由:无论如何设置 tinc 守护进程相互连接,VPN 流量总是(如果可能)直接发送到目标,而不经过中间跳转。
- NAT 穿透:只要 VPN 中的一个节点允许在公共 IP 地址上接收连接(即使是动态 IP 地址),tinc 就能进行 NAT 穿透,允许节点之间直接通信。
- 易于扩展网络节点:当你想要添加节点到你的 VPN 时,你只需要添加一个额外的配置文件,无需启动新的守护进程或创建和配置新的设备或网络接口。
- 能够桥接以太网段:你可以将多个以太网段链接在一起,使其像一个单一的段一样工作,允许你在互联网上运行通常只在 LAN 上运行的应用程序和游戏。
三. 传统的VPN:
传统的虚拟专用网络(VPN)主要有以下几种类型:
- IPsec VPN:IPsec VPN 是一种网络层的 VPN 技术,它使用 IPsec 协议来加密数据,确保数据在传输过程中的机密性和完整性。
- GRE VPN:GRE(Generic Routing Encapsulation)VPN 是一种使用 GRE 协议建立的 VPN,它可以封装各种网络层协议,用于在不同网络之间建立直接的虚拟网络连接1。
- L2TP VPN:L2TP(Layer 2 Tunneling Protocol)VPN 是一种数据链路层的 VPN 技术,它通常与 IPsec 协议一起使用,以提供安全的隧道。
- MPLS VPN:MPLS(Multi-Protocol Label Switching)VPN 是一种在 MPLS 网络上实现的 VPN,它可以提供高效的、可扩展的、基于网络层的虚拟私有网络1。
- SSL/TLS VPN:SSL/TLS VPN 是一种应用层的 VPN 技术,它使用 SSL/TLS 协议来加密数据,通常用于提供远程访问 VPN 功能。
索引使用的前提
首先,是前面提到的Access Method, 然后是使用的operator class, 以及opc中定义的operator或function;
其次,遵循CBO的选择
#seq_page_cost = 1.0
#random_page_cost = 4.0
#cpu_tuple_cost = 0.01
#cpu_index_tuple_cost = 0.005
#cpu_operator_cost = 0.0025
#effective_cache_size = 128MB
最后,遵循完CBO的选择, 还需要符合当前配置的Planner 配置
#enable_bitmapscan = on
#enable_hashagg = on
#enable_hashjoin = on
#enable_indexscan = on
#enable_material = on
#enable_mergejoin = on
#enable_nestloop = on
#enable_seqscan = on
#enable_sort = on
#enable_tidscan = on
ERROR: Functions in index expression must be marked IMMUTABLE
函数索引引用的函数必须是immutable类型
函数建分区表
按周生成分区表
do
$$
DECLARE base text; --生命sql类型
pgsqltest text; --字符串为文本类型,执行函数
i int; --i为整数
BEGIN
base = 'create table main_history_p_%s partition of main_history_p for values FROM (''%s'') to (''%s'')';
FOR i IN 0..11 loop --不是左闭右开
pgsqltest = format(base,
to_char('2024-01-01'::timestamp + (i || 'week')::INTERVAL, --第一个%s占位符
'YYYYMMDD'),
'2024-01-01'::timestamp + (i || 'week')::INTERVAL, --第二个%s占位符
'2024-01-01'::timestamp + (i + 1 || 'week')::INTERVAL); --第三个%s占位符
--raise notice '%', sqlstring;
EXECUTE pgsqltest; --执行sqlstring
END loop; --结束loop
END --结束begin
$$language plpgsql; --结束函数
按月生成分区表
do
$$
DECLARE base text; --生命sql类型
pgsqltest text; --字符串为文本类型,执行函数
i int; --i为整数
BEGIN
base = 'create table main_history_p_%s partition of main_history_p for values FROM (''%s'') to (''%s'')';
FOR i IN 0..11 loop --不是左闭右开
pgsqltest = format(base,
to_char('2024-01-01'::timestamp + (i || 'month')::INTERVAL, --第一个%s占位符
'YYYYMMDD'),
'2024-01-01'::timestamp + (i || 'month')::INTERVAL, --第二个%s占位符
'2024-01-01'::timestamp + (i + 1 || 'month')::INTERVAL); --第三个%s占位符
--raise notice '%', sqlstring;
EXECUTE pgsqltest; --执行sqlstring
END loop; --结束loop
END --结束begin
$$language plpgsql; --结束函数
PL/pgSQL编写造数据脚本
1.编写SQL脚本,插入到main_history表
1.1 创建表
CREATE TABLE main_history (
amount int4 NULL,
"content" varchar NULL,
main_id int4 NULL
);
1.2 批量插入
--_configList 使用 “_” 前缀来标识变量,用于区分sql中的字段
CREATE OR REPLACE FUNCTION batchInsert(_configList varchar[][], _main_id int) RETURNS void AS $$
DECLARE
_config varchar[];
_content varchar;
_amount int;
BEGIN
--获取二维数组的每个一维数组
FOREACH _config SLICE 1 IN ARRAY (_configList) LOOP
_content := _config[1];
_amount := _config[2];
--把变量输出到控制台
RAISE NOTICE 'config = %, content = %, amount = % main_id = %', _config, _content, _amount, _main_id;
--用变量拼接sql语句并且实际运行在server上
INSERT INTO main_history (amount, content, main_id) VALUES (_amount, _content, _main_id);
END LOOP;
END;
$$ LANGUAGE plpgsql;
--使用函数
select batchInsert(ARRAY[['ccontent1', '1'], ['content2', '2']], 1);
--删除函数
drop function batchInsert;
2. 函数说明
2.1 声明数组
声明的时候可以不额外区分一维、二维数组
_configList varchar[][] 和 _configList varchar[] 是一样的
2.2 数组赋值
声明为varchar后,赋值时也要是varchar类型。
_configList varchar[][] := (ARRAY[[‘ccontent1’, ‘1’], [‘content2’, ‘2’]]);
2.3 数组遍历
二维数组的遍历
–_configList 由外部传入, 而FOREACH SLICE IN ARRAY都是关键字
FOREACH _config SLICE 1 IN ARRAY (_configList) LOOP
_content := _config[1];
_amount := _config[2];
END LOOP;
Windows操作系统在发起请求连接时,将临时端口(范围通常为1024至65535)可能会导致以下后果:
- 无法建立新的网络连接:当所有临时端口都被使用时,新的网络连接将无法建立。这可能会导致应用程序无法访问网络资源,或者无法接受新的网络连接。
- 网络性能下降:当临时端口用完时,操作系统可能会出现网络性能下降的情况。这是因为新的连接无法建立,现有连接无法释放,导致网络拥塞和延迟增加。
- 应用程序错误:一些应用程序可能会因为无法建立新的网络连接而出现错误或崩溃。特别是那些需要大量网络连接的应用程序,如服务器软件或P2P应用程序。
- 系统不稳定:在极端情况下,如果临时端口用完并且系统无法正常处理网络连接,可能会导致操作系统变得不稳定,甚至出现死机或崩溃的情况。
