diff --git a/content/post/ansible.md b/content/post/ansible.md index 602d487..2da79d9 100644 --- a/content/post/ansible.md +++ b/content/post/ansible.md @@ -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) diff --git a/content/post/archlinux-install.md b/content/post/archlinux-install.md index e98cc6e..304d140 100644 --- a/content/post/archlinux-install.md +++ b/content/post/archlinux-install.md @@ -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 diff --git a/content/post/awk.md b/content/post/awk.md index 6ef4a91..ef770c2 100644 --- a/content/post/awk.md +++ b/content/post/awk.md @@ -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) diff --git a/content/post/bond.md b/content/post/bond.md index b63e1fb..21be156 100644 --- a/content/post/bond.md +++ b/content/post/bond.md @@ -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 diff --git a/content/post/cassandra-install.md b/content/post/cassandra-install.md index 7c6c9e9..8162865 100644 --- a/content/post/cassandra-install.md +++ b/content/post/cassandra-install.md @@ -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 ( diff --git a/content/post/centos6-migrate.md b/content/post/centos6-migrate.md index c1dc7e5..6d79c8f 100644 --- a/content/post/centos6-migrate.md +++ b/content/post/centos6-migrate.md @@ -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 diff --git a/content/post/centos6-nopae.md b/content/post/centos6-nopae.md index 65e0a75..ac37de9 100644 --- a/content/post/centos6-nopae.md +++ b/content/post/centos6-nopae.md @@ -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 diff --git a/content/post/centos6-oracle11g.md b/content/post/centos6-oracle11g.md index 2a4b3d4..e56ab83 100644 --- a/content/post/centos6-oracle11g.md +++ b/content/post/centos6-oracle11g.md @@ -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 diff --git a/content/post/centos7-migrate.md b/content/post/centos7-migrate.md index 525f41b..90dee3e 100644 --- a/content/post/centos7-migrate.md +++ b/content/post/centos7-migrate.md @@ -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) diff --git a/content/post/centos7.md b/content/post/centos7.md index f6e9774..1db903a 100644 --- a/content/post/centos7.md +++ b/content/post/centos7.md @@ -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 分钟 ``` diff --git a/content/post/ceph-install.md b/content/post/ceph-install.md index 4371426..f6fe882 100644 --- a/content/post/ceph-install.md +++ b/content/post/ceph-install.md @@ -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 个副本 diff --git a/content/post/ceph.md b/content/post/ceph.md index 647ddd3..4cfcae4 100644 --- a/content/post/ceph.md +++ b/content/post/ceph.md @@ -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 diff --git a/content/post/ch-buffer.md b/content/post/ch-buffer.md index f6f6877..3933a93 100644 --- a/content/post/ch-buffer.md +++ b/content/post/ch-buffer.md @@ -6,11 +6,11 @@ tags: [] categories: ["clickhouse"] --- -# Buffer 表引擎简介 +## Buffer 表引擎简介 - 只写内存,无持久化存储 - 缓冲高并发写入,满足条件时,Buffer 表会把数据刷新到目标表 -# 创建 Join 引擎表 +## 创建 Join 引擎表 - 声明 ```sql ENGINE = Buffer( diff --git a/content/post/ch-datadict.md b/content/post/ch-datadict.md index 66d1a22..88b3514 100644 --- a/content/post/ch-datadict.md +++ b/content/post/ch-datadict.md @@ -6,17 +6,17 @@ tags: [] categories: ["clickhouse"] --- -# 简介 +## 简介 - 常驻内存,支持动态更新 - 适合保存常量和经常使用的维度表数据 - 可通过字典函数访问,也可通过袋里表与其他数据表实现 JOIN 查询 -# 内置字典 +## 内置字典 - 默认禁用 - 不想写了,没啥意思 -# 外部扩展字典 -## 配置文件 +## 外部扩展字典 +### 配置文件 - 位置: /etc/clickhouse-server/\*\_dictionary.xml - 自动感知变更,不停机在线更新 - 系统表: system.dictionaries @@ -201,7 +201,7 @@ categories: ["clickhouse"] ``` -## 操作 +### 操作 - 手动更新全部数据字典 ```sql SYSTEM RELOAD DICTIONARIES; @@ -239,7 +239,7 @@ categories: ["clickhouse"] LIFETIME(1); ``` -# Dictionary 表引擎 +## Dictionary 表引擎 - 创建字典表 ```sql CREATE TABLE table_name( diff --git a/content/post/ch-datatype.md b/content/post/ch-datatype.md index cbbfe8f..a781429 100644 --- a/content/post/ch-datatype.md +++ b/content/post/ch-datatype.md @@ -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-12,0 填充 -## 时间 +### 时间 声明 | 精度 | 示例 ---- | ---- | ---- 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 系统表查询进度 diff --git a/content/post/ch-file.md b/content/post/ch-file.md index e80e3f0..ca30b20 100644 --- a/content/post/ch-file.md +++ b/content/post/ch-file.md @@ -6,13 +6,13 @@ tags: [] categories: ["clickhouse"] --- -# File 表引擎简介 +## File 表引擎简介 - 直接读取本地文件 - 修改文件 = 数据更新 - 导出数据到本地文件 - 数据格式转换 -# 创建 FILE 引擎表 +## 创建 FILE 引擎表 - 声明 ```sql ENGINE = File('format') diff --git a/content/post/ch-install.md b/content/post/ch-install.md index 710ab64..ba6ce96 100644 --- a/content/post/ch-install.md +++ b/content/post/ch-install.md @@ -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 值 ``` -## 启动 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 diff --git a/content/post/ch-join.md b/content/post/ch-join.md index 105274a..50a1056 100644 --- a/content/post/ch-join.md +++ b/content/post/ch-join.md @@ -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) diff --git a/content/post/ch-kafka.md b/content/post/ch-kafka.md index c0e4e45..db12d83 100644 --- a/content/post/ch-kafka.md +++ b/content/post/ch-kafka.md @@ -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 引擎表,充当数据管道 - 创建 MergeTree 引擎表,用于查询 - 创建物化视图,同步 kafka 数据到 MergeTree 引擎表 diff --git a/content/post/ch-liveview.md b/content/post/ch-liveview.md index 5e92c97..4e79c52 100644 --- a/content/post/ch-liveview.md +++ b/content/post/ch-liveview.md @@ -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; diff --git a/content/post/ch-log.md b/content/post/ch-log.md index 008bb1f..70ab04f 100644 --- a/content/post/ch-log.md +++ b/content/post/ch-log.md @@ -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 表引擎 - 数据文件按列存储 - 有数据标记文件,可并行读取 - 声明 diff --git a/content/post/ch-memory.md b/content/post/ch-memory.md index 9d282f4..9a3456d 100644 --- a/content/post/ch-memory.md +++ b/content/post/ch-memory.md @@ -6,12 +6,12 @@ tags: [] categories: ["clickhouse"] --- -# Memory 表引擎简介 +## Memory 表引擎简介 - 数据只存于内存中,无压缩,无格式转换 - 支持并行查询 - 一般用于 clickhouse 内部,作为集群间分发数据的载体 -# 创建 Memory 引擎表 +## 创建 Memory 引擎表 - 声明 ```sql ENGINE = Memory() diff --git a/content/post/ch-merge.md b/content/post/ch-merge.md index 3302081..66ca2e7 100644 --- a/content/post/ch-merge.md +++ b/content/post/ch-merge.md @@ -6,13 +6,13 @@ tags: [] categories: ["clickhouse"] --- -# Merge 表引擎简介 +## Merge 表引擎简介 - 本身不存储数据,只整合其他数据表 - 不支持数据写入 - 合并异步查询的结果集 - 各异步查询的数据表需要在同一个数据库下,且表结构相同,表引擎和分区定义可不同 -# 创建 Merge 表引擎 +## 创建 Merge 表引擎 - 声明 ```sql ENGINE = Merge(database, table_name) diff --git a/content/post/ch-mergetree.md b/content/post/ch-mergetree.md index b0c2edb..0254a37 100644 --- a/content/post/ch-mergetree.md +++ b/content/post/ch-mergetree.md @@ -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 @@ -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 diff --git a/content/post/ch-mysql.md b/content/post/ch-mysql.md index 7d6193d..3d8d7d3 100644 --- a/content/post/ch-mysql.md +++ b/content/post/ch-mysql.md @@ -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 引擎表中读取数据 diff --git a/content/post/ch-null.md b/content/post/ch-null.md index b633f2d..9357fa6 100644 --- a/content/post/ch-null.md +++ b/content/post/ch-null.md @@ -6,11 +6,11 @@ tags: [] categories: ["clickhouse"] --- -# Null 表引擎简介 +## Null 表引擎简介 - 类似 /dev/null,忽略写入的任何数据,查询时返回空表 - 如果物化视图不需要保留源表数据,则可设置源表为 Null 引擎 -# 创建 Null 表引擎 +## 创建 Null 表引擎 - 声明 ```sql ENGINE = Null diff --git a/content/post/ch-ops.md b/content/post/ch-ops.md index 902ed60..db19322 100644 --- a/content/post/ch-ops.md +++ b/content/post/ch-ops.md @@ -6,12 +6,12 @@ tags: [] categories: ["clickhouse"] --- -# 指标 +## 指标 - system.metrics: 正在执行的概要信息,如正在运行的查询和操作数量 - system.events: 累积概要信息,如总的查询次数或 SELECT 次数 - system.asynchronous_metrics: 后台异步运行的概要信息,如分配内存、队列中的人物数量 -# 日志 +## 日志 - system.query: 执行用户、查询语句、执行时间、返回数据量等信息 ```xml diff --git a/content/post/ch-replicated.md b/content/post/ch-replicated.md index 118850d..3ee87de 100644 --- a/content/post/ch-replicated.md +++ b/content/post/ch-replicated.md @@ -6,12 +6,12 @@ tags: [] categories: ["clickhouse"] --- -# 简介 +## 简介 - 一个集群包含多个逻辑分片,每个逻辑分片包含多个副本节点 - 向集群内读写数据时,需依赖 Distributed 引擎表做为代理,实现数据的分发、写入、查询和路由 - ReplicatedMerge 表引擎配合 zookeeper 实现数据的复制 -# 集群配置 +## 集群配置 - 节点分配 ```xml @@ -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 子句,发起分布式查询 diff --git a/content/post/ch-search.md b/content/post/ch-search.md index c9fb1c1..a4fda32 100644 --- a/content/post/ch-search.md +++ b/content/post/ch-search.md @@ -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 key,key_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 FIRST,NULL -> 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 * 查询** diff --git a/content/post/ch-set.md b/content/post/ch-set.md index 87b6cab..201893f 100644 --- a/content/post/ch-set.md +++ b/content/post/ch-set.md @@ -6,18 +6,18 @@ tags: [] categories: ["clickhouse"] --- -# Set 表引擎简介 +## Set 表引擎简介 - 数据先写内存,再同步到磁盘,服务重启后全量加载到内存 - 支持 INSERT,写入时,重复数据被忽略 - 不能直接 SELECT,只能作为 IN 查询的右侧条件 -# 创建 Set 引擎表 +## 创建 Set 引擎表 - 声明 ```sql ENGINE = Set() ``` -# 使用 +## 使用 - 创建 Set 引擎表 - INSERT 写入数据 - 查询 diff --git a/content/post/ch-url.md b/content/post/ch-url.md index e39b659..e9f93df 100644 --- a/content/post/ch-url.md +++ b/content/post/ch-url.md @@ -6,12 +6,12 @@ tags: [] categories: ["clickhouse"] --- -# URL 表引擎简介 +## URL 表引擎简介 - http 客户端,支持 http 和 https 协议 - SELECT 转换成 GET 请求 - INSERT 转换成 POST 请求 -# 创建 URL 表引擎 +## 创建 URL 表引擎 - 声明 ```sql ENGINE = URL('url', format) diff --git a/content/post/cloudera-manager.md b/content/post/cloudera-manager.md index 7946bc0..a950b9b 100644 --- a/content/post/cloudera-manager.md +++ b/content/post/cloudera-manager.md @@ -7,7 +7,7 @@ tags: [cloudera cdh] categories: ["hadoop"] --- -# 环境 +## 环境 角色 | IP | 主机名 | 服务 ---- | ---- | ---- | ---- @@ -19,7 +19,7 @@ Worker | 192.168.1.104 | w0.colben.cn | DataNode
NodeManager Worker | 192.168.1.105 | w0.colben.cn | DataNode
NodeManager Worker | 192.168.1.106 | w0.colben.cn | DataNode
NodeManager -# 配置 ssh 免密登陆 +## 配置 ssh 免密登陆 - 在 cm0 上配置 ssh 可免密登陆全部服务器 ``` @@ -29,7 +29,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode
NodeManager - 这里的**私钥会在后面通过界面增加主机时用到** -# 关闭防火墙和 selinux +## 关闭防火墙和 selinux - 在全部服务器上关闭防火墙 ``` @@ -43,7 +43,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode
NodeManager sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config ``` -# 配置网络名称 +## 配置网络名称 - 在全部服务器上修改 /etc/hosts,增加如下解析记录 ``` @@ -66,7 +66,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode
NodeManager hostnamectl set-hostname XXXX.colben.cn ``` -# 配置时间同步 +## 配置时间同步 - 在 cm0 上配置修改 /etc/chrony.conf ``` @@ -84,7 +84,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode
NodeManager systemctl restart chronyd ``` -# 配置 cloudera manager 内网安装源 +## 配置 cloudera manager 内网安装源 - 在 cm0 上安装并启动 httpd 服务 ``` @@ -138,7 +138,7 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode
NodeManager - 通过界面增加其他主机时,cloudera manager 会自动部署该 repo 文件 -# 安装 jdk +## 安装 jdk - 在 cm0 上安装 jdk ``` @@ -147,14 +147,14 @@ Worker | 192.168.1.106 | w0.colben.cn | DataNode
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
NodeManager /usr/share/java/mysql-connector-java.jar ``` -# 启动 cloudera manager +## 启动 cloudera manager - 在 cm0 上启动 cloudera manager ``` systemctl start cloudera-scm-server diff --git a/content/post/configmap.md b/content/post/configmap.md index 3e497cb..a7c3e79 100644 --- a/content/post/configmap.md +++ b/content/post/configmap.md @@ -6,12 +6,12 @@ tags: ["kubernetes", "configmap"] categories: ["container"] --- -# 概述 +## 概述 - ConfigMap 通常用于设置环境变量、设置命令行参数、创建配置文件 - Pod 使用 ConfigMap 前,ConfigMap 必须存在,否则 pod 不能启动 - ConfigMap 只能被在同一一个命名空间中的Pod所引用 -# 创建 ConfigMap +## 创建 ConfigMap - 命令如下 ```bash kubectl create configmap @@ -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"] ``` - 保存变更后的Pod,Pod将会输出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) diff --git a/content/post/docker.md b/content/post/docker.md index 3f6256d..5985aa6 100644 --- a/content/post/docker.md +++ b/content/post/docker.md @@ -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 diff --git a/content/post/drone.md b/content/post/drone.md index 36b7387..e641c45 100644 --- a/content/post/drone.md +++ b/content/post/drone.md @@ -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://:,此时会跳转到 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 diff --git a/content/post/elasticsearch.md b/content/post/elasticsearch.md index 5ba771e..6abed0e 100644 --- a/content/post/elasticsearch.md +++ b/content/post/elasticsearch.md @@ -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) diff --git a/content/post/es-install.md b/content/post/es-install.md index a094069..eada81d 100644 --- a/content/post/es-install.md +++ b/content/post/es-install.md @@ -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 的根目录下 diff --git a/content/post/firewalld.md b/content/post/firewalld.md index ae518ea..c1137b8 100644 --- a/content/post/firewalld.md +++ b/content/post/firewalld.md @@ -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=] --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= @@ -86,7 +86,7 @@ categories: ["network"] ```bash firewall-cmd [--zone=] --query-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=] --query-service= ``` -# 端口和协议组合 +## 端口和协议组合 - 查看配置的全部端口规则 ```bash firewall-cmd [--permanent] [--zone=zone] --list-ports @@ -140,7 +140,7 @@ categories: ["network"] firewall-cmd [--zone=] --query-port=[-]/ [--permanent] ``` -# ICMP +## ICMP - 查看支持的 icmp 类型 ```bash firewall-cmd --get-icmptypes [--permanent] @@ -163,7 +163,7 @@ categories: ["network"] firewall-cmd [--zone=] --query-icmp-block= [--permanent] ``` -# IPV4 源地址转换 +## IPV4 源地址转换 - 启动 zone 中 ipv4 源地址转换 ```bash firewall-cmd [--zone=] --add-masquerade \ @@ -178,7 +178,7 @@ categories: ["network"] firewall-cmd [--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=] [ --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 一起使用 diff --git a/content/post/ftp.md b/content/post/ftp.md index 2171558..e8b4ef2 100644 --- a/content/post/ftp.md +++ b/content/post/ftp.md @@ -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) diff --git a/content/post/gnome.md b/content/post/gnome.md index a7c7ee3..20842b5 100644 --- a/content/post/gnome.md +++ b/content/post/gnome.md @@ -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 diff --git a/content/post/grub.md b/content/post/grub.md index c95d873..18e1154 100644 --- a/content/post/grub.md +++ b/content/post/grub.md @@ -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) diff --git a/content/post/haproxy.md b/content/post/haproxy.md index b5637ef..e39a982 100644 --- a/content/post/haproxy.md +++ b/content/post/haproxy.md @@ -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 </proc/sys/net/ipv6/conf/all/disable_ipv6 diff --git a/content/post/k3s-install.md b/content/post/k3s-install.md index 9651223..fa57f44 100644 --- a/content/post/k3s-install.md +++ b/content/post/k3s-install.md @@ -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 集群轮换证书 diff --git a/content/post/k8s-coredns.md b/content/post/k8s-coredns.md index 5264780..f7b7882 100644 --- a/content/post/k8s-coredns.md +++ b/content/post/k8s-coredns.md @@ -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 < 1.coredns-rbac.yml < 2.coredns-configmap.yml < 3.coredns-deployment.yml < 4.coredns-service.yml < -n kube-system ``` -# 参考 +## 参考 - [coredns 部署](https://github.com/coredns/deployment/tree/master/kubernetes) diff --git a/content/post/k8s-install.md b/content/post/k8s-install.md index 5bab88f..0fcc3a5 100644 --- a/content/post/k8s-install.md +++ b/content/post/k8s-install.md @@ -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/) -# 运行一个测试示例 +## 运行一个测试示例 - 暂无 diff --git a/content/post/kafka-install.md b/content/post/kafka-install.md index 7c45c31..d5b2172 100644 --- a/content/post/kafka-install.md +++ b/content/post/kafka-install.md @@ -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 服务 diff --git a/content/post/keepalived-install.md b/content/post/keepalived-install.md index abe0e16..b1bb942 100644 --- a/content/post/keepalived-install.md +++ b/content/post/keepalived-install.md @@ -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 { @@ -118,7 +118,7 @@ categories: ["ha/lb"] } ``` -# LVS配置(不涉及lvs时无需下面配置) +## LVS配置(不涉及lvs时无需下面配置) - 虚拟主机组 ``` virtual_server_group { @@ -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) diff --git a/content/post/keepalived.md b/content/post/keepalived.md index bb71ae6..5e4f02e 100644 --- a/content/post/keepalived.md +++ b/content/post/keepalived.md @@ -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 diff --git a/content/post/kickstart-centos7.md b/content/post/kickstart-centos7.md index 2527cff..3f50d4a 100644 --- a/content/post/kickstart-centos7.md +++ b/content/post/kickstart-centos7.md @@ -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) diff --git a/content/post/kubeadm.md b/content/post/kubeadm.md index 738d802..815b382 100644 --- a/content/post/kubeadm.md +++ b/content/post/kubeadm.md @@ -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 < /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 : --discovery-token-ca-cert-hash sha256: diff --git a/content/post/letsencrypt.md b/content/post/letsencrypt.md index de56a47..26e990c 100644 --- a/content/post/letsencrypt.md +++ b/content/post/letsencrypt.md @@ -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 { diff --git a/content/post/linux-io-random.md b/content/post/linux-io-random.md index 88b50e2..98bb12d 100644 --- a/content/post/linux-io-random.md +++ b/content/post/linux-io-random.md @@ -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) diff --git a/content/post/lvm.md b/content/post/lvm.md index a4b365c..c4a59b1 100644 --- a/content/post/lvm.md +++ b/content/post/lvm.md @@ -7,10 +7,10 @@ tags: ["lvm"] categories: ["storage"] --- -# LVM 一览 +## LVM 一览 ![lvm一览](/img/lvm.jpg "lvm一览") -# LVM 结构 +## LVM 结构 - PE 物理扩展 - PV 物理卷,在设备起始处放置一个标签,包括 uuid,lvm 配置元数据位置以及剩余空间 - 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_size,datavg(vg name) @@ -171,7 +171,7 @@ categories: ["storage"] ``` - 查看 lvs,mount 挂载 -# lvm 灾难恢复 +## lvm 灾难恢复 - 场景: 三块盘做 lvm,现有一物理盘损坏,将剩下两块放到其他linux服务器上 - 恢复步骤 - 查看磁盘信息,lvm信息,确认能查到lvm相关信息,找到VG组的名字 diff --git a/content/post/lvs.md b/content/post/lvs.md index 62cd301..6ee02a5 100644 --- a/content/post/lvs.md +++ b/content/post/lvs.md @@ -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) diff --git a/content/post/makefile.md b/content/post/makefile.md index e545151..5763304 100644 --- a/content/post/makefile.md +++ b/content/post/makefile.md @@ -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 includefilename可以是当前操作系统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 : : @@ -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 = @@ -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 @@ -994,8 +994,8 @@ categories: ["dev/ops"] - 特别注意的是,make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量(如"$@"等)放入条件表达式中,因为自动化变量是在运行时才有的。而且,为了避免混乱,make不允许把整个条件语句分成两部分放在不同的文件中。 -# 函数 -## 函数的调用语法 +## 函数 +### 函数的调用语法 - 函数调用,很像变量的使用,也是以"$"来标识的,其语法如下: ```makefile $( ) @@ -1015,8 +1015,8 @@ categories: ["dev/ops"] ``` - 在这个示例中,$(comma)的值是一个逗号。$(space)使用了$(empty)定义了一个空格,$(foo)的值是"a b c",$(bar)的定义用,调用了函数"subst",这是一个替换函数,这个函数有三个参数,第一个参数是被替换字串,第二个参数是替换字串,第三个参数是替换操作作用的字串。这个函数也就是把$(foo)中的空格替换成逗号,所以$(bar)的值是"a,b,c"。 -## 字符串处理函数 -### 字符串替换函数 subst +### 字符串处理函数 +#### 字符串替换函数 subst - 功能:把字串\中的字符串替换成。 - 返回:函数返回被替换过后的字符串。 - 语法: @@ -1029,7 +1029,7 @@ categories: ["dev/ops"] ``` - 把"feet on the street"中的"ee"替换成"EE",返回结果是"fEEt on the strEEt"。 -### 模式字符串替换函数 patsubst +#### 模式字符串替换函数 patsubst - 功能:查找\中的单词(单词以"空格"、"Tab"或"回车""换行"分隔)是否符合模式,如果匹配的话,则以替换。这里,可以包括通配符"%",表示任意长度的字串。如果中也包含"%",那么,中的这个"%"将是中的那个"%"所代表的字串。(可以用"\"来转义,以"\%"来表示真实含义的"%"字符)返回:函数返回被替换过后的字符串。 - 语法: ```makefile @@ -1058,7 +1058,7 @@ categories: ["dev/ops"] ``` - 例如有:objects = foo.o bar.o baz.o,那么,"$(objects:.o=.c)"和"$(patsubst %.o,%.c,$(objects))"是一样的。 -### 去空格函数 strip +#### 去空格函数 strip - 功能:去掉字串中开头和结尾的空字符。 - 返回:返回被去掉空格的字符串值。 - 语法 @@ -1071,7 +1071,7 @@ categories: ["dev/ops"] ``` - 把字串"a b c "去到开头和结尾的空格,结果是"a b c"。 -### 查找字符串函数findstring +#### 查找字符串函数findstring - 功能:在字串中查找字串。 - 返回:如果找到,那么返回,否则返回空字符串。 - 语法: @@ -1085,7 +1085,7 @@ categories: ["dev/ops"] ``` - 第一个函数返回"a"字符串,第二个返回""字符串(空字符串) -### 过滤函数 filter +#### 过滤函数 filter - 功能:以模式过滤\字符串中的单词,保留符合模式的单词。可以有多个模式。 - 返回:返回符合模式的字串。 - 语法: @@ -1101,7 +1101,7 @@ categories: ["dev/ops"] - $(filter %.c %.s,$(sources))返回的值是"foo.c bar.c baz.s"。 -### 反过滤函数 filter-out +#### 反过滤函数 filter-out - 功能:以模式过滤\字符串中的单词,去除符合模式的单词。可以有多个模式。 - 返回:返回不符合模式的字串。 - 语法: @@ -1115,7 +1115,7 @@ categories: ["dev/ops"] ``` - $(filter-out $(mains),$(objects)) 返回值是"foo.o bar.o"。 -### 排序函数 sort。 +#### 排序函数 sort。 - 功能:给字符串中的单词排序(升序)。 - 返回:返回排序后的字符串。 - 语法: @@ -1125,7 +1125,7 @@ categories: ["dev/ops"] - 示例:$(sort foo bar lose)返回"bar foo lose" 。 - 备注:sort函数会去掉中相同的单词。 -### 取单词函数 word +#### 取单词函数 word - 功能:取字符串\中第个单词。(从一开始) - 返回:返回字符串\中第个单词。如果比\中的单词数要大,那么返回空字符串。 - 语法: @@ -1134,7 +1134,7 @@ categories: ["dev/ops"] ``` - 示例:$(word 2, foo bar baz)返回值是"bar"。 -### 取单词串函数 wordlist +#### 取单词串函数 wordlist - 功能:从字符串\中取从\开始到的单词串,\是一个数字。 - 返回:返回字符串\中从\的单词字串。如果\比\中的单词数要大,那么返回空字符串。如果大于\的单词数,那么返回从\开始,到\结束的单词串。 - 语法: @@ -1143,7 +1143,7 @@ categories: ["dev/ops"] ``` - 示例: $(wordlist 2, 3, foo bar baz)返回值是"bar baz"。 -### 单词个数统计函数 words +#### 单词个数统计函数 words - 功能:统计\中字符串中的单词个数。 - 返回:返回\中的单词数。 - 语法: @@ -1156,7 +1156,7 @@ categories: ["dev/ops"] $(word $(words \),\ )。 ``` -### 首单词函数 firstword +#### 首单词函数 firstword - 功能:取字符串\中的第一个单词。 - 返回:返回字符串\的第一个单词。 - 语法: @@ -1166,17 +1166,17 @@ categories: ["dev/ops"] - 示例:$(firstword foo bar)返回值是"foo"。 - 备注:这个函数可以用word函数来实现:$(word 1,\ )。 -### 应用例子 +#### 应用例子 - make使用"VPATH"变量来指定"依赖文件"的搜索路径,我们可以利用这个搜索路径来指定编译器对头文件的搜索路径参数CFLAGS,如: ```makefile override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH))) ``` - 如果我们的"$(VPATH)"值是"src:../headers",那么"$(patsubst %,-I%,$(subst :, ,$(VPATH)))"将返回"-Isrc -I../headers",这正是cc或gcc搜索头文件路径的参数 。 -## 文件名操作函数 +### 文件名操作函数 - 下面我们要介绍的函数主要是处理文件名的。每个函数的参数字符串都会被当做一个或是一系列的文件名来对待。 -### 取目录函数 dir +#### 取目录函数 dir - 功能:从文件名序列中取出目录部分。目录部分是指最后一个反斜杠("/")之 - 前的部分。如果没有反斜杠,那么返回"./"。 - 返回:返回文件名序列的目录部分。 @@ -1186,7 +1186,7 @@ categories: ["dev/ops"] ``` - 示例: $(dir src/foo.c hacks)返回值是"src/ ./"。 -### 取文件函数 notdir +#### 取文件函数 notdir - 功能:从文件名序列中取出非目录部分。非目录部分是指最后一个反斜杠("/")之后的部分。 - 返回:返回文件名序列的非目录部分。 - 语法: @@ -1195,7 +1195,7 @@ categories: ["dev/ops"] ``` - 示例: $(notdir src/foo.c hacks)返回值是"foo.c hacks"。 -### 取后缀函数 suffix +#### 取后缀函数 suffix - 功能:从文件名序列中取出各个文件名的后缀。 - 返回:返回文件名序列的后缀序列,如果文件没有后缀,则返回空字串。 - 语法: @@ -1204,7 +1204,7 @@ categories: ["dev/ops"] ``` - 示例:$(suffix src/foo.c src-1.0/bar.c hacks)返回值是".c .c"。 -### 取前缀函数 basename +#### 取前缀函数 basename - 功能:从文件名序列中取出各个文件名的前缀部分。 - 返回:返回文件名序列的前缀序列,如果文件没有前缀,则返回空字串。 - 语法: @@ -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 - 功能:把后缀加到中的每个单词后面。 - 返回:返回加过后缀的文件名序列。 - 语法: @@ -1222,7 +1222,7 @@ categories: ["dev/ops"] ``` - 示例:$(addsuffix .c,foo bar)返回值是"foo.c bar.c"。 -### 加前缀函数 addprefix +#### 加前缀函数 addprefix - 功能:把前缀加到中的每个单词后面。 - 返回:返回加过前缀的文件名序列。 - 语法: @@ -1231,7 +1231,7 @@ categories: ["dev/ops"] ``` - 示例:$(addprefix src/,foo bar)返回值是"src/foo src/bar"。 -### 连接函数 join。 +#### 连接函数 join。 - 功能:把中的单词对应地加到的单词后面。如果的单词个数要比的多,那么,中的多出来的单词将保持原样。如果的单词个数要比多,那么,多出来的单词将被复制到中。 - 返回:返回连接过后的字符串。 - 语法: @@ -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 ,,\ ) @@ -1255,7 +1255,7 @@ categories: ["dev/ops"] - 上面的例子中,$(name)中的单词会被挨个取出,并存到变量"n"中,"$(n).o"每次根据"$(n)"计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,$(files)的值是"a.o b.o c.o d.o"。 - 注意,foreach中的参数是一个临时的局部变量,foreach函数执行完后,参数的变量将不在作用,其作用域只在foreach函数当中。 -## if 函数 +### if 函数 - if函数很像GNU的make所支持的条件语句 ifeq(参见前面所述的章节),if函数的语法是: ```makefile $(if , ) @@ -1268,7 +1268,7 @@ categories: ["dev/ops"] - 而if函数的返回值是,如果为真(非空字符串),那个会是整个函数的返回值,如果为假(空字符串),那么会是整个函数的返回值,此时如果没有被定义,那么,整个函数返回空字串。 - 所以,只会有一个被计算。 -## call函数 +### call函数 - call函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达式,这个表达式中,你可以定义许多参数,然后你可以用call函数来向这个表达式传递参数。其语法是: ```makefile $(call ,,,...) @@ -1285,7 +1285,7 @@ categories: ["dev/ops"] ``` - 此时的foo的值就是"b a"。 -## origin 函数 +### origin 函数 - origin函数不像其它的函数,他并不操作变量的值,他只是告诉你你的这个变量是哪里来的?其语法是: ```makefile $(origin ) @@ -1308,7 +1308,7 @@ categories: ["dev/ops"] ``` - 当然,你也许会说,使用override关键字不就可以重新定义环境中的变量了吗?为什么需要使用这样的步骤?是的,我们用override是可以达到这样的效果,可是override过于粗暴,它同时会把从命令行定义的变量也覆盖了,而我们只想重新定义环境传来的,而不想重新定义命令行传来的。 -## shell函数 +### shell函数 - shell 函数也不像其它的函数。顾名思义,它的参数应该就是操作系统Shell的命令。它和反引号"`"是相同的功能。这就是说,shell函数把执行操作系统命令后的输出作为函数返回。于是,我们可以用操作系统命令以及字符串处理命令awk,sed等等命令来生成一个变量,如: ```makefile contents := $(shell cat foo) @@ -1317,7 +1317,7 @@ categories: ["dev/ops"] - 注意,这个函数会新生成一个Shell程序来执行命令,所以你要注意其运行性能,如果你的Makefile中有一些比较复杂的规则,并大量使用了这个函数,那么对于你的系统性能是有害的。特别是Makefile的隐晦的规则可能会让你的shell函数执行的次数比你想像的多得多。 -## 控制make的函数 +### 控制make的函数 - make提供了一些函数来控制make的运行。通常,你需要检测一些运行Makefile时的运行时信息,并且根据这些信息来决定,你是让make继续执行,还是停止。 ```makefile $(error ) @@ -1340,15 +1340,15 @@ categories: ["dev/ops"] $(warning ) ``` -# 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 " "--what-if=" "--assume-new=" "--new-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 " "--what-if=" "--new-file=" "--assume-file=" 假定目标需要更新,如果和"-n"选项使用,那么这个参数会输出该目标更新时的运行动作。如果没有"-n"那么就像运行UNIX的"touch"命令一样,使得的修改时间为当前时间。 - "--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库的隐含规则。 ".ln" (lint生成的文件)的依赖文件被自动推导为"n.c",其生成命令是:"$(LINT) $(LINTFALGS) $(CPPFLAGS) -i"。对于".y"和".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 .y"执行,然后生成".tab.c"和".tab.h"文件。(其中,"" 表示一个任意字符串)。如果我们的执行程序"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"参数。 diff --git a/content/post/mariadb-galera.md b/content/post/mariadb-galera.md index 2a68c91..8fd2114 100644 --- a/content/post/mariadb-galera.md +++ b/content/post/mariadb-galera.md @@ -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 的节点服务器是最后关闭的数据库,数据最全,所以下次集群启动时应从这台节点服务器启动 diff --git a/content/post/mariadb-replication.md b/content/post/mariadb-replication.md index 64d7100..28ff761 100644 --- a/content/post/mariadb-replication.md +++ b/content/post/mariadb-replication.md @@ -6,19 +6,19 @@ tags: ["mariadb", "master", "slave", "gtid", "replication", "同步"] categories: ["database"] --- -# 环境 +## 环境 - mariadb 主服务器,centos7.8,192.168.1.141 - mariadb 主服务器,centos7.8,192.168.1.142 - mariadb 从服务器,centos7.8,192.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/) diff --git a/content/post/minio.md b/content/post/minio.md index 55271cd..0b8d2c9 100644 --- a/content/post/minio.md +++ b/content/post/minio.md @@ -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
eth1:10.0.0.11 | 8 个 | /dev/sdb1, /dev/sdc1
/dev/sdd1, /dev/sde1 @@ -76,7 +76,7 @@ X4.X.X | eth0: 192.168.1.14
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
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
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
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
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
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 diff --git a/content/post/mongodb.md b/content/post/mongodb.md index 5e0f777..deb6dd4 100644 --- a/content/post/mongodb.md +++ b/content/post/mongodb.md @@ -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", diff --git a/content/post/mysql-binlog.md b/content/post/mysql-binlog.md index c65ab66..a7a8ed7 100644 --- a/content/post/mysql-binlog.md +++ b/content/post/mysql-binlog.md @@ -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'; diff --git a/content/post/mysql-cache.md b/content/post/mysql-cache.md index 32c3ddc..25f10ff 100644 --- a/content/post/mysql-cache.md +++ b/content/post/mysql-cache.md @@ -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 从数据库授权表中重新装载权限到缓存中 diff --git a/content/post/mysql-galera.md b/content/post/mysql-galera.md index 7bc5fea..2eac550 100644 --- a/content/post/mysql-galera.md +++ b/content/post/mysql-galera.md @@ -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 即可 diff --git a/content/post/mysql-group-replication.md b/content/post/mysql-group-replication.md index c07a630..1ae56f1 100644 --- a/content/post/mysql-group-replication.md +++ b/content/post/mysql-group-replication.md @@ -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 -# 注意 +## 注意 - 每张表都必须显式指定主键 diff --git a/content/post/mysql-replication.md b/content/post/mysql-replication.md index 7912ef1..25289ec 100644 --- a/content/post/mysql-replication.md +++ b/content/post/mysql-replication.md @@ -6,18 +6,18 @@ tags: ["mysql", "master", "slave", "gtid", "replication", "同步"] categories: ["database"] --- -# 环境 +## 环境 - mysql 主服务器,centos7.4,192.168.1.10,端口 10000 - mysql 从服务器,centos7.4,192.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] diff --git a/content/post/mysql.md b/content/post/mysql.md index ff06b43..d8c6642 100644 --- a/content/post/mysql.md +++ b/content/post/mysql.md @@ -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 终端 diff --git a/content/post/mysql5.7-install.md b/content/post/mysql5.7-install.md index b1367e2..3bb48cf 100644 --- a/content/post/mysql5.7-install.md +++ b/content/post/mysql5.7-install.md @@ -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'; diff --git a/content/post/networkmanager.md b/content/post/networkmanager.md index 0b71030..db8dd20 100644 --- a/content/post/networkmanager.md +++ b/content/post/networkmanager.md @@ -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=时候,默认使用internal(rhel7/centos7默认是dhclient)。internal是NM内部实现的dhcp客户端 diff --git a/content/post/nfs.md b/content/post/nfs.md index c7375a5..7fdd4a8 100644 --- a/content/post/nfs.md +++ b/content/post/nfs.md @@ -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) diff --git a/content/post/nginx.md b/content/post/nginx.md index 2112602..02f661a 100644 --- a/content/post/nginx.md +++ b/content/post/nginx.md @@ -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; diff --git a/content/post/openvpn-install.md b/content/post/openvpn-install.md index 3df7082..8e6b265 100644 --- a/content/post/openvpn-install.md +++ b/content/post/openvpn-install.md @@ -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) diff --git a/content/post/openvpn.md b/content/post/openvpn.md index 934e6c7..c7a1d91 100644 --- a/content/post/openvpn.md +++ b/content/post/openvpn.md @@ -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) diff --git a/content/post/oracle.md b/content/post/oracle.md index 8431c55..e162b29 100644 --- a/content/post/oracle.md +++ b/content/post/oracle.md @@ -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 diff --git a/content/post/oracle11g-install.md b/content/post/oracle11g-install.md index 0dc7973..7a84b6f 100644 --- a/content/post/oracle11g-install.md +++ b/content/post/oracle11g-install.md @@ -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 diff --git a/content/post/oracle12c-install.md b/content/post/oracle12c-install.md index 3a2d1dd..015f888 100644 --- a/content/post/oracle12c-install.md +++ b/content/post/oracle12c-install.md @@ -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 diff --git a/content/post/oracle_1.md b/content/post/oracle_1.md index 9476b8d..29a56f0 100644 --- a/content/post/oracle_1.md +++ b/content/post/oracle_1.md @@ -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) diff --git a/content/post/ovirt-install.md b/content/post/ovirt-install.md index 4b161a9..52f0422 100644 --- a/content/post/ovirt-install.md +++ b/content/post/ovirt-install.md @@ -6,10 +6,10 @@ tags: ["ovirt", "kvm", "虚拟化"] categories: ["kvm"] --- -# 版本 +## 版本 Ovirt 4.1.7 -# 操作系统初始配置 +## 操作系统初始配置 角色 | 主机名 | 配置 | IP | 版本 | /etc/hosts 追加行 -------- | ------- | -------------------- | ----------- | ------------------ | ------------------- 管理节点 | engine | CPU: 多核
RAM: 2G | 10.0.16.160 | CentOS 7.4 Minimal | 10.0.16.160 engine engine.ovirt
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 diff --git a/content/post/ovirt.md b/content/post/ovirt.md index 35e6183..70c8879 100644 --- a/content/post/ovirt.md +++ b/content/post/ovirt.md @@ -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 diff --git a/content/post/pip.md b/content/post/pip.md index 0b6fd45..60e4e40 100644 --- a/content/post/pip.md +++ b/content/post/pip.md @@ -7,7 +7,7 @@ tags: ["pip", "python"] categories: ["python"] --- -# 配置 pip 源 +## 配置 pip 源 - 创建 $HOME/.pip/pip.conf 文件,内容如下 ```ini [global] diff --git a/content/post/postgresql-install.md b/content/post/postgresql-install.md index e4cf5e6..28150c8 100644 --- a/content/post/postgresql-install.md +++ b/content/post/postgresql-install.md @@ -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 diff --git a/content/post/postgresql-replication.md b/content/post/postgresql-replication.md index b1614f0..a158fd9 100644 --- a/content/post/postgresql-replication.md +++ b/content/post/postgresql-replication.md @@ -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 diff --git a/content/post/pxe-dnsmasq.md b/content/post/pxe-dnsmasq.md index cf5ccf8..a7c9c5d 100644 --- a/content/post/pxe-dnsmasq.md +++ b/content/post/pxe-dnsmasq.md @@ -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 引导,从第一个启动项启动 diff --git a/content/post/python-cf.md b/content/post/python-cf.md index 7fcd979..081175e 100644 --- a/content/post/python-cf.md +++ b/content/post/python-cf.md @@ -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 diff --git a/content/post/python-cx_Oracle.md b/content/post/python-cx_Oracle.md index 53ce336..5e0ec75 100644 --- a/content/post/python-cx_Oracle.md +++ b/content/post/python-cx_Oracle.md @@ -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() diff --git a/content/post/python-logging.md b/content/post/python-logging.md index 70ca9ae..5d4c4c4 100644 --- a/content/post/python-logging.md +++ b/content/post/python-logging.md @@ -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 diff --git a/content/post/python-op.md b/content/post/python-op.md index bb860f2..6402333 100644 --- a/content/post/python-op.md +++ b/content/post/python-op.md @@ -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.') diff --git a/content/post/python-re.md b/content/post/python-re.md index a923b27..911a9d5 100644 --- a/content/post/python-re.md +++ b/content/post/python-re.md @@ -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) diff --git a/content/post/python-shell.md b/content/post/python-shell.md index ba75ac0..9da9154 100644 --- a/content/post/python-shell.md +++ b/content/post/python-shell.md @@ -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) diff --git a/content/post/redis-cluster-install.md b/content/post/redis-cluster-install.md index 5c4cecb..9ac26df 100644 --- a/content/post/redis-cluster-install.md +++ b/content/post/redis-cluster-install.md @@ -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) diff --git a/content/post/redis-sentinel.md b/content/post/redis-sentinel.md index bbac9f7..b3ff4a0 100644 --- a/content/post/redis-sentinel.md +++ b/content/post/redis-sentinel.md @@ -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 diff --git a/content/post/rsync.md b/content/post/rsync.md index e924dd0..73b34f7 100644 --- a/content/post/rsync.md +++ b/content/post/rsync.md @@ -7,14 +7,14 @@ tags: ["rsync", "同步"] categories: ["shell"] --- -# 简介 +## 简介 - rsync(Remote 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) diff --git a/content/post/rust.md b/content/post/rust.md index 5da9bf1..d812226 100644 --- a/content/post/rust.md +++ b/content/post/rust.md @@ -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 diff --git a/content/post/sed.md b/content/post/sed.md index b863957..1c2b29e 100644 --- a/content/post/sed.md +++ b/content/post/sed.md @@ -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) diff --git a/content/post/shell.md b/content/post/shell.md index 7f809b9..9b0bccf 100644 --- a/content/post/shell.md +++ b/content/post/shell.md @@ -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<> /etc/sudoers # 或 @@ -206,7 +206,7 @@ categories: ["shell"] chmod 0400 /etc/sudoers.d/username ``` -# 用户登陆操作记录 +## 用户登陆操作记录 - 创建日志共存目录 ```bash mkdir /var/log/user_history -p diff --git a/content/post/soft-raid.md b/content/post/soft-raid.md index b477999..2c86a93 100644 --- a/content/post/soft-raid.md +++ b/content/post/soft-raid.md @@ -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,然后做RAID0,RAID10对存储容量的利用率和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) diff --git a/content/post/sqoop.md b/content/post/sqoop.md index dd258c8..8edff08 100644 --- a/content/post/sqoop.md +++ b/content/post/sqoop.md @@ -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 {参数列表} diff --git a/content/post/ssh.md b/content/post/ssh.md index d5abe82..d067464 100644 --- a/content/post/ssh.md +++ b/content/post/ssh.md @@ -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-client 可达 remote-host, ssh-server 不可达 remote-host, ssh 隧道映射 ssh-server 指定端口到 remote-host 指定端口 - 在 ssh-client 执行 ```bash @@ -50,7 +50,7 @@ categories: ["shell"] username@ ``` -# 动态转发 +## 动态转发 - SOCKS5 代理 - 在 ssh-client 执行 ```bash diff --git a/content/post/systemd.md b/content/post/systemd.md index 5b8e57a..2a60039 100644 --- a/content/post/systemd.md +++ b/content/post/systemd.md @@ -6,7 +6,7 @@ tags: ["systemd", "systemctl", "journalctl"] categories: ["OS"] --- -# 系统资源(unit)分类 +## 系统资源(unit)分类 Unit | 描述 ---- | ---- Service | 系统服务,默认 @@ -22,7 +22,7 @@ Socket | 进程间通信的 socket Swap | swap 文件 Timer | 定时器 -# Target 与传统 runlevel 对应关系 +## Target 与传统 runlevel 对应关系 传统运行等级 | 新版 target 命名 | 链接名 ---- | ---- | ---- Runlevel 0 | runlevel0.target | poweroff.target @@ -33,7 +33,7 @@ Runlevel 4 | runlevel4.target | multi-user.target Runlevel 5 | runlevel5.target | graphical.target Runlevel 6 | runlevel6.target | reboot.target -# systemctl 命令 +## systemctl 命令 - 查看版本 ```bash systemctl --version @@ -92,7 +92,7 @@ Runlevel 6 | runlevel6.target | reboot.target systemctl daemon-reload ``` -# systemd-analyze 命令 +## systemd-analyze 命令 - 查看启动耗时 ```bash systemd-analyze @@ -110,7 +110,7 @@ Runlevel 6 | runlevel6.target | reboot.target systemd-analyze critical-chain atd.service ``` -# journalctl 命令 +## journalctl 命令 - 查看所有日志(默认只保存本次启动的日志) ```bash journalctl @@ -208,14 +208,14 @@ Runlevel 6 | runlevel6.target | reboot.target journalctl --vacuum-time=1years ``` -# 其他相似命令 +## 其他相似命令 - hostnamectl - localectl - timedatectl - loginctl -# Unit 配置文件 -## [Unit] +## Unit 配置文件 +### [Unit] - Description: 简短描述 - Documentation: 文档地址 - Requires: 当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败 @@ -226,7 +226,7 @@ Runlevel 6 | runlevel6.target | reboot.target - Conflicts: 这里指定的 Unit 不能与当前 Unit 同时运行 - Condition...: 当前 Unit 运行必须满足的条件,否则不会运行 - Assert...: 当前 Unit 运行必须满足的条件,否则会报启动失败 -## [Service] +### [Service] - WorkingDirectory: 设置进程的工作目录 - 特殊值 "~" 表示 User= 用户的家目录 - 设为一个以 RootDirectory= 为基准的绝对路径 @@ -271,13 +271,13 @@ Runlevel 6 | runlevel6.target | reboot.target - on-watchdog: 超时退出,才会重启 - always: 不管是什么退出原因,总是重启 - RestartSec: 系统重启前等待的秒数 -## [Install] +### [Install] - WantedBy: 它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants 后缀构成的子目录中 - RequiredBy: 它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required 后缀构成的子目录中 - Alias: 当前 Unit 可用于启动的别名 - Also: 当前 Unit 激活(enable)时,会被同时激活的其他 Unit -# Unit 配置文件占位符 +## Unit 配置文件占位符 占位符 | 作用 | 描述 ---- | ---- | ---- %n | 完整的服务名称 | diff --git a/content/post/tomcat.md b/content/post/tomcat.md index 3660670..dd1f54e 100644 --- a/content/post/tomcat.md +++ b/content/post/tomcat.md @@ -7,7 +7,7 @@ tags: ["tomcat", "jdk", "java"] categories: ["web"] --- -# 部署 jre8 +## 部署 jre8 - 下载 oracle jre8,[下载界面](https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html) - 解压 ```bash @@ -20,7 +20,7 @@ categories: ["web"] export PATH=$JAVA_HOME/bin:$PATH ``` -# 部署 tomcat8 +## 部署 tomcat8 - 下载 tomcat ```bash curl -O http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.45/bin/apache-tomcat-8.5.45.tar.gz @@ -60,7 +60,7 @@ categories: ["web"] systemctl start tomcat ``` -# 验证码字体 +## 验证码字体 ```bash yum install dejagnu dejavu-sans-mono-fonts dejavu ``` diff --git a/content/post/websocket.md b/content/post/websocket.md index a903c62..2c01b7b 100644 --- a/content/post/websocket.md +++ b/content/post/websocket.md @@ -6,21 +6,21 @@ tags: ["websocket"] categories: ["web"] --- -# 操作系统 +## 操作系统 - CentOS7 -# 下载 websocketd +## 下载 websocketd - [websocketd-0.3.0-linux_amd64.zip](https://github.com/joewalnes/websocketd/releases/download/v0.3.0/websocketd-0.3.0-linux_amd64.zip) -# 安装 nc 命令 +## 安装 nc 命令 ```bash yum install nmap-ncat ``` -# 创建监听脚本 +## 创建监听脚本 ```bash cat > cmd.sh <<-END -#!/bin/bash +##!/bin/bash pkill -x nc while :; do nc -nkl 10088 @@ -29,7 +29,7 @@ done END ``` -# 创建 log.html +## 创建 log.html ```html @@ -86,7 +86,7 @@ break-all; ``` -# 文件部署位置 +## 文件部署位置 ``` websocketd/ ├── [-rwxr-xr-x] cmd.sh @@ -95,21 +95,21 @@ websocketd/ └── [-rwxr-xr-x] websocketd ``` -# 启动 websocketd +## 启动 websocketd ```bash cd websocketd ./websocketd --port=8008 --staticdir=. ./cmd.sh ``` -# 在浏览器中打开日志浏览页面 +## 在浏览器中打开日志浏览页面 - http://{websocket-server}:8008/websocket/log.html -# 在其他应用服务器,传输实时日志 +## 在其他应用服务器,传输实时日志 ```bash tail -f /tomcat/logs/catalina.out | nc -n {websocket-server} 10088 ``` -# 关闭实时日志 +## 关闭实时日志 - 在目标服务器中 kill nc ```bash pkill -x nc diff --git a/content/post/xargs.md b/content/post/xargs.md index 147ccb7..383ca31 100644 --- a/content/post/xargs.md +++ b/content/post/xargs.md @@ -7,7 +7,7 @@ tags: ["shell", "xargs"] categories: ["shell"] --- -# 基本使用 +## 基本使用 - 把标准输入转换成命令行参数,传递给 xargs 后的命令使用 ```bash echo 'one two three' | xargs mkdir diff --git a/content/post/xtrabackup.md b/content/post/xtrabackup.md index 21a9927..b87acc4 100644 --- a/content/post/xtrabackup.md +++ b/content/post/xtrabackup.md @@ -6,12 +6,12 @@ tags: ["xtrabackup", "备份", "mysql"] categories: ["database"] --- -# 环境 +## 环境 - CentOS7 - MySQL 5.27.22 - XtraBackup 2.4 -# 安装 +## 安装 - 创建 percona.repo 文件,内容如下 ```ini [percona-release-x86_64] @@ -43,14 +43,14 @@ categories: ["database"] yum install percona-xtrabackup-24 ``` -# 创建数据库备份用户 +## 创建数据库备份用户 ```sql create user percona@localhost identified by '123456'; grant reload, lock tables, process, replication client on *.* to percona@localhost; flush privileges; ``` -# 全量备份 +## 全量备份 - 按天创建全量备份目录 ```bash xtrabackup --backup --rsync --parallel=4 --user=percona --password=123456 \ @@ -68,7 +68,7 @@ flush privileges; ls -d mysql.* | head -n -3 | xargs rm -rf ``` -# 恢复数据 +## 恢复数据 - 准备一个 xtrabackup 备份目录 ```bash xtrabackup --prepare --use-memory=2G --target-dir=/backup/20190711 diff --git a/content/post/yum.md b/content/post/yum.md index 78a45bc..cb2ad0b 100644 --- a/content/post/yum.md +++ b/content/post/yum.md @@ -6,17 +6,17 @@ tags: ["yum", "repo", "iso"] categories: ["os"] --- -# CentOS 配置本地 ISO 镜像源 -## 上传 iso 文件 +## CentOS 配置本地 ISO 镜像源 +### 上传 iso 文件 - 上传 CentOS7 的 DVD iso 镜像文件到目标服务器,例如 /home/centos7.4.iso -## 挂载 iso 文件 +### 挂载 iso 文件 - 挂载该 iso 文件到操作系统的一个空目录中,例如 /mnt/ 下 ```bash mount -o loop /home/centos7.4.iso /mnt/ ``` -## 修改软件源文件 +### 修改软件源文件 - 备份全部的 .repo 文件 ```bash cd /etc/yum.repos.d/ @@ -32,7 +32,7 @@ categories: ["os"] gpgcheck=0 ``` -## 重新创建 yum 缓存 +### 重新创建 yum 缓存 - 清空以前的 yum cache ```bash yum clean all @@ -43,6 +43,6 @@ categories: ["os"] yum makecache fast ``` -## 其他 yum 源汇总 +### 其他 yum 源汇总 - [pkgs.org](https://pkgs.org/) diff --git a/content/post/zabbix-alert-email.md b/content/post/zabbix-alert-email.md index 9129c08..65a8086 100644 --- a/content/post/zabbix-alert-email.md +++ b/content/post/zabbix-alert-email.md @@ -7,11 +7,11 @@ tags: ["zabbix", "邮件", "告警"] categories: ["zabbix"] --- -# 环境 +## 环境 - CentOS7 - sendEmail 1.56 -# 部署 sendEmail +## 部署 sendEmail - 安装 sendEmail ```bash curl -O http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz @@ -46,7 +46,7 @@ categories: ["zabbix"] ./sendemail.sh person1@email.com;person2@email.com;person3@email.com test_subject test_content ``` -# 配置 zabbix +## 配置 zabbix - 登陆 zabbix web,点击“报警媒介类型”-“创建媒体类型”,打开“报警媒介类型”窗口,配置如下 - 名称: 脚本发邮件报警 - 类型: 脚本 @@ -63,6 +63,6 @@ categories: ["zabbix"] - 点击“添加”完成该报警媒介配置 - 点击“配置”-“动作”-“Report problems to Zabbix administrators”-“操作”,自定义报警信息 -# 测试 +## 测试 - 触发器被触发后,收件人邮箱收到告警邮件 diff --git a/content/post/zabbix-alert-wechat.md b/content/post/zabbix-alert-wechat.md index 51998e4..9ec5cdc 100644 --- a/content/post/zabbix-alert-wechat.md +++ b/content/post/zabbix-alert-wechat.md @@ -7,7 +7,7 @@ tags: ["zabbix", "微信", "告警"] categories: ["zabbix"] --- -# 环境 +## 环境 - CentOS7,docker-ce 20.0 - 启动 zabbix5 容器 ```bash @@ -20,7 +20,7 @@ categories: ["zabbix"] - 打开浏览器,访问 http://ip/zabbix/,打开 zabbix web 安装界面 - 不要做任何修改,一直下一步,直到打开 zabbix 登陆页面,默认 Admin/zabbix -# 部署脚本 +## 部署脚本 - 进入 zabbix 容器中 - 安装 jq 命令 - 修改 /etc/zabbix/zabbix_server.conf,配置告警脚本加载位置 @@ -125,7 +125,7 @@ categories: ["zabbix"] /var/log/zabbix/alertscripts/wechat.sh test_subject test_content ``` -# 配置 zabbix +## 配置 zabbix - 浏览器登陆 zabbix - 单击"管理"-"报警媒介类型"-"创建媒体类型",输入如下信息 - 名称: 企业微信 diff --git a/content/post/zabbix-install.md b/content/post/zabbix-install.md index 068d4e5..1f663d7 100644 --- a/content/post/zabbix-install.md +++ b/content/post/zabbix-install.md @@ -7,18 +7,18 @@ tags: ["zabbix", "centos", "yum"] categories: ["zabbix"] --- -# 环境 +## 环境 - centos 7 - nginx 1.16 - php 7.2 - zabbix 4.4 - mysql 5.7 -# 虚拟机 +## 虚拟机 - 192.168.1.100 安装 nginx, php, mysql, zabbix-server, zabbix-agent - 192.168.1.101 安装 zabbix-agent -# 导入软件源 +## 导入软件源 - 只在 192.168.1.100 上操作 - 创建 /etc/yum.repos.d/epel.repo,内容如下 ```ini @@ -82,7 +82,7 @@ categories: ["zabbix"] yum makecache fast ``` -# 安装 nginx +## 安装 nginx - 安装 ```bash yum install nginx @@ -158,7 +158,7 @@ categories: ["zabbix"] systemctl start nginx ``` -# 安装 php +## 安装 php - 安装 ```bash yum install php72w \ @@ -197,7 +197,7 @@ categories: ["zabbix"] systemctl start php-fpm ``` -# 安装 mysql 5.7 +## 安装 mysql 5.7 - 安装,参考 [CentOS7 yum 安装 MySQL5.7](/post/mysql5.7-install/) - 启动 mysqld 服务,创建 zabbix 数据库及其用户 ```sql @@ -206,7 +206,7 @@ categories: ["zabbix"] flush privileges; ``` -# 安装 zabbix server +## 安装 zabbix server - 安装 ```bash yum install zabbix-server-mysql zabbix-web-mysql @@ -232,12 +232,12 @@ categories: ["zabbix"] systemctl start zabbix-server ``` -# web 界面设置 +## web 界面设置 - 使用常用浏览器访问: http://192.168.1.100:10080/zabbix/ - 根据界面提示提供数据库等信息 - zabbix 安装完成,进入系统登陆界面,默认 admin/zabbix -# 安装 zabbix agent +## 安装 zabbix agent - 可以直接 yum 安装,这里推荐先下载 rpm 包,方便复制到其他服务器中运行 ```bash yum install zabbix-agent --downloadonly --downloaddir=. @@ -262,7 +262,7 @@ categories: ["zabbix"] systemctl start zabbix-agent ``` -# 在其它服务器上安装 zabbix agent +## 在其它服务器上安装 zabbix agent - 从 192.168.1.100 复制 zabbix-agent-4.4.\*.rpm 到 192.168.1.101 下 - 登陆 192.168.1.101,安装 zabbix-agent ```bash @@ -287,7 +287,7 @@ categories: ["zabbix"] systemctl start zabbix-agent ``` -# Docker 启动 zabbix server +## Docker 启动 zabbix server - 下载镜像 ```bash docker pull ccr.ccs.tencentyun.com/colben/zabbix diff --git a/content/post/zabbix.md b/content/post/zabbix.md index d3debfc..feb6d01 100644 --- a/content/post/zabbix.md +++ b/content/post/zabbix.md @@ -6,7 +6,7 @@ tags: ["zabbix", "tomcat"] categories: ["zabbix"] --- -# 通过 JavaGateway 监控 tomcat +## 通过 JavaGateway 监控 tomcat - 编译 zabbix server,configure 增加 --enable-java - 修改 zabbix_server.conf 文件,配置 JavaGateway 参数 ``` diff --git a/content/post/zabbix3.10-install.md b/content/post/zabbix3.10-install.md index 55d3bc0..9ba6403 100644 --- a/content/post/zabbix3.10-install.md +++ b/content/post/zabbix3.10-install.md @@ -6,7 +6,7 @@ tags: ["zabbix"] categories: ["zabbix"] --- -# 环境 +## 环境 - 操作系统:CentOS7 (192.168.1.100) - 数据库:MariaDB 10.1.26 - Web后台:PHP 5.6.31 @@ -14,11 +14,11 @@ categories: ["zabbix"] - Zabbix:Zabbix 3.0.10 - 部署方式:单机部署 -# 安装操作系统 CentOS +## 安装操作系统 CentOS - 推荐 RHEL6 及以上的 x64 版本。 - 这里最小安装 CentOS7 ,外网不可达服务器可能需要配置本地 yum 源。 -# 安装数据库 MariaDB +## 安装数据库 MariaDB - MariaDB/MySQL 的常见版本。 - 本地如果已存在可用的 MariaDB/MySQL 数据库,则可跳过此步。 - 安装方式很多,这里直接用官方编译好的二进制通用包: @@ -26,7 +26,7 @@ categories: ["zabbix"] - CentOS6 下载 [mariadb-10.1.26-linux-x86_64.tar.gz](http://mirrors.neusoft.edu.cn/mariadb//mariadb-10.1.26/bintar-linux-x86_64/mariadb-10.1.26-linux-x86_64.tar.gz) - 安装 [参考我的另一篇博客](https://my.oschina.net/colben/blog/361465) -# 安装 PHP +## 安装 PHP - PHP-5.5 及以上版本。 - 本地如果已存在可用的 PHP ,则可跳过此步。 - 安装方法很多,这里使用官方源码编译: @@ -96,7 +96,7 @@ categories: ["zabbix"] /opt/php/sbin/php-fpm ``` -# 安装 Nginx +## 安装 Nginx - Nginx 的常见版本。 - 本地如果已存在可用的 Nginx ,则无需再次安装,直接在配置文件中添加配置即可。 - 安装方式很多,这里使用官方源码编译: @@ -156,7 +156,7 @@ categories: ["zabbix"] /opt/nginx/sbin/nginx ``` -# 安装 Zabbix Server +## 安装 Zabbix Server - 推荐 Zabbix 3.0 及以上版本。 - 安装方式很多,这里使用官方源码编译: - 下载 [zabbix-3.0.10.tar.gz](https://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.0.10/zabbix-3.0.10.tar.gz) @@ -223,7 +223,7 @@ categories: ["zabbix"] /opt/zabbix-server/sbin/zabbix_agentd ``` -# 配置 zabbix 管理网站 +## 配置 zabbix 管理网站 - 部署前端文件 ```bash cp -ar frontends/php /opt/nginx/html/zabbix @@ -238,11 +238,11 @@ categories: ["zabbix"] #$DB['PORT'] = '0'; ``` -# 登陆 zabbix 管理网站 +## 登陆 zabbix 管理网站 - 浏览器输入 http://192.168.1.100/zabbix/ - 默认用户名: admin ,默认密码: zabbix -# 安装 Zabbix Agent +## 安装 Zabbix Agent - 推荐 Zabbix 3.0 及以上版本。 - 安装方式很多,这里使用官方源码编译: - 下载 [zabbix-3.0.10.tar.gz](https://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.0.10/zabbix-3.0.10.tar.gz) (同 server) @@ -278,11 +278,11 @@ categories: ["zabbix"] /opt/zabbix/sbin/zabbix_agentd ``` -# 管理界面增加监控主机 +## 管理界面增加监控主机 - 登陆 zabbix 管理界面 http://192.168.1.100/zabbix - 在 “配置-主机” 下点击 “新增主机”, 名称填写被监控服务器中 /opt/zabbix/etc/zabbix_agentd.conf 中 Hostname 项(192.168.1.101) - 在主机 (192.168.1.101) 下添加需要的监控项、触发器及图形,即可完成该服务器的监控。 -# 参考 +## 参考 - [https://www.ttlsa.com/zabbix/install-zabbix-on-linux-5-ttlsa/](https://www.ttlsa.com/zabbix/install-zabbix-on-linux-5-ttlsa/) diff --git a/content/post/zk-install.md b/content/post/zk-install.md index f0648a6..f94744a 100644 --- a/content/post/zk-install.md +++ b/content/post/zk-install.md @@ -7,7 +7,7 @@ tags: ["zookeeper", "centos7"] categories: ["storage"] --- -# 环境 +## 环境 主机名 | eth0 IP | eth1 IP | 操作系统 | ZK 版本 | myid ---- | ---- | ---- | ---- | ---- | ---- @@ -18,7 +18,7 @@ zk223 | 192.168.1.223 | 192.168.16.223 | CentOS7.5 | 3.4.14 | 223 - 下载 [zookeeper-3.4.14](https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz) - eth0 网卡用于向客户端提供服务,eth1 网卡用于 zookeeper 集群内部通信 -# 各节点初始配置 +## 各节点初始配置 - 关闭 selinux、防火墙 - 部署 java 运行环境 @@ -44,7 +44,7 @@ zk223 | 192.168.1.223 | 192.168.16.223 | CentOS7.5 | 3.4.14 | 223 echo 223 > /var/lib/zookeeper/data/myid ``` -# 部署 zookeeper +## 部署 zookeeper - 登陆 zk221,下载 zookeeper,解压至 /opt/ 下 - 生成配置文件 @@ -68,7 +68,7 @@ zk223 | 192.168.1.223 | 192.168.16.223 | CentOS7.5 | 3.4.14 | 223 ``` - 打包 zookeeper 目录,复制到 zk222 和 zk223 上 -# 启动集群 +## 启动集群 - 直接启动脚本 - 在每个节点上启动 zookeeper 服务 @@ -95,7 +95,7 @@ zk223 | 192.168.1.223 | 192.168.16.223 | CentOS7.5 | 3.4.14 | 223 systemctl start zookeeper ``` -# 查看集群状态 +## 查看集群状态 - 查看节点状态 ```bash