Sqoop 笔记

把 mysql 表数据导入 hive 中

  • 命令格式
    1
    
    sqoop import {参数列表}
    
  • 默认在 hive 中创建指定表,如果该表已存在,则把 mysql 表数据追加到该表中,常规参数如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    --connect jdbc:mysql://_mysql_server_:3306/_mysql_dbname_
    --username _mysql_user_
    --password _mysql_password_
    --table _mysql_tablename_
    --hive-import
    --hive-database _hive_dbname_
    --hive-table _hive_tablename_
    --hive-drop-import-delims
    -m 1
    
  • 如果该表已存在,则报错退出,参数如下
    1
    
    --create-hive-table
    
  • 如果该表已存在,则覆盖重新导入,参数如下
    1
    
    --hive-overwrite
    
  • 导入增量数据,参数如下
    1
    2
    3
    
    --incremental append
    --check-column _mysql_tablecolumn_
    --last-value _last_value_
    

把 hive 表数据导入 mysql 中

  • 命令格式
    1
    
    sqoop export {参数列表}
    
  • mysql 中需提前创建好待导入的表,常规参数如下
    1
    2
    3
    4
    5
    6
    
    --connect jdbc:mysql://_mysql_server_:3306/_mysql_dbname_
    --username _mysql_username_
    --password _mysql_password_
    --table _mysql_tablename_
    --hcatalog-database _hive_dbname_
    --hcatalog-table _hive_tablename_
    
  • 只导出 hive 表中的部分的指定(部分)字段,参数如下
    1
    
    --columns "_column_name1_,_column_name2_,_column_name3_"
    

Gnome 笔记

常用设置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 关闭左上角热响应
gsettings set org.gnome.desktop.interface enable-hot-corners false

# 缩放系统字体
gsettings set org.gnome.desktop.interface text-scaling-factor 1.5

# monospace 字体
gsettings set org.gnome.desktop.interface monospace-font-name 'YaHei Consolas Hybrid 15'

# gtk 主题
gsettings set org.gnome.desktop.interface gtk-theme 'Vertex-Dark'

# gnome-shell 主题
gsettings set org.gnome.shell.extensions.user-theme name 'Vertex'

# 图标主题
gsettings set org.gnome.desktop.interface icon-theme 'Faenza'

# 调整 gnome3 桌面(包括 gdm )放大级别
# 0 系统自动缩放
# n > 0 放大 n 倍
gsettings set org.gnome.desktop.interface scaling-factor 1

# 启用用户扩展
gsettings set org.gnome.shell disable-user-extensions false
gsettings set org.gnome.shell enabled-extensions "['user-theme@gnome-shell-extensions.gcampax.github.com', 'workspace-indicator@gnome-shell-extensions.gcampax.github.com', 'dash-to-panel@jderose9.github.com']"

# 工作区
gsettings set org.gnome.mutter dynamic-workspaces false
gsettings set org.gnome.desktop.wm.preferences num-workspaces 4
gsettings set org.gnome.desktop.wm.preferences workspace-names "['乾坤', '巽震', '坎离', '艮兑']"

# 窗口按钮
gsettings set org.gnome.desktop.wm.preferences button-layout 'appmenu:minimize,maximize,close'

在 “活动” 中创建 “文件夹”

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 创建文件夹
gsettings set org.gnome.desktop.app-folders folder-children "['Office','VirtualBox']"

# 指定文件夹名字
gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/Office/ name "Office"
gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/VirtualBox/ name "VirtualBox"

# 指定文件夹包含的应用类别
gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/Office/ categories "['Office']"
gsettings set org.gnome.desktop.app-folders.folder:/org/gnome/desktop/app-folders/folders/VirtualBox/ categories "['Emulator']"

快捷键

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-1 "[]"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-last "[]"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-up "['<Super>Up']"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-down "['<Super>Down']"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-left "['<Super>Left']"
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-right "['<Super>Right']"

gsettings set org.gnome.desktop.wm.keybindings switch-applications "[]"
gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward "[]"
gsettings set org.gnome.desktop.wm.keybindings switch-windows "['<Alt>Tab']"
gsettings set org.gnome.desktop.wm.keybindings switch-windows-backward "['<Shift><Alt>Tab']"
gsettings set org.gnome.shell.window-switcher current-workspace-only true
gsettings set org.gnome.shell.window-switcher app-icon-mode both

gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-down "['<Alt><Super>Down']"
gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-up "['<Alt><Super>Up']"
gsettings set org.gnome.desktop.wm.keybindings move-to-workspace-last "[]"

gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-up "[]"
gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-right "[]"
gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-left "[]"
gsettings set org.gnome.desktop.wm.keybindings move-to-monitor-down "[]"

gsettings set org.gnome.desktop.wm.keybindings show-desktop "['<Super>d']"
gsettings set org.gnome.desktop.wm.keybindings toggle-maximized "['<Primary><Super>Up']"
gsettings set org.gnome.desktop.wm.keybindings minimize "['<Primary><Super>Down']"
gsettings set org.gnome.desktop.wm.keybindings maximize "[]"

安装 gnome 桌面

  • CentOS6

Systemd 笔记

系统资源(unit)分类

Unit 描述
Service 系统服务,默认
Target 多个 unit 构成的一个组
Device 硬件设备
Mount 文件系统的挂载点
Automount 自动挂载点
Path 文件或路径
Scope 不是由 systemd 启动的外部进程
Slice 进程组
Snapshot systemd 快照,可以切回某个快照
Socket 进程间通信的 socket
Swap swap 文件
Timer 定时器

Target 与传统 runlevel 对应关系

传统运行等级 新版 target 命名 链接名
Runlevel 0 runlevel0.target poweroff.target
Runlevel 1 runlevel1.target rescue.target
Runlevel 2 runlevel2.target multi-user.target
Runlevel 3 runlevel3.target multi-user.target
Runlevel 4 runlevel4.target multi-user.target
Runlevel 5 runlevel5.target graphical.target
Runlevel 6 runlevel6.target reboot.target

systemctl 命令

  • 查看版本
    1
    
    systemctl --version
    
  • 系统操作
    1
    2
    3
    4
    5
    6
    7
    8
    
    systemctl reboot # 重启
    systemctl poweroff # 关闭系统,切断电源
    systemctl halt # 停止 CPU 工作
    systemctl suspend # 暂停系统
    systemctl hibernate # 让系统进入休眠状态
    systemctl hybrid-sleep # 让系统进入交互式休眠状态
    systemctl rescue # 启动进入救援状态(单用户状态)
    systemctl status # 显示系统状态
    
  • 查看全部 Unit
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    systemctl list-unit-files # 列出所有 Unit 配置文件
    # enabled 已建立启动链接
    # disabled 没建立启动链接
    # static 该配置文件没有[Install]部分,无法执行,只能作为其他 Unit 配置文件的依赖
    # masked 该配置文件被禁止建立启动链接
    systemctl list-unit-files --type=service # 列出指定类型的 Unit 配置文件
    systemctl list-units # 列出正在运行的 Unit
    systemctl list-units --all # 列出所有 Unit,包括没有找到配置文件的或者启动失败的
    systemctl list-units --all --state=inactive # 列出所有没有运行的 Unit
    systemctl list-units --failed # 列出所有加载失败的 Unit
    systemctl list-units --type=service # 列出所有正在运行的、类型为 service 的 Unit
    
  • 查看一个 Unit
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    systemctl list-dependencies nginx.service # 显示一个 Unit 的所有依赖
    systemctl list-dependencies --all nginx.service # 显示一个 Unit 的所有依赖,展开 target
    systemctl cat nginx.service # 查看一个 Unit 配置文件
    systemctl show httpd.service # 显示一个 Unit 的所有底层参数
    systemctl show -p CPUShares httpd.service # 显示一个 Unit 的指定属性的值
    systemctl status nginx.service # 显示单个 Unit 的状态
    systemctl -H root@ssh_server status nginx.service # 显示远程主机的某个 Unit 的状态 (ssh 连接)
    systemctl is-active nginx.service # 显示某个 Unit 是否正在运行
    systemctl is-failed nginx.service # 显示某个 Unit 是否处于启动失败状态
    systemctl is-enabled nginx.service # 显示某个 Unit 服务是否建立了启动链接
    
  • 操作一个 Unit
    1
    2
    3
    4
    5
    6
    7
    8
    
    systemctl reload apache.service # 重新加载一个服务的配置文件
    systemctl set-property httpd.service CPUShares=500 # 设置一个服务的指定属性
    systemctl start apache.service # 立即启动一个服务
    systemctl stop apache.service # 立即停止一个服务
    systemctl restart apache.service # 重启一个服务
    systemctl kill apache.service # 杀死一个服务的所有子进程
    systemctl enable nginx.service # 建立启动链接,激活开机启动
    systemctl disable nginx.service # 删除启动链接,取消开机启动
    
  • 重新加载全部修改过的 Unit 配置文件
    1
    
    systemctl daemon-reload
    

systemd-analyze 命令

  • 查看启动耗时
    1
    
    systemd-analyze
    
  • 查看每个服务的启动耗时
    1
    
    systemd-analyze blame
    
  • 显示瀑布状的启动过程流
    1
    
    systemd-analyze critical-chain
    
  • 显示指定服务的启动流
    1
    
    systemd-analyze critical-chain atd.service
    

journalctl 命令

  • 查看所有日志(默认只保存本次启动的日志)
    1
    
    journalctl
    
  • 查看内核日志(不显示应用日志)
    1
    
    journalctl -k
    
  • 查看系统启动日志
    1
    2
    3
    
    journalctl -b # 本次启动的日志
    journalctl -b -0 # 本次启动的日志
    journalctl -b -1 # 查看上一次启动的日志(需更改设置)
    
  • 查看指定时间的日志
    1
    2
    3
    4
    5
    
    journalctl --since="2012-10-30 18:17:16"
    journalctl --since "20 min ago"
    journalctl --since yesterday
    journalctl --since "2018-11-11" --until "2019-01-01 01:00"
    journalctl --since 09:00 --until "1 hour ago"
    
  • 显示尾部的最新日志
    1
    2
    
    journalctl -n # 最近 10 行
    journalctl -n 20 # 最近 20 行日志
    
  • 实时滚动显示最新日志
    1
    
    journalctl -f
    
  • 查看指定服务的日志
    1
    
    journalctl /usr/lib/systemd/systemd
    
  • 查看指定进程的日志
    1
    
    journalctl _PID=1
    
  • 查看某个路径的脚本的日志
    1
    
    journalctl /usr/bin/bash
    
  • 查看指定用户的日志
    1
    
    journalctl _UID=33 --since today
    
  • 查看某个 Unit 的日志
    1
    2
    
    journalctl -u nginx.service
    journalctl -u nginx.service --since today
    
  • 实时滚动显示某个 Unit 的最新日志
    1
    
    journalctl -u nginx.service -f
    
  • 合并显示多个 Unit 的日志
    1
    
    journalctl -u nginx.service -u php-fpm.service --since today
    
  • 查看指定优先级(及其以上级别)的日志,共有8级
    • 0: emerg
    • 1: alert
    • 2: crit
    • 3: err
    • 4: warning
    • 5: notice
    • 6: info
    • 7: debug
    1
    
    journalctl -p err -b
    
  • 日志默认分页输出,–no-pager 改为正常的标准输出
    1
    
    journalctl --no-pager
    
  • 以 JSON 格式(单行)输出
    1
    
    journalctl -b -u nginx.service -o json
    
  • 以 JSON 格式(多行)输出,可读性更好
    1
    
    journalctl -b -u nginx.serviceqq -o json-pretty
    
  • 显示日志占据的硬盘空间
    1
    
    journalctl --disk-usage
    
  • 指定日志文件占据的最大空间
    1
    
    journalctl --vacuum-size=1G
    
  • 指定日志文件保存多久
    1
    
    journalctl --vacuum-time=1years
    

其他相似命令

  • hostnamectl
  • localectl
  • timedatectl
  • loginctl

Unit 配置文件

[Unit]

  • Description: 简短描述
  • Documentation: 文档地址
  • Requires: 当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
  • Wants: 与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
  • BindsTo: 与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
  • Before: 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
  • After: 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
  • Conflicts: 这里指定的 Unit 不能与当前 Unit 同时运行
  • Condition…: 当前 Unit 运行必须满足的条件,否则不会运行
  • Assert…: 当前 Unit 运行必须满足的条件,否则会报启动失败

[Service]

  • WorkingDirectory: 设置进程的工作目录
    • 特殊值 “~” 表示 User= 用户的家目录
    • 设为一个以 RootDirectory= 为基准的绝对路径
      • 例如当 RootDirectory=/sysroot 并且 WorkingDirectory=/work/dir 时,实际的工作目录将是 /sysroot/work/dir
    • 当 systemd 作为系统实例运行时,此选项的默认值是 /
    • 当 systemd 作为用户实例运行时,此选项的默认值是对应用户的家目录
    • 给目录加上 “-” 前缀,表示即使此目录不存在,也不算致命错误
    • 未设置 RootDirectory=/RootImage= 选项,那么为 WorkingDirectory= 设置的绝对路径 将以主机(或容器)的根目录(也就是运行 systemd 的系统根目录)为基准
  • RootDirectory: 设置以 chroot(2) 方式执行进程时的根目录
    • 必须设为一个以主机(或容器)的根目录(也就是运行 systemd 的系统根目录)为基准的绝对路径
    • 设置了此选项,必须确保进程及其辅助文件在 chroot() 监狱中确实可用
  • User/Group: 设置进程在执行时使用的用户与组
  • TimeoutSec: 定义 Systemd 停止当前服务之前等待的秒数
  • Environment: 指定环境变量
  • EnvironmentFile: 环境参数文件,内部 key=value 格式,在当前文件中使用 $key 获取 value
  • ExecStart: 启动时执行的命令
  • ExecReload: 重启服务时执行的命令
  • ExecStop: 停止服务时执行的命令
  • ExecStartPre: 启动服务之前执行的命令
  • ExecStartPost: 启动服务之后执行的命令
  • ExecStopPost: 停止服务之后执行的命令
  • “-” 配置项前的减号"-“表示"抑制错误”,发生错误时不影响后续命令执行
  • Type
    • simple: 默认,ExecStart 启动的进程就是主进程
    • forking: ExecStart 启动时 fork 子进程,之后该父进程退出,子进程成为主进程
    • oneshot: 类似 Simple,只执行一次
    • dbus: 类似 Simple,等待 D-Bus 信号启动
    • notify: 类似 Simple,启动完成后发出通知信号
    • idle: 类似 Simple,等到其他任务执行完成后才会启动该服务
  • RemainAfterExit=yes: 进程退出后服务保持运行
  • KillMode
    • control-group: 默认,杀掉所有子进程
    • process: 只杀主进程
    • mixed: 主进程收到 SIGTERM 信号,子进程收到 SIGKILL 信号
    • none: 不杀进程,只执行服务的 stop 命令
  • Restart
    • no: 默认,退出后不重启
    • on-success: 正常退出时重启
    • on-failure: 非正常退出、被信号终止或超时重启
    • on-abnormal: 被信号终止和超时重启
    • on-abort: 收到没有捕捉到的信号终止时重启
    • on-watchdog: 超时退出,才会重启
    • always: 不管是什么退出原因,总是重启
  • RestartSec: 系统重启前等待的秒数

[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 配置文件占位符

占位符 作用 描述
%n 完整的服务名称
%N 不转义的完整服务名称
%p 前缀名 对于实例化的服务,这是前@前面的部分,对于其它的服务,是指去掉后缀(即类型)的部分
%P 不转义的前缀名
%i 实例名称 对于实例化的服务,这是指 @和后缀之间的部分
%I 不转义的实例名
%f 不转义的文件名 这可以不转义的实例名(如果可用)或前缀名,带有/前缀
%c 服务的控制组路径
%r systemd 的根控制组路径
%R systemd 的根控制组路径的父目录
%t 运行时 Socket 目录 这可以是 /run (系统管理器) 或 $XDG_RUNTIME_DIR (用户管理器)
%u 用户名 这是服务配置的用户或systemd运行实例的用户(如果没有配置的话)
%U 用户 UID 这是服务配置的用户UID或systemd运行实例的用户UID(如果没有配置的话)
%h 用户家目录 这是服务配置的用户家目录或systemd运行实例的用户家目录(如果没有配置的话)
%s 用户Shell 这是服务配置的用户shell或systemd运行实例的用户shell(如果没有配置的话)
%m 机器 ID 运行系统的机器 ID,格式是一个字符串
%b 启动 ID 运行系统的启动 ID,格式是一个字符串
%H 主机名 运行系统的主机名
%% 转义 % 一个单百分号

Shell 笔记

BASH 脚本的 $ 参数

  • $$ #shell 本身 PID
  • $! #shell 最后执行的后台PID
  • $? #shell 结束代码
  • $* #参数列表 “$1 $2 … $n”
  • $@ #参数列表 “$1” “$2” … “$n”
  • $# #参数个数
  • $0 #shell 脚本名
  • $1…$n #shell 位置参数

BASH 字符串处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 字符串 str 长度
${#str}
expr length "$str"

# 子串 substr 出现位置,找不到返回 0
expr index "$str" "$substr"

# 子串 substr 开头匹配,找不到返回 0
expr match "$str" "$substr"

# 字符串 str 抽取左起位置 pos 后 长度 len 的子串
${str:$pos}
${str:$pos:$len}
expr substr "$str" $pos $len

# 字符串 str 抽取右起位置 pos 前的子串
${str: -pos}
${str:(pos)}

# 正则 pat 抽取字符串 str 开头子串
expr match "$str" "\($pat\)"
expr "$str" : "\($pat\)"

# 正则 pat 抽取字符串 str 结尾子串
expr match "$str" ".*\($pat\)"
expr "$str" : ".*\($pat\)"

# 删除字符串 str 开头的最短子串 sub
${str#$sub}

# 删除字符串 str 开头的最长子串 sub
${str##$sub}

# 删除字符串 str 结尾的最短子串 sub
${str%$sub}

# 删除字符串 str 结尾的最长子串 sub
${str%%$sub}

# 替换字符串 str 第一个子串 sub 为字符串 rep
${str/"$sub"/"$rep"}

# 替换字符串 str 所有子串 sub 为字符串 rep
${str//"$sub"/"$rep"}

# 替换字符串 str 开头的子串 sub 为字符串 rep
${str/#"$sub"/"$rep"}

# 替换字符串 str 结尾的子串 sub 为字符串 rep
${str/%"$sub"/"$rep"}

# var为空或没有设置,代入word,否则代入var值
${var:-word}

# 如果var已经被设置且不为空,则代入它的值,否则代入word,并且在后面var始终为word的值。位置参量不能用这种方式赋值。
${variable:=word}

# 如果变量var已被设置且值为非空,代入word值,否则什么也不代入
${variable:+word}

# 如果变量var已被设置值且为非空,就代入它的值,否则输出word并从shell中退出,如果有省略了word,就会显示信息:parameter null or not set.
${var:?word}

BASH 数组

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 定义数组,有三种方式
declare -a array
array=()
array[0]='value0'

# 打印数组第一个元素
echo ${array[0]}

# 打印数组所有元素,有两种方式
echo ${array[@]}
echo ${array[*]}

# 打印数组所有索引,有两种方式
echo ${!array[@]}
echo ${!array[*]}

# 打印数组的元素个数,有两种方式
echo ${#array[@]}
echo ${#array[*]}

# 移除数组中索引为2的元素
unset array[2]

# 添加id为3的元素
array[3]=""

BASH 字典

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 定义字典
declare -A dict

# 新增或修改键 k1 的值
dict['k1']='v1'

# 打印对应键的值
echo $['k1']

# 打印字典所有元素,有两种方式
echo ${dict[@]}
echo ${dict[*]}

# 打印字典所有键,有两种方式
echo ${!dict[@]}
echo ${!dict[*]}

# 打印字典的元素个数,有两种方式
echo ${#dict[@]}
echo ${#dict[*]}

# 移除键 k1
unset dict['k1']

终端环境变量 PS1 参数

  • \d 日期,格式为weekday month date,例如:“Mon Aug 1”
  • \H 完整的主机名称
  • \h 仅取主机的第一个名字
  • \t 显示时间为24小时格式,如 HH:MM:SS
  • \T 显示时间为12小时格式
  • \A 显示时间为24小时格式 HH:MM
  • \u 当前用户的账号名称
  • \v BASH的版本信息
  • \w 完整的工作目录名称
  • \W 利用basename取得工作目录名称,所以只会列出最后一个目录
  • # 下达的第几个命令
  • $ 提示字符,root 下提示符是 #,普通用户是 $
  • \[\e[i;j;km\] \[\e[0m\] 建议PS1使用这种颜色控制字符

终端颜色 \033[F;Bm 控制编码

  • F30 B40 黑色
  • F31 B41 红色
  • F32 B42 绿色
  • F33 B43 黄色
  • F34 B44 蓝色
  • F35 B45 紫红色
  • F36 B46 青蓝色
  • F37 B47 白色

终端光标位置

  • \033[K 清除从光标到行尾的内容
  • \033[s 保存光标位置
  • \033[u 恢复光标位置
  • \033[0m 关闭所有属性
  • \033[1m 设置高亮度
  • \033[4m 下划线
  • \033[5m 闪烁
  • \033[7m 反显
  • \033[8m 消隐
  • \033[nA 光标上移n行
  • \033[nB 光标下移n行
  • \033[nC 光标右移n行
  • \033[nD 光标左移n行
  • \033[2J 清屏
  • \033[?25l 隐藏光标
  • \033[?25h 显示光标
  • \033[y;xH 设置光标位置

解析迅雷链接

  • echo 迅雷专用地址(去掉头 thunder://)|base64 -d
  • 去掉头部 AA 和尾部 ZZ

expect 自动输入密码

1
2
3
4
5
6
7
8
expect<<END
    spawn ssh $DEST_HOST "REMOTE_COMMAND"
    expect {
        "*yes/no*" { send "yes\r"; exp_continue }
        "*assword*" { send "password\r" }
    }
    expect eof
END

普通用户(username)免密 sudo

1
2
3
4
echo "username ALL = (root) NOPASSWD:ALL" >> /etc/sudoers
# 或
echo "cephdeploy ALL = (root) NOPASSWD:ALL" > /etc/sudoers.d/username
chmod 0400 /etc/sudoers.d/username

用户登陆操作记录

  • 创建日志共存目录

Httpd 笔记

CentOS7 安装

1
yum install httpd

支持 SVN

  • 安装 svn 模块
    1
    
    yum install mod_dav_svn subversion
    
  • 建立 svn 库 test_prj
    1
    2
    
    mkdir -p /mnt/vdb1/svn_repos/test_prj
    svnadmin create /mnt/vdb1/svn_repos/test_prj
    
  • 编辑 test_prj 下 conf 目录中的 authz 和 passwd 文件,配置权限
  • 启动 svn
    1
    2
    3
    
    svnserve -d -r /mnt/vdb1/svn_repos/
    #客户端测试
    svn checkout svn://{ip}/test_prj
    
  • 编辑 /etc/httpd/conf.modules.d/10-subversion.conf,追加如下
    1
    2
    3
    4
    5
    6
    7
    8
    
    <Location /test_prj/>
        DAV svn
        SVNListParentPath off
        SVNPath /mnt/vdb1/svn_repos/test_prj/
        #Satisfy Any
        AuthzSVNAccessFile /mnt/vdb1/svn_repos/test_prj/conf/authz
        Require valid-user
    </Location>
    
  • 增加 apache 用户读写 test_prj 目录的权限
    1
    2
    
    usermod -a -G root apache
    chmod -R g+w /mnt/vdb1/svn_repos/
    
  • 重启 httpd 服务
    1
    
    systemctl restart httpd
    

Basic HTTP 认证

  • 生成密码文件(用户名是admin,密码是123456)
    1
    
    htpasswd -c -m /etc/httpd/httpd.auth admin # 按提示输入密码
    
  • 在 Location 中配置如下
    1
    2
    3
    4
    5
    
    <Location />
        AuthType Basic
        AuthName "提示信息"
        AuthUserFile /etc/httpd/httpd.auth
    </Location>
    

Keepalived 基础

VRRP 简介

  • VRRP通过一种竞选协议动态地将路由任务交给LAN中虚拟路由器中的某台VRRP路由器
  • VRRP路由器是一台实现了VRRP协议(运行VRRPD程序)的物理路由器
  • 虚拟路由器是由多台VRRP物理路由器组成的逻辑路由器,对外看起来就像一台路由器
  • 虚拟路由器中,只有一台MASTER物理路由器工作,其他都是BACKUP
  • MASTER路由器一直发送VRRP广播,MASTER不可用后(BACKUP收不到广播),其余BACKUP会根据优先级竞选出一台MASTER
  • MASTER拥有虚拟路由器IP地址及其它路由配置

全局配置

  • 全局定义
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    global_defs {
        notification_email {
            admin@exammple.com #keepalived发生事件时通知该email
            ...
        }
        notification_email_from admin@example.com
        smtp_server 127.0.0.1 #smtp服务器
        smtp_connect_timeout 30
        router_id my_hostname #机器标识
        default_interface eth0 #设置静态地址默认绑定的端口,默认是eth0
        vrrp_mcast_group4 #VRRP 的组播IPV4地址,默认224.0.0.18
        vrrp_mcast_group6 #VRRP 的组播IPV4地址,默认ff02::12
        vrrp_version 2|3 #设置默认的VRRP版本,默认是2
        script_user <username> [groupname] #设置运行脚本默认用户和组,如果没有指定,则默认用户为keepalived_script(需要该用户存在),否则为root用户,默认groupname同username
        enable_script_security #如果脚本路径的任一部分对于非root用户来说,都具有可写权限,则不会以root身份运行脚本
    }
    
  • 静态地址和路由,不随 vrrpd instance 的开/关变化
    1
    2
    3
    4
    5
    6
    7
    8
    
    static_ipaddress {
        $ip/$mask dev $interface #ip命令规则
        ...
    }
    static_routes {
        $dest_ip/$dest_mask via $dest_gateway dev $interface #ip命令规则
        ...
    }
    
  • 一般服务器都配置了网络信息,所以通常无需配置静态地址和路由,如果不指定 dev,则使用 default_interface

VRRPD 配置

  • VRRP检查脚本(vrrp_script)
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    vrrp_script <SCRIPT_NAME> {
        scrip "/path/to/script-file" #可执行的脚本的绝对路径
        interval <INTEGER> #脚本执行的间隔,单位是秒,默认为1s
        timeout <INTEGER> #指定在多少秒后,脚本被认为执行失败
        weight <-254 --- 254> #调整优先级,默认为2
        #如果脚本执行成功(退出状态码为0),weight大于0,则priority增加
        #如果脚本执行失败(退出状态码为非0),weight小于0,则priority减少
        #其他情况下,priority不变
        rise <INTEGER> #执行成功多少次才认为是成功
        fall <INTEGER> #执行失败多少次才认为失败
        user <USERNAME> [GROUPNAME] #运行脚本的用户和组
        init_fail #假设脚本初始状态是失败状态
    }
    
  • VRRP同步组(sync group)
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    vrrp_sync_group VG_1 {
        group {
            inside_network #实例名
            ...
        }
        notify_master /path/to/master.sh #切换到master时执行该脚本
        notify_backup /path/to/backup.sh #切换到backup时执行该脚本
        notify_fault  /path/to/fault.sh #出错时执行该脚本
        notify /path/to/notify.sh #该脚本会在notify_*脚本后执行,默认3个参数:$1(GROUP|INSTANCE),$2(group或instance名字),$3(MASTER|BACKUP|FAULT)
        smtp_alert #发送邮件通知
    }
    
  • VRRP实例(instance)配置
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    vrrp_instance inside_network {
        state MASTER #初始状态
        interface eth0 #绑定的网卡
        dont_track_primary #忽略VRRP的interface错误(默认不设置)
        track_interface { #这里的任一网卡出现问题,都会进入FAULT状态
            eth0
            eth1 weight <-254 - 254>
            ...
        }
        track_script { #这里的任一脚本返回码非0,都会进入FAULT状态
            <SCRIPT_NAME>
            <SCRIPT_NAME> weight <-254-254>
            ...
        }
        mcast_src_ip <IPADDR> #多播包发送源地址,默认网卡当前ip
        garp_master_delay 10 #切换到MASTER后,延迟arp请求
        virtual_router_id 1 #VRID标记(0..255)
        priority 100 #高优先级竞选为MASTER,MASTER高于BACKUP至少50
        advert_int 1 #检查间隔,默认1秒
        authentication {
            auth_type PASS #密码认证
            auth_pass 1111
        }
        virtual_ipaddress { #漂移地址,符合ip命令规则
            $vip/$vmask dev $interface
            ...
        }
        virtual_routes { #随地址一同漂移的路由,符合ip命令规则
            $dest_ip/$dest_mask via $dest_gateway dev $interface
            ...
        }
        nopreempt #BACKUP配置,且优先级比其他高
        preempt_delay 300 #抢占延迟,默认5分钟
        debug #Debug级别
        lvs_sync_daemon_interface #lvn syncd绑定的网卡
    }
    

LVS配置(不涉及lvs时无需下面配置)

  • 虚拟主机组
    1
    2
    3
    4
    5
    6
    7
    
    virtual_server_group <STRING> {
        #VIP VPORT
        <IPADDR> <PORT>
        <IPADDR> <PORT>
        ...
        fwmark <INT>
    }
    
  • 虚拟主机3中配置
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    #virtual_server IP port
    #virtual_server fwmark int
    #virtual_server group string
    virtual_server 192.168.1.229 80 { #配置一个virtual server
        delay_loop 3 #每隔3秒检查一次RealServer是否可用
        lb_algo rr|wrr|lc|wlc|lblc|sh|dh #LVS调度算法
        lb_kind NAT|DR|TUN #LVS集群模式
        persistence_timeout 120 #同一个客户端IP在120秒内分到同一个RealServer
        persistence_granularity <NETMASK> #会话保持粒度,默认255.255.255.255,即根据每个客户端IP做会话保持
        protocol TCP #协议
        ha_suspend
        virtualhost <string> #HTTP_GET健康检查时使用的HOST}
        sorry_server <IPADDR> <PORT> #所有RS失效后连接该备用机
        real_server <IPADDR> <PORT> {
            weight 1 #默认1,0失效
            inhibit_on_failure #健康检查失败后将weight置0,不从IPVS中删除
            notify_up <STRING> #检测到service up后执行的脚本
            notify_down <STRING> #检测到service down后执行的脚本
            #检查方式,HTTP_GET|SSL_GET|TCP_CHECK
            HTTP_GET|SSL_GET {
                url {
                    path /
                    digest <STRING> #SSL检查返回的摘要信息
                    status_code 200 #HTTP检查返回的状态码
                }
                connect_port 80 #检查端口
                bindto <IPADDR> #使用该地址发送健康检查
                connect_timeout #连接超时时间
                nb_get_retry 3 #重连次数
                delay_before_retry 2 #重连间隔(秒)
            }
            TCP_CHECK {
                connect_port 80
                bindto <IPADDR>
                connect_timeout 4
            }
        }
    }
    

配置日志文件

  • 修改服务启动参数
    1
    2
    
    sed -i '/^KEEPALIVED_OPTIONS/d' /etc/sysconfig/keepalived
    echo 'KEEPALIVED_OPTIONS="-D -d -S 2"' >> /etc/sysconfig/keepalived
    
  • 修改 rsyslog 配置文件
    1
    
    echo "local2.* /var/log/keepalived.log" >> /etc/rsyslog.conf
    
  • 重启 rsyslog 服务
    1
    
    systemctl restart rsyslog
    
  • 重启 keepalived 服务
    1
    
    systemctl restart keepalived
    

其他参考

Keepalived 笔记

keepalive 服务器

  • 环境

    • 应用服务器
      • ka101: 10.1.1.101
      • ka102: 10.1.1.102
    • 虚拟地址
      • ip: 10.1.1.100
  • 安装 keepalived

    1
    
    yum install keepalived
    
  • 配置虚拟 ip

    1
    2
    3
    4
    5
    6
    
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    ip addr add 10.1.1.100/32 brd 10.1.1.100 dev lo
    ip route add 10.1.1.100 dev lo
    

两个 haproxy 不抢占

  • MASTER/BACKUP 完整配置
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    global_defs {
        router_id ka101 #BACKUP 这里是 ka102
        script_user root
        enable_script_security
    }
    vrrp_script chk_haproxy {
        script "/usr/bin/systemctl status haproxy"
        interval 2
        weight 0
        fall 2
        rise 2
    }
    vrrp_instance VI_1 {
        state BACKUP #MASTER 和 BACKUP 这里都是 BACKUP
        virtual_router_id 1
        priority 150 #BACKUP 这里是 100
        advert_int 2
        nopreempt #BACKUP 优先级低,需注释此行
        interface eth0
        track_script {
            chk_haproxy
        }
        authentication {
            auth_type PASS
            auth_pass 1011100
        }
        virtual_ipaddress {
            10.1.1.100/24 dev eth0
        }
    }
    

两个 LVS-DR 调度器不抢占均衡后端 MySQL 和 Ceph 负载

  • 环境

Kubeadm

kubeadm 安装 kubernetes

全部服务器配置

IP 地址 主机名 操作系统 内存 swap 硬盘 Internet firewalld selinux /etc/hosts 增加行
10.0.2.80 master80 CentOS7 4GB 关闭 20GB 可达 关闭 关闭 127.0.0.1 master80
10.0.2.81 node81 CentOS7 2GB 关闭 20GB 可达 关闭 关闭 127.0.0.1 node81
10.0.2.82 node82 CentOS7 2GB 关闭 20GB 可达 关闭 关闭 127.0.0.1 node82
  • 确认各服务器工作网卡的 MAC 和 UUID 均不相同

Ovirt 安装

版本

Ovirt 4.1.7

操作系统初始配置

角色 主机名 CPU 内存 IP 版本 /etc/hosts 追加行
管理节点 engine 多核 2G 10.0.16.160 CentOS 7.4 Minimal 10.0.16.160 engine engine.ovirt
10.0.16.161 host161
计算节点 host161 多核 4G 10.0.16.161 CentOS 7.4 Minimal 10.0.16.161 host161
  • 建议保留操作系统自带的 NetworkManager 和 SELinux 服务

CentOS7 安装 Mysql Galera 集群

环境

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 源文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cat > /etc/yum.repos.d/galera.repo <<-END
[galera]
name = Galera
baseurl = http://releases.galeracluster.com/galera-3/centos/7/x86_64/
gpgkey = http://releases.galeracluster.com/GPG-KEY-galeracluster.com
gpgcheck = 1

[mysql-wsrep]
name = MySQL-wsrep
baseurl = http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/
gpgkey = http://releases.galeracluster.com/GPG-KEY-galeracluster.com
gpgcheck = 1
END

安装

1
yum install galera-3 mysql-wsrep-5.7 rsync

修改 /etc/my.cnf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
binlog-format=ROW
bind-address=0.0.0.0
default-storage-engine=innodb
innodb-autoinc-lock-mode=2
innodb-flush-log-at-trx-commit=0
innodb-buffer-pool-size=1024M #物理内存一半
wsrep-provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep-provider-options="gcache.dir=/var/lib/gcache;gcache.size=1G;gcache.recover=yes;pc.recovery=TRUE"
wsrep-cluster-name="mysql_galera_cluster" #集群名字
wsrep-cluster-address="gcomm://10.10.10.1,10.10.10.2,10.10.10.3"
wsrep-sst-method=rsync
wsrep-node-name=mysql_1 #当前节点名字
wsrep-node-address="10.10.10.1" #当前节点 cluster ip
#wsrep-auto-increment-control=OFF #只通过一个节点做增删改时使用

[mysql_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

!includedir /etc/my.cnf.d/

随机选择一个节点,使用专用脚本 mysqld_bootstrap 初始化集群

1
2
3
/usr/bin/mysqld_bootstrap
# 该命令会启动本机的 mysqld 服务
systemctl status mysqld

查找密码,修改初始密码

1
2
3
4
grep -i password /var/log/messages
# 记录输出的密码
mysqladmin -uroot -p password 'P@sswo2d'
# 根据提示输入上一步输出的密码

在其他节点上启动 mysqld 服务

1
systemctl start mysqld

查看集群节点数量

1
show status like 'wsrep_cluster_size';

ssl 加密同步数据(不推荐,存在性能损失)

  • 生成证书