This commit is contained in:
colben 2021-11-14 15:52:46 +08:00
parent 915c231124
commit 1e344dc204
112 changed files with 1039 additions and 1039 deletions

View File

@ -6,51 +6,51 @@ tags: ["ansible"]
categories: ["dev/ops"]
---
# CentOS7 安装 ansible
## CentOS7 安装 ansible
```bash
yum install ansible
```
# 修改配置文件 /etc/ansible/ansible.conf
## 修改配置文件 /etc/ansible/ansible.conf
```
# 取消 ssh key 验证
## 取消 ssh key 验证
host_key_checking = False
# 改用 debug 输出模式
## 改用 debug 输出模式
stdout_callback = debug
```
# 修改配置文件 hosts
## 修改配置文件 hosts
```
# 增加 tomcat 服务器组
## 增加 tomcat 服务器组
[tomcat]
tomcat101 ansible_ssh_host=192.168.1.101
tomcat102 ansible_ssh_host=192.168.1.102
tomcat103 ansible_ssh_host=192.168.1.103
# 增加 mysql 服务器组
## 增加 mysql 服务器组
[mysql]
mysql201 ansible_ssh_host=192.168.1.201 ansible_ssh_pass=111111
mysql202 ansible_ssh_host=192.168.1.202
mysql203 ansible_ssh_host=192.168.1.203
# 全局设置全部服务器的默认设置
## 全局设置全部服务器的默认设置
[all:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass=123456
```
# authorized_key 模块
## authorized_key 模块
```bash
# 分发密钥
## 分发密钥
ansible all -m authorized_key -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}'"
```
# 简单使用
## 简单使用
- 批量设置主机名为资产名
```bash
ansible all -m shell -a 'hostnamectl set-hostname {{inventory_hostname}}'
ansible all -m shell -a 'echo "{{ansible_ssh_host}} {{inventory_hostname}}" >> /etc/hosts'
```
# ansible 常用 roles
## ansible 常用 roles
- [https://gitee.com/colben/ansible](https://gitee.com/colben/ansible)

View File

@ -7,7 +7,7 @@ tags: ["archlinux"]
categories: ["os"]
---
# U 盘启动,进入 archlinux live
## U 盘启动,进入 archlinux live
- 下载 archlinux 镜像
```bash
curl -LO https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/2021.07.01/archlinux-2021.07.01-x86_64.iso
@ -20,7 +20,7 @@ categories: ["os"]
- 使用该 U 盘启动自己的 PC进入 archlinux live
# 联网,硬盘分区,安装系统
## 联网,硬盘分区,安装系统
- 插上网线,自动分配地址,验证是否可以连接外网
```bash
curl -I https://www.baidu.com
@ -105,7 +105,7 @@ categories: ["os"]
arch-chroot /mnt /bin/bash
```
# 配置新安装的系统
## 配置新安装的系统
- 设置时区
```bash
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
@ -168,7 +168,7 @@ categories: ["os"]
exit
```
# 卸载硬盘,重启
## 卸载硬盘,重启
- 卸载硬盘
```bash
umount -R /mnt
@ -179,7 +179,7 @@ categories: ["os"]
reboot
```
# 日常使用
## 日常使用
- 登陆普通用户
- 启动 NetworkManager并设置开机自动启动
```bash

View File

@ -7,11 +7,11 @@ tags: ["awk"]
categories: ["shell"]
---
# 格式
## 格式
- awk -F '分隔符正则' -v 变量名=值 'BEGIN{动作} 条件{动作} END{动作}' 文件1 文件2 ...
- awk -F '分隔符正则' -f awk脚本文件名 文件1 文件2 ...
# 常用内置变量
## 常用内置变量
变量 | 说明
---- | ----
$0 | 当前记录
@ -33,8 +33,8 @@ OFMT | 数字的输出格式(默认值是%.6g)
RSTART | 被 match 匹配函数匹配的字符串位置
RLENGTH | 被 match 匹配函数匹配的字符串长度
# 函数
## 常用内置函数
## 函数
### 常用内置函数
函数 | 说明
---- | ----
int(x) | 返回 x 的整数部分
@ -58,7 +58,7 @@ nextfile | 停止处理当前文件,开始处理下一个文件
system(shell-command) | 返回命令退出状态
exit n | 终止 awk返回 n
## 自定义函数
### 自定义函数
- 格式
```awk
function fun_name(arg1, arg2, ...){
@ -67,7 +67,7 @@ exit n | 终止 awk返回 n
}
```
# 判断语句
## 判断语句
```awk
if(条件){
# 语句
@ -78,7 +78,7 @@ exit n | 终止 awk返回 n
}
```
# 循环语句
## 循环语句
- for
```awk
for(初始化;条件;变化){
@ -103,7 +103,7 @@ exit n | 终止 awk返回 n
- break 退出当前循环体
- continue 退出本次循环,继续下一次循环
# 脚本
## 脚本
```awk
#!/usr/bin/awk -f
@ -122,7 +122,7 @@ exit n | 终止 awk返回 n
}
```
# 其他说明
## 其他说明
- 变量在使用时直接赋值即可,无需提前声明或定义
- 个人认为awk 没有数组只有字典,数组是键为整数的字典
- 运算符(+, -, \*, /, ++, -- 等)和关系符操作(>, >=, <, <=, ~, !~ 等)与 C 基本一致,也支持三目运算符(条件?值1:值2)
@ -134,7 +134,7 @@ exit n | 终止 awk返回 n
# 输出 abcd
```
# 参考
## 参考
- man awk
- [其他内置函数](https://www.gnu.org/software/gawk/manual/html_node/Built_002din.html#Built_002din)
- [gnu awk 手册](https://www.gnu.org/software/gawk/manual/gawk.html)

View File

@ -7,10 +7,10 @@ tags: ["centos", "bond"]
categories: ["network"]
---
# bond 概要
## 什么是 bond
## bond 概要
### 什么是 bond
- 网卡bond是通过把多张网卡绑定为一个逻辑网卡实现本地网卡的冗余带宽扩容和负载均衡。在应用部署中是一种常用的技术。
## bond的模式种类
### bond的模式种类
- Mode=0(balance-rr) 表示负载分担round-robin和交换机的聚合强制不协商的方式配合
- Mode=1(active-backup) 表示主备模式只有一块网卡是active,另外一块是备的standby
- **如果交换机配的是捆绑,将不能正常工作,因为交换机往两块网卡发包,有一半包是丢弃的**
@ -20,13 +20,13 @@ categories: ["network"]
- Mode=5(balance-tlb) 是根据每个slave的负载情况选择slave进行发送接收时使用当前轮到的slave
- Mode=6(balance-alb) 在5的tlb基础上增加了rlb
# CentOS7 配置 bond
## 环境
## CentOS7 配置 bond
### 环境
- 操作系统 CentOS7.6,禁用 NetworkManager 服务
- 物理网卡 eth0, eth1 绑定到 bond0
- 物理网卡 eth2, eth3 绑定到 bond1
## 网卡 eth0 配置
### 网卡 eth0 配置
- 修改 /etc/sysconfig/network-scripts/ifcfg-eth0
```
TYPE=Ethernet
@ -38,7 +38,7 @@ categories: ["network"]
MASTER=bond0
```
## 网卡 eth1 配置
### 网卡 eth1 配置
- 修改 /etc/sysconfig/network-scripts/ifcfg-eth1
```
TYPE=Ethernet
@ -50,7 +50,7 @@ categories: ["network"]
MASTER=bond0
```
## 网卡 eth2 配置
### 网卡 eth2 配置
- 修改 /etc/sysconfig/network-scripts/ifcfg-eth2
```
TYPE=Ethernet
@ -62,7 +62,7 @@ categories: ["network"]
MASTER=bond1
```
## 网卡 eth3 配置
### 网卡 eth3 配置
- 修改 /etc/sysconfig/network-scripts/ifcfg-eth3
```
TYPE=Ethernet
@ -74,7 +74,7 @@ categories: ["network"]
MASTER=bond1
```
## 增加网卡 bond0 配置
### 增加网卡 bond0 配置
- 创建 /etc/sysconfig/network-scripts/ifcfg-bond0
```
TYPE=Ethernet
@ -88,7 +88,7 @@ categories: ["network"]
DNS1=114.114.114.114
```
## 增加网卡 bond1 配置
### 增加网卡 bond1 配置
- 创建 /etc/sysconfig/network-scripts/ifcfg-bond1
```
TYPE=Ethernet
@ -102,7 +102,7 @@ categories: ["network"]
#DNS1=114.114.114.114
```
## 配置绑定模式
### 配置绑定模式
- 创建 /etc/modprobe.d/bonding.conf加入以下内容
```
alias bond0 bonding
@ -110,19 +110,19 @@ categories: ["network"]
options bonding miimon=100 mode=1
```
## 载入 bonding 模块,重启 network 服务
### 载入 bonding 模块,重启 network 服务
```bash
modprob bonding
systemctl restart network
```
## 查看网卡绑定状态
### 查看网卡绑定状态
```bash
cat /proc/net/bonding/bond0
cat /proc/net/bonding/bond1
```
# CentOS8 配置 bond
## CentOS8 配置 bond
- 建立 bond 连接配置文件
```bash
nmcli c add con-name bond0 type bond ifname bond0 mode active-backup

View File

@ -7,7 +7,7 @@ tags: ["cassandra"]
categories: ["database"]
---
# 环境
## 环境
主机名 | Public IP | Cluster IP| 操作系统 | Cassandra 版本
---- | ---- | ---- | ---- | ----
@ -17,7 +17,7 @@ cassandra103 | 10.0.4.103 | 10.10.10.103 | CentOS7.6 | 3.0.18
- 下载 [apache-cassandra-3.0.18-bin.tar.gz](https://mirrors.tuna.tsinghua.edu.cn/apache/cassandra/3.0.18/apache-cassandra-3.0.18-bin.tar.gz)
# 各节点初始配置
## 各节点初始配置
- 关闭 selinux、防火墙
- 部署 java 运行环境
@ -77,7 +77,7 @@ cassandra103 | 10.0.4.103 | 10.10.10.103 | CentOS7.6 | 3.0.18
WantedBy=multi-user.target
```
# 部署 Cassandra
## 部署 Cassandra
- 登陆 cassandra101下载 cassandra解压至 /opt/ 下
- 修改 /opt/cassandra/conf/cassandra.yaml
@ -118,7 +118,7 @@ cassandra103 | 10.0.4.103 | 10.10.10.103 | CentOS7.6 | 3.0.18
rpc_address: 10.0.4.103
```
# 启动集群
## 启动集群
- 启动 cassandra 服务
```bash
@ -127,7 +127,7 @@ cassandra103 | 10.0.4.103 | 10.10.10.103 | CentOS7.6 | 3.0.18
systemctl start cassandra
```
# 简单使用
## 简单使用
- cqlsh 连接数据库
```bash
@ -135,7 +135,7 @@ cassandra103 | 10.0.4.103 | 10.10.10.103 | CentOS7.6 | 3.0.18
cqlsh> desc keyspaces;
```
# 注意事项
## 注意事项
- 创建包含复合主键的表
```cql
create table t1 (

View File

@ -6,26 +6,26 @@ tags: ["centos", "系统盘迁移"]
categories: ["os"]
---
# 环境
## 环境
- Linux 物理机,已安装 VirtualBox 虚拟机软件
- CentOS6.9 live 启动 U 盘
- CentOS6.9 iso 镜像文件
- 待安装笔记本 IBM x32
# VirtualBox 创建 Redhat6 虚拟机
## VirtualBox 创建 Redhat6 虚拟机
- VMware 没用过,建议硬件配置尽量和目标设备一致
- Thinkpad X32 的处理器只有一核,无 PAE内存 1024MB
- 虚拟硬盘 8G 就够了,使用 CentOS6.9 iso 装好虚拟机后,禁用 selinux可能需要重启生效。
# 打包操作系统根目录
## 打包操作系统根目录
```
cd /
tar cvpzf backup.tgz --exclude=/backup.tgz --one-file-system /
```
# 导出 /backup.tgz 文件
## 导出 /backup.tgz 文件
- 返回物理机操作系统,通过 ssh、http 或其他方式把虚拟机的 /backup.tgz 拷贝至物理机中 /root 下
# 格式化磁盘
## 格式化磁盘
- 取出待安装笔记本的硬盘,通过 USB 或其他方式挂载到该物理机上fdisk 分区,格式化
```
#fdisk 分成俩个分区前面一个大的根分区后面一个2G的 swap 分区,其他情况自己决定
@ -34,7 +34,7 @@ tar cvpzf backup.tgz --exclude=/backup.tgz --one-file-system /
mkswap /dev/sdg2
```
# 部署操作系统
## 部署操作系统
- 挂载待部署磁盘的根分区,解压操作系统文件,修改启动相关参数
```
mount /dev/sdg1 /mnt
@ -46,7 +46,7 @@ tar cvpzf backup.tgz --exclude=/backup.tgz --one-file-system /
#检查 /mnt/etc/mtab 中列出的信息是否正确
```
# 安装 grub2
## 安装 grub2
- 取消挂载,把部署好的磁盘安装回待安装笔记本中,插上 CentOS6.9 的启动 U 盘,从 U 盘启动待安装笔记本,进入 live 模式(安装盘可以在安装界面开始时按下 Alt + F1 切换到 live 模式下),安装 grub2
```
#在 live 模式下切换到 root

View File

@ -6,20 +6,20 @@ tags: ["centos", "nopae"]
categories: ["os"]
---
# 环境
## 环境
- IBM Thinkpad X31
- VirtualBox
- [CentOS-6.9-i386-minimal.iso](http://mirrors.ustc.edu.cn/centos/6.9/isos/i386/CentOS-6.9-i386-minimal.iso)
# 需求
## 需求
- 手头有台笔记本 IBM thinkpad X31,处理器不支持 pae不支持 64 位操作系统要安装一个32位 CentOS6且内核无 pae 要求。
# 准备环境
## 准备环境
- 在支持 pae 的计算机上安装 [VirtualBox](https://www.virtualbox.org/wiki/Downloads) 及其扩展包,以支持 VirtualBox 虚拟机中挂载宿主机 USB 存储。
- 取出 Thinkpad 笔记本的硬盘,通过移动硬盘盒等方法连接刚刚安装 VirtualBox 的计算机,确保该存储正常识别可用。
- 下载[CentOS-6.9-i386-minimal.iso](http://mirrors.ustc.edu.cn/centos/6.9/isos/i386/CentOS-6.9-i386-minimal.iso)
# VirtualBox 下安装 CentOS6.9 虚拟机
## VirtualBox 下安装 CentOS6.9 虚拟机
- 创建 CentOS6.9 x32 虚拟机,这里无需创建虚拟磁盘,后面会把 Thinkpad 笔记本的硬盘挂载到虚拟机中,直接把操作系统安装到该硬盘中。
![不用创建虚拟磁盘](/img/03092704_DUG6.png "无需创建虚拟机磁盘")
- 设置虚拟机,启动 USB 3.0 控制器,增加筛选器,选中刚刚 USB 连接的 Thinkpad 硬盘;网络模式自选,确保虚拟机可上网。
@ -32,7 +32,7 @@ categories: ["os"]
![磁盘选择](/img/03101245_wAKJ.png "默认唯一的磁盘即 USB 设备")
- 该设备就是通过 USB 挂载的 Thinkpad 磁盘,划分好分区,完成系统安装。
# CentOS6.9 虚拟机 Rescue 启动挂载
## CentOS6.9 虚拟机 Rescue 启动挂载
- 由于 VirtuaBox 虚拟机尚不支持从 USB 启动,所以在上一步完成系统安装后,重启虚拟机,依旧使用 CentOS-6.9-i386-minimal.iso 启动。
- 此时从 "Rescue Installed system" 启动,如下图
![rescue](/img/03102522_BRPU.png "Rescue Installed system")
@ -52,7 +52,7 @@ categories: ["os"]
```
- 至此,通过 VirtualBox 虚拟机成功启动 USB 存储(Thinkpad 硬盘)中的根分区并进入其 Bash 环境。
# 安装 NONPAE 内核
## 安装 NONPAE 内核
- 在刚刚启动的 Bash Shell 中,检查网络
```bash
ping www.baidu.com
@ -78,7 +78,7 @@ categories: ["os"]
exit
```
# 启动 Thinkpad X31
## 启动 Thinkpad X31
- 关闭虚拟机,退出 USB 磁盘,把磁盘装回 Thinkpad X31 笔记本中,开机,选择 3.10 内核即可正常启动。
- 卸载官方 2.6 内核(推荐)
```bash

View File

@ -6,7 +6,7 @@ tags: ["oracle", "centos"]
categories: ["database"]
---
# 安装依赖
## 安装依赖
```bash
yum install binutils compat-libstdc++-33 compat-libstdc++-33.i686 \
elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc.i686 \
@ -15,13 +15,13 @@ categories: ["database"]
libstdc++.i686 libstdc++-devel make sysstat unixODBC unixODBC-devel
```
# 创建用户和用户组
## 创建用户和用户组
```bash
groupadd dba oinstall
useradd -g oinstall -m oracle
```
# 配置oracle用户环境变量
## 配置oracle用户环境变量
- 打开 oracle 用户的的默认shell配置文件 ~/.bashrc在最后添加以下代码
```bash
export ORACLE_BASE=/opt/oracle/app #oracle数据库安装目录
@ -38,13 +38,13 @@ categories: ["database"]
source /.bashrc
```
# 创建oracle 11g软件安装路径
## 创建oracle 11g软件安装路径
```bash
mkdir /opt/oracle/app/product/11.2.0/db_home1 -p
chown oracle.oinstall /opt/oracle -R
```
# 配置内核参数
## 配置内核参数
- 编辑 /etc/sysctl.conf在文件尾追加下面的参数设置
```
fs.file-max = 6815744
@ -62,7 +62,7 @@ categories: ["database"]
sysctl -p
```
# 限制 oracle 用户资源
## 限制 oracle 用户资源
- 编辑 /etc/security/limits.conf在末尾添加以下代码
```
oracle soft nproc 2047
@ -71,7 +71,7 @@ categories: ["database"]
oracle hard nofile 65536
```
# 安装字体
## 安装字体
- 一般需要安装中易宋体字体百度随便下载一个zysong.ttf切换到zysong.ttf所在路径运行
```bash
mkdir /usr/share/fonts/zh_CN/TureType/ -p
@ -79,7 +79,7 @@ categories: ["database"]
fc-cache -fv
```
# 安装oracle 11g
## 安装oracle 11g
- 解压下载好的oracle 11g文件
```bash
unzip linux.x64_11gR2_database_1of2.zip -d /home/oracle/
@ -96,7 +96,7 @@ categories: ["database"]
- 若提示swap空间不足自行百度解决
# 配置监听器数据库
## 配置监听器数据库
- Oracle软件安装完后执行 netca 命令配置监听器
```
netca
@ -110,7 +110,7 @@ categories: ["database"]
- 在图形界面中按提示安装数据库就可以了。
# 测试运行
## 测试运行
- 数据库安装完后监听器与数据库实例就已启动,
- 停止和启动监听器
```bash

View File

@ -7,12 +7,12 @@ tags: ["centos", "系统", "迁移"]
categories: ["os"]
---
# 环境
## 环境
- 两台服务器(A,B)
- A 已安装好 CentOS7且已**关闭 selinux**
- B 裸机,待安装操作系统
# 打包根分区
## 打包根分区
- 从 B 上拆下系统硬盘,接在 A 上,启动 A
- 清空日志(推荐)
```bash
@ -33,7 +33,7 @@ categories: ["os"]
tar zcpf /centos7.tgz --exclude=/centos7.tgz --one-file-system / /boot/efi
```
# 硬盘分区
## 硬盘分区
- 假设 /dev/sdb 是 B 的系统硬盘
- MBR 启动时,分区表是 dos只分一个根分区即可
- EFI 启动时,分区表是 gpt需要分一个 512MB 的 **efi 分区**和一个根分区
@ -43,7 +43,7 @@ categories: ["os"]
# t 指定分区类型 1 (即 efi system
```
# 格式化
## 格式化
- MBR 启动
```bash
mkfs.xfs /dev/sdb1
@ -54,7 +54,7 @@ categories: ["os"]
mkfs.xfs /dev/sdb2
```
# 挂载硬盘
## 挂载硬盘
- MBR 启动
```bash
mount /dev/sdb1 /mnt/
@ -66,7 +66,7 @@ categories: ["os"]
mount /dev/sdb1 /mnt/boot/efi/
```
# 部署操作系统
## 部署操作系统
- 解压之前打包的 /centos7.tgz
```bash
tar zxpf /centos7.tgz -C /mnt/
@ -90,7 +90,7 @@ categories: ["os"]
rm -rf /etc/ssh/ssh_host_*
```
# 部署 grub
## 部署 grub
- MBR 启动
```bash
mount --bind /dev/ /mnt/dev/
@ -113,7 +113,7 @@ categories: ["os"]
exit
```
# 启动操作系统
## 启动操作系统
- 卸载 B 的系统硬盘
```bash
umount -R /mnt
@ -121,6 +121,6 @@ categories: ["os"]
- 关闭 A拆下刚部署好操作系统的硬盘接回 B 中
- 启动 B刚部署的 CentOS7 正常启动
# 参考
## 参考
- [https://wiki.centos.org/zh/HowTos/ManualInstall?highlight=%28grub2-install%29](https://wiki.centos.org/zh/HowTos/ManualInstall?highlight=%28grub2-install%29)

View File

@ -7,7 +7,7 @@ tags: ["centos"]
categories: ["os"]
---
# 常用初始配置
## 常用初始配置
- 系统更新
```bash
yum update
@ -125,7 +125,7 @@ categories: ["os"]
- 卸载 ntpdate换 chrony
- 检查 /etc/rc.d/rc.local
# 安全设置
## 安全设置
- /etc/pam.d/sshd
- 用户 ssh 登陆密码错误 3 次后锁住用户 10 分钟
```

View File

@ -7,14 +7,14 @@ tags: ["ceph"]
categories: ["storage"]
---
# 环境
## 环境
操作系统 | 主机名 | 公用地址 | 集群地址 | 数据裸盘 | ceph 版本
---- | ---- | ---- | ---- | ---- | ----
Rocky Linux 8.4 | ceph41 | 10.0.4.41 | 192.168.4.41 | /dev/sdb, /dev/sdc | 15.2.14
Rocky Linux 8.4 | ceph42 | 10.0.4.42 | 192.168.4.42 | /dev/sdb, /dev/sdc | 15.2.14
Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.14
# 关闭防火墙,配置 host
## 关闭防火墙,配置 host
- 在全部节点上执行如下操作
- 关闭 firewalld 和 SELinux
```bash
@ -30,7 +30,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
echo "10.0.4.43 ceph43" >> /etc/hosts
```
# 配置 yum 源
## 配置 yum 源
- 在全部节点上执行如下操作
- 移动系统默认的 repo 文件到备份目录
```bash
@ -103,7 +103,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
dnf makecache
```
# 配置时间同步
## 配置时间同步
- 在全部节点上执行如下操作
- 安装 chrony
```bash
@ -134,7 +134,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
systemctl enable chronyd
```
# 安装 ceph
## 安装 ceph
- 在全部节点上执行如下操作
```bash
dnf install leveldb gdisk gperftools-libs python3-ceph-argparse nvme-cli
@ -156,7 +156,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
osd_pool_default_min_size = 2
```
# 部署 mon
## 部署 mon
- 在 ceph41 上执行如下操作
- 这里创建了一堆傻逼密钥文件,没看懂啥意思,照搬官网
```bash
@ -230,7 +230,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
ceph config set mon auth_allow_insecure_global_id_reclaim false
```
## 查看集群状态
### 查看集群状态
- 在任一节点上执行如下操作
```bash
ceph -s
@ -254,7 +254,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
pgs:
```
# 部署 mgr
## 部署 mgr
- 在 ceph41 上执行如下操作
- 又是创建密钥文件,没看懂啥意思,照搬官网
```bash
@ -297,7 +297,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
systemctl enable ceph-mgr@ceph43
```
## 查看集群状态
### 查看集群状态
- 在任一节点上执行如下操作
```bash
ceph -s
@ -322,8 +322,8 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
pgs:
```
# 部署 osd
## 逻辑卷 osd
## 部署 osd
### 逻辑卷 osd
- 操作简单,推荐
- 直接创建并启动逻辑卷 osd
```bash
@ -333,7 +333,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
- 上一步执行成功后,每个 ceph-osd 服务都已启动,且开机自动启动
## 裸设备 osd
### 裸设备 osd
- 操作麻烦,不推荐
- 在全部节点上执行如下操作
- 准备 osd
@ -401,7 +401,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
' >> /etc/rc.d/rc.local
```
## 查看集群状态
### 查看集群状态
- 在任一节点执行如下操作
```bash
ceph -s
@ -425,7 +425,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
pgs: 1 active+clean
```
# 部署 mds
## 部署 mds
- 只有 cephfs 会用到 mds
- 在 ceph41 上执行如下操作
- 创建密钥文件 ...... 照搬官网
@ -469,7 +469,7 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
systemctl enable ceph-mds@ceph43
```
## 查看集群状态
### 查看集群状态
- 在任一节点上执行如下操作
```bash
ceph -s
@ -494,15 +494,15 @@ Rocky Linux 8.4 | ceph43 | 10.0.4.43 | 192.168.4.43 | /dev/sdb, /dev/sdc | 15.2.
pgs: 1 active+clean
```
# 简单使用
## rbd
## 简单使用
### rbd
- 创建 rbd 池
```bash
ceph osd pool create rbd 128 128
ceph osd pool application enable rbd rbd
```
## cephfs
### cephfs
- 创建 cephfs 池
```bash
# 创建 cephfs 元数据池pg 不用太大,设置 3 个副本

View File

@ -6,7 +6,7 @@ tags: ["ceph"]
categories: ["storage"]
---
# 测试环境
## 测试环境
操作系统 | 主机名 | IP | OSD 设备 | OSD ID | 容量 | ceph 版本
---- | ---- | ---- | ---- | ---- | ---- | ----
CentOS7 | ceph101 | 192.168.1.101 | /dev/sdb | 0 | 3TB | jewel
@ -19,7 +19,7 @@ CentOS7 | ceph103 | 192.168.1.103 | /dev/sdb | 2 | 3TB | jewel
- 操作目录: /home/cephdeploy/ceph-cluster
- IP: 192.168.1.100
# 新增 OSD
## 新增 OSD
- 设置 ceph 三个 noflag禁止 ceph 自动迁移数据
```bash
# 在任一节点上执行下面命令即可
@ -65,7 +65,7 @@ CentOS7 | ceph103 | 192.168.1.103 | /dev/sdb | 2 | 3TB | jewel
ceph -s
```
# 删除 OSD
## 删除 OSD
- 把指定的 osd 踢出集群
```bash
# 在任一节点上执行下面命令即可
@ -122,7 +122,7 @@ CentOS7 | ceph103 | 192.168.1.103 | /dev/sdb | 2 | 3TB | jewel
ceph -s
```
# OSD 动态配置
## OSD 动态配置
- 查看 osd 当前配置
```bash
ceph -n osd.0 --show-config
@ -132,7 +132,7 @@ CentOS7 | ceph103 | 192.168.1.103 | /dev/sdb | 2 | 3TB | jewel
ceph tell osd.* injectargs '--osd_max_backfills 7'
```
# PG 和 PGP
## PG 和 PGP
- 少于 5 个 OSD 时可把 pg_num 设置为 128
- OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
- OSD 数量在 10 到 50 个时,可把 pg_num 设置为 1024
@ -159,7 +159,7 @@ CentOS7 | ceph103 | 192.168.1.103 | /dev/sdb | 2 | 3TB | jewel
ceph pg map {pg-id}
```
# CEPH 服务器关机维护
## CEPH 服务器关机维护
- 设置 ceph 节点 down 后不自动迁移或恢复数据
```bash
ceph osd set noout

View File

@ -6,11 +6,11 @@ tags: []
categories: ["clickhouse"]
---
# Buffer 表引擎简介
## Buffer 表引擎简介
- 只写内存,无持久化存储
- 缓冲高并发写入满足条件时Buffer 表会把数据刷新到目标表
# 创建 Join 引擎表
## 创建 Join 引擎表
- 声明
```sql
ENGINE = Buffer(

View File

@ -6,17 +6,17 @@ tags: []
categories: ["clickhouse"]
---
# 简介
## 简介
- 常驻内存,支持动态更新
- 适合保存常量和经常使用的维度表数据
- 可通过字典函数访问,也可通过袋里表与其他数据表实现 JOIN 查询
# 内置字典
## 内置字典
- 默认禁用
- 不想写了,没啥意思
# 外部扩展字典
## 配置文件
## 外部扩展字典
### 配置文件
- 位置: /etc/clickhouse-server/\*\_dictionary.xml
- 自动感知变更,不停机在线更新
- 系统表: system.dictionaries
@ -201,7 +201,7 @@ categories: ["clickhouse"]
</dictionaries>
```
## 操作
### 操作
- 手动更新全部数据字典
```sql
SYSTEM RELOAD DICTIONARIES;
@ -239,7 +239,7 @@ categories: ["clickhouse"]
LIFETIME(1);
```
# Dictionary 表引擎
## Dictionary 表引擎
- 创建字典表
```sql
CREATE TABLE table_name(

View File

@ -6,8 +6,8 @@ tags: []
categories: ["clickhouse"]
---
# 基础类型
## 整数
## 基础类型
### 整数
声明 | 大小(字节) | 范围
---- | ---- | ----
Int8 | 1 | -128 到 127
@ -19,7 +19,7 @@ UInt32 | 4 | 0 到 4294967295
Int64 | 8 | -9223372036854775808 到 9223372036854775807
UInt64 | 8 | 0 到 18446744073709551615
## 浮点数
### 浮点数
声明 | 大小(字节) | 有效精度(位数)
---- | ---- | ----
Float32 | 4 | 7
@ -29,7 +29,7 @@ Float64 | 8 | 16
- 负无穷: SELECT -0.8/0
- 非数字: SELECT 0/0
## 定点数
### 定点数
- 原生声明: Decimal(P,S)
- P: 总位数(整数+小数),取值范围 1~38
- S: 小数位数,取值范围 0~P
@ -39,32 +39,32 @@ Float64 | 8 | 16
- Decimal64(S): -10^(18-S) 到 10^(18-S)
- Decimal128(S): -10^(18-S) 到 10^(38-S)
## 字符串
### 字符串
声明 | 备注
---- | ----
String | 长度不固定,不限字符集,建议 UTF-8
FixedString(N) | 长度固定null 字节填充
UUID | 格式是 8-4-4-4-120 填充
## 时间
### 时间
声明 | 精度 | 示例
---- | ---- | ----
Datetime | 秒 | 2020-09-18 19:59:00
Datetime64(N) | 亚秒 | 2020-09-18 19:59:00.00
Date | 日 | 2020-09-18
# 复合类型
## 数组
## 复合类型
### 数组
- 声明: [T], Array(T)
- 查询时会以最小储存代价为原则推断类型
- 元素类型可以不同,但必须兼容
## 元组
### 元组
- 声明: (T), tuple(T)
- 查询时会以最小储存代价为原则推断类型
- 元素类型可以不同,且无须兼容
## 枚举
### 枚举
声明 | Key 类型 | Value 类型
---- | ---- | ----
Enum8('k1'=1,'k2'=2, ... ,'kN'=N) | String | Int8
@ -72,7 +72,7 @@ Enum16('k1'=1,'k2'=2, ... ,'kN'=N) | String | Int16
- 枚举的所有后续操作,都会使用 Int 类型的 Value 值
## 嵌套
### 嵌套
- 声明
```sql
Nested(
@ -84,12 +84,12 @@ Enum16('k1'=1,'k2'=2, ... ,'kN'=N) | String | Int16
- 同一行数据内,嵌套字段中的每一列的数组长度必须相等
- 访问嵌套字段中的列时用点(.)连接
## 可空类型
### 可空类型
- 声明: Nullable(T)
- 只能和基础类型搭配使用,不用用于复合类型和索引字段
- 慎用,会额外生成 [Column].null.bin 文件保存 null 值,导致双倍文件操作,使查询和写入变慢
## 域名类型
### 域名类型
声明 | 封装类型
---- | ----
IPv4 | UInt32
@ -98,8 +98,8 @@ IPv6 | FixedString(16)
- Domain 类型不是字符串,不支持自动类型转换
- 调用 IPv4NumToString 或 IPv6NumToString 函数返回 IP 的字符串形式
# 数据库
## 操作
## 数据库
### 操作
- 创建
```sql
CREATE DATABASE [IF NOT EXISTS] db_name [ENGINE = engine];
@ -120,15 +120,15 @@ IPv6 | FixedString(16)
SHOW TABLES;
```
## 引擎
### 引擎
- Ordinary: 默认引擎,无须刻意声明,可以使用任意类型表引擎
- Dictionary: 字典引擎,自动为所有数据字典创建数据表
- Memory: 内存引擎,存放临时数据,数据只停留在内存中
- Lazy: 日志引擎,只能使用 Log 系列的表引擎
- MySQL: MySQL 引擎,自动拉取远端 MySQL 中的数据,并创建 MySQL 表引擎的数据表
# 数据表
## 操作
## 数据表
### 操作
- 常规建表,默认在 default 数据库中创建
```sql
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name {
@ -198,15 +198,15 @@ IPv6 | FixedString(16)
TRUNCATE TABLE [IF EXISTS] [db_name.]tb_name;
```
## 表字段默认值
### 表字段默认值
- 声明: DEFAULT、MATERIALIZED、ALIAS
- 如果表字段没有明确类型定义,则可根据默认值进行类型推断
- 写入数据时,只有 DEFAULT 类型字段可以 INSERT
- 查询数据时,只有 DEFUALT 类型字段可以 SELECT * 返回
- DEFAULT 和 MATERIALIZED 类型字段可以持久化
# 临时表
## 操作
## 临时表
### 操作
- 创建
```sql
CREATE TEMPORARY TABLE [IF NOT EXISTS] table_name {
@ -222,13 +222,13 @@ IPv6 | FixedString(16)
};
```
## 其他
### 其他
- 临时表只支持 Memory 表引擎,与会话绑定
- 临时表不属于任何数据库,创建时无数据库参数和表引擎参数
- 临时表优先级大于普通表
# 分区表
## 操作
## 分区表
### 操作
- 创建
```sql
CREATE TABLE partition_v1 (
@ -270,11 +270,11 @@ IPv6 | FixedString(16)
ALTER TABLE table_name ATTACH PARTITION part_expr;
```
## 其他
### 其他
- 分区支持删除、替换和重置,只有 MergeTree 系列表引擎支持
# 视图
## 操作
## 视图
### 操作
- 创建普通视图
```sql
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name AS SELECT ... ;
@ -298,11 +298,11 @@ IPv6 | FixedString(16)
DROP TABLE view_name
```
## 其他
### 其他
- 普通视图只是查询代理
- 物化视图有独立存储,不支持同步删除
# 分布式 DDL
## 分布式 DDL
- 使用 ON CLUSTER cluster_name 声明语句
```sql
CREATE TABLE table_name ON CLUSTER cluster_name(
@ -312,7 +312,7 @@ IPv6 | FixedString(16)
) ENGINE = engine ... ;
```
# 写入数据
## 写入数据
- INSERT 语句三种语法
```sql
INSERT INTO [db_name.]table_name [(c1,c2,c3 ...)]
@ -324,8 +324,8 @@ IPv6 | FixedString(16)
INSERT INTO [db_name.]table_name [(c1,c2,c3 ...)] SELECT ... ;
```
# 修改和删除数据
## 操作
## 修改和删除数据
### 操作
- 删除
```sql
ALTER TABLE [db_name.]table_name DELETE WHERE filter_expr;
@ -337,7 +337,7 @@ IPv6 | FixedString(16)
WHERE filter_expr;
```
## 其他
### 其他
- mutation 操作很重,后台执行,语句提交后立即返回,不支持事务,不能回滚
- 通过 system.mutations 系统表查询进度

View File

@ -6,13 +6,13 @@ tags: []
categories: ["clickhouse"]
---
# File 表引擎简介
## File 表引擎简介
- 直接读取本地文件
- 修改文件 = 数据更新
- 导出数据到本地文件
- 数据格式转换
# 创建 FILE 引擎表
## 创建 FILE 引擎表
- 声明
```sql
ENGINE = File('format')

View File

@ -6,8 +6,8 @@ tags: []
categories: ["clickhouse"]
---
# 环境
## Zookeeper 服务器
## 环境
### Zookeeper 服务器
eth0 IP | eth1 IP | 操作系统 | ZK 版本 | myid
---- | ---- | ---- | ---- | ----
10.0.4.101 | 10.1.4.101 | CentOS7.8 | 3.4.14 | 101
@ -17,7 +17,7 @@ eth0 IP | eth1 IP | 操作系统 | ZK 版本 | myid
- eth0 网卡用于向客户端提供服务eth1 网卡用于 Zookeeper 集群内部通信
- 配置时间同步,关闭 selinux 和 firewalld
## ClickHouse 服务器
### ClickHouse 服务器
eth0 IP | eth1 IP | 操作系统 | CH 版本 | shard 值 | replica 值
---- | ---- | ---- | ---- | ---- | ----
10.0.4.181 | 10.1.4.181 | CentOS7.8 | 20.3 LTS | 1 | 10.1.4.181
@ -30,13 +30,13 @@ eth0 IP | eth1 IP | 操作系统 | CH 版本 | shard 值 | replica 值
- eth0 网卡用于向客户端提供服务eth1 网卡用于 ClickHouse 集群内部通信
- 配置时间同步,关闭 selinux 和 firewalld
# 安装 Zookeeper 集群
## 安装 Zookeeper 集群
- ClickHouse 集群依赖 zookeeper 管理集群配置
- 安装过程参考: [CentOS7 安装 zookeeper 集群](/post/zk-install/)
- 启动 zookeeper 集群zookeeper 正常运行后,才能进行后续步骤
# 安装 ClickHouse 集群
## 配置 ClickHouse yum 源
## 安装 ClickHouse 集群
### 配置 ClickHouse yum 源
- 在每台 ClickHouse 服务器上执行如下操作
- 生成 clickhouse.repo 文件
```bash
@ -56,14 +56,14 @@ eth0 IP | eth1 IP | 操作系统 | CH 版本 | shard 值 | replica 值
yum makecache fast
```
## 安装 ClickHouse
### 安装 ClickHouse
- 在每台 ClickHouse 服务器上执行如下操作
- 安装 clickhouse-server 和 clickhouse-client
```bash
yum install clickhouse-server clickhouse-client
```
## 修改 ClickHouse 配置
### 修改 ClickHouse 配置
- 在每台 ClickHouse 服务器上执行如下操作
- 我没用 /etc/metrika.xml 和 config.d 子目录,直接修改的 config.xml先备份
```bash
@ -197,21 +197,21 @@ eth0 IP | eth1 IP | 操作系统 | CH 版本 | shard 值 | replica 值
</macros>
```
## 启动 ClickHouse
### 启动 ClickHouse
- 在每台 ClickHouse 服务器上执行如下操作
- 启动 clickhouse-server 服务
```bash
systemctl start clickhouse-server
```
# 查看集群状态
## 查看集群状态
- 在任一 ClickHouse 服务器上执行如下操作
- 查询 system.cluster 表
```sql
SELECT * FROM system.clusters;
```
# 简单使用
## 简单使用
- 在任意节点上登陆 clickhouse
```bash
clickhouse-client -h 127.0.0.1

View File

@ -6,12 +6,12 @@ tags: []
categories: ["clickhouse"]
---
# Join 表引擎简介
## Join 表引擎简介
- 数据先写内存,再同步到磁盘,服务重启后全量加载到内存
- 与 Set 表引擎共用大部分处理逻辑
- 简单封装了一层 JOIN 查询,主要用做 JOIN 查询
# 创建 Join 引擎表
## 创建 Join 引擎表
- 声明
```sql
ENGINE = Join(join_strictness, join_type, key1[, key2, ...])
@ -22,6 +22,6 @@ categories: ["clickhouse"]
- key1, key2 ...: 连接键,关联字段
- 如果连接精度是 ANY写入数据时会忽略连接键相同的数据
# 参考
## 参考
- [ClickHouse 表引擎之 Join](/post/ch-search/#JOIN)

View File

@ -6,10 +6,10 @@ tags: []
categories: ["clickhouse"]
---
# Kafka 表引擎简介
## Kafka 表引擎简介
- 对接 Kafka 系统,订阅 Kafka 主题,接收消息
# 创建 Kafka 引擎表
## 创建 Kafka 引擎表
- 声明
```sql
ENGINE = Kafka()
@ -35,7 +35,7 @@ categories: ["clickhouse"]
- kafka_skip_broken_messages: 允许跳过的错误消息数量默认0
- kafka_commit_every_batch: kafka commit 频率,默认 0即整个 Block 完全写入后才 commit
# Kafka 表引擎其他参数
## Kafka 表引擎其他参数
- stream_poll_timeout_ms: 默认每 500ms 消费一次数据,写入缓存
- 刷新缓存触发条件:
- 一个数据块(kafka_max_block_size默认 65536)写入完成
@ -48,7 +48,7 @@ categories: ["clickhouse"]
</kafka>
```
# Kafka 引擎表一般用法
## Kafka 引擎表一般用法
- 创建 Kafka 引擎表,充当数据管道
- 创建 MergeTree 引擎表,用于查询
- 创建物化视图,同步 kafka 数据到 MergeTree 引擎表

View File

@ -6,14 +6,14 @@ tags: []
categories: ["clickhouse"]
---
# Live View 视图简介
## Live View 视图简介
- 类似时间监听器
- 需设置 allow_experimental_live_view 为 1检查
```sql
SELECT name, value FROM system.settings WHERE name LIKE '%live_view%';
```
# 创建 Live View 视图
## 创建 Live View 视图
- 创建
```sql
CREATE LIVE VIEW lv_name AS SELECT count(*) FROM table_name;

View File

@ -6,11 +6,11 @@ tags: []
categories: ["clickhouse"]
---
# 日志表引擎简介
## 日志表引擎简介
- 数据量 100 万行一下,一次写入多次查询
- 不支持索引、分区、并发读写
# TinyLog 表引擎
## TinyLog 表引擎
- 数据文件按列存储
- 无标记文件,不支持并行读取
- 声明
@ -18,7 +18,7 @@ categories: ["clickhouse"]
ENGINE = TinyLog()
```
# StripeLog 表引擎
## StripeLog 表引擎
- 只用数据写入一个文件
- 有数据标记文件,可并行读取
- 声明
@ -26,7 +26,7 @@ categories: ["clickhouse"]
ENGINE = StripeLog()
```
# Log 表引擎
## Log 表引擎
- 数据文件按列存储
- 有数据标记文件,可并行读取
- 声明

View File

@ -6,12 +6,12 @@ tags: []
categories: ["clickhouse"]
---
# Memory 表引擎简介
## Memory 表引擎简介
- 数据只存于内存中,无压缩,无格式转换
- 支持并行查询
- 一般用于 clickhouse 内部,作为集群间分发数据的载体
# 创建 Memory 引擎表
## 创建 Memory 引擎表
- 声明
```sql
ENGINE = Memory()

View File

@ -6,13 +6,13 @@ tags: []
categories: ["clickhouse"]
---
# Merge 表引擎简介
## Merge 表引擎简介
- 本身不存储数据,只整合其他数据表
- 不支持数据写入
- 合并异步查询的结果集
- 各异步查询的数据表需要在同一个数据库下,且表结构相同,表引擎和分区定义可不同
# 创建 Merge 表引擎
## 创建 Merge 表引擎
- 声明
```sql
ENGINE = Merge(database, table_name)

View File

@ -6,12 +6,12 @@ tags: []
categories: ["clickhouse"]
---
# 简介
## 简介
- 支持主键索引、数据分区、数据副本、数据采样、ALTER 操作
- 扩展表引擎丰富,生产环境中大多使用该表引擎
- 数据以片段形式写入磁盘,后台定期合并片段到各分区相应片段
# 数据表
## 数据表
- 建表语句
```sql
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name(
@ -35,7 +35,7 @@ categories: ["clickhouse"]
- merge_with_ttl_timeout: TTL 合并间隔时间,默认 86400(1天)
- storage_policy: 数据在硬盘上的存储策略
# 数据文件
## 数据文件
- 目录和文件
```
table_name # 表名目录
@ -53,8 +53,8 @@ categories: ["clickhouse"]
|___ skp_idx_{column_name}.mrk # 二级索引(跳数索引)列的标记文件
```
# 数据分区
## 分区 ID
## 数据分区
### 分区 ID
- 单字段分区 ID 生成规则
类型 | 样例数据 | 分区表达式 | 分区 ID
@ -68,7 +68,7 @@ categories: ["clickhouse"]
- 多字段(元组)分区时, 先按单字段生成对应 ID再用 "-" 拼接
## 分区目录
### 分区目录
- 分区目录命名: PartitionID_MinBlockNum_MaxBlockNum_Level例如 202010_1_1_0
- PartitionID: 分区 ID
- MinBlockNum: 最小数据块编号,**表内全局累加**,从 1 开始
@ -83,7 +83,7 @@ categories: ["clickhouse"]
- MaxBlockNum: 所有合并目录中的最大 MaxBlockNum
- Level: 所有合并目录中的最大 Level 值并加 1
# 数据索引
## 数据索引
- 常驻内存
- 一级索引是稀疏索引,间隔 index_granularity (默认 8192) 行数据生成一条索引记录
- 二级索引又称跳数索引,有数据的聚合信息构建而成,在 CREATE 语句中定义如下:
@ -119,7 +119,7 @@ categories: ["clickhouse"]
-- 注意传参时不需要指定 token 长度
```
# 数据存储
## 数据存储
- 按列独立存储
- 默认 LZ4 压缩
- 按照 order by 排序
@ -128,20 +128,20 @@ categories: ["clickhouse"]
- 64KB <= 单批次数据 <= 1MB直接生成压缩数据块
- 单批次数据 > 1MB按照 1MB 大小截断并生成数据块,剩余数据继续按前面规则执行
# 数据标记
## 数据标记
- 使用 LRU 策略缓存
- 每一行标记数据记录的是一个数据片段在 .bin 文件中的读取位置
# 数据写入
## 数据写入
- 生成分区目录,合并分区相同的目录
- 按照 index_granularity 索引粒度,生成一级索引、二级索引、数据标记文件和数据压缩文件
# 数据查询
## 数据查询
- 借助分区、索引、数据标记来缩小扫描范围
- 如果未指定查询条件或条件未匹配到索引MergeTree 仍可借助数据标记多线程读取压缩数据块
# 数据 TTL
## TTL 机制
## 数据 TTL
### TTL 机制
- TTL 信息保存在分区目录中的 ttl.txt 中
- 支持的时间单位: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR
- 触发 TTL 删除过期数据
@ -158,7 +158,7 @@ categories: ["clickhouse"]
SYSTEM STOP TTL MERGES;
```
## 列级别 TTL
### 列级别 TTL
- 到达时间时,列数据被还原为对应数据类型的默认值
- 主键字段不能被声明 TTL
- 声明列级别 TTL
@ -178,7 +178,7 @@ categories: ["clickhouse"]
ALTER TABLE table_name MODIFY COLUMN code String TTL create_time + INTERVAL 1 DAY;
```
## 表级别 TTL
### 表级别 TTL
- 到达时间时,删除过期的数据行
- 声明表级别 TTL
```sql
@ -198,24 +198,24 @@ categories: ["clickhouse"]
ALTER TABLE table_name MODIFY TTL create_time + INTERVAL 3 DAY;
```
# 存储策略
## 存储策略
- 最小移动单元是数据分区
- 三大策略: 默认、JBOD、HOT/COLD
## 默认策略
### 默认策略
- 无需配置,所有分区自动保存至 config.xml 中的 path 目录下
## JOB 策略
### JOB 策略
- 适用于多磁盘无 RAID 场景
- INSERT 或 MERGE 产生的新分区轮询写入各磁盘,类似 RAID0
- 磁盘故障时,丢掉相应数据,需要副本机制保障数据可靠性
## HOT/COLD 策略
### HOT/COLD 策略
- 适用于已挂载不同类型磁盘的场景
- 把磁盘划分到 HOT 和 COLD 两个区域HOT 使用 SSD注重性能CODE 使用 HDD注重经济
- 单个区域内可应用 JBOD 策略
## 配置策略
### 配置策略
- 配置示例
```xml
<storage_configuration>
@ -290,7 +290,7 @@ categories: ["clickhouse"]
ALTER TABLE table_name MOVE PART 'part_name' TO VOLUME 'volume_name';
```
# ReplacingMergeTree
## ReplacingMergeTree
- 依据 ORDER BY 字段去重
- 合并分区时,**以分区为单位**删除重复数据
- 声明
@ -302,7 +302,7 @@ categories: ["clickhouse"]
- 未指定 version_column 时,保留同一组重复数据中的最后一行
- 指定 version_column 时,保留同一组重复数据中该字段取值最大的一行
# SummingMergeTree
## SummingMergeTree
- 场景: 用户只需要汇总结果,不关心明细
- 依据 ORDER BY 字段聚合
- 合并分区时,触发条件聚合,**以分区为单位**把同一分组下的多行数据汇总成一行
@ -316,7 +316,7 @@ categories: ["clickhouse"]
- 非汇总字段保留同组内的第一行数据
- 汇总嵌套字段时,字段名需以 Map 为后缀,默认嵌套字段中第一列作为聚合 Key其他以 \*Key、\*Id、\*Type 未后缀名的列会和第一列组成复合 Key
# AggregatingMergeTree
## AggregatingMergeTree
- 预先计算聚合数据,二进制格式存入表中,空间换时间,可看成是 SummingMergeTree 的*升级版*
- 依据 ORDER BY 字段聚合
- 使用 AggregationFunction 字段类型定义聚合函数和字段
@ -357,7 +357,7 @@ categories: ["clickhouse"]
SELECT id, sumMerge(value), uniqMerge(code) FROM agg_view GROUP BY id,city;
```
# CollapsingMergeTree
## CollapsingMergeTree
- 以增代删
- 声明
```sql
@ -376,7 +376,7 @@ categories: ["clickhouse"]
- 合并分区时,触发**以分区为单位**的数据折叠
- 严格要求数据写入顺序,只有先写入 sign=1再写入 sign=-1才能正常折叠
# VersionedCollapsingMergeTree
## VersionedCollapsingMergeTree
- 与 CollapsingMergeTree 类似,但对数据写入顺序没有要求
- 声明
```sql

View File

@ -6,11 +6,11 @@ tags: []
categories: ["clickhouse"]
---
# MySQL 表引擎简介
## MySQL 表引擎简介
- 可以与 MySQL 数据库中的表建立映射
- 只支持 SELECT 和 INSERT不支持 UPDATE 和 DELETE
# 创建 MySQL 引擎表
## 创建 MySQL 引擎表
- 声明
```sql
ENGINE = MySQL(
@ -34,7 +34,7 @@ categories: ["clickhouse"]
- replace_query: 对应 mysql 的 replace into 语法,默认 0不启用
- on_duplicate_clause: 对应 mysql 的 on duplicate key 语法,默认空,如果要使用,需设置 replace_query 为 0
# MySQL 引擎表一般用法
## MySQL 引擎表一般用法
- 在 mysql 中建表
- 在 clickhouse 中创建对应的 MySQL 引擎表
- 在 clickhouse 中创建 MergeTree 引擎的物化视图,从 MySQL 引擎表中读取数据

View File

@ -6,11 +6,11 @@ tags: []
categories: ["clickhouse"]
---
# Null 表引擎简介
## Null 表引擎简介
- 类似 /dev/null忽略写入的任何数据查询时返回空表
- 如果物化视图不需要保留源表数据,则可设置源表为 Null 引擎
# 创建 Null 表引擎
## 创建 Null 表引擎
- 声明
```sql
ENGINE = Null

View File

@ -6,12 +6,12 @@ tags: []
categories: ["clickhouse"]
---
# 指标
## 指标
- system.metrics: 正在执行的概要信息,如正在运行的查询和操作数量
- system.events: 累积概要信息,如总的查询次数或 SELECT 次数
- system.asynchronous_metrics: 后台异步运行的概要信息,如分配内存、队列中的人物数量
# 日志
## 日志
- system.query: 执行用户、查询语句、执行时间、返回数据量等信息
```xml
<query_log>

View File

@ -6,12 +6,12 @@ tags: []
categories: ["clickhouse"]
---
# 简介
## 简介
- 一个集群包含多个逻辑分片,每个逻辑分片包含多个副本节点
- 向集群内读写数据时,需依赖 Distributed 引擎表做为代理,实现数据的分发、写入、查询和路由
- ReplicatedMerge 表引擎配合 zookeeper 实现数据的复制
# 集群配置
## 集群配置
- 节点分配
```xml
<remote_servers>
@ -119,7 +119,7 @@ categories: ["clickhouse"]
- system.zookeeper: zookeeper 代理表,可通过 sql 查看 zookeeper 信息
- system.clusters: 集群信息表
# ReplicatedMergeTree 表引擎
## ReplicatedMergeTree 表引擎
- 引入 zookeeper 实现分布式协同zookeeper 本身不涉及表数据传输
- 副本节点是多主架构,可在节点上执行读写操作
- 数据块: 默认 1048576 行(max_insert_block_size)
@ -128,7 +128,7 @@ categories: ["clickhouse"]
- 唯一性: 记录 hash 信息,相同的数据块会被忽略
## 创建 ReplicatedMergeTree 引擎表
### 创建 ReplicatedMergeTree 引擎表
- 声明
```sql
CREATE TABLE table_name_local ON CLUSTER cluster_name_2
@ -145,10 +145,10 @@ categories: ["clickhouse"]
- db_name: 数据库名
- {replica}: 节点域名/IP从各自节点的宏变量中获取
# Distributed 表引擎
## Distributed 表引擎
- 又叫分布式表,自身不存储数据,只代理数据分片
## 创建 Distributed 引擎表
### 创建 Distributed 引擎表
- 声明
```sql
CREATE TABLE table_name_all ON CLUSTER cluster_name_1
@ -163,11 +163,11 @@ categories: ["clickhouse"]
- table_name_local: 数据表名,即前面创建的 ReplicatedMergeTree 引擎表,通常以 \_local 为后缀
- sharding_key: 分片键,可以是整型列字段或返回整型的表达式,决定数据分配到哪些节点中
# 分布式查询
## 分布式查询
- 分布式表(Distributed)把查询转换为并行的各分片查询
- 汇总各分片的查询结果
## GlOBAL 优化查询
### GlOBAL 优化查询
- 场景: 涉及到 JOIN 和 IN 时,可能会放大分布式查询
- GLOBAL 查询过程:
- 提出 IN 子句,发起分布式查询

View File

@ -6,10 +6,10 @@ tags: []
categories: ["clickhouse"]
---
# 查询注意
## 查询注意
- **避免使用 SELECT * 查询**
# WITH
## WITH
- **WITH 子句只能返回一行数据**
- 定义变量
```sql
@ -31,11 +31,11 @@ categories: ["clickhouse"]
- WITH 子句可在子查询中嵌套使用
# FROM
## FROM
- 支持表、表函数和子查询
- 可用 FINAL 修饰以强制合并,会降低性能,应尽量避免使用
# SAMPLE
## SAMPLE
- 返回采样数据,减少查询负载,适用于近似查询
- 只能用于 MergeTree 系列引擎表,且声明了 SAMPLE BY 抽样表达式
- 虚拟字段 \_sample_factor 是采样系数
@ -63,7 +63,7 @@ categories: ["clickhouse"]
SELECT ... SAMPLE 0.4 OFFSET 0.5
```
# ARRAY JOIN
## ARRAY JOIN
- 允许在数据表内部,与数组或嵌套字段进行 JOIN 操作,操作时把数组或嵌套字段拆成多行
- 支持 INNER 和 LEFT默认 INNER
```sql
@ -71,8 +71,8 @@ categories: ["clickhouse"]
SELECT ... FROM table_name LEFT ARRAY JOIN column_name AS alias_name
```
# JOIN
## 连接精度
## JOIN
### 连接精度
- ALL: 默认,左表的每行数据,在右表中有多行连接匹配,返回右表全部连接数据
- ANY: 左表的每行数据,在右表中有多行连接匹配,返回右表第一行连接数据
- ASOF: 增加模糊连接条件,对应字段必须是整数、浮点数和日期这类有序数据类型
@ -81,7 +81,7 @@ categories: ["clickhouse"]
-- key_1 字段是 join keykey_2 是模糊连接条件字段
```
## 连接类型
### 连接类型
- INNER: 内连接,返回交集部分
- OUTER: 外链接
- LEFT: 左表数据全部返回,右表匹配则返回,不匹配则填充相应字段的默认值
@ -90,7 +90,7 @@ categories: ["clickhouse"]
- CROSS: 交叉连接,返回笛卡儿积
## JOIN 查询优化
### JOIN 查询优化
- 左大右小,小表放右侧,右表会被加载到内存中
- JOIN 查询无缓存,应用可考虑实现查询缓存
- 大量维度属性补全时,建议使用字典表代替 JOIN 查询
@ -99,7 +99,7 @@ categories: ["clickhouse"]
SELECT ... FROM table_1 INNTER JOIN table_2 USING key_1
```
# PREWHERE
## PREWHERE
- 只能用于 MergeTree 系列表引擎
- 与 WHERE 不同之处:
- 只读取 PREWHERE 指定的列字段,条件过滤
@ -107,7 +107,7 @@ categories: ["clickhouse"]
- clickhouse 会在合适条件下自动把 WHERE 替换成 PREWHERE
# GROUP BY
## GROUP BY
- WITH ROLLUP按聚合键从右向左上卷数据基于聚合函数依次生成分组小计和总计
```sql
SELECT table, name, SUM(bytes_on_disk) FROM system.parts
@ -132,18 +132,18 @@ categories: ["clickhouse"]
...
```
# HAVING
## HAVING
- 必须与 GROUP BY 配合使用,把聚合结果二次过滤
```sql
SELECT ... GROUP BY ... HAVING ...
```
# ORDER BY
## ORDER BY
- 默认 ASC(升序)
- NULLS LAST默认其他值 -> NaN -> NULL
- NULLS FIRSTNULL -> NaN -> 其他值
# LIMIT BY
## LIMIT BY
- 返回指定分组的最多前 n 行数据
```sql
LIMIT n BY key1,key2 ...
@ -156,7 +156,7 @@ categories: ["clickhouse"]
LIMIT m,n BY key1,key2 ...
```
# LIMIT
## LIMIT
- 返回指定的前 n 行数据
```sql
LIMIT n
@ -166,17 +166,17 @@ categories: ["clickhouse"]
- 推荐搭配 ORDER BY保证全局顺序
# SELECT
## SELECT
- 查询正则匹配的列字段
```sql
SELECT COLUMNS('^n'), COLUMNS('p') FROM system.databases
```
# DISTINCT
## DISTINCT
- 去重
- 先 DISTINCT 后 ORDER BY
# UNION ALL
## UNION ALL
- 联合左右两边的子查询,一并返回结果,可多次声明使用联合多组查询
```sql
SELECT c1, c2 FROM t1 UNION ALL SELECT c3, c4 FROM t2
@ -184,7 +184,7 @@ categories: ["clickhouse"]
- 两边列字段数量必须一样,类型兼容,查询结果列名以左侧为准
# SQL 执行计划
## SQL 执行计划
- 设置日志到 DEBUG 或 TRACE 级别,可查看 SQL 执行日志
- SQL 需真正执行后才有日志,如果查询量大,推荐 LIMIT
- **不要用 SELECT * 查询**

View File

@ -6,18 +6,18 @@ tags: []
categories: ["clickhouse"]
---
# Set 表引擎简介
## Set 表引擎简介
- 数据先写内存,再同步到磁盘,服务重启后全量加载到内存
- 支持 INSERT写入时重复数据被忽略
- 不能直接 SELECT只能作为 IN 查询的右侧条件
# 创建 Set 引擎表
## 创建 Set 引擎表
- 声明
```sql
ENGINE = Set()
```
# 使用
## 使用
- 创建 Set 引擎表
- INSERT 写入数据
- 查询

View File

@ -6,12 +6,12 @@ tags: []
categories: ["clickhouse"]
---
# URL 表引擎简介
## URL 表引擎简介
- http 客户端,支持 http 和 https 协议
- SELECT 转换成 GET 请求
- INSERT 转换成 POST 请求
# 创建 URL 表引擎
## 创建 URL 表引擎
- 声明
```sql
ENGINE = URL('url', format)

View File

@ -7,7 +7,7 @@ tags: [cloudera cdh]
categories: ["hadoop"]
---
# 环境
## 环境
角色 | IP | 主机名 | 服务
---- | ---- | ---- | ----
@ -19,7 +19,7 @@ Worker | 192.168.1.104 | w0.colben.cn | DataNode<br>NodeManager
Worker | 192.168.1.105 | w0.colben.cn | DataNode<br>NodeManager
Worker | 192.168.1.106 | w0.colben.cn | DataNode<br>NodeManager
# 配置 ssh 免密登陆
## 配置 ssh 免密登陆
- 在 cm0 上配置 ssh 可免密登陆全部服务器
```
@ -29,7 +29,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode<br>NodeManager
- 这里的**私钥会在后面通过界面增加主机时用到**
# 关闭防火墙和 selinux
## 关闭防火墙和 selinux
- 在全部服务器上关闭防火墙
```
@ -43,7 +43,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode<br>NodeManager
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
```
# 配置网络名称
## 配置网络名称
- 在全部服务器上修改 /etc/hosts增加如下解析记录
```
@ -66,7 +66,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode<br>NodeManager
hostnamectl set-hostname XXXX.colben.cn
```
# 配置时间同步
## 配置时间同步
- 在 cm0 上配置修改 /etc/chrony.conf
```
@ -84,7 +84,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode<br>NodeManager
systemctl restart chronyd
```
# 配置 cloudera manager 内网安装源
## 配置 cloudera manager 内网安装源
- 在 cm0 上安装并启动 httpd 服务
```
@ -138,7 +138,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode<br>NodeManager
- 通过界面增加其他主机时cloudera manager 会自动部署该 repo 文件
# 安装 jdk
## 安装 jdk
- 在 cm0 上安装 jdk
```
@ -147,14 +147,14 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode<br>NodeManager
- 通过界面增加其他主机时,可自动安装 oracle-j2sdk1.8
# 安装 cloudera manager
## 安装 cloudera manager
- 在 cm0 上安装 cloudera-manager
```
yum install cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server
```
# 配置 cloudera manager 数据库
## 配置 cloudera manager 数据库
- 在 cm0 上安装 mysql[参考这里](/post/mysql5.7-install/)
- 官方推荐 my.cnf
@ -241,7 +241,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode<br>NodeManager
/usr/share/java/mysql-connector-java.jar
```
# 启动 cloudera manager
## 启动 cloudera manager
- 在 cm0 上启动 cloudera manager
```
systemctl start cloudera-scm-server

View File

@ -6,12 +6,12 @@ tags: ["kubernetes", "configmap"]
categories: ["container"]
---
# 概述
## 概述
- ConfigMap 通常用于设置环境变量、设置命令行参数、创建配置文件
- Pod 使用 ConfigMap 前ConfigMap 必须存在,否则 pod 不能启动
- ConfigMap 只能被在同一一个命名空间中的Pod所引用
# 创建 ConfigMap
## 创建 ConfigMap
- 命令如下
```bash
kubectl create configmap <map-name> <data-source>
@ -21,7 +21,7 @@ categories: ["container"]
- map-name: ConfigMap 名称
- data-source: 目录、文件或具体值
## 通过目录创建 ConfigMaps
### 通过目录创建 ConfigMaps
- 命令如下
```bash
kubectl create configmap game-config \
@ -43,7 +43,7 @@ categories: ["container"]
kubectl get configmaps game-config -o yaml
```
## 通过文件创建 ConfigMaps
### 通过文件创建 ConfigMaps
- 通过单个文件创建
```bash
kubectl create configmap game-config-2 \
@ -63,7 +63,7 @@ categories: ["container"]
# value 是 game.properties 文件的内容
```
## 通过具体值创建 ConfigMaps
### 通过具体值创建 ConfigMaps
- 使用 --from-literal 参数定义具体值
```bash
kubectl create configmap special-config \
@ -71,9 +71,9 @@ categories: ["container"]
--from-literal=special.type=charm
```
# 使用 ConfigMap
## 定义 pod 环境变量
### Pod 环境变量的值来自于单一 ConfigMap
## 使用 ConfigMap
### 定义 pod 环境变量
#### Pod 环境变量的值来自于单一 ConfigMap
- 在ConfigMap中定义一个环境变量作为键值对
```bash
kubectl create configmap special-config --from-literal=special.how=very
@ -102,7 +102,7 @@ categories: ["container"]
```
- 保存Pod规格的变化Pod将输出SPECIAL_LEVEL_KEY=very
### Pod 环境变量的值来自于多个 ConfigMap
#### Pod 环境变量的值来自于多个 ConfigMap
- 创建两个 ConfigMap
```yaml
---
@ -149,7 +149,7 @@ categories: ["container"]
```
- 保存变更后的PodPod将会输出SPECIAL_LEVEL_KEY=very和LOG_LEVEL=info
## 在一个ConfigMap中配置的键值对都作为一个Pod的环境变量
### 在一个ConfigMap中配置的键值对都作为一个Pod的环境变量
- **Kubernetes v1.6+可用**
- 创建包含多个键-值对的ConfigMap
```yaml
@ -180,7 +180,7 @@ categories: ["container"]
```
- Pod的输出包括: SPECIAL_LEVEL=very 和 SPECIAL_TYPE=charm
## 在Pod命令行中使用ConfigMap定义的环境变量
### 在Pod命令行中使用ConfigMap定义的环境变量
- 在Pod规范的command 中使用$(VAR_NAME) 获取ConfigMap定义的环境变量
```yaml
apiVersion:v1
@ -207,7 +207,7 @@ categories: ["container"]
```
- test-container容器的输出: very charm
# 添加ConfigMap数据至存储卷
## 添加ConfigMap数据至存储卷
- 当通过from-file创建的ConfigMap时文件将作为一个键保存在ConfigMap中而此文件的内容将作为值
```bash
apiVersion:v1
@ -220,7 +220,7 @@ categories: ["container"]
special.type:charm
```
## 将ConfigMap中的数据传播到指定目录
### 将ConfigMap中的数据传播到指定目录
- 在Pod的存储卷区域添加ConfigMap的名称
- 这将添加ConfigMap数据到volumeMounts.mountPath指定的目录下(此例为/etc/config)
- command区域将引用保存在ConfigMap中的special.level条目
@ -248,7 +248,7 @@ categories: ["container"]
- Pod运行时command (“ls /etc/config/”)将输出: special.level special.type
- **如果在/etc/config/目录下存在文件,将不会删除**
## 添加ConfigMap数据至存储卷指定的目录
### 添加ConfigMap数据至存储卷指定的目录
- 为ConfigMap条目使用path指定文件路径
- 此例中special.level将在config-volume存储卷中被挂接至/etc/config/keys
```yaml
@ -275,6 +275,6 @@ categories: ["container"]
```
- Pod运行时(“cat /etc/config/keys”) 将输出: very
# 参考
## 参考
- [Kubernetes-配置字典ConfigMap](https://blog.csdn.net/bbwangj/article/details/81776648)

View File

@ -6,8 +6,8 @@ tags: ["docker"]
categories: ["container"]
---
# 安装 docker
## CentOS7 安装 docker-ce
## 安装 docker
### CentOS7 安装 docker-ce
- 配置 yum 源
```bash
curl -Lo /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
@ -40,7 +40,7 @@ categories: ["container"]
systemctl start docker
```
## 常用的 linux with systemd 安装 docker
### 常用的 linux with systemd 安装 docker
- 下载 docker 二进制文件
```bsah
curl -LO https://download.docker.com/linux/static/stable/x86_64/docker-20.10.10.tgz
@ -193,7 +193,7 @@ categories: ["container"]
systemctl start docker
```
# 安装 docker-compose
## 安装 docker-compose
- 下载 docker-compose
```bash
curl -LO https://github.com/docker/compose/releases/download/v2.1.0/docker-compose-linux-x86_64
@ -205,7 +205,7 @@ categories: ["container"]
chmod 0755 /usr/bin/docker-compose
```
# 安装 gojq
## 安装 gojq
- 该工具支持平台较多,无依赖,与 jq 命令操作完全一致,可用于替换 jq 命令
- 下载
```bash
@ -220,7 +220,7 @@ categories: ["container"]
rm -rf gojq_*
```
# 基本命令
## 基本命令
- 镜像
```bash
docker pull [选项] [Docker Registry地址]<仓库名>:<标签> #获取镜像
@ -280,7 +280,7 @@ categories: ["container"]
docker run [选项] --link <待链接容器名>:<链接别名> [地址]<仓库名>:<标签> [命令] #创建一个链接到其他容器的新容器
```
# Dockerfile
## Dockerfile
- 井号 "#" 后是注释
- FROM 基础镜像
- MAINTAINER 维护者信息
@ -294,8 +294,8 @@ categories: ["container"]
- EXPOSE 向外部开放端口
- CMD 容器启动后运行的程序
# docker 镜像仓库
## 官方 registry
## docker 镜像仓库
### 官方 registry
- 直接 docker 启动
```bash
docker run -d \
@ -306,7 +306,7 @@ categories: ["container"]
registry
```
## VMWare Harbor
### VMWare Harbor
- 安装[参考这里](https://goharbor.io/docs/2.0.0/install-config/)
- docker registry 采用 http 协议,客户端提示 “server gave HTTP response to HTTPS client”
```bash

View File

@ -7,14 +7,14 @@ tags: ["drone", "cicd"]
categories: ["dev/ops"]
---
# 环境
## 环境
- 操作系统 Linux x86_64
- 这里的 drone 是基于 gitea 配置的
- 安装 gitea参考[官方文档](https://docs.gitea.io/zh-cn/install-from-binary/)
- 安装 docker-ce参考[我的 docker 笔记](https://www.colben.cn/post/docker/#%E5%AE%89%E8%A3%85)
# 创建 OAuth2 应用
## 创建 OAuth2 应用
- 登陆 gitea
- 点击 "个人头像" - "设置" - "应用"
@ -27,7 +27,7 @@ categories: ["dev/ops"]
- 记录 "客户端密钥"
- 点击 "保存"
# 安装 drone
## 安装 drone
- 下载 docker 镜像
```bash
@ -52,8 +52,8 @@ categories: ["dev/ops"]
- 参考链接[https://docs.drone.io/server/provider/gitea/](https://docs.drone.io/server/provider/gitea/)
# 安装 drone runner
## 安装 docker runner
## 安装 drone runner
### 安装 docker runner
- 下载 drone-runner-docker 镜像
```bash
@ -77,7 +77,7 @@ categories: ["dev/ops"]
- 参考链接[https://docs.drone.io/runner/docker/installation/linux/](https://docs.drone.io/runner/docker/installation/linux/)
## 安装 exec runner
### 安装 exec runner
- 下载
```bash
@ -119,7 +119,7 @@ categories: ["dev/ops"]
- 参考链接[https://docs.drone.io/runner/exec/installation/linux/](https://docs.drone.io/runner/exec/installation/linux/)
# 使用 drone
## 使用 drone
- 登陆 drone: http://<drone 服务器地址>:<drone 服务器端口>,此时会跳转到 gitea 登陆界面
- 登陆成功后,浏览器返回 drone 首页,这里会显示我们创建/参与的 git 项目
@ -166,7 +166,7 @@ categories: ["dev/ops"]
- 其他 pipeline 参考[https://docs.drone.io/pipeline/overview/](https://docs.drone.io/pipeline/overview/)
# 适配 sonarqube
## 适配 sonarqube
- 下载镜像
```bash

View File

@ -6,7 +6,7 @@ tags: ["elasticsearch"]
categories: ["database"]
---
# 索引
## 索引
- 查看某节点的全部索引
```bash
curl http://127.0.0.1:9200/_cat/indices?v
@ -20,7 +20,7 @@ categories: ["database"]
curl -X DELETE http://127.0.0.1:9200/index_name
```
# 记录
## 记录
- 新增记录(指定记录id)
```bash
curl -X PUT -H "Content-Type: application/json" http://127.0.0.1:9200/index_name/doc_id -d '
@ -54,7 +54,7 @@ categories: ["database"]
}'
```
# 查询
## 查询
- 查询所有记录
```bash
curl http://127.0.0.1:9200/index_name/_search
@ -127,7 +127,7 @@ categories: ["database"]
EOF
```
# Kibana
## Kibana
- lucene 正则查询
```
#查询包含10000-99999毫秒的 message 字段
@ -168,7 +168,7 @@ categories: ["database"]
}
```
# pipeline
## pipeline
- 查看已有的 pipeline
```bash
curl http://127.0.0.1:9200/_ingest/pipeline?pretty=true
@ -179,7 +179,7 @@ categories: ["database"]
- [Secure 登陆日志](https://git.colben.cn/colben/myfilebeat/raw/master/pipelines/secure-login.json)
- [Nginx access 日志](https://git.colben.cn/colben/myfilebeat/raw/master/pipelines/nginx-access.json)
# filebeat
## filebeat
- [常用配置](https://git.colben.cn/colben/myfilebeat/raw/master/filebeat.yml)
- [收割 secure 日志](https://git.colben.cn/colben/myfilebeat/raw/master/prospectors.d/secure.yml)
- [收割 mysql 慢查询日志和错误日志](https://git.colben.cn/colben/myfilebeat/raw/master/prospectors.d/mysql.yml)

View File

@ -7,7 +7,7 @@ tags: ["elasticsearch", "centos"]
categories: ["database"]
---
# 环境
## 环境
主机名 | IP | 操作系统 | ES 版本
---- | ---- | ---- | ----
@ -17,7 +17,7 @@ es229 | 192.168.1.229 | CentOS7.5 | 6.5.4
- 下载 [elasticsearch-6.5.4.tar.gz](https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.tar.gz)
# 各节点初始配置
## 各节点初始配置
- 关闭 selinux、防火墙
- 部署 java 运行环境
@ -49,7 +49,7 @@ es229 | 192.168.1.229 | CentOS7.5 | 6.5.4
elastic hard memlock unlimited
```
# 部署 ELASTICSEARCH
## 部署 ELASTICSEARCH
- 登陆 es227下载 elasticsearch解压至 /opt/ 下
- 修改 elasticsearch 目录的权限
@ -79,7 +79,7 @@ es229 | 192.168.1.229 | CentOS7.5 | 6.5.4
network.host: 192.168.1.229
```
# 启动集群(两种启动方式)
## 启动集群(两种启动方式)
- 直接启动二进制
- 在每个节点上启动 elasticsearch 服务
@ -110,7 +110,7 @@ es229 | 192.168.1.229 | CentOS7.5 | 6.5.4
systemctl start elasticsearch
```
# 查看集群状态
## 查看集群状态
- 查看集群节点状态
```
@ -120,7 +120,7 @@ es229 | 192.168.1.229 | CentOS7.5 | 6.5.4
curl http://192.168.1.228:9200/_cluster/state?pretty
```
# 安装分词插件
## 安装分词插件
- 登陆 es227下载插件 [elasticsearch-analysis-ik-6.5.4.zip](https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.4/elasticsearch-analysis-ik-6.5.4.zip) 至根目录下
- 复制该文件至 es228 和 es229 的根目录下

View File

@ -6,7 +6,7 @@ tags: ["firwalld"]
categories: ["network"]
---
# 区域(zone)
## 区域(zone)
- 查看支持的 zone
```bash
firewall-cmd --get-zones [--permanent]
@ -43,7 +43,7 @@ categories: ["network"]
firewall-cmd [--zone=<zone>] --list-all
```
# 源地址(source)
## 源地址(source)
- 列出指定zone的所有绑定的source地址
```bash
firewall-cmd [--permanent] [--zone=zone] --list-sources
@ -65,7 +65,7 @@ categories: ["network"]
firewall-cmd [--permanent] [--zone=zone] --remove-source=ip[/mask]
```
# 网卡(interface)
## 网卡(interface)
- 获取网卡所在的 zone
```bash
firewall-cmd --get-zone-of-interface=<interface>
@ -86,7 +86,7 @@ categories: ["network"]
```bash
firewall-cmd [--zone=<zone>] --query-interface=<interface>
```
# target
## target
- 默认可以取四个值: default、ACCEPT、%%REJECT%%、DROP
- 查看 taget
```bash
@ -98,7 +98,7 @@ categories: ["network"]
```
- **必须使用参数 --permanent**,而且使用 firewall-cmd 命令不能直接生效,需 reload
# 服务(service)
## 服务(service)
- 查看支持的 service
```bash
firewall-cmd --get-services [--permanent]
@ -121,7 +121,7 @@ categories: ["network"]
firewall-cmd [--zone=<zone>] --query-service=<service>
```
# 端口和协议组合
## 端口和协议组合
- 查看配置的全部端口规则
```bash
firewall-cmd [--permanent] [--zone=zone] --list-ports
@ -140,7 +140,7 @@ categories: ["network"]
firewall-cmd [--zone=<zone>] --query-port=<port>[-<port>]/<protocol> [--permanent]
```
# ICMP
## ICMP
- 查看支持的 icmp 类型
```bash
firewall-cmd --get-icmptypes [--permanent]
@ -163,7 +163,7 @@ categories: ["network"]
firewall-cmd [--zone=<zone>] --query-icmp-block=<icmptype> [--permanent]
```
# IPV4 源地址转换
## IPV4 源地址转换
- 启动 zone 中 ipv4 源地址转换
```bash
firewall-cmd [--zone=<zone>] --add-masquerade \
@ -178,7 +178,7 @@ categories: ["network"]
firewall-cmd [--zone=<zone>] --query-masquerade [--permanent]
```
# 端口转发
## 端口转发
- 查看全部端口转发规则
```bash
firewall-cmd [--permanent] [--zone=zone] --list-forward-ports
@ -202,7 +202,7 @@ categories: ["network"]
[--permanent]
```
# Rich Rules
## Rich Rules
- 通用结构
```bash
firewall-cmd [--zone=<zone>] [ --permanent | --timeout=seconds ] \
@ -227,7 +227,7 @@ categories: ["network"]
man firewalld.richlanguage 5
```
# 应急模式(panic)
## 应急模式(panic)
- 启动 panic即断网
```bash
firewall-cmd --panic-on
@ -241,7 +241,7 @@ categories: ["network"]
firewall-cmd --query-panic
```
# 重新载入(reload)
## 重新载入(reload)
- 重新载入防火墙,不中断用户连接
```bash
firewall-cmd --reload
@ -251,6 +251,6 @@ categories: ["network"]
firewall-cmd --complete-reload
```
# 备注
## 备注
- 参数 --timeout 是让规则生效一段时间,过期自动删除,不能与 --permanent 一起使用

View File

@ -6,22 +6,22 @@ tags: ["ftp", "vsftp"]
categories: ["storage"]
---
# 环境
## 环境
- CentOS7
- vsftpd
- 关闭 selinux
# 安装 vsftpd 服务
## 安装 vsftpd 服务
```bash
yum install vsftpd
```
# 常用客户端
## 常用客户端
- ftp
- lftp
- curl
# 主动模式
## 主动模式
- 建立控制命令连接
- 客户端连接服务端 21 号端口
@ -35,7 +35,7 @@ categories: ["storage"]
pasv_enable = no
```
# 被动模式
## 被动模式
- 建立控制命令连接
- 客户端连接服务端 21 号端口
@ -53,7 +53,7 @@ categories: ["storage"]
pasv_max_port=30999
```
# 匿名用户配置
## 匿名用户配置
```ini
# 控制是否允许匿名用户登入
# 匿名用户使用的登陆名为 ftp 或 anonymous口令为空
@ -102,8 +102,8 @@ categories: ["storage"]
anon_umask=077
```
# 配置
## 常用配置
## 配置
### 常用配置
```ini
#允许匿名用户登陆
anonymous_enable=YES
@ -118,7 +118,7 @@ categories: ["storage"]
chroot_list_file=/etc/vsftpd/chroot_list
```
## 允许 vsftpd 匿名用户上传和下载
### 允许 vsftpd 匿名用户上传和下载
- 创建匿名用户登陆目录
```bash
mkdir -p /var/ftp/pub
@ -141,7 +141,7 @@ categories: ["storage"]
anon_umask=022
```
## 本地用户登陆
### 本地用户登陆
- 修改 vsftpd.conf
```
# 不允许匿名用户登入
@ -163,7 +163,7 @@ categories: ["storage"]
chroot_local_user=YES
```
## 创建 ftp 专用账户
### 创建 ftp 专用账户
- 创建用户 ftpuser1
```bash
useradd -s /sbin/nologin ftpuser1
@ -181,6 +181,6 @@ categories: ["storage"]
chroot_local_user=YES
```
# 参考
## 参考
- [vsftpd 详细配置](http://vsftpd.beasts.org/vsftpd_conf.html)

View File

@ -6,7 +6,7 @@ tags: ["gnome", "desktop", "桌面"]
categories: ["os"]
---
# 常用设置
## 常用设置
```bash
# 关闭左上角热响应
gsettings set org.gnome.desktop.interface enable-hot-corners false
@ -44,7 +44,7 @@ categories: ["os"]
gsettings set org.gnome.desktop.wm.preferences button-layout 'appmenu:minimize,maximize,close'
```
# 在 "活动" 中创建 "文件夹"
## 在 "活动" 中创建 "文件夹"
```bash
# 创建文件夹
gsettings set org.gnome.desktop.app-folders folder-children "['Office','VirtualBox']"
@ -58,7 +58,7 @@ categories: ["os"]
gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/VirtualBox/ categories "['Emulator']"
```
# 快捷键
## 快捷键
```bash
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-1 "[]"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-last "[]"
@ -89,14 +89,14 @@ categories: ["os"]
gsettings set org.gnome.desktop.wm.keybindings maximize "[]"
```
# 在 CentOS6 下安装 gnome 桌面
## 在 CentOS6 下安装 gnome 桌面
```bash
yum groupinstall 'X Window System'
yum groupinstall Desktop
sed -i '/^id/id:5:initdefault:' /etc/inittab
```
# 在 CentOS7 下安装 gnome3 桌面
## 在 CentOS7 下安装 gnome3 桌面
```bash
yum groupinstall 'X Window System'
yum groupinstall 'Gnome Desktop'
@ -105,7 +105,7 @@ categories: ["os"]
# 创建一个可登陆的普通用户
```
# 在 gdm 中隐藏用户名
## 在 gdm 中隐藏用户名
- 修改文件/etc/gdm/gdm.schemas找到这一段
```xml
<schema>

View File

@ -6,7 +6,7 @@ tags: ["grub"]
categories: ["OS"]
---
# 启动 archlinux 镜像 64位系统
## 启动 archlinux 镜像 64位系统
```
menuentry "Archlinux-ISO-x86-64" --class iso {
set isofile=""
@ -17,7 +17,7 @@ menuentry "Archlinux-ISO-x86-64" --class iso {
}
```
# 启动 archlinux 镜像 32位系统
## 启动 archlinux 镜像 32位系统
```bash
menuentry "Archlinux-ISO-i686" --class iso {
set isofile=""
@ -28,7 +28,7 @@ menuentry "Archlinux-ISO-i686" --class iso {
}
```
# 启动 ubuntu 镜像
## 启动 ubuntu 镜像
```bash
menuentry "ubuntu-ISO" {
set isofile=""
@ -38,7 +38,7 @@ menuentry "ubuntu-ISO" {
}
```
# 启动安装在第一块硬盘第一个mbr分区的 win7 系统
## 启动安装在第一块硬盘第一个mbr分区的 win7 系统
```bash
menuentry "Microsoft Windows Vista/7/8/8.1/10 BIOS-MBR" {
insmod part_msdos
@ -51,7 +51,7 @@ menuentry "Microsoft Windows Vista/7/8/8.1/10 BIOS-MBR" {
}
```
# 启动安装在第一块硬盘的第一个gpt分区的 Win10 EFI
## 启动安装在第一块硬盘的第一个gpt分区的 Win10 EFI
```bash
menuentry "Microsoft Windows 10" {
insmod part_gpt
@ -64,7 +64,7 @@ menuentry "Microsoft Windows 10" {
}
```
# 关机
## 关机
```bash
menuentry "System shutdown" {
echo "System shutting down..."
@ -72,7 +72,7 @@ menuentry "System shutdown" {
}
```
# 重启
## 重启
```bash
menuentry "System restart" {
echo "System rebooting..."
@ -80,13 +80,13 @@ menuentry "System restart" {
}
```
# UEFI 配置
## UEFI 配置
```bash
menuentry "Firmware setup" {
fwsetup
}
```
# 详细使用参考
## 详细使用参考
- [GRUB-ArchWiki](https://wiki.archlinux.org/index.php/GRUB)

View File

@ -6,7 +6,7 @@ tags: ["haproxy", "高可用", "负载均衡"]
categories: ["ha/lb"]
---
# CentOS7 下安装
## CentOS7 下安装
- CentOS7 自带的 haproxy 版本太低,这里通过 cheese 源安装最新版本
- 安装 cheese repo详细参考[这里](http://www.nosuchhost.net/~cheese/fedora/packages/epel-7/x86_64/cheese-release.html)
```bash
@ -34,7 +34,7 @@ categories: ["ha/lb"]
setenforce 0
```
# 全局配置
## 全局配置
```
global
log 127.0.0.1 local2 info
@ -48,7 +48,7 @@ global
stats socket /var/lib/haproxy/stats
```
# 默认配置
## 默认配置
```
defaults
log global
@ -58,7 +58,7 @@ defaults
timeout check 8s
```
# tcp 连接多个 ceph-radosgw
## tcp 连接多个 ceph-radosgw
```
frontend ceph-radosgw
bind *:7480
@ -77,7 +77,7 @@ backend ceph-radosgw
server ceph243 10.9.10.236:7480 check
```
# tcp 连接 mysql galera cluster
## tcp 连接 mysql galera cluster
```
frontend mysql
bind *:3306
@ -94,7 +94,7 @@ backend mysql
server mysql233 10.9.10.233:3306 check inter 4s
```
# tcp 连接 redis 主库
## tcp 连接 redis 主库
```
frontend redis
bind *:6379
@ -118,7 +118,7 @@ backend redis
server redis89 10.1.14.89:6379 check inter 4s
```
# 状态页面
## 状态页面
```
listen admin_stats
bind 0.0.0.0:10080
@ -134,12 +134,12 @@ listen admin_stats
stats hide-version
```
# 通过 rsyslog 生成日志
## 通过 rsyslog 生成日志
```bash
sed -i -e '/ModLoad imudp/s/^#//' \
-e '/UDPServerRun 514/s/^#//' /etc/rsyslog.conf
cat > /etc/rsyslog.d/haproxy.conf <<EOF
# haproxy log
## haproxy log
template(name="HaproxyTime" type="list"){
property(name="timereported" dateformat="year")
constant(value="-")
@ -169,7 +169,7 @@ systemctl restart rsyslog
systemctl restart haproxy
```
# 参考
## 参考
- [详解地址](http://blog.haohtml.com/archives/7959)
- [官网](https://www.haproxy.com/documentation/hapee/1-5r2/traffic-management/health-checking/)

View File

@ -7,77 +7,77 @@ tags: ["华为", "hcnp"]
categories: ["network"]
---
# 基本命令
## 查看操作系统
## 基本命令
### 查看操作系统
- 用户模式下执行
```
dis version
```
## 修改语言
### 修改语言
- 用户模式下执行
```
language-mode Chinese
```
## 保存配置
### 保存配置
- 用户模式下执行
```
save
```
## 修改主机名
### 修改主机名
- 系统模式下执行
```
sysname XXXX
```
## 关闭提示信息
### 关闭提示信息
- 系统模式下执行
```
undo info-center enable
```
## 显示当前模式配置
### 显示当前模式配置
- 任何模式下执行
```
dis this
```
# 接口
## 显示接口摘要信息
## 接口
### 显示接口摘要信息
- 任何模式下执行
```
dis ip int brief
```
## 显示接口类型
### 显示接口类型
- 任何模式下执行
```
dis port vlan
```
## 配置接口 IP
### 配置接口 IP
- 系统模式下执行
```
int e0/0/0
ip addr 172.16.1.1 24
```
## 配置接口描述信息
### 配置接口描述信息
- 系统模式下执行
```
int e0/0/0
description ...
```
## 配置接口组
### 配置接口组
- 系统模式下执行
```
port-group g e0/0/2 to e0/0/8
```
## 接口安全
### 接口安全
- 默认只允许一个 mac 地址通信
- 系统模式下执行
```
@ -89,7 +89,7 @@ categories: ["network"]
port-security protect-action restrict # 触发安全操作时,交换机接口阻塞并警告
```
## 接口镜像
### 接口镜像
- 系统模式下执行
```
observe-port 1 int gi0/0/24 # 把 24 口设置为观察口
@ -97,7 +97,7 @@ categories: ["network"]
port-mirroring to observe-port 1 both # 把 1 口流量复制到 24 口
```
# Vlan
## Vlan
- 虚拟局域网(Virtual Local Area Network)
- 交换机接口默认都在 vlan 1 中,一个接口只能从属于一个 vlan
- 系统模式下执行
@ -120,7 +120,7 @@ categories: ["network"]
dis port vlan
```
## 基于 mac 配置 vlan
### 基于 mac 配置 vlan
- 系统模式下执行
```
vlan batch 10 20
@ -139,7 +139,7 @@ categories: ["network"]
dis mac-address
```
## 基于 ip 配置 vlan
### 基于 ip 配置 vlan
- 系统模式下执行
```
vlan 10
@ -157,7 +157,7 @@ categories: ["network"]
dis ip-subnet-vlan
```
## super vlan
### super vlan
- 各子 vlan 共用超级 vlan 的地址段,且各子 vlan 间网络不通
- 系统模式下执行
```
@ -169,7 +169,7 @@ categories: ["network"]
ip addr 192.168.1.1 24 # 聚合 vlan 的接口地址作为各子 vlan 的网关
```
## 接口隔离
### 接口隔离
- 同一台交换机相同隔离组的端口不能互访trunk 接口也可以加入隔离组
- 系统模式下执行
```
@ -183,7 +183,7 @@ categories: ["network"]
port-isolate enable group 1 # 把接口 8 加入隔离组 1
```
## Vlan 映射
### Vlan 映射
- 系统模式下执行
```
# 出口交换机
@ -199,7 +199,7 @@ categories: ["network"]
port vlan-mapping vlan 10 to 30 map-vlan 100 # 把 vlan 10 到 30 转换成 100
```
## Hybrid 混合接口
### Hybrid 混合接口
- 华为交换机特有且默认,同时具备 access 和 trunk 功能
- 作为 access 口使用,系统模式下执行
```
@ -214,7 +214,7 @@ categories: ["network"]
port hybrid tagged vlan 10 20
```
## Trunk
### Trunk
- 允许不同 vlan 的数据通过
- 系统模式下执行
```
@ -237,7 +237,7 @@ categories: ["network"]
undo shutdown
```
## 链路聚合
### 链路聚合
- 多个物理接口捆绑为一个逻辑接口
- 系统模式下执行
```
@ -258,7 +258,7 @@ categories: ["network"]
dis stp brief
```
## SVI
### SVI
- 交换机虚拟接口(Switch Virtual Interface)
- 系统模式下执行
```
@ -268,7 +268,7 @@ categories: ["network"]
ip addr 192.168.2.1 24
```
# STP
## STP
- 生成树协议(Spanning Tree Protocol),防止交换环路
- 修改交换机优先级,系统模式下执行
```
@ -310,19 +310,19 @@ categories: ["network"]
error-down auto-recovery cause bpdu-protection interval 30
```
## STP 算法
### STP 算法
- 选举根桥(根交换机),先比较优先级,再比较 MAC 地址,越小越优先
- 非根桥选出根端口(距离根交换机最近的端口)
- 其余链路上,优先级或 MAC 地址较大的交换机的端口被阻塞
## RSTP
### RSTP
- 快速 stpstp 升级版
- 系统模式下执行
```
stp mode rstp
```
## MSTP
### MSTP
- 多生成树协议
- 划分实例,不同实例里运行独立的 stp默认实例都是 0
- 系统模式下执行
@ -344,7 +344,7 @@ categories: ["network"]
dis stp instance 2 brief
```
# ACL
## ACL
- 访问控制列表(Access Control List)ensp 中AR2220 支持 acl
- 基本 acl(2000-2999)只能匹配源 ip 地址,系统模式下执行
```
@ -364,10 +364,10 @@ categories: ["network"]
- 二层 acl(4000-4999)
# 路由器
## 路由器
- 路由器的每个接口都是单独的网段
## 优先级
### 优先级
路由 | 优先级(0-255)
---- | ----
直连 | 0
@ -375,13 +375,13 @@ categories: ["network"]
OSPF | 10
RIP | 100
## 显示路由表
### 显示路由表
- 任何模式下执行
```
dis ip routing-table
```
## 静态路由
### 静态路由
- 系统模式下执行
```
ip route-static 172.16.1.0 24 172.16.2.1 preference 60
@ -390,7 +390,7 @@ RIP | 100
# 优先级: 默认 60, prefenence 60
```
## 缺省路由
### 缺省路由
- 系统模式下执行
```
ip route-static 0.0.0.0 0 172.16.3.1
@ -398,7 +398,7 @@ RIP | 100
- 备份静态路由与现役静态路由优先级一样时,负载均衡传输
## 单臂路由
### 单臂路由
- 交换机 e0/0/3 与路由器 e0/0/0 连接
- 交换机系统模式下执行
```
@ -426,7 +426,7 @@ RIP | 100
arp broadcast enable
```
# RIP
## RIP
- 只用跳数作为度量值16 跳不可达,老旧,目前一般不用
- 系统模式下执行
```
@ -443,7 +443,7 @@ RIP | 100
silent-interface e0/0/0
```
# OSPF
## OSPF
- 开放式最短路径优先 (Open Shortest Path First)
- area 0 一般作为骨干区域area 1、2、3 一般作为常规区域常规区域__必须__与骨干区域相连
- 系统模式下执行
@ -485,7 +485,7 @@ RIP | 100
dis ospf lsdb
```
## ospf 邻居
### ospf 邻居
- abr(area border router),区域边界路由器
- asbr(auto-system border router),自治系统边界路由器
- router id: 运行 ospf 路由器的身份 id不可重复
@ -526,7 +526,7 @@ RIP | 100
ospf dr-priority 5
```
## ospf 虚链路
### ospf 虚链路
- 新增常规区域没有直连骨干区域,此时该新增区域默认与其他非直连区域网络不通
- 可以配置虚链路打通新增区域的网络,可以看成区域链路的延伸
- 系统模式下执行
@ -547,21 +547,21 @@ RIP | 100
dis ospf vlink
```
## ospf 认证
### ospf 认证
- 系统模式下执行
```
int gi0/0/1 # 指定 ospf 链路接口
ospf authentication-mode simple cipher 123456
```
## 抑制接口
### 抑制接口
- 系统模式下执行
```
ospf 1
silent-interface e0/0/0
```
## 引入其他路由
### 引入其他路由
- 引入路由的协议显示为o_ASE(ospf-autosystem external),默认的路由优先级是 150
- ospf 和 rip 双向引入,系统模式下执行
```
@ -580,7 +580,7 @@ RIP | 100
default-route-advertise always
```
## 路由汇总
### 路由汇总
- 精简路由表大小
- 在边界路由器(abr)上做路由汇总,系统模式下执行
```
@ -595,7 +595,7 @@ RIP | 100
asbr-summary 192.168.0.0 255.255.0.0
```
## ospf las
### ospf las
- 链路状态公告(link state advertise),包含在 LSU 报文中
- 一类 LSA: router lsa
- 每个路由器都可以发送
@ -644,7 +644,7 @@ RIP | 100
- 只能通告自己所在的 nssa 区域abr 收到时会转成 5 类继续传递
- 把与 nssa 直连的其他自治系统的路由引入 ospf
## ospf 特殊区域
### ospf 特殊区域
- stub末节区域拒绝五类 lsa生成执行 abr 的缺省路由,减少路由表大小,系统模式下执行
```
# 该区域的路由器 1
@ -697,7 +697,7 @@ RIP | 100
nssa no-summary
```
## 路由过滤
### 路由过滤
- 过滤部分路由,在系统模式下执行
```
ospf 1
@ -720,17 +720,17 @@ RIP | 100
rule permit source 192.168.2.0 0.0.0.255 # 允许 ospf 引入 192.168.2.0/24 的路由
```
## ospf 排错
### ospf 排错
- ospf 无法建立邻居的几个原因:
- router id 重复
- 相邻路由器中间直连的网段必须宣告到相同的区域(area)
- 认证的类型、密码不一样
- ospf 邻居间的特殊区域标识必须一致
# NAT
## NAT
- 一般先在内网接口配置缺省路由
## 静态 NAT
### 静态 NAT
- 一个私网地址映射一个公网地址
- 系统模式下执行
```
@ -743,7 +743,7 @@ RIP | 100
dis nat session protocol icmp # 最后一个参数指定协议
```
## easy IP
### easy IP
- 多个私网地址转换成一个公网地址
- 系统模式下执行
```
@ -753,7 +753,7 @@ RIP | 100
nat outbound 2001 # 这里的 2001 是 acl 编号
```
## NAT Server
### NAT Server
- 把外网地址的某个端口映射到内网服务器的某个端口
- 系统模式下执行
```
@ -761,7 +761,7 @@ RIP | 100
nat server protocol tcp global 12.1.1.2 8080 inside 192.168.31.2 80
```
# VRRP
## VRRP
- 虚拟路由冗余协议
- 主从路由器必须使用相同的 vrid且建议指定优先级和密码
- 主路由器系统模式下执行
@ -799,7 +799,7 @@ RIP | 100
stp instance 1 root secondary
```
# BFD
## BFD
- 双向转发检测,毫秒级故障检测,实现链路故障快速检查
- 探测包默认每秒发送一次
- 系统模式下执行
@ -844,7 +844,7 @@ RIP | 100
dis bfd session all
```
# DHCP/BOOTP
## DHCP/BOOTP
- 系统模式下执行
```
dhcp enable
@ -900,7 +900,7 @@ RIP | 100
dhcp snooping trusted
```
# Telnet
## Telnet
- 系统模式下执行
```
telnet server enable
@ -916,7 +916,7 @@ RIP | 100
telnet 192.168.3.1
```
# FTP
## FTP
- 系统模式下执行
```
ftp server enable
@ -925,7 +925,7 @@ RIP | 100
local-user service-type ftp
```
# SSH
## SSH
- 系统模式下执行
```
aaa
@ -937,8 +937,8 @@ RIP | 100
stelnet server enable
```
# 广域网传输
## PPP
## 广域网传输
### PPP
- 远距离点对点串口传输(Point to Point Protocol)
- 系统模式下执行
```
@ -947,7 +947,7 @@ RIP | 100
ip addr 12.1.1.2 255.255.255.0
```
### PAP 认证
#### PAP 认证
- 明文传输
- 服务端系统模式下执行
```
@ -966,7 +966,7 @@ RIP | 100
undo shutdown
```
### CHAP 认证
#### CHAP 认证
- 密文传输
- 服务端系统模式下执行
```
@ -986,7 +986,7 @@ RIP | 100
undo shutdown
```
## HDLC
### HDLC
- 系统模式下执行
```
int s4/0/1
@ -994,7 +994,7 @@ RIP | 100
ip addr ...
```
## FR
### FR
- 系统模式下执行
```
int s4/0/1
@ -1002,7 +1002,7 @@ RIP | 100
ip addr ...
```
# IPV6
## IPV6
- 系统模式下执行
```
ipv6
@ -1016,7 +1016,7 @@ RIP | 100
- 以 FE80:: 开头的地址都是本地链路地址,只在本地链路有效
- EUI-64 地址: 原 mac 地址中间嵌入 FFFE第七个 bit 取反
# 园区网络
## 园区网络
- 500-1000 设备
- 路由器/防火墙: 配置缺省路由和 nat 连接外网
- 核心层交换机: 配置 vlansvi 和 dhcp作为网关

View File

@ -6,12 +6,12 @@ tags: ["httpd"]
categories: ["web"]
---
# CentOS7 安装
## CentOS7 安装
```bash
yum install httpd
```
# 支持 SVN
## 支持 SVN
- 安装 svn 模块
```bash
yum install mod_dav_svn subversion
@ -49,7 +49,7 @@ yum install httpd
systemctl restart httpd
```
# Basic HTTP 认证
## Basic HTTP 认证
- 生成密码文件(用户名是admin密码是123456)
```bash
htpasswd -c -m /etc/httpd/httpd.auth admin # 按提示输入密码

View File

@ -8,12 +8,12 @@ tags: ["ip"]
categories: ["network"]
---
# 私有 IP
## 私有 IP
- A类: 10.0.0.110.255.255.254
- B类: 172.16.0.1172.31.255.254
- C类: 192.168.0.1192.168.255.254
# 地址分类
## 地址分类
- A类: 一个A类IP地址仅使用第一个8位位组表示网络地址。剩下的3个8位位组表示主机地址。A类地址的第一个位总为0这一点在数学上限制了A类地址的范围小于 127,127是64+32+16+8+4+2+1的和。最左边位表示128在这里空缺。因此仅有127个可能的A类网络。A类地址后面的24位(3个点-十进制数)表示可能的主机地址A类网络地址的范围从1.0.0.0到126.0.0.0。注意只有第一个8位位组表示网络地址剩余的3个8位位组用于表示第一个8位位组所表示网络中惟一的主机地址当用于描述网络时这些位置为0。注意技术上讲127.0.0.0 也是一个A类地址但是它已被保留作闭环look back 测试之用而不能分配给一个网络。每一个A类地址能支持16777214个不同的主机地址这个数是由2的24次方再减去2得到的。减2是必要的因为 IP把全0保留为表示网络而全1表示网络内的广播地址。其中10.0.0.0 至10.255.255.255保留,作为局域网地址使用。
- B类: 设计B类地址的目的是支持中到大型的网络。B类网络地址范围从128.1.0.0到191.254.0.0。B 类地址蕴含的数学逻辑是相当简单的。一个B类IP地址使用两个8位位组表示网络号另外两个8位位组表示主机号。B类地址的第1个8位位组的前两位总置为 10剩下的6位既可以是0也可以是1这样就限制其范围小于等于191由128+32+16+8+4+2+1得到。最后的16位( 2个8位位组)标识可能的主机地址。每一个B类地址能支持64534 个惟一的主机地址这个数由2的16次方减2得到。B类网络仅有16382个。其中172.16.0.0至172.31.255.255保留作为局域网地址使用。
- C类: C类地址用于支持大量的小型网络。这类地址可以认为与A类地址正好相反。A类地址使用第一个8位位组表示网络号剩下的3个表示主机号而C类地址使用三个8位位组表示网络地址仅用一个8位位组表示主机号。C类地址的前3位数为110前两位和为192(128+64)这形成了C类地址空间的下界。第三位等于十进制数32,这一位为0限制了地址空间的上界。不能使用第三位限制了此8位位组的最大值为255-32等于223。因此C类网络地址范围从 192.0.1.0 至223.255.254.0。最后一个8位位组用于主机寻址。每一个C类地址理论上可支持最大256个主机地址(0255)但是仅有254个可用因为0和255不是有效的主机地址。可以有2097150个不同的C类网络地址。其中192.168.0.0至192.168.255.255保留作为局域网地址使用。
@ -21,7 +21,7 @@ categories: ["network"]
- E类: E类地址保留作研究之用。因此Internet上没有可用的E类地址。E类地址的前4位恒为1因此有效的地址范围从240.0.0.0 至255.255.255.255。
- 总的来说ip地址分类由第一个八位组的值来确定。任何一个0到127 间的网络地址均是一个A类地址。任何一个128到191间的网络地址是一个B类地址。任何一个192到223 间的网络地址是一个C类地址。任何一个第一个八位组在224到239 间的网络地址是一个组播地址即D类地址。E类保留。
# 特殊 IP
## 特殊 IP
- 127.0.0.0: 127是一个保留地址该地址是指电脑本身主要作用是预留下作为测试使用用于网络软件测试以及本地机进程间通 信。在Windows系统下该地址还有一个别名叫“localhost”无论是哪个程序一旦使用该地址发送数据协议软件会立即返回不进行任何网 络传输,除非出错,包含该网络号的分组是不能够出现在任何网络上的。
- 10.x.x.x、172.16.x.x172.31.x.x、192.168.x.x: 私有地址这些地址被大量用于企业内部网络中。一些宽带路由器也往往使用192.168.1.1作为缺省地址。私有网络由于不与外部互连,因而可能使 用随意的IP地址。保留这样的地址供其使用是为了避免以后接入公网时引起地址混乱。使用私有地址的私有网络在接入Internet时要使用地址翻译 (nat)将私有地址翻译成公用合法地址。在Internet上这类地址是不能出现的。
- 0.0.0.0: 严格意义上来 说0.0.0.0已经不是真正意义上的IP地址了。它表示的是这样一个集合所有不清楚的主机和目的网络。这里的不清楚是指在本机的路由表里没有特定条 目指明如何到达。对本机来说它就是一个收容所所有不认识的三无人员一律送进去。如果你在网络设置中设置了缺省网关那么Windows系统就会自动 产生一个目地址为0.0.0.0的缺省路由。若IP地址全为0也就是0.0.0.0则这个IP地址在IP数据报中只能用作源IP地址这发生在当设备启动时但又不知道自己的IP地址情况下。在使 用DHCP分配IP地址的网络环境中这样的地址是很常见的。用户主机为了获得一个可用的IP地址就给DHCP服务器发送IP分组并用这样的地址作为 源地址目的地址为255.255.255.255因为主机这时还不知道DHCP服务器的IP地址

View File

@ -7,8 +7,8 @@ tags: ["ipv6", "centos"]
categories: ["network"]
---
# CentOS7 禁用 ipv6
## 方法1
## CentOS7 禁用 ipv6
### 方法1
- 编辑 /etc/sysctl.conf增加如下内容
```
net.ipv6.conf.all.disable_ipv6 =1
@ -23,7 +23,7 @@ categories: ["network"]
sysctl -p
```
## 方法2
### 方法2
- 执行下面命令
```bash
echo 1>/proc/sys/net/ipv6/conf/all/disable_ipv6

View File

@ -7,7 +7,7 @@ tags: ["rancher", "k3s"]
categories: ["container"]
---
# 环境
## 环境
角色 | 主机名 | 操作系统 | 软件
---- | ---- | ---- | ----
@ -20,7 +20,7 @@ k3s agent | k3s-agent1 | CentOS7.8 | docker-ce 19.03, k3s v1.18.9
- **全部服务器关闭 firewalld、selinux 和 swap设置时间同步**
- **全部 k3s 服务器(除了数据库)必须设置唯一主机名**
# 安装数据库
## 安装数据库
- 在数据库服务器上执行如下操作
- 启动 docker 容器
```bash
@ -45,7 +45,7 @@ k3s agent | k3s-agent1 | CentOS7.8 | docker-ce 19.03, k3s v1.18.9
- 生产环境建议配置 mysql 主从高可用,参考[MariaDB 主从复制](/post/mariadb-replication/)
# 安装 k3s server
## 安装 k3s server
- 在每台 k3s server 服务器上执行如下操作
- 下载并安装 k3s
```bash
@ -100,7 +100,7 @@ k3s agent | k3s-agent1 | CentOS7.8 | docker-ce 19.03, k3s v1.18.9
- 多个 k3s-server 服务可通过 keepalived 配置高可用,参考[keepalived 笔记](/post/keepalived/)
# 安装 k3s agent
## 安装 k3s agent
- 在每台 k3s agent 服务器上执行如下操作
- 下载并安装 k3s
```bash
@ -147,13 +147,13 @@ k3s agent | k3s-agent1 | CentOS7.8 | docker-ce 19.03, k3s v1.18.9
systemctl start k3s-agent
```
# 查看节点信息
## 查看节点信息
- 在任一 k3s server 服务器上执行如下操作
- 查看节点信息
```bash
kubectl get nodes
```
# 注意事项
## 注意事项
- k3s 内部 ssl 证书有效期一年,可在到期前重启 k3s 集群轮换证书

View File

@ -7,12 +7,12 @@ tags: ["kubernetes", "k8s", "coredns"]
categories: ["container"]
---
# 环境
## 环境
- [二进制部署的 kubernetes v1.17.2 集群](https://colben.cn/post/k8s-install/)
- coreDNS 1.6.6
# 生成 service account 文件
## 生成 service account 文件
- 创建 0.coredns-sa.yml
```bash
cat > 0.coredns-sa.yml <<EOF
@ -24,7 +24,7 @@ categories: ["container"]
EOF
```
# 生成 rbac 文件
## 生成 rbac 文件
- 创建 1.coredns-rbac.yml
```bash
curl > 1.coredns-rbac.yml <<EOF
@ -71,7 +71,7 @@ categories: ["container"]
EOF
```
# 生成 configmap 文件
## 生成 configmap 文件
- 创建 2.coredns-configmap.yml
```bash
cat > 2.coredns-configmap.yml <<EOF
@ -103,7 +103,7 @@ categories: ["container"]
- 这里的 10.10.9.0/24 应与 kube-apiserver 配置文件中的 service-cluster-ip-range 一致
- 这里的 cluster.local 应与 kubelet 配置文件中的 clusterDomain 一致
# 生成 deployment 文件
## 生成 deployment 文件
- 创建 3.coredns-deployment.yml
```bash
cat > 3.coredns-deployment.yml <<EOF
@ -207,7 +207,7 @@ categories: ["container"]
- coredns/coredns:1.2.2 该镜像可以提前导入本地局域网中的私有 docker 仓库中
- 查看 k8s 对应的 coredns 版本,参考 [coredns](https://github.com/coredns/deployment/blob/master/kubernetes/CoreDNS-k8s_version.md)
# 生成 service 文件
## 生成 service 文件
- 创建 4.coredns-service.yml
```bash
cat > 4.coredns-service.yml <<EOF
@ -241,7 +241,7 @@ categories: ["container"]
```
- 这里的 clusterIP 需与 kubelet 配置文件中的 clusterDNS 一致
# 部署到 kubernetes 中
## 部署到 kubernetes 中
- 使用 kubectl 直接应用
```bash
@ -252,7 +252,7 @@ categories: ["container"]
kubectl apply -f 4.coredns-service.yml
```
# 查看 coredns 状态
## 查看 coredns 状态
- 查看 service 状态
```bash
@ -271,6 +271,6 @@ categories: ["container"]
kubectl logs <pod_name> -n kube-system
```
# 参考
## 参考
- [coredns 部署](https://github.com/coredns/deployment/tree/master/kubernetes)

View File

@ -7,7 +7,7 @@ tags: ["kubernetes", "k8s", "二进制"]
categories: ["container"]
---
# 环境
## 环境
角色 | 主机名 | 内网 IP | 集群 IP | 操作系统 | 服务 | 执行目录
---- | ---- | ---- | ---- | ---- | ---- | ----
@ -33,7 +33,7 @@ k8s-node | node126 | 10.0.4.126 | - | CentOS | docker flannel kubelet kube-proxy
- 172.17.0.0/24 该网段是杜撰的,是 docker 网桥自带网段,也是 flannel 提供的网段,实现不同节点间的容器互通
- 172.16.0.0/24 该网段是杜撰的,是 k8s pod 的 IP 地址区间,用于区别流量来源
# 部署 etcd 集群
## 部署 etcd 集群
- 在部署机(master120)上操作下面步骤
- 创建 etcd 部署目录
@ -238,12 +238,12 @@ k8s-node | node126 | 10.0.4.126 | - | CentOS | docker flannel kubelet kube-proxy
cluster-health
```
# 安装 Docker
## 安装 Docker
- 在每个 k8s node 服务器(node124、node125、node126)上操作下面步骤
- 安装 docker-ce[参考这里](https://my.oschina.net/colben/blog/1505141#h1_2)
# 部署 Flannel 网络
## 部署 Flannel 网络
- 在部署机(master120)上操作下面步骤
- 创建 flannel 部署目录
@ -345,7 +345,7 @@ k8s-node | node126 | 10.0.4.126 | - | CentOS | docker flannel kubelet kube-proxy
- 启动完成后,不同节点的 docker0 网卡 ip 互通
# 部署 k8s master 节点
## 部署 k8s master 节点
- 部署前确保前面的 etcd 集群、flannel 网络和 docker 都是正常的
- 在部署机(master120即当前节点)上操作下面步骤
@ -626,7 +626,7 @@ k8s-node | node126 | 10.0.4.126 | - | CentOS | docker flannel kubelet kube-proxy
kubectl get cs
```
# 部署 k8s node 节点
## 部署 k8s node 节点
- 在部署机(master120)上操作下面步骤
- 创建 node 部署目录
@ -822,11 +822,11 @@ k8s-node | node126 | 10.0.4.126 | - | CentOS | docker flannel kubelet kube-proxy
kubectl get cs
```
# 部署其他组件
## 部署其他组件
- [coreDNS](https://colben.cn/post/k8s-coredns/)
# 运行一个测试示例
## 运行一个测试示例
- 暂无

View File

@ -7,7 +7,7 @@ tags: ["kafka", "centos"]
categories: ["MQ"]
---
# 环境
## 环境
主机名 | IP | 操作系统 | kafka 版本
---- | ---- | ---- | ----
@ -18,7 +18,7 @@ kafka226 | 192.168.1.226 | CentOS7.5 | 2.12
- 下载 [kafka_2.12-2.1.0.tgz](http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.1.0/kafka_2.12-2.1.0.tgz)
- zookeeper 连接: 192.168.1.221:2181,192.168.1.222:2181,192.168.1.223:2181
# 各节点初始配置
## 各节点初始配置
- 关闭 selinux、防火墙
- 部署 java 运行环境
@ -31,7 +31,7 @@ kafka226 | 192.168.1.226 | CentOS7.5 | 2.12
mkdir -p /var/log/kafka
```
# 部署 kafka
## 部署 kafka
- 登陆 kafka224下载 kafka解压至 /opt/ 下
- 修改日志目录
@ -73,7 +73,7 @@ kafka226 | 192.168.1.226 | CentOS7.5 | 2.12
listeners=PLAINTEXT://192.168.1.226:9092
```
# 启动集群(两种启动方式)
## 启动集群(两种启动方式)
- 直接启动二进制
- 在每个节点上启动 kafka 服务

View File

@ -6,7 +6,7 @@ tags: ["keepalived"]
categories: ["ha/lb"]
---
# VRRP 简介
## VRRP 简介
- VRRP通过一种竞选协议动态地将路由任务交给LAN中**虚拟路由器**中的某台**VRRP路由器**
- VRRP路由器是一台实现了VRRP协议(运行VRRPD程序)的物理路由器
- 虚拟路由器是由多台VRRP物理路由器组成的逻辑路由器对外看起来就像一台路由器
@ -14,7 +14,7 @@ categories: ["ha/lb"]
- MASTER路由器一直发送VRRP广播MASTER不可用后(BACKUP收不到广播)其余BACKUP会根据优先级竞选出一台MASTER
- MASTER拥有虚拟路由器IP地址及其它路由配置
# 全局配置
## 全局配置
- 全局定义
```
global_defs {
@ -47,7 +47,7 @@ categories: ["ha/lb"]
```
- 一般服务器都配置了网络信息,所以通常无需配置静态地址和路由,如果不指定 dev则使用 default_interface
# VRRPD 配置
## VRRPD 配置
- VRRP检查脚本(vrrp_script)
```
vrrp_script <SCRIPT_NAME> {
@ -118,7 +118,7 @@ categories: ["ha/lb"]
}
```
# LVS配置(不涉及lvs时无需下面配置)
## LVS配置(不涉及lvs时无需下面配置)
- 虚拟主机组
```
virtual_server_group <STRING> {
@ -171,7 +171,7 @@ categories: ["ha/lb"]
}
```
# 配置日志文件
## 配置日志文件
- 修改服务启动参数
```bash
sed -i '/^KEEPALIVED_OPTIONS/d' /etc/sysconfig/keepalived
@ -190,6 +190,6 @@ categories: ["ha/lb"]
systemctl restart keepalived
```
# 其他参考
## 其他参考
- [详细解释](https://blog.csdn.net/wos1002/article/details/56483325)

View File

@ -6,7 +6,7 @@ tags: ["keepalived", "高可用", "负载均衡"]
categories: ["ha/lb"]
---
# 两个 haproxy 不抢占
## 两个 haproxy 不抢占
- 环境
- haproxy 服务器
- haproxy101: 10.1.1.101
@ -56,7 +56,7 @@ categories: ["ha/lb"]
}
```
# 两个 LVS-DR 调度器不抢占均衡后端 MySQL 和 Ceph 负载
## 两个 LVS-DR 调度器不抢占均衡后端 MySQL 和 Ceph 负载
- 环境
- keepalived 服务器
- ka101: 10.1.1.101
@ -192,7 +192,7 @@ categories: ["ha/lb"]
ip route add 10.1.1.100 dev lo
```
# 不抢占自动切换两台 Redis 主从状态
## 不抢占自动切换两台 Redis 主从状态
- 环境
- Redis 服务器
- redis101: 10.1.1.101

View File

@ -7,19 +7,19 @@ tags: ["kickstart", "centos"]
categories: ["os"]
---
# 环境
## 环境
- CentOS7.6
- genisoimage 1.1.11
- CentOS-7-x86_64-Minimal-1810.iso
# 复制 iso 内容到本地磁盘
## 复制 iso 内容到本地磁盘
```bash
mount -o loop CentOS-7-x86_64-Minimal-1810.iso /mnt/
mkdir -p /home/iso/centos7
cd /mnt && cp -af * .* /home/iso/centos7/
```
# 创建 isolinux/ks.cfg
## 创建 isolinux/ks.cfg
- mbr 启动,/home/iso/centos7/isolinux/ks.cfg 内容如下
```
# Install OS instead of upgrade
@ -151,7 +151,7 @@ cd /mnt && cp -af * .* /home/iso/centos7/
%end
```
# 修改启动项文件
## 修改启动项文件
- mbr 启动,只需修改 isolinux/isolinux.cfg
- 删除 "label check" 下的 "menu default" 一行
- 在 "label linux" 一行上方添加如下内容
@ -175,7 +175,7 @@ cd /mnt && cp -af * .* /home/iso/centos7/
}
```
# 生成 ISO 镜像
## 生成 ISO 镜像
- mbr 启动,执行如下命令
```bash
genisoimage -v -R -J -T -V CentOS7 \
@ -203,6 +203,6 @@ cd /mnt && cp -af * .* /home/iso/centos7/
/home/iso/centos7
```
# 参考
## 参考
- [https://boke.wsfnk.com/archives/382.html](https://boke.wsfnk.com/archives/382.html)

View File

@ -6,10 +6,10 @@ tags: ["kubernetes", "k8s", "kubeadm"]
categories: ["container"]
---
# kubeadm 安装 kubernetes
## kubeadm 安装 kubernetes
## 全部服务器配置
### 全部服务器配置
IP 地址 | 主机名 | 操作系统 | 内存 | swap | 硬盘 | Internet | firewalld | selinux | /etc/hosts 增加行
--------- | -------- | -------- | ---- | ---- | ---- | -------- | --------- | ------- | ------------------
10.0.2.80 | master80 | CentOS7 | 4GB | 关闭 | 20GB | 可达 | 关闭 | 关闭 | 127.0.0.1 master80
@ -76,7 +76,7 @@ categories: ["container"]
```
## 安装 docker
### 安装 docker
- 各服务器安装 docker
```bash
yum install docker
@ -106,7 +106,7 @@ categories: ["container"]
```
## 安装 kubernetes
### 安装 kubernetes
- 各服务器配置 kubernetes yum 源
```bash
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
@ -132,7 +132,7 @@ categories: ["container"]
```
## 在 master80 服务器上安装 kubernetes master 服务组件
### 在 master80 服务器上安装 kubernetes master 服务组件
- 初始化 kubeadm
```bash
kubeadm init --pod-network-cidr=192.168.0.0/16 --token-ttl 0
@ -148,7 +148,7 @@ categories: ["container"]
```
## 加入其他节点
### 加入其他节点
- 在 node81 和 node82 服务器上执行以下命令,即 master80 服务器 'kuberadm init' 命令的最后一行输出
```bash
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

View File

@ -7,7 +7,7 @@ tags: ["letsencrypt", "certbot", "ssl"]
categories: ["web"]
---
# 安装 certbot
## 安装 certbot
- 在 alpine linux 中安装 certbot
```bash
apk add --no-cache certbot openssl
@ -18,7 +18,7 @@ categories: ["web"]
certbot register --register-unsafely-without-email --agree-tos
```
# 普通域名证书
## 普通域名证书
- 申请 ssl 证书,有效期 90 天
```bash
certbot certonly -n -d x.x.com --standalone
@ -38,7 +38,7 @@ categories: ["web"]
openssl dhparam -out /etc/letsencrypt/dhparam.pem 2048
```
# 通配域名证书
## 通配域名证书
- 申请 ssl 证书,有效期 90 天
```bash
certbot certonly --manual -d '*.x.com' \
@ -61,7 +61,7 @@ categories: ["web"]
openssl dhparam -out /etc/letsencrypt/dhparam.pem 2048
```
# 使用证书
## 使用证书
- nginx 配置 ssl
```
server {

View File

@ -7,11 +7,11 @@ tags: ["linux", "随机读", "随机写"]
categories: ["storage"]
---
# 前言
## 前言
- 随机写会导致磁头不停地换道,造成效率的极大降低
- 顺序写磁头几乎不用换道,或者换道的时间很短
# fio 介绍
## fio 介绍
- fio的输出报告中的几个关键指标:
- slat: 是指从 I/O 提交到实际执行 I/O 的时长Submission latency
- clat: 是指从 I/O 提交到 I/O 完成的时长Completion latency
@ -19,8 +19,8 @@ categories: ["storage"]
- bw : 吞吐量
- iops: 每秒 I/O 的次数
# 同步写测试
## 同步随机写
## 同步写测试
### 同步随机写
- 使用strace工具查看系统调用
```bash
strace -f -tt -o /tmp/randwrite.log -D fio -name=randwrite -rw=randwrite \
@ -82,7 +82,7 @@ categories: ["storage"]
...
```
## 同步顺序写
### 同步顺序写
- 测试顺序写
```bash
strace -f -tt -o /tmp/write.log -D fio -name=write -rw=write \
@ -153,7 +153,7 @@ categories: ["storage"]
```
- 顺序读不需要反复定位文件偏移量,所以能够专注于写操作
# 异步顺序写
## 异步顺序写
- 前面 fio 的测试报告中没有发现slat那是由于上述都是同步操作对同步 I/O 来说,由于 I/O 提交和 I/O 完成是一个动作,所以 slat 实际上就是 I/O 完成的时间
- 异步顺序写测试命令
```bash
@ -183,6 +183,6 @@ categories: ["storage"]
sda: ios=0/262147, merge=0/1, ticks=0/6576, in_queue=6568, util=74.32%
```
# 参考
## 参考
- [https://www.linuxidc.com/Linux/2019-08/160097.htm](https://www.linuxidc.com/Linux/2019-08/160097.htm)

View File

@ -7,10 +7,10 @@ tags: ["lvm"]
categories: ["storage"]
---
# LVM 一览
## LVM 一览
![lvm一览](/img/lvm.jpg "lvm一览")
# LVM 结构
## LVM 结构
- PE 物理扩展
- PV 物理卷,在设备起始处放置一个标签,包括 uuidlvm 配置元数据位置以及剩余空间
- PV 可以由分区创建,也可以直接用磁盘创建
@ -25,9 +25,9 @@ categories: ["storage"]
- Thinly-Provisioned Snapshot 精简配置快照卷
- Cache 缓存卷
# LVM 相关命令
## LVM 相关命令
## PV
### PV
- pvchange 更改物理卷属性
- pvck 检查物理卷元数据
- pvcreate 初始化磁盘或分区以供lvm使用
@ -38,7 +38,7 @@ categories: ["storage"]
- pvs 报告有关物理卷的信息
- pvscan 扫描物理卷的所有磁盘
## VG
### VG
- vgcfgbackup 备份卷组描述符区域
- vgcfgrestore 恢复卷组描述符区域
- vgchange 更改卷组的属性
@ -58,7 +58,7 @@ categories: ["storage"]
- vgscan 扫描卷组的所有磁盘并重建高速缓存
- vgsplit 将卷组拆分为两个,通过移动整个物理卷将任何逻辑卷从一个卷组移动到另一个卷组
## LV
### LV
- lvchange 更改逻辑卷属性
- lvconvert 将逻辑卷从线性转换为镜像或快照
- lvcreate 将现有卷组中创建逻辑卷
@ -74,13 +74,13 @@ categories: ["storage"]
- lvs 报告有关逻辑卷的信息
- lvscan 扫描所有的逻辑卷
# 创建 LVM
## 创建 LVM
- 将磁盘创建为 pv物理卷其实物理磁盘被条带化为 pv划成了一个一个的 pe默认每个 pe 大小是 4MB
- 创建 vg其实它是一个空间池不同PV加入同一 vg
- 创建 lv组成 lv 的 pe 可能来自不同的物理磁盘
- 格式化 lv挂载使用
# PV 管理
## PV 管理
- 制作 pv
```bash
pvcreate /dev/sdb1
@ -90,7 +90,7 @@ categories: ["storage"]
pvremote /dev/sdb1
```
# VG 管理
## VG 管理
- 制作 vg
```bash
# vgcreate vg_name 磁盘设备或分区
@ -121,7 +121,7 @@ categories: ["storage"]
vgrename xxxx-vgid-xxxx-xxxx new_name
```
# LV 管理
## LV 管理
- 制作 lv
```bash
# -n lv_name-L lv_sizedatavg(vg name)
@ -171,7 +171,7 @@ categories: ["storage"]
```
- 查看 lvsmount 挂载
# lvm 灾难恢复
## lvm 灾难恢复
- 场景: 三块盘做 lvm现有一物理盘损坏将剩下两块放到其他linux服务器上
- 恢复步骤
- 查看磁盘信息lvm信息确认能查到lvm相关信息找到VG组的名字

View File

@ -6,7 +6,7 @@ tags: ["lvs", "负载均衡"]
categories: ["ha/lb"]
---
# 环境
## 环境
角色 | 地址
---- | ----
负载分配服务器 | 192.168.1.209
@ -14,7 +14,7 @@ tomcat 服务器1 | 192.168.1.207
tomcat 服务器2 | 192.168.1.208
VIP | 192.168.1.250
# LVS-DR
## LVS-DR
- 配置负载分配服务器(192.168.1.209)
```bash
#在与 tomcat 服务器连通的网卡(eth0)上配置虚拟 IP(192.168.1.250)

View File

@ -6,8 +6,8 @@ tags: ["makefile"]
categories: ["dev/ops"]
---
# Makefile 介绍
## 介绍
## Makefile 介绍
### 介绍
- make命令执行时需要一个 Makefile 文件以告诉make命令需要怎么样的去编译和链接程序。
- 首先我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册在这个示例中我们的工程有8个C文件和3个头文件我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是
- 如果这个工程没有编译过那么我们的所有C文件都要编译并被链接。
@ -15,7 +15,7 @@ categories: ["dev/ops"]
- 如果这个工程的头文件被改变了那么我们需要编译引用了这几个头文件的C文件并链接目标程序。
- 只要我们的Makefile写得够好所有的这一切我们只用一个make命令就可以完成make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译从而自己编译所需要的文件和链接目标程序。
## Makefile的规则
### Makefile的规则
- 在讲述这个Makefile之前还是让我们先来粗略地看一看Makefile的规则。
```makefile
target... : prerequisites ...
@ -28,7 +28,7 @@ categories: ["dev/ops"]
- command 也就是make需要执行的命令任意的Shell命令
- 这是一个文件的依赖关系也就是说target这一个或多个的目标文件依赖于prerequisites中的文件其生成规则定义在command中。说白一点就是说prerequisites中如果有一个以上的文件比target文件要新的话command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。
## 一个示例
### 一个示例
- 正如前面所说的如果一个工程有3个头文件和8个C文件我们为了完成前面所述的那三个规则我们的Makefile应该是下面的这个样子的。
```makefile
edit : main.o kbd.o command.o display.o \
@ -61,7 +61,7 @@ categories: ["dev/ops"]
- 在定义好依赖关系后后续的那一行定义了如何生成目标文件的操作系统命令一定要以一个Tab键作为开头。记住make并不管命令是怎么工作的他只管执行所定义的命令。make会比较targets文件和prerequisites文件的修改日期如果prerequisites文件的日期要比targets文件的日期要新或者target不存在的话那么make就会执行后续定义的命令。
- 这里要说明一点的是clean不是一个文件它只不过是一个动作名字有点像C语言中的lable一样其冒号后什么也没有那么make就不会自动去找文件的依赖性也就不会自动执行其后所定义的命令。要执行其后的命令就要在make命令后明显得指出这个lable的名字。这样的方法非常有用我们可以在一个makefile中定义不用的编译或是和编译无关的命令比如程序的打包程序的备份等等。
## make 是如何工作的
### make 是如何工作的
- 在默认的方式下也就是我们只输入make命令。那么
- make会在当前目录下找名字叫"Makefile"或"makefile"的文件。
- 如果找到它会找文件中的第一个目标文件target在上面的例子中他会找到"edit"这个文件,并把这个文件作为最终的目标文件。
@ -73,7 +73,7 @@ categories: ["dev/ops"]
- 于是在我们编程中如果这个工程已被编译过了当我们修改了其中一个源文件比如file.c那么根据我们的依赖性我们的目标file.o会被重编译也就是在这个依性关系后面所定义的命令于是file.o的文件也是最新的啦于是file.o的文件修改时间要比edit要新所以edit也会被重新链接了详见edit目标文件后定义的命令
而如果我们改变了"command.h"那么kdb.o、command.o和files.o都会被重编译并且edit会被重链接。
## makefile中使用变量
### makefile中使用变量
- 在上面的例子中先让我们看看edit的规则
```makefile
edit : main.o kbd.o command.o display.o \
@ -114,7 +114,7 @@ categories: ["dev/ops"]
```
- 如果有新的 .o 文件加入,我们只需简单地修改一下 objects 变量就可以了。
## 让make自动推导
### 让make自动推导
- GNU的make很强大它可以自动推导文件以及文件依赖关系后面的命令于是我们就没必要去在每一个[.o]文件后都写上类似的命令因为我们的make会自动识别并自己推导命令。
- 只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中如果make找到一个whatever.o那么whatever.c就会是whatever.o的依赖文件。并且 cc -c whatever.c 也会被推导出来于是我们的makefile再也不用写得这么复杂。我们的是新的makefile又出炉了。
```makefile
@ -139,7 +139,7 @@ categories: ["dev/ops"]
```
- 这种方法也就是make的"隐晦规则"。上面文件内容中,".PHONY"表示clean是个伪目标文件。
## 另类风格的makefile
### 另类风格的makefile
- 既然我们的make可以自动推导命令那么我看到那堆[.o]和[.h]的依赖就有点不爽,那么多的重复的[.h]能不能把其收拢起来好吧没有问题这个对于make来说很容易谁叫它提供了自动推导命令和文件的功能呢来看看最新风格的makefile吧。
```makefile
objects = main.o kbd.o command.o display.o \
@ -158,7 +158,7 @@ categories: ["dev/ops"]
```
- 这种风格让我们的makefile变得很简单但我们的文件依赖关系就显得有点凌乱了。鱼和熊掌不可兼得。还看你的喜好了
## 清空目标文件的规则
### 清空目标文件的规则
- 每个Makefile中都应该写一个清空目标文件.o和执行文件的规则这不仅便于重编译也很利于保持文件的清洁。这是一个"修养"(呵呵,还记得我的《编程修养》吗)。一般的风格都是:
```makefile
clean:
@ -173,8 +173,8 @@ categories: ["dev/ops"]
- 前面说过,.PHONY意思表示clean是一个"伪目标"而在rm命令前面加了一个小减号的意思就是也许某些文件出现问题但不要管继续做后面的事。当然clean的规则不要放在文件的开头不然这就会变成make的默认目标相信谁也不愿意这样。不成文的规矩是 "clean从来都是放在文件的最后"。
# Makefile 总述
## Makefile里有什么
## Makefile 总述
### Makefile里有什么
- Makefile里主要包含了五个东西显式规则、隐晦规则、变量定义、文件指示和注释。
- 显式规则。显式规则说明了如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出要生成的文件文件的依赖文件生成的命令。
- 隐晦规则。由于我们的make有自动推导的功能所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile这是由make所支持的。
@ -183,11 +183,11 @@ categories: ["dev/ops"]
- 注释。Makefile中只有行注释和UNIX的Shell脚本一样其注释是用"#"字符这个就像C/C++中的"//"一样。如果你要在你的Makefile中使用"#"字符,可以用反斜框进行转义,如:"\#"。
- 最后还值得一提的是在Makefile中的命令必须要以[Tab]键开始。
## Makefile的文件名
### Makefile的文件名
- 默认的情况下make命令会在当前目录下按顺序找寻文件名为"GNUmakefile"、"makefile"、"Makefile"的文件,找到了解释这个文件。在这三个文件名中,最好使用"Makefile"这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用"GNUmakefile"这个文件是GNU的make识别的。有另外一些make只对全小写的"makefile"文件名敏感但是基本上来说大多数的make都支持"makefile"和"Makefile"这两种默认文件名。
- 当然你可以使用别的文件名来书写Makefile比如"Make.Linux""Make.Solaris""Make.AIX"等如果要指定特定的Makefile你可以使用make的"-f"和"--file"参数make -f Make.Linux或make --file Make.AIX。
## 引用其它的Makefile
### 引用其它的Makefile
- 在Makefile使用include关键字可以把别的Makefile包含进来这很像C语言的#include被包含的文件会原模原样的放在当前文件的包含位置。include的语法是
```makefile
include<filename>filename可以是当前操作系统Shell的文件模式可以保含路径和通配符
@ -209,11 +209,11 @@ categories: ["dev/ops"]
```
- 其表示无论include过程中出现什么错误都不要报错继续执行。和其它版本make兼容的相关命令是sinclude其作用和这一个是一样的。
## 环境变量 MAKEFILES
### 环境变量 MAKEFILES
- 如果你的当前环境中定义了环境变量MAKEFILES那么make会把这个变量中的值做一个类似于include的动作。这个变量中的值是其它的Makefile用空格分隔。只是它和include不同的是从这个环境变中引入的Makefile的"目标"不会起作用如果环境变量中定义的文件发现错误make也会不理。
- 但是在这里我还是建议不要使用这个环境变量因为只要这个变量一被定义那么当你使用make时所有的Makefile都会受到它的影响这绝不是你想看到的。在这里提这个事只是为了告诉大家也许有时候你的Makefile出现了怪事那么你可以看看当前环境中有没有定义这个变量。
## make的工作方式
### make的工作方式
- GNU的make工作时的执行步骤入下
- 读入所有的Makefile。
- 读入被include的其它Makefile。
@ -225,13 +225,13 @@ categories: ["dev/ops"]
- 步为第一个阶段6-7为第二个阶段。第一个阶段中如果定义的变量被使用了那么make会把其展开在使用的位置。但make并不会完全马上展开make使用的是拖延战术如果变量出现在依赖关系的规则中那么仅当这条依赖被决定要使用了变量才会在其内部展开。
- 当然这个工作方式你不一定要清楚但是知道这个方式你也会对make更为熟悉。有了这个基础后续部分也就容易看懂了。
# Makefile书写规则
## 规则
## Makefile书写规则
### 规则
- 规则包含两个部分,一个是依赖关系,一个是生成目标的方法。
- 在Makefile中规则的顺序是很重要的因为Makefile中只应该有一个最终目标其它的目标都是被这个目标所连带出来的所以一定要让make知道你的最终目标是什么。一般来说定义在Makefile中的目标可能会有很多但是第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个那么第一个目标会成为最终的目标。make所完成的也就是这个目标。
- 好了,还是让我们来看一看如何书写规则。
## 规则举例
### 规则举例
```makefile
foo.o: foo.c defs.h # foo模块
cc -c -g foo.c
@ -240,7 +240,7 @@ categories: ["dev/ops"]
- 文件的依赖关系foo.o依赖于foo.c和defs.h的文件如果foo.c和defs.h的文件日期要比foo.o文件日期要新或是foo.o不存在那么依赖关系发生。
- 如果生成或更新foo.o文件。也就是那个cc命令其说明了如何生成foo.o这个文件。当然foo.c文件include了defs.h文件
## 规则的语法
### 规则的语法
```makefile
targets : prerequisites
command
@ -258,7 +258,7 @@ categories: ["dev/ops"]
- 如果命令太长,你可以使用反斜框(‘\作为换行符。make对一行上有多少个字符没有限制。规则告诉make两件事文件的依赖关系和如何成成目标文件。
- 一般来说make会以UNIX的标准Shell也就是/bin/sh来执行命令。
## 在规则中使用通配符
### 在规则中使用通配符
- 如果我们想定义一系列比较类似的文件我们很自然地就想起使用通配符。make支持三各通配符"\*""?"和"[...]"。这是和Unix的B-Shell是相同的。
- "~" 波浪号("~")字符在文件名中也有比较特殊的用途。如果是"~/test",这就表示当前用户的$HOME目录下的test目录。而"~hchen/test"则表示用户hchen的宿主目录下的test目录。这些都是Unix下的小知识了make也支持而在Windows或是MS-DOS下用户没有宿主目录那么波浪号所指的目录则根据环境变量"HOME"而定。
- "\*" 通配符代替了你一系列的文件,如"\*.c"表示所以后缀为c的文件。一个需要我们注意的是如果我们的文件名中有通配符"\*",那么可以用转义字符"\",如"\*"来表示真实的"\*"字符,而不是任意长度的字符串。
@ -283,7 +283,7 @@ categories: ["dev/ops"]
```
- 这种用法由关键字"wildcard"指出关于Makefile的关键字我们将在后面讨论。
## 文件搜寻
### 文件搜寻
- 在一些大的工程中有大量的源文件我们通常的做法是把这许多的源文件分类并存放在不同的目录中。所以当make需要去找寻文件的依赖关系时你可以在文件前加上路径但最好的方法是把一个路径告诉make让make在自动去找。
- Makefile文件中的特殊变量"VPATH"就是完成这个功能的如果没有指明这个变量make只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量那么make就会在当当前目录找不到的情况下到所指定的目录中去找寻文件了。
```makefile
@ -312,7 +312,7 @@ categories: ["dev/ops"]
```
- 而上面的语句则表示".c"结尾的文件,先在"foo"目录,然后是"bar"目录,最后才是"blish"目录。
## 伪目标
### 伪目标
- 最早先的一个例子中,我们提到过一个"clean"的目标,这是一个"伪目标"
```makefile
clean:
@ -360,7 +360,7 @@ categories: ["dev/ops"]
```
- "makeclean"将清除所有要被清除的文件。"cleanobj"和"cleandiff"这两个伪目标有点像"子程序"的意思。我们可以输入"makecleanall"和"make cleanobj"和"makecleandiff"命令来达到清除不同种类文件的目的
## 多目标
### 多目标
- Makefile的规则中的目标可以不止一个其支持多目标有可能我们的多个目标同时依赖于一个文件并且其生成的命令大体类似。于是我们就能把其合并起来。当然多个目标的生成规则的执行命令是同一个这可能会可我们带来麻烦不过好在我们的可以使用一个自动化变量"$@"(关于自动化变量,将在后面讲述),这个变量表示着目前规则中所有的目标的集合,这样说可能很抽象,还是看一个例子吧。
```makefile
bigoutput littleoutput : text.g
@ -375,7 +375,7 @@ categories: ["dev/ops"]
```
- 其中,-$(subst output,,$@)中的"$"表示执行一个Makefile的函数函数名为subst后面的为参数。关于函数将在后面讲述。这里的这个函数是截取字符串的意思"$@"表示目标的集合,就像一个数组,"$@"依次取出目标,并执于命令。
## 静态模式
### 静态模式
- 静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。我们还是先来看一下语法:
```makefile
<targets...>: <target-pattern>: <prereq-patterns ...>
@ -414,7 +414,7 @@ categories: ["dev/ops"]
```
- $(filter%.o,$(files))表示调用Makefile的filter函数过滤"$filter"集,只要其中模式为"%.o"的内容。其的它内容我就不用多说了吧。这个例字展示了Makefile中更大的弹性。
## 自动生成依赖性
### 自动生成依赖性
- 在Makefile中我们的依赖关系可能会需要包含一系列的头文件比如如果我们的main.c中有一句"#include "defs.h"",那么我们的依赖关系应该是:
```makefile
main.o : main.c defs.h
@ -476,12 +476,12 @@ categories: ["dev/ops"]
```
- 上述语句中的"$(sources:.c=.d)"中的".c=.d"的意思是做一个替换,把变量$(sources)所有[.c]的字串都替换成[.d],关于这个"替换"的内容在后面我会有更为详细的讲述。当然你得注意次序因为include是按次来载入文件最先载入的[.d]文件中的目标会成为默认目标
# Makefile 书写命令
## 命令
## Makefile 书写命令
### 命令
- 每条规则中的命令和操作系统Shell的命令行是一致的。make会一按顺序一条一条的执行命令每条命令的开头必须以[Tab]键开头除非命令是紧跟在依赖规则后面的分号后的。在命令行之间中的空格或是空行会被忽略但是如果该空格或空行是以Tab键开头的那么make会认为其是一个空命令。
- 我们在UNIX下可能会使用不同的Shell但是make的命令默认是被"/bin/sh" UNIX的标准Shell解释执行的。除非你特别指定一个其它的Shell。Makefile中"#"是注释符很像C/C++中的"//",其后的本行字符都被注释。
## 显示命令
### 显示命令
- 通常make会把其要执行的命令行在命令执行前输出到屏幕上。当我们用"@"字符在命令行前那么这个命令将不被make显示出来最具代表性的例子是我们用这个功能来像屏幕显示一些信息。如
```makefile
@echo 正在编译XXX模块......
@ -494,7 +494,7 @@ categories: ["dev/ops"]
- 如果make执行时带入make参数"-n"或"--just-print"那么其只是显示命令但不会执行命令这个功能很有利于我们调试我们的Makefile看看我们书写的命令是执行起来是什么样子的或是什么顺序的。
- make参数"-s"或"--slient"则是全面禁止命令的显示。
## 命令执行
### 命令执行
- 当依赖目标新于目标时也就是当规则的目标需要被更新时make会一条一条的执行其后的命令。需要注意的是如果你要让上一条命令的结果应用在下一条命令时你应该使用分号分隔这两条命令。比如你的第一条命令是cd命令你希望第二条命令得在cd之后的基础上运行那么你就不能把这两条命令写在两行上而应该把这两条命令写在一行上用分号分隔。如
```makefile
# 示例一:
@ -509,7 +509,7 @@ categories: ["dev/ops"]
- 当我们执行"make exec"时第一个例子中的cd没有作用pwd会打印出当前的Makefile目录而第二个例子中cd就起作用了pwd会打印出"/home/hchen"。
- make 一般是使用环境变量SHELL中所定义的系统Shell来执行命令默认情况下使用UNIX的标准Shell /bin/sh来执行命令。但在MS-DOS下有点特殊因为MS-DOS下没有SHELL环境变量当然你也可以指定。如果你指定了UNIX风格的目录形式首先make会在SHELL所指定的路径中找寻命令解释器如果找不到其会在当前盘符中的当前目录中寻找如果再找不到其会在PATH环境变量中所定义的所有路径中寻找。MS-DOS中如果你定义的命令解释器没有找到其会给你的命令解释器加上诸如".exe"、".com"、".bat"、".sh"等后缀。
## 命令出错
### 命令出错
- 每当命令运行完后make会检测每个命令的返回码如果命令返回成功那么make会执行下一条命令当规则中所有的命令成功返回后这个规则就算是成功完成了。如果一个规则中的某个命令出错了命令退出码非零那么make就会终止执行当前规则这将有可能终止所有规则的执行。
- 有些时候命令的出错并不表示就是错误的。例如mkdir命令我们一定需要建立一个目录如果目录不存在那么mkdir就成功执行万事大吉如果目录存在那么就出错了。我们之所以使用mkdir的意思就是一定要有这样的一个目录于是我们就不希望mkdir出错而终止规则的运行。
- 为了做到这一点忽略命令的出错我们可以在Makefile的命令行前加一个减号"-"在Tab键之后标记为不管命令出不出错都认为是成功的。如
@ -520,7 +520,7 @@ categories: ["dev/ops"]
- 还有一个全局的办法是给make加上"-i"或是"--ignore-errors"参数那么Makefile中所有命令都会忽略错误。而如果一个规则是以".IGNORE"作为目标的,那么这个规则中的所有命令将会忽略错误。这些是不同级别的防止命令出错的方法,你可以根据你的不同喜欢设置。
- 还有一个要提一下的make的参数的是"-k"或是"--keep-going",这个参数的意思是,如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。
## 嵌套执行make
### 嵌套执行make
- 在一些大的工程中我们会把我们不同模块或是不同功能的源文件放在不同的目录中我们可以在每个目录中都书写一个该目录的Makefile这有利于让我们的Makefile变得更加地简洁而不至于把所有的东西全部写在一个Makefile中这样会很难维护我们的Makefile这个技术对于我们模块编译和分段编译有着非常大的好处。
- 例如我们有一个子目录叫subdir这个目录下有个Makefile文件来指明了这个目录下文件的编译规则。那么我们总控的Makefile可以这样书写
```makefile
@ -579,7 +579,7 @@ categories: ["dev/ops"]
```
- 当你使用"-C"参数来指定make下层Makefile时"-w"会被自动打开的。如果参数中有"-s""--slient")或是"--no-print-directory",那么,"-w"总是失效的。
## 定义命令包
### 定义命令包
- 如果Makefile中出现一些相同命令序列那么我们可以为这些相同的命令序列定义一个变量。定义这种命令序列的语法以"define"开始,以"endef"结束,如:
```makefile
define run-yacc
@ -595,8 +595,8 @@ categories: ["dev/ops"]
- 我们可以看见,要使用这个命令包,我们就好像使用变量一样。在这个命令包的使用中,命令包"run-yacc"中的"$^"就是"foo.y""$@"就是"foo.c"(有关这种以"$"开头的特殊变量我们会在后面介绍make在执行命令包时命令包中的每个命令会被依次独立执行。
- 在 Makefile中的定义的变量就像是C/C++语言中的宏一样他代表了一个文本字串在Makefile中执行的时候其会自动原模原样地展开在所使用的地方。其与C/C++所不同的是你可以在Makefile中改变其值。在Makefile中变量可以使用在"目标""依赖目标""命令"或是 Makefile的其它部分中。变量的命名字可以包含字符、数字下划线可以是数字开头但不应该含有":"、"#"、"="或是空字符(空格、回车等)。变量是大小写敏感的,"foo"、"Foo"和"FOO"是三个不同的变量名。传统的Makefile的变量名是全大写的命名方式但我推荐使用大小写搭配的变量名MakeFlags。这样可以避免和系统的变量冲突而发生意外的事情。有一些变量是很奇怪字串如"$<"、"$@"等,这些是自动化变量。
# 变量
## 变量的基础
## 变量
### 变量的基础
- 变量在声明时需要给予初值,而在使用时,需要给在变量名前加上"$"符号,但最好用小括号""或是大括号"{}"把变量给包括起来。如果你要使用真实的"$"字符,那么你需要用"$$"来表示。变量可以使用在许多地方,如规则中的"目标"、"依赖"、"命令"以及新的变量中。
- 先看一个例子:
```makefile
@ -619,7 +619,7 @@ categories: ["dev/ops"]
```
- 当然千万不要在你的Makefile中这样干这里只是举个例子来表明Makefile中的变量在使用处展开的真实样子。可见其就是一个"替代"的原理。另外,给变量加上括号完全是为了更加安全地使用这个变量,在上面的例子中,如果你不想给变量加上括号,那也可以,但我还是强烈建议你给变量加上括号。
## 变量中的变量
### 变量中的变量
- 在定义变量的值时我们可以使用其它变量来构造变量的值在Makefile中有两种方式来在用变量定义变量的值。
- 先看第一种方式,也就是简单的使用"="号,在"="左侧是变量,右侧是变量的值,右侧变量的值可以定义在文件的任何一处,也就是说,右侧中的变量不一定非要是已定义好
的值,其也可以使用后面定义的值。如:
@ -694,7 +694,7 @@ categories: ["dev/ops"]
endif
```
## 变量高级用法
### 变量高级用法
- 这里介绍两种变量的高级使用方法,第一种是变量值的替换。
- 我们可以替换变量中的共有的部分,其格式是"$(var:a=b)"或是"${var:a=b}",其意思是,把变量"var"中所有以"a"字串"结尾"的"a"替换成"b"字串。这里的"结尾"意思是"空格"或是"结束符"。
- 还是看一个示例吧:
@ -779,7 +779,7 @@ categories: ["dev/ops"]
```
- 这个例子中定义了三个变量:"dir""foo_sources"和"foo_print"。
## 追加变量值
### 追加变量值
- 我们可以使用"+="操作符给变量追加值,如:
```makefile
objects = main.o foo.o bar.o utils.o
@ -809,7 +809,7 @@ categories: ["dev/ops"]
```
- 由于前次的赋值符是"=",所以"+="也会以"="来做为赋值那么岂不会发生变量的递补归定义这是很不好的所以make会自动为我们解决这个问题我们不必担心这个问题。
## override 指示符
### override 指示符
- 如果有变量是通常make的命令行参数设置的那么Makefile中对这个变量的赋值会被忽略。如果你想在Makefile中设置这类参数的值那么你可以使用"override"指示符。其语法是:
```makefile
override <variable> = <value>
@ -826,7 +826,7 @@ categories: ["dev/ops"]
endef
```
## 多行变量
### 多行变量
- 还有一种设置变量值的方法是使用define关键字。使用define关键字设置变量的值可以有换行这有利于定义一系列的命令前面我们讲过"命令包"的技术就是利用这个关键字)。
- define 指示符后面跟的是变量的名字而重起一行定义变量的值定义是以endef关键字结束。其工作方式和"="操作符一样。变量的值可以包含函数、命令、文字,或是其它变量。因为命令需要以[Tab]键开头所以如果你用define定义的命令变量中没有以[Tab]键开头那么make就不会把其认为是命令。
- 下面的这个示例展示了define的用法
@ -837,12 +837,12 @@ categories: ["dev/ops"]
endef
```
## 环境变量
### 环境变量
- make 运行时的系统环境变量可以在make开始运行时被载入到Makefile文件中但是如果Makefile中已定义了这个变量或是这个变量由make命令行带入那么系统的环境变量的值将被覆盖。如果make指定了"-e"参数那么系统环境变量将覆盖Makefile中定义的变量
- 因此,如果我们在环境变量中设置了"CFLAGS"环境变量那么我们就可以在所有的Makefile中使用这个变量了。这对于我们使用统一的编译参数有比较大的好处。如果Makefile中定义了CFLAGS那么则会使用Makefile中的这个变量如果没有定义则使用系统环境变量的值一个共性和个性的统一很像"全局变量"和"局部变量"的特性。 当make嵌套调用时参见前面的"嵌套调用"章节上层Makefile中定义的变量会以系统环境变量的方式传递到下层的Makefile中。当然默认情况下只有通过命令行设置的变量会被传递。而定义在文件中的变量如果要向下层 Makefile传递则需要使用exprot关键字来声明。参见前面章节
- 当然我并不推荐把许多的变量都定义在系统环境中这样在我们执行不用的Makefile时拥有的是同一套系统变量这可能会带来更多的麻烦。
## 目标变量
### 目标变量
- 前面我们所讲的在Makefile中定义的变量都是"全局变量",在整个文件,我们都可以访问这些变量。当然,"自动化变量"除外,如"$<"等这种类量的自动化变量就属于"规则型变量",这种变量的值依赖于规则的目标和依赖目标的定义。
- 当然,我样同样可以为某个目标设置局部变量,这种变量被称为"Target-specific Variable",它可以和"全局变量"同名,因为它的作用范围只在这条规则以及连带规则中,所以其值也只在作用范围内有效。而不会影响规则链以外的全局变量的值。
- 其语法是:
@ -867,7 +867,7 @@ categories: ["dev/ops"]
```
- 在这个示例中,不管全局的$(CFLAGS)的值是什么在prog目标以及其所引发的所有规则中prog.o foo.o bar.o的规则$(CFLAGS)的值都是"-g"
## 模式变量
### 模式变量
- 在GNU的make中还支持模式变量Pattern-specific Variable通过上面的目标变量中我们知道变量可以定义在某个目标上。模式变量的好处就是我们可以给定一种"模式",可以把变量定义在符合这种模式的所有目标上。
- 我们知道make的"模式"一般是至少含有一个"%"的,所以,我们可以以如下方式给所有以[.o]结尾的目标定义目标变量:
```makefile
@ -880,8 +880,8 @@ categories: ["dev/ops"]
```
- override同样是针对于系统环境传入的变量或是make命令行指定的变量。
# 条件判断
## 一个例子
## 条件判断
### 一个例子
- 下面的例子,判断$(CC)变量是否"gcc"如果是的话则使用GNU函数编译目标。
```makefile
libs_for_gcc = -lgnu
@ -921,7 +921,7 @@ categories: ["dev/ops"]
$(CC) -o foo $(objects) $(libs)
```
## 语法
### 语法
- 条件表达式的语法为:
```makefile
<conditional-directive>
@ -994,8 +994,8 @@ categories: ["dev/ops"]
- 特别注意的是make是在读取Makefile时就计算条件表达式的值并根据条件表达式的值来选择语句所以你最好不要把自动化变量如"$@"等放入条件表达式中因为自动化变量是在运行时才有的。而且为了避免混乱make不允许把整个条件语句分成两部分放在不同的文件中。
# 函数
## 函数的调用语法
## 函数
### 函数的调用语法
- 函数调用,很像变量的使用,也是以"$"来标识的,其语法如下:
```makefile
$(<function> <arguments> )
@ -1015,8 +1015,8 @@ categories: ["dev/ops"]
```
- 在这个示例中,$(comma)的值是一个逗号。$(space)使用了$(empty)定义了一个空格,$(foo)的值是"a b c"$(bar)的定义用,调用了函数"subst",这是一个替换函数,这个函数有三个参数,第一个参数是被替换字串,第二个参数是替换字串,第三个参数是替换操作作用的字串。这个函数也就是把$(foo)中的空格替换成逗号,所以$(bar)的值是"a,b,c"。
## 字符串处理函数
### 字符串替换函数 subst
### 字符串处理函数
#### 字符串替换函数 subst
- 功能:把字串\<text\>中的<from>字符串替换成<to>
- 返回:函数返回被替换过后的字符串。
- 语法:
@ -1029,7 +1029,7 @@ categories: ["dev/ops"]
```
- 把"feet on the street"中的"ee"替换成"EE",返回结果是"fEEt on the strEEt"。
### 模式字符串替换函数 patsubst
#### 模式字符串替换函数 patsubst
- 功能:查找\<text\>中的单词(单词以"空格"、"Tab"或"回车""换行"分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符"%",表示任意长度的字串。如果<replacement>中也包含"%",那么,<replacement>中的这个"%"将是<pattern>中的那个"%"所代表的字串。(可以用"\"来转义,以"\%"来表示真实含义的"%"字符)返回:函数返回被替换过后的字符串。
- 语法:
```makefile
@ -1058,7 +1058,7 @@ categories: ["dev/ops"]
```
- 例如有objects = foo.o bar.o baz.o那么"$(objects:.o=.c)"和"$(patsubst %.o,%.c,$(objects))"是一样的。
### 去空格函数 strip
#### 去空格函数 strip
- 功能:去掉<string>字串中开头和结尾的空字符。
- 返回:返回被去掉空格的字符串值。
- 语法
@ -1071,7 +1071,7 @@ categories: ["dev/ops"]
```
- 把字串"a b c "去到开头和结尾的空格,结果是"a b c"。
### 查找字符串函数findstring
#### 查找字符串函数findstring
- 功能:在字串<in>中查找<find>字串。
- 返回:如果找到,那么返回<find>,否则返回空字符串。
- 语法:
@ -1085,7 +1085,7 @@ categories: ["dev/ops"]
```
- 第一个函数返回"a"字符串,第二个返回""字符串(空字符串)
### 过滤函数 filter
#### 过滤函数 filter
- 功能:以<pattern>模式过滤\<text\>字符串中的单词,保留符合模式<pattern>的单词。可以有多个模式。
- 返回:返回符合模式<pattern>的字串。
- 语法:
@ -1101,7 +1101,7 @@ categories: ["dev/ops"]
- $(filter %.c %.s,$(sources))返回的值是"foo.c bar.c baz.s"。
### 反过滤函数 filter-out
#### 反过滤函数 filter-out
- 功能:以<pattern>模式过滤\<text\>字符串中的单词,去除符合模式<pattern>的单词。可以有多个模式。
- 返回:返回不符合模式<pattern>的字串。
- 语法:
@ -1115,7 +1115,7 @@ categories: ["dev/ops"]
```
- $(filter-out $(mains),$(objects)) 返回值是"foo.o bar.o"。
### 排序函数 sort。
#### 排序函数 sort。
- 功能:给字符串<list>中的单词排序(升序)。
- 返回:返回排序后的字符串。
- 语法:
@ -1125,7 +1125,7 @@ categories: ["dev/ops"]
- 示例:$(sort foo bar lose)返回"bar foo lose" 。
- 备注sort函数会去掉<list>中相同的单词。
### 取单词函数 word
#### 取单词函数 word
- 功能:取字符串\<text\>中第<n>个单词。(从一开始)
- 返回:返回字符串\<text\>中第<n>个单词。如果<n>比\<text\>中的单词数要大,那么返回空字符串。
- 语法:
@ -1134,7 +1134,7 @@ categories: ["dev/ops"]
```
- 示例:$(word 2, foo bar baz)返回值是"bar"。
### 取单词串函数 wordlist
#### 取单词串函数 wordlist
- 功能:从字符串\<text\>中取从\<s\>开始到<e>的单词串,\<s\>和<e>是一个数字。
- 返回:返回字符串\<text\>中从\<s\>到<e>的单词字串。如果\<s\>比\<text\>中的单词数要大,那么返回空字符串。如果<e>大于\<text\>的单词数,那么返回从\<s\>开始,到\<text\>结束的单词串。
- 语法:
@ -1143,7 +1143,7 @@ categories: ["dev/ops"]
```
- 示例: $(wordlist 2, 3, foo bar baz)返回值是"bar baz"。
### 单词个数统计函数 words
#### 单词个数统计函数 words
- 功能:统计\<text\>中字符串中的单词个数。
- 返回:返回\<text\>中的单词数。
- 语法:
@ -1156,7 +1156,7 @@ categories: ["dev/ops"]
$(word $(words \<text\>),\<text\> )。
```
### 首单词函数 firstword
#### 首单词函数 firstword
- 功能:取字符串\<text\>中的第一个单词。
- 返回:返回字符串\<text\>的第一个单词。
- 语法:
@ -1166,17 +1166,17 @@ categories: ["dev/ops"]
- 示例:$(firstword foo bar)返回值是"foo"。
- 备注这个函数可以用word函数来实现$(word 1,\<text\> )。
### 应用例子
#### 应用例子
- make使用"VPATH"变量来指定"依赖文件"的搜索路径我们可以利用这个搜索路径来指定编译器对头文件的搜索路径参数CFLAGS
```makefile
override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))
```
- 如果我们的"$(VPATH)"值是"src:../headers",那么"$(patsubst %,-I%,$(subst :, ,$(VPATH)))"将返回"-Isrc -I../headers"这正是cc或gcc搜索头文件路径的参数 。
## 文件名操作函数
### 文件名操作函数
- 下面我们要介绍的函数主要是处理文件名的。每个函数的参数字符串都会被当做一个或是一系列的文件名来对待。
### 取目录函数 dir
#### 取目录函数 dir
- 功能:从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠("/")之
- 前的部分。如果没有反斜杠,那么返回"./"。
- 返回:返回文件名序列<names>的目录部分。
@ -1186,7 +1186,7 @@ categories: ["dev/ops"]
```
- 示例: $(dir src/foo.c hacks)返回值是"src/ ./"。
### 取文件函数 notdir
#### 取文件函数 notdir
- 功能:从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠("/")之后的部分。
- 返回:返回文件名序列<names>的非目录部分。
- 语法:
@ -1195,7 +1195,7 @@ categories: ["dev/ops"]
```
- 示例: $(notdir src/foo.c hacks)返回值是"foo.c hacks"。
### 取后缀函数 suffix
#### 取后缀函数 suffix
- 功能:从文件名序列<names>中取出各个文件名的后缀。
- 返回:返回文件名序列<names>的后缀序列,如果文件没有后缀,则返回空字串。
- 语法:
@ -1204,7 +1204,7 @@ categories: ["dev/ops"]
```
- 示例:$(suffix src/foo.c src-1.0/bar.c hacks)返回值是".c .c"。
### 取前缀函数 basename
#### 取前缀函数 basename
- 功能:从文件名序列<names>中取出各个文件名的前缀部分。
- 返回:返回文件名序列<names>的前缀序列,如果文件没有前缀,则返回空字串。
- 语法:
@ -1213,7 +1213,7 @@ categories: ["dev/ops"]
```
- 示例:$(basename src/foo.c src-1.0/bar.c hacks)返回值是"src/foo src-1.0/bar hacks"。
### 加后缀函数 addsuffix
#### 加后缀函数 addsuffix
- 功能:把后缀<suffix>加到<names>中的每个单词后面。
- 返回:返回加过后缀的文件名序列。
- 语法:
@ -1222,7 +1222,7 @@ categories: ["dev/ops"]
```
- 示例:$(addsuffix .c,foo bar)返回值是"foo.c bar.c"。
### 加前缀函数 addprefix
#### 加前缀函数 addprefix
- 功能:把前缀<prefix>加到<names>中的每个单词后面。
- 返回:返回加过前缀的文件名序列。
- 语法:
@ -1231,7 +1231,7 @@ categories: ["dev/ops"]
```
- 示例:$(addprefix src/,foo bar)返回值是"src/foo src/bar"。
### 连接函数 join。
#### 连接函数 join。
- 功能:把<list2>中的单词对应地加到<list1>的单词后面。如果<list1>的单词个数要比<list2>的多,那么,<list1>中的多出来的单词将保持原样。如果<list2>的单词个数要比<list1>多,那么,<list2>多出来的单词将被复制到<list2>中。
- 返回:返回连接过后的字符串。
- 语法:
@ -1240,7 +1240,7 @@ categories: ["dev/ops"]
```
- 示例:$(join aaa bbb , 111 222 333)返回值是"aaa111 bbb222 333"。
## foreach 函数
### foreach 函数
- foreach 函数和别的函数非常的不一样。因为这个函数是用来做循环用的Makefile中的foreach函数几乎是仿照于Unix标准Shell/bin /sh中的for语句或是C-Shell/bin/csh中的foreach语句而构建的。它的语法是
```makefile
$(foreach <var>,<list>,\<text\> )
@ -1255,7 +1255,7 @@ categories: ["dev/ops"]
- 上面的例子中,$(name)中的单词会被挨个取出,并存到变量"n"中,"$(n).o"每次根据"$(n)"计算出一个值这些值以空格分隔最后作为foreach函数的返回所以$(files)的值是"a.o b.o c.o d.o"。
- 注意foreach中的<var>参数是一个临时的局部变量foreach函数执行完后参数<var>的变量将不在作用其作用域只在foreach函数当中。
## if 函数
### if 函数
- if函数很像GNU的make所支持的条件语句 ifeq参见前面所述的章节if函数的语法是
```makefile
$(if <condition>,<then-part> )
@ -1268,7 +1268,7 @@ categories: ["dev/ops"]
- 而if函数的返回值是如果<condition>为真(非空字符串),那个<then- part>会是整个函数的返回值,如果<condition>为假(空字符串),那么<else-part>会是整个函数的返回值,此时如果<else-part>没有被定义,那么,整个函数返回空字串。
- 所以,<then-part><else-part>只会有一个被计算。
## call函数
### call函数
- call函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达式这个表达式中你可以定义许多参数然后你可以用call函数来向这个表达式传递参数。其语法是
```makefile
$(call <expression>,<parm1>,<parm2>,<parm3>...)
@ -1285,7 +1285,7 @@ categories: ["dev/ops"]
```
- 此时的foo的值就是"b a"。
## origin 函数
### origin 函数
- origin函数不像其它的函数他并不操作变量的值他只是告诉你你的这个变量是哪里来的其语法是
```makefile
$(origin <variable> )
@ -1308,7 +1308,7 @@ categories: ["dev/ops"]
```
- 当然你也许会说使用override关键字不就可以重新定义环境中的变量了吗为什么需要使用这样的步骤是的我们用override是可以达到这样的效果可是override过于粗暴它同时会把从命令行定义的变量也覆盖了而我们只想重新定义环境传来的而不想重新定义命令行传来的。
## shell函数
### shell函数
- shell 函数也不像其它的函数。顾名思义它的参数应该就是操作系统Shell的命令。它和反引号"`"是相同的功能。这就是说shell函数把执行操作系统命令后的输出作为函数返回。于是我们可以用操作系统命令以及字符串处理命令awksed等等命令来生成一个变量
```makefile
contents := $(shell cat foo)
@ -1317,7 +1317,7 @@ categories: ["dev/ops"]
- 注意这个函数会新生成一个Shell程序来执行命令所以你要注意其运行性能如果你的Makefile中有一些比较复杂的规则并大量使用了这个函数那么对于你的系统性能是有害的。特别是Makefile的隐晦的规则可能会让你的shell函数执行的次数比你想像的多得多。
## 控制make的函数
### 控制make的函数
- make提供了一些函数来控制make的运行。通常你需要检测一些运行Makefile时的运行时信息并且根据这些信息来决定你是让make继续执行还是停止。
```makefile
$(error <text ...> )
@ -1340,15 +1340,15 @@ categories: ["dev/ops"]
$(warning <text ...> )
```
# make 的运行
## make 退出码
## make 的运行
### make 退出码
- make命令执行后有三个退出码
- 0 表示成功执行。
- 1 如果make运行时出现任何错误其返回1。
- 2 如果你使用了make的"-q"选项并且make使得一些目标不需要更新那么返回2。
- Make的相关参数我们会在后续章节中讲述。
## 指定Makefile
### 指定Makefile
- 前面我们说过GNU make找寻默认的Makefile的规则是在当前目录下依次找三个文件 "GNUmakefile"、"makefile"和"Makefile"。其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。
- 当前我们也可以给make命令指定一个特殊名字的Makefile。要达到这个功能我们要使用make的"-f"或是"--file"参数("-- makefile"参数也行。例如我们有个makefile的名字是"hchen.mk"那么我们可以这样来让make来执行这个文件
```bash
@ -1356,7 +1356,7 @@ categories: ["dev/ops"]
```
- 如果在make的命令行是你不只一次地使用了"-f"参数那么所有指定的makefile将会被连在一起传递给make执行。
## 指定目标
### 指定目标
- 一般来说make的最终目标是makefile中的第一个目标而其它目标一般是由这个目标连带出来的。这是make的默认行为。当然一般来说你的 makefile中的第一个目标是由许多个目标组成你可以指示make让其完成你所指定的目标。要达到这一目的很简单需在make命令后直接跟目标的名字就可以完成如前面提到的"make clean"形式任何在makefile中的目标都可以被指定成终极目标但是除了以"- "打头,或是包含了"="的目标因为有这些字符的目标会被解析成命令行参数或是变量。甚至没有被我们明确写出来的目标也可以成为make的终极目标也就是说只要make可以找到其隐含规则推导规则那么这个隐含目标同样可以被指定成终极目标。
- 有一个make的环境变量叫"MAKECMDGOALS",这个变量中会存放你所指定的终极目标的列表,如果在命令行上,你没有指定目标,那么,这个变量是空值。这个变量可以让你使用在一些比较特殊的情形下。比如下面的例子:
```makefile
@ -1383,7 +1383,7 @@ categories: ["dev/ops"]
- "check"和"test" 这两个伪目标一般用来测试makefile的流程。
- 当然一个项目的makefile中也不一定要书写这样的目标这些东西都是GNU的东西但是我想GNU搞出这些东西一定有其可取之处等你的UNIX下的程序文件一多时你就会发现这些功能很有用了这里只不过是说明了如果你要书写这种功能最好使用这种名字命名你的目标这样规范一些规范的好处就是 不用解释大家都明白。而且如果你的makefile中有这些功能一是很实用二是可以显得你的makefile很专业不是那种初学者的作品
## 检查规则
### 检查规则
- 有时候我们不想让我们的makefile中的规则执行起来我们只想检查一下我们的命令或是执行的序列。于是我们可以使用make命令的下述参数
- "-n" "--just-print" "--dry-run" "--recon" 不执行参数这些参数只是打印命令不管目标是否更新把规则和连带规则下的命令打印出来但不执行这些参数对于我们调试makefile很有用处。
- "-t" "--touch" 这个参数的意思就是把目标文件的时间更新但不更改目标文件。也就是说make假装编译目标但不是真正的编译目标只是把目标变成已编译过的状态。
@ -1391,7 +1391,7 @@ categories: ["dev/ops"]
- "-W <file>" "--what-if=<file>" "--assume-new=<file>" "--new-file=<file>" 这个参数需要指定一个文件。一般是是源文件或依赖文件Make会根据规则推导来运行依赖于这个文件的命令一般来说可以和"-n"参数一同使用,来查看这个依赖文件所发生的规则命令。
- 另外一个很有意思的用法是结合"-p"和"-v"来输出makefile被执行时的信息这个将在后面讲述
## make的参数
### make的参数
- 下面列举了所有GNU make 3.80版的参数定义。其它版本和产商的make大同小异不过其它产商的make的具体参数还是请参考各自的产品文档。
- "-b" "-m" 这两个参数的作用是忽略和其它版本make的兼容性。
- "-B" "--always-make" 认为所有的目标都需要更新(重编译)。
@ -1428,12 +1428,12 @@ categories: ["dev/ops"]
- "-W <file>" "--what-if=<file>" "--new-file=<file>" "--assume-file=<file>" 假定目标<file>需要更新,如果和"-n"选项使用,那么这个参数会输出该目标更新时的运行动作。如果没有"-n"那么就像运行UNIX的"touch"命令一样,使得<file>的修改时间为当前时间。
- "--warn-undefined-variables" 只要make发现有未定义的变量那么就输出警告信息。
# 隐含规则
## 隐含规则
- "隐含规则"也就是一种惯例make会按照这种"惯例"心照不喧地来运行那怕我们的Makefile中没有书写这样的规则。例如把[.c]文件编译成[.o]文件这一规则你根本就不用写出来make会自动推导出这种规则并生成我们需要的[.o]文件。
- "隐含规则"会使用一些我们系统变量,我们可以改变这些系统变量的值来定制隐含规则的运行时的参数。如系统变量"CFLAGS"可以控制编译时的编译器参数。
- 我们还可以通过"模式规则"的方式写下自己的隐含规则。用"后缀规则"来定义隐含规则会有许多的限制。使用"模式规则"会更回得智能和清楚,但"后缀规则"可以用来保证我们Makefile的兼容性。
## 使用隐含规则
### 使用隐含规则
- 如果要使用隐含规则生成你需要的目标你所需要做的就是不要写出这个目标的规则。那么make会试图去自动推导产生这个目标的规则和命令如果make可以自动推导生成这个目标的规则和命令那么这个行为就是隐含规则的自动推导。当然隐含规则是make事先约定好的一些东西。例如我们有下面的一个Makefile
```makefile
foo : foo.o bar.o
@ -1456,7 +1456,7 @@ categories: ["dev/ops"]
```
- 依赖文件"foo.p"Pascal程序的源文件有可能变得没有意义。如果目录下存在了"foo.c"文件,那么我们的隐含规则一样会生效,并会通过 "foo.c"调用C的编译器生成foo.o文件。因为在隐含规则中Pascal的规则出现在C的规则之后所以make找到可以生成foo.o的 C的规则就不再寻找下一条规则了。如果你确实不希望任何隐含规则推导那么你就不要只写出"依赖规则",而不写命令。
## 隐含规则一览
### 隐含规则一览
- 这里我们将讲述所有预先设置也就是make内建的隐含规则如果我们不明确地写下规则那么make就会在这些规则中寻找所需要规则和命令。当然我们也可以使用make的参数"-r"或"--no-builtin-rules"选项来取消所有的预设置的隐含规则。
- 当然,即使是我们指定了"-r"参数,某些隐含规则还是会生效,因为有许多的隐含规则都是使用了"后缀规则"来定义的,所以,只要隐含规则中有"后缀列表 "(也就一系统定义在目标.SUFFIXES的依赖目标那么隐含规则就会生效。默认的后缀列表是.out,.a, .ln, .o, .c, .cc, .C, .p, .f, .F, .r, .y, .l, .s, .S, .mod, .sym, .def, .h, .info, .dvi, .tex, .texinfo, .texi, .txinfo, .w, .ch .web, .sh, .elc, .el。具体的细节我们会在后面讲述。
- 常用的隐含规则
@ -1530,7 +1530,7 @@ categories: ["dev/ops"]
- 从C程序、Yacc文件或Lex文件创建Lint库的隐含规则。
"<n>.ln" lint生成的文件的依赖文件被自动推导为"n.c",其生成命令是:"$(LINT) $(LINTFALGS) $(CPPFLAGS) -i"。对于"<n>.y"和"<n>.l"也是同样的规则。
## 隐含规则使用的变量
### 隐含规则使用的变量
- 在隐含规则中的命令中基本上都是使用了一些预先设置的变量。你可以在你的makefile中改变这些变量的值或是在make的命令行中传入这些值或是在你的环境变量中设置这些值无论怎么样只要设置了这些特定的变量那么其就会对隐含规则起作用。当然你也可以利用make的"-R"或"--no builtin-variables"参数来取消你所定义的变量对隐含规则的作用。
- 例如,第一条隐含规则 编译C程序的隐含规则的命令是"$(CC) c $(CFLAGS) $(CPPFLAGS)"。Make默认的编译命令是"cc",如果你把变量"$(CC)"重定义成"gcc",把变量"$(CFLAGS)"重定义成 "-g",那么,隐含规则中的命令全部会以"gcc c -g $(CPPFLAGS)"的样子来执行了。
- 我们可以把隐含规则中使用的变量分成两种:一种是命令相关的,如"CC";一种是参数
@ -1571,7 +1571,7 @@ categories: ["dev/ops"]
- RFLAGS Ratfor 程序的Fortran 编译器参数。
- YFLAGS Yacc文法分析器参数。
## 隐含规则链
### 隐含规则链
- 有些时候,一个目标可能被一系列的隐含规则所作用。例如,一个[.o]的文件生成可能会是先被Yacc的[.y]文件先成[.c]然后再被C的编译器生成。我们把这一系列的隐含规则叫做"隐含规则链"。
- 在上面的例子中,如果文件[.c]存在那么就直接调用C的编译器的隐含规则如果没有[.c]文件,但有一个[.y]文件那么Yacc的隐含规则会被调用生成[.c]文件然后再调用C编译的隐含规则最终由[.c]生成[.o]文件,达到目标。
- 在默认情况下,对于中间目标,它和一般的目标有两个地方所不同:第一个不同是除非中间的目标不存在,才会引发中间规则。第二个不同的是,只要目标成功产生,那么,产生最终目标过程中,所产生的中间目标文件会被以"rm -f"删除。
@ -1580,11 +1580,11 @@ categories: ["dev/ops"]
- 在"隐含规则链"中禁止同一个目标出现两次或两次以上这样一来就可防止在make自动推导时出现无限递归的情况。
- Make 会优化一些特殊的隐含规则,而不生成中间文件。如,从文件"foo.c"生成目标程序"foo"按道理make会编译生成中间文件"foo.o",然后链接成"foo",但在实际情况下,这一动作可以被一条"cc"的命令完成cc o foo foo.c于是优化过的规则就不会生成中间文件。
## 定义模式规则
### 定义模式规则
- 你可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般的规则,只是在规则中,目标的定义需要有"%"字符。"%"的意思是表示一个或多个任意字符。在依赖目标中同样可以使用"%",只是依赖目标中的"%"的取值,取决于其目标。
- 有一点需要注意的是,"%"的展开发生在变量和函数的展开之后变量和函数的展开发生在make载入Makefile时而模式规则中的"%"则发生在运行时。
### 模式规则介绍
#### 模式规则介绍
- 模式规则中,至少在规则的目标定义中要包含"%",否则,就是一般的规则。目标中的"%"定义表示对文件名的匹配,"%"表示长度任意的非空字符串。例如:"%.c"表示以".c"结尾的文件名文件名的长度至少为3而"s.%.c"则表示以"s."开头,".c"结尾的文件名(文件名的长度至少为 5
- 如果"%"定义在目标中,那么,目标中的"%"的值决定了依赖目标中的"%"的值,也就是说,目标中的模式的"%"决定了依赖目标中"%"的样子。例如有一个模式规则如下:
```makefile
@ -1593,7 +1593,7 @@ categories: ["dev/ops"]
- 其含义是,指出了怎么从所有的[.c]文件生成相应的[.o]文件的规则。如果要生成的目标是"a.o b.o",那么"%c"就是"a.c b.c"。
- 一旦依赖目标中的"%"模式被确定那么make会被要求去匹配当前目录下所有的文件名一旦找到make就会规则下的命令所以在模式规则中目标可能会是多个的如果有模式匹配出多个目标make就会产生所有的模式目标此时make关心的是依赖的文件名和生成目标的命令这两件事。
### 模式规则示例
#### 模式规则示例
- 下面这个例子表示了,把所有的[.c]文件都编译成[.o]文件.
```makefile
%.o : %.c
@ -1607,7 +1607,7 @@ categories: ["dev/ops"]
```
- 这条规则告诉make把所有的[.y]文件都以"bison -d <n>.y"执行,然后生成"<n>.tab.c"和"<n>.tab.h"文件。(其中,"<n>" 表示一个任意字符串)。如果我们的执行程序"foo"依赖于文件"parse.tab.o"和"scan.o",并且文件"scan.o"依赖于文件"parse.tab.h",如果"parse.y"文件被更新了,那么根据上述的规则,"bison -d parse.y"就会被执行一次,于是,"parse.tab.o"和"scan.o"的依赖文件就齐了。(假设,"parse.tab.o" 由"parse.tab.c"生成,和"scan.o"由"scan.c"生成,而"foo"由"parse.tab.o"和"scan.o"链接生成而且foo和其[.o]文件的依赖关系也写好,那么,所有的目标都会得到满足)
### 自动化变量
#### 自动化变量
- 在上述的模式规则中,目标和依赖文件都是一系例的文件,那么我们如何书写一个命令来完成从不同的依赖文件生成相应的目标?因为在每一次的对模式规则的解析时,都会是不同的目标和依赖文件。
- 自动化变量就是完成这个功能的。在前面,我们已经对自动化变量有所提涉,相信你看到这里已对它有一个感性认识了。所谓自动化变量,就是这种变量会把模式中所定义的一系列的文件自动地挨个取出,直至所有的符合模式的文件都取完了。这种自动化变量只应出现在规则的命令中。
- 下面是所有的自动化变量及其说明:
@ -1636,11 +1636,11 @@ categories: ["dev/ops"]
- 最后想提醒一下的是,对于"$<",为了避免产生不必要的麻烦,我们最好给$后面的那个特定字符都加上圆括号,比如,"$(< )"就要比"$<"要好一些。
- 还得要注意的是,这些变量只使用在规则的命令中,而且一般都是"显式规则"和"静态模式规则"(参见前面"书写规则"一章)。其在隐含规则中并没有意义。
## 模式的匹配
### 模式的匹配
- 一般来说,一个目标的模式有一个有前缀或是后缀的"%",或是没有前后缀,直接就是一个"%"。因为"%"代表一个或多个字符,所以在定义好了的模式中,我们把"%"所匹配的内容叫做"茎",例如"%.c"所匹配的文件"test.c"中"test"就是"茎"。因为在目标和依赖目标中同时有"%"时,依赖目标的"茎"会传给目标,当做目标中的"茎"。
- 当一个模式匹配包含有斜杠(实际也不经常包含)的文件时,那么在进行模式匹配时,目录部分会首先被移开,然后进行匹配,成功后,再把目录加回去。在进行"茎"的传递时,我们需要知道这个步骤。例如有一个模式"e%t",文件"src/eat" 匹配于该模式,于是"src/a"就是其"茎",如果这个模式定义在依赖目标中,而被依赖于这个模式的目标中又有个模式"c%r",那么,目标就是"src/car"。("茎"被传递)
## 重载内建隐含规则
### 重载内建隐含规则
- 你可以重载内建的隐含规则(或是定义一个全新的),例如你可以重新构造和内建隐含规则不同的命令,如:
```makefile
%.o : %.c
@ -1652,7 +1652,7 @@ categories: ["dev/ops"]
```
- 同样,你也可以重新定义一个全新的隐含规则,其在隐含规则中的位置取决于你在哪里写下这个规则。朝前的位置就靠前。
# 老式风格的"后缀规则"
## 老式风格的"后缀规则"
- 后缀规则是一个比较老式的定义隐含规则的方法。后缀规则会被模式规则逐步地取代。因为模式规则更强更清晰。为了和老版本的Makefile兼容GNU make同样兼容于这些东西。后缀规则有两种方式"双后缀"和"单后缀"。
- 双后缀规则定义了一对后缀:目标文件的后缀和依赖目标(源文件)的后缀。如".c.o"相当于"%o : %c"。单后缀规则只定义一个后缀,也就是源文件的后缀。如".c"相当于"% : %.c"。
- 后缀规则中所定义的后缀应该是make所认识的如果一个后缀是make所认识的那么这个规则就是单后缀规则而如果两个连在一起的后缀都被make所认识那就是双后缀规则。例如".c"和".o"都是make所知道。因而如果你定义了一个规则是".c.o"那么其就是双后缀规则,意义就是".c" 是源文件的后缀,".o"是目标文件的后缀。如下示例:
@ -1676,7 +1676,7 @@ categories: ["dev/ops"]
- .SUFFIXES: .c .o .h # 定义自己的后缀,先清楚默认后缀,后定义自己的后缀列表。
- make的参数"-r"或"-no-builtin-rules"也会使用得默认的后缀列表为空。而变量"SUFFIXE"被用来定义默认的后缀列表,你可以用".SUFFIXES"来改变后缀列表,但请不要改变变量"SUFFIXE"的值。
# 隐含规则搜索算法
## 隐含规则搜索算法
- 比如我们有一个目标叫 T。下面是搜索目标T的规则的算法。请注意在下面我们没有提到后缀规则原因是所有的后缀规则在Makefile被载入内存时会被转换成模式规则。如果目标是"archive(member)"的函数库文件模式那么这个算法会被运行两次第一次是找目标T如果没有找到的话那么进入第二次第二次会把"member"当作T来搜索。
- 把T的目录部分分离出来。叫D而剩余部分叫N。如果T是"src/foo.o"那么D就是"src/"N就是"foo.o"
- 创建所有匹配于T或是N的模式规则列表。
@ -1696,10 +1696,10 @@ categories: ["dev/ops"]
- 如果没有隐含规则可以使用,查看".DEFAULT"规则,如果有,采用,把".DEFAULT"的命令给T使用。
- 一旦规则被找到,就会执行其相当的命令,而此时,我们的自动化变量的值才会生成。
# 使用make更新函数库文件
## 使用make更新函数库文件
- 函数库文件也就是对Object文件程序编译的中间文件的打包文件。在Unix下一般是由命令"ar"来完成打包工作。
## 函数库文件的成员
### 函数库文件的成员
- 一个函数库文件由多个文件组成。你可以以如下格式指定函数库文件及其组成:
- archive(member) 这个不是一个命令,而一个目标和依赖的定义。一般来说,这种用法基本上就是为了"ar"命令来服务的。如:
```makefile
@ -1719,7 +1719,7 @@ categories: ["dev/ops"]
foolib(*.o)
```
## 函数库成员的隐含规则
### 函数库成员的隐含规则
- 当 make搜索一个目标的隐含规则时一个特殊的特性是如果这个目标是"a(m)"形式的,其会把目标变成"(m)"。于是,如果我们的成员是"%.o" 的模式定义,并且如果我们使用"make foo.a(bar.o)"的形式调用Makefile时隐含规则会去找"bar.o"的规则如果没有定义bar.o的规则那么内建隐含规则生效make会去找bar.c文件来生成bar.o如果找得到的话make执行的命令大致如下
```makefile
cc -c bar.c -o bar.o
@ -1728,7 +1728,7 @@ categories: ["dev/ops"]
```
- 还有一个变量要注意的是"$%",这是专属函数库文件的自动化变量,有关其说明请参见"自动化变量"一节。
## 函数库文件的后缀规则
### 函数库文件的后缀规则
- 你可以使用"后缀规则"和"隐含规则"来生成函数库打包文件,如:
```makefile
.c.a:
@ -1744,7 +1744,7 @@ categories: ["dev/ops"]
$(RM) $*.o
```
# 注意事项
## 注意事项
- 在进行函数库打包文件生成时请小心使用make的并行机制"-j"参数。如果多个ar命令在同一时间运行在同一个函数库打包文件上就很有可以损坏这个函数库文件。所以在make未来的版本中应该提供一种机制来避免并行操作发生在函数打包文件上。
- 但就目前而言,你还是应该不要尽量不要使用"-j"参数。

View File

@ -6,7 +6,7 @@ tags: ["mariadb", "galera"]
categories: ["database"]
---
# 环境
## 环境
cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB
---- | ---- | ---- | ---- | ---- | ---- | ----
双核 | 2GB | mariadb_1 | 10.0.0.231 | 10.10.10.1 | 7.5 | 10.1.33
@ -14,8 +14,8 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB
双核 | 2GB | mariadb_3 | 10.0.0.233 | 10.10.10.3 | 7.5 | 10.1.33
# 安装数据库
## 离线安装
## 安装数据库
### 离线安装
- [下载 rpm](http://yum.mariadb.org/10.1/centos7-amd64/rpms/)
- MariaDB-10.1.33-centos7-x86_64-client.rpm
- MariaDB-10.1.33-centos7-x86_64-common.rpm
@ -33,7 +33,7 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB
mysql_install_db --user=mysql
```
## yum 安装
### yum 安装
- 创建 MariaDB-10.1 的 yum 源文件(就近选择一个)
```bash
#官方
@ -68,12 +68,12 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB
# galera_4 会作为依赖自动安装
```
# 启动server
## 启动server
```bash
systemctl start mariadb
```
# 安全设置
## 安全设置
- 设置root账户密码推荐
```bash
mysqladmin -u root password 'password'
@ -83,7 +83,7 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB
mysql_secure_installation
```
# 配置Galera Cluster
## 配置Galera Cluster
- 修改/etc/my.cnf.d/server.cnf如下
```
[server]
@ -114,12 +114,12 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB
[mariadb-10.1]
```
# 停止 server
## 停止 server
```bash
systemctl stop mariadb
```
# 启动集群
## 启动集群
- 启动 galera cluster
```bash
mysqld --wsrep-new-cluster --user=mysql
@ -137,7 +137,7 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MariaDB
show status like 'wsrep_%';
```
# 注意事项
## 注意事项
- 防火墙开放 3306、4444 和 4567 端口
- 关闭 selinux
- 集群关闭时,/var/lib/mysql/grastate.dat 文件中 safe_to_bootstrap 项为 1 的节点服务器是最后关闭的数据库,数据最全,所以下次集群启动时应从这台节点服务器启动

View File

@ -6,19 +6,19 @@ tags: ["mariadb", "master", "slave", "gtid", "replication", "同步"]
categories: ["database"]
---
# 环境
## 环境
- mariadb 主服务器centos7.8192.168.1.141
- mariadb 主服务器centos7.8192.168.1.142
- mariadb 从服务器centos7.8192.168.1.143
- 忽略系统数据库: information_schema, mysql, performance_schema
# 在两个主服务器上创建用于备份的用户 replicator
## 在两个主服务器上创建用于备份的用户 replicator
```sql
grant replication slave on *.* to 'replicator'@'%' identified by 'password';
flush privileges;
```
# 在两个主服务器上修改 my.cnf
## 在两个主服务器上修改 my.cnf
```
# 唯一 ID
# 192.168.1.141 配置
@ -53,7 +53,7 @@ categories: ["database"]
# 该环境中,双主配合 keepalived 实现高可用,无需配置自增
```
# 开启互主同步
## 开启互主同步
```sql
-- 在 192.168.1.141 上启动 mariadb配置同步 192.168.1.142:
change master to master_host = '192.168.1.142',
@ -70,7 +70,7 @@ categories: ["database"]
master_use_gtid = slave_pos;
```
# 在两个主服务器上启动 slave ,查看 slave 状态
## 在两个主服务器上启动 slave ,查看 slave 状态
```sql
start slave;
-- 查看 slave 状态
@ -81,7 +81,7 @@ categories: ["database"]
-- 则表示 slave 开启成功!
```
# 在从服务器上编辑 my.cnf
## 在从服务器上编辑 my.cnf
```
# 唯一 ID
server-id = 143
@ -98,7 +98,7 @@ categories: ["database"]
slave-parallel-threads = 4
```
# 开启同步
## 开启同步
```sql
change master 'db141' to master_host = '192.168.1.141',
master_port = 3306,
@ -113,7 +113,7 @@ categories: ["database"]
master_use_gtid = slave_pos;
```
# 在从服务器上启动 slave ,查看 slave 状态
## 在从服务器上启动 slave ,查看 slave 状态
```sql
start all slaves;
-- 在从服务器上查看 slave 状态
@ -124,7 +124,7 @@ categories: ["database"]
-- 则表示 slave 开启成功!
```
# 参考
## 参考
- [MariaDB 复制](https://mariadb.com/kb/en/standard-replication/)
- [MariaDB 多源复制](https://mariadb.com/kb/en/multi-source-replication/)

View File

@ -7,12 +7,12 @@ tags: ["minio"]
categories: ["storage"]
---
# 部署单节点分布式存储
## 环境
## 部署单节点分布式存储
### 环境
- 服务器 IP: 192.168.1.10
- 自定义域名: X.X.X
## 安装 minio
### 安装 minio
- 下载
```bash
curl -L -o /usr/local/bin/minio https://dl.min.io/server/minio/release/linux-amd64/minio
@ -50,7 +50,7 @@ categories: ["storage"]
WantedBy=multi-user.target
```
## 启动 minio
### 启动 minio
- 配置开机自动启动
```bash
systemctl daemon-reload
@ -62,8 +62,8 @@ categories: ["storage"]
systemctl start monio
```
# 部署多节点分布式存储
## 环境
## 部署多节点分布式存储
### 环境
自定义域名 | 网卡 IP | 硬盘槽 | 数据分区
---- | ---- | ---- | ----
X1.X.X | eth0: 192.168.1.11<br>eth1:10.0.0.11 | 8 个 | /dev/sdb1, /dev/sdc1<br>/dev/sdd1, /dev/sde1
@ -76,7 +76,7 @@ X4.X.X | eth0: 192.168.1.14<br>eth1:10.0.0.14 | 8 个 | /dev/sdb1, /dev/sd
- 每台服务器有 8 个硬盘槽,这里先各用 4 个组成 server pool运行 minio 集群
- 每台服务器剩下的 4 个硬盘槽用于后面的扩容操作
## 挂载数据分区
### 挂载数据分区
- 在全部服务器上执行如下操作
- 挂载硬盘
```bash
@ -89,7 +89,7 @@ X4.X.X | eth0: 192.168.1.14<br>eth1:10.0.0.14 | 8 个 | /dev/sdb1, /dev/sd
- 建议在 fstab 中配置开机自动挂载
## 安装 minio
### 安装 minio
- 在全部服务器上执行如下操作
- 下载
```bash
@ -126,7 +126,7 @@ X4.X.X | eth0: 192.168.1.14<br>eth1:10.0.0.14 | 8 个 | /dev/sdb1, /dev/sd
WantedBy=multi-user.target
```
## 启动 minio
### 启动 minio
- 在全部服务器上执行如下操作
- 配置开机自动启动
```bash
@ -139,8 +139,8 @@ X4.X.X | eth0: 192.168.1.14<br>eth1:10.0.0.14 | 8 个 | /dev/sdb1, /dev/sd
systemctl start monio
```
# 扩容多节点分布式存储
## 加装硬盘
## 扩容多节点分布式存储
### 加装硬盘
- 在全部服务器上执行如下操作
- 在每台服务器上个增加四个新硬盘,每个硬盘创建一个分区,格式化
- 挂载新增的硬盘分区
@ -154,7 +154,7 @@ X4.X.X | eth0: 192.168.1.14<br>eth1:10.0.0.14 | 8 个 | /dev/sdb1, /dev/sd
- 建议在 fstab 中配置开机自动挂载
## 扩容
### 扩容
- 在全部服务器上执行如下操作
- 停止 minio 服务
```bash
@ -187,7 +187,7 @@ X4.X.X | eth0: 192.168.1.14<br>eth1:10.0.0.14 | 8 个 | /dev/sdb1, /dev/sd
systemctl start minio
```
# 客户端常用操作
## 客户端常用操作
- 创建 alias**注意这里是 api 调用,要用 eth0 网卡 ip**
```bash
mc alias set XXX http://192.168.1.X:9000 XXX XXXXXXXX

View File

@ -7,8 +7,8 @@ tags: ["mongodb"]
categories: ["database"]
---
# 数据迁移
## 导出集合数据到 json 或 csv 文件
## 数据迁移
### 导出集合数据到 json 或 csv 文件
- 命令
```
mongoexport -d dbname -c collectionname -o file --type json/csv -f "field1,field2,...,fieldN"
@ -20,7 +20,7 @@ categories: ["database"]
- --type 输出格式,默认 json
- -f 输出字段,如果导出 csv需指定字段名
## 导入数据到集合
### 导入数据到集合
- 命令
```
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f "field1,field2,...,fieldN"
@ -33,7 +33,7 @@ categories: ["database"]
- --headerline 导入csv时使用第一行的标题作为导入字段
- --file 导入的文件
## 备份数据库
### 备份数据库
- 命令
```
mongodump -h dbhost -d dbname -o backup_dir
@ -43,7 +43,7 @@ categories: ["database"]
- -d 数据库名
- -o 备份数据存放目录,需提前建立
## 恢复数据库
### 恢复数据库
- 命令
```
mongorestore -h dbhost -d dbname --dir backup_dir
@ -55,28 +55,28 @@ categories: ["database"]
--drop 恢复前,先删除当前数据
# 操作数据库
## 操作数据库
- 默认数据库 test
- 创建 use dbname
- 查看当前选择的数据库 db
- 查看数据库列表 show dbs不显示空数据库
- 删除数据库 use dbname; db.dropDatabase()
# 操作集合
## 创建
## 操作集合
### 创建
```
db.createCollection("集合名", {capped:false, autoIndexId:false, size:最大字节, max:文档最多数量})
# 或者在插入文档时自动创建
## 或者在插入文档时自动创建
db.集合名.inert({})
```
## 删除
### 删除
```
db.集合名.drop()
```
# 操作文档
## insert
## 操作文档
### insert
- 插入一个文档
```
db.集合名.insert({})
@ -90,7 +90,7 @@ db.集合名.drop()
db.集合名.insertMany([{},{},{},...,{}])
```
## find
### find
- 查询匹配的文档
```
db.集合名.find({}).pretty()
@ -124,7 +124,7 @@ db.集合名.drop()
db.集合名.find({}).sort({"key":1})
```
## update
### update
- 更新一个文档
```
db.集合名.update({},{$set:{}})
@ -134,12 +134,12 @@ db.集合名.drop()
db.集合名.update({},{$set:{},{multi:true}})
```
## save
### save
```
db.集合名.save({,...})
```
## remove
### remove
- 删除多条记录
```
db.集合名.remove({})
@ -153,19 +153,19 @@ db.集合名.save({,...})
db.集合名.remove()
```
## 索引
### 索引
- 创建索引1升序-1降序
```
db.集合名.createIndex({"key1":1,"key2":-1})
```
## 聚合
### 聚合
```
db.集合名.aggregate([{}])
```
# 用户
## 创建用户
## 用户
### 创建用户
- 管理员权限
```
use admin
@ -189,23 +189,23 @@ db.集合名.aggregate([{}])
)
```
## 验证身份
### 验证身份
```
db.auth("username", "password")
```
## 列出所有用户
### 列出所有用户
```
db.getUsers()
```
## 删除数据库用户
### 删除数据库用户
```
use testdb
db.dropUser("username")
```
## 更改用户密码
### 更改用户密码
```
db.updateUser(
"username",

View File

@ -7,7 +7,7 @@ tags: ["mysql", "binlog"]
categories: ["database"]
---
# MySQL 5.7 开启 binlog
## MySQL 5.7 开启 binlog
- 修改 my.cnf 文件
```
[mysqld]
@ -21,7 +21,7 @@ categories: ["database"]
#binlog-ignore-db=db2
```
# 常用操作
## 常用操作
- 查看所有 binlog 文件列表
```sql
show master logs;
@ -46,7 +46,7 @@ categories: ["database"]
reset master
```
# 使用 mysqlbinlog 命令查看 binlog 文件的内容
## 使用 mysqlbinlog 命令查看 binlog 文件的内容
- 使用
```bash
# 查看日志
@ -61,7 +61,7 @@ categories: ["database"]
- --stop-datetime="2018-08-09 12:00:00" 结束时间
- --database=db_name 只恢复 db_name 数据库
# 使用 sql 查看 binlog 文件的内容
## 使用 sql 查看 binlog 文件的内容
- 查询语句
```sql
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
@ -72,7 +72,7 @@ categories: ["database"]
- offset 偏移 pos 个数
- row_count 查询数量
# 调整 binlog_cache_size
## 调整 binlog_cache_size
- 查看当前 binlog_cache_size 大小(byte),默认 32k
```sql
show variables like 'binlog_cache_size';

View File

@ -7,7 +7,7 @@ tags: ["cache", "mysql", "缓存"]
categories: ["database"]
---
# MySQL 超时
## MySQL 超时
- connect_timeout 与客户端连接建立超时默认10秒
- interactive_timeout 交互终端超时断开默认28800秒
- wait_timeout 非交互终端超时断开默认28800秒
@ -17,7 +17,7 @@ categories: ["database"]
- innodb_rollback_on_timeout 超时后回滚整个事务操作默认OFF
- slave_net_timeout 从库读取binlog失败后等待指定秒后重新连接主库默认60秒
# 查询缓存配置
## 查询缓存配置
** MySQL 8.0 已关闭该功能 **
- have_query_cache 是否支持查询缓存默认yes
- query_cache_limit select结果集大于该值时不缓存默认1048576
@ -31,7 +31,7 @@ categories: ["database"]
- 0(OFF) 锁表后,该表的查询缓存依旧有效,默认
- 1(ON) 锁表后,该表的查询缓存失效
# 查询缓存状态
## 查询缓存状态
** MySQL 8.0 已关闭该功能 **
- Qcache_free_blocks 查询缓存中的内存碎片数量
- 碎片过多表明查询结果集较小可适当减小query_cache_min_res_unit
@ -51,40 +51,40 @@ categories: ["database"]
- Com_select 执行过的select语句数量
- 查询缓存的命中率 = Qcache_hits / Com_select * 100%
# 排序缓存配置
## 排序缓存配置
- sort_buffer_size 排序缓存大小默认262144
- max_length_for_sort_data 排序sql中的全部字段长度总和小于该值时使用优化排序方式否则使用常规排序方式默认1024
- [参考](https://www.cnblogs.com/moss_tan_jun/p/6021822.html)
- max_sort_length 使用列的前(默认1024)个字节排序
- innodb_sort_buffer_size InnoDB用于创建/重建索引的排序缓存默认1048576
# 排序缓存状态
## 排序缓存状态
- Sort_merge_passes 使用临时文件完成排序操作的次数
- 增加sort_buffer_size可减少使用临时文件排序的次数
- Sort_range 使用范围排序的次数
- Sort_rows 已经排序的记录行数
- Sort_scan 通过全表扫描完成排序的次数
# join 连接缓存
## join 连接缓存
- join_buffer_size 两表join但不能使用索引时为每张表分配的连接缓存默认262144
- 尽量实现索引join
# 表/表结构 缓存配置
## 表/表结构 缓存配置
- table_open_cache 可以缓存表和视图的数量
- table_defination_cache 可以存储的表结构数量
- open_files_limit 可以打开的文件数量
# InnoDB 重做日志缓存配置
## InnoDB 重做日志缓存配置
- innodb_log_buffer_size 事务提交前,把重做日志写入缓存中
- innodb_flush_log_at_trx_commit
- 0 每隔一秒,把日志缓存写到日志文件,并刷新到磁盘
- 1 每次提交时,把日志缓存写到日志文件,并刷新到磁盘
- 2 每次提交是,把日志缓存写到日志文件,每隔一秒刷新到磁盘
# InnoDB 预读配置
## InnoDB 预读配置
- innodb_read_ahead_threshold 预读的前后数据库个数
# FLUSH 语句
## FLUSH 语句
- HOSTS 清空主机表
- LOGS 关闭binlog文件创建新编号binlog文件
- PRIVILEGES 从数据库授权表中重新装载权限到缓存中

View File

@ -7,14 +7,14 @@ tags: ["mysql", "galera"]
categories: ["database"]
---
# 环境
## 环境
cpu | mem | hostname | public ip | cluster ip | CentOS | MySQL
---- | ---- | ---- | ---- | ---- | ---- | ----
双核 | 2GB | mysql_1 | 10.0.0.231 | 10.10.10.1 | 7.5 | 5.7
双核 | 2GB | mysql_2 | 10.0.0.232 | 10.10.10.2 | 7.5 | 5.7
双核 | 2GB | mysql_3 | 10.0.0.233 | 10.10.10.3 | 7.5 | 5.7
# 创建 galera yum 源文件
## 创建 galera yum 源文件
```bash
cat > /etc/yum.repos.d/galera.repo <<-END
[galera]
@ -31,12 +31,12 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MySQL
END
```
# 安装
## 安装
```bash
yum install galera-3 mysql-wsrep-5.7 rsync
```
# 修改 /etc/my.cnf
## 修改 /etc/my.cnf
```
[mysqld]
datadir=/var/lib/mysql
@ -64,14 +64,14 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MySQL
!includedir /etc/my.cnf.d/
```
# 随机选择一个节点,使用专用脚本 mysqld_bootstrap 初始化集群
## 随机选择一个节点,使用专用脚本 mysqld_bootstrap 初始化集群
```bash
/usr/bin/mysqld_bootstrap
# 该命令会启动本机的 mysqld 服务
systemctl status mysqld
```
# 查找密码,修改初始密码
## 查找密码,修改初始密码
```bash
grep -i password /var/log/messages
# 记录输出的密码
@ -79,17 +79,17 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MySQL
# 根据提示输入上一步输出的密码
```
# 在其他节点上启动 mysqld 服务
## 在其他节点上启动 mysqld 服务
```bash
systemctl start mysqld
```
# 查看集群节点数量
## 查看集群节点数量
```sql
show status like 'wsrep_cluster_size';
```
# ssl 加密同步数据(不推荐,存在性能损失)
## ssl 加密同步数据(不推荐,存在性能损失)
- 生成证书
```bash
mkdir /etc/my.cnf.d/ssl && cd /etc/my.cnf.d/ssl
@ -112,6 +112,6 @@ cpu | mem | hostname | public ip | cluster ip | CentOS | MySQL
- 重新启动集群
# ssl 加密客户端(不推荐,存在性能损失)
## ssl 加密客户端(不推荐,存在性能损失)
- MySQL 5.7 server 自带 ssl 加密,客户端连接时,指定参数 --ssl-mode=required 即可

View File

@ -6,17 +6,17 @@ tags: ["mysql", "group", "replication", "组复制"]
categories: ["database"]
---
# 环境
## 环境
hostname | ip | os | mysql
---- | ---- | ---- | ----
mysql_11 | 192.168.1.11 | centos7.7 | 8.0.19
mysql_22 | 192.168.1.22 | centos7.7 | 8.0.19
mysql_33 | 192.168.1.33 | centos7.7 | 8.0.19
# 安装 mysql
## 安装 mysql
- 懒得写了 ...
# 修改 my.cnf
## 修改 my.cnf
```
# mysql_11(选择一个)
server-id = 11
@ -78,7 +78,7 @@ mysql_33 | 192.168.1.33 | centos7.7 | 8.0.19
group-replication-exit-state-action = OFFLINE_MODE
```
# 初始化集群
## 初始化集群
- 重新启动节点 mysql_11
```bash
systemctl restart mysqld
@ -116,7 +116,7 @@ mysql_33 | 192.168.1.33 | centos7.7 | 8.0.19
- 修改 my.cnf配置 group-replication-start-on-boot = ON
# 增加节点
## 增加节点
- 重新启动节点 mysql_22
```bash
systemctl restart mysql_22
@ -153,6 +153,6 @@ mysql_33 | 192.168.1.33 | centos7.7 | 8.0.19
- 修改 mysql_22 和 mysql_33 的 my.cnf配置 group-replication-start-on-boot = ON
# 注意
## 注意
- 每张表都必须显式指定主键

View File

@ -6,18 +6,18 @@ tags: ["mysql", "master", "slave", "gtid", "replication", "同步"]
categories: ["database"]
---
# 环境
## 环境
- mysql 主服务器centos7.4192.168.1.10,端口 10000
- mysql 从服务器centos7.4192.168.1.6
- 要复制的数据库有 data_db、conf_db
# 在主服务器上创建用于备份的用户 replicator
## 在主服务器上创建用于备份的用户 replicator
```sql
grant replication slave on *.* to 'replicator'@'192.168.1.6' identified by 'password';
flush privileges;
```
# 在主服务器上修改 my.cnf
## 在主服务器上修改 my.cnf
```
# 建议与本机ip地址最后一位一致,与其他互备服务器均不一致
server-id = 10
@ -43,14 +43,14 @@ categories: ["database"]
#auto-increment-increment =
```
# 在主服务器上重启 mysql获取 master 状态
## 在主服务器上重启 mysql获取 master 状态
```sql
-- 如果 mysql 是全新安装,则无须导出数据库初态,直接查看 binlog pos 即可
-- 锁定要导出的数据库表
flush tables with read lock;
```
# 导出数据库初态
## 导出数据库初态
```bash
# 在主服务器的另一个终端中运行
mysqldump -uroot -p data_db > /tmp/data_db.sql
@ -59,7 +59,7 @@ categories: ["database"]
scp /tmp/data_db.sql /tmp/conf_db.sql 192.168.1.6:/tmp/
```
# 查看 binary 日志位置
## 查看 binary 日志位置
```sql
show master status\G
-- 记住输出里的如下类似两行不记录也可以这两个信息已经写入了导出的sql文件中
@ -69,7 +69,7 @@ categories: ["database"]
unlock tables;
```
# 在从服务器上编辑 my.cnf
## 在从服务器上编辑 my.cnf
```
# 建议与本机ip地址最后一位一致,与其他互备服务器均不一致
server-id = 6
@ -106,20 +106,20 @@ categories: ["database"]
#auto-increment-increment =
```
# 在从服务器上重启 mysql导入初态
## 在从服务器上重启 mysql导入初态
```sql
-- 创建要导入的数据库
create database data_db default charset utf8mb4;
create database conf_db default charset utf8mb4;
```
# 导入数据库
## 导入数据库
```bash
msyql -uroot -p data_db < /tmp/data_db.sql
mysql -uroot -p conf_db < /tmp/conf_db.sql
```
# 开启同步
## 开启同步
```sql
-- 基于 binlog 文件位置复制
change master to master_host = '192.168.1.10',
@ -137,7 +137,7 @@ categories: ["database"]
master_auto_position = 1;
```
# 启动 slave查看 slave 状态
## 启动 slave查看 slave 状态
```sql
start slave;
-- 在从服务器上查看 slave 状态
@ -148,7 +148,7 @@ categories: ["database"]
-- 则表示 slave 开启成功!
```
# MySQL8 gtid 互为主从配置
## MySQL8 gtid 互为主从配置
```
[mysqld]
# ---- 固定配置 ----
@ -193,7 +193,7 @@ categories: ["database"]
#read-only = ON
```
# MySQL8 gtid 多源复制从库配置
## MySQL8 gtid 多源复制从库配置
- 修改 my.cnf
```
[mysqld]

View File

@ -6,7 +6,7 @@ tags: ["mysql"]
categories: ["database"]
---
# MySQL 5.7 配置文件 my.cnf
## MySQL 5.7 配置文件 my.cnf
```
[mysqld]
datadir = /db/mysql
@ -53,24 +53,24 @@ categories: ["database"]
#slave-parallel-type = logical-clock
```
# 复制表结构
## 复制表结构
```sql
create table db1.t1 like db2.t2;
create table db1.t1 select db2.t2 where 1=2;
```
# 复制表结构及其数据
## 复制表结构及其数据
```sql
create table db1.t1 select db2.t2 [where ...]
```
# 复制表数据
## 复制表数据
```
insert into db2.t2(column1, column2 ...)
select column1, column2 ... from db1.t1 [where ...]
```
# 通过复制表文件来复制表数据
## 通过复制表文件来复制表数据
- 在db2中创建同结构表
```sql
create table db2.t1 like db1.t1;
@ -97,48 +97,48 @@ categories: ["database"]
alter table db2.t1 import tablespace;
```
# 设置一个表的空列自增
## 设置一个表的空列自增
```sql
-- 删除可能存在的主键
alter table 表名 drop primary key;
alter table 表名 modify 列名 auto_increment primary key;
```
# 查看数据库中每个表的全部列名
## 查看数据库中每个表的全部列名
```sql
select table_name, column_name from
information_schema.columns
where table_schema = '数据库名';
```
# 查看数据库中每个表的行数
## 查看数据库中每个表的行数
```sql
select table_name, table_rows
from information_schema.tables
where table_schema = '数据库名';
```
# 查看数据库中每个表的索引
## 查看数据库中每个表的索引
```sql
select table_name, column_name, index_name
from INFORMATION_SCHEMA.STATISTICS
where table_schema = '数据库名';
```
# 表的部分列数据到另一个表
## 表的部分列数据到另一个表
```sql
update db2.t2(column1, column2 ...) = (
select column1, column2 from db1.t1
where db1.t1.id = db2.t2.id);
```
# 把语句执行结果写到文件
## 把语句执行结果写到文件
```bash
mysql -uroot -p -hsever_ip -Ddb_name
-Ne "select ... from table_name;" > file_name
```
# 表分区
## 表分区
- 查看表的分区情况
```sql
select table_schema, table_name, partition_name, table_rows
@ -209,7 +209,7 @@ categories: ["database"]
check partition part_name_1, part_name_2;
```
# MySQL 5.7 从库多线程同步
## MySQL 5.7 从库多线程同步
```sql
stop slave;
set global slave_parallel_type='logical_clock';
@ -218,12 +218,12 @@ categories: ["database"]
show processlist;
```
# MySQL 5.7 提示密码复杂度不够
## MySQL 5.7 提示密码复杂度不够
```sql
set global validate_password_policy=0;
```
# MySQL 5.7 从库复制失败跳过指定数量的事务
## MySQL 5.7 从库复制失败跳过指定数量的事务
```sql
stop slave;
-- 跳过一个事务
@ -234,7 +234,7 @@ categories: ["database"]
slave-skip-errors=all #跳过所有错误
```
# MySQL 5.7 查看全部任务
## MySQL 5.7 查看全部任务
```sql
-- 分号换成 \G 显示完整 sql
show processlist;
@ -242,17 +242,17 @@ categories: ["database"]
SELECT command FROM information_schema.processlist;
```
# MySQL 5.7 ssl 连接
## MySQL 5.7 ssl 连接
```
--ssl-mode=REQUIRED
```
# MariaDB 10.1 修改密码
## MariaDB 10.1 修改密码
```sql
UPDATE user SET password=password('newpassword') WHERE user='root';
```
# MySQL 5.7 编码
## MySQL 5.7 编码
- 查看
```sql
SHOW VARIABLES LIKE 'character_set%';
@ -271,12 +271,12 @@ categories: ["database"]
CONVERT TO CHARSET UTF8MB4 COLLATE UTF8MB4_GENERAL_CI;
```
# MySQL 5.7 升级数据库管理表结构
## MySQL 5.7 升级数据库管理表结构
```bash
mysql_upgrade -u root -p
```
# MySQL 5.7 误删 root 后恢复 root 账户
## MySQL 5.7 误删 root 后恢复 root 账户
- 停止 mysql 服务
```bash
systemctl stop mysqld
@ -352,7 +352,7 @@ categories: ["database"]
systemctl start mysqld
```
# 通过EXPLAIN分析SQL的执行计划
## 通过EXPLAIN分析SQL的执行计划
- 使用
```sql
explain sql
@ -384,13 +384,13 @@ categories: ["database"]
- Using Index Condition ICP优化直接在存储引擎完成条件过滤
- Using Flesort 依靠索引顺序达不到排序效果,需额外排序
# 统计 insert、delete、update 和 select 次数
## 统计 insert、delete、update 和 select 次数
```sql
show global status where Variable_name in
('com_insert', 'com_delete', 'com_update', 'com_select');
```
# csv 文件
## csv 文件
- 导出
```
# Shell 终端

View File

@ -6,46 +6,46 @@ tags: ["centos", "yum", "mysql"]
categories: ["database"]
---
# 环境
## 环境
- CentOS 7.4 x86_64 最小安装
- MySQL 5.7.20
# 下载 mysql 源安装包
## 下载 mysql 源安装包
```bash
# repo 地址: https://repo.mysql.com/
cd /root/
curl -O https://repo.mysql.com/mysql57-community-release-el7.rpm
```
# 安装 mysql 源
## 安装 mysql 源
```bash
rpm -ivh /root/mysql57-community-release-el7.rpm
```
# 更新 yum 缓存
## 更新 yum 缓存
```bash
yum clean all
yum makecache fast
```
# 安装 mysql
## 安装 mysql
```bash
yum install mysql-community-server
```
# 启动 mysql
## 启动 mysql
```bash
systemctl start mysqld
```
# 查找 mysql 默认密码
## 查找 mysql 默认密码
```bash
grep 'temporary password' /var/log/mysqld.log
mysql -uroot -p
# 输入查找到的密码
```
# 修改 mysql 本地密码
## 修改 mysql 本地密码
- 在 mysql 下修改
```sql
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Pass-1234';

View File

@ -7,16 +7,16 @@ tags: ["centos", "networkmanager", "network"]
categories: ["network"]
---
# 环境
## 环境
- CentOS8 已废弃 network.service, 推荐使用 NetworkManager
# 概念
## 概念
- 在NM里有2个维度: 连接(connection)和设备(device),这是多对一的关系
- 想给某个网卡配ip首先NM要能纳管这个网卡。设备里存在的网卡(即 nmcli d可以看到的)就是NM纳管的
- 可以为一个设备配置多个连接(即 nmcli c可以看到的)每个连接可以理解为一个ifcfg配置文件
- 同一时刻,一个设备只能有一个连接活跃,可以通过 nmcli c up切换连接
# 配置连接
## 配置连接
- 状态
- 活跃(带颜色字体)表示当前该connection生效
- 非活跃(正常字体)表示当前该connection不生效
@ -131,7 +131,7 @@ categories: ["network"]
nmcli d connect ethX
```
# 配置网卡设备
## 配置网卡设备
- 状态
- connected: 已被NM纳管并且当前有活跃的connection
- disconnected: 已被NM纳管但是当前没有活跃的connection
@ -170,7 +170,7 @@ categories: ["network"]
nmcli r all off
```
# NM 状态
## NM 状态
- 查看当前 nm 连接信息
```bash
nmcli
@ -193,7 +193,7 @@ categories: ["network"]
nm-oncline
```
# 注意事项
## 注意事项
- 如果希望NM不要纳管网卡只有一个办法最彻底最靠谱就是自己写ifcfg内容加上 NM_CONTROLLED=no这样该device的状态就会始终保持unmanaged。nmcli c up、nmcli c reload、nmcil c load都不会对其起任何作用
- NM只能对link状态为up的网卡进行操作如果手动 ip link set ethX down那么NM就无法对该网卡做任何操作(即使nmcli d connect也没有用)
- NetworkManager支持3种获取dhcp的方式dhclient、dhcpcd、internal当/etc/NetworkManager/NetworkManager.conf配置文件中的[main]部分没配置 dhcp=时候默认使用internalrhel7/centos7默认是dhclient。internal是NM内部实现的dhcp客户端

View File

@ -7,11 +7,11 @@ tags: ["nfs"]
categories: ["storage"]
---
# 环境
## 环境
- 服务端 CentOS7 192.168.1.100
- 客户端 CentOS7 192.168.1.101
# 服务端
## 服务端
- 安装
```bash
yum install nfs-utils
@ -34,7 +34,7 @@ categories: ["storage"]
exportfs
```
# 客户端
## 客户端
- 安装
```bash
yum install nfs-utils
@ -53,7 +53,7 @@ categories: ["storage"]
mount -t nfs 192.168.1.100:/nfs_share /nfs_client
```
# 通信过程
## 通信过程
- 首先服务器端启动 RPC 服务,并开启 111 端口
- 服务器端启动 NFS 服务,并向 RPC 注册端口信息
- **注:该端口是用来传输数据的,目前不知道 NFS 选择该端口的依据,如果是随机的,防火墙如何放行?**
@ -61,7 +61,7 @@ categories: ["storage"]
- 服务端的 RPC 服务反馈 NFS 端口信息给客户端
- 客户端通过获取的 NFS 端口来建立和服务端的 NFS 连接并进行数据的传输
# 服务端共享参数
## 服务端共享参数
参数 | 说明
---- | ----
ro | 只读访问
@ -83,6 +83,6 @@ no_root_squash | root 用户具有根目录的完全管理访问权限
anonuid=xxxx | 指定 nfs 服务器 /etc/passwd 文件中匿名用户的 UID
anongid=xxxx | 指定 nfs 服务器 /etc/passwd 文件中匿名用户的 GID
# 参考
## 参考
- [https://www.linuxidc.com/Linux/2019-07/159479.htm](https://www.linuxidc.com/Linux/2019-07/159479.htm)

View File

@ -6,10 +6,10 @@ tags: ["nginx", "https", "ssl", "反向代理"]
categories: ["web"]
---
# set
## set
- set ${变量名} {字符串};
# 全局变量
## 全局变量
- $args $query_string 请求行中的参数
- $content_length 请求头里的 Content-length 字段
- $content_type 请求头里的 Content-type 字段
@ -31,7 +31,7 @@ categories: ["web"]
- $request_uri 包含请求参数的原始URI不包含主机名如"/foo/bar.php?arg=baz"
- $document_uri $uri 不带请求参数的当前URI不包含主机名如"/foo/bar.html"
# rewrite
## rewrite
- rewrite {url正则} {replacement} {flag};
- flag
- last 完成 rewrite重新开始匹配
@ -39,7 +39,7 @@ categories: ["web"]
- redirect 返回 302 临时重定向
- permanent 返回 301 永久重定向
# if
## if
- if(condition){...}
- false 字符串为空或以 0 开头都是
- = != 变量比较
@ -50,19 +50,19 @@ categories: ["web"]
- -e !-e 判断文件、目录、链接是否存在
- -x !-x 判断可执行文件是否存在
# location
## location
- = 精确匹配
- ^~ 开头匹配指定字符串,不是正则,匹配符合后停止搜索
- ~ 区分大小写的正则匹配,匹配符合后继续向下搜索
- ~`*` 不区分大小写的正则匹配,匹配符合后继续向下搜索
- / 通用匹配,可匹配任何请求,匹配后继续向下搜索
# try_files
## try_files
- try_files {file} ... {uri}
- try_files {file} ... ={code}
- try_files {file} ... {location_name}
# 客户端访问控制
## 客户端访问控制
- deny all 拒绝全部访问
- deny 192.168.1.0/24 拒绝指定网段
- deny 192.168.1.2 拒绝指定ip
@ -70,7 +70,7 @@ categories: ["web"]
- allow 192.168.1.0/24 允许指定网段
- allow 192.168.1.2 允许指定ip
# 配置 web 访问目录
## 配置 web 访问目录
```bash
location / {
root /var/www/html/;
@ -79,7 +79,7 @@ location / {
}
```
# 下载
## 下载
```nginx
location ^~ /attachment/ {
root /data/;
@ -88,7 +88,7 @@ location ^~ /attachment/ {
}
```
# 浏览目录文件
## 浏览目录文件
```nginx
location ^~ /share/ {
autoindex on;
@ -97,7 +97,7 @@ location ^~ /share/ {
}
```
# 反向代理负载均衡
## 反向代理负载均衡
- /etc/nginx/conf.d/upstream.conf
```nginx
http {
@ -136,7 +136,7 @@ location ^~ /share/ {
}
```
# 反向代理 websocket
## 反向代理 websocket
```nginx
location /websocket/ {
proxy_pass http://127.0.0.1:8002;
@ -146,7 +146,7 @@ location /websocket/ {
}
```
# Basic HTTP 认证
## Basic HTTP 认证
- 生成密码文件(用户名是admin密码是123456)
```bash
echo "admin:$(openssl passwd -crypt 123456)" > /etc/nginx/nginx.auth
@ -161,7 +161,7 @@ location /websocket/ {
}
```
# 创建 ssl 密钥
## 创建 ssl 密钥
```bash
mkdir /etc/nginx/ssl && cd /etc/nginx/ssl
openssl genrsa -out ssl.key 2048
@ -169,7 +169,7 @@ openssl req -new -key ssl.key -days 3650 -out ssl.csr
openssl x509 -req -in ssl.csr -signkey ssl.key -out ssl.crt
```
# https 访问
## https 访问
```nginx
server {
ssl on;
@ -184,7 +184,7 @@ server {
}
```
# http 自动跳转 https有三种配置
## http 自动跳转 https有三种配置
- rewrite 服务端重定向
```nginx
server {
@ -218,7 +218,7 @@ server {
}
```
# http 和 https 共存
## http 和 https 共存
```nginx
server {
listen 80;
@ -233,7 +233,7 @@ server {
}
```
# nginx 日志配置
## nginx 日志配置
- http 常规日志
```
log_format main '$remote_addr - [$time_local] "$request_method $uri" "$args" '
@ -259,7 +259,7 @@ server {
'"$http_user_agent" "-"';
```
# 常用全局配置
## 常用全局配置
```nginx
events {
use epoll;

View File

@ -6,14 +6,14 @@ tags: ["openvpn"]
categories: ["network"]
---
# 环境
## 环境
角色 | 主机名 | 操作系统 | IP
---- | ---- | ---- | ----
vpn 服务端 | vpn-server | CentOS7 | 192.168.1.90
vpn 客户端 | vpn-client | CentOS7 | 192.168.1.91
# 两台服务器初始准备
## 两台服务器初始准备
- 关闭 SELinux
- 关闭防火墙或放行 udp 端口 1194
- 安装 openvpn
@ -24,7 +24,7 @@ vpn 客户端 | vpn-client | CentOS7 | 192.168.1.91
yum install easy-rsa openvpn
```
# 在 vpn-server 上创建证书
## 在 vpn-server 上创建证书
- 复制 easy-rsa 脚本到 /opt/easy-rsa/ 下
```bash
cp -af /usr/share/easy-rsa/3.0.3/ /opt/easy-rsa
@ -99,7 +99,7 @@ vpn 客户端 | vpn-client | CentOS7 | 192.168.1.91
```
- **该证书目录 /opt/easyrsa 需妥善保管,后期增加其他客户端证书时会用到**
# 配置 vpn-server
## 配置 vpn-server
- 开启路由转发,修改 /etc/sysctl.conf
```bash
sysctl -w 'net.ipv4.ip_forward = 1'
@ -126,7 +126,7 @@ vpn 客户端 | vpn-client | CentOS7 | 192.168.1.91
tls-auth my-server0/ta.key 0
```
# 启动 vpn-server 服务
## 启动 vpn-server 服务
- 启动 openvpn-server@my-server0.service 服务
```bash
systemctl start openvpn-server@my-server0.service
@ -136,7 +136,7 @@ vpn 客户端 | vpn-client | CentOS7 | 192.168.1.91
systemd-tty-ask-password-agent --query
```
# 配置 vpn-client
## 配置 vpn-client
- 复制 vpn-server 上的客户端证书到 openvpn 配置目录下
```bash
mkdir -p /etc/openvpn/client/my-client0
@ -156,7 +156,7 @@ vpn 客户端 | vpn-client | CentOS7 | 192.168.1.91
tls-auth my-client0/ta.key 1
```
# 启动 vpn-client 服务
## 启动 vpn-client 服务
- 启动 openvpn-client@my-client0 服务
```bash
systemctl start openvpn-client@my-client0.service
@ -166,10 +166,10 @@ vpn 客户端 | vpn-client | CentOS7 | 192.168.1.91
systemd-tty-ask-password-agent --query
```
# 验证
## 验证
- vpn server 新增网卡 tun0地址是 10.8.0.1/24
- vpn client 新增网卡 tun0地址是 10.8.0.2/24
# 参考
## 参考
- [创建证书](https://blog.csdn.net/zhuwei_clark/article/details/87949043)

View File

@ -7,7 +7,7 @@ tags: ["openvpn"]
categories: ["network"]
---
# 服务端配置文件 server.conf
## 服务端配置文件 server.conf
```
#################################################
# 针对多客户端的OpenVPN 2.0 的服务器端配置文件示例
@ -206,7 +206,7 @@ categories: ["network"]
;mute 20
```
# 客户端配置文件
## 客户端配置文件
```
##############################################
# 针对多个客户端的OpenVPN 2.0 的客户端配置文件示例
@ -302,7 +302,7 @@ categories: ["network"]
;mute 20
```
# 撤销客户端证书
## 撤销客户端证书
- 生成/更新 crl.pem
```bash
./easyrsa revoke my-client0 # my-client0 是被注销证书的 common name
@ -318,7 +318,7 @@ categories: ["network"]
- 重启 openvpn-server 服务
# 参考链接
## 参考链接
- [https://www.iyunv.com/forum.php?mod=viewthread&tid=250551](https://www.iyunv.com/forum.php?mod=viewthread&tid=250551)
- [https://blog.csdn.net/a8039974/article/details/89279147](https://blog.csdn.net/a8039974/article/details/89279147)
- [https://blog.csdn.net/a8039974/article/details/89279086](https://blog.csdn.net/a8039974/article/details/89279086)

View File

@ -6,7 +6,7 @@ tags: ["oracle"]
categories: ["database"]
---
# 字符型
## 字符型
类型 | 大小 | 描述
---- | ---- | ----
varchar2 | 0~4000 | 可变长度字符串
@ -15,26 +15,26 @@ char | 0~2000 | 定长字符型数据
nchar | 0~1000 | Unicode字符集定长字符型数据
long | 0~2GB | 变长字符串
# 数字型
## 数字型
类型 | 进制 | 描述
---- | ---- | ----
number(p,s) | 十进制 | p最大精度38位s小数位数
float | 二进制 | 126位整数
# 日期
## 日期
类型 | 大小 | 描述
---- | ---- | ----
date | 公元前4712-1-1~9999-12-31 | 存储日期和时间
timestamp | 公元前4712-1-1~9999-12-31 | 精确到小数秒,显示上下午
# 其他数据类型
## 其他数据类型
类型 | 大小 | 描述
---- | ---- | ----
blob | 4GB | 二进制
clob | 4GB | 字符串
bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
# 创建表
## 创建表
```sql
CREATE TABLE table_name
(
@ -49,7 +49,7 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
DROP TABLE table_name;
```
# 删除表
## 删除表
```bash
DROP TABLE table_name;
# 执行最快删除数据、结构、索引、约束、触发器和索引存储过程和索引invalid状态直接生效不可回滚不释放空间
@ -59,7 +59,7 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
# 执行最慢只删除数据commit 后生效,可回滚,不释放空间
```
# 操作表列
## 操作表列
```sql
ALTER TABLE table_name
ADD column_name datatype [NULL|NOT NULL]
@ -68,93 +68,93 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
-- 删除列时通常追加 CASCADE CONSTRAINTS ,以删除于该列有关的约束
```
# 操作主键
## 操作主键
```sql
ALTER TABLE table_name
ADD CONSTRAINTS constraint_name PRIMARY KEY(column_name)
|DROP CONSTRAINTS constraint_name;
```
# 操作外键
## 操作外键
```sql
ALTER TABLE table_name
ADD CONSTRAINT constraint_name FOREIGN KEY(column_name) REFERENCE table_name(column_name) ON DELETE CASCADE
|DROP CONSTRAINT constraint_name;
```
# 操作CHECK约束
## 操作CHECK约束
```sql
ALTER TABLE table_name
ADD CONSTRAINT constraint_name CHECK(condition)
|DROP CONSTRAINT constraint_name;
```
# 操作UNIQUE约束
## 操作UNIQUE约束
```sql
ALTER TABLE table_name
ADD CONSTRAINT constraint_name UNIQUE(column_name)
|DROP CONSTRAINT constraint_name;
```
# 添加数据
## 添加数据
```sql
INSERT INTO table_name(column_name1,column_name2,...)
VALUES(data1,data2,...)
|SELECT column_name1,column_name2...FROM table_name2;
```
# 修改数据
## 修改数据
```sql
UPDATE table_name SET column_name1=data1,column_name2=data2,...[WHERE condition];
```
# 删除数据
## 删除数据
```sql
DELETE FROM table_name [WHERE condition];
TRUNCATE TABLE table_name;
```
# 查询数据
## 查询数据
```sql
SELECT column_name1,column_name2,...FROM table_name [WHERE condition];
```
# MERGE语句
## MERGE语句
```sql
MERGE INTO table_name1 USING table_name2 ON(condition) WHEN MATCHED THEN ... WHEN NOT MATCHED THEN ...;
```
# SELECT 语句
## SELECT 语句
```sql
SELECT [DISTINCT|ALL] select_list FROM table_list [WHERE ...] [GROUP BY ...] [HAVING ...] [ORDER BY ...];
```
# select_list
## select_list
```sql
*|[schema.] {table|view} .*|expr[ [AS ]c_alias]
```
# expr
## expr
```sql
"||" 连接的字符串 | 函数
```
# ORDER BY ...
## ORDER BY ...
```sql
{expr|positon|c_alias} {ASC|DESC} {NULLS FIRST|NULLS LAST}[ {expr|positon|c_alias} {ASC|DESC} {NULLS FIRST|NULLS LAST},...]
```
# 模糊查询关键字like
## 模糊查询关键字like
```sql
'_'替代一个字符,'%'替代多个字符
```
# 从给定值中选取查询
## 从给定值中选取查询
```sql
IN(data1,data2,...)
```
# 连接
## 连接
```sql
-- 连接,只能查询匹配记录
SELECT select_list FROM table_name1 INNER JOIN table_name2 ON condition;
@ -166,7 +166,7 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
SELECT select_list FROM table_name1 FULL JOIN table_name2 ON condition;
```
# 内置函数
## 内置函数
```sql
ABS(n) -- n绝对值
MOD(n2,n1) -- n2对n1取余
@ -220,17 +220,17 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
DECODE(expr,search,result[,search1,result1...]) -- expr结果是search返回result
```
# 查看所有默认表空间
## 查看所有默认表空间
```sql
SELECT TABLESPACE_NAME FROM DBA_TABLESPACES;
```
# 查看指定用户默认表空间
## 查看指定用户默认表空间
```sql
SELECT DEFAULT_STAPCE,USERNAME FROM DBA_USERS WHERE USERNAME='username';
```
# 创建表空间
## 创建表空间
```sql
CREATE TABLESPACE tablespace_name
DATAFILE filename
@ -242,54 +242,54 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
[AUTOALLOCATE|UNIFORM. [SIZE integer[K|M]]]];
```
# 重命名表空间
## 重命名表空间
```sql
ALTER TABLESPACE oldname RENAME TO newname;
```
# 修改表空间大小
## 修改表空间大小
```sql
ALTER DATABASE DATAFILE filename RESIZE size;
```
# 增加表空间大小
## 增加表空间大小
```sql
ALTER TABLESPACE tablespace_name ADD DATAFILE filename SIZE size;
```
# 设置表空间读写状态
## 设置表空间读写状态
```sql
ALTER TABLESPACE tablespace_name READ {ONLY|WRITE};
```
# 设置表空间可用状态
## 设置表空间可用状态
```sql
ALTER TABLESPACE tablespace_name {ONLINE|OFFLINE [NORMAL|TEMPORARY|IMMEDIATE]};
```
# 创建大文件表空间
## 创建大文件表空间
```sql
CREATE BIGFILE TABLESPACE tablespace_name DATAFILE filename SIZE size;
```
# 删除表空间
## 删除表空间
```sql
DROP TABLESPACE tablespace_name
[INCLUDING CONTENTS AND DATAFILES] 数据文件删除
[CASCADE CONSTRAINTS]; 完整性删除
```
# 查看表空间大小
## 查看表空间大小
```sql
SELECT TABLESPACE_NAME,FILE_NAME,BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME=tablespace_name;
```
# 查看表空间剩余 空间
## 查看表空间剩余 空间
```sql
SELECT TABLESPACE_NAME,BYTES FROM DBA_FREE_SPACES;
```
# 创建/修改用户
## 创建/修改用户
```sql
CREATE|ALTER
USER user_name
@ -301,12 +301,12 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
[ACCOUNT LOCK|UNLOCK]; 默认锁定状态
```
# 删除用户
## 删除用户
```sql
DROP USER user_name CASCADE;
```
# 授予系统权限
## 授予系统权限
```sql
GRANT
system_privileges|ALL PRIVILEGES 权限
@ -314,7 +314,7 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
[WITH ADMIN OPTION]; 授予其他用户或角色系统权限
```
# 授予对象权限
## 授予对象权限
```sql
GRANT
object_privilege|ALL 权限
@ -324,13 +324,13 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
[WITH THE GRANT ANY OBJECT]; 授予其他用户或角色对象权限
```
# 撤销系统权限
## 撤销系统权限
```sql
REVOKE system_privilege FROM
user|role;
```
# 撤销对象权限
## 撤销对象权限
```sql
REVOKE
object_privilege |ALL
@ -339,14 +339,14 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
[CASCADE CONSTRAINTS];
```
# 数据字典
## 数据字典
数据 | 字典
---- | ----
系统权限 | DBA_SYS_PRIVS
对象权限 | DBA_TAB_PRIVS
用户角色 | DBA_ROLE_PRIVS
# 创建角色
## 创建角色
```sql
CREATE|ALTER //创建/修改
ROLE role_name
@ -363,17 +363,17 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
SET ROLE NONE -- 设置所有角色失效
```
# 删除角色
## 删除角色
```sql
DROP ROLE role_name;
```
# 脱机备份(冷备份)/恢复
## 脱机备份(冷备份)/恢复
```sql
关闭数据库服务后直接复制需要的文件,包括数据文件和控制文件
```
# 联机备份(热备份)
## 联机备份(热备份)
```sql
ARCHIVE LOG LIST 查看本机数据库的日志状态
ALTER SYSTEM SET LOG_ARCHIVE_START=TRUE SCOPE=SPFILE; 设置日志模式为归档
@ -386,7 +386,7 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
ALTER TABLESPACE tablespace_name END BACKUP; 结束备份操作
```
# 恢复
## 恢复
```sql
ALTER SYSTEM ARCHIVE LOG CURRENT; 归档当前日志
ALTER SYSTEM SWITCH LOGFILE; 切换日志文件
@ -397,49 +397,49 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
ALTER DATABASE DATAFILE file_id ONLINE; 设置数据文件联机
```
# EXP工具导出数据
## EXP工具导出数据
```bash
exp db_user/password 登陆数据库的用户名和密码非SYS
```
# EXP工具直接导出表
## EXP工具直接导出表
```bash
exp db_user/password file="filename.dmp" tables="table_name,..."
```
# EXP工具导出表空间
## EXP工具导出表空间
```bash
exp db_user/password file="filename.dmp" tablespaces="tablespaces_name"
```
# EXPDP导出数据
## EXPDP导出数据
```sql
CREATE DIRECTORY directory_name AS 'file_name'; 目录名称 文件名称
GRANT READ,WRITE ON DIRECTORY directory_name TO db_user; 授权用户使用该目录
#expdp db_user/password directory=directory_name dumpfile=file_name tables=table_name;
```
# IMP导入数据
## IMP导入数据
```sql
imp db_user/password
```
# IMP直接导入表
## IMP直接导入表
```sql
imp db_user/password file="filename.dmp" tables="table_name,..."
```
# IMPDP导入数据
## IMPDP导入数据
```sql
impdp db_user_password
```
# IMPDP直接导入表
## IMPDP直接导入表
```bash
impdp db_user/password directory=dir dumpfile=filename.dmp tables=table_name;
```
# RMAN工具配置
## RMAN工具配置
```sql
CONN /AS SYSDBA; 连接恢复目录数据库
CREATE USER rman_user IDENTIFIED BY password DEFAULT TABLESPACE tablespace_name; 创建恢复用户
@ -449,7 +449,7 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
CREATE CATALOG; 创建恢复目录
```
# RMAN工具使用
## RMAN工具使用
```sql
#rman target db_user/password@servicename catalog rman_user/password 连接恢复目录数据库
CONNECT TARGET db_user/password@servicename; 连接目标数据库
@ -457,7 +457,7 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
REGISTER database; 在恢复目录数据库中注册数据库
```
# 手动分配通道
## 手动分配通道
```sql
关闭目标数据库启动到mount状态运行
run
@ -468,27 +468,27 @@ bfile | 视操作系统 | 存储非结构化数据到数据库外的文件中
}
```
# 自动分配通道
## 自动分配通道
```sql
CONFIGURE DEVICE TYPE {sbt|disk} PARALLELISM n; 指定通道类型和名称
CONFIGURE DEFAULT DEVICE TYPE {sbt|disk}; 指定默认设备类型
BACKUP [level] [backup type] [option];
```
# BACKUP 参数
## BACKUP 参数
```sql
level 备份增量1、2、3、4或者FULL全备份
backup type 对象类型database、datafile、tablespace、controlfilecopy、archivelog all
option channel备份使用的通道 maxsetsize定义备份集的最大值
```
# RESTORE还原
## RESTORE还原
```sql
RESTORE database_object;
database_object: DATABASE(mount),TABLESPACE(open),DATAFILE,CONTROLFILE(mount),ARCHIVELOG,SPFILE(mount)
```
# RECOVER同步恢复
## RECOVER同步恢复
```sql
RECOVER database_object;
database_object: DATABASE(mount),TABLESPACE(open),DATAFILE

View File

@ -6,13 +6,13 @@ tags: ["oracle"]
categories: ["database"]
---
# 环境
## 环境
- CentOS7.4 最小安装
- 数据库软件
- linux.x64_11gR2_database_1of2.zip
- linux.x64_11gR2_database_2of2.zip
# 操作系统配置
## 操作系统配置
- 关闭 SELinux
```bash
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
@ -27,7 +27,7 @@ categories: ["database"]
reboot
```
# 安装依赖
## 安装依赖
- 安装可能用到的工具
```bash
yum install epel-release
@ -45,7 +45,7 @@ categories: ["database"]
unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686
```
# 配置安装环境
## 配置安装环境
- 创建 oracle 用户
```bash
groupadd oinstall
@ -122,7 +122,7 @@ categories: ["database"]
EOF
```
# 安装数据库
## 安装数据库
- 上传数据库软件到 /root 下,解压
```bash
unzip linux.x64_11gR2_database_1of2.zip -d /home/oracle/
@ -185,7 +185,7 @@ categories: ["database"]
#查看屏幕输出的创建进度
```
# 简单使用
## 简单使用
- 登陆数据库
```
[oracle@localhost ~]$ rlwrap sqlplus / as sysdba

View File

@ -7,12 +7,12 @@ tags: ["oracle"]
categories: ["database"]
---
# 环境
## 环境
- CentOS7.5 最小安装
- 数据库软件
- linuxx64_12201_database.zip
# 操作系统配置
## 操作系统配置
- 关闭 SELinux
```bash
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
@ -32,7 +32,7 @@ categories: ["database"]
reboot
```
# 安装依赖
## 安装依赖
- 安装可能用到的工具
```bash
yum install epel-release
@ -50,7 +50,7 @@ categories: ["database"]
unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686
```
# 配置安装环境
## 配置安装环境
- 创建 oracle 用户
```bash
groupadd oinstall
@ -128,7 +128,7 @@ categories: ["database"]
EOF
```
# 安装数据库
## 安装数据库
- 上传数据库软件到 /root 下,解压
```bash
unzip linuxx64_12201_database.zip -d /home/oracle/
@ -198,7 +198,7 @@ categories: ["database"]
#查看屏幕输出的创建进度
```
# 简单使用
## 简单使用
- 登陆数据库,切换到 pdb 数据库
```
[oracle@fpManager2 ~]$ rlwrap sqlplus / as sysdba

View File

@ -6,7 +6,7 @@ tags: ["oracle"]
categories: ["database"]
---
# 导出一个表的表结构 sql
## 导出一个表的表结构 sql
```sql
set heading off;
set echo off;
@ -17,7 +17,7 @@ select dbms_metadata.get_ddl('TABLE','table_name','user_name') from dual;
spool off;
```
# 到处一个用户的全部表结构 sql
## 到处一个用户的全部表结构 sql
```sql
set pagesize 0
set long 90000
@ -28,17 +28,17 @@ SELECT DBMS_METADATA.GET_DDL('TABLE',t1.table_name) FROM USER_TABLES t1;
spool off;
```
# 设置 oracle 客户端的字符集
## 设置 oracle 客户端的字符集
```sql
select * from v$nls_parameters;
-- 在输出中找到 NLS_LANGUAGE、NLS_TERRITORY、NLS_CHARACTERSET 这三个变量的值
-- 环境变量 NLS_LANG 就是由这三个变量组成NLS_LANG = language_territory.charset
```
# 终端连接(ssh) sqlplus 中文乱码
## 终端连接(ssh) sqlplus 中文乱码
- 设置该终端与数据库服务器当前字符集编码一致即可
# 修改数据库字符集
## 修改数据库字符集
```sql
shutdown immediate; (把database停了)
startup mount; (把database重开去可更改情況)
@ -51,7 +51,7 @@ shutdown immediate;
startup; (重开正常oracle)
```
# Oracle 12c PDB 管理
## Oracle 12c PDB 管理
- 查看当前模式
```sql
show con_name; -- 默认 CDB$ROOT
@ -91,16 +91,16 @@ startup; (重开正常oracle)
drop pluggable database pdborcl1 [including datafiles];
```
# sqlplus 到处 csv 文件
## sqlplus 到处 csv 文件
```sql
sqool /home/oracle/sql_result.csv
select '"' || field1 || '","' || field2 || '","' ... '","' || fieldn || '"' from table1;
spool off
```
# 系统变量
## 系统变量
## 常用设置
### 常用设置
- 域输出分隔符
```sql
@ -167,7 +167,7 @@ spool off
set autotrace on;
```
## 系统变量记录
### 系统变量记录
- ARRAY[SIZE] {20(默认值)|n} sqlplus 一次从数据库获取的行数,有效值为1至5000. 大的值可提高查询和子查询的有效性,可获取许多行,但也需要更多的内存.当超过1000时,其效果不大.
- AUTO[COMMIT] {OFF(默认值)|ON|IMM[EDIATE]} 控制ORACLE对数据库的修改的提交. 置ON时,在ORACLE执行每个SQL命令或PL/SQL块后对数据库提交修改;置OFF时则制止自动提交,需要手工地提交修改,例如用SQL的COMMIT命令. IMMEDIATE功能同ON.
@ -237,6 +237,6 @@ spool off
- VER[IFY] {OFF|ON(默认值)} 控制sqlplus用值替换前、后是否列出命令的文本. ON时显示文本;OFF时禁止列清单.
- WRA[P] {OFF|ON(默认值)} 控制sqlplus是否截断数据项的显示. OFF时截断数据项;ON时允许数据项缠绕到下一行. 在COLUMN命令中使用WRAPPED和TRUNCATED子句可控制对指定列的WRAP的设置.
# 参考
## 参考
- [https://blog.csdn.net/lfc453048573/article/details/12956191](https://blog.csdn.net/lfc453048573/article/details/12956191)

View File

@ -6,10 +6,10 @@ tags: ["ovirt", "kvm", "虚拟化"]
categories: ["kvm"]
---
# 版本
## 版本
Ovirt 4.1.7
# 操作系统初始配置
## 操作系统初始配置
角色 | 主机名 | 配置 | IP | 版本 | /etc/hosts 追加行
-------- | ------- | -------------------- | ----------- | ------------------ | -------------------
管理节点 | engine | CPU: 多核<BR>RAM: 2G | 10.0.16.160 | CentOS 7.4 Minimal | 10.0.16.160 engine engine.ovirt<BR>10.0.16.161 host161
@ -34,7 +34,7 @@ Ovirt 4.1.7
- 存储服务暂时采用计算节点的本机 NFS
# 导入 Ovirt yum 源
## 导入 Ovirt yum 源
- 创建 ovirt.repo内容如下
```
[ovirt-4.1]
@ -83,7 +83,7 @@ Ovirt 4.1.7
yum repolist #此时能看到新增加的 ovirt.repo 文件中的 yum 源
```
# 配置管理节点(engine)
## 配置管理节点(engine)
- 在 engine 上分发免密登陆各计算节点(host)的密钥
```bash
ssh-keygen #全部默认回车即可
@ -101,7 +101,7 @@ Ovirt 4.1.7
- 配置完成后engine 服务启动
- 在个人 PC 上配置好 "10.0.16.160 engine engine.ovirt",浏览器打开 https://engine.ovirt
# 配置计算节点(host161)
## 配置计算节点(host161)
- 打开 ovirt 管理 web 界面: http://engine.ovirt以 admin 身份登陆
- 打开 "主机" 标签页,单击左上角的 "新建"
- 在打开 "新建主机" 窗口中,选择 "主机集群",填写 "名称"、"地址"、"ssh端口"、"用户名" 等信息
@ -109,7 +109,7 @@ Ovirt 4.1.7
- 单击 "确定"host161 开始自动安装,通过 web 界面底部的详情窗格中可以看到安装过程
- host 安装完成后会自动启动,状态变成 "up"
# 配置存储
## 配置存储
- 服务器数量有限,这里直接在计算节点上启动 NFS
- 在 host161 上编辑 /etc/exports增加如下配置
```
@ -134,7 +134,7 @@ Ovirt 4.1.7
- 在 "导出路径" 文本框中输入: 10.0.16.161:/NFS/iso1
- 单击 "确定"ISO 存储域 "iso1" 开始自动配置,完成后,该存储域状态自动切换为 "Active"
# 导入操作系统 iso
## 导入操作系统 iso
- 前面的存储创建好后ovirt 就可以用了,接下来是导入 iso 镜像
- 从 engine 导入 iso 文件
```bash

View File

@ -6,7 +6,7 @@ tags: ["ovirt"]
categories: ["kvm"]
---
# 封装 CentOS6/7 虚拟机
## 封装 CentOS6/7 虚拟机
- 标识 “重新配置”
```bash
touch /.unconfigured
@ -39,7 +39,7 @@ categories: ["kvm"]
poweroff
```
# 解锁 admin 用户
## 解锁 admin 用户
- 查看状态
```bash
ovirt-aaa-jdbc-tool user show admin
@ -49,7 +49,7 @@ categories: ["kvm"]
ovirt-aaa-jdbc-tool user unlock admin
```
# 创建本地 yum 源
## 创建本地 yum 源
- 安装工具
```bash
yum install yum-utils createrepo

View File

@ -7,7 +7,7 @@ tags: ["pip", "python"]
categories: ["python"]
---
# 配置 pip 源
## 配置 pip 源
- 创建 $HOME/.pip/pip.conf 文件,内容如下
```ini
[global]

View File

@ -7,11 +7,11 @@ tags: ["postgresql"]
categories: ["database"]
---
# 环境
## 环境
- CentOS 7
- PostgreSQL 10.10
# 安装
## 安装
- 安装 yum 源
```bash
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
@ -36,13 +36,13 @@ categories: ["database"]
systemctl start postgresql-10
```
# 配置 postgresql.conf
## 配置 postgresql.conf
- 监听本机全部地址
```
clisten_addresses = '*'
```
# 配置 pg_hba.conf
## 配置 pg_hba.conf
- 配置同网段客户端可通过 pguser1 使用密码登陆 pgdb1
```bash
echo 'host pgdb1 pguser1 samenet md5' >> pg_hba.conf
@ -52,7 +52,7 @@ categories: ["database"]
echo 'host all all all md5' >> pg_hba.conf
```
# 简单使用
## 简单使用
- 登陆数据库
```bash
su - postgres
@ -78,7 +78,7 @@ categories: ["database"]
\q
```
# 迁移数据库目录
## 迁移数据库目录
- 停止数据库 postgresql
```bash
systemctl stop postgresql-10

View File

@ -6,7 +6,7 @@ tags: ["postgresql", "replcation", "同步"]
categories: ["database"]
---
# 主库配置
## 主库配置
- 修改 postgresql.conf
```
listen_address = '*'
@ -29,7 +29,7 @@ categories: ["database"]
host replication replica samenet md5
```
# 从库配置
## 从库配置
- 停止从库 postgresql-10 服务,清空数据库目录
```bash
systemctl stop postgresql-10
@ -55,7 +55,7 @@ categories: ["database"]
- -D 指定备份写入的数据目录,需要与数据库配置的数据库目录一致,初次备份之前从库的数据目录需要手动清空
- -l 表示指定一个备份的标识
# 检查状态
## 检查状态
- 检查从库进程
```bash
ps -ef|grep postgres

View File

@ -6,7 +6,7 @@ tags: ["dnsmasq", "pxe"]
categories: ["OS"]
---
# 把 dnsmasq 配置成 pxe 服务器
## 把 dnsmasq 配置成 pxe 服务器
- 安装 dnsmasq
```bash
# rhel
@ -29,10 +29,10 @@ categories: ["OS"]
systemctl start dnsmasq
```
# 安装 CentOS7/8
## 安装 CentOS7/8
- **本次测试使用 CentOS7.7 和 CentOS8.0 镜像**
## 挂载系统镜像,提供软件源服务
### 挂载系统镜像,提供软件源服务
- 下载 centos7/8 镜像到 dnsmasq 服务器
- 挂载镜像到 /mnt 目录
```bash
@ -46,7 +46,7 @@ categories: ["OS"]
python3 -m http.server 10086
```
## 网络 BIOS 引导
### 网络 BIOS 引导
- 复制 centos7/8 镜像里的启动文件到 dnsmasq 服务器的 /var/ftpd/ 下
```bash
cd /var/ftpd
@ -73,7 +73,7 @@ categories: ["OS"]
chown -R dnsmasq.dnsmasq /var/ftpd/
```
## 网络 EFI 引导
### 网络 EFI 引导
- **不支持 secure boot**
- 复制 centos7/8 镜像里的启动文件到 dnsmasq 服务器的 /var/ftpd/ 下
```bash
@ -92,7 +92,7 @@ categories: ["OS"]
chown -R dnsmasq.dnsmasq /var/ftpd/
```
# 装机
## 装机
- 把待安装机器和 dnsmasq 服务器接入同一个交换机(无其他 dhcp 广播)
- 启动待安装机器,选择 pxe 引导,从第一个启动项启动

View File

@ -6,7 +6,7 @@ tags: ["python", "configparser"]
categories: ["python"]
---
# 样例文件
## 样例文件
- 该类配置文件可以包含一个或多个节section每个节可以有多个参数键=值)。
- 样例配置文件(/proj/conf/example_conf
```
@ -22,7 +22,7 @@ categories: ["python"]
```
- 上面配置文件中用的是冒号,也可以用等号。
# 读取配置文件
## 读取配置文件
- 示例文件: example.py
```python
# -*- coding: utf-8 -*-
@ -56,7 +56,7 @@ categories: ["python"]
blog = csdn.n
```
# 写入配置文件
## 写入配置文件
- 示例
```python
import ConfigParser
@ -78,7 +78,7 @@ categories: ["python"]
size = 1024
```
# ConfigParser方法
## ConfigParser方法
- 创建ConfigParser实例
```python
config=ConfigParser.ConfigParser()
@ -118,9 +118,9 @@ categories: ["python"]
config.write(obj_file)
```
# 综合实例
## 综合实例
```python
#coding=utf-8
##coding=utf-8
import ConfigParser

View File

@ -6,30 +6,30 @@ tags: ["python", "cx_oracle"]
categories: ["python"]
---
# 导入 cx_Oracle 模块
## 导入 cx_Oracle 模块
```
import cx_Oracle # 导入模块
```
# 连接数据库
## 连接数据库
```
db = cx_Oracle.connect('user', 'password', 'host:port/SID') #建立连接,3个参数分开写
print db.version
#输出 10.2.0.1.0 测试成功
##输出 10.2.0.1.0 测试成功
```
# 自动提交
## 自动提交
```
db.autocommit=True #开启自动提交
db.autocommit=False #关闭自动提交
```
# 建立 cursor 光标
## 建立 cursor 光标
```
cursor = db.cursor() #建立一个cursor
```
# 执行sql
## 执行sql
```
cursor.execute(select * from tabs) # 执行一条sql
sql = "insert into person(name, age, telephone) values(%s, %s, %s)"
@ -37,7 +37,7 @@ tmp = (('ninini', 89, '888999'), ('koko', 900, '999999'))
conn.executemany(sql, tmp) #执行多条sql
```
# 获取执行结果
## 获取执行结果
```
row=cursor.fetchone() #取一行结果,元组(a,b,c,d)
row=cursor.fetchall() #获取所有结果,列表[(a,b,c,d),(e,f,g,h),...]
@ -47,17 +47,17 @@ for x in row:
print cursor.rowcount() #获取输出记录数量
```
# 提交
## 提交
```
db.commit()
```
# 回滚
## 回滚
```
db.rollback()
```
# 关闭连接
## 关闭连接
```
cursor.close()
db.close()

View File

@ -6,7 +6,7 @@ tags: ["python", "logging"]
categories: ["python"]
---
# 单输出日志到屏幕
## 单输出日志到屏幕
- 示例
```python
import logging
@ -26,7 +26,7 @@ categories: ["python"]
- 默认的日志级别设置为WARNING日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
- 默认的日志格式为日志级别:Logger名称:用户输出消息。
# 配置日志
## 配置日志
- 示例
```python
import logging

View File

@ -6,7 +6,7 @@ tags: ["python", "optionparser"]
categories: ["python"]
---
# 生成标准的、符合Unix/Posix 规范的命令行说明
## 生成标准的、符合Unix/Posix 规范的命令行说明
```python
from optparse import OptionParser
parser = OptionParser()
@ -21,7 +21,7 @@ categories: ["python"]
print 'zdcl is True.'
```
# 简单流程
## 简单流程
```python
# 引入OptionParser类创建OptionParser对象
from optparse import OptionParser
@ -32,7 +32,7 @@ categories: ["python"]
(options, args) = parser.parse_args()
```
# parse_args 和 add_options 函数
## parse_args 和 add_options 函数
- parse_args() 接收一个命令行列表,默认使用 sys.argv\[:-1\]
- 返回两个值options 保存命令行参数值args 是由 positional arguments 组成的列表
- add_option() 用来加入选项parse_args() 解析选项
@ -88,11 +88,11 @@ categories: ["python"]
help = 'interaction mode: novice, intermediate, or expert [default: %default]')
```
# 备注
## 备注
- optparse 解析到 help 后不再解析其他命令行参数usage 信息会优先打印,默认 "usage: %prog \[options\]"
- metavar 提醒用户该参数期待的参数,如 metavar = 'mode' 会在帮助中显示成 -m MODE, --mode=MODE
# OptionGroup 参数分组
## OptionGroup 参数分组
```python
group = OptionGroup(parser, 'Dangerous Options',
'Caution: use these options at your own risk. It is believed that some of them bite.')

View File

@ -6,7 +6,7 @@ tags: ["python", "re"]
categories: ["python"]
---
# match
## match
- 定义
```python
re.match(pattern, string, flags)
@ -16,7 +16,7 @@ categories: ["python"]
- 第二个参数表示要匹配的字符串;
- 第三个参数是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
# search
## search
- 定义
```python
re.search(pattern, string, flags)
@ -24,7 +24,7 @@ categories: ["python"]
- 在字符串内查找模式匹配,只到找到第一个匹配然后返回如果字符串没有匹配则返回None。
- 每个参数的含意与re.match一样。
# sub
## sub
- 定义
```python
re.sub(pattern, repl, string, count)
@ -34,21 +34,21 @@ categories: ["python"]
- 第四个参数指替换个数。默认为0表示每个匹配项都替换。
re.sub还允许使用函数对匹配项的替换进行复杂的处理re.sub(r'\s', lambda m: '[' + m.group(0) + ']', text, 0);将字符串中的空格' '替换为'[ ]'。
# split
## split
- 定义
```python
re.split(pattern, string)
```
- 分割字符串
# findall
## findall
- 定义
```python
re.findall(pattern, text)
```
- 获取字符串中所有匹配的字符串
# compile
## compile
- 定义
```python
re.compile(pattern)

View File

@ -6,7 +6,7 @@ tags: ["python", "shell"]
categories: ["python"]
---
# os
## os
- 阻塞返回shell执行参数命令的状态,即成功返回0
```python
os.system('cat /proc/cpuinfo')
@ -16,7 +16,7 @@ categories: ["python"]
os.popen('cat /proc/cpuinfo')
```
# commands
## commands
- 阻塞,返回参数指定的系统文件的详细属性
```python
commands.getstatus('/proc/cputinfo')
@ -30,7 +30,7 @@ categories: ["python"]
commands.getstatusoutput('cat /proc/cpuinfo')
```
# subprocess
## subprocess
- 阻塞返回shell状态禁用 PIPE 参数
```python
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
@ -44,7 +44,7 @@ categories: ["python"]
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
```
# Pope
## Pope
- 不阻塞返回Popen对象
```python
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

View File

@ -6,7 +6,7 @@ tags: ["redis"]
categories: ["database"]
---
# 环境
## 环境
- 操作系统: CentOS7.7,关闭 firewalld 和 selinux
- Redis: 5.0.6
- master 实例
@ -18,7 +18,7 @@ categories: ["database"]
- 10.0.4.111:6372
- 10.0.4.111:6373
# 编译 redis server
## 编译 redis server
- 在 CentOS7.7 测试服务器上下载、编译
```bash
wget http://download.redis.io/releases/redis-5.0.6.tar.gz
@ -122,7 +122,7 @@ categories: ["database"]
WantedBy=multi-user.target
```
# 部署
## 部署
- 把测试机的 /opt/redis_cluster 目录复制到 10.0.4.110 和 10.0.4.111 上
```bash
scp -r /opt/redis_cluster 10.0.4.110:/opt/
@ -148,7 +148,7 @@ categories: ["database"]
systemctl start redis@6373
```
# 配置集群
## 配置集群
- 在 10.0.4.110 或 10.0.4.111 上创建集群,指定三个 master 实例
```bash
/opt/redis_cluster/bin/redis-cli \
@ -201,7 +201,7 @@ categories: ["database"]
- 输出如下图
![](https://colben.cn/img/3d5e7c0b8e7a7e51028d11358f442947367.png)
# Docker 部署
## Docker 部署
- 安装 docker-ce参考[这里](https://www.colben.cn/post/docker/#%E5%AE%89%E8%A3%85)
- 安装 docker-compose参考[这里](https://www.colben.cn/post/docker/#Compose)
- 选择一个较大分区,创建 redis 集群数据目录和日志目录
@ -353,6 +353,6 @@ categories: ["database"]
docker-compose up -d
```
# 参考
## 参考
- [redis 官网](https://redis.io/topics/cluster-tutorial)

View File

@ -6,7 +6,7 @@ tags: ["redis", "sentinel", "哨兵"]
categories: ["database"]
---
# 环境
## 环境
主机名 | 地址 | 操作系统 | 初始状态
---- | ---- | ---- | ----
sentinel86 | 10.1.14.86 | CentOS7.4 | null
@ -14,27 +14,27 @@ redis87 | 10.1.14.87 | CentOS7.4 | master
redis88 | 10.1.14.88 | CentOS7.4 | slave
redis89 | 10.1.14.89 | CentOS7.4 | slave
# 安装 redis
## 安装 redis
- 在全部服务器上安装 redis
```bash
yum install epel-release
yum install redis
```
# redis master 配置
## redis master 配置
- 在 redis87 上修改 /etc/redis.conf
```
bind 0.0.0.0
```
# redis slave 配置
## redis slave 配置
- 在 redis88 和 redis89 上修改 /etc/redis.conf
```
bind 0.0.0.0
slaveof 10.1.14.87 6379
```
# redis sentinel 配置
## redis sentinel 配置
- 在 sentinel86 上创建三个 sentinel 配置文件
```bash
cd /etc/
@ -103,7 +103,7 @@ redis89 | 10.1.14.89 | CentOS7.4 | slave
systemctl daemon-reload
```
# 启动 redis 服务
## 启动 redis 服务
- 在 redis87、redis88 和 redis89 上启动 redis 服务
```bash
systemctl start redis
@ -111,7 +111,7 @@ redis89 | 10.1.14.89 | CentOS7.4 | slave
redis-cli info replication
```
# 启动 redis sentinel 监控
## 启动 redis sentinel 监控
- 在 sentinel86 上启动 sentinel 监管程序
```bash
systemctl start redis-sentinel-16379

View File

@ -7,14 +7,14 @@ tags: ["rsync", "同步"]
categories: ["shell"]
---
# 简介
## 简介
- rsyncRemote Sync远程同步是一个开源的快速备份工具可以在不同主机之间镜像同步整个目录树支持增量备份保持链接和权限且采用优化的同步算法传输前执行压缩因此非常适用于异地备份、镜像服务器等应用。
- 支持:
- 本地复制
- 与其他SSH同步
- 与rsync主机同步
# rsyncd 源服务
## rsyncd 源服务
- 创建 rsync 配置文件 /etc/rsyncd.conf内容如下
```ini
# 限制客户端登陆身份为 nobody:nobody
@ -62,7 +62,7 @@ categories: ["shell"]
systemctl start rsyncd
```
# rsync 命令选项
## rsync 命令选项
- -r: 递归模式,包含目录及子目录中所有文件
- -l: 对于符号链接文件仍然复制为符号链接文件
- -p: 保留文件的权限标记
@ -79,7 +79,7 @@ categories: ["shell"]
- --checksum: 根据对象的校验和来决定是否跳过文件
- --password-file: 指定包含密码的文件
# 简单使用
## 简单使用
- 本地复制,类似 cp 命令
```bash
rsync -a /etc/passwd 123.txt
@ -96,6 +96,6 @@ categories: ["shell"]
```
- 向同步源服务上传文件时,直接调换源参数和目的参数,注意客户端可写上传目录
# 参考
## 参考
- [https://www.linuxidc.com/Linux/2019-08/160108.htm](https://www.linuxidc.com/Linux/2019-08/160108.htm)

View File

@ -7,7 +7,7 @@ tags: []
categories: ["dev/ops"]
---
# 安装 rust
## 安装 rust
- 安装 rustup参考官网
```bash
export RUST_UPDATE_ROOT=https://mirrors.tuna.tsinghua.edu.cn/rustup
@ -34,8 +34,8 @@ categories: ["dev/ops"]
EOF
```
# 交叉编译
## 树梅派 Alpine armv7/armhf
## 交叉编译
### 树梅派 Alpine armv7/armhf
- 下载交叉编译工具
```bash
curl -LO https://musl.cc/armv7l-linux-musleabihf-cross.tgz
@ -62,7 +62,7 @@ categories: ["dev/ops"]
armv7l-linux-musleabihf-strip target/armv7-unknown-linux-musleabihf/release/{目标二进制文件}
```
## 树梅派 Alpine aarch64
### 树梅派 Alpine aarch64
- 下载交叉编译工具
```bash
curl -LO https://musl.cc/aarch64-linux-musl-cross.tgz

View File

@ -7,13 +7,13 @@ tags: ["sed"]
categories: ["shell"]
---
# 流程
## 流程
- 每次从输入中读取一行
- 匹配数据
- 修改数据
- 输出数据(默认 stdout)
# 选项
## 选项
- -e 执行多个编辑命令
```bash
sed -e 's/root/ROOT/g; s/bin/BIN/g' /etc/passwd
@ -32,7 +32,7 @@ categories: ["shell"]
- -i 直接修改文件本身
- -r 扩展正则表达式,不需要繁琐的转义
# 命令
## 命令
命令 | 描述
---- | ----
s | 替换文本
@ -46,7 +46,7 @@ p | 打印行
w | 写入指定文件
r | 读出指定文件
# 高级命令
## 高级命令
命令 | 描述
---- | ----
x | 交换模式空间与保持空间内容
@ -65,7 +65,7 @@ G | 复制保持空间内容,到模式空间, 追加
- 格式: sed -n ':标签名 范围1 命令1; /模式/b 标签名' filename
- 调用: b, t, T
# 使用
## 使用
- 默认只替换在每行第一次出现目标文本
```bash
sed 's/root/ROOT/' /etc/passwd
@ -174,6 +174,6 @@ G | 复制保持空间内容,到模式空间, 追加
sed -i '/AAAA/{n;n;n;s/$/\nCCCC/}' file_name
```
# 参考
## 参考
- [Sed 介绍和教程](https://www.cnblogs.com/cbscan/articles/2277351.html)

View File

@ -6,7 +6,7 @@ tags: ["shell"]
categories: ["shell"]
---
# BASH 脚本的 $ 参数
## BASH 脚本的 $ 参数
- $$ #shell 本身 PID
- $! #shell 最后执行的后台PID
- $? #shell 结束代码
@ -16,7 +16,7 @@ categories: ["shell"]
- $0 #shell 脚本名
- $1...$n #shell 位置参数
# BASH 字符串处理
## BASH 字符串处理
```bash
# 字符串 str 长度
${#str}
@ -82,7 +82,7 @@ categories: ["shell"]
${var:?word}
```
# BASH 数组
## BASH 数组
```bash
# 定义数组,有三种方式
declare -a array
@ -111,7 +111,7 @@ categories: ["shell"]
array[3]=""
```
# BASH 字典
## BASH 字典
```bash
# 定义字典
declare -A dict
@ -138,7 +138,7 @@ categories: ["shell"]
unset dict['k1']
```
# 终端环境变量 PS1 参数
## 终端环境变量 PS1 参数
- \d 日期格式为weekday month date例如"Mon Aug 1"
- \H 完整的主机名称
- \h 仅取主机的第一个名字
@ -153,7 +153,7 @@ categories: ["shell"]
- \$ 提示字符root 下提示符是 #,普通用户是 $
- \\[\e[i;j;km\\] \\[\e[0m\\] 建议PS1使用这种颜色控制字符
# 终端颜色 \033[F;Bm 控制编码
## 终端颜色 \033[F;Bm 控制编码
- F30 B40 黑色
- F31 B41 红色
- F32 B42 绿色
@ -163,7 +163,7 @@ categories: ["shell"]
- F36 B46 青蓝色
- F37 B47 白色
# 终端光标位置
## 终端光标位置
- \033[K 清除从光标到行尾的内容
- \033[s 保存光标位置
- \033[u 恢复光标位置
@ -182,11 +182,11 @@ categories: ["shell"]
- \033[?25h 显示光标
- \033[y;xH 设置光标位置
# 解析迅雷链接
## 解析迅雷链接
- echo 迅雷专用地址(去掉头 thunder://)|base64 -d
- 去掉头部 AA 和尾部 ZZ
# expect 自动输入密码
## expect 自动输入密码
```bash
expect<<END
spawn ssh $DEST_HOST "REMOTE_COMMAND"
@ -198,7 +198,7 @@ categories: ["shell"]
END
```
# 普通用户(username)免密 sudo
## 普通用户(username)免密 sudo
```bash
echo "username ALL = (root) NOPASSWD:ALL" >> /etc/sudoers
# 或
@ -206,7 +206,7 @@ categories: ["shell"]
chmod 0400 /etc/sudoers.d/username
```
# 用户登陆操作记录
## 用户登陆操作记录
- 创建日志共存目录
```bash
mkdir /var/log/user_history -p

View File

@ -7,7 +7,7 @@ tags: ["raid"]
categories: ["storage"]
---
# mdadm 命令
## mdadm 命令
- 创建软 raid
```bash
mdadm -C -v /dev/创建的设备名 -l级别 -n数量 添加的磁盘 [-x数量 添加的热备份盘]
@ -38,7 +38,7 @@ categories: ["storage"]
mdadm -a /dev/设备名 磁盘
```
# RAID0
## RAID0
- RAID0俗称条带它将两个或多个硬盘组成一个逻辑硬盘容量是所有硬盘之和因为是多个硬盘组合成一个故可并行写操作写入速度提高但此方式硬盘数据没有冗余没有容错一旦一个物理硬盘损坏则所有数据均丢失。因而RAID0适合于对数据量大但安全性要求不高的场景比如音像、视频文件的存储等
![](/img/raid0.jpg)
- 实验: RAID0创建格式化挂载使用
@ -125,7 +125,7 @@ categories: ["storage"]
/dev/md0 xfs 40G 33M 40G 1% /mnt/md0
```
# RAID1
## RAID1
- RAID1俗称镜像它最少由两个硬盘组成且两个硬盘上存储的数据均相同以实现数据冗余。RAID1读操作速度有所提高写操作理论上与单硬盘速度一样但由于数据需要同时写入所有硬盘实际上稍为下降。容错性是所有组合方式里最好的只要有一块硬盘正常则能保持正常工作。但它对硬盘容量的利用率则是最低只有50%因而成本也是最高。RAID1适合对数据安全性要求非常高的场景比如存储数据库数据文件之类
![](/img/raid1.jpg)
- 实验: RAID1创建格式化挂载使用故障模拟重新添加热备份
@ -395,7 +395,7 @@ categories: ["storage"]
3 8 17 - spare /dev/sdb1
```
# RAID5
## RAID5
- RAID5最少由三个硬盘组成它将数据分散存储于阵列中的每个硬盘并且还伴有一个数据校验位数据位与校验位通过算法能相互验证当丢失其中的一位时RAID控制器能通过算法利用其它两位数据将丢失的数据进行计算还原。因而RAID5最多能允许一个硬盘损坏有容错性。RAID5相对于其它的组合方式在容错与成本方面有一个平衡因而受到大多数使用者的欢迎。一般的磁盘阵列最常使用的就是RAID5这种方式
![](/img/raid5.jpg)
- 实验: RAID5创建格式化挂载使用故障模拟重新添加热备份
@ -681,7 +681,7 @@ categories: ["storage"]
5 8 17 - spare /dev/sdb1
```
# RAID6
## RAID6
- RAID6是在RAID5的基础上改良而成的RAID6再将数据校验位增加一位所以允许损坏的硬盘数量也由 RAID5的一个增加到二个。由于同一阵列中两个硬盘同时损坏的概率非常少所以RAID6用增加一块硬盘的代价换来了比RAID5更高的数据安全性
![](/img/raid6.jpg)
- 实验: RAID6创建格式化挂载使用故障模拟重新添加热备份
@ -984,7 +984,7 @@ categories: ["storage"]
7 8 33 - spare /dev/sdc1
```
# RAID10
## RAID10
- RAID10是先将数据进行镜像操作然后再对数据进行分组RAID1在这里就是一个冗余的备份阵列而RAID0则负责数据的读写阵列。至少要四块盘两两组合做RAID1然后做RAID0RAID10对存储容量的利用率和RAID1一样低只有50%。Raid10方案造成了50%的磁盘浪费但是它提供了200%的速度和单磁盘损坏的数据安全性并且当同时损坏的磁盘不在同一RAID1中就能保证数据安全性RAID10能提供比RAID5更好的性能。这种新结构的可扩充性不好使用此方案比较昂贵
![](/img/raid10.jpg)
- 实验: RAID10创建格式化挂载使用故障模拟重新添加热备份
@ -1469,7 +1469,7 @@ categories: ["storage"]
1 8 65 1 active sync /dev/sde1
```
# 常用 RAID 比较
## 常用 RAID 比较
名称 | 硬盘数量 | 容量/利用率 | 读性能 | 写性能 | 数据冗余
---- | ---- | ---- | ---- | ---- | ----
RAID0 | N | N块总和 | N倍 | N倍 | 无,一个故障,丢失所有数据
@ -1479,6 +1479,6 @@ RAID6 | N≥4 | (N-2)/N | ↑↑ | ↓↓ | 双重校验,
RAID10 | N(偶数N≥4) | 50% | (N/2)倍 | (N/2)倍 | 允许基组中的磁盘各损坏一个
# 参考
## 参考
- [https://www.linuxidc.com/Linux/2019-08/160345.htm](https://www.linuxidc.com/Linux/2019-08/160345.htm)

View File

@ -6,7 +6,7 @@ tags: ["sqoop", "hive", "mysql"]
categories: ["hadoop"]
---
# 把 mysql 表数据导入 hive 中
## 把 mysql 表数据导入 hive 中
- 命令格式
```bash
sqoop import {参数列表}
@ -38,7 +38,7 @@ categories: ["hadoop"]
--last-value _last_value_
```
# 把 hive 表数据导入 mysql 中
## 把 hive 表数据导入 mysql 中
- 命令格式
```bash
sqoop export {参数列表}

View File

@ -7,7 +7,7 @@ tags: ["ssh", "隧道", "转发"]
categories: ["shell"]
---
# sshd 常规设置
## sshd 常规设置
- 禁用 root 远程登陆
```
PermitRootLogin no
@ -27,12 +27,12 @@ categories: ["shell"]
ClientAliveCountMax 3
```
# ssh 参数
## ssh 参数
- -f 后台运行
- -N 仅作端口转发,不执行任何命令
- -g 绑定端口到全部网卡
# 本地定向转发
## 本地定向转发
- ssh-client 不可达 remote-host, ssh-server 可达 remote-host, ssh 隧道映射 ssh-client 指定端口到 remote-host 指定端口
- 在 ssh-client 执行
```bash
@ -41,7 +41,7 @@ categories: ["shell"]
username@<ssh-server>
```
# 远程定向转发
## 远程定向转发
- ssh-client 可达 remote-host, ssh-server 不可达 remote-host, ssh 隧道映射 ssh-server 指定端口到 remote-host 指定端口
- 在 ssh-client 执行
```bash
@ -50,7 +50,7 @@ categories: ["shell"]
username@<ssh-server>
```
# 动态转发
## 动态转发
- SOCKS5 代理
- 在 ssh-client 执行
```bash

Some files were not shown because too many files have changed in this diff Show More