代码的尽头是数学

万万没想到TNND当年的代数几何就二三十分, 现在涉及点算法就要用到数学,

还特么要用到π、e 、辗转相除法。

ubuntu24安装angie panel

sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo curl -o /etc/apt/trusted.gpg.d/angie-signing.gpg  https://angie.software/keys/angie-signing.gpg
echo "deb https://download.angie.software/angie/$(. /etc/os-release && echo "$ID/$VERSION_ID $VERSION_CODENAME") main"  | sudo tee /etc/apt/sources.list.d/angie.list > /dev/null
sudo apt-get update
sudo apt-get install -y angie
wget https://github.com/maxname/angie-panel/releases/download/v0.2.3/angie-panel_0.2.3_amd64.deb 
apt install ./angie-panel_0.2.3_amd64.deb
cat /var/lib/angie-panel/setup-token

 

其他补全信息参考安装脚本  https://github.com/maxname/angie-panel/raw/refs/heads/main/packaging/install.sh

github编译版本发布页面https://github.com/maxname/angie-panel/releases

 

花了四年半时间,精神状态回来了,精力却回不来了。

吃了几年再普乐 喜太乐 阿戈美拉汀,终于把精神状态拉回来了,也不胡思乱想了,

每天煮点山楂水调节肠胃不再受精神状态触发便秘,

晚上也能安稳睡觉了,

但每天的精力不再像10多年前那样能半夜接客户电话起来搞完事情第二还照旧生龙活虎的那样了。

Cisco Nexus重置密码

一、背景与适用场景

Cisco Nexus 9000(N9K)跑的是 NX-OS,没有 IOS 那套 confreg / 配置寄存器机制。忘记 admin 密码时的官方恢复思路是:在启动阶段中断引导进入 loader,加载带 recoverymode 的内核进 switch(boot)# 模式,直接重置 admin 密码,再用 load-nxos 回到正常 NX-OS。

整个过程的优点很明确:不动 startup-config,业务配置原样保留。适合以下场景:

  • 忘记 admin 密码,但又不能接受清空配置(清配置意味着所有 vlan / vpc / 端口配置重做);
  • 二手或回收的 N9K,需要拿到管理权限后接管配置;
  • 交接文档丢失、密码只有离职同事知道的历史设备。

典型命令序列如下(后文逐条拆开讲):

loader> cmdline recoverymode=1
loader> dir bootflash:
loader> boot bootflash:nxos.9.3.5.bin
...
switch(boot)# configure terminal
switch(boot)(config)# admin-password Cisco@123
switch(boot)(config)# exit
switch(boot)# load-nxos

二、准备条件

Console 连接(必须):N9K 的这条恢复流程只能走控制台,SSH/Telnet 用不上。N9K 控制台常见默认速率是 115200 bps(部分版本/固件为 9600),数据位 8、无校验、1 停止位、无流控。乱码就先切波特率,再检查别的问题。
能发送 Ctrl+C 的终端:PuTTY、SecureCRT、iTerm2 + screen /dev/tty.usbserial-XXXX 115200 都可以。
记录镜像文件名:如果还能登录,先记下 show version 里的 System image file 和 show boot 的输出,loader 阶段要用到确切文件名;不能登录也没关系,loader 里用 dir 自己看。
维护窗口:恢复过程要重启,承载业务的设备会中断流量;vPC 环境中确认对端健康(show vpc)后再动手。
密码方案提前想好:NX-OS 有密码强度检查,长度不足或字符类别太单一会被拒绝。

三、详细步骤

步骤 1:接好 Console,确认能输入

串口参数设置正确后,反复回车应能看到 N9K 的登录提示;此时别急着登录,直接进入下一步重启。

步骤 2:断电重启

用电源开关、PDU、或拔插电源线给设备断电,重新上电。整个过程保持串口会话打开,准备随时按 Ctrl+C。

步骤 3:在启动阶段连续按 Ctrl+C,进入 loader

N9K 在开始自检后很快就会跳到内核引导,留给中断的窗口通常只有 1~3 秒。看到启动输出就连续敲 Ctrl+C,直到出现:

loader>

没进去就再断电重启一次。注意:N9K 不是用 Break 中断的,别拿 IOS 的习惯套上来。

步骤 4:启用恢复模式

loader> cmdline recoverymode=1

这条命令给内核加上恢复标记。它决定了设备启动后是进普通的登录界面,还是进不带鉴权的 switch(boot)#。漏掉这一步,后面 boot 完只会看到正常的 NX-OS 登录提示,恢复直接失败。

步骤 5:查看 flash 中的镜像文件

loader> dir bootflash:

部分版本也可以直接 loader> dir。输出里会列出 bootflash 下的镜像(例如 nxos.9.3.5.bin、n9000-dk9.9.3.5.bin)以及 packages.conf 一类的启动配置文件。把文件名原样记下来,写错会报 "cannot load" 或 file not found。

步骤 6:用指定镜像启动

loader> boot bootflash:nxos.9.3.5.bin

有些版本要求路径带斜杠,即 boot bootflash:/nxos.9.3.5.bin;以 dir 的输出为准。如果这台交换机平时是通过 packages.conf 启动的,也可以 boot bootflash:packages.conf。

步骤 7:进入 switch(boot)# 模式

镜像加载完成后,系统会停在 boot 模式的提示符,通常长这样:

switch(boot)#

这个模式下没有配置校验,也没有正常启动的配置加载;它是恢复密码的唯一入口。

步骤 8:重置 admin 密码

switch(boot)# configure terminal
switch(boot)(config)# admin-password Cisco@123
switch(boot)(config)# exit
switch(boot)# load-nxos
  • boot 模式下的配置提示符是 switch(boot)(config)#。网上流传的 switch(boot)(conft)# 是笔误,照着敲会报无效命令;
  • 命令缩写在这里不一定被接受,configure terminal 建议写全,别用 conf t;
  • admin-password 后面跟明文新密码,执行后 NX-OS 会把它以 hash 形式写进用户配置;
  • 部分平台/版本支持直接在 switch(boot)# 下执行 admin-password <new-password>。如果 configure terminal 报错,可以试这个变体。

步骤 9:回到正常 NX-OS 并登录

switch(boot)# load-nxos

系统按 startup-config 正常启动(业务配置保留),启动完成后用 admin + 刚设置的新密码登录。登录后立刻保存一次:

n9k# show user-account
n9k# show running-config | include ^username admin
n9k# copy running-config startup-config

步骤 10:重启复验

n9k# reload
Proceed with reload? [confirm]

重启后再次登录,确认新密码是持久的,而不是只存在于内存里。

四、验证方法

  1. n9k# show user-account:能看到 admin,角色为 network-admin;
  2. n9k# show running-config | include ^username:能看到 admin 一行(NX-OS 用 username admin password 5 <hash> role network-admin 的形式存储);
  3. n9k# copy running-config startup-config 之后,n9k# show startup-config | include ^username 应能看到同一行,说明已落盘;
  4. 用新密码从 Console 重新登录一次,再用 SSH 登录一次(确认没有额外的 AAA 限制);
  5. n9k# show boot:确认下次启动用的镜像/配置文件没有被 loader 阶段的临时指定改坏(loader 里的 cmdline recoverymode=1 只在本次启动有效,正常 load-nxos 后不需要额外清理,但值得核对一次);
  6. n9k# show vpc、n9k# show interface status:确认业务侧状态恢复正常。

五、常见坑与注意事项

  1. 用错中断键:N9K 是 Ctrl+C,不是 Break。按 Break 不会有任何 loader 提示。
  2. 漏掉 cmdline recoverymode=1:最常见的失败原因。没有它,无论怎么 boot 都会走到正常登录界面,"恢复"无从下手。
  3. 镜像名写错:一定要先用 dir bootflash: 看清楚,注意 bootflash: 前缀和斜杠写法,版本不同容错不同。
  4. loader 里 boot 失败:不要反复硬断电,回到 loader> 用 dir 重新确认文件名再 boot;确认镜像本身没有损坏(换另一个镜像试)。
  5. 密码强度检查:NX-OS 默认要求密码满足复杂度(长度至少 8 位、包含多种字符类别、通常不允许包含用户名)。admin-password 被拒绝时,换一个更复杂的密码,而不是反复重试同一个。
  6. 提示符写错:switch(boot)(conft)# 是错的,正确的是 switch(boot)(config)#。
  7. 忘记 copy running-config startup-config:boot 模式里改的密码如果没落盘,下次重启可能又回到旧密码(具体取决于版本行为),登录后立刻保存是最稳的做法。
  8. AAA / 远程认证覆盖:如果设备配了 aaa authentication login default group tacacs+ local 之类的策略,本地 admin 账号仍是 Console 兜底手段;但若 default 里只有远端组且本地被禁用,登录依旧会失败,需要检查 show running-config | include aaa 与 show aaa。
  9. 恢复不丢配置,但也不要点清配置的命令:恢复流程本身不碰 startup-config。登录后别顺手敲 write erase / no username admin 之类的清理动作,除非你确实要交付一台干净设备——那时顺序是 write erase → reload,并提前备份 copy running-config tftp:。
  10. vPC / 双上联环境:重启一台会波及流量,先 show vpc 确认对端健康,操作期间关注对端日志。
  11. N9K 的 loader 提示不支持 cmdline:极少数固件版本会报无效命令。这通常与镜像签名/安全启动策略相关,此时应走 Cisco TAC 的官方流程,不要尝试非常规手段。
  12. 密码恢复属于敏感操作:企业环境中应同步登记变更、通知安全团队,并在恢复后按规范轮换所有本地账号口令。

一句话总结:Console 接好 → 断电重启 → Ctrl+C 进 loader → cmdline recoverymode=1 → dir 找镜像 → boot bootflash:镜像 → switch(boot)# configure terminal → admin-password → load-nxos → 登录后 copy running-config startup-config 并重启复验。

 

 转载自https://gitgit.ee/cisco-nexus-9000-password-reset.html

yahoo和gmail添加app 密码登录第三方邮件客户端

https://login.yahoo.com/myaccount/security

https://myaccount.google.com/apppasswords

添加app密码后就可以登录imap了

angie NS托管自动维护泛域名ssl证书体验感

用了一段时间,发现angie的ns托管方式,签发ssl成功率并不太高,经常出现找不到TXT记录的问题。

Tmux 快捷键 & 速查表 & 简明教程

注意:本文内容适用于 Tmux 2.3 及以上的版本,但是绝大部分的特性低版本也都适用,鼠标支持、VI 模式、插件管理在低版本可能会与本文不兼容。

Tmux 快捷键 & 速查表 & 简明教程

启动新会话:

tmux [new -s 会话名 -n 窗口名]

恢复会话:

tmux at [-t 会话名]

列出所有会话:

tmux ls

关闭会话:

tmux kill-session -t 会话名

关闭所有会话:

tmux ls | grep : | cut -d. -f1 | awk '{print substr($1, 0, length($1)-1)}' | xargs kill

在 Tmux 中,按下 Tmux 前缀 ctrl+b,然后:

会话

:new<回车>  启动新会话
s           列出所有会话
$           重命名当前会话

窗口 (标签页)

c  创建新窗口
w  列出所有窗口
n  后一个窗口
p  前一个窗口
f  查找窗口
,  重命名当前窗口
&  关闭当前窗口

调整窗口排序

swap-window -s 3 -t 1  交换 3 号和 1 号窗口
swap-window -t 1       交换当前和 1 号窗口
move-window -t 1       移动当前窗口到 1 号

窗格(分割窗口)

%  垂直分割
"  水平分割
o  交换窗格
x  关闭窗格
⍽  左边这个符号代表空格键 - 切换布局
q 显示每个窗格是第几个,当数字出现的时候按数字几就选中第几个窗格
{ 与上一个窗格交换位置
} 与下一个窗格交换位置
z 切换窗格最大化/最小化

同步窗格

这么做可以切换到想要的窗口,输入 Tmux 前缀和一个冒号呼出命令提示行,然后输入:

:setw synchronize-panes

你可以指定开或关,否则重复执行命令会在两者间切换。 这个选项值针对某个窗口有效,不会影响别的会话和窗口。 完事儿之后再次执行命令来关闭。帮助

调整窗格尺寸

如果你不喜欢默认布局,可以重调窗格的尺寸。虽然这很容易实现,但一般不需要这么干。这几个命令用来调整窗格:

PREFIX : resize-pane -D          当前窗格向下扩大 1 格
PREFIX : resize-pane -U          当前窗格向上扩大 1 格
PREFIX : resize-pane -L          当前窗格向左扩大 1 格
PREFIX : resize-pane -R          当前窗格向右扩大 1 格
PREFIX : resize-pane -D 20       当前窗格向下扩大 20 格
PREFIX : resize-pane -t 2 -L 20  编号为 2 的窗格向左扩大 20 格

文本复制模式:

按下 PREFIX-[ 进入文本复制模式。可以使用方向键在屏幕中移动光标。默认情况下,方向键是启用的。在配置文件中启用 Vim 键盘布局来切换窗口、调整窗格大小。Tmux 也支持 Vi 模式。要是想启用 Vi 模式,只需要把下面这一行添加到 .tmux.conf 中:

setw -g mode-keys vi

启用这条配置后,就可以使用 h、j、k、l 来移动光标了。

想要退出文本复制模式的话,按下回车键就可以了。然后按下 PREFIX-] 粘贴刚才复制的文本。

一次移动一格效率低下,在 Vi 模式启用的情况下,可以辅助一些别的快捷键高效工作。

例如,可以使用 w 键逐词移动,使用 b 键逐词回退。使用 f 键加上任意字符跳转到当前行第一次出现该字符的位置,使用 F 键达到相反的效果。

vi             emacs        功能
^              M-m          反缩进
Escape         C-g          清除选定内容
Enter          M-w          复制选定内容
j              Down         光标下移
h              Left         光标左移
l              Right        光标右移
L                           光标移到尾行
M              M-r          光标移到中间行
H              M-R          光标移到首行
k              Up           光标上移
d              C-u          删除整行
D              C-k          删除到行末
$              C-e          移到行尾
:              g            前往指定行
C-d            M-Down       向下滚动半屏
C-u            M-Up         向上滚动半屏
C-f            Page down    下一页
w              M-f          下一个词
p              C-y          粘贴
C-b            Page up      上一页
b              M-b          上一个词
q              Escape       退出
C-Down or J    C-Down       向下翻
C-Up or K      C-Up         向下翻
n              n            继续搜索
?              C-r          向前搜索
/              C-s          向后搜索
0              C-a          移到行首
Space          C-Space      开始选中
               C-t          字符调序

杂项:

d  退出 tmux(tmux 仍在后台运行)
t  窗口中央显示一个数字时钟
?  列出所有快捷键
:  命令提示符

配置选项:

# 鼠标支持 - 设置为 on 来启用鼠标(与 2.1 之前的版本有区别,请自行查阅 man page)
* set -g mouse on

# 设置默认终端模式为 256color
set -g default-terminal "screen-256color"

# 启用活动警告
setw -g monitor-activity on
set -g visual-activity on

# 居中窗口列表
set -g status-justify centre

# 最大化/恢复窗格
unbind Up bind Up new-window -d -n tmp \; swap-pane -s tmp.1 \; select-window -t tmp
unbind Down
bind Down last-window \; swap-pane -s tmp.1 \; kill-window -t tmp

参考配置文件(~/.tmux.conf):

下面这份配置是我使用 Tmux 几年来逐渐精简后的配置,请自取。

# -----------------------------------------------------------------------------
# Tmux 基本配置 - 要求 Tmux >= 2.3
# 如果不想使用插件,只需要将此节的内容写入 ~/.tmux.conf 即可
# -----------------------------------------------------------------------------

# C-b 和 VIM 冲突,修改 Prefix 组合键为 Control-Z,按键距离近
set -g prefix C-z

set -g base-index         1     # 窗口编号从 1 开始计数
set -g display-panes-time 10000 # PREFIX-Q 显示编号的驻留时长,单位 ms
set -g mouse              on    # 开启鼠标
set -g pane-base-index    1     # 窗格编号从 1 开始计数
set -g renumber-windows   on    # 关掉某个窗口后,编号重排

setw -g allow-rename      off   # 禁止活动进程修改窗口名
setw -g automatic-rename  off   # 禁止自动命名新窗口
setw -g mode-keys         vi    # 进入复制模式的时候使用 vi 键位(默认是 EMACS)

# -----------------------------------------------------------------------------
# 使用插件 - via tpm
#   1. 执行 git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
#   2. 执行 bash ~/.tmux/plugins/tpm/bin/install_plugins
# -----------------------------------------------------------------------------

setenv -g TMUX_PLUGIN_MANAGER_PATH '~/.tmux/plugins'

# 推荐的插件(请去每个插件的仓库下读一读使用教程)
set -g @plugin 'seebi/tmux-colors-solarized'
set -g @plugin 'tmux-plugins/tmux-pain-control'
set -g @plugin 'tmux-plugins/tmux-prefix-highlight'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-yank'
set -g @plugin 'tmux-plugins/tpm'

# tmux-resurrect
set -g @resurrect-dir '~/.tmux/resurrect'

# tmux-prefix-highlight
set -g status-right '#{prefix_highlight} #H | %a %Y-%m-%d %H:%M'
set -g @prefix_highlight_show_copy_mode 'on'
set -g @prefix_highlight_copy_mode_attr 'fg=white,bg=blue'

# 初始化 TPM 插件管理器 (放在配置文件的最后)
run '~/.tmux/plugins/tpm/tpm'

# -----------------------------------------------------------------------------
# 结束
# -----------------------------------------------------------------------------

转载自:https://gist.github.com/ryerh/14b7c24dfd623ef8edc7

angie acme proxy_pass DNS-01 验证

angie自动签发ssl配置

acme_client 99999_net https://acme-v02.api.letsencrypt.org/directory challenge=dns;
server {
    listen unix:/run/acme-99999_net.sock;
    server_name 99999.net *.99999.net;
    acme 99999_net;
    location @acme_hook_location {
        acme_hook 99999_net uri=/angie.php;
        proxy_pass http://API.SERVER;
        proxy_read_timeout 560s;
        proxy_send_timeout 560s;
        proxy_set_header X-Acme-Hook $acme_hook_name;
        proxy_set_header X-Acme-Challenge $acme_hook_challenge;
        proxy_set_header X-Acme-Domain $acme_hook_domain;
        proxy_set_header X-Acme-Keyauth $acme_hook_keyauth;
    }
}

angie官方只写了fastcgi和php-fpm的配置,这里补全一下proxy_pass调用api的方式

示例参数说明:

99999.net是域名

99999_net是acme name (acme签发只签发ssl可以直接用域名,但是网站里面ssl_certificate维护的时候变量无法识别.必须用下划线_才能识别)

API.SERVER是接口服务器地址

uri=/angie.php是api接收具体uri地址

proxy_pass暂时只能走http, 走https会请求不到可能要用ngx_http_tunnel_module模块走tunnel_pass localhost:9000;

这里的server和 listen unix:/run/acme-99999_net.sock; 是http下的字段,用于专门管理acme,这里用server字段管理可以单独签证书, 也可以在 网站的server字段下加location字段 @acme_hook_location, 可以查看官方文档https://cn.angie.software/angie/docs/configuration/acme/#acme-config-hooks-minimal-configuration

X-Acme系列header是传送参数,这里用header方式,也可以走uri个get方式,但会造成明文泄露的问题.

HTTP_X_ACME_DOMAIN是请求的根域名,HTTP_X_ACME_KEYAUTH是_acme-challenge.99999.net的TXT值
 
$_SERVER['HTTP_X_ACME_HOOK']是传送remove和add动作,根据这个参数添加或者删除记录
 
API SERVER对子域名_acme-challenge添加删除TXT记录就行了,其他没有什么特殊设置了。
 
 

另外一种angie DNS托管方式验证方法:

acme_client 99999_net https://acme-v02.api.letsencrypt.org/directory challenge=dns;
server {
    listen unix:/run/acme-99999_net.sock;
    server_name 99999.net *.99999.net;
    acme 99999_net;
}
 
第一步:解析一个A记录 例如 ns111.99999.net 到当前的angie公网IP,并开放53 UDP端口对外访问
第二步:设置_acme-challenge.99999.net一个NS记录到ns111.99999.net就可以托管到angie内部自动管理。
 
 
两种方式对自动内部管理签发通配符SSL证书方便,DNS托管模式只能单机验证,用API方式的好处能多个不同地方的angie可以独立管理ssl。如果没有通配符SSL需求直接用alpn方式就能满足需求.

 

网站配置和正常的一样:

upstream host_1 {
    zone host_1 64k;
    server 99.99.99.99:6680;
}

server {
    listen 80;
    server_name 99999.net *.99999.net;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen 443 quic;
    http2 on;
    http3 on;
    server_name 99999.net *.99999.net;
    status_zone host_1;
    ssl_certificate     $acme_cert_99999_net;
    ssl_certificate_key $acme_cert_key_99999_net;
    add_header Alt-Svc 'h3=":443"; ma=86400' always;
    gzip on;
    gzip_proxied any;
    gzip_vary on;
    gzip_types text/plain text/css text/xml application/json application/javascript application/xml application/rss+xml application/atom+xml image/svg+xml font/ttf font/otf application/vnd.ms-fontobject;
    location / {
        proxy_pass http://host_1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    }
}

 

最后,angie直接官方包直接支持js和lua安装后就能用,比原来的nginx和openresty更好用,具体更多细节查看官方文档https://cn.angie.software/angie/docs/installation/oss_packages/#oss-packages

另外域名太多的情况下可以考虑DCV域名指派方案(Domain Control Validation)。

年少轻狂的人到了35岁一个个都统一老实了

年少轻狂的时候兜里掏不出富余的几百千来块钱,觉得几十百来万是小钱。

面对 现金流、税、房租、工资、社保、坏账、库存、设备、融资成本、折旧、养老、抚育、医疗、住房、婚嫁、人情世故各种问题后一个个都老实不语了;

之前那种不可一世不愿意总觉得和人有代沟的棱角也被磨平了,发现整个社会根本不会随便迁就自己, 也愿意主动迁就人了。

thinkphp在PostgreSQL下兼容ON CONFLICT DO NOTHING处理方法

由于thinkphp只对Mysql有INSERT IGNORE方法,PostgreSQL是ON CONFLICT  DO NOTHING方法,但是thinkphp orm一直没有支持,只能暂时在model用这个方法.

use think\facade\Db;

    public static function insertIgnore(array $data, string $conflictTarget = null): int
    {
        $rawSql = static::fetchSql(true)->insert($data);

            sql = "ON CONFLICT DO NOTHING";

        if ($conflictTarget) {
            $sql = "ON CONFLICT {$conflictTarget}  DO NOTHING";
        }
        return Db::execute("{$rawSql} {$sql}");
    }

PostgreSQL插件pgclone 类似git版本控制方案.

前段时间看到老冯的公众号推送pgclone这玩意想搞来用一下 https://vonng.com/pg/pg-clone/ 

 

翻了下文档要求磁盘分区必须支持reflink才可以, 这就意味着ext4没法玩耍了, 必须XFS  Btrfs ZFS分区格式才能玩.

 

php类备忘录

public(公开):外部、内部、子类全通车
protected(受保护):家族内可用
private(私有):仅当前类可用
 
基础类class
abstract 抽象类,做基础架构、只能继承不能修改,extends后才能new实例化,做model之类的定义
final 最终完美类, 不能extends,可以new实例化
trait 代码复用,不能new初始化,只能class use引入
interface 接口类,不能被 new实例化,使用 implements 来实现接口, 一个类只能继承(extends)一个父类,但可以同时实现(implements)多个接口。

int 整数类型
string 字符串
float 浮点型 带小数点的
bool 布尔型 true或false
array 数组
object 对象
callable 可调用 只能是一个函数、闭包或者方法名
void 空
mixed 混合,任何类型(字符串、数字、数组、对象、甚至 null)
(int|string $id) 联合类型

function 函数
return 直接返回

最蠢的营销广告

用女人拍擦边性暗示的视频推广卖男装是我见过最愚蠢的精致营销。

买衣服要穿着合身和舒适, 其次才是好看。

即使我这种好色的老色批看这种营销内容都能感到满满的生理厌恶。

 

PostgreSQL18 主从同步复制部署备忘录

安装postgresql-18

apt install -y postgresql-common
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
install -d /usr/share/postgresql-common/pgdg
curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
apt update
apt install postgresql-18

主库配置

USER="replica"
PASSWORD=$(openssl rand -base64 24)
NETWOKR="0.0.0.0/0"   //从库IP段
IP="1.1.1.1" #主库IP 

#主库
cat>>/etc/postgresql/18/main/postgresql.conf<<EOF
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
wal_keep_size = 1GB
archive_mode = off
#archive_command = 'cp %p /var/lib/postgresql/wal_archive/%f'
EOF
#archive_mode归档模式很占空间
echo "host replication $USER $NETWOKR md5" >>/etc/postgresql/18/main/pg_hba.conf
# 创建用户(幂等)
sudo -u postgres psql -tc "SELECT 1 FROM pg_roles WHERE rolname='$USER'" | grep -q 1 || \
sudo -u postgres psql -c "CREATE ROLE $USER WITH REPLICATION LOGIN PASSWORD '$PASSWORD';"
systemctl restart postgresql
echo "REPL $USER PASSWORD: $PASSWORD"

echo -e "\n\n从库快速导入备份bash shell:"
echo -e "USER=$USER\nPASSWORD=$PASSWORD"
echo "sudo -u postgres pg_basebackup -h $IP  -U  $USER -D /home/postgresql/18/main -P -R -X stream -v"

从库配置

IP="1.1.1.1" #主库IP
#rm -rf /var/lib/postgresql/18/main/*   
cat>>/etc/postgresql/18/main/postgresql.conf<<EOF
listen_addresses = '*'
#recovery_min_apply_delay='24h'   #延迟24小时同步
hot_standby = on
wal_keep_size = 2GB
max_wal_senders = 10
EOF
systemctl stop postgresql
mkdir /home/postgresql
chown -R postgres:postgres /home/postgresql
chmod 700 /home/postgresql
sudo -u postgres pg_basebackup -h $IP -U $USER -D /home/postgresql/18/main -P -R -X stream -v
cat /home/postgresql/18/main/postgresql.auto.conf >>  /etc/postgresql/18/main/postgresql.conf
mv /home/postgresql/18/main/postgresql.auto.conf /home/postgresql/18/main/postgresql.auto.conf.bak
systemctl start postgresql
建议修改/etc/postgresql/18/main/postgresql.conf的data_directory和max_connections参数
 
data_directory = '/home/postgresql/18/main'
 
#从库的设置小于主库的max_connections会无法启动
 
从库自动连接配置文件 /var/lib/postgresql/18/main/postgresql.auto.conf 可以写到/etc/postgresql/18/main/postgresql.conf里面
 
main目录可以直接从pg_basebackup方式换rsync同步
 
 

检查核验配置

tail -n 100 /var/log/postgresql/postgresql-18-main.log
#验证主库 查看从库连接ip
sudo -u postgres psql -c "SELECT client_addr,state FROM pg_stat_replication;"

#验证从库 返回t 
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"

 

/etc/postgresql/18/main/conf.d/ 目录存放配置文件可以覆盖主配置

dnswatch

https://www.dnswatch.info/dns/dnslookup?la=en&host=164.210.103.in-addr.arpa&type=NS&submit=Resolve