命令审计
将某台服务器上执行的命令实时同步到另外一台服务器
1. 将执行的命令写入文件 /var/log/command_history.log
vim /etc/bashrc
export PROMPT_COMMAND=' |
2. 将文件实时同步到另外一台服务器
vim /etc/rsyslog.d/histroy_command_auditing.conf
module(load="imfile" PollingInterval="1") |
3. 启动 rsyslog 服务
systemctl enable rsyslog。service --now
PostgreSQL
一、 部署
源码部署
1.1 安装依赖
yum -y groupinstall "Development Tools"
yum -y install readline-devel zlib-devel libicu-devel bison flex
1.2 下载源码
wget https://ftp.postgresql.org/pub/source/v16.4/postgresql-16.4.tar.gz
1.3 编译安装
tar -xvf postgresql-16.4.tar.gz
cd postgresql-16.4
./configure --prefix=/usr/local/pgsql-16.4
make && make install
1.4 创建用户/组
groupadd postgres
useradd -m -g postgres postgres
chown -R postgres:postgres /usr/local/pgsql-16.4/
1.5 配置环境变量
切换用户:
su -l postgres
编辑文件:vim ~/.bash_profile
添加如下内容:PGPORT=5432
PGHOME=/usr/local/pgsql-16.4
PGDATA=/usr/local/pgsql-16.4/data
LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
PATH=$PGHOME/bin:$PATH
export PGPORT PGHOME PGDATA LD_LIBRARY_PATH PATH1.6 初始化数据库
su -l postgres
mkdir -p /usr/local/pgsql-16.4/data
/usr/local/pgsql-16.4/bin/initdb -D /usr/local/pgsql-16.4/data
1.7 启动数据库
/usr/local/pgsql-16.4/bin/pg_ctl -D /usr/local/pgsql-16.4/data -l logfile start
1.8 创建用户和DB
进入pgsql终端:
/usr/local/pgsql-16.4/bin/psql -d postgres
创建数据库:CREATE USER $username WITH PASSWORD '$password';
CREATE DATABASE $dbname OWNER $username;1.9 配置远程访问
编辑:
vim /usr/local/pgsql-16.4/data/pg_hba.conf
ipv4 行添加如下:host all all 0.0.0.0/0 md5
编辑:vim /usr/local/pgsql-16.4/data/postgres.conf
添加:listen_addresses = '*'
1.10 使用systemd管理
# /usr/local/pgsql/postgresql-16.service
[Unit]
Description=PostgreSQL-16.4
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGPORT=2345
Environment=PGDATA=/usr/local/pgsql/data/
OOMScoreAdjust=-1000
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} -s -o "-p ${PGPORT}" -w -t 300
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA} -s
TimeoutSec=300
[Install]
WantedBy=multi-user.targetsystemctl daemon-reload
systemctl enable postgresql-16 --now
二、 插件安装
2.1 内置扩展
扩展名称 | 用途 |
---|---|
pg_stat_statements |
收集并统计所有 SQL 查询的执行信息,帮助调优查询性能。 |
hstore |
提供键值对存储功能,适合处理半结构化数据。 |
citext |
提供不区分大小写的文本字段类型,适用于忽略大小写的字符串比较操作。 |
uuid-ossp |
生成 UUID,适用于分布式系统中的唯一标识符生成。 |
pg_trgm |
提供基于 trigram 的字符串相似度搜索功能,适用于模糊搜索。 |
fuzzystrmatch |
提供字符串模糊匹配功能,如 Soundex 算法,适用于名字搜索等场景。 |
intarray |
为整型数组提供额外的操作符和函数支持,适合处理数组类型的数据。 |
cube |
提供对多维数据的支持,适用于几何计算和多维数据处理。 |
tablefunc |
提供交叉表功能,适用于生成报表或统计结果时的行转列操作。 |
ltree |
提供对树状结构数据的支持,适用于管理和查询层级结构的数据。 |
pgcrypto |
提供数据加密和解密功能,适用于存储敏感数据。 |
plpgsql |
提供编写存储过程和函数的内置过程语言,适用于复杂业务逻辑的实现。 |
内置扩展直接在源码目录下的 contribu
中对应的插件目录执行 make && make install
.以 pg_stat_statements
为例:
cd postgresql-16.4/contrib/pg_stat_statements/
make && make install
psql命令行下:
create extension pg_statements; |
2.2 非内置扩展
以安装 mysql_fdw
为例
依赖安装:
yum install mariadb-devel
源码下载
wget -O https://github.com/EnterpriseDB/mysql_fdw/archive/refs/tags/REL-2_9_2.tar.gz
导入pgsql和mysql的bin目录
export PATH=/usr/local/pgsql/bin/:$PATH
export PATH=/usr/local/mysql/bin/:$PATH
编译安装
tar -xzvf mysql_fdw-REL-2_9_2.tar.gz && cd mysql_fdw-REL-2_9_2
make USE_PGXS=1
make USE_PGXS=1 install
创建扩展
postgres=#
postgres=# create extension mysql_fdw;
ERROR: failed to load the mysql query:
libmysqlclient.so: cannot open shared object file: No such file or directory
HINT: Export LD_LIBRARY_PATH to locate the library.
postgres=#解决依赖问题
将缺少的文件复制到
/usr/local/pgsql/lib
即可
2.3 特殊插件
uuid-ossp
作为内置插件, 该插件的安装比较特殊uuid-ossp
依赖 uuid-devel
, 所以先安装这个包 yum install uuid-devel
重新编译pgsql,在原来的编译选项中加上
--with-uuid-ossp
./configure --prefix=/usr/local/pgsql-16.4 --with-uuid-ossp
编译插件
cd $PGHOME/contrib/uuid-ossp && make && make install
2.4 postGIS 插件安装
安装之前, 在这里查看 PostgreSQL和 PostGIS 的兼容性https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS
Build List:
Build geos-3.6.0
# build from source
tar -xvf geos-3.6.0.tar.bz2 && cd geos-3.6.0
./configure --prefix=/usr/local/geos-3.6.0
make && make install
# add ldd_path
echo "/usr/local/geos-3.6.0/lib" > /etc/ld.so.conf.d/geos.conf
ldconfig
Build PostGIS-3.1.10
Installation
# Requirement
yum install proj proj-devel
# build from source
tar -zxvf postgis-3.1.10.tar.gz && cd postgis-3.1.10
./configure --with-pgconfig=/usr/local/pgsql-12/bin/pg_config \
--with-geosconfig=/usr/local/geos-3.6.0/bin/geos-config \
--without-raster --without-protobufEnable on PostgreSQL
/usr/local/pgsql-12/bin/psql -U postgres -d postgres -p 5432
psql (12.21)
Type "help" for help.
postgres=# CREATE EXTENSION postgis;
CREATE EXTENSION
postgres=#
postgres=#
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 3.1.10 | public | PostGIS geometry and geography spatial types and functions
(2 rows)
Linux 配置 coredump
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)
一、 配置基于 systemd 的 core dump
该模式下的核心转储文件默认保存在
/var/lib/systemd/coredump
, 默认保存三天
该核心转储功能由journal
配合产生, 因此控制转储文件的保存目录以及时间较难, 如需自定义, 推荐使用传统方式配置核心转储。
编辑文件 /etc/systemd/system.conf
,添加/修改以下行:
DumpCore=yes |
编辑文件 /etc/systemd/coredump.conf
, 添加/修改一下行:
[Coredump] |
编辑文件 /etc/sysctl.conf
添加/修改以下行:
kernel.core_pattern=|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h |
应用上述配置并生效: systemctl daemon-reexec && sysctl -p
二、 core dump 实例分析
使用一个简单的 C 程序验证 core dump
#include <stdio.h> |
编译并执行 gcc test.c && ./a.out
2.2 基于systemd的 coredump 处理
列出所有核心转储
coredumpctl list
PID
: 崩溃进程的 PID。SIG
: 导致崩溃的信号编号(如 11 表示 SIGSEGV)COREFILE
: 表示核心转储是否存在(present 或 missing)
查看特定核心转储的详细信息
coredumpctl info <PID>
导出核心转储文件
coredumpctl dump <PID>
分析核心转储
coredumpctl gdb <PID>
三、 传统方式配置 coredump
与基于 coredumpctl 方式不同, 该方式下, 转储文件会直接生成
3.1 开启coredump
启用核心转储
ulimit -c unlimited
- 编辑
/etc/security/limits.conf
文件,添加或修改以下行:该配置允许用户生成无限大小的core文件* soft core unlimited
* hard core unlimited
- 编辑
3.2 自定义转储文件的目录及大小
编辑文件
/etc/sysctl.conf
添加/修改以下行:kernel.core_pattern = /var/coredumps/core-%e-%s-%u-%g-%p-%t
- %e: 可执行文件名
- %s: 导致 core dump 的信号号
- %u: 进程的实际用户 ID
- %g: 进程的实际组 ID
- %p: 进程 ID
- %t: core dump 的时间(UNIX 时间戳)
创建转储目录
mkdir /var/coredumps
chmod 777 /var/coredumps
应用并生效
sysctl -p
测试
可以看见, 该方式下, 转储文件直接生成
ELK+filebeat 监控 nginx 日志
零、 环境介绍
OS: CentOS 7.9
ELk: v8.17.2
Filebeat: v8.17.2
Nginx v1.20.1
一、 部署 ELK
添加源
cat >> /etc/yum.repos.d/elk.repo << EOF
[ELK]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF安装
yum install -y elasticsearch logstash kibana filebeat
二、 配置 ELK
2.1 ElasticSearch 配置
修改监听
/etc/elasticsearch/elasticsearch.yml
network: "0.0.0.0"
配置 elastic 密码
/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
访问测试
[root@localhost ~]# curl -k -u elastic:f0FdL8-gvj=tfnb-Hugg https://localhost:9200
{
"name" : "localhost.localdomain",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "YXsi6PaGTv-LbzCA3zHtIw",
"version" : {
"number" : "8.17.2",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "747663ddda3421467150de0e4301e8d4bc636b0c",
"build_date" : "2025-02-05T22:10:57.067596412Z",
"build_snapshot" : false,
"lucene_version" : "9.12.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}配置自启
systemctl enable elasticsearch --now
2.2 配置 Kibana
修改监听
/etc/kibana/kibana.yml
server.host: "0.0.0.0"
重启 kibana
systemctl restart kibana
获取 token
/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
获取 verification code
/usr/share/kibana/bin/kibana-verification-code
访问
http://your_kibana:5601
输入token
和code
完成配置配置自启
systemctl enable kibana
2.3 Logstash 配置
创建配置文件
cp /etc/logstash/logstash-sample.conf /etc/logstash/conf.d/logstash.conf
修改配置文件如下
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["https://192.168.100.107:9200"]
index => "nginx-log-%{+YYYY.MM.dd}"
user => "elastic"
password => "f0FdL8-gvj=tfnb-Hugg"
ssl_enabled => true
ssl_certificate_authorities => "/etc/elasticsearch/certs/http_ca.crt" # 这里注意文件和目录的权限需要修改
}
}
2.4 Filebeat 配置
编辑配置文件
/etc/filebeat/filebeat.yml
注释:
output.elasticsearch
取消注释:output.logstash
根据实际情况配置 logstash 的ip和端口开启 nginx 日志监控
filebeat modules enable nginx
编辑配置文件
/etc/filebeat/modules.d/nginx.yml
- module: nginx
# Access logs
access:
enabled: true
var.paths: ["/var/log/nginx/access*"]重启 filebeat
systemctl restart filebeat
2.5 Nginx 日志格式配置
- nginx 配置文件
log_format main '{"@timestamp":"$time_iso8601",'
'"host":"$hostname",'
'"client_ip":"$remote_addr",'
'"status":"$status",'
'"request":"$request",'
'"body_bytes_sent":"$body_bytes_sent",'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent"}';
access_log /var/log/nginx/access.log main;
三、 验证配置
打开
Kibana
访问Management
->
Index Management
创建
data view
K8S Dashboard 安装
添加源
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
安装
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
OCI, CRI 等概念解释
核心概念以及名词解释
一、 Container 容器
容器本质上就是一个特殊的进程,通过 Namespace 实现资源(网络、文件系统等)隔离,通过 Cgroups 实现资源(CPU、内存)限制,让我们使用起来就感觉像在操作虚拟机一样,但其和虚拟机有本质上的区别,那就是容器和宿主机是共享同一个内核的。为了将我们的应用进程运行在容器中,当然就需要有一些方便的接口或者命令去调用 Linux 的系统功能来实现,而容器运行时就是用来运行和管理容器进程、镜像的工具
二、 OCI (Open Container Initiative) 开放容器协议
(OCI) 是由 Docker 于 2015 年发起,并在 Linux Foundation(Linux 基金会)下管理的一个开源项目,旨在定义并维护容器镜像和运行时的开放标准。OCI 规范的目标是确保不同容器引擎、镜像和运行时之间的兼容性和互操作性
OCI 定义了以下三大核心规范:
OCI Runtime Specification
(OCI 运行时规范)定义了容器的生命周期管理,包括容器的创建、启动、停止、销毁等
- 规范容器运行时的接口,确保运行时如何以一致的方式执行容器
- 该规范被广泛采用,
runc
就是OCI
运行时规范的参考实现 - 核心控制容器的低级细节,如:
- 容器的进程管理
- 挂载点、
Cgroups
、Namespace
配置 - 容器的
rootfs
配置
OCI Image Specification
(OCI 镜像规范)定义了容器镜像的格式及其元数据。
- 该规范确保容器镜像在不同的容器运行时(如
Docker
、containerd
、CRI-O
等)中均能无缝兼容。 - 镜像采用 多层(
Layered
) 结构,允许增量更新,提高存储和传输效率 - 定义了镜像的内容清单(
Manifest
)、配置(Config
)及镜像层(Layers
)等
OCI Distribution Specification
(OCI 分发规范)定义了如何通过 HTTP API 来分发容器镜像(镜像仓库规范)
- 该规范确保镜像可以在不同的镜像仓库(如
Docker Hub
、Harbor
、Quay.io
等)中安全传输和分发。 - 基于
RESTful API
设计,支持多种身份验证和安全机制 - 解决了镜像拉取、推送及存储的兼容性问题
OCI 的生态系统
RUNC
(OCI 运行时的参考实现)Containerd
(Docker 的核心容器运行时,完全兼容 OCI)CRI-O
(Kubernetes 的轻量级容器运行时)Podman
(无守护进程的容器引擎,兼容 OCI)Docker
(已将 OCI 规范整合至其引擎)
总结:
Open Container Initiative (OCI) 通过定义开放标准,统一了容器镜像、运行时和分发方式,推动了容器技术的生态繁荣。它的核心目标是让容器环境更加便携、兼容和安全
CRI (Container Runtime Interface) 容器运行时接口
Kubernetes 定义的一套标准化接口,旨在将 Kubernetes (K8s) 与各种容器运行时(如 Docker、containerd、CRI-O 等)解耦。通过 CRI,kubelet可以使用不同的容器运行时,而无需更改自身的代码逻辑,从而提升了 Kubernetes 的灵活性和可扩展性。
CRI-O (Container Runtime Interface - Open Container Initiative)
CRI-O 是一个轻量级的 容器运行时(Container Runtime),专为 Kubernetes 设计,完全遵循 Kubernetes 的 CRI(Container Runtime Interface) 接口标准
CRI-O
、 Docker
、 containerd
三者对比
特点 | CRI-O |
Docker |
containerd |
---|---|---|---|
兼容 Kubernetes |
✅ 完全兼容 | ❌ 需额外配置 | ✅ 完全兼容 |
遵循 OCI 标准 |
✅ 是 | ✅ 是 | ✅ 是 |
是否轻量 | ✅ 极简设计 | ❌ 功能复杂 | ✅ 轻量化 |
镜像管理 | ✅ 使用 skopeo |
✅ 原生支持 | ✅ 使用 ctr |
守护进程 | ❌ 无守护进程 | ✅ 需要 Docker Daemon |
✅ 需要守护进程 |
启动速度 | ⚡ 快速 | 🚶♂️ 较慢 | ⚡ 快速 |
存储驱动 | 支持多种存储后端 | 使用 Docker 内置机制 |
使用 snapshotter |
CRI-Dockerd 和 CRI-ContainerD
特点 | cri-docker |
cri-containerd |
---|---|---|
定义 | Docker 提供的 CRI 实现,作为 Docker Engine 的桥梁以兼容 Kubernetes | containerd 提供的原生 CRI 实现,专为 Kubernetes 设计 |
架构 | kubelet → cri-dockerd → Docker Engine → containerd → runc |
kubelet → containerd → runc |
复杂度 | 由于引入 Docker Daemon,架构更复杂 | 轻量化设计,直接对接 Kubernetes,架构更简洁 |
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
kubeadm init –apiserver-advertise-address=192.168.100.115 –image-repository registry.aliyuncs.com/google_containers –kubernetes-version v1.29.15 –service-cidr=10.10.0.0/12 –pod-network-cidr=10.244.0.0/16 –cri-socket unix:///var/run/cri-dockerd.sock
kubeadm join 192.168.100.115:6443 –token 5p3w36.aoah5z734lw70nji
–discovery-token-ca-cert-hash sha256:fda08928eeeb8cdb424462c29999643a5561bf9ffdf31dabfdc5ca562cce5953 –cri-socket unix:///var/run/cri-dockerd.sock
MySQL备份与恢复
一、 逻辑备份/恢复
基于MySQL自带的mysqldump
或mysqlpump
进行逻辑备份和恢复
优点 | 缺点 |
---|---|
可以跨平台和MySQL版本 | 备份速度慢, 占用较大的cpu和I/O |
1.1 逻辑备份
#!/bin/bash |
1.2 逻辑恢复
gunzip < ${BACKUP_DIR}/${DB_NAME}.sql.gz | mysql -h${HOST} -P${PORT} -u${USER} -p${PASSWD}
二、 物理备份/恢复
XtraBackup
是由Percona
提供的开源备份工具,主要用于MySQL
、MariaDB
和Percona Server
数据库的备份。它可以为InnoDB
和XtraDB
存储引擎提供热备份功能,这意味着可以在数据库继续运行、读写数据的情况下进行备份,而不会影响应用程序的正常使用。
2.0 安装 XtraBackup
yum install epel-release -y && yum install percona-xtrabackup -y
2.1 物理备份
#!/bin/bash |
2.2 物理恢复
假设场景: 从主库的物理备份中创建一个从库, 并开启主从复制。
假设物理备份的位置: /data/mysql/backup-physical
主从数据库的数据目录: /data/mysql/data
解压备份
这个步骤会在每个压缩文件旁边创建一个解压后的版本innobackupex --decompress /data/mysql/backup-physical/ > decompress.log 2>&1
恢复到MySQL数据目录
默认会根据/etc/my.cnf
恢复, 也可以使用--datadir="your_data_path"
--copy-back
:复制数据到目标目录下,当前备份数据不删除--move-back
:移动数据到目标目录下,当前数据会删除(适合存储空间不大的情况)xtrabackup --copy-back --target-dir=/data/mysql/backup-physical/
从库启动之前, 如果主库发生变化, 需要将主库备份时间节点之后的bin-log文件复制到从库的数据目录
修改MySQL数据目录的权限
chown -R mysql:mysql /data/mysql/data
启动MySQL
systemctl start mysqld
配置从库
mysql>
mysql> change master to \
-> master_host='16.167.13.137',
-> master_user='repl',
-> master_password='$yourpassword',
-> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
mysql>
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
2.3 常见问题
主从同步的时候提示: Could not execute Update rows event on table xxxxxx: can't find record in xxxxxx
原因: 从库启动之前主库数据发生变动
解决: 发生数据变动期间的 bin-log 文件复制到从库的数据目录
三、 增量备份
查看某个用户拥有某个数据库的权限
注意这里的 127.0.0.1
和localhost
不一样
mysql> show grants for 'root'@'127.0.0.1'; |
WinServer部署NFS
一般来说,nfs 用于Linux之间的文件共享, 跨平台使用 samba
零、 环境说明
CLIENT: 192.168.1.201 (CentOS7.9)
SERVER: 192.168.12.73 (Winserver2016)
文档涉及的ip地址以及目录路径请根据实际情况填写,切勿完全复制粘贴。
一、 NFS服务端部署
winserver2016为例,使用powershell部署NFS,其他版本未测试。
1.1 安装 NFS
Import-Module ServerManager
Add-WindowsFeature FS-NFS-Service
Import-Module NFS
1.2 创建共享目录
New-NfsShare -Name nfs1 -Path C:\Users\Administrator\Desktop\share
1.3 防火墙配置
New-NetFirewallRule -DisplayName "Allow NFS" -Direction Inbound -Protocol TCP -LocalPort 2049 -Action Allow |
1.4 目录权限配置
1.5 挂载
注意: 需要指定版本mount -t nfs -o vers=4.1 192.168.12.73:/nfs1 /mnt/nfs1
1.6 开机挂载
echo 192.168.1.100:/nfs1 /mnt/nfs1 nfs defaults,vers=4.1 0 0 >> /etc/fstab