0%

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/bin/env bash
set -e

# isEmpty

is_empty(){
local string=$1
[ -n $1 ]
}

# length
# 获取字符串长度
# 例如 length "123456789"
length(){
local string=$1
# expr length $string
echo "${#string}"
}

# 字符串是否相等
equals(){
local string=$1
local compare_with=$2
[[ $string == $compare_with ]]
}

# 字符串是否包含匹配表达式,
contains(){
local string=$1
local pattern=$2
[[ $string =~ $pattern ]]
}

# 字符串截取
# 例如
# substr "123456789"
# substr "123456789" 2
# substr "123456789" 2 -3
# substr "123456789" 2 4
substr(){
local string=$1
# 截取的起始位置
# 默认从 0 开始
local position=${2:-0}
# 截取的长度
# 默认是最大长度
# 为负数时, 即自后向前截取, `$length + $position` 不能超过字符串的总长度
# 为正数时, 长度可以超过字符串的总长度
# $position 与 $length 为闭开区间
local length=${3:-${#string}}
# expr substr $str $position $length
echo ${string:position:length}
}

# 字符串删除从开头开始最短匹配的表达式
# 例如 cut_from_begin_by_min_matches "abcdefgabcdefg" "a*d"
cut_from_begin_by_min_matches(){
local string=$1
# 需要匹配的子字符串
local pattern=$2
echo ${string#$pattern}
}

# 字符串删除从开头开始最长匹配的表达式
# 例如 cut_from_begin_by_max_matches "abcdefgabcdefg" "a*d"
cut_from_begin_by_max_matches(){
local string=$1
# 需要匹配的子字符串
local pattern=$2
echo ${string##$pattern}
}

# 字符串删除从结尾开始最短匹配的表达式
# 例如 cut_from_end_by_min_matches "abcdefgabcdefg" "d*g"
cut_from_end_by_min_matches(){
local string=$1
# 需要匹配的子字符串
local pattern=$2
echo ${string%$pattern}
}

# 字符串删除从结尾开始最长匹配的表达式
# 例如 cut_from_end_by_max_matches "abcdefgabcdefg" "d*g"
cut_from_end_by_max_matches(){
local string=$1
# 需要匹配的子字符串
local pattern=$2
echo ${string%%$pattern}
}

# 最长匹配表达式, 替换第一个符合条件的子字符串
# 例如
# replace_first "abcdefgabcdefg" "b*d"
# replace_first "abcdefgabcdefg" "b*d" "zzz"
replace_first(){
local string=$1
# 需要匹配的子字符串
local pattern=$2
# 需要替换成的字符串
local replace_to=$3
echo ${string/$pattern/$replace_to}
}

# 最长匹配表达式, 替换第一个符合条件的子字符串
# 例如 replace_from_begin "abcdefgabcdefg" "a*d"
replace_from_begin(){
local string=$1
# 需要匹配的子字符串
local pattern=$2
# 需要替换成的字符串
local replace_to=$3
echo ${string/#$pattern/$replace_to}
}

# 最长匹配表达式, 替换第一个符合条件的子字符串
# 例如 replace_from_end "abcdefgabcdefg" "c*g"
replace_from_end(){
local string=$1
# 需要匹配的子字符串
local pattern=$2
# 需要替换成的字符串
local replace_to=$3
echo ${string/%$pattern/$replace_to}
}

# 最长匹配表达式, 替换所有符合条件的子字符串
# 例如 replace_all "abcdefgabcdefg" "a"
replace_all(){
local string=$1
# 需要匹配的子字符串
local pattern=$2
# 需要替换成的字符串
local replace_to=$3
echo ${string//$pattern/$replace_to}
}

# 字符所在位置
indexOf(){
local string=$1
# $substring 只能是单个字符, 如果是包含多个字符的字符串, 也只匹配第一个字符
local substring=$2
expr index $string $substring
}

is_number(){
[[ $param != +([0-9]) ]]
}

to_number(){
local string=$1
echo $1 | awk '{print int($0)}'
}

1
2
3
4
5
# << EOF 不支持缩进, 必须顶格些
# <<- EOF 可以支持缩进, 缩进随 cat 开始
cat > $file_name <<- EOF

EOF

1. 参数

-d 指定时间

2. 时间格式

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
%a    当前locale 的星期名缩写(例如:  日, 代表星期日)
%A 当前locale 的星期名全称 (如: 星期日)
%b 当前locale 的月名缩写 (如: 一, 代表一月)
%B 当前locale 的月名全称 (如: 一月)
%c 当前locale 的日期和时间 (如: 2005年3月3日 星期四 23:05:25)
%C 世纪; 比如 %Y, 通常为省略当前年份的后两位数字(例如: 20)
%d 按月计的日期(例如: 01)
%D 按月计的日期; 等于%m/%d/%y
%e 按月计的日期, 添加空格, 等于%_d
%F 完整日期格式, 等价于 %Y-%m-%d
%g ISO-8601 格式年份的最后两位 (参见%G)
%G ISO-8601 格式年份 (参见%V), 一般只和 %V 结合使用
%h 等于%b
%H 小时(00-23)
%I 小时(00-12)
%c 按年计的日期(001-366)
%k 时(0-23)
%l 时(1-12)
%m 月份(01-12)
%M 分(00-59)
%n 换行
%N 纳秒(000000000-999999999)
%p 当前locale 下的"上午"或者"下午", 未知时输出为空
%P 与%p 类似, 但是输出小写字母
%r 当前locale 下的 12 小时时钟时间 (如: 11:11:04 下午)
%R 24 小时时间的时和分, 等价于 %H:%M
%s 自UTC 时间 1970-01-01 00:00:00 以来所经过的秒数
%S 秒(00-60)
%t 输出制表符 Tab
%T 时间, 等于%H:%M:%S
%u 星期, 1 代表星期一
%U 一年中的第几周, 以周日为每星期第一天(00-53)
%V ISO-8601 格式规范下的一年中第几周, 以周一为每星期第一天(01-53)
%w 一星期中的第几日(0-6), 0 代表周一
%W 一年中的第几周, 以周一为每星期第一天(00-53)
%x 当前locale 下的日期描述 (如: 12/31/99)
%X 当前locale 下的时间描述 (如: 23:13:48)
%y 年份最后两位数位 (00-99)
%Y 年份
%z +hhmm 数字时区(例如, -0400)
%:z +hh:mm 数字时区(例如, -04:00)
%::z +hh:mm:ss 数字时区(例如, -04:00:00)
%:::z 数字时区带有必要的精度 (例如, -04, +05:30)
%Z 按字母表排序的时区缩写 (例如, EDT)
1
echo `date '+%Y-%m-%d %H:%M:%S'`

1
2
# 非交互式输入密码
echo $password | sudo -S apt update -y

Konsole 好用是因为可以修改复制黏贴的快捷键, 这样操作起来比较方便.

1. 修改 Tab title

1
2
3
4
5
# 本地 Tab 格式 : %d : %n
# 远程 Tab 格式 : (%u) %H

# 直接修改当前 Tab 的 title
echo -ne "\033]30;New Title\007"

2. 获取 Session ID

1
echo $KONSOLE_DBUS_SESSION

3. 获取 Konsole 的参数配置

1
konsole --list-profile-properties

1. 安装

1
sudo apt install -y libnotify-bin

2. 使用

1
2
3
4
5
6
7
8
# 向桌面发送通知
notify-send [title] [message]

# 在 crontab 中需要前面加 export DISPLAY=:0.0
export DISPLAY=:0.0 && notify-send -t 3 'Stay Sober' 'Awake & Alive'

* * * * * export DISPLAY=:0.0 && export XAUTHORITY=/home/ravi/.Xauthority && sudo -u ravi /usr/bin/notify-send Hey "How are you"

1. 参数

  • -n
    多行输出

    1
    2
    每行输出3个元素
    cat test.txt | xargs -n 3
  • -d
    选项可以自定义一个定界符

    1
    echo "nameXnameXnameXname" | xargs -d X
  • I
    指定一个替换字符串

    1
    2
    cat arg.txt | xargs -I {} ./sk.sh -p {} -l
    find . -name 'teskechers_crmep-benefit*' | xargs -I {} grep 'T4LP75KKL44T5' {}/run/latests/stdout

https://help.aliyun.com/product/29657.html?spm=a2c4g.11186623.3.1.l1lX2S

Lock conflict 报错处理

DRDS 执行 DDL 操作先会加库级锁, 操作完后再释放掉.
KILL DDL 操作很可能会导致该锁没有释放, 此时再执行 DDL 会有以下报错:

Lock conflict , maybe last DDL is still running
此时执行 RELEASE DBLOCK 释放该锁即可.
指令取消及锁释放后, 选择业务低谷甚至停止期间, 重新执行该 DDL.

分布式事务指事务的参与者, 支持事务的服务器, 资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.

简单的说, 就是一次大的操作由不同的小操作组成, 这些小的操作分布在不同的服务器上, 且属于不同的应用, 分布式事务需要保证这些小操作要么全部成功, 要么全部失败.

1. CAP

CAP 是指以下 3 个属性:

  1. 一致性 Consistency
    数据的一致性
  2. 可用性 Availability
    服务的可用性
  3. 分区容忍性 Partition tolerance
    在网络异常的情况下, 服务能容忍网络分区之间的数据不一致时

CAP 理论指出分布式系统无法同时支持以上 3 个属性, 最多只能保证支持 2 个属性.

对于分布式系统, 必然要支持分区容忍性, 设计者需要在一致性与可用性之间权衡.

2. BASE

BASE 就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案, 也称柔性事务.

BASE是下面三个术语的缩写:

  1. 基本可用 Basically Available
    分布式系统在出现故障时, 允许损失部分可用功能, 保证核心功能可用.
  2. 软状态 Soft state
    允许系统中存在中间状态, 这个状态不影响系统可用性, 这里指的是 CAP 中的不一致.
  3. 最终一致 Eventually consistency
    最终一致是指经过一段时间后, 所有节点数据都将会达到一致.

BASE 理论的核心思想是: 即使无法做到强一致性, 但每个应用都可以根据自身业务特点, 采用适当的方式来使系统达到最终一致性.
它完全不同于 ACID 的强一致性模型, 而是通过牺牲强一致性来获得可用性, 并允许数据在一段时间内是不一致的, 但最终达到一致状态.
但同时, 在实际的分布式场景中, 不同业务单元和组件对数据一致性的要求是不同的, 因此在具体的分布式系统架构设计过程中, ACID 特性和 BASE 理论往往又会结合在一起.

3. XA

XA 由 X/Open 组织提出的处理分布式事务的规范.
XA 规范能够允许在一个全局事务中协调多个分散的事务资源.
使用全局事务的应用会有一个或多个资源管理器和一个事务管理器.

  • 资源管理器 Resource Manager
    用于管理事务资源. 数据库服务就是一个资源管理器. 资源管理还应该具有管理事务提交或回滚的能力.
  • 事务管理器 Transaction Manager
    事务管理器是分布式事务的核心管理者. 事务管理器与每个资源管理器进行通信, 协调并完成事务的处理. 事务的各个分支由唯一命名进行标识.

3.1. 2PC

2PC, 二阶段提交, 2 Phase-Commit

XA 通常采用 2PC.

阶段一为准备(prepare)阶段.
即所有的参与者准备执行事务并锁住需要的资源.
参与者ready时, 向transaction manager报告已准备就绪.

阶段二为提交阶段(commit).
当transaction manager确认所有参与者都ready后, 向所有参与者发送commit命令.

3.2. 3PC

3PC, 三阶段提交

3.3. XA

XA, 是 2PC 的一种实现方式

4. TCC

补偿性事务, Try-Commit-Cancel

5. Paxos

6. 其他

异步处理
幂等 失败, 成功, 处理中
分布式锁
乐观锁
MQ

http://www.tianshouzhi.com/api/tutorials/distributed_transaction/

JTA/XA

7. 思考

解决分布式事务

7.1. 1. 重试

在分布式事务处理中要允许重试, 所以要让事务中的每个操作操作幂等.

对于那些无法将操作转化为幂等操作的, 则无法解决分布式事务的一致性问题.
如 Reids 的 incr() 操作, 再不使用另外一个变量记录操作步骤的情况下, 就无法得知有没有重复操作过

8. Resource

MySQL XA MySQL XA SQL 语法 DTP 参考模型 DTP XA规范

https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html
https://www.jianshu.com/p/16b1baf015e8

MVP—-Minimum Viable Product, 简称MVP, 即 最小化可行产品

在市场不确定的情况下, 通过设计实验来快速检验你的产品或方向是否可行.
如果你的假设得到了验证, 再投入资源大规模进入市场;如果没有通过, 那这就是一次快速试错, 尽快调整方向.

1. Resource