操作系统

Linux运维基础技能: 脚本编程与Linux命令

本系列文章一共三篇,分别为《脚本编程与Linux命令》、《接入层与网络基础》和《 MySQL 与 SQL 优化》,由腾讯高级工程师 luaruan(阮永顺) 原创、张戈博客整理分享,如有勘误请在博客留言。 希望对需要学习、面试Linux运维的同学有所帮助。 $1 入参,空值时默认赋值技巧 $* 和 [email protected] 区别 $* 和 [email protected] 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含 时,都以"$1" "$2" … "$n" 的形式输出所有参数。 但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体, 以"$1 $2 … $n"的形式输出所有参数;" [email protected]" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。 区别在于,分别输出 1 2 3 和 1 2 3 几个 Shell 里的内置变量 Tips: awk 教程 https://coolshell.cn/articles/9070.html sed 教程 https://coolshell.cn/articles/9104.html Shell script 基础问答 https://linux.cn/article-5607-1.html Shell 四则运算方法 函数定义与调用 条件判断 字符串与序列、随机数 name=John && echo 'My name is $name' 输出'My name is $name ,因为单引号里面的$只会当作字面值 字符串截取 a=123456789 ; echo ${a:0:3} 输出 123 echo 替换字符 序列 随机数 使用 cksum 从管道灌进去一些随机文本可生成一些随机数字,需要使用 cut 切 割 字符串截取 提取最后一位 日期 删除空行 Shell script 语法在线检查与建议:https://www.shellcheck.net...
阅读全文
大数据

Nexus3最佳实践系列:搭建Docker私有仓库

容器仓库是容器化管理中非常重要的一环,相当于SVN在程序研发、运维发布中的地位。因此,一个稳定、可靠的容器仓库尤为重要。 目前我知道的的数据仓库有: Docker官方的Registry原生仓库 SuSE团队推出的出的Portus:https://github.com/SUSE/Portus VMWare中国团队推出的企业级仓库—Harbor 大家熟知的Maven私服:Sonatype Nexus3 本文主要介绍下Sonatype Nexus 3这个功能强大的产品,它不仅能够用于创建Maven私服,还可以用来创建yum、pypi、npm、nuget、rubygems等各种私有仓库。而且,Nexus从3.0版本也开始支持创建Docker镜像仓库了! 因此,在上述几个产品里面我毫不犹豫的选择了Nexus3作为部门的公共数据仓库,一举多得。 一、部署 这里依然使用最简单的Docker化部署,过程非常之简单!在一台有外网的机器上安装好docker之后,执行如下启动脚本即可: 大概2分钟左右可以完成启动,此时可以通过浏览器访问 http://IP地址:8081 即可出现nexus的web界面: 二、配置 1、配置Blob存储 点击右上角的Sign in,输入默认账号密码:admin/admin123 登录到管理员身份。 打开控制页面的按钮,默认进入了仓库配置界面,选择Blob Stores开始创建存储空间: 我这边创建了如下Blob,以备后用: 2、创建Docker仓库 回到前面的repository界面,点击repositories打开页面后点击【create repository】打开仓库类型选择界面(真的非常丰富!): 可以看到Docker有三种类型,分别是docker(group),docker(hosted),docker(proxy)。其含义解释如下: hosted : 本地存储,即同docker官方仓库一样提供本地私服功能 proxy : 提供代理其他仓库的类型,如docker中央仓库 group : 组类型,实质作用是组合多个仓库为一个地址 下面开始创建Docker仓库: 首先,我们创建一个docker代理仓库,点击docker(proxy),如图填写信息: 往下翻页,勾上 “Allow clients to use the V1 API to interact with this Repository”,允许Docker V1 API请求。 至于代理的对象,我可以选择官方的镜像地址:https://registry-1.docker.io,但是官方的比较慢,所以这里我们可以填写国内的Docker镜像加速器地址,比如阿里云或DaoCloud的容器加速: 我这里选择了DaoCloud的镜像加速,这里为了确保能够拉取DockerHub最新的镜像,我选择了Use DockerHub 这个Index。 接着,再创建一个本地仓库,这里比较简单,只需要填写本地仓库的名称,比如 docker-hosted,然后填写HTTP端口即可,比如8083: 保存之后,最后创建一个聚合仓库(group),将代理仓库和本地仓库聚合到一起使用,这里我命名为docker,然后端口选择8082: 这里成员仓库的顺序可以稍微规划下,一般来说将本地的放前面,代理第三方的放后面,好处就是优先使用本地或小众的镜像仓库。我这边是用了多个第三方仓库,所有有多个: 至此,nexus在docker这一块是部署已经完成了,但是这样并不能很好的使用。因为group仓库并不能推送镜像,因为你推送自己制作的镜像到仓库还得通过本地仓库的端口去推送,很不方便! 下面分享一下我这边原创的解决方法:通过Nginx来判断推镜像还是拉镜像,然后代理到不同端口,解决这个问题,还是非常巧妙的。 3、配置Nginx 在部署Nginx部分,我们先需要生成自签名SSL证书,因为后面不想在docker pull的时候还要带一个端口!这里我们需要2个域名,一个用来展示nexus前台,另一个用做docker仓库,比如: nexus前台:repo.xxx.com docker仓库:idocker.io 生成自签名SSL证书的方法网上很多,这里推荐一个一键生成工具,大家可以尝试使用:https://github.com/Fishdrowned/ssl ,使用方法请参考作者说明。 Ps:如果你打算做外网仓库服务,那也可以去申请一个免费SSL证书,我这边是内部oa域名使用,所以只能用自签名证书了。 Nginx的规则如下: Nginx部署完成之后,我们还需要将自签名的根证书(ca.crt)导入到客户端才可以正常使用,否则会报不信任错误。 在上文介绍的一键生成自签名工具中,会生成一个根证书,名称为ca.crt,我们将这个文件上传到客户端服务器的 /etc/docker/certs.d/idocker.io 目录即可(注意目录需要创建,最后的文件夹名称和仓库域名保持一致:idocker.io)。 为了方便后面的人使用,我将上述部署证书的过程弄成一个在线脚本,实现快速部署: 脚本保存为 docker_init.sh,上传到nginx服务器的 /data/wwwroot/repo.xxx.com/download/cert 目录即可。 最终,我们可以使用如下命令行一键部署docker证书: 是不是非常方便? 4、关于高可用 相信用心的同学已经注意到了,Nexus3存在一个单点问题。在看完官方文档后,发现Nexus3的免费版本仅支持单点,只有收费版才支持集群模式: 在高可用方面,我前后做了2个尝试: ①、将数据保存到ceph分布式存储:能用,但是push的速度实在不敢恭维!layer文件越小越慢。 ②、折中方案:另外部署一个节点,每隔一段时间将主节点数据同步过去,然后备份节点每隔一段时间重启一次(不重启的话数据不会更新),并且数据再同步一份到ceph确保安全。在Nginx中,将备份节点加入到backup,当主节点宕机的时候,备机可以顶上来继续使用。 当然, 觉得这样做还不够的同学也可以参考官方的备份文档进一步优化:https://help.sonatype.com/repomanager3/high-availability/designing-your-cluster-backup-restore-process 三、小结 docker仓库的使用我就不再赘述了,nexus我们使用的是group这个聚合仓库,本地没有的镜像会去外网搜索,如果存在则拉取并缓存到本地,下次再拉取则直接使用缓存数据。所以,在拉取外网的镜像时,第一次会比较慢,第二次就和本地基本一致了。 上文提到,Nexus还有其他很多实用仓库,比如yum、python、npm、maven等等。我所在的部门也全部用到了,非常好用!感兴趣的同学可以自己去尝试配置,都非常直观简单!当然,后面有空我也会整理一下各个种类仓库的最佳实践,比如各种仓库一键初始化的经验,敬请期待!
阅读全文
数据库

MySQL主从报错解决:Table ‘mysql.gtid_slave_pos’ doesn’t exist

给内部一个数据库做异地热备,热备部分采用了MariaDB的galera集群模式。然后挑选其中一台作为Slave和深圳主集群做主从同步。 主集群是老环境,用的版本还是是MySQL 5.5.13。用常规办法创建主从同步 结果有如下报错: 错误信息为:Last_SQL_Error: Unable to load replication GTID slave state from mysql.gtid_slave_pos: Table 'mysql.gtid_slave_pos' doesn't exist 搜了下资料,大部分说是没有执行mysql_upgrade导致的,不过我们这边的MariaDB是Docker跑的,而且用了很长时间了,理论上应该是没问题的才对。 既然提示没有这个表:Table 'mysql.gtid_slave_pos' doesn't exist,那我就创建一个吧! 从网上找到这个建表语句: 在作为Slave的MariaDB上执行,然后重启slave后问题解决,过程如下:
阅读全文
WEB应用

解决网站404页面返回200状态码问题

好久没打理博客,突然收到CDN流量预警,发现平均每天40G流量消耗!what?就现在这个访问量,不存在的。看了下CDN日志发现有小人一直在请求博客页面,其中被请求最多的就是CCkiller防御工具那个文章地址。 呵呵,我就写一个简单的防御小工具,惹着你啦?实际上我用了CDN,也并没有安装这个工具,所以想试探、想测试效果的麻烦自己去安装使用,攻击我博客毫无意义,挂了又能怎么样? 废话就扯这么多,进入正题。 看日志的时候,我发现有大量请求到了博客其实并不存在的地址,但是返回码居然是200??这就不正常了,于是手工访问了一下一个不存在的页面,虽然WordPress在前台给我展示了一个404页面,但是浏览器显示返回码确实是200!!纳尼? 还以为WordPress更新后改了这个机制呢,把主题下的404.php加了一个强行的404返回码,发现没有任何效果。 最后发现,居然是自己以前把404页面静态化留下的坑! 原因很简单,当时经常有人攻击一些不存在的页面,也就是每次都是动态的404,服务器自然就容易高负载,因此做了一个静态化处理: 通过curl请求一个不存在的地址,触发404返回内容,然后保存在网站的某个目录下,比如xxxx下面: 然后,在Nginx Vhost下新增404响应规则: 重启Nginx之后,再访问不存在的博客页面的时候,Nginx就直接返回404.html的内容了,从而实现404页面的静态化。 但是,Nginx这里我写错了,导致每次返回404.html都是200返回码!!这样其实会误导搜索引擎的判断,以为页面是存在的。。。。大坑。 正确的Nginx配置方法应该是: 也就是不用等号,而是用空格!修改后,重启Nginx,然后访问不存在的地址发现已经是404返回码了,问题解决!
阅读全文
大数据

零门槛!基于Docker快速部署ES集群

自从接触Docker之后,对Docker简直是爱不释手,做什么都是行云流水。遇到部署开源软件需求,第一时间想到的都是有没有现成的Docker镜像?能不能直接拉起来使用? 所以,这次部门内部的ES集群的重建,全部使用DockerHub已有镜像完成部署,整个过程变得非常简单!本文将分享详细的部署过程,希望对ES感兴趣或即将入坑ES的同学带来一些帮助。 一、整体架构 这里,我先给出本文最终的整体架构,让大家有一个清晰的部署思路: 角色分离:本文分享的ES架构中,特意将Master和Client独立出来,后续节点的重启维护都能快速完成,对用户几乎没有影响。另外将这些角色独立出来的以后,对应的计算资源消耗也就从Data节点剥离了出来,更容易掌握Data节点资源消耗与写入量和查询量之间的联系,非常有利于集群后续的容量管理和规划,算是一个比较成熟的中小型方案,准备正儿八经开搞的同学可以参考部署。 Ps:详细的ES角色职责说明可以查看官方文档。 数据流向:Beats或自研系统上报日志到Kafka,然后Logstash从Kafka读取数据写入ES.Client,最终数据存放到ES.Data节点。用户可以通过Kibana或ES.Client的Restful接口查询数据。 本文涉及的IP的角色属性清单: 名称 服务器IP 角色 备注 Docker仓库 192.168.1.111 Docker/registry 内网私有仓库,需要外网 Kafka Cluster 192.168.1.100 Kafka/Zookeeper 192.168.1.101 Kafka/Zookeeper 192.168.1.102 Kafka/Zookeeper ES Cluster 192.168.2.100 ES: Master/Client/Kibana 128Gx35核 192.168.2.101 ES: Master/Client/Kibana 192.168.2.102 ES: Master/Client/Kibana 192.168.3.100 ES: DATA    64Gx32核 2TBx12 Ps:预算充足的强烈推荐上SSD硬盘,可以极大的提高集群性能! 192.168.3.101 ES: DATA 192.168.3.102 ES: DATA 192.168.3.103 ES: DATA  本文涉及的部分参数简单解释(更多详细解释请咨询搜索引擎): 本文涉及的部分参数简单解释(更多详细解释请咨询搜索引擎): 二、Docker资源 1、Docker私有仓库搭建(针对内网环境) ①、在有外网的服务器 192.168.1.111 上进行如下操作: Ps:若内部没有外网服务器,可以使用离线导出导入(save/load)的方案来做本地仓库,具体参考我之前整理的Docker入门教程-->传送门 ②、docker启动后,开始拉取所需镜像: 以下镜像均位于dockerHub,拉取龟速,这里可以使用阿里云的dockerHub加速服务(腾讯云的仅支持腾讯云服务器内网使用) zookeeper 镜像主页:https://hub.docker.com/_/zookeeper/ kafka 镜像主页: https://hub.docker.com/r/wurstmeister/kafka/ Elastic 镜像主页:https://www.docker.elastic.co/ Ps:6.X版本强制启用了content-type头部请求,比较烦,本文选择5.X的最后一个版本,实际使用请自行抉择。 完成以上步骤,我们就在192.168.1.111上建立了一个Docker私有仓库,地址是 192.168.1.111:5000。 2、所有服务器节点都安装要docker,并开启私有仓库支持 vim /etc/sysconfig/docker 添加兼容私有仓库非https协议配置: 启动Docker: 完成这一步之后,Docker环境已准备完毕。 三、部署Kafka集群 Ps:若只是单纯部署ES集群,而不需要用到kafka,可以跳过本步骤 1、部署zookeeper ①、部署节点1 ②、部署节点2 ③、部署节点3 2、部署kafka ①、部署节点1 ②、部署节点2 只需要修改如下参数,其他和节点1代码一样: ③、部署节点3 同上所述,只需要修改如下参数: 完成之后,我们就使用纯Docker搭建了一个Kafka集群。 四、部署ES集群 1、内核参数优化 vim /etc/sysctl.conf 最后,执行 sysctl -p 生效 3、创建挂载目录 Master节点:...
阅读全文