本站点于2017-12-05年迁移到阿里云香港节点。
双11活动,¥1500租用3年。
配置:
2core(E5-2682 2.50GHz) 4G
1Mbps
作者归档:weskiller
Bash Parameter Expansion
今天重新温故了一遍shell
Bash Reference Manual
在阅读Parameter Expansion部分发现了新大陆.
${parameter:-word}
如果parameter为空或者未定义,值替换为word;否则为parameter的值.
#var1="" var2="world" #echo ${var1:-hello} ${var2:-guest} hello world
${parameter:=word}
如果parameter为空或者未定义,word赋值给parameter;否则为parameter的值.
#var1="" var2="world" #echo ${var1:=hello} ${var2:=guest} hello world #echo ${var1} ${var2} hello world
${parameter:?word}
如果parameter为空或者未定义,word作为标准错误输出,并且如果shell非交互式,退出shell;否则为parameter的值.
#echo ${var:?这个变量存在吗?} -bash: var: 这个变量存在吗?
${parameter:+word}
如果parameter为空或者未定义,值为空;否则为word的值.(和${parameter:-word}相反)
#var1="" var2="world" #echo ${var1:+hello} ${var2:+guest} guest
${parameter:offset}
${parameter:offset:length}
这是子字符串的扩展;
如果parameter是一个变量,
值为参数(从左到右)第offset的开始保留length个字符;
如果没有指定length,值为参数(从左到右)第offset的开始的字符;
如果offset小于0,则从尾部开始(offset为负数时,一定要加空格);
如果length小于0,则表示为从尾部开始的偏移量.
如果parameter是一个数组(带下标@或者*),
数组成员作为一个元素偏移,length必须大于0.
*strings为变量 #strings=goodluck #echo ${strings:4:4} luck #echo ${strings: -6:2} od #echo ${strings: -6:-1} odluc *strings为数组,length必须大于0 #strings=(this is a arrays) #echo ${strings[@]:2:1} a #echo ${strings[@]: -1:1} arrays #echo ${strings[@]: -1: -1} -bash: -1: substring expression < 0
${!prefix*}
${!prefix@}
列出所有开头为prefix的变量名,以IFS的第一个字符作为分隔符.
如果使用”@“,并且在双引号内,则每个变量名为一个单独的单词.
#declare websit=blog.weskiller.com wad= wait=3 #echo ${!w@} wad wait websit #echo ${!wa*} wad wait #for i in "${!wa@}";do echo $i;done wad wait #for i in "${!wa*}";do echo $i;done wad wait
${!name[@]}
${!name[*]}
如果name是一个数组变量,列出数组下标或者数组键值(如果是键值数组),
如果使用”@“,并且在双引号内,则每个键值或者下标为一个单独的单词.;
如果name是一个变量,则值为0;
如果name不是一个数组或者变量,值为空.
#declare -A arrays=([a]=1 [b]=2 [c]=3 [d]=4) #echo ${!arrays[@]} a b c d #unset arrays #declare -a arrays=(1 2 3 4 5) #echo ${!arrays[*]} 0 1 2 3 4 #unset arrays #decalire arrays=this #echo ${!arrays[@]} 0
${#parameter}
值为parameter字符的长度;
如果parameter是一个数组(带下标@或者*),则值表示数组包含元素的个数.
#strings=abcd #echo ${#strings} 4 #strings=(a b c d e) #echo ${#strings[*]} 5
${parameter#word}
${parameter##word}
“*“表示为通配符,表示任意字符任意长度,
“?“表示为通配符,表示一个任意字符,
“[..]“表示匹配[]内包含的单个字符.
详细资料请移步查看手册Filename-Expansion
word作为文件名扩展模式,从parameter的值头部开始匹配,删除匹配最短的部分(#),或者删除最长匹配的部分(##).
如果parameter是一个数组(带下标@或者*),
则对每个元素进行匹配,结果为删除后的值.
#strings="hello world" #echo ${strings#h*l} lo world echo ${strings##h*l} d
${parameter%word}
${parameter%%word}
和${parameter#word},${parameter##word}相同,但是从尾部开始匹配.
#strings="hello world" # echo ${strings%l*d} hello wor # echo ${strings%%l*d} he
${parameter/pattern/string}
pattern匹配parameter的值,替换为string,/替换第一次匹配,
如果pattern开头为/,则替换所有匹配;
pattern作为文件名扩展模式.
#strings=abcdea #echo ${strings/a/0} 0bcdea #echo ${strings//a/0} 0bcde0
${parameter^pattern}
${parameter^^pattern}
改变parameter的值,转换小写字母为大写,第一个字符为大写(^),或者全部转换为大写(^^).
#shell=bash #echo ${shell^} Bash #echo ${shell^^} BASH
${parameter,pattern}
${parameter,,pattern}
改变parameter的值,转换大写字母为小写,第一个字符为小写(,),或者全部转换为小写(,,).
#shell=BASH #echo ${shell,} bASH #echo ${shell,,} bash
陆续更新
初识docker
很久以前就听闻docker很火,替代虚拟化的一种容器技术,一直也有心学习,但是一直都…。(好吧,太懒了)
公司有近20+的mysql数据库,一直使用Kernel-based Virtual Machine的虚拟化技术进行资源隔离,随着公司的发展,各种类型的数据库越来越多。
kvm的方案对于cpu,memory,disk io方面负载都是非常明显的。
在实际测试中,在一台40核96G内存和固态raid10的服务器上,创建5个kvm实例,每个实例设定8核16G数据盘放在固态raid上(实例中运行mysql)。
在每日峰值下,经常会出现磁盘io而导致的cpu wait耗时,sql平均执行时间耗时到了秒级。kvm主机上,磁盘io负载在400%左右。更严重的是,在实例没有任何负载(kvm实例没有运行mysql)情况下,kvm主机的磁盘io还是明显降低了近30%左右。
而在kvm实例中。分配的16G内存实际应用占用的仅有14G左右,剩下的所有都被系统用于buffer,而swap空间占用也很严重,能达到真实内存的2倍。
使用资源隔离,但是作为代价,资源隔离也要消耗资源。当然希望隔离消耗的资源越小越好。
去了解了docker技术的实现,阅读了一本入门书籍《Docker 实践》,在线上使用docker运行mysql实例跑了一段时间。
确实相对于kvm资源隔离的消耗减少,管理也相对便利。最重要是解决了磁盘io性能上的问题。在最近一段时间内的测试,在每日峰值下,docker主机磁盘io负载降低为60%~80%,mysql实例内存为真实的限定值。而且所有docker实例共享cache,而不是kvm的每个单独实例共享cache,猜测也是io负载下降如此大的原因。
但是也随之而来的发现一些问题。
No1. 在使用中发现一些bug,restart的时候,如果服务器负责较大,实例在重启完成后,会出现实例假死的情况,而ps显示在正常运行。
No2. docker的网络配置不够强大。无法实现某些需求(比如docker主机和实例在同一网段)
No3. docker的镜像创建不够强大。dockerfile只能从另外一个镜像开始,而一个简单的nginx容器完成创建后,可能会不符合你日常熟悉的配置路径。(也可以用go语言编译)
No4. 这是在国内才有的问题。由于被墙的原因,docker仓库基本上访问不了。(在学习中使用的alpine镜像都是我从国外vps下的)
No5. docker的联合文件系统,让selinux很尴尬。
No6. docker的容器环境也是一个大问题。
站点更换域名
此站点于2017年2月20日更换域名为
blog.weskiller.com
并且会采用https协议.
weskiller.cn域名将被弃用.