diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..bc36a8e5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,25 @@ +# http://editorconfig.org +# 官网首页有介绍:IntelliJ IDEA,VS Code 默认就支持,无需额外安装插件 +root = true + +# 空格替代Tab缩进在各种编辑工具下效果一致 +[*] +indent_style = space +indent_size = 4 +charset = utf-8 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 200 + + + +[*.java] +indent_style = tab + +[*.{json,yml}] +indent_size = 2 + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/README.md b/README.md index cdb6e19d..80bf6ad0 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,29 @@ -# Java 程序员眼中的 Linux + +## 作者新方向,感谢支持 + +- [从开公司到开发全平台产品(文字版)](https://github.com/cdk8s/cdk8s-team-style/blob/master/full-stack/README.md) +- [从开公司到开发全平台产品(视频版)](https://space.bilibili.com/1765486559/channel/seriesdetail?sid=2359281) ## 初衷(Original Intention) -- 整理下自己所学 +- 整理下自己所学。**但是比较随意,所以很多地方不够严谨,所以请带着批评的思维阅读。** - 带动更多的人进入 Linux 世界,特别是做 Java 开发的人 - Github 项目地址,欢迎 `Fork`、`Star`: - 文章中用到的一些安装包归纳整理: - Gitbook 在线阅读地址: - **学得越多越是明白一个人的力量是不够的,我只是起了一个引子,希望你能一起参与,真心希望!!!(鞠躬)** +## 优秀同行推荐 + +- [Linux工具快速教程](http://linuxtools-rst.readthedocs.io/zh_CN/latest/base/index.html) + ## 目录(Contents) - [Linux 介绍](markdown-file/Linux.md) - [Ubuntu 介绍](markdown-file/Ubuntu.md) - [Ubuntu 安装](markdown-file/Ubuntu-Install.md) - [Ubuntu 设置(目录)](markdown-file/ubuntu-settings/ubuntu-settings-toc.md) +- [Kali Linux 介绍和设置(目录)](markdown-file/kali-linux-settings/kali-linux-toc.md) - [CentOS 介绍](markdown-file/CentOS.md) - [CentOS 6 安装](markdown-file/CentOS-Install.md) - [CentOS 7 安装](markdown-file/CentOS-7-Install.md) @@ -31,102 +40,3 @@ - [Linux 下常用压缩文件的解压、压缩](markdown-file/File-Extract-Compress.md) - [Yum 下载安装包及对应依赖包](markdown-file/Off-line-Yum-Install.md) - [Zsh 入门](markdown-file/Zsh.md) -- [日常维护](markdown-file/maintenance.md) -- [日常监控](markdown-file/monitor.md) -- [nmon 系统性能监控工具](markdown-file/Nmon.md) -- [SSH(Secure Shell)介绍](markdown-file/SSH.md) -- [FTP(File Transfer Protocol)介绍](markdown-file/FTP.md) -- [VPN(Virtual Private Network)介绍](markdown-file/VPN.md) -- [NFS(Network FileSystem)介绍](markdown-file/NFS.md) -- [NTP(Network Time Protocol)介绍](markdown-file/NTP.md) -- [Samba 介绍](markdown-file/Samba.md) -- [Crontab 介绍](markdown-file/Crontab.md) -- [Iptables 介绍](markdown-file/Iptables.md) -- [花生壳-安装介绍](markdown-file/Hsk-Install.md) -- [JDK 安装](markdown-file/JDK-Install.md) -- [Java bin 目录下的工具](markdown-file/Java-bin.md) -- [SVN 安装和配置](markdown-file/SVN-Install-And-Settings.md) -- [Tomcat 安装和配置、优化](markdown-file/Tomcat-Install-And-Settings.md) -- [Jenkins 安装和配置](markdown-file/Jenkins-Install-And-Settings.md) -- [Maven 安装和配置](markdown-file/Maven-Install-And-Settings.md) -- [Nexus 安装和配置](markdown-file/Nexus-Install-And-Settings.md) -- [MySQL 安装和配置](markdown-file/Mysql-Install-And-Settings.md) -- [MySQL 优化](markdown-file/Mysql-Optimize.md) -- [MySQL 测试](markdown-file/Mysql-Test.md) -- [MySQL 教程](markdown-file/Mysql-Tutorial.md) -- [Percona XtraDB Cluster(PXC)安装和配置](markdown-file/PXC-Install-And-Settings.md) -- [Redis 安装和配置](markdown-file/Redis-Install-And-Settings.md) -- [MongoDB 安装和配置](markdown-file/MongoDB-Install-And-Settings.md) -- [Solr 安装和配置](markdown-file/Solr-Install-And-Settings.md) -- [Jira 安装和配置](markdown-file/Jira-Install-And-Settings.md) -- [Jenkins 安装和配置](markdown-file/Jenkins-Install-And-Settings.md) -- [TeamCity 安装和配置](markdown-file/TeamCity-Install-And-Settings.md) -- [Nginx 安装和配置](markdown-file/Nginx-Install-And-Settings.md) -- [FastDFS 安装和配置](markdown-file/FastDFS-Install-And-Settings.md) -- [FastDFS 结合 GraphicsMagick](markdown-file/FastDFS-Nginx-Lua-GraphicsMagick.md) -- [RabbitMQ 安装和配置](markdown-file/RabbitMQ-Install-And-Settings.md) -- [Openfire 安装和配置](markdown-file/Openfire-Install-And-Settings.md) -- [Rap 安装和配置](markdown-file/Rap-Install-And-Settings.md) -- [Nginx + Keepalived 高可用](markdown-file/Nginx-Keepalived-Install-And-Settings.md) -- [黑客入侵检查](markdown-file/Was-Hacked.md) -- [Shadowsocks 安装和配置](markdown-file/http://code.youmeek.com/2016/08/19/2016/08/VPS/) -- [Mycat 安装和配置](markdown-file/Mycat-Install-And-Settings.md) -- [Zookeeper 安装和配置](markdown-file/Zookeeper-Install.md) -- [Daemontools 工具介绍](markdown-file/Daemontools.md) -- [Tmux 安装和配置](markdown-file/Tmux-Install-And-Settings.md) -- [ELK 日志收集系统安装和配置](markdown-file/ELK-Install-And-Settings.md) -- [Dubbo 安装和配置](markdown-file/Dubbo-Install-And-Settings.md) -- [GitLab 安装和配置](markdown-file/Gitlab-Install-And-Settings.md) -- [JMeter 安装和配置](markdown-file/JMeter-Install-And-Settings.md) -- [Docker 安装和使用](markdown-file/Docker-Install-And-Usage.md) -- [Harbor 安装和配置](markdown-file/Harbor-Install-And-Usage.md) -- [LDAP 安装和使用](markdown-file/LDAP-Install-And-Settings.md) -- [Alfresco 安装和使用](markdown-file/Alfresco-Install-And-Usage.md) -- [Apache Thrift 安装和使用](markdown-file/Thrift-Install-And-Usage.md) -- [Node.js 安装和使用](markdown-file/Node-Install-And-Usage.md) -- [CI 整套服务安装和使用](markdown-file/CI-Install-And-Usage.md) -- [YApi 安装和配置](markdown-file/YApi-Install-And-Settings.md) -- [Kafka 安装和配置](markdown-file/Kafka-Install-And-Settings.md) -- [Showdoc 安装和配置](markdown-file/Showdoc-Install-And-Settings.md) -- [WordPress 安装和配置](markdown-file/WordPress-Install-And-Settings.md) -- [GoAccess 安装和配置](markdown-file/GoAccess-Install-And-Settings.md) -- [Portainer 安装和配置](markdown-file/Portainer-Install-And-Settings.md) - - -## 联系(Contact) - -- Email:judas.n@qq.com(常用) or admin@youmeek.com(备用) -- Blog: -- QQ 群交流,入群请看: -- 欢迎捐赠 ^_^: - - -## Github 协同视频教程(Participate) - -- 如果您不会使用 Git 或是 Github 也没关系,请认真学习下面视频教程: -- Judas.n 录制 - - 视频格式:MP4 - - 分辨率:1920 X 1080 - - 片长:16 min - - 文件大小:62 M -- 下载 - - 百度云盘: - - 360 网盘(2fb5): - -## Github 常用按钮说明 - -- Watch:关注该项目,作者有更新的时候,会在你的 Github 主页有通知消息。 -- Star:收藏该项目,在你的头像上有一个“Your stars”链接,可以看到你的收藏列表。 -- Fork:复制一份项目到的Github空间上,你可以自己开发自己的这个地址项目,然后 Pull Request 给项目原主人。 - -## 参与作者汇总(Author) - -|作者(按参与时间排序)|地址| -|:---------|:---------| -|Judas.n|| -|mrdear|| -|fooofei|| - -## AD - -- [推荐:程序员的个性化网址导航:GitNavi.com](http://www.gitnavi.com) diff --git a/SUMMARY.md b/SUMMARY.md index 1abff5bf..d034445b 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -4,6 +4,7 @@ * [Ubuntu 介绍](markdown-file/Ubuntu.md) * [Ubuntu 安装](markdown-file/Ubuntu-Install.md) * [Ubuntu 设置(目录)](markdown-file/ubuntu-settings/ubuntu-settings-toc.md) +* [Kali Linux 介绍和设置(目录)](markdown-file/kali-linux-settings/kali-linux-toc.md) * [CentOS 介绍](markdown-file/CentOS.md) * [CentOS 6 安装](markdown-file/CentOS-Install.md) * [CentOS 7 安装](markdown-file/CentOS-7-Install.md) @@ -20,9 +21,11 @@ * [Linux 下常用压缩文件的解压、压缩](markdown-file/File-Extract-Compress.md) * [Yum 下载安装包及对应依赖包](markdown-file/Off-line-Yum-Install.md) * [Zsh 入门](markdown-file/Zsh.md) +* [终端测速](markdown-file/speedtest.md) * [日常维护](markdown-file/maintenance.md) * [日常监控](markdown-file/monitor.md) * [nmon 系统性能监控工具](markdown-file/Nmon.md) +* [Glances 安装和配置](markdown-file/Glances-Install-And-Settings.md) * [SSH(Secure Shell)介绍](markdown-file/SSH.md) * [FTP(File Transfer Protocol)介绍](markdown-file/FTP.md) * [VPN(Virtual Private Network)介绍](markdown-file/VPN.md) @@ -39,6 +42,7 @@ * [Jenkins 安装和配置](markdown-file/Jenkins-Install-And-Settings.md) * [Maven 安装和配置](markdown-file/Maven-Install-And-Settings.md) * [Nexus 安装和配置](markdown-file/Nexus-Install-And-Settings.md) +* [PostgreSQL 安装和配置](markdown-file/PostgreSQL-Install-And-Settings.md) * [MySQL 安装和配置](markdown-file/Mysql-Install-And-Settings.md) * [MySQL 优化](markdown-file/Mysql-Optimize.md) * [MySQL 测试](markdown-file/Mysql-Test.md) @@ -48,9 +52,11 @@ * [MongoDB 安装和配置](markdown-file/MongoDB-Install-And-Settings.md) * [Solr 安装和配置](markdown-file/Solr-Install-And-Settings.md) * [Jira 安装和配置](markdown-file/Jira-Install-And-Settings.md) +* [Confluence 安装和配置](markdown-file/Confluence-Install-And-Settings.md) * [Jenkins 安装和配置](markdown-file/Jenkins-Install-And-Settings.md) * [TeamCity 安装和配置](markdown-file/TeamCity-Install-And-Settings.md) * [Nginx 安装和配置](markdown-file/Nginx-Install-And-Settings.md) +* [wrk 安装和配置](markdown-file/wrk-Install-And-Settings.md) * [FastDFS 安装和配置](markdown-file/FastDFS-Install-And-Settings.md) * [FastDFS 结合 GraphicsMagick](markdown-file/FastDFS-Nginx-Lua-GraphicsMagick.md) * [RabbitMQ 安装和配置](markdown-file/RabbitMQ-Install-And-Settings.md) @@ -76,7 +82,14 @@ * [CI 整套服务安装和使用](markdown-file/CI-Install-And-Usage.md) * [YApi 安装和配置](markdown-file/YApi-Install-And-Settings.md) * [Kafka 安装和配置](markdown-file/Kafka-Install-And-Settings.md) +* [Hadoop 安装和配置](markdown-file/Hadoop-Install-And-Settings.md) * [Showdoc 安装和配置](markdown-file/Showdoc-Install-And-Settings.md) * [WordPress 安装和配置](markdown-file/WordPress-Install-And-Settings.md) * [GoAccess 安装和配置](markdown-file/GoAccess-Install-And-Settings.md) -* [Portainer 安装和配置](markdown-file/Portainer-Install-And-Settings.md) \ No newline at end of file +* [Portainer 安装和配置](markdown-file/Portainer-Install-And-Settings.md) +* [Influxdb 安装和配置](markdown-file/Influxdb-Install-And-Settings.md) +* [Prometheus 安装和配置](markdown-file/Prometheus-Install-And-Settings.md) +* [Grafana 安装和配置](markdown-file/Grafana-Install-And-Settings.md) +* [Ansible 安装和配置](markdown-file/Ansible-Install-And-Settings.md) +* [Wormhole + Flink 安装和配置](markdown-file/Wormhole-Install-And-Settings.md) +* [SkyWalking 安装和配置](markdown-file/SkyWalking-Install-And-Settings.md) \ No newline at end of file diff --git a/TOC.md b/TOC.md index e97c0361..434c20f7 100644 --- a/TOC.md +++ b/TOC.md @@ -2,6 +2,7 @@ - [Ubuntu 介绍](markdown-file/Ubuntu.md) - [Ubuntu 安装](markdown-file/Ubuntu-Install.md) - [Ubuntu 设置(目录)](markdown-file/ubuntu-settings/ubuntu-settings-toc.md) +- [Kali Linux 介绍和设置(目录)](markdown-file/kali-linux-settings/kali-linux-toc.md) - [CentOS 介绍](markdown-file/CentOS.md) - [CentOS 6 安装](markdown-file/CentOS-Install.md) - [CentOS 7 安装](markdown-file/CentOS-7-Install.md) @@ -18,9 +19,11 @@ - [Linux 下常用压缩文件的解压、压缩](markdown-file/File-Extract-Compress.md) - [Yum 下载安装包及对应依赖包](markdown-file/Off-line-Yum-Install.md) - [Zsh 入门](markdown-file/Zsh.md) +- [终端测速](markdown-file/speedtest.md) - [日常维护](markdown-file/maintenance.md) - [日常监控](markdown-file/monitor.md) - [nmon 系统性能监控工具](markdown-file/Nmon.md) +- [Glances 安装和配置](markdown-file/Glances-Install-And-Settings.md) - [SSH(Secure Shell)介绍](markdown-file/SSH.md) - [FTP(File Transfer Protocol)介绍](markdown-file/FTP.md) - [VPN(Virtual Private Network)介绍](markdown-file/VPN.md) @@ -37,6 +40,7 @@ - [Jenkins 安装和配置](markdown-file/Jenkins-Install-And-Settings.md) - [Maven 安装和配置](markdown-file/Maven-Install-And-Settings.md) - [Nexus 安装和配置](markdown-file/Nexus-Install-And-Settings.md) +- [PostgreSQL 安装和配置](markdown-file/PostgreSQL-Install-And-Settings.md) - [MySQL 安装和配置](markdown-file/Mysql-Install-And-Settings.md) - [MySQL 优化](markdown-file/Mysql-Optimize.md) - [MySQL 测试](markdown-file/Mysql-Test.md) @@ -46,9 +50,11 @@ - [MongoDB 安装和配置](markdown-file/MongoDB-Install-And-Settings.md) - [Solr 安装和配置](markdown-file/Solr-Install-And-Settings.md) - [Jira 安装和配置](markdown-file/Jira-Install-And-Settings.md) +- [Confluence 安装和配置](markdown-file/Confluence-Install-And-Settings.md) - [Jenkins 安装和配置](markdown-file/Jenkins-Install-And-Settings.md) - [TeamCity 安装和配置](markdown-file/TeamCity-Install-And-Settings.md) - [Nginx 安装和配置](markdown-file/Nginx-Install-And-Settings.md) +- [wrk 安装和配置](markdown-file/wrk-Install-And-Settings.md) - [FastDFS 安装和配置](markdown-file/FastDFS-Install-And-Settings.md) - [FastDFS 结合 GraphicsMagick](markdown-file/FastDFS-Nginx-Lua-GraphicsMagick.md) - [RabbitMQ 安装和配置](markdown-file/RabbitMQ-Install-And-Settings.md) @@ -73,7 +79,14 @@ - [Node.js 安装和使用](markdown-file/Node-Install-And-Usage.md) - [YApi 安装和配置](markdown-file/YApi-Install-And-Settings.md) - [Kafka 安装和配置](markdown-file/Kafka-Install-And-Settings.md) +- [Hadoop 安装和配置](markdown-file/Hadoop-Install-And-Settings.md) - [Showdoc 安装和配置](markdown-file/Showdoc-Install-And-Settings.md) - [WordPress 安装和配置](markdown-file/WordPress-Install-And-Settings.md) - [GoAccess 安装和配置](markdown-file/GoAccess-Install-And-Settings.md) -- [Portainer 安装和配置](markdown-file/Portainer-Install-And-Settings.md) \ No newline at end of file +- [Portainer 安装和配置](markdown-file/Portainer-Install-And-Settings.md) +- [Influxdb 安装和配置](markdown-file/Influxdb-Install-And-Settings.md) +- [Prometheus 安装和配置](markdown-file/Prometheus-Install-And-Settings.md) +- [Grafana 安装和配置](markdown-file/Grafana-Install-And-Settings.md) +- [Ansible 安装和配置](markdown-file/Ansible-Install-And-Settings.md) +- [Wormhole + Flink 安装和配置](markdown-file/Wormhole-Install-And-Settings.md) +- [SkyWalking 安装和配置](markdown-file/SkyWalking-Install-And-Settings.md) \ No newline at end of file diff --git a/centos-settings/CentOS-Extra-Packages.md b/centos-settings/CentOS-Extra-Packages.md index def938fe..c00901e3 100644 --- a/centos-settings/CentOS-Extra-Packages.md +++ b/centos-settings/CentOS-Extra-Packages.md @@ -83,6 +83,22 @@ - `sudo yum install -y htop`(htop 官方源是没有的,所以如果能下载下来就表示已经使用了第三方源) +### 禁用源 + +- 编辑:`vim /etc/yum.repos.d/elasticsearch.repo` +- 把 enabled=1 改为 enabled=0 + +``` +[elasticsearch-6.x] +name=Elasticsearch repository for 6.x packages +baseurl=https://artifacts.elastic.co/packages/6.x/yum +gpgcheck=1 +gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch +enabled=1 +autorefresh=1 +type=rpm-md +``` + > 资料: - diff --git a/centos-settings/CentOS-Network-Settings.md b/centos-settings/CentOS-Network-Settings.md index d94b28ef..ba95ede9 100644 --- a/centos-settings/CentOS-Network-Settings.md +++ b/centos-settings/CentOS-Network-Settings.md @@ -44,19 +44,22 @@ ``` - 重启网络配置:`service network restart` -## CentOS 7 +## CentOS 7.x ### 命令行下设置网络 - 查看系统下有哪些网卡:`ls /etc/sysconfig/network-scripts/`,新版本不叫 eth0 这类格式了,比如我当前这个叫做:ifcfg-ens33(你的肯定跟我不一样,但是格式类似) +- 先备份:`cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak` - 编辑该文件:`vim /etc/sysconfig/network-scripts/ifcfg-ens33`,改为如下信息:(IP 段自己改为自己的网络情况) ``` ini TYPE=Ethernet +PROXY_METHOD=none +BROWSER_ONLY=no BOOTPROTO=static -IPADDR=192.168.1.126 +IPADDR=192.168.0.127 NETMASK=255.255.255.0 -GATEWAY=192.168.1.1 +GATEWAY=192.168.0.1 DNS1=8.8.8.8 DNS1=114.114.114.114 DEFROUTE=yes @@ -71,7 +74,7 @@ IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 -UUID=15a16b51-0369-44d7-87b4-667f715a68df +UUID=b9f01b7d-4ebf-4d3a-a4ec-ae203425bb11 DEVICE=ens33 ONBOOT=yes ``` diff --git a/centos-settings/Close-XWindow.md b/centos-settings/Close-XWindow.md index 0a34275f..5b89f556 100644 --- a/centos-settings/Close-XWindow.md +++ b/centos-settings/Close-XWindow.md @@ -15,7 +15,14 @@ - 在图形界面中如果你希望临时关闭图形界面可以输入:`init 3` -## CentOS 7 设置方法 +## CentOS 7 设置方法 1 + +- 开机以命令模式启动,执行: + - systemctl set-default multi-user.target +- 开机以图形界面启动,执行: + - systemctl set-default graphical.target + +## CentOS 7 设置方法 2 - 关闭图形 - `mv /etc/systemd/system/default.target /etc/systemd/system/default.target.bak` (改名备份) diff --git a/favorite-file/Nginx-Settings/nginx-front.conf b/favorite-file/Nginx-Settings/nginx-front.conf new file mode 100644 index 00000000..8b49d8f9 --- /dev/null +++ b/favorite-file/Nginx-Settings/nginx-front.conf @@ -0,0 +1,116 @@ +user root; +worker_processes auto; +pid /run/nginx.pid; + +events { + use epoll; + multi_accept on; + worker_connections 1024; +} + +http { + # 必须加这两个,不然 CSS 无法正常加载 + include mime.types; + default_type application/octet-stream; + + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" "$request_time"'; + + access_log /var/log/nginx/access.log main; + error_log /var/log/nginx/error.log; + + gzip on; + gzip_buffers 8 16k; + gzip_min_length 512; + gzip_disable "MSIE [1-6]\.(?!.*SV1)"; + gzip_http_version 1.1; + gzip_types text/plain text/css application/javascript application/x-javascript application/json application/xml; + + server { + + listen 8001; + server_name localhost 127.0.0.1 139.159.190.24 platform.gitnavi.com; + + location / { + root /root/.jenkins/workspace/nestle-platform-front-test/dist; + index index.html index.htm; + try_files $uri /index.html; + } + + ## 二级目录方式,记得 package.json 添加:"homepage": "cdk8s-markdown", + location ^~ /cdk8s-markdown { + root /root/.jenkins/workspace; + index index.html; + try_files $uri /cdk8s-markdown/index.html; + } + + location ^~ /platform/ { + proxy_pass http://127.0.0.1:28081; + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location ~ .*\.(js|css)?$ { + root /root/.jenkins/workspace/nestle-platform-front-test/dist; + } + + location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico|woff|woff2|ttf|eot|txt|svg)$ { + root /root/.jenkins/workspace/nestle-platform-front-test/dist; + } + + error_page 404 /404.html; + location = /usr/share/nginx/html/40x.html { + } + + error_page 500 502 503 504 /50x.html; + location = /usr/share/nginx/html/50x.html { + } + + } + + server { + + listen 8002; + server_name localhost 127.0.0.1 139.159.190.24 store.gitnavi.com; + + location / { + root /root/.jenkins/workspace/nestle-store-front-test/dist; + index index.html index.htm; + try_files $uri /index.html; + } + + location ^~ /store/ { + proxy_pass http://127.0.0.1:28082; + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location ~ .*\.(js|css)?$ { + root /root/.jenkins/workspace/nestle-store-front-test/dist; + } + + location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico|woff|woff2|ttf|eot|txt|svg)$ { + root /root/.jenkins/workspace/nestle-store-front-test/dist; + } + + error_page 404 /404.html; + location = /usr/share/nginx/html/40x.html { + } + + error_page 500 502 503 504 /50x.html; + location = /usr/share/nginx/html/50x.html { + } + + } +} diff --git a/favorite-file/Nginx-Settings/nginx.conf b/favorite-file/Nginx-Settings/nginx.conf deleted file mode 100644 index 490367d2..00000000 --- a/favorite-file/Nginx-Settings/nginx.conf +++ /dev/null @@ -1,134 +0,0 @@ -user root; - -worker_processes 2;#Nginx进程数, 建议设置为等于CPU总核心数 - -events { - use epoll; #nginx工作模式,epoll是linux平台下的高效模式,配合nginx的异步非阻塞作用 - worker_connections 1024;#单个进程最大连接数 -} - -http { - include mime.types;#扩展名与文件类型映射表:#nginx通过服务端文件的后缀名来判断这个文件属于什么类型,再将该数据类型写入http头部的Content-Type字段中,发送给客户端。mime.types这个文件里面全是文件类型的定义。 - default_type application/octet-stream;#当用户请求的文件后缀在mime.types这个文件没有定义,便使用默认的type为二进制流 - sendfile on;#开启高效文件传输模式 - tcp_nopush on;#启用之后,数据包会累积到一定大小才会发送,减小了额外开销,防止网络阻塞,提高网络效率 - tcp_nodelay on;#启用之后,尽快发送数据。可以看到tcp_nopush是要等数据包累积到一定大小才发送,tcp_nodelay是要尽快发送,二者相互矛盾。实际上,它们可以一起用,最终的效果是先填满包,再尽快发送。 - keepalive_timeout 65; - charset utf8; - - #全局日志(也可以把这个配置到 server 中进行不同 server 的不同配置) - access_log /var/log/nginx/access.log; - error_log /var/log/nginx/error.log; - - # gzip 压缩设置 - gzip on; - gzip_min_length 1k; - gzip_buffers 4 16k; - gzip_http_version 1.0; - gzip_comp_level 2;#gzip的压缩程度,级别为1到9.级别越高,压缩程序越高,时间越多 - gzip_types text/plain application/x-javascript text/css text/xml application/xml text/javascript application/javascript application/json; - gzip_vary on;#告诉接受方数据经过gzip压缩 - gzip_disable "MSIE[1-6]\."; #因为IE6对gzip不支持,所以在IE6及更旧的版本不使用gzip压缩 - - server { - - listen 80; #监听80端口 - server_name localhost 127.0.0.1 120.77.84.121 gitnavi.com; - - location / { - root /usr/program/tomcat8/webapps/ROOT;#静态文件直接读取硬盘,所有这里直接写tomcat的程序里面的静态资源目录 - index index.html index.jsp; - } - - location = / { - root /usr/program/tomcat8/webapps/ROOT;#静态文件直接读取硬盘,所有这里直接写tomcat的程序里面的静态资源目录 - index index.html; - } - - # 匹配用户导航静态 html 目录路径 - location ^~ /u/ { - root /usr/program/tomcat8/webapps/ROOT;#静态文件直接读取硬盘,所有这里直接写tomcat的程序里面的静态资源目录 - } - - # Controller 中前台的请求标识 - location ^~ /front/ { - proxy_pass http://127.0.0.1:8080; #转发请求交给tomcat处理 - proxy_redirect off; - proxy_set_header Host $host; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - client_max_body_size 10m; #允许客户端请求的最大单文件字节数 - client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 - proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间 - proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时) - proxy_read_timeout 300; #连接成功后,后端服务器响应时间 - proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 - proxy_buffers 6 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 - proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) - proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 - } - - # Controller 中后台的请求标识 - location ^~ /admin/ { - proxy_pass http://127.0.0.1:8080; #转发请求交给tomcat处理 - proxy_redirect off; - proxy_set_header Host $host; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - client_max_body_size 10m; #允许客户端请求的最大单文件字节数 - client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 - proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间 - proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时) - proxy_read_timeout 300; #连接成功后,后端服务器响应时间 - proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 - proxy_buffers 6 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 - proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) - proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 - } - - #静态资源转发 - #由nginx处理静态页面 - location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico|woff|woff2|ttf|eot)$ { - root /usr/program/tomcat8/webapps/ROOT;#这里直接写tomcat的程序里面的静态资源目录 - expires 30d;#使用expires缓存模块,缓存到客户端30天(这个模块看下有没有安装) - } - #因为我的 html 页面经常变动,所以 html 我这里就不缓存了 - location ~ .*\.(js|css)?$ { - root /usr/program/tomcat8/webapps/ROOT;#静态文件直接读取硬盘,所有这里直接写tomcat的程序里面的静态资源目录 - expires 1d;#也可以指定小时,比如:12h - } - # 读取一些静态页面,比如隐私政策等 - location ~ .*\.(html|htm)?$ { - root /usr/program/tomcat8/webapps/ROOT;#静态文件直接读取硬盘,所有这里直接写tomcat的程序里面的静态资源目录 - expires 1d;#也可以指定小时,比如:12h - } - - #其他请求都视为动态请求处理 - #location ~ .*$ { - # proxy_pass http://127.0.0.1:8080; #转发请求交给tomcat处理 - # proxy_redirect off; - # proxy_set_header Host $host; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP - # proxy_set_header X-Real-IP $remote_addr; - # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # client_max_body_size 10m; #允许客户端请求的最大单文件字节数 - # client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 - # proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间 - # proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时) - # proxy_read_timeout 300; #连接成功后,后端服务器响应时间 - # proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 - # proxy_buffers 6 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 - # proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) - # proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 - #} - - #常见错误页面设置 - error_page 404 /404.html; - location = /404.html { - root /usr/program/tomcat8/webapps/ROOT; - } - error_page 500 502 503 504 /500.html; - location = /500.html { - root /usr/program/tomcat8/webapps/ROOT; - } - } -} diff --git a/favorite-file/gravitee-docker-compose/README.md b/favorite-file/gravitee-docker-compose/README.md new file mode 100644 index 00000000..e4983ec9 --- /dev/null +++ b/favorite-file/gravitee-docker-compose/README.md @@ -0,0 +1,32 @@ +# graviteeio api gateway docker-compose running + +fork from graviteeio project && change some deps image + +- +- + +## how to run + +```code +cd platform && docker-compose up -d +``` + +## manager ui + +* api portal + +```code +open https://localhost/apim/portal +``` + +* access manager ui + +```code +open https://localhost/am/ui/ +``` + +## Note: + +- environments directory has some demos with ci && traefik gateway +- portal account admin amdin +- access manager ui account admin adminadmin \ No newline at end of file diff --git a/favorite-file/gravitee-docker-compose/environments/ci/docker-compose.yml b/favorite-file/gravitee-docker-compose/environments/ci/docker-compose.yml new file mode 100644 index 00000000..37c9c07c --- /dev/null +++ b/favorite-file/gravitee-docker-compose/environments/ci/docker-compose.yml @@ -0,0 +1,62 @@ +#------------------------------------------------------------------------------- +# Copyright (C) 2015 The Gravitee team (http://gravitee.io) +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#------------------------------------------------------------------------------- +version: '2' + +services: + ci: + image: graviteeio/jenkins:latest + container_name: ci + network_mode: "bridge" + expose: + - 50022 + ports: + - "50022:50022" + labels: + - "traefik.frontend.rule=Host:ci.gravitee.io" + - "traefik.port=8080" + volumes: + - /var/jenkins_home:/var/jenkins_home + - /var/run/docker.sock:/var/run/docker.sock + links: + - redis-test + - qa + + redis-test: + image: redis:3 + container_name: redis-test + network_mode: "bridge" + + qa: + image: sonarqube:alpine + container_name: qa + network_mode: "bridge" + environment: + - SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqube-db:5432/sonar + labels: + - "traefik.frontend.rule=Host:qa.gravitee.io" + volumes: + - /opt/sonarqube/conf:/opt/sonarqube/conf + - /opt/sonarqube/data:/opt/sonarqube/data + - /opt/sonarqube/extensions:/opt/sonarqube/extensions + - /opt/sonarqube/bundled-plugins:/opt/sonarqube/lib/bundled-plugins + links: + - sonarqube-db + + sonarqube-db: + image: postgres:alpine + network_mode: "bridge" + environment: + - POSTGRES_USER=sonar + - POSTGRES_PASSWORD=sonar + volumes: + - /opt/sonarqube/postgresql/data:/var/lib/postgresql/data diff --git a/favorite-file/gravitee-docker-compose/environments/demo/common.yml b/favorite-file/gravitee-docker-compose/environments/demo/common.yml new file mode 100644 index 00000000..a1d7c696 --- /dev/null +++ b/favorite-file/gravitee-docker-compose/environments/demo/common.yml @@ -0,0 +1,62 @@ +#------------------------------------------------------------------------------- +# Copyright (C) 2015 The Gravitee team (http://gravitee.io) +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#------------------------------------------------------------------------------- +version: '2' + +volumes: + datamongo: {} + dataelasticsearch: {} + +services: + elasticsearch: + hostname: demo-elasticsearch + image: docker.elastic.co/elasticsearch/elasticsearch:5.4.3 + volumes: + - dataelasticsearch:/usr/share/elasticsearch/data + environment: + - http.host=0.0.0.0 + - transport.host=0.0.0.0 + - xpack.security.enabled=false + - xpack.monitoring.enabled=false + - cluster.name=elasticsearch + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: 65536 + + mongodb: + hostname: demo-mongodb + image: mongo:3.4 + volumes: + - datamongo:/data/db + + gateway: + hostname: demo-gateway + image: graviteeio/gateway:latest + environment: + - gravitee_management_mongodb_uri=mongodb://mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_ratelimit_mongodb_uri=mongodb://mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_reporters_elasticsearch_endpoints_0=http://elasticsearch:9200 + + managementui: + hostname: demo-managementui + image: graviteeio/management-ui:latest + + managementapi: + hostname: demo-managementapi + image: graviteeio/management-api:latest + environment: + - gravitee_management_mongodb_uri=mongodb://mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_analytics_elasticsearch_endpoints_0=http://elasticsearch:9200 diff --git a/favorite-file/gravitee-docker-compose/environments/demo/docker-compose-local.yml b/favorite-file/gravitee-docker-compose/environments/demo/docker-compose-local.yml new file mode 100644 index 00000000..38c34e4c --- /dev/null +++ b/favorite-file/gravitee-docker-compose/environments/demo/docker-compose-local.yml @@ -0,0 +1,76 @@ +#------------------------------------------------------------------------------- +# Copyright (C) 2015 The Gravitee team (http://gravitee.io) +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#------------------------------------------------------------------------------- +version: '2' + +volumes: + local_datamongo: {} + local_dataelasticsearch: {} + +services: + local_elasticsearch: + extends: + file: common.yml + service: elasticsearch + volumes: + - local_dataelasticsearch:/usr/share/elasticsearch/data + - ./logs/elasticsearch:/var/log/elasticsearch + + local_mongodb: + extends: + file: common.yml + service: mongodb + volumes: + - local_datamongo:/data/db + - ./logs/mongodb:/var/log/mongodb + + local_gateway: + extends: + file: common.yml + service: gateway + links: + - "local_mongodb:demo-mongodb" + - "local_elasticsearch:demo-elasticsearch" + ports: + - "8000:8082" + volumes: + - ./logs/gateway:/etc/gravitee.io/log + environment: + - gravitee_management_mongodb_uri=mongodb://demo-mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_ratelimit_mongodb_uri=mongodb://demo-mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_reporters_elasticsearch_endpoints_0=http://demo-elasticsearch:9200 + + local_managementui: + extends: + file: common.yml + service: managementui + ports: + - "8002:80" + volumes: + - ./logs/management-ui:/var/log/httpd + environment: + - MGMT_API_URL=http:\/\/localhost:8005\/management\/ + + local_managementapi: + extends: + file: common.yml + service: managementapi + ports: + - "8005:8083" + volumes: + - ./logs/management-api:/home/gravitee/logs + links: + - "local_mongodb:demo-mongodb" + - "local_elasticsearch:demo-elasticsearch" + environment: + - gravitee_management_mongodb_uri=mongodb://demo-mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_analytics_elasticsearch_endpoints_0=http://demo-elasticsearch:9200 diff --git a/favorite-file/gravitee-docker-compose/environments/demo/docker-compose-traefik-latest.yml b/favorite-file/gravitee-docker-compose/environments/demo/docker-compose-traefik-latest.yml new file mode 100644 index 00000000..e3ea6bce --- /dev/null +++ b/favorite-file/gravitee-docker-compose/environments/demo/docker-compose-traefik-latest.yml @@ -0,0 +1,76 @@ +#------------------------------------------------------------------------------- +# Copyright (C) 2015 The Gravitee team (http://gravitee.io) +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#------------------------------------------------------------------------------- +version: '2' + +volumes: + latest_datamongo: {} + latest_dataelasticsearch: {} + +services: + latest_elasticsearch: + network_mode: "bridge" + extends: + file: common.yml + service: elasticsearch + volumes: + - latest_dataelasticsearch:/usr/share/elasticsearch/data + + latest_mongodb: + network_mode: "bridge" + extends: + file: common.yml + service: mongodb + volumes: + - latest_datamongo:/data/db + + latest_gateway: + network_mode: "bridge" + extends: + file: common.yml + service: gateway + links: + - latest_mongodb + - latest_elasticsearch + labels: + - "traefik.backend=graviteeio-gateway" + - "traefik.frontend.rule=Host:demo.gravitee.io;PathPrefixStrip:/gateway" + environment: + - gravitee_management_mongodb_uri=mongodb://demo-mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_ratelimit_mongodb_uri=mongodb://demo-mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_reporters_elasticsearch_endpoints_0=http://demo-elasticsearch:9200 + + latest_managementui: + network_mode: "bridge" + extends: + file: common.yml + service: managementui + labels: + - "traefik.backend=graviteeio-managementui" + - "traefik.frontend.rule=Host:demo.gravitee.io" + environment: + - MGMT_API_URL=https:\/\/demo.gravitee.io\/management\/ + + latest_managementapi: + network_mode: "bridge" + extends: + file: common.yml + service: managementapi + labels: + - "traefik.backend=graviteeio-managementapi" + - "traefik.frontend.rule=Host:demo.gravitee.io;PathPrefix:/management" + links: + - latest_mongodb + - latest_elasticsearch + environment: + - gravitee_management_mongodb_uri=mongodb://demo-mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_analytics_elasticsearch_endpoints_0=http://demo-elasticsearch:9200 \ No newline at end of file diff --git a/favorite-file/gravitee-docker-compose/environments/demo/docker-compose-traefik-nightly.yml b/favorite-file/gravitee-docker-compose/environments/demo/docker-compose-traefik-nightly.yml new file mode 100644 index 00000000..2369851c --- /dev/null +++ b/favorite-file/gravitee-docker-compose/environments/demo/docker-compose-traefik-nightly.yml @@ -0,0 +1,79 @@ +#------------------------------------------------------------------------------- +# Copyright (C) 2015 The Gravitee team (http://gravitee.io) +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#------------------------------------------------------------------------------- +version: '2' + +volumes: + nightly_datamongo: {} + nightly_dataelasticsearch: {} + +services: + nightly_elasticsearch: + network_mode: "bridge" + extends: + file: common.yml + service: elasticsearch + volumes: + - nightly_dataelasticsearch:/usr/share/elasticsearch/data + + nightly_mongodb: + network_mode: "bridge" + extends: + file: common.yml + service: mongodb + volumes: + - nightly_datamongo:/data/db + + nightly_gateway: + image: graviteeio/gateway:nightly + network_mode: "bridge" + extends: + file: common.yml + service: gateway + links: + - nightly_mongodb + - nightly_elasticsearch + labels: + - "traefik.backend=nightly-graviteeio-gateway" + - "traefik.frontend.rule=Host:nightly.gravitee.io;PathPrefixStrip:/gateway" + environment: + - gravitee_management_mongodb_uri=mongodb://demo-mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_ratelimit_mongodb_uri=mongodb://demo-mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_reporters_elasticsearch_endpoints_0=http://demo-elasticsearch:9200 + + nightly_managementui: + image: graviteeio/management-ui:nightly + network_mode: "bridge" + extends: + file: common.yml + service: managementui + labels: + - "traefik.backend=nightly-graviteeio-managementui" + - "traefik.frontend.rule=Host:nightly.gravitee.io" + environment: + - MGMT_API_URL=https:\/\/nightly.gravitee.io\/management\/ + + nightly_managementapi: + image: graviteeio/management-api:nightly + network_mode: "bridge" + extends: + file: common.yml + service: managementapi + labels: + - "traefik.backend=nightly-graviteeio-managementapi" + - "traefik.frontend.rule=Host:nightly.gravitee.io;PathPrefix:/management" + links: + - nightly_mongodb + - nightly_elasticsearch + environment: + - gravitee_management_mongodb_uri=mongodb://demo-mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_analytics_elasticsearch_endpoints_0=http://demo-elasticsearch:9200 \ No newline at end of file diff --git a/favorite-file/gravitee-docker-compose/environments/demo/launch.sh b/favorite-file/gravitee-docker-compose/environments/demo/launch.sh new file mode 100755 index 00000000..ff51ff04 --- /dev/null +++ b/favorite-file/gravitee-docker-compose/environments/demo/launch.sh @@ -0,0 +1,91 @@ +#!/bin/bash +#------------------------------------------------------------------------------- +# Copyright (C) 2015 The Gravitee team (http://gravitee.io) +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#------------------------------------------------------------------------------- + +readonly WORKDIR="$HOME/graviteeio-demo" +readonly DIRNAME=`dirname $0` +readonly PROGNAME=`basename $0` +readonly color_title='\033[32m' +readonly color_text='\033[1;36m' + +# OS specific support (must be 'true' or 'false'). +declare cygwin=false +declare darwin=false +declare linux=false +declare dc_exec="docker-compose -f docker-compose-local.yml up" + +welcome() { + echo + echo -e " ${color_title} _____ _____ __ _______ _______ ______ ______ _____ ____ \033[0m" + echo -e " ${color_title} / ____| __ \ /\ \ / /_ _|__ __| ____| ____| |_ _/ __ \ \033[0m" + echo -e " ${color_title}| | __| |__) | / \ \ / / | | | | | |__ | |__ | || | | | \033[0m" + echo -e " ${color_title}| | |_ | _ / / /\ \ \/ / | | | | | __| | __| | || | | | \033[0m" + echo -e " ${color_title}| |__| | | \ \ / ____ \ / _| |_ | | | |____| |____ _ _| || |__| | \033[0m" + echo -e " ${color_title} \_____|_| \_\/_/ \_\/ |_____| |_| |______|______(_)_____\____/ \033[0m" + echo -e " ${color_title} | | \033[0m${color_text}http://gravitee.io\033[0m" + echo -e " ${color_title} __| | ___ _ __ ___ ___ \033[0m" + echo -e " ${color_title} / _\` |/ _ \ '_ \` _ \ / _ \ \033[0m" + echo -e " ${color_title}| (_| | __/ | | | | | (_) | \033[0m" + echo -e " ${color_title} \__,_|\___|_| |_| |_|\___/ \033[0m" + echo +} + +init_env() { + local dockergrp + # define env + case "`uname`" in + CYGWIN*) + cygwin=true + ;; + + Darwin*) + darwin=true + ;; + + Linux) + linux=true + ;; + esac + + # test if docker must be run with sudo + dockergrp=$(groups | grep -c docker) + if [[ $darwin == false && $dockergrp == 0 ]]; then + dc_exec="sudo $dc_exec"; + fi +} + +init_dirs() { + echo "Init log directory in $WORKDIR ..." + mkdir -p "$WORKDIR/logs/" + echo +} + +main() { + welcome + init_env + if [[ $? != 0 ]]; then + exit 1 + fi + set -e + init_dirs + pushd $WORKDIR > /dev/null + echo "Download docker compose files ..." + curl -L https://raw.githubusercontent.com/gravitee-io/gravitee-docker/master/environments/demo/common.yml -o "common.yml" + curl -L https://raw.githubusercontent.com/gravitee-io/gravitee-docker/master/environments/demo/docker-compose-local.yml -o "docker-compose-local.yml" + echo + echo "Launch GraviteeIO demo ..." + $dc_exec + popd > /dev/null +} + +main diff --git a/favorite-file/gravitee-docker-compose/environments/sample-apis/docker-compose-sample-apis.yml b/favorite-file/gravitee-docker-compose/environments/sample-apis/docker-compose-sample-apis.yml new file mode 100644 index 00000000..10c1a074 --- /dev/null +++ b/favorite-file/gravitee-docker-compose/environments/sample-apis/docker-compose-sample-apis.yml @@ -0,0 +1,47 @@ +#------------------------------------------------------------------------------- +# Copyright (C) 2015 The Gravitee team (http://gravitee.io) +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#------------------------------------------------------------------------------- +version: '2' + +services: + + sample-api-index: + image: graviteeio/gravitee-sample-index:latest + network_mode: "bridge" + labels: + - "traefik.backend=gravitee-sample-index" + - "traefik.frontend.rule=Host:api.gravitee.io" + - "traefik.frontend.entryPoints=https" + + sample-api-echo: + image: graviteeio/gravitee-echo-api:nightly + network_mode: "bridge" + labels: + - "traefik.backend=gravitee-echo-api" + - "traefik.frontend.rule=Host:api.gravitee.io;PathPrefix:/echo" + - "traefik.frontend.entryPoints=https" + + sample-api-whoami: + image: graviteeio/gravitee-whoami-api:latest + network_mode: "bridge" + labels: + - "traefik.backend=gravitee-whoami-api" + - "traefik.frontend.rule=Host:api.gravitee.io;PathPrefix:/whoami" + - "traefik.frontend.entryPoints=https" + + sample-api-whattimeisit: + image: graviteeio/gravitee-whattimeisit-api:latest + network_mode: "bridge" + labels: + - "traefik.backend=gravitee-whattimeisit-api" + - "traefik.frontend.rule=Host:api.gravitee.io;PathPrefix:/whattimeisit" + - "traefik.frontend.entryPoints=https" diff --git a/favorite-file/gravitee-docker-compose/platform/docker-compose.yml b/favorite-file/gravitee-docker-compose/platform/docker-compose.yml new file mode 100644 index 00000000..3771102c --- /dev/null +++ b/favorite-file/gravitee-docker-compose/platform/docker-compose.yml @@ -0,0 +1,135 @@ +version: '3' + +networks: + default: + +services: + nginx: + image: nginx:1.15-alpine + container_name: gio_platform_nginx + volumes: + - ./nginx/nginx.conf:/etc/nginx/nginx.conf + - ./nginx/ssl/gio-selfsigned.crt:/etc/ssl/certs/gio-selfsigned.crt + - ./nginx/ssl/gio-selfsigned.key:/etc/ssl/private/gio-selfsigned.key + - ./nginx/ssl/gio.pem:/etc/ssl/certs/gio.pem + ports: + - "80:80" + - "443:443" + depends_on: + - apim_gateway + - apim_portal + - apim_management + - am_gateway + - am_management + - am_webui + + mongodb: + image: mongo:3.4 + container_name: gio_platform_mongo + ports: + - 27017:27017 + environment: + - MONGO_INITDB_DATABASE=gravitee + volumes: + - ./mongo/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d + - ./data/mongo:/data/db + - ./logs/mongodb:/var/log/mongodb + + elasticsearch: + image: elasticsearch:6.4.0 + container_name: gio_platform_elasticsearch + ports: + - 9200:9200 + environment: + - http.host=0.0.0.0 + - transport.host=0.0.0.0 + - xpack.security.enabled=false + - xpack.monitoring.enabled=false + - cluster.name=elasticsearch + ulimits: + nofile: 65536 + volumes: + - ./data/elasticsearch:/usr/share/elasticsearch/data + - ./logs/elasticsearch:/var/log/elasticsearch + + apim_gateway: + image: graviteeio/gateway:latest + container_name: gio_platform_apim_gateway + volumes: + - ./logs/apim-gateway:/opt/graviteeio-gateway/logs + environment: + - gravitee_management_mongodb_uri=mongodb://mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_ratelimit_mongodb_uri=mongodb://mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_reporters_elasticsearch_endpoints_0=http://elasticsearch:9200 + - gravitee_services_metrics_enabled=true + - gravitee_services_metrics_prometheus.enabled=true + depends_on: + - mongodb + - elasticsearch + + apim_portal: + image: graviteeio/management-ui:latest + container_name: gio_platform_apim_portal + environment: + - MGMT_API_URL=https:\/\/localhost\/apim\/management\/ + depends_on: + - apim_management + + apim_management: + image: graviteeio/management-api:latest + container_name: gio_platform_apim_mgmt_api + volumes: + - ./logs/apim-management-api:/opt/graviteeio-management-api/logs + environment: + - gravitee_management_mongodb_uri=mongodb://mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_ratelimit_mongodb_uri=mongodb://mongodb:27017/gravitee?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_analytics_elasticsearch_endpoints_0=http://elasticsearch:9200 + - gravitee_jwt_cookiepath=/apim/management + - gravitee_jwt_cookiesecure=true + depends_on: + - mongodb + - elasticsearch + + am_gateway: + image: graviteeio/am-gateway:2 + container_name: gio_platform_am_gateway + volumes: + - ./logs/am-gateway:/opt/graviteeio-am-gateway/logs + environment: + - gravitee_management_mongodb_uri=mongodb://mongodb:27017/gravitee-am?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_oauth2_mongodb_uri=mongodb://mongodb:27017/gravitee-am?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + depends_on: + - mongodb + + am_management: + image: graviteeio/am-management-api:2 + container_name: gio_platform_am_management + volumes: + - ./logs/am-management-api:/opt/graviteeio-am-management-api/logs + environment: + - gravitee_management_mongodb_uri=mongodb://mongodb:27017/gravitee-am?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_oauth2_mongodb_uri=mongodb://mongodb:27017/gravitee-am?serverSelectionTimeoutMS=5000&connectTimeoutMS=5000&socketTimeoutMS=5000 + - gravitee_jwt_cookiepath=/am/management + - gravitee_jwt_cookiesecure=true + depends_on: + - mongodb + grafana: + image: grafana/grafana + ports: + - "3000:3000" + prometheus: + image: prom/prometheus + volumes: + - "./prometheus.yml:/etc/prometheus/prometheus.yml" + ports: + - "9090:9090" + am_webui: + image: graviteeio/am-management-ui:2 + container_name: gio_platform_am_webui + environment: + - MGMT_API_URL=https:\/\/localhost\/am\/ + - MGMT_UI_URL=https:\/\/localhost\/am\/ui\/ + volumes: + - ./logs/am-webui:/var/log/nginx + depends_on: + - am_management diff --git a/favorite-file/gravitee-docker-compose/platform/mongo/docker-entrypoint-initdb.d/create-index.js b/favorite-file/gravitee-docker-compose/platform/mongo/docker-entrypoint-initdb.d/create-index.js new file mode 100644 index 00000000..b6f2d379 --- /dev/null +++ b/favorite-file/gravitee-docker-compose/platform/mongo/docker-entrypoint-initdb.d/create-index.js @@ -0,0 +1,92 @@ + +// "apis" collection +db.apis.dropIndexes(); +db.apis.createIndex( { "visibility" : 1 } ); +db.apis.createIndex( { "group" : 1 } ); +db.apis.reIndex(); + +// "applications" collection +db.applications.dropIndexes(); +db.applications.createIndex( { "group" : 1 } ); +db.applications.createIndex( { "name" : 1 } ); +db.applications.createIndex( { "status" : 1 } ); +db.applications.reIndex(); + +// "events" collection +db.events.dropIndexes(); +db.events.createIndex( { "type" : 1 } ); +db.events.createIndex( { "updatedAt" : 1 } ); +db.events.createIndex( { "properties.api_id" : 1 } ); +db.events.createIndex( { "properties.api_id":1, "type":1} ); +db.events.reIndex(); + +// "plans" collection +db.plans.dropIndexes(); +db.plans.createIndex( { "apis" : 1 } ); +db.plans.reIndex(); + +// "subscriptions" collection +db.subscriptions.dropIndexes(); +db.subscriptions.createIndex( { "plan" : 1 } ); +db.subscriptions.createIndex( { "application" : 1 } ); +db.subscriptions.reIndex(); + +// "keys" collection +db.keys.dropIndexes(); +db.keys.createIndex( { "plan" : 1 } ); +db.keys.createIndex( { "application" : 1 } ); +db.keys.createIndex( { "updatedAt" : 1 } ); +db.keys.createIndex( { "revoked" : 1 } ); +db.keys.createIndex( { "plan" : 1 , "revoked" : 1, "updatedAt" : 1 } ); +db.keys.reIndex(); + +// "pages" collection +db.pages.dropIndexes(); +db.pages.createIndex( { "api" : 1 } ); +db.pages.reIndex(); + +// "memberships" collection +db.memberships.dropIndexes(); +db.memberships.createIndex( {"_id.userId":1, "_id.referenceId":1, "_id.referenceType":1}, { unique: true } ); +db.memberships.createIndex( {"_id.referenceId":1, "_id.referenceType":1} ); +db.memberships.createIndex( {"_id.referenceId":1, "_id.referenceType":1, "roles":1} ); +db.memberships.createIndex( {"_id.userId":1, "_id.referenceType":1} ); +db.memberships.createIndex( {"_id.userId":1, "_id.referenceType":1, "roles":1} ); +db.memberships.reIndex(); + +// "roles" collection +db.roles.dropIndexes(); +db.roles.createIndex( {"_id.scope": 1 } ); +db.roles.reIndex(); + +// "audits" collection +db.audits.dropIndexes(); +db.audits.createIndex( { "referenceType": 1, "referenceId": 1 } ); +db.audits.createIndex( { "createdAt": 1 } ); +db.audits.reIndex(); + +// "rating" collection +db.rating.dropIndexes(); +db.rating.createIndex( { "api" : 1 } ); +db.rating.reIndex(); + +// "ratingAnswers" collection +db.ratingAnswers.dropIndexes(); +db.ratingAnswers.createIndex( { "rating" : 1 } ); + +// "portalnotifications" collection +db.portalnotifications.dropIndexes(); +db.portalnotifications.createIndex( { "user" : 1 } ); +db.portalnotifications.reIndex(); + +// "portalnotificationconfigs" collection +db.portalnotificationconfigs.dropIndexes(); +db.portalnotificationconfigs.createIndex( {"_id.user":1, "_id.referenceId":1, "_id.referenceType":1}, { unique: true } ); +db.portalnotificationconfigs.createIndex( {"_id.referenceId":1, "_id.referenceType":1, "hooks":1}); +db.portalnotificationconfigs.reIndex(); + +// "genericnotificationconfigs" collection +db.genericnotificationconfigs.dropIndexes(); +db.genericnotificationconfigs.createIndex( {"referenceId":1, "referenceType":1, "hooks":1}); +db.genericnotificationconfigs.createIndex( {"referenceId":1, "referenceType":1}); +db.genericnotificationconfigs.reIndex(); diff --git a/favorite-file/gravitee-docker-compose/platform/nginx/nginx.conf b/favorite-file/gravitee-docker-compose/platform/nginx/nginx.conf new file mode 100644 index 00000000..d08fc26c --- /dev/null +++ b/favorite-file/gravitee-docker-compose/platform/nginx/nginx.conf @@ -0,0 +1,133 @@ +worker_processes 4; + +events { worker_connections 1024; } + +http { + include /etc/nginx/mime.types; + resolver 127.0.0.11 ipv6=off; + + upstream apim_management { + server apim_management:8083; + } + + upstream apim_gateway { + server apim_gateway:8082; + } + + upstream apim_portal { + server apim_portal:80; + } + + upstream am_management { + server am_management:8093; + } + + upstream am_gateway { + server am_gateway:8092; + } + + upstream am_webui { + server am_webui:80; + } + + server { + listen 80; + server_name localhost; + return 301 https://$server_name$request_uri; #Redirection + } + + server { + listen 443 ssl; + listen [::]:443 ssl; + + server_name localhost; + + ssl_certificate /etc/ssl/certs/gio-selfsigned.crt; + ssl_certificate_key /etc/ssl/private/gio-selfsigned.key; + ssl_dhparam /etc/ssl/certs/gio.pem; + + error_page 500 502 503 504 /50x.html; + + location /apim/portal/ { + proxy_pass http://apim_portal/; + proxy_redirect $scheme://$host:$server_port/ $scheme://$http_host/apim/portal/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $server_name; + } + + location /apim/management/ { + proxy_pass http://apim_management/management/; + proxy_redirect $scheme://$host:$server_port/management/ /apim/management/; + sub_filter "/management/" "/apim/management/"; + sub_filter_types application/json; + sub_filter_once off; + proxy_cookie_path /management /apim/management; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $server_name; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /apim/ { + proxy_pass http://apim_gateway/; + proxy_cookie_path / /apim; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $server_name; + } + + location /am/ui/ { + proxy_pass http://am_webui/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $server_name; + sub_filter ' ~/.vimrc + diff --git a/favorite-file/shell/install_aliyun_docker_disable_firewalld_centos7.sh b/favorite-file/shell/install_docker_disable_firewalld_centos7-aliyun.sh similarity index 92% rename from favorite-file/shell/install_aliyun_docker_disable_firewalld_centos7.sh rename to favorite-file/shell/install_docker_disable_firewalld_centos7-aliyun.sh index 35080fed..587ca77b 100644 --- a/favorite-file/shell/install_aliyun_docker_disable_firewalld_centos7.sh +++ b/favorite-file/shell/install_docker_disable_firewalld_centos7-aliyun.sh @@ -45,7 +45,7 @@ docker run hello-world echo "-----------------------------------------安装 docker compose" echo "docker compose 的版本检查:https://docs.docker.com/compose/install/#install-compose" -curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose +curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose diff --git a/favorite-file/shell/install_docker_k8s_disable_firewalld_centos7-aliyun.sh b/favorite-file/shell/install_docker_k8s_disable_firewalld_centos7-aliyun.sh new file mode 100644 index 00000000..66adafa2 --- /dev/null +++ b/favorite-file/shell/install_docker_k8s_disable_firewalld_centos7-aliyun.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +echo "-----------------------------------------禁用防火墙" +systemctl stop firewalld.service +systemctl disable firewalld.service + +echo "-----------------------------------------安装 docker 所需环境" + +yum install -y yum-utils device-mapper-persistent-data lvm2 + +echo "-----------------------------------------添加 repo(可能网络会很慢,有时候会报:Timeout,所以要多试几次)" +echo "-----------------------------------------官网的地址 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo" +echo "-----------------------------------------这里用阿里云进行加速,不然可能会出现无法安装,阿里云官网说明:https://help.aliyun.com/document_detail/60742.html" + +yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo +yum makecache fast + +echo "-----------------------------------------开始安装 docker" + +yum install -y docker-ce-18.06.1.ce-3.el7 + +echo "-----------------------------------------启动 Docker" + +systemctl start docker.service +systemctl enable docker.service + +echo "-----------------------------------------安装结束" + +echo "-----------------------------------------docker 加速" + +touch /etc/docker/daemon.json + +cat << EOF >> /etc/docker/daemon.json +{ + "registry-mirrors": ["https://ldhc17y9.mirror.aliyuncs.com"] +} +EOF + +systemctl daemon-reload +systemctl restart docker + +echo "-----------------------------------------运行 hello world 镜像" + +docker run hello-world + + + + + diff --git a/favorite-file/shell/install_jdk_offline_to_bash.sh b/favorite-file/shell/install_jdk_offline_to_bash.sh index 3585d262..1b60aeb0 100644 --- a/favorite-file/shell/install_jdk_offline_to_bash.sh +++ b/favorite-file/shell/install_jdk_offline_to_bash.sh @@ -8,28 +8,28 @@ fi echo "判断 JDK 压缩包是否存在" -if [ ! -f "/opt/setups/jdk-8u151-linux-x64.tar.gz" ]; then +if [ ! -f "/opt/setups/jdk-8u181-linux-x64.tar.gz" ]; then echo "JDK 压缩包不存在" exit 1 fi echo "开始解压 JDK" -cd /opt/setups ; tar -zxf jdk-8u151-linux-x64.tar.gz +cd /opt/setups ; tar -zxf jdk-8u181-linux-x64.tar.gz -if [ ! -d "/opt/setups/jdk1.8.0_151" ]; then +if [ ! -d "/opt/setups/jdk1.8.0_181" ]; then echo "JDK 解压失败,结束脚本" exit 1 fi echo "JDK 解压包移到 /usr/local/ 目录下" -mv jdk1.8.0_151/ /usr/local/ +mv jdk1.8.0_181/ /usr/local/ -echo "JDK 写入系统变量到 bash_profile" +echo "JDK 写入系统变量到 profile" -cat << EOF >> ~/.bash_profile +cat << EOF >> /etc/profile # JDK -JAVA_HOME=/usr/local/jdk1.8.0_151 +JAVA_HOME=/usr/local/jdk1.8.0_181 JRE_HOME=\$JAVA_HOME/jre PATH=\$PATH:\$JAVA_HOME/bin CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar @@ -37,7 +37,8 @@ export JAVA_HOME export JRE_HOME export PATH export CLASSPATH + EOF -echo "JDK 设置完成,需要你手动设置:source ~/.bash_profile" \ No newline at end of file +echo "JDK 设置完成,需要你手动设置:source /etc/profile" \ No newline at end of file diff --git a/favorite-file/shell/install_jdk_offline_to_zsh.sh b/favorite-file/shell/install_jdk_offline_to_zsh.sh index afa7eb98..0c0c091b 100644 --- a/favorite-file/shell/install_jdk_offline_to_zsh.sh +++ b/favorite-file/shell/install_jdk_offline_to_zsh.sh @@ -8,28 +8,28 @@ fi echo "判断 JDK 压缩包是否存在" -if [ ! -f "/opt/setups/jdk-8u171-linux-x64.tar.gz" ]; then +if [ ! -f "/opt/setups/jdk-8u191-linux-x64.tar.gz" ]; then echo "JDK 压缩包不存在" exit 1 fi echo "开始解压 JDK" -cd /opt/setups ; tar -zxf jdk-8u171-linux-x64.tar.gz +cd /opt/setups ; tar -zxf jdk-8u191-linux-x64.tar.gz -if [ ! -d "/opt/setups/jdk1.8.0_171" ]; then +if [ ! -d "/opt/setups/jdk1.8.0_191" ]; then echo "JDK 解压失败,结束脚本" exit 1 fi echo "JDK 解压包移到 /usr/local/ 目录下" -mv jdk1.8.0_171/ /usr/local/ +mv jdk1.8.0_191/ /usr/local/ echo "JDK 写入系统变量到 zshrc" cat << EOF >> ~/.zshrc # JDK -JAVA_HOME=/usr/local/jdk1.8.0_171 +JAVA_HOME=/usr/local/jdk1.8.0_191 JRE_HOME=\$JAVA_HOME/jre PATH=\$PATH:\$JAVA_HOME/bin CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar @@ -37,6 +37,7 @@ export JAVA_HOME export JRE_HOME export PATH export CLASSPATH + EOF diff --git a/favorite-file/shell/install_maven_offline_to_bash.sh b/favorite-file/shell/install_maven_offline_to_bash.sh new file mode 100644 index 00000000..179cf3fa --- /dev/null +++ b/favorite-file/shell/install_maven_offline_to_bash.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +echo "判断常见的文件夹是否存在" + +if [ ! -d "/opt/setups" ]; then + mkdir /opt/setups +fi + +echo "判断 Maven 压缩包是否存在" + +if [ ! -f "/opt/setups/apache-maven-3.5.4-bin.tar.gz" ]; then + echo "Maven 压缩包不存在" + exit 1 +fi + +echo "开始解压 Maven" +cd /opt/setups ; tar -zxf apache-maven-3.5.4-bin.tar.gz + +if [ ! -d "/opt/setups/apache-maven-3.5.4" ]; then + echo "Maven 解压失败,结束脚本" + exit 1 +fi + +echo "Maven 解压包移到 /usr/local/ 目录下" +mv apache-maven-3.5.4/ /usr/local/ + +echo "Maven 写入系统变量到 profile" + +cat << EOF >> /etc/profile + +# Maven +M3_HOME=/usr/local/apache-maven-3.5.4 +MAVEN_HOME=/usr/local/apache-maven-3.5.4 +PATH=\$PATH:\$M3_HOME/bin +MAVEN_OPTS="-Xms256m -Xmx356m" +export M3_HOME +export MAVEN_HOME +export PATH +export MAVEN_OPTS + +EOF + + +echo "Maven 设置完成,需要你手动设置:source /etc/profile" \ No newline at end of file diff --git a/favorite-file/shell/install_maven_offline_to_zsh.sh b/favorite-file/shell/install_maven_offline_to_zsh.sh new file mode 100644 index 00000000..2454bb59 --- /dev/null +++ b/favorite-file/shell/install_maven_offline_to_zsh.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +echo "判断常见的文件夹是否存在" + +if [ ! -d "/opt/setups" ]; then + mkdir /opt/setups +fi + +echo "判断 Maven 压缩包是否存在" + +if [ ! -f "/opt/setups/apache-maven-3.5.4-bin.tar.gz" ]; then + echo "Maven 压缩包不存在" + exit 1 +fi + +echo "开始解压 Maven" +cd /opt/setups ; tar -zxf apache-maven-3.5.4-bin.tar.gz + +if [ ! -d "/opt/setups/apache-maven-3.5.4" ]; then + echo "Maven 解压失败,结束脚本" + exit 1 +fi + +echo "Maven 解压包移到 /usr/local/ 目录下" +mv apache-maven-3.5.4/ /usr/local/ + +echo "Maven 写入系统变量到 zshrc" + +cat << EOF >> ~/.zshrc + +# Maven +M3_HOME=/usr/local/apache-maven-3.5.4 +MAVEN_HOME=/usr/local/apache-maven-3.5.4 +PATH=\$PATH:\$M3_HOME/bin +MAVEN_OPTS="-Xms256m -Xmx356m" +export M3_HOME +export MAVEN_HOME +export PATH +export MAVEN_OPTS + +EOF + + +echo "Maven 设置完成,需要你手动设置:source ~/.zshrc" \ No newline at end of file diff --git a/favorite-file/shell/mysql_backup.sh b/favorite-file/shell/mysql_backup.sh new file mode 100644 index 00000000..541c77cb --- /dev/null +++ b/favorite-file/shell/mysql_backup.sh @@ -0,0 +1,17 @@ +#!/bin/bash + + +backupDatetime=$1 + +if [ "$backupDatetime" = "" ]; +then + echo -e "\033[0;31m 请输入备份日期 \033[0m" + exit 1 +fi + +echo "备份日期 = $backupDatetime" + +/usr/bin/mysqldump -u root --password=123456 数据库名 > /opt/mydb-"$backupDatetime".sql + + + diff --git a/favorite-file/shell/shell-for.sh b/favorite-file/shell/shell-for.sh new file mode 100644 index 00000000..9b92b372 --- /dev/null +++ b/favorite-file/shell/shell-for.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# 循环总次数 +totalDegree=$1 + +# 如果没有传参,则默认值是 10 +if [ "$totalDegree" = "" ]; +then + totalDegree=10 +fi + +for((timeTemp = 0; timeTemp <= $totalDegree; timeTemp = timeTemp + 5)) +do + echo "timeTemp=$timeTemp" +done + + + diff --git a/favorite-file/shell/shell-with-param-demo.sh b/favorite-file/shell/shell-with-param-demo.sh new file mode 100644 index 00000000..f59e9a79 --- /dev/null +++ b/favorite-file/shell/shell-with-param-demo.sh @@ -0,0 +1,89 @@ +#!/bin/bash + + +methodParam=$1 +SpringBoot=$2 +SpringBootPath=$3 + +if [ "$methodParam" = "" ]; +then + echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m" + exit 1 +fi + +if [ "$SpringBoot" = "" ]; +then + echo -e "\033[0;31m 未输入应用名 \033[0m" + exit 1 +fi + +if [ "$SpringBootPath" = "" ]; +then + echo -e "\033[0;31m 未输入应用路径 \033[0m" + exit 1 +fi + +echo "操作名 = $methodParam" +echo "应用名 = $2" +echo "应用路径 = $3" + +function start() +{ + count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l` + if [ $count != 0 ];then + echo "$SpringBoot is running..." + else + echo "Start $SpringBoot success..." + cd $SpringBootPath + BUILD_ID=dontKillMe nohup java -jar $SpringBoot > /opt/run-log.log 2>&1 & + fi +} + +function stop() +{ + echo "Stop $SpringBoot" + boot_id=`ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'` + count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l` + + if [ $count != 0 ];then + kill $boot_id + count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l` + + boot_id=`ps -ef |grep java|grep $SpringBoot|grep -v grep|awk '{print $2}'` + kill -9 $boot_id + fi +} + +function restart() +{ + stop + sleep 2 + start +} + +function status() +{ + count=`ps -ef |grep java|grep $SpringBoot|grep -v grep|wc -l` + if [ $count != 0 ];then + echo "$SpringBoot is running..." + else + echo "$SpringBoot is not running..." + fi +} + +case $methodParam in + start) + start;; + stop) + stop;; + restart) + restart;; + status) + status;; + *) + + echo -e "\033[0;31m Usage: \033[0m \033[0;34m sh $0 {start|stop|restart|status} {SpringBootJarName} \033[0m\033[0;31m Example: \033[0m\033[0;33m sh $0 start esmart-test.jar \033[0m" +esac + + + diff --git a/markdown-file/Ansible-Install-And-Settings.md b/markdown-file/Ansible-Install-And-Settings.md new file mode 100644 index 00000000..aed43c64 --- /dev/null +++ b/markdown-file/Ansible-Install-And-Settings.md @@ -0,0 +1,364 @@ +# Ansible 安装和配置 + + +## Ansible 说明 + +- Ansible 官网: +- Ansible 官网 Github: +- Ansible 官网文档: +- 简单讲:它的作用就是把写 shell 这件事变成标准化、模块化。方便更好的自动化运维 + +## 安装 + +- 官网说明: +- CentOS:`sudo yum install -y ansible` + - 查看版本:`ansible --version` + +------------------------------------------------------------------- + +## 配置基本概念 + +#### Ansible 基本配置文件顺序 + +- Ansible 执行的时候会按照以下顺序查找配置项,所以修改的时候要特别注意改的是哪个文件 + +``` +ANSIBLE_CONFIG (环境变量) +ansible.cfg (脚本所在当前目录下) +~/.ansible.cfg (用户家目录下,默认没有) +/etc/ansible/ansible.cfg(安装后会自动生成) +``` + + +#### 配置远程主机地址 (Ansible 称这些地址为 Inventory) + +- 假设我有 3 台机子: + - 192.168.0.223 + - 192.168.0.70 + - 192.168.0.103 +- 官网对此的配置说明: + +###### 给这三台机子设置免密登录的情况(一般推荐方式) + +- 编辑 Ansible 配置文件:`vim /etc/ansible/hosts` +- 添加如下内容 + +``` +[hadoop-host] +192.168.0.223 +192.168.0.70 +192.168.0.103 +``` + +- 其中 `[hadoop-host]` 表示这些主机代表的一个组名 + + +###### 如果不设置免密,直接采用账号密码(容易泄露信息) + + +- 编辑 Ansible 配置文件:`vim /etc/ansible/hosts` +- 添加如下内容 + +``` +[hadoop-host] +hadoop-master ansible_host=192.168.0.223 ansible_user=root ansible_ssh_pass=123456 +hadoop-node1 ansible_host=192.168.0.70 ansible_user=root ansible_ssh_pass=123456 +hadoop-node2 ansible_host=192.168.0.103 ansible_user=root ansible_ssh_pass=123456 +``` + + + +## 简单使用(`ad hoc`方式) + +- ad hoc 官网: + +##### 运行 Ansible + +- 运行 Ansible 的 `ping` 命令,看看配置正确时输出如下: + +``` +sudo ansible --private-key ~/.ssh/id_rsa all -m ping +``` + +- 让远程所有主机都执行 `ps` 命令,输出如下 + +``` +ansible all -a 'ps' +``` + +- 让远程所有 hadoop-host 组的主机都执行 `ps` 命令,输出如下 + +``` +ansible hadoop-host -a 'ps' +``` + +------------------------------------------------------------------- + +## Playbook 脚本方式 + +- 官网: +- 一些语法: +- playbook(剧本),顾名思义,就是需要定义一个脚本或者说配置文件,然后定义好要做什么。之后 ansible 就会根据 playbook 脚本对远程主机进行操作 + +#### 简单脚本 + +- 下面脚本让所有远程主机执行 `whoami` 命令,并把结果(当前用户名)输出到 `/opt/whoami.txt` 文件 +- 创建脚本文件:`vim /opt/simple-playbook.yml` + +``` +- hosts: all + tasks: + - name: whoami + shell: 'whoami > /opt/whoami.txt' +``` + +- 执行命令:`ansible-playbook /opt/simple-playbook.yml`,结果如下,并且 opt 下也有文件生成 + +``` +PLAY [all] ************************************************************************************************************************** + +TASK [Gathering Facts] ************************************************************************************************************** +ok: [192.168.0.223] +ok: [192.168.0.103] +ok: [192.168.0.70] + +TASK [whoami] *********************************************************************************************************************** +changed: [192.168.0.103] +changed: [192.168.0.223] +changed: [192.168.0.70] + +PLAY RECAP ************************************************************************************************************************** +192.168.0.103 : ok=2 changed=1 unreachable=0 failed=0 +192.168.0.223 : ok=2 changed=1 unreachable=0 failed=0 +192.168.0.70 : ok=2 changed=1 unreachable=0 failed=0 +``` + +------------------------------------------------------------------- + +## 平时用来测试 + +- 创建脚本文件:`vim /opt/test-playbook.yml` + +``` +- hosts: hadoop-test + remote_user: root + vars: + java_install_folder: /usr/local + tasks: + # 按行的方式写入 + - name: Set JAVA_HOME 1 + lineinfile: + dest=/etc/profile + line="JAVA_HOME={{ java_install_folder }}/jdk1.8.0_181" + # 按块的方式写入,#{mark} 会被自动替换成:begin 和 end 字符来包裹整块内容(我这里自己定义了词语) + - name: Set JAVA_HOME 2 + blockinfile: + path: /etc/profile + marker: "#{mark} JDK ENV" + marker_begin: "开始" + marker_end: "结束" + block: | + export JAVA_HOME={{ java_install_folder }}/jdk1.8.0_181 + export PATH=$PATH:$JAVA_HOME/bin +``` + +- 执行命令:`ansible-playbook /opt/test-playbook.yml` + +------------------------------------------------------------------- + +## 更多 playbook 实战 + + +#### 禁用防火墙(CentOS 7.x) + + +- 创建脚本文件:`vim /opt/disable-firewalld-playbook.yml` + +``` +- hosts: all + remote_user: root + tasks: + - name: Disable SELinux at next reboot + selinux: + state: disabled + - name: disable firewalld + command: "{{ item }}" + with_items: + - systemctl stop firewalld + - systemctl disable firewalld + - setenforce 0 +``` + + + +#### 基础环境(CentOS 7.x) + + +- 创建脚本文件:`vim /opt/install-basic-playbook.yml` + +``` +- hosts: all + remote_user: root + tasks: + - name: Disable SELinux at next reboot + selinux: + state: disabled + + - name: disable firewalld + command: "{{ item }}" + with_items: + - systemctl stop firewalld + - systemctl disable firewalld + - setenforce 0 + + - name: install-basic + command: "{{ item }}" + with_items: + - yum install -y zip unzip lrzsz git epel-release wget htop deltarpm + + - name: install-vim + shell: "{{ item }}" + with_items: + - yum install -y vim + - curl https://raw.githubusercontent.com/wklken/vim-for-server/master/vimrc > ~/.vimrc + + - name: install-docker + shell: "{{ item }}" + with_items: + - yum install -y yum-utils device-mapper-persistent-data lvm2 + - yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + - yum makecache fast + - yum install -y docker-ce + - systemctl start docker.service + - docker run hello-world + + - name: install-docker-compose + shell: "{{ item }}" + with_items: + - curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose + - chmod +x /usr/local/bin/docker-compose + - docker-compose --version + - systemctl restart docker.service + - systemctl enable docker.service + +``` + + +- 执行命令:`ansible-playbook /opt/install-basic-playbook.yml` + +#### 修改 hosts + + +- 创建脚本文件:`vim /opt/hosts-playbook.yml` + +``` +- hosts: all + remote_user: root + tasks: + - name: update hosts + blockinfile: + path: /etc/hosts + block: | + 192.168.0.223 linux01 + 192.168.0.223 linux02 + 192.168.0.223 linux03 + 192.168.0.223 linux04 + 192.168.0.223 linux05 +``` + + +- 执行命令:`ansible-playbook /opt/hosts-playbook.yml` + + + +#### 部署 JDK + +- 创建脚本文件:`vim /opt/jdk8-playbook.yml` + +``` +- hosts: hadoop-host + remote_user: root + vars: + java_install_folder: /usr/local + tasks: + - name: copy jdk + copy: src=/opt/jdk-8u181-linux-x64.tar.gz dest={{ java_install_folder }} + + - name: tar jdk + shell: chdir={{ java_install_folder }} tar zxf jdk-8u181-linux-x64.tar.gz + + - name: set JAVA_HOME + blockinfile: + path: /etc/profile + marker: "#{mark} JDK ENV" + block: | + JAVA_HOME={{ java_install_folder }}/jdk1.8.0_181 + JRE_HOME=$JAVA_HOME/jre + PATH=$PATH:$JAVA_HOME/bin + CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar + export JAVA_HOME + export JRE_HOME + export PATH + export CLASSPATH + + - name: source profile + shell: source /etc/profile +``` + + +- 执行命令:`ansible-playbook /opt/jdk8-playbook.yml` + + + +#### 部署 Hadoop 集群 + +- 创建脚本文件:`vim /opt/hadoop-playbook.yml` +- 刚学 Ansible,不好动配置文件,所以就只保留环境部分的设置,其他部分自行手工~ + +``` +- hosts: hadoop-host + remote_user: root + tasks: + - name: Creates directory + file: + path: /data/hadoop/hdfs/name + state: directory + - name: Creates directory + file: + path: /data/hadoop/hdfs/data + state: directory + - name: Creates directory + file: + path: /data/hadoop/hdfs/tmp + state: directory + + - name: set HADOOP_HOME + blockinfile: + path: /etc/profile + marker: "#{mark} HADOOP ENV" + block: | + HADOOP_HOME=/usr/local/hadoop + PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin + export HADOOP_HOME + export PATH + + - name: source profile + shell: source /etc/profile +``` + + +- 执行命令:`ansible-playbook /opt/hadoop-playbook.yml` + + + + + +------------------------------------------------------------------- + + +## 资料 + +- [ANSIBLE模块 - shell和command区别](https://www.jianshu.com/p/081139f73613) +- +- +- \ No newline at end of file diff --git a/markdown-file/Bash-Other-Bash.md b/markdown-file/Bash-Other-Bash.md index 5f8782c5..2ce9fcd8 100644 --- a/markdown-file/Bash-Other-Bash.md +++ b/markdown-file/Bash-Other-Bash.md @@ -10,6 +10,7 @@ - `rpm -ivh example.rpm`,安装 example.rpm 包并在安装过程中显示正在安装的文件信息及安装进度 - 查询 - `rpm -qa | grep jdk`,查看 jdk 是否被安装 + - `rpm -ql jdk`,查看 jdk 是否被安装 - 卸载 - `rpm -e jdk`,卸载 jdk(一般卸载的时候都要先用 rpm -qa 看下整个软件的全名) - YUM 软件管理: @@ -26,4 +27,5 @@ ## 资料 +- diff --git a/markdown-file/Bash.md b/markdown-file/Bash.md index 7c3bb9e8..593b8ff6 100644 --- a/markdown-file/Bash.md +++ b/markdown-file/Bash.md @@ -17,6 +17,7 @@ - `jobs`,查看后台运行的程序列表 - `ifconfig`,查看内网 IP 等信息(常用) - `curl ifconfig.me`,查看外网 IP 信息 +- `curl ip.cn`,查看外网 IP 信息 - `locate 搜索关键字`,快速搜索系统文件/文件夹(类似 Windows 上的 everything 索引式搜索)(常用) - `updatedb`,配合上面的 locate,给 locate 的索引更新(locate 默认是一天更新一次索引)(常用) - `date`,查看系统时间(常用) @@ -47,7 +48,7 @@ - `last`,显示最近登录的帐户及时间 - `lastlog`,显示系统所有用户各自在最近登录的记录,如果没有登录过的用户会显示 **从未登陆过** - `ls`,列出当前目录下的所有没有隐藏的文件 / 文件夹。 - - `ls -a`,列出包括以.号开头的隐藏文件 / 文件夹(也就是所有文件) + - `ls -a`,列出包括以.号开头的隐藏文件 / 文件夹(也就是所有文件) - `ls -R`,显示出目录下以及其所有子目录的文件 / 文件夹(递归地方式,不显示隐藏的文件) - `ls -a -R`,显示出目录下以及其所有子目录的文件 / 文件夹(递归地方式,显示隐藏的文件) - `ls -al`,列出目录下所有文件(包含隐藏)的权限、所有者、文件大小、修改时间及名称(也就是显示详细信息) @@ -106,6 +107,7 @@ drwxr-xr-x. 5 root root 4096 3月 26 10:57,其中最前面的 d 表示这是 - `find . -name "lin*" -exec ls -l {} \;`,当前目录搜索lin开头的文件,然后用其搜索后的结果集,再执行ls -l的命令(这个命令可变,其他命令也可以),其中 -exec 和 {} \; 都是固定格式 - `find /opt -type f -size +800M -print0 | xargs -0 du -h | sort -nr`,找出 /opt 目录下大于 800 M 的文件 - `find / -name "*tower*" -exec rm {} \;`,找到文件并删除 + - `find / -name "*tower*" -exec mv {} /opt \;`,找到文件并移到 opt 目录 - `find . -name "*" |xargs grep "youmeek"`,递归查找当前文件夹下所有文件内容中包含 youmeek 的文件 - `find . -size 0 | xargs rm -f &`,删除当前目录下文件大小为0的文件 - `du -hm --max-depth=2 | sort -nr | head -12`,找出系统中占用容量最大的前 12 个目录 @@ -129,7 +131,8 @@ drwxr-xr-x. 5 root root 4096 3月 26 10:57,其中最前面的 d 表示这是 - `kill` - `kill 1234`,结束 pid 为 1234 的进程 - `kill -9 1234`,强制结束 pid 为 1234 的进程(慎重) - - `killall java`,杀死同一进程组内的所有为 java 进程 + - `killall java`,结束同一进程组内的所有为 java 进程 + - `ps -ef|grep hadoop|grep -v grep|cut -c 9-15|xargs kill -9`,结束包含关键字 hadoop 的所有进程 - `head` - `head -n 10 spring.ini`,查看当前文件的前 10 行内容 - `tail` @@ -138,6 +141,8 @@ drwxr-xr-x. 5 root root 4096 3月 26 10:57,其中最前面的 d 表示这是 ## 用户、权限-相关命令 +- 使用 pem 证书登录:`ssh -i /opt/mykey.pem root@192.168.0.70` + - 证书权限不能太大,不然无法使用:`chmod 600 mykey.pem` - `hostname`,查看当前登陆用户全名 - `cat /etc/group`,查看所有组 - `cat /etc/passwd`,查看所有用户 @@ -166,6 +171,8 @@ drwxr-xr-x. 5 root root 4096 3月 26 10:57,其中最前面的 d 表示这是 - linux 的权限分为 rwx。r 代表:可读,w 代表:可写,x 代表:可执行 - 这三个权限都可以转换成数值表示,r = 4,w = 2,x = 1,- = 0,所以总和是 7,也就是最大权限。第一个 7 是所属主(user)的权限,第二个 7 是所属组(group)的权限,最后一位 7 是非本群组用户(others)的权限。 - `chmod -R 777 目录` 表示递归目录下的所有文件夹,都赋予 777 权限 + - `chown myUsername:myGroupName myFile` 表示修改文件所属用户、组 + - `chown -R myUsername:myGroupName myFolder` 表示递归修改指定目录下的所有文件权限 - `su`:切换到 root 用户,终端目录还是原来的地方(常用) - `su -`:切换到 root 用户,其中 **-** 号另起一个终端并切换账号 - `su 用户名`,切换指定用户帐号登陆,终端目录还是原来地方。 @@ -194,8 +201,20 @@ drwxr-xr-x. 5 root root 4096 3月 26 10:57,其中最前面的 d 表示这是 - `umount /dev/sdb5`,卸载挂载,用分区名 +## wget 下载文件 + +- 常规下载:`wget http://www.gitnavi.com/index.html` +- 自动断点下载:`wget -c http://www.gitnavi.com/index.html` +- 后台下载:`wget -b http://www.gitnavi.com/index.html` +- 伪装代理名称下载:`wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" http://www.gitnavi.com/index.html` +- 限速下载:`wget --limit-rate=300k http://www.gitnavi.com/index.html` +- 批量下载:`wget -i /opt/download.txt`,一个下载地址一行 +- 后台批量下载:`wget -b -c -i /opt/download.txt`,一个下载地址一行 + + ## 资料 - - +- diff --git a/markdown-file/CentOS-7-Install.md b/markdown-file/CentOS-7-Install.md index 4b1a3e00..c9428617 100644 --- a/markdown-file/CentOS-7-Install.md +++ b/markdown-file/CentOS-7-Install.md @@ -5,7 +5,8 @@ - 本教程中主要演示了 VMware Workstation 下安装 `CentOS 7.3` 的过程。 - VMware 的使用细节可以看这篇:[CentOS 6 安装](CentOS-Install.md) -- 如果你是要安装到 PC 机中,你需要准备一个 U 盘,以及下载这个软件:[USBWriter(提取码:5aa2)](https://pan.baidu.com/s/1gg83h9T) +- 如果你是要安装到 PC 机中,你需要准备一个 U 盘,以及 Windows 下载这个软件:[USBWriter(提取码:5aa2)](https://pan.baidu.com/s/1gg83h9T) +- 如果你是要安装到 PC 机中,你需要准备一个 U 盘,以及 macOS 下载这个软件:[balenaEtcher(提取码:oqp9)](https://pan.baidu.com/s/1l5K48tfuCKdn0wR_62PjJA) - USBWriter 的使用很简单,如下图即可制作一个 CentOS 系统盘 ![VMware 下安装](../images/CentOS-7-Install-a-0.jpg) diff --git a/markdown-file/CentOS-Virtual-Machine-Copy-Settings.md b/markdown-file/CentOS-Virtual-Machine-Copy-Settings.md index 7c415bde..3cdbd8f2 100644 --- a/markdown-file/CentOS-Virtual-Machine-Copy-Settings.md +++ b/markdown-file/CentOS-Virtual-Machine-Copy-Settings.md @@ -8,8 +8,9 @@ -## 修改方法 +## CentOS 6 修改方法 +- 设置 hostname:`hostnamectl --static set-hostname linux02` - 命令:`sudo vim /etc/udev/rules.d/70-persistent-net.rules` - 该文件中正常此时应该有两行信息 - 在文件中把 NAME="eth0″ 的这一行注释掉 @@ -23,4 +24,10 @@ - 如果显示两行 UUID 的信息的话,复制不是 System eth0 的那个 UUID 值,下面有用。 - 编辑:`sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0` - 把文件中的 UUID 值 改为上面要求复制的 UUID 值。 - - 保存配置文件,重启系统,正常应该是可以了。 \ No newline at end of file + - 保存配置文件,重启系统,正常应该是可以了。 + +## CentOS 7 修改方法 + +- 在 VMware 15 Pro 的情况下,直接 copy 进行后,直接修改网卡配置即可 +- 编辑该文件:`vim /etc/sysconfig/network-scripts/ifcfg-ens33` + - 把 ip 地址修改即可 \ No newline at end of file diff --git a/markdown-file/CentOS6-and-CentOS7.md b/markdown-file/CentOS6-and-CentOS7.md index 87afe8d8..7dd26640 100644 --- a/markdown-file/CentOS6-and-CentOS7.md +++ b/markdown-file/CentOS6-and-CentOS7.md @@ -36,6 +36,9 @@ ### 开放端口 +- 一般设置软件端口有一个原则: + - 0 ~ 1024 系统保留,一般不要用到 + - 1024 ~ 65535(2^16) 可以随意用 - 添加单个端口:`firewall-cmd --zone=public --add-port=8883/tcp --permanent` - 添加范围端口:`firewall-cmd --zone=public --add-port=8883-8885/tcp --permanent` - 删除端口:`firewall-cmd --zone=public --remove-port=8883/tcp --permanent` diff --git a/markdown-file/Confluence-Install-And-Settings.md b/markdown-file/Confluence-Install-And-Settings.md new file mode 100644 index 00000000..5a1a6fe1 --- /dev/null +++ b/markdown-file/Confluence-Install-And-Settings.md @@ -0,0 +1,134 @@ +# Confluence 安装和配置 + +## Confluence 6.15.4 + +- 最新 6.15.4 版本时间:2019-05 + +#### 数据库 + +``` +docker run \ + --name mysql-confluence \ + --restart always \ + -p 3316:3306 \ + -e MYSQL_ROOT_PASSWORD=adg123456 \ + -e MYSQL_DATABASE=confluence_db \ + -e MYSQL_USER=confluence_user \ + -e MYSQL_PASSWORD=confluence_123456 \ + -d \ + mysql:5.7 +``` + +- 连上容器:`docker exec -it mysql-confluence /bin/bash` + - 连上 MySQL:`mysql -u root -p` +- 设置编码: + - **必须做这一步,不然配置过程会报错,confluence 的 DB 要求是 utf8,还不能是 utf8mb4** + - **并且排序规则还必须是:utf8_bin** + - **数据库必须使用'READ-COMMITTED'作为默认隔离级别** + +``` +SET NAMES 'utf8'; +alter database confluence_db character set utf8 collate utf8_bin; +SET GLOBAL tx_isolation='READ-COMMITTED'; +``` + +#### 安装 + +- 下载: + - 选择:linux64 类型下载 +- 授权:`chmod +x atlassian-confluence-6.15.4-x64.bin` + + +``` +./atlassian-confluence-6.15.4-x64.bin + +开始提示: + +Unpacking JRE ... +Starting Installer ... + +This will install Confluence 6.9.0 on your computer. +OK [o, Enter], Cancel [c] + +>> 输入o或直接回车 + +Click Next to continue, or Cancel to exit Setup. + +Choose the appropriate installation or upgrade option. +Please choose one of the following: +Express Install (uses default settings) [1], +Custom Install (recommended for advanced users) [2, Enter], +Upgrade an existing Confluence installation [3] +1 +>> 这里输入数字1 + +See where Confluence will be installed and the settings that will be used. +Installation Directory: /opt/atlassian/confluence +Home Directory: /var/atlassian/application-data/confluence +HTTP Port: 8090 +RMI Port: 8000 +Install as service: Yes +Install [i, Enter], Exit [e] +i + +>> 输入i或者直接回车 + +Extracting files ... + +Please wait a few moments while we configure Confluence. + +Installation of Confluence 6.9.0 is complete +Start Confluence now? +Yes [y, Enter], No [n] + +>> 输入y或者直接回车 + +Please wait a few moments while Confluence starts up. +Launching Confluence ... + +Installation of Confluence 6.9.0 is complete +Your installation of Confluence 6.9.0 is now ready and can be accessed via +your browser. +Confluence 6.9.0 can be accessed at http://localhost:8090 +Finishing installation ... + +# 安装完成,访问本机的8090端口进行web端安装 +# 开放防火墙端口 +firewall-cmd --add-port=8090/tcp --permanent +firewall-cmd --add-port=8000/tcp --permanent +firewall-cmd --reload +``` + +- 默认是安装在 /opt 目录下:`/opt/atlassian/confluence/confluence/WEB-INF/lib` +- 启动:`sh /opt/atlassian/confluence/bin/start-confluence.sh` +- 停止:`sh /opt/atlassian/confluence/bin/stop-confluence.sh` +- 查看 log:`tail -300f /opt/atlassian/confluence/logs/catalina.out` +- 卸载:`sh /opt/atlassian/confluence/uninstall` +- 设置 MySQL 连接驱动,把 mysql-connector-java-5.1.47.jar 放在目录 `/opt/atlassian/confluence/confluence/WEB-INF/lib` + +#### 首次配置 + +- 访问: +- 参考文章: +- 参考文章: +- 因为步骤一样,所以我就不再截图了。 + +#### License 过程 + +- 参考自己的为知笔记 + + +## 反向代理的配置可以参考 + +- + + +## 使用 markdown + +- 点击右上角小齿轮 > 管理应用 > 搜索市场应用 > 输入 markdown > 安装 + + +## 其他资料 + +- +- diff --git a/markdown-file/Daemontools.md b/markdown-file/Daemontools.md index 97cc341f..130ef7dc 100644 --- a/markdown-file/Daemontools.md +++ b/markdown-file/Daemontools.md @@ -49,8 +49,7 @@ python setup.py install ``` -- 生成配置文件: - - `echo_supervisord_conf > /etc/supervisord.conf` +- 生成配置文件:`echo_supervisord_conf > /etc/supervisord.conf` - 创建专门的程序配置文件目录、日志目录: - `mkdir -p /var/log/supervisor` - `mkdir -p /etc/supervisor/conf.d/` @@ -74,17 +73,22 @@ stdout_logfile=/var/log/supervisor/supervisord-logstash.log stderr_logfile=/var/log/supervisor/supervisord-logstash-err.log user=root autostart=true -autorestart=true +autorestart=false startsecs=5 priority=1 stopasgroup=true killasgroup=true ``` +- 该配置的具体说明可以参考:[使用 supervisor 管理进程](http://liyangliang.me/posts/2015/06/using-supervisor/) - 启动程序(默认会启动所有子任务):`/usr/bin/supervisord -c /etc/supervisord.conf` - 管理子任务的命令: + - 子任务状态:`/usr/bin/supervisorctl status` - 启动所有子任务:`/usr/bin/supervisorctl start all` - 结束所有子任务:`/usr/bin/supervisorctl stop all` + - 启动指定子任务:`/usr/bin/supervisorctl start gitnavi-logstash` + - 结束指定子任务:`/usr/bin/supervisorctl stop gitnavi-logstash` + - 重启指定子任务:`/usr/bin/supervisorctl restart gitnavi-logstash` - 只载入最新的配置文件, 并不重启任何进程:`/usr/bin/supervisorctl reread` - 载入最新的配置文件,停止原来的所有进程并按新的配置启动管理所有进程:`/usr/bin/supervisorctl reload` - 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启:`/usr/bin/supervisorctl update` diff --git a/markdown-file/Docker-Install-And-Usage.md b/markdown-file/Docker-Install-And-Usage.md index b91e3ce1..734c11de 100644 --- a/markdown-file/Docker-Install-And-Usage.md +++ b/markdown-file/Docker-Install-And-Usage.md @@ -72,6 +72,7 @@ Docker CE has both stable and edge channels. - `sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo` - `sudo yum makecache fast` - `sudo yum install -y docker-ce`,大小:19M,速度很慢。 +- 查看配置文件位置:`systemctl show --property=FragmentPath docker` - 启动 Docker:`systemctl start docker.service` - 停止 Docker:`systemctl stop docker.service` - 查看状态:`systemctl status docker.service` @@ -198,7 +199,7 @@ java -jar /root/spring-boot-my-demo.jar - 我们看到了我们刚刚运行的容器 ID(CONTAINER ID)为:`a5d544d9b6f9`,这个下面要用到 - 基于刚刚运行的容器创建新镜像:`docker commit a5d544d9b6f9 youmeek/springboot:0.1` - 查看现在的镜像库:`docker images`,会发现多了一个 youmeek/springboot 新镜像,镜像 ID 为:`7024f230fef9` -- 运行新镜像,实例化为一个容器,并启动容器中刚刚写的脚本:`docker run -d -p 38080:8080 --name springBootJar 7024f230fef9 /root/spring-boot-run.sh` +- 运行新镜像,实例化为一个容器,并启动容器中刚刚写的脚本:`docker run -d -p 38080:8080 --name=springBootJar --hostname=springBootJar 7024f230fef9 /root/spring-boot-run.sh` - `-d`:表示以“守护模式”执行 spring-boot-run.sh 脚本,此时 jar 中的 log 日志不会出现在输出终端上。 - `-p`:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 38080 端口,这样就向外界暴露了 38080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。 - `--name`:表示给新实例容器取的名称,用一个有意义的名称命名即可 @@ -253,6 +254,7 @@ CONTAINER ID NAME CPU % MEM USAGE / LI - `docker rmi 仓库:Tag`:删除具体某一个镜像 - `docker rmi $(docker images -q)`,删除所有镜像 - `docker rmi -f $(docker images -q)`,强制删除所有镜像 + - `docker rmi $(docker images | grep "vmware" | awk '{print $3}')`,批量删除带有 vmware 名称的镜像 - `docker tag`:为镜像打上标签 - `docker tag -f ubuntu:14.04 ubuntu:latest`,-f 意思是强制覆盖 - 同一个IMAGE ID可能会有多个TAG(可能还在不同的仓库),首先你要根据这些 image names 来删除标签,当删除最后一个tag的时候就会自动删除镜像; @@ -270,13 +272,13 @@ CONTAINER ID NAME CPU % MEM USAGE / LI #### 容器生命周期管理 - `docker run`,运行镜像 - - `docker run -v /java_logs/:/opt/ -d -p 8080:80 --name myDockerNameIsGitNavi -i -t 镜像ID /bin/bash` + - `docker run -v /java_logs/:/opt/ -d -p 8080:80 --name=myDockerNameIsGitNavi --hostname=myDockerNameIsGitNavi -i -t 镜像ID /bin/bash` - `-i -t` 分别表示保证容器中的 STDIN 开启,并分配一个伪 tty 终端进行交互,这两个是合着用。 - `--name` 是给容器起了一个名字(如果没有主动给名字,docker 会自动给你生成一个)容器的名称规则:大小写字母、数字、下划线、圆点、中横线,用正则表达式来表达就是:[a-zA-Z0-9_*-] - `-d` 容器运行在后台。 - `-p 8080:80` 表示端口映射,将宿主机的8080端口转发到容器内的80端口。(如果是 -P 参数,则表示随机映射应该端口,一般用在测试的时候) - `-v /java_logs/:/opt/` 表示目录挂载,/java_logs/ 是宿主机的目录,/opt/ 是容器目录 - - `docker run --rm --name myDockerNameIsGitNavi -i -t centos /bin/bash`,--rm,表示退出即删除容器,一般用在做实验测试的时候 + - `docker run --rm --name=myDockerNameIsGitNavi --hostname=myDockerNameIsGitNavi -i -t centos /bin/bash`,--rm,表示退出即删除容器,一般用在做实验测试的时候 - `docker run --restart=always -i -t centos /bin/bash`,--restart=always 表示停止后会自动重启 - `docker run --restart=on-failure:5 -i -t centos /bin/bash`,--restart=on-failure:5 表示停止后会自动重启,最多重启 5 次 - `docker exec`:对守护式的容器里面执行命令,方便对正在运行的容器进行维护、监控、管理 @@ -284,6 +286,7 @@ CONTAINER ID NAME CPU % MEM USAGE / LI - `docker exec -d 容器ID touch /opt/test.txt`,已守护式的方式进入 docker 容器,并创建一个文件 - `docker stop 容器ID`,停止容器 - `docker stop $(docker ps -a -q)`,停止所有容器 + - `docker stop $(docker ps -a -q) ; docker rm $(docker ps -a -q)`,停止所有容器,并删除所有容器 - `docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)`,停止所有容器,并删除所有容器 - `docker start 容器ID`,重新启动已经停止的容器(重新启动,docker run 参数还是保留之前的) - `docker restart 容器ID`,重启容器 @@ -306,6 +309,11 @@ CONTAINER ID NAME CPU % MEM USAGE / LI - `docker run -it 镜像ID --link redis-name:myredis /bin/bash` - `redis-name` 是容器名称 - `myredis` 是容器别名,其他容器连接它可以用这个别名来写入到自己的配置文件中 +- 容器与宿主机之间文件的拷贝 + - `docker cp /www/runoob 96f7f14e99ab:/www/` 将主机 /www/runoob 目录拷贝到容器 96f7f14e99ab 的 /www 目录下 + - `docker cp /www/runoob 96f7f14e99ab:/www` 将主机 /www/runoob 目录拷贝到容器 96f7f14e99ab 中,目录重命名为 www。 + - `docker cp 96f7f14e99ab:/www /tmp/` 将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。 + #### docker 网络模式 @@ -645,6 +653,21 @@ docker rmi $(docker images -f "dangling=true" -q) - +## Docker remote api 远程操作配置(保证在内网环境) + +- 假设要被远程操作的服务器 IP:`192.168.1.22` +- 修改其配置文件:`vim /lib/systemd/system/docker.service` +- 修改默认值为:`ExecStart=/usr/bin/dockerd` +- 改为:`ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376` + - 如果还需要连自己的 harbor 这类,完整配置:`ExecStart=/usr/bin/dockerd --insecure-registry harbor.youmeek.com -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376` +- `systemctl daemon-reload` +- `systemctl reload docker` +- `systemctl restart docker` +- 验证: + - 在其他服务器上运行:`docker -H 192.168.1.22:2376 images ` + - 能拿到和它本身看到的一样的数据表示可以了 + + ## Dockerfile 解释 - 该文件名就叫 Dockerfile,注意大小写,没有后缀,否则会报错。 @@ -703,7 +726,7 @@ EXPOSE 9096 - `cd /opt/zch` - `docker build . --tag="skb/user:v1.0.1"` - 因为 build 过程中会有多层镜像 step 过程,所以如果 build 过程中失败,那解决办法的思路是找到 step 失败的上一层,成功的 step 中镜像 ID。然后 docker run 该镜像 ID,手工操作,看报什么错误,然后就比较清晰得了解错误情况了。 - - `docker run -d -p 9096:9096 -v /usr/local/logs/:/opt/ --name="skbUser1.0.0" skb/user:v1.0.1` + - `docker run -d -p 9096:9096 -v /usr/local/logs/:/opt/ --name=skbUser --hostname=skbUser skb/user:v1.0.1` - 查看启动后容器列表:`docker ps` - jar 应用的日志是输出在容器的 /opt 目录下,因为我们上面用了挂载,所在在我们宿主机的 /usr/local/logs 目录下可以看到输出的日志 - 防火墙开放端口: @@ -717,13 +740,47 @@ ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ``` +## Dockerfile 部署 Tomcat 应用 + +- 编写 Dockerfile + +``` +FROM tomcat:8.0.46-jre8 +MAINTAINER GitNavi + +ENV JAVA_OPTS="-Xms2g -Xmx2g -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=312M" +ENV CATALINA_HOME /usr/local/tomcat + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN rm -rf /usr/local/tomcat/webapps/* + +ADD qiyeweixin.war /usr/local/tomcat/webapps/ + +EXPOSE 8080 + +CMD ["catalina.sh", "run"] +``` + +- 打包镜像:`docker build -t harbor.gitnavi.com/demo/qiyeweixin:1.2.2 ./` +- 运行:`docker run -d -p 8888:8080 --name=qiyeweixin --hostname=qiyeweixin -v /data/docker/logs/qiyeweixin:/data/logs/qiyeweixin harbor.gitnavi.com/demo/qiyeweixin:1.2.2` +- 带 JVM 参数运行:`docker run -d -p 8888:8080 -e JAVA_OPTS='-Xms7g -Xmx7g -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=512M' --name=qiyeweixin --hostname=qiyeweixin -v /data/docker/logs/qiyeweixin:/data/logs/qiyeweixin harbor.gitnavi.com/demo/qiyeweixin:1.2.2` + - 虽然 Dockerfile 已经有 JVM 参数,并且也是有效的。但是如果 docker run 的时候又带了 JVM 参数,则会以 docker run 的参数为准 +- 测试 JVM 是否有效方法,在代码里面书写,该值要接近 xmx 值: + +``` +long maxMemory = Runtime.getRuntime().maxMemory(); +logger.warn("-------------maxMemory=" + ((double) maxMemory / (1024 * 1024))); +``` ## Docker Compose - Docker Compose 主要用于定义和运行多个 Docker 容器的工具,这样可以快速运行一套分布式系统 - 容器之间是有依赖关系,比如我一个 Java web 系统依赖 DB 容器、Redis 容器,必须这些依赖容器先运行起来。 - 一个文件:docker-compose.yml -- 一个命令:docker-compose up +- 一个命令:`docker-compose up` + - 指定文件:`docker-compose -f zookeeper.yml -p zk_test up -d` - 官网安装说明: - 安装方法: @@ -745,148 +802,6 @@ sudo chmod +x /usr/local/bin/docker-compose - Docker Swarm 是一个 Docker 集群管理工具 -## Kubernetes - -- 目前流行的容器编排系统 -- 简称:K8S -- 官网: -- 主要解决几个问题: - - `调度` - - `生命周期及健康状况` - - `服务发现` - - `监控` - - `认证` - - `容器聚合` -- 主要角色:Master、Node - -#### 主要概念 - -- `Pods` - -``` -创建,调度以及管理的最小单元 -共存的一组容器的集合 -容器共享PID,网络,IPC以及UTS命名空间 -容器共享存储卷 -短暂存在 -``` - -- `Volumes` - -``` -数据持久化 -Pod中容器共享数据 -生命周期 -支持多种类型的数据卷 – emptyDir, hostpath, gcePersistentDisk, awsElasticBlockStore, nfs, iscsi, glusterfs, secrets -``` - -- `Labels` - -``` -用以标示对象(如Pod)的key/value对 -组织并选择对象子集 -``` - -- `Replication Controllers` - -``` -确保在任一时刻运行指定数目的Pod -容器重新调度 -规模调整 -在线升级 -多发布版本跟踪 -``` - -- `Services` - -``` -抽象一系列Pod并定义其访问规则 -固定IP地址和DNS域名 -通过环境变量和DNS发现服务 -负载均衡 -外部服务 – ClusterIP, NodePort, LoadBalancer -``` - - -#### 主要组成模块 - -- `etcd` - -``` -高可用的Key/Value存储 -只有apiserver有读写权限 -使用etcd集群确保数据可靠性 -``` - -- `apiserver` - -``` -Kubernetes系统入口, REST -认证 -授权 -访问控制 -服务帐号 -资源限制 -``` - -- `kube-scheduler` - -``` -资源需求 -服务需求 -硬件/软件/策略限制 -关联性和非关联性 -数据本地化 -``` - -- `kube-controller-manager` - -``` -Replication controller -Endpoint controller -Namespace controller -Serviceaccount controller -``` - -- `kubelet` - -``` -节点管理器 -确保调度到本节点的Pod的运行和健康 -``` - -- `kube-proxy` - -``` -Pod网络代理 -TCP/UDP请求转发 -负载均衡(Round Robin) -``` - -- `服务发现` - -``` -环境变量 -DNS – kube2sky, etcd,skydns -``` - -- `网络` - -``` -容器间互相通信 -节点和容器间互相通信 -每个Pod使用一个全局唯一的IP -``` - -- `高可用` - -``` -kubelet保证每一个master节点的服务正常运行 -系统监控程序确保kubelet正常运行 -Etcd集群 -多个apiserver进行负载均衡 -Master选举确保kube-scheduler和kube-controller-manager高可用 -``` ## Harbor 镜像私有仓库 @@ -895,7 +810,12 @@ Master选举确保kube-scheduler和kube-controller-manager高可用 ## 资料 - 书籍:《第一本 Docker 书》 - +- []() +- []() +- []() +- []() +- []() +- []() diff --git a/markdown-file/ELK-Install-And-Settings.md b/markdown-file/ELK-Install-And-Settings.md index d5e0c216..26fbda70 100644 --- a/markdown-file/ELK-Install-And-Settings.md +++ b/markdown-file/ELK-Install-And-Settings.md @@ -26,30 +26,6 @@ - 请看 logstash 专题文:[logstash 相关知识](Logstash-Base.md) -### 安装 Kibana - -- 选择一台机子安装即可,我选择:192.168.1.127 这台 -- 切换到存放目录:`cd /usr/program/elk` -- 解压:`tar zxvf kibana-4.6.1-linux-x86_64.tar.gz` -- 修改配置文件:`vim /usr/program/elk/kibana-4.6.1-linux-x86_64/config/kibana.yml`,打开下面注释并配置: - -``` nginx -server.port: 5601 #端口 -server.host: "192.168.1.127" #访问ip地址 -elasticsearch.url: "http://192.168.1.127:9200" #连接elastic -kibana.index: ".kibana" #在elastic中添加.kibana索引 -``` - -- 记得先切换到 elasticsearch 用户下,然后先启动 elasticsearch。先确保 elasticsearch 集群是启动的。 -- 再切换到 root 用户下,启动 kibana -- 带控制台的启动(比较慢):`/usr/program/elk/kibana-4.6.1-linux-x86_64/bin/kibana` -- 守护进程方式启动:`/usr/program/elk/kibana-4.6.1-linux-x86_64/bin/kibana -d` -- 守护进程方式停止:`ps -ef|grep kibana`,只能通过 kill pid 来结束 -- 然后你可以访问:`http://192.168.1.127:5601`,可以看到 kibana 的相关界面。 -- 在 logstash 安装这一步,如果你刚刚有按着我说的去做一个 elasticsearch 索引,那你此时不会看到这样的提示:`Unable to fetch mapping. Do you have indices matching the pattern?` - - 此时你可以直接点击 `create` 统计 `logstash-*` 格式的索引结果,看到相关内容 - - 如果你知道你的索引名称的规则,比如我现在要统计 Tomcat 的相关索引,我的索引名称是:`tomcat-log-*`,则我输入这个,点击:create 即可。 -- kibana 的高级用法请看我单独的一篇文章:[kibana 相关知识](Kibana-Base.md) ## 资料 diff --git a/markdown-file/Elasticsearch-Base.md b/markdown-file/Elasticsearch-Base.md index 97c03042..959a7a93 100644 --- a/markdown-file/Elasticsearch-Base.md +++ b/markdown-file/Elasticsearch-Base.md @@ -1,40 +1,119 @@ # Elasticsearch 知识 -## Docker 部署 +## Docker 单节点部署 -``` -version: "3" +- 官网: +- 官网列表: +- 阿里云支持版本: + - 阿里云有一个 `插件配置` 功能,常用的 Elasticsearch 插件都带了,勾选下即可安装。也支持上传安装。 +- 注意:docker 版本下 client.transport.sniff = true 是无效的。 + +#### 5.6.x + +- `vim ~/elasticsearch-5.6.8-docker.yml` +- 启动:`docker-compose -f ~/elasticsearch-5.6.8-docker.yml -p elasticsearch_5.6.8 up -d` +``` +version: '3' services: - elasticsearch: - image: elasticsearch:5.6.8 - restart: always - container_name: elasticsearch - hostname: elasticsearch + elasticsearch1: + image: docker.elastic.co/elasticsearch/elasticsearch:5.6.8 + container_name: elasticsearch-5.6.8 environment: - - 'http.host=0.0.0.0' - - 'transport.host=127.0.0.1' - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + - "cluster.name=elasticsearch" + - "network.host=0.0.0.0" + - "http.host=0.0.0.0" + - "xpack.security.enabled=false" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 ports: - - "9200:9200" - - "9300:9300" + - 9200:9200 + - 9300:9300 volumes: - /data/docker/elasticsearch/data:/usr/share/elasticsearch/data + ``` -## 环境 -- CentOS 7.3 +#### 6.7.x(带 ik 分词) + +- `vim ~/elasticsearch-6.7.2-docker.yml` +- 启动:`docker-compose -f ~/elasticsearch-6.7.2-docker.yml -p elasticsearch_6.7.2 up -d` +- `mkdir -p /data/docker/elasticsearch-6.7.2/data` +- 如果官网镜像比较慢可以换成阿里云:`registry.cn-hangzhou.aliyuncs.com/elasticsearch/elasticsearch:6.7.2` +- 下载 ik 分词(版本必须和 Elasticsearch 版本对应,包括小版本号): + +``` +version: '3' +services: + elasticsearch1: + image: docker.elastic.co/elasticsearch/elasticsearch:6.7.2 + container_name: elasticsearch-6.7.2 + environment: + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + - "cluster.name=elasticsearch" + - "network.host=0.0.0.0" + - "http.host=0.0.0.0" + - "xpack.security.enabled=false" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + ports: + - 9200:9200 + - 9300:9300 + volumes: + - /data/docker/elasticsearch-6.7.2/data:/usr/share/elasticsearch/data + - /data/docker/ik:/usr/share/elasticsearch/plugins/ik +``` + +- Elasticsearch Head 插件地址: +- 测试: + + +``` +http://localhost:9200/ +_analyze?pretty POST + + +{"analyzer":"ik_smart","text":"安徽省长江流域"} +``` + +- ik_max_word 和 ik_smart 什么区别? + +``` +ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query; +ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。 +``` + + +------------------------------------------------------------------- + + +## Elasticsearch 6.5.x 安装(适配与 5.5.x,6.6.x) + +#### 环境 + +- CentOS 7.x +- 至少需要 2G 内存 - root 用户 - JDK 版本:1.8(最低要求),主推:JDK 1.8.0_121 以上 - 关闭 firewall - `systemctl stop firewalld.service` #停止firewall - `systemctl disable firewalld.service` #禁止firewall开机启动 -## Elasticsearch 5.5.0 安装 - -### 先配置部分系统变量 +#### 先配置部分系统变量 +- 更多系统层面的配置可以看官网: - 配置系统最大打开文件描述符数:`vim /etc/sysctl.conf` ``` @@ -51,12 +130,27 @@ elasticsearch hard memlock unlimited * hard nofile 262144 ``` -### 开始安装 +#### 开始安装 -- 官网 RPM 安装流程(重要,以下资料都是对官网的总结): -- `rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch` +- 检查:`rpm -qa | grep elastic` +- 卸载:`rpm -e --nodeps elasticsearch` +- 官网 RPM 安装流程(重要,以下资料都是对官网的总结): +- 导入 KEY:`rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch` - 新建文件:`vim /etc/yum.repos.d/elasticsearch.repo` -- 内容如下: +- 内容如下(6.x): + +``` +[elasticsearch-6.x] +name=Elasticsearch repository for 6.x packages +baseurl=https://artifacts.elastic.co/packages/6.x/yum +gpgcheck=1 +gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch +enabled=1 +autorefresh=1 +type=rpm-md +``` + +- 内容如下(5.x): ``` [elasticsearch-5.x] @@ -69,24 +163,135 @@ autorefresh=1 type=rpm-md ``` -- 开始安装:`yum install -y elasticsearch`,国内网络安装会很慢,慢慢等 +- 开始安装:`yum install -y elasticsearch`,预计文件有 108M 左右,国内网络安装可能会很慢,慢慢等 + - 安装完后会多了一个:elasticsearch 用户和组 +- 设置 java 软链接:`ln -s /usr/local/jdk1.8.0_181/jre/bin/java /usr/local/sbin/java` +- 启动和停止软件(默认是不启动的): + - 启动:`systemctl start elasticsearch.service` + - 状态:`systemctl status elasticsearch.service` + - 停止:`systemctl stop elasticsearch.service` + - 重新启动:`systemctl restart elasticsearch.service` - 安装完成后,增加系统自启动: -- `/bin/systemctl daemon-reload` -- `/bin/systemctl enable elasticsearch.service` -- 启动和停止软件: -- `systemctl start elasticsearch.service` -- `systemctl stop elasticsearch.service` + - `/bin/systemctl daemon-reload` + - `/bin/systemctl enable elasticsearch.service` +- 检查:`curl -X GET "localhost:9200/"` -### RPM 安装后的一些配置位置说明 +#### RPM 安装后的一些配置位置说明 +- 更多说明可以看官网: +- 更加详细的配置可以看: - 默认系统生成了一个 elasticsearch 用户,下面的目录权限属于该用户 -- Elasticsearch 安装后位置:/usr/share/elasticsearch -- Elasticsearch 的软件环境、堆栈的设置:/etc/sysconfig/elasticsearch -- Elasticsearch 的集群设置:/etc/elasticsearch/elasticsearch.yml -- Log 位置:/var/log/elasticsearch/ -- 索引数据位置:/var/lib/elasticsearch -- 插件位置:/usr/share/elasticsearch/plugins -- 脚本文件位置:/etc/elasticsearch/scripts +- Elasticsearch 安装后位置:`/usr/share/elasticsearch` +- Elasticsearch 的软件环境、堆栈的设置:`/etc/sysconfig/elasticsearch` +- Elasticsearch 的集群设置:`/etc/elasticsearch/elasticsearch.yml` +- Log 位置:`/var/log/elasticsearch/` +- 索引数据位置:`/var/lib/elasticsearch` +- 插件位置:`/usr/share/elasticsearch/plugins` +- 脚本文件位置:`/etc/elasticsearch/scripts` + +#### 配置 + +- 编辑配置文件:`vim /etc/elasticsearch/elasticsearch.yml` +- 默认只能 localhost 访问,修改成支持外网访问 + +``` +打开这个注释:#cluster.name: my-application +集群名称最好是自己给定,不然有些 client 端会连不上,或者要求填写 + +打开这个注释:#network.host: 192.168.0.1 +改为:network.host: 0.0.0.0 +``` + +#### 安装 X-Pack(6.5.x 默认带了 x-pack) + +- `cd /usr/share/elasticsearch && bin/elasticsearch-plugin install x-pack` + +#### GUI 客户端工具 + +- 优先推荐: +- + + +#### 安装 Chrome 扩展的 Head + +- 下载地址: + +#### 其他细节 + +- 如果就单个节点测试,新建索引的时候副本数记得填 0。 + +#### 创建索引并设置 mapping + +- 官网类型说明: + +``` +curl -XPUT 'http://127.0.0.1:9200/grafanadb' -H 'Content-Type: application/json' -d' +{ + "settings": { + "refresh_interval": "5s", + "number_of_shards": 5, + "number_of_replicas": 0 + }, + "mappings": { + "radar": { + "properties": { + "request_num": { + "type": "long" + }, + "post_date": { + "type": "date", + "format": "yyyy-MM-dd HH:mm:ss||epoch_millis" + } + } + } + } +} +' +``` + + +#### 批量增加 / 删除测试数据 + +- 官网文档: +- 批量增加,cURL 格式: + +``` +curl -X POST "http://127.0.0.1:9200/_bulk" -H 'Content-Type: application/json' -d' +{ "index" : { "_index" : "grafanadb", "_type" : "radar", "_id" : "100001" } } +{ "post_date" : "2018-12-01 10:00:00", "request_num" : 1 } +{ "index" : { "_index" : "grafanadb", "_type" : "radar", "_id" : "100002" } } +{ "post_date" : "2018-12-01 10:00:05", "request_num" : 2 } +{ "index" : { "_index" : "grafanadb", "_type" : "radar", "_id" : "100003" } } +{ "post_date" : "2018-12-01 10:00:10", "request_num" : 3 } +{ "index" : { "_index" : "grafanadb", "_type" : "radar", "_id" : "100004" } } +{ "post_date" : "2018-12-01 10:00:15", "request_num" : 4 } +{ "index" : { "_index" : "grafanadb", "_type" : "radar", "_id" : "100005" } } +{ "post_date" : "2018-12-01 10:00:20", "request_num" : 5 } +' +``` + +- 批量删除,cURL 格式: + +``` +curl -X POST "http://127.0.0.1:9200/_bulk" -H 'Content-Type: application/json' -d' +{ "delete": { "_index": "grafanadb", "_type": "radar", "_id": "100001" } } +{ "delete": { "_index": "grafanadb", "_type": "radar", "_id": "100002" } } +' +``` + +- 清空索引所有数据,分成5个切片去执行删除,cURL 格式: + +``` +curl -X POST "http://127.0.0.1:9200/索引名称/类型名称/_delete_by_query?refresh&slices=5&pretty" -H 'Content-Type: application/json' -d' +{ + "query": { + "match_all": {} + } +} +' +``` + + ------------------------------------------------------------------------------------------------------------------- diff --git a/markdown-file/File-Extract-Compress.md b/markdown-file/File-Extract-Compress.md index b0459b9a..fd03c1dd 100644 --- a/markdown-file/File-Extract-Compress.md +++ b/markdown-file/File-Extract-Compress.md @@ -40,7 +40,8 @@ ## 常用文件进行--压缩--命令整理 - Linux 压缩文件夹为后缀 `.war` 格式的文件(最好不要对根目录进行压缩,不然会多出一级目录) -- 命令:`jar -cvfM0 cas.war /opt/cas/META-INF /opt/cas/WEB-INF` +- 命令:`jar -cvfM0 cas.war /opt/cas/META-INF /opt/cas/WEB-INF /opt/cas/index.jsp` +- 或者命令:`cd 项目根目录 ; jar -cvfM0 cas.war ./*` - Linux 压缩文件为后缀 `.tar` 格式的文件 - 命令:`tar -zcvf test11.tar test11` @@ -61,6 +62,20 @@ - 命令:`7za a test1.7z /opt/test1/` +## 分卷压缩 + +- 分卷压缩:`zip -s 100M myFile.zip --out newFile.zip` +- 最终效果: + +``` +newFile.z01 +newFile.z02 +newFile.z03 +newFile.z04 +newFile.zip +``` + + ## 特殊格式 - 7z diff --git a/markdown-file/Flink-Install-And-Settings.md b/markdown-file/Flink-Install-And-Settings.md new file mode 100644 index 00000000..97d813c0 --- /dev/null +++ b/markdown-file/Flink-Install-And-Settings.md @@ -0,0 +1,371 @@ +# Flink 安装和配置 + +## 介绍 + +- 2018-11-30 发布最新:1.7.0 版本 +- 官网: +- 官网 Github: + +## 本地模式安装 + +- CentOS 7.4 +- IP 地址:`192.168.0.105` +- 官网指导: +- 必须 JDK 8.x +- 下载: + - 选择 Binaries 类型 + - 如果没有 Hadoop 环境,只是本地开发,选择:Apache 1.7.0 Flink only + - Scala 2.11 和 Scala 2.12 都可以,但是我因为后面要用到 kafka,kafka 推荐 Scala 2.11,所以我这里也选择同样。 + - 最终我选择了:Apache 1.7.0 Flink only Scala 2.11,共:240M +- 解压:`tar zxf flink-*.tgz` +- 进入根目录:`cd flink-1.7.0`,完整路径:`cd /usr/local/flink-1.7.0` +- 改下目录名方便后面书写:`mv /usr/local/flink-1.7.0 /usr/local/flink` +- 启动:`cd /usr/local/flink && ./bin/start-cluster.sh` +- 停止:`cd /usr/local/flink && ./bin/stop-cluster.sh` +- 查看日志:`tail -300f log/flink-*-standalonesession-*.log` +- 浏览器访问 WEB 管理:`http://192.168.0.105:8081` + +## yarn 启动 + +- 安装方式跟上面一样,但是必须保证有 hadoop、yarn 集群 +- 控制台启动:`cd /usr/local/flink && ./bin/yarn-session.sh -n 2 -jm 1024 -tm 1024` +- 守护进程启动:`cd /usr/local/flink && ./bin/yarn-session.sh -n 2 -jm 1024 -tm 1024 -d` +- 有可能会报:`The Flink Yarn cluster has failed`,可能是资源不够 +- YARN 参数配置可以参考:[点击我](https://sustcoder.github.io/2018/09/27/YARN%20%E5%86%85%E5%AD%98%E5%8F%82%E6%95%B0%E8%AF%A6%E8%A7%A3/) + +## Demo + +- 运行程序解压包下也有一些 jar demo:`cd /usr/local/flink/examples` +- 官网: +- DataStream API: +- DataSet API: +- 访问该脚本可以得到如下内容: + +``` +mvn archetype:generate \ + -DarchetypeGroupId=org.apache.flink \ + -DarchetypeArtifactId=flink-quickstart-java \ + -DarchetypeVersion=${1:-1.7.0} \ + -DgroupId=org.myorg.quickstart \ + -DartifactId=$PACKAGE \ + -Dversion=0.1 \ + -Dpackage=org.myorg.quickstart \ + -DinteractiveMode=false +``` + +- 可以自己在本地执行该 mvn 命令,用 Maven 骨架快速创建一个 WordCount 项目 +- 注意,这里必须使用这个仓库(最好用穿越软件):`https://repository.apache.org/content/repositories/snapshots` +- 该骨架的所有版本: + - 根据实验,目前 1.7.0 和 1.6.x 都是没有 WordCount demo 代码的。但是 1.3.x 是有的。 + +## 运行 + +- 可以直接在 IntelliJ IDEA 上 run +- 也可以交给服务器上 flink 执行,也有两种方式: + - 把 jar 自己上传 Flink 服务器运行:`cd /usr/local/flink && ./bin/flink run -c com.youmeek.WordCount /opt/flink-simple-demo-1.0-SNAPSHOT.jar` + - 也可以通过 WEB UI 上传 jar: + - 有一个 `Add New` 按钮可以上传 jar 包,然后填写 Class 路径:`com.youmeek.WordCount` + - `parallelism` 表示并行度,填写数字,一般并行度设置为集群 CPU 核数总和的 2-3 倍(如果是单机模式不需要设置并行度) + +## 安装 ncat 方便发送数据包 + +- 环境:CentOS 7.4 +- 官网下载:,找到 rpm 包 +- 当前时间(201803)最新版本下载:`wget https://nmap.org/dist/ncat-7.60-1.x86_64.rpm` +- 当前时间(201812)最新版本下载:`wget https://nmap.org/dist/ncat-7.70-1.x86_64.rpm` +- 安装:`sudo rpm -i ncat-7.60-1.x86_64.rpm` +- ln 下:`sudo ln -s /usr/bin/ncat /usr/bin/nc` +- 检验:`nc --version` +- 启动监听 9011 端口:`nc -lk 9011`,然后你可以输入内容,Flink demo 看是否有收到 + +------------------------------------------------------------------- + + +## Flink 核心概念 + +- 四个基石:Checkpoint、State、Time、Window +- 解决 exactly-once 的问题 +- 实现了 watermark 的机制,解决了基于事件时间处理时的数据乱序和数据迟到的问题 +- 状态管理 +- 提供了一套开箱即用的窗口操作,包括滚动窗口、滑动窗口、会话窗口 +- 我想说的,都被这篇文章说了: + - + - +- 这里补充点其他的 + + +``` +Client 用来提交任务给 JobManager,JobManager 分发任务给 TaskManager 去执行,然后 TaskManager 会心跳的汇报任务状态 +在 Flink 集群中,计算资源被定义为 Task Slot +每个 TaskManager 会拥有一个或多个 Slots + +JobManager 会以 Slot 为单位调度 Task。 +对 Flink 的 JobManager 来说,其调度的是一个 Pipeline 的 Task,而不是一个点。 +在 Flink 中其也是一个被整体调度的 Pipeline Task。在 TaskManager 中,根据其所拥有的 Slot 个数,同时会拥有多个 Pipeline + + +Task Slot +在架构概览中我们介绍了 TaskManager 是一个 JVM 进程,并会以独立的线程来执行一个task或多个subtask。为了控制一个 TaskManager 能接受多少个 task,Flink 提出了 Task Slot 的概念。 + +Flink 中的计算资源通过 Task Slot 来定义。每个 task slot 代表了 TaskManager 的一个固定大小的资源子集。例如,一个拥有3个slot的 TaskManager,会将其管理的内存平均分成三分分给各个 slot。将资源 slot 化意味着来自不同job的task不会为了内存而竞争,而是每个task都拥有一定数量的内存储备。需要注意的是,这里不会涉及到CPU的隔离,slot目前仅仅用来隔离task的内存。 +通过调整 task slot 的数量,用户可以定义task之间是如何相互隔离的。每个 TaskManager 有一个slot,也就意味着每个task运行在独立的 JVM 中。每个 TaskManager 有多个slot的话,也就是说多个task运行在同一个JVM中。而在同一个JVM进程中的task,可以共享TCP连接(基于多路复用)和心跳消息,可以减少数据的网络传输。也能共享一些数据结构,一定程度上减少了每个task的消耗。 + +每一个 TaskManager 会拥有一个或多个的 task slot,每个 slot 都能跑由多个连续 task 组成的一个 pipeline,比如 MapFunction 的第n个并行实例和 ReduceFunction 的第n个并行实例可以组成一个 pipeline。 + +source(Streaming 进来) +Transformations(Streaming 处理) +sink(Streaming 出去) + +Flink程序与生俱来的就是并行和分布式的。Streams被分割成stream patition, Operators被被分割成operator subtasks。这些subtasks在不同的机器(容器)上的不同的线程中运行,彼此独立,互不干扰。 一个操作的operator subtask的数目,被称为parallelism(并行度)。一个stream的并行度,总是等于生成它的(operator)操作的并行度。一个Flink程序中,不同的operator可能具有不同的并行度。 +``` + +------------------------------------------------------------------- + + +#### 为了容错的 Checkpoint 机制 + +- 这几篇文章写得很好: + - [Flink 增量式checkpoint 介绍](https://my.oschina.net/u/992559/blog/2873828) + - [A Deep Dive into Rescalable State in Apache Flink](https://flink.apache.org/features/2017/07/04/flink-rescalable-state.html) + - [Flink 小贴士 (5): Savepoint 和 Checkpoint 的 3 个不同点](http://wuchong.me/blog/2018/11/25/flink-tips-differences-between-savepoints-and-checkpoints/) + - [Flink 小贴士 (2):Flink 如何管理 Kafka 消费位点](http://wuchong.me/blog/2018/11/04/how-apache-flink-manages-kafka-consumer-offsets/) +- Checkpoint 允许 Flink 恢复流中的状态和位置,使应用程序具有与无故障执行相同的语义 +- Checkpoint 是 Flink 用来从故障中恢复的机制,快照下了整个应用程序的状态,当然也包括输入源读取到的位点。如果发生故障,Flink 将通过从 Checkpoint 加载应用程序状态并从恢复的读取位点继续应用程序的处理,就像什么事情都没发生一样。 + + +``` +一个checkpoint是Flink的一致性快照,它包括: + +程序当前的状态 +输入流的位置 +Flink通过一个可配置的时间,周期性的生成checkpoint,将它写入到存储中,例如S3或者HDFS。写入到存储的过程是异步的,意味着Flink程序在checkpoint运行的同时还可以处理数据。 + +在机器或者程序遇到错误重启的时候,Flink程序会使用最新的checkpoint进行恢复。Flink会恢复程序的状态,将输入流回滚到checkpoint保存的位置,然后重新开始运行。这意味着Flink可以像没有发生错误一样计算结果。 + +检查点(Checkpoint)是使 Apache Flink 能从故障恢复的一种内部机制。检查点是 Flink 应用状态的一个一致性副本,包括了输入的读取位点。在发生故障时,Flink 通过从检查点加载应用程序状态来恢复,并从恢复的读取位点继续处理,就好像什么事情都没发生一样。你可以把检查点想象成电脑游戏的存档一样。如果你在游戏中发生了什么事情,你可以随时读档重来一次。 +检查点使得 Apache Flink 具有容错能力,并确保了即时发生故障也能保证流应用程序的语义。检查点是以固定的间隔来触发的,该间隔可以在应用中配置。 + +``` + +- 默认情况下 checkpoint 是不启用的,为了启用 checkpoint,需要在 StreamExecutionEnvironment 中调用 enableCheckpointing(n) 方法, 其中 n 是 checkpoint 的间隔毫秒数。 +- 这里有一个核心:用到 Facebook 的 RocksDB 数据库(可嵌入式的支持持久化的 key-value 存储系统) + + +------------------------------------------------------------------- + +#### Exactly-Once + +- 因为有了 Checkpoint,才有了 Exactly-Once +- [Apache Flink 端到端(end-to-end)Exactly-Once特性概览 (翻译)](https://my.oschina.net/u/992559/blog/1819948) +- 常见有这几种语义: + +``` +at most once : 至多一次。可能导致消息丢失。 +at least once : 至少一次。可能导致消息重复。 +exactly once : 刚好一次。不丢失也不重复。 +``` + + +------------------------------------------------------------------- + + +#### Watermark + +- [Flink 小贴士 (3): 轻松理解 Watermark](http://wuchong.me/blog/2018/11/18/flink-tips-watermarks-in-apache-flink-made-easy/) +- 了解事件时间的几个概念:event-time【消息产生的时间】, processing-time【消息处理时间】, ingestion-time【消息流入 flink 框架的时间】 +- watermark 的作用,他们定义了何时不再等待更早的数据 +- WaterMark 只在时间特性 EventTime 和 IngestionTime 起作用,并且 IngestionTime 的时间等同于消息的 ingestion 时间 + +------------------------------------------------------------------- + +#### 窗口 + +- +- [Flink 原理与实现:Window 机制](http://wuchong.me/blog/2016/05/25/flink-internals-window-mechanism/) +- [Flink 原理与实现:Session Window](http://wuchong.me/blog/2016/06/06/flink-internals-session-window/) + +##### 滚动窗口(Tumbling Windows) + +- 滚动窗口有一个固定的大小,并且不会出现重叠 + +###### 滚动事件时间窗口 + +``` +input + .keyBy() + .window(TumblingEventTimeWindows.of(Time.seconds(5))) + .(); +``` + +- 每日偏移8小时的滚动事件时间窗口 + +``` +input + .keyBy() + .window(TumblingEventTimeWindows.of(Time.days(1), Time.hours(-8))) + .(); +``` + +###### 滚动处理时间窗口 + +``` +input + .keyBy() + .window(TumblingProcessingTimeWindows.of(Time.seconds(5))) + .(); +``` + +--------------------------------- + +##### 滑动窗口(Sliding Windows) + +- 滑动窗口分配器将元素分配到固定长度的窗口中,与滚动窗口类似,窗口的大小由窗口大小参数来配置,另一个窗口滑动参数控制滑动窗口开始的频率。因此,滑动窗口如果滑动参数小于滚动参数的话,窗口是可以重叠的,在这种情况下元素会被分配到多个窗口中。 +- 例如,你有10分钟的窗口和5分钟的滑动,那么每个窗口中5分钟的窗口里包含着上个10分钟产生的数据 + +###### 滑动事件时间窗口 + +``` +input + .keyBy() + .window(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5))) + .(); +``` + +###### 滑动处理时间窗口 + +``` +input + .keyBy() + .window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5))) + .(); +``` + +- 偏移8小时的滑动处理时间窗口 + +``` +input + .keyBy() + .window(SlidingProcessingTimeWindows.of(Time.hours(12), Time.hours(1), Time.hours(-8))) + .(); +``` + +--------------------------------- + +##### 计数窗口(Count Window) + +- 根据元素个数对数据流进行分组的 + +###### 翻滚计数窗口 + +- 当我们想要每 100 个用户购买行为事件统计购买总数,那么每当窗口中填满 100 个元素了,就会对窗口进行计算,这种窗口我们称之为翻滚计数窗口(Tumbling Count Window) + +``` +input + .keyBy() + .countWindow(100) + .(); +``` + +--------------------------------- + + +##### 会话窗口(Session Windows) + +- session 窗口分配器通过 session 活动来对元素进行分组,session 窗口跟滚动窗口和滑动窗口相比,不会有重叠和固定的开始时间和结束时间的情况。相反,当它在一个固定的时间周期内不再收到元素,即非活动间隔产生,那个这个窗口就会关闭。一个 session 窗口通过一个 session 间隔来配置,这个 session 间隔定义了非活跃周期的长度。当这个非活跃周期产生,那么当前的 session 将关闭并且后续的元素将被分配到新的 session 窗口中去。 + +###### 事件时间会话窗口 + +``` +input + .keyBy() + .window(EventTimeSessionWindows.withGap(Time.minutes(10))) + .(); +``` + +###### 处理时间会话窗口 + +``` +input + .keyBy() + .window(ProcessingTimeSessionWindows.withGap(Time.minutes(10))) + .(); +``` + +--------------------------------- + +##### 全局窗口(Global Windows) + +- 全局窗口分配器将所有具有相同 key 的元素分配到同一个全局窗口中,这个窗口模式仅适用于用户还需自定义触发器的情况。否则,由于全局窗口没有一个自然的结尾,无法执行元素的聚合,将不会有计算被执行。 + +``` +input + .keyBy() + .window(GlobalWindows.create()) + .(); +``` + +------------------------------------------------------------------- + + +#### 生产环境准备 + +- [Flink 小贴士 (7): 4个步骤,让 Flink 应用达到生产状态](http://wuchong.me/blog/2018/12/03/flink-tips-4-steps-flink-application-production-ready/) + +------------------------------------------------------------------- + + +#### 运行环境 + + +- Flink 的部署 +- Flink 有三种部署模式,分别是 Local、Standalone Cluster 和 Yarn Cluster。 +- 对于 Local 模式来说,JobManager 和 TaskManager 会公用一个 JVM 来完成 Workload。 +- 如果要验证一个简单的应用,Local 模式是最方便的。实际应用中大多使用 Standalone 或者 Yarn Cluster + +------------------------------------------------------------------- + +#### Flink 的 HA + +------------------------------------------------------------------- + +#### Monitoring REST API + +https://ci.apache.org/projects/flink/flink-docs-stable/monitoring/rest_api.html#monitoring-rest-api + +------------------------------------------------------------------- + +#### 主要核心 API + +- 官网 API 文档: +- DataStream API -- Stream Processing +- DataSet API -- Batch Processing +- Kafka source + - Kafka Connectors +- Elasticsearch sink + +------------------------------------------------------------------- + +#### Table & SQL API(关系型 API) + +Table API:为Java&Scala SDK提供类似于LINQ(语言集成查询)模式的API(自0.9.0版本开始) +SQL API:支持标准SQL(自1.1.0版本开始) + + +关系型API作为一个统一的API层,既能够做到在Batch模式的表上进行可终止地查询并生成有限的结果集,同时也能做到在Streaming模式的表上持续地运行并生产结果流,并且在两种模式的表上的查询具有相同的语法跟语义。这其中最重要的概念是Table,Table与DataSet、DataStream紧密结合,DataSet和DataStream都可以很容易地转换成Table,同样转换回来也很方便。 + +关系型API架构在基础的DataStream、DataSet API之上,其整体层次关系如下图所示: + +![table-sql-level](http://7xkaaz.com1.z0.glb.clouddn.com/table-sql-level.png) + +------------------------------------------------------------------- + + +## 资料 + +- [新一代大数据处理引擎 Apache Flink](https://www.ibm.com/developerworks/cn/opensource/os-cn-apache-flink/index.html) +- [Flink-关系型API简介](http://vinoyang.com/2017/07/06/flink-relation-api-introduction/) +- [Flink学习笔记(4):基本概念](https://www.jianshu.com/p/0cd1db4282be) +- [Apache Flink:特性、概念、组件栈、架构及原理分析](http://shiyanjun.cn/archives/1508.html) +- [Flink 原理与实现:理解 Flink 中的计算资源](http://wuchong.me/blog/2016/05/09/flink-internals-understanding-execution-resources/) +- [Flink实战教程](https://liguohua-bigdata.gitbooks.io/simple-flink/content/) + diff --git a/markdown-file/Gitlab-Install-And-Settings.md b/markdown-file/Gitlab-Install-And-Settings.md index f8f3eaab..c9a4c1e3 100644 --- a/markdown-file/Gitlab-Install-And-Settings.md +++ b/markdown-file/Gitlab-Install-And-Settings.md @@ -51,40 +51,27 @@ gitlab-postgresql: - 本质就是把文件、缓存、数据库抽离出来,然后部署多个 Gitlab 用 nginx 前面做负载。 -## 原始安装方式 +## 原始安装方式(推荐) -- 环境: - - CPU:1 core - - 内存:2G -- 我习惯使用 root 用户 +- 推荐至少内存 4G,它有大量组件 - 有开源版本和收费版本,各版本比较: - 官网: - 中文网: - 官网下载: -- 安装的系统环境要求: - - 从文章看目前要求 ruby 2.3,用 yum 版本过低,那就源码安装 ruby 吧,官网当前最新是:2.4.1(大小:14M) - 官网安装说明: -- 安装 ruby - - 下载: - - 解压:`tar zxvf ruby-2.4.1.tar.gz` - - 编译安装: - - `cd ruby-2.4.1` - - `./configure` - - `make`,过程有点慢 - - `make install` - - 默认安装到这个目录:`/usr/local` - - 查看当前版本号:`ruby -v` -- CentOS 6 安装流程: - - 当前(201703)的版本是:`GitLab Community Edition 9.0.0` - - `sudo yum install -y curl openssh-server openssh-clients postfix cronie` - - `sudo service postfix start` - - `sudo chkconfig postfix on` - - `sudo lokkit -s http -s ssh` - - `curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash` - - `sudo yum install gitlab-ce`,软件大小:272M,下载速度不稳定 - - `sudo gitlab-ctl reconfigure`,这个过程比较慢 - 如果上面的下载比较慢,也有国内的镜像: - 清华: +- 参考: + +``` +sudo yum install -y curl policycoreutils-python openssh-server + +sudo systemctl enable sshd +sudo systemctl start sshd + +curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash +sudo EXTERNAL_URL="http://192.168.1.123:8181" yum install -y gitlab-ce +``` ## 配置 @@ -92,7 +79,10 @@ gitlab-postgresql: - 配置域名 / IP - 编辑配置文件:`sudo vim /etc/gitlab/gitlab.rb` - 找到 13 行左右:`external_url 'http://gitlab.example.com'`,改为你的域名 / IP - - 重启服务:`sudo gitlab-ctl reconfigure` + - 刷新配置:`sudo gitlab-ctl reconfigure`,第一次这个时间会比较久,我花了好几分钟 + - 启动服务:`sudo gitlab-ctl start` + - 停止服务:`sudo gitlab-ctl stop` + - 重启服务:`sudo gitlab-ctl restart` - 前面的初始化配置完成之后,访问当前机子 IP:`http://192.168.1.111:80` - 默认用户是 `root`,并且没有密码,所以第一次访问是让你设置你的 root 密码,我设置为:gitlab123456(至少 8 位数) - 设置会初始化密码之后,你就需要登录了。输入设置的密码。 @@ -234,6 +224,69 @@ gitlab-postgresql: - +## 接入第三方登录 + +- 官网文档: + - + - + - + +- gitlab 自己本身维护一套用户系统,第三方认证服务一套用户系统,gitlab 可以将两者关联起来,然后用户可以选择其中一种方式进行登录而已。 +- 所以,gitlab 第三方认证只能用于网页登录,clone 时仍然使用用户在 gitlab 的账户密码,推荐使用 ssh-key 来操作仓库,不再使用账户密码。 +- 重要参数:block_auto_created_users=true 的时候则自动注册的账户是被锁定的,需要管理员账户手动的为这些账户解锁,可以改为 false +- 编辑配置文件引入第三方:`sudo vim /etc/gitlab/gitlab.rb`,在 309 行有默认的一些注释配置 + - 其中 oauth2_generic 模块默认是没有,需要自己 gem,其他主流的那些都自带,配置即可使用。 + +``` +gitlab_rails['omniauth_enabled'] = true +gitlab_rails['omniauth_allow_single_sign_on'] = ['google_oauth2', 'facebook', 'twitter', 'oauth2_generic'] +gitlab_rails['omniauth_block_auto_created_users'] = false +gitlab_rails['omniauth_sync_profile_attributes'] = ['email','username'] +gitlab_rails['omniauth_external_providers'] = ['google_oauth2', 'facebook', 'twitter', 'oauth2_generic'] +gitlab_rails['omniauth_providers'] = [ + { + "name"=> "google_oauth2", + "label"=> "Google", + "app_id"=> "123456", + "app_secret"=> "123456", + "args"=> { + "access_type"=> 'offline', + "approval_prompt"=> '123456' + } + }, + { + "name"=> "facebook", + "label"=> "facebook", + "app_id"=> "123456", + "app_secret"=> "123456" + }, + { + "name"=> "twitter", + "label"=> "twitter", + "app_id"=> "123456", + "app_secret"=> "123456" + }, + { + "name" => "oauth2_generic", + "app_id" => "123456", + "app_secret" => "123456", + "args" => { + client_options: { + "site" => "http://sso.cdk8s.com:9090/sso", + "user_info_url" => "/oauth/userinfo" + }, + user_response_structure: { + root_path: ["user_attribute"], + attributes: { + "nickname": "username" + } + } + } + } +] + +``` + ## 资料 diff --git a/markdown-file/Glances-Install-And-Settings.md b/markdown-file/Glances-Install-And-Settings.md new file mode 100644 index 00000000..9b4255b2 --- /dev/null +++ b/markdown-file/Glances-Install-And-Settings.md @@ -0,0 +1,68 @@ +# Glances 安装和配置 + +## Glances 介绍 + +- 相对 top、htop,它比较重,因此内容也比较多。小机子一般不建议安装。大机子一般也不建议一直开着。 +- 官网: +- 官网 Github: +- 官网文档: +- 当前(201810)最新版本为 3.0.2 + + +## Glances Linux 安装 + +- `curl -L https://bit.ly/glances | /bin/bash` +- 需要 5 ~ 10 分钟左右。 + +## 用法 + +#### 本地监控 + +- 进入实时监控面板(默认 3 秒一次指标):`glances` +- 每间隔 5 秒获取一次指标:`glances -t 5` +- 在控制面板中可以按快捷键进行排序、筛选 + +``` +m : 按内存占用排序进程 +p : 按进程名称排序进程 +c : 按 CPU 占用率排序进程 +i : 按 I/O 频率排序进程 +a : 自动排序进程 +d : 显示/隐藏磁盘 I/O 统计信息 +f : 显示/隐藏文件系统统计信息 +s : 显示/隐藏传感器统计信息 +y : 显示/隐藏硬盘温度统计信息 +l : 显示/隐藏日志 +n : 显示/隐藏网络统计信息 +x : 删除警告和严重日志 +h : 显示/隐藏帮助界面 +q : 退出 +w : 删除警告记录 +``` + + +#### 监控远程机子 + +- 这里面的检控方和被监控的概念要弄清楚 +- 作为服务端的机子运行(也就是被监控方):`glances -s` + - 假设它的 IP 为:192.168.1.44 + - 必需打开 61209 端口 +- 作为客户端的机子运行(要查看被检控方的数据):`glances -c 192.168.1.44` + - 这时候控制台输出的内容是被监控机子的数据 + + +## 导出数据 + +- 个人测试没效果,后续再看下吧。 +- 官网文档: +- 导出 CSV:`glances --export-csv /tmp/glances.csv` +- 导出 JSON:`glances --export-json /tmp/glances.json` + +## 资料 + +- +- +- +- +- +- diff --git a/markdown-file/Grafana-Install-And-Settings.md b/markdown-file/Grafana-Install-And-Settings.md new file mode 100644 index 00000000..c0c12ae3 --- /dev/null +++ b/markdown-file/Grafana-Install-And-Settings.md @@ -0,0 +1,126 @@ +# Grafana 安装和配置 + + +## 对于版本 + +- [支持的 Elasticsearch 版本](http://docs.grafana.org/features/datasources/elasticsearch/#elasticsearch-version) + + +## Grafana Docker 安装 + +- 官网: + +``` +mkdir -p /data/docker/grafana/data +chmod 777 -R /data/docker/grafana/data + +docker run -d --name grafana -p 3000:3000 -v /data/docker/grafana/data:/var/lib/grafana grafana/grafana + +docker exec -it grafana /bin/bash + +容器中默认的配置文件位置:/etc/grafana/grafana.ini +复制出配置文件到宿主机:docker cp grafana:/etc/grafana/grafana.ini /Users/gitnavi/ +``` + +- +- 默认管理账号;admin,密码:admin,第一次登录后需要修改密码,也可以通过配置文件修改 + +``` +[security] +admin_user = admin +admin_password = admin +``` +---------------------------------------------------------------------------------------------- + +## Grafana 安装 + +- CentOS 7.4 +- rpm 文件包大小 53M +- 所需内存:300M 左右 +- 官网下载: +- 官网指导: + +``` +sudo yum install -y initscripts fontconfig urw-fonts +wget https://dl.grafana.com/oss/release/grafana-5.4.0-1.x86_64.rpm +sudo yum localinstall -y grafana-5.4.0-1.x86_64.rpm +``` + + +- 启动 Grafana 服务(默认是不启动的) + +``` +sudo systemctl start grafana-server +sudo systemctl status grafana-server +``` + +- 将 Grafana 服务设置为开机启动:`sudo systemctl enable grafana-server` +- 开放端口:`firewall-cmd --add-port=3000/tcp --permanent` +- 重新加载防火墙配置:`firewall-cmd --reload` +- 访问: +- 默认管理账号;admin,密码:admin,登录后需要修改密码 + +---------------------------------------------------------------------------------------------- + +## 配置 + +- 官网指导: +- 安装包默认安装后的一些路径 + - 二进制文件:`/usr/sbin/grafana-server` + - init.d 脚本:`/etc/init.d/grafana-server` + - 配置文件:`/etc/grafana/grafana.ini` + - 日志文件:`/var/log/grafana/grafana.log` + - 插件目录是:`/var/lib/grafana/plugins` + - 默认配置的 sqlite3 数据库:`/var/lib/grafana/grafana.db` +- 最重要的配置文件:`vim /etc/grafana/grafana.ini` + - 可以修改用户名和密码 + - 端口 + - 数据路径 + - 数据库配置 + - 第三方认证 + - Session 有效期 +- 添加数据源: +- 添加组织: +- 添加用户: +- 添加插件: +- 个性化设置: +- 软件变量: + +## 官网 dashboard + +- dashboar仓库地址: +- 本地可以通过输入 dashboard id 导入别人模板 +- 打开: + - 输入对应的 id,点击 Load 即可 + +---------------------------------------------------------------------------------------------- + +## 数据源 + +#### Elasticsearch + +使用: +- +- +- <> +- <> +- <> +- <> + + +---------------------------------------------------------------------------------------------- + + +## 其他资料 + +- +- <> +- <> +- <> +- <> +- <> +- <> +- <> +- <> +- <> + diff --git a/markdown-file/Hadoop-Install-And-Settings.md b/markdown-file/Hadoop-Install-And-Settings.md new file mode 100644 index 00000000..7f42810f --- /dev/null +++ b/markdown-file/Hadoop-Install-And-Settings.md @@ -0,0 +1,501 @@ +# Hadoop 安装和配置 + + +## Hadoop 说明 + +- Hadoop 官网: +- Hadoop 官网下载: + +## 基础环境 + +- 学习机器 2C4G(生产最少 8G): + - 172.16.0.17 + - 172.16.0.43 + - 172.16.0.180 +- 操作系统:CentOS 7.5 + - root 用户 +- 所有机子必备:Java:1.8 + - 确保:`echo $JAVA_HOME` 能查看到路径,并记下来路径 +- Hadoop:2.6.5 +- 关闭所有机子的防火墙:`systemctl stop firewalld.service` + +## 集群环境设置 + +- Hadoop 集群具体来说包含两个集群:HDFS 集群和 YARN 集群,两者逻辑上分离,但物理上常在一起 + - HDFS 集群:负责海量数据的存储,集群中的角色主要有 NameNode / DataNode + - YARN 集群:负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager + - HDFS 采用 master/worker 架构。一个 HDFS 集群是由一个 Namenode 和一定数目的 Datanodes 组成。Namenode 是一个中心服务器,负责管理文件系统的命名空间 (namespace) 以及客户端对文件的访问。集群中的 Datanode 一般是一个节点一个,负责管理它所在节点上的存储。 +- 分别给三台机子设置 hostname + +``` +hostnamectl --static set-hostname linux01 +hostnamectl --static set-hostname linux02 +hostnamectl --static set-hostname linux03 +``` + + +- 修改 hosts + +``` +就按这个来,其他多余的别加,不然可能也会有影响 +vim /etc/hosts +172.16.0.17 linux01 +172.16.0.43 linux02 +172.16.0.180 linux03 +``` + + +- 对 linux01 设置免密: + +``` +生产密钥对 +ssh-keygen -t rsa + + +公钥内容写入 authorized_keys +cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys + +测试: +ssh localhost + +``` + +- 将公钥复制到两台 slave + - 如果你是采用 pem 登录的,可以看这个:[SSH 免密登录](SSH-login-without-password.md) + +``` +ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@172.16.0.43,根据提示输入 linux02 机器的 root 密码,成功会有相应提示 +ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@172.16.0.180,根据提示输入 linux03 机器的 root 密码,成功会有相应提示 + + +在 linux01 上测试: +ssh linux02 +ssh linux03 + +``` + + + +## Hadoop 安装 + +- 关于版本这件事,主要看你的技术生态圈。如果你的其他技术,比如 Spark,Flink 等不支持最新版,则就只能向下考虑。 +- 我这里技术栈,目前只能到:2.6.5,所以下面的内容都是基于 2.6.5 版本 +- 官网说明: +- 分别在三台机子上都创建目录: + +``` +mkdir -p /data/hadoop/hdfs/name /data/hadoop/hdfs/data /data/hadoop/hdfs/tmp +``` + +- 下载 Hadoop: +- 现在 linux01 机子上安装 + +``` +cd /usr/local && wget http://apache.claz.org/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz +tar zxvf hadoop-2.6.5.tar.gz,有 191M 左右 +``` + +- **给三台机子都先设置 HADOOP_HOME** + - 会 ansible playbook 会方便点:[Ansible 安装和配置](Ansible-Install-And-Settings.md) + +``` +vim /etc/profile + +export HADOOP_HOME=/usr/local/hadoop-2.6.5 +export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin + +source /etc/profile +``` + + +## 修改 linux01 配置 + + +``` +修改 JAVA_HOME +vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh + +把 25 行的 +export JAVA_HOME=${JAVA_HOME} +都改为 +export JAVA_HOME=/usr/local/jdk1.8.0_191 + + +vim $HADOOP_HOME/etc/hadoop/yarn-env.sh + +文件开头加一行 export JAVA_HOME=/usr/local/jdk1.8.0_191 + +``` + +- hadoop.tmp.dir == 指定hadoop运行时产生文件的存储目录 + +``` + +vim $HADOOP_HOME/etc/hadoop/core-site.xml,改为: + + + + hadoop.tmp.dir + file:/data/hadoop/hdfs/tmp + + + io.file.buffer.size + 131072 + + + + fs.defaultFS + hdfs://linux01:9000 + + + hadoop.proxyuser.root.hosts + * + + + hadoop.proxyuser.root.groups + * + + +``` + + +- 配置包括副本数量 + - 最大值是 datanode 的个数 +- 数据存放目录 + +``` +vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml + + + + dfs.replication + 2 + + + dfs.namenode.name.dir + file:/data/hadoop/hdfs/name + true + + + dfs.datanode.data.dir + file:/data/hadoop/hdfs/data + true + + + dfs.webhdfs.enabled + true + + + dfs.permissions + false + + + +``` + + + +- 设置 YARN + +``` +新创建:vim $HADOOP_HOME/etc/hadoop/mapred-site.xml + + + + + mapreduce.framework.name + yarn + + + + mapreduce.map.memory.mb + 4096 + + + + mapreduce.reduce.memory.mb + 8192 + + + + mapreduce.map.java.opts + -Xmx3072m + + + + mapreduce.reduce.java.opts + -Xmx6144m + + + +``` + + +- yarn.resourcemanager.hostname == 指定YARN的老大(ResourceManager)的地址 +- yarn.nodemanager.aux-services == NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序默认值:"" +- 32G 内存的情况下配置: + +``` +vim $HADOOP_HOME/etc/hadoop/yarn-site.xml + + + + + yarn.resourcemanager.hostname + linux01 + + + + yarn.nodemanager.aux-services + mapreduce_shuffle + + + + yarn.nodemanager.vmem-pmem-ratio + 2.1 + + + + yarn.nodemanager.resource.memory-mb + 20480 + + + + yarn.scheduler.minimum-allocation-mb + 2048 + + + +``` + + +- 配置 slave 相关信息 + + +``` +vim $HADOOP_HOME/etc/hadoop/slaves + +把默认的配置里面的 localhost 删除,换成: +linux02 +linux03 + +``` + + +``` +scp -r /usr/local/hadoop-2.6.5 root@linux02:/usr/local/ + +scp -r /usr/local/hadoop-2.6.5 root@linux03:/usr/local/ + +``` + + +## linux01 机子运行 + +``` +格式化 HDFS +hdfs namenode -format + +``` + +- 输出结果: + +``` +[root@linux01 hadoop-2.6.5]# hdfs namenode -format +18/12/17 17:47:17 INFO namenode.NameNode: STARTUP_MSG: +/************************************************************ +STARTUP_MSG: Starting NameNode +STARTUP_MSG: host = localhost/127.0.0.1 +STARTUP_MSG: args = [-format] +STARTUP_MSG: version = 2.6.5 +STARTUP_MSG: classpath = /usr/local/hadoop-2.6.5/etc/hadoop:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/apacheds-kerberos-codec-2.0.0-M15.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-io-2.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/activation-1.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/netty-3.6.2.Final.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jackson-mapper-asl-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/slf4j-api-1.7.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/junit-4.11.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/curator-recipes-2.6.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jasper-compiler-5.5.23.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jets3t-0.9.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-lang-2.6.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-digester-1.8.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jackson-core-asl-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/apacheds-i18n-2.0.0-M15.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/guava-11.0.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/gson-2.2.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jackson-jaxrs-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jettison-1.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jetty-6.1.26.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/api-util-1.0.0-M20.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/log4j-1.2.17.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-beanutils-core-1.8.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-httpclient-3.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-el-1.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/paranamer-2.3.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-collections-3.2.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jersey-server-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-net-3.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/hadoop-auth-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jasper-runtime-5.5.23.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jaxb-impl-2.2.3-1.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/hamcrest-core-1.3.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/stax-api-1.0-2.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-beanutils-1.7.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/protobuf-java-2.5.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/curator-framework-2.6.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/xz-1.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jsr305-1.3.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jsp-api-2.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-compress-1.4.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/asm-3.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jsch-0.1.42.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-configuration-1.6.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-cli-1.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jackson-xc-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-logging-1.1.3.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/htrace-core-3.0.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jetty-util-6.1.26.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-math3-3.1.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/mockito-all-1.8.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jersey-json-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/zookeeper-3.4.6.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/httpclient-4.2.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/servlet-api-2.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/xmlenc-0.52.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/httpcore-4.2.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/api-asn1-api-1.0.0-M20.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/java-xmlbuilder-0.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/avro-1.7.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jaxb-api-2.2.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/commons-codec-1.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/jersey-core-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/snappy-java-1.0.4.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/curator-client-2.6.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/lib/hadoop-annotations-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/hadoop-common-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/hadoop-common-2.6.5-tests.jar:/usr/local/hadoop-2.6.5/share/hadoop/common/hadoop-nfs-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/commons-io-2.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/netty-3.6.2.Final.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/jackson-mapper-asl-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/commons-lang-2.6.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/commons-daemon-1.0.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/jackson-core-asl-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/guava-11.0.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/jetty-6.1.26.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/log4j-1.2.17.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/commons-el-1.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/xercesImpl-2.9.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/jersey-server-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/jasper-runtime-5.5.23.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/protobuf-java-2.5.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/jsr305-1.3.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/xml-apis-1.3.04.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/jsp-api-2.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/asm-3.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/commons-cli-1.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/commons-logging-1.1.3.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/htrace-core-3.0.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/jetty-util-6.1.26.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/servlet-api-2.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/xmlenc-0.52.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/commons-codec-1.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/lib/jersey-core-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/hadoop-hdfs-2.6.5-tests.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/hadoop-hdfs-nfs-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/hdfs/hadoop-hdfs-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/commons-io-2.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/activation-1.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/aopalliance-1.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/netty-3.6.2.Final.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jackson-mapper-asl-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/commons-lang-2.6.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jackson-core-asl-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/guice-3.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/guava-11.0.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jackson-jaxrs-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jettison-1.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jetty-6.1.26.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/log4j-1.2.17.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/commons-httpclient-3.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/commons-collections-3.2.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jersey-server-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jaxb-impl-2.2.3-1.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/stax-api-1.0-2.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/protobuf-java-2.5.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/xz-1.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jsr305-1.3.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jersey-client-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/guice-servlet-3.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/commons-compress-1.4.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/asm-3.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/commons-cli-1.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jersey-guice-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jackson-xc-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/commons-logging-1.1.3.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jetty-util-6.1.26.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/leveldbjni-all-1.8.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jersey-json-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/javax.inject-1.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/zookeeper-3.4.6.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/servlet-api-2.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jaxb-api-2.2.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jline-0.9.94.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/commons-codec-1.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/lib/jersey-core-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-server-web-proxy-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-api-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-server-common-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-registry-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-server-nodemanager-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-client-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-common-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-applications-unmanaged-am-launcher-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-server-tests-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-server-resourcemanager-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-server-applicationhistoryservice-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/yarn/hadoop-yarn-applications-distributedshell-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/commons-io-2.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/aopalliance-1.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/netty-3.6.2.Final.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/jackson-mapper-asl-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/junit-4.11.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/jackson-core-asl-1.9.13.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/guice-3.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/log4j-1.2.17.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/paranamer-2.3.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/jersey-server-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/hamcrest-core-1.3.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/protobuf-java-2.5.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/xz-1.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/guice-servlet-3.0.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/commons-compress-1.4.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/asm-3.2.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/jersey-guice-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/leveldbjni-all-1.8.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/javax.inject-1.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/avro-1.7.4.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/jersey-core-1.9.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/snappy-java-1.0.4.1.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/lib/hadoop-annotations-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-client-app-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-client-shuffle-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-client-hs-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-client-hs-plugins-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.6.5-tests.jar:/usr/local/hadoop-2.6.5/contrib/capacity-scheduler/*.jar +STARTUP_MSG: build = https://github.com/apache/hadoop.git -r e8c9fe0b4c252caf2ebf1464220599650f119997; compiled by 'sjlee' on 2016-10-02T23:43Z +STARTUP_MSG: java = 1.8.0_191 +************************************************************/ +18/12/17 17:47:17 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT] +18/12/17 17:47:17 INFO namenode.NameNode: createNameNode [-format] +Formatting using clusterid: CID-beba43b4-0881-48b4-8eda-5c3bca046398 +18/12/17 17:47:17 INFO namenode.FSNamesystem: No KeyProvider found. +18/12/17 17:47:17 INFO namenode.FSNamesystem: fsLock is fair:true +18/12/17 17:47:17 INFO blockmanagement.DatanodeManager: dfs.block.invalidate.limit=1000 +18/12/17 17:47:17 INFO blockmanagement.DatanodeManager: dfs.namenode.datanode.registration.ip-hostname-check=true +18/12/17 17:47:17 INFO blockmanagement.BlockManager: dfs.namenode.startup.delay.block.deletion.sec is set to 000:00:00:00.000 +18/12/17 17:47:17 INFO blockmanagement.BlockManager: The block deletion will start around 2018 Dec 17 17:47:17 +18/12/17 17:47:17 INFO util.GSet: Computing capacity for map BlocksMap +18/12/17 17:47:17 INFO util.GSet: VM type = 64-bit +18/12/17 17:47:17 INFO util.GSet: 2.0% max memory 889 MB = 17.8 MB +18/12/17 17:47:17 INFO util.GSet: capacity = 2^21 = 2097152 entries +18/12/17 17:47:17 INFO blockmanagement.BlockManager: dfs.block.access.token.enable=false +18/12/17 17:47:17 INFO blockmanagement.BlockManager: defaultReplication = 2 +18/12/17 17:47:17 INFO blockmanagement.BlockManager: maxReplication = 512 +18/12/17 17:47:17 INFO blockmanagement.BlockManager: minReplication = 1 +18/12/17 17:47:17 INFO blockmanagement.BlockManager: maxReplicationStreams = 2 +18/12/17 17:47:17 INFO blockmanagement.BlockManager: replicationRecheckInterval = 3000 +18/12/17 17:47:17 INFO blockmanagement.BlockManager: encryptDataTransfer = false +18/12/17 17:47:17 INFO blockmanagement.BlockManager: maxNumBlocksToLog = 1000 +18/12/17 17:47:17 INFO namenode.FSNamesystem: fsOwner = root (auth:SIMPLE) +18/12/17 17:47:17 INFO namenode.FSNamesystem: supergroup = supergroup +18/12/17 17:47:17 INFO namenode.FSNamesystem: isPermissionEnabled = false +18/12/17 17:47:17 INFO namenode.FSNamesystem: HA Enabled: false +18/12/17 17:47:17 INFO namenode.FSNamesystem: Append Enabled: true +18/12/17 17:47:17 INFO util.GSet: Computing capacity for map INodeMap +18/12/17 17:47:17 INFO util.GSet: VM type = 64-bit +18/12/17 17:47:17 INFO util.GSet: 1.0% max memory 889 MB = 8.9 MB +18/12/17 17:47:17 INFO util.GSet: capacity = 2^20 = 1048576 entries +18/12/17 17:47:17 INFO namenode.NameNode: Caching file names occuring more than 10 times +18/12/17 17:47:17 INFO util.GSet: Computing capacity for map cachedBlocks +18/12/17 17:47:17 INFO util.GSet: VM type = 64-bit +18/12/17 17:47:17 INFO util.GSet: 0.25% max memory 889 MB = 2.2 MB +18/12/17 17:47:17 INFO util.GSet: capacity = 2^18 = 262144 entries +18/12/17 17:47:17 INFO namenode.FSNamesystem: dfs.namenode.safemode.threshold-pct = 0.9990000128746033 +18/12/17 17:47:17 INFO namenode.FSNamesystem: dfs.namenode.safemode.min.datanodes = 0 +18/12/17 17:47:17 INFO namenode.FSNamesystem: dfs.namenode.safemode.extension = 30000 +18/12/17 17:47:17 INFO namenode.FSNamesystem: Retry cache on namenode is enabled +18/12/17 17:47:17 INFO namenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cache entry expiry time is 600000 millis +18/12/17 17:47:17 INFO util.GSet: Computing capacity for map NameNodeRetryCache +18/12/17 17:47:17 INFO util.GSet: VM type = 64-bit +18/12/17 17:47:17 INFO util.GSet: 0.029999999329447746% max memory 889 MB = 273.1 KB +18/12/17 17:47:17 INFO util.GSet: capacity = 2^15 = 32768 entries +18/12/17 17:47:17 INFO namenode.NNConf: ACLs enabled? false +18/12/17 17:47:17 INFO namenode.NNConf: XAttrs enabled? true +18/12/17 17:47:17 INFO namenode.NNConf: Maximum size of an xattr: 16384 +18/12/17 17:47:17 INFO namenode.FSImage: Allocated new BlockPoolId: BP-233285725-127.0.0.1-1545040037972 +18/12/17 17:47:18 INFO common.Storage: Storage directory /data/hadoop/hdfs/name has been successfully formatted. +18/12/17 17:47:18 INFO namenode.FSImageFormatProtobuf: Saving image file /data/hadoop/hdfs/name/current/fsimage.ckpt_0000000000000000000 using no compression +18/12/17 17:47:18 INFO namenode.FSImageFormatProtobuf: Image file /data/hadoop/hdfs/name/current/fsimage.ckpt_0000000000000000000 of size 321 bytes saved in 0 seconds. +18/12/17 17:47:18 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0 +18/12/17 17:47:18 INFO util.ExitUtil: Exiting with status 0 +18/12/17 17:47:18 INFO namenode.NameNode: SHUTDOWN_MSG: +/************************************************************ +SHUTDOWN_MSG: Shutting down NameNode at localhost/127.0.0.1 +************************************************************/ + +``` + +## HDFS 启动 + +- 启动:start-dfs.sh,根据提示一路 yes + +``` +这个命令效果: +主节点会启动任务:NameNode 和 SecondaryNameNode +从节点会启动任务:DataNode + + +主节点查看:jps,可以看到: +21922 Jps +21603 NameNode +21787 SecondaryNameNode + + +从节点查看:jps 可以看到: +19728 DataNode +19819 Jps +``` + + +- 查看运行更多情况:`hdfs dfsadmin -report` + +``` +Configured Capacity: 0 (0 B) +Present Capacity: 0 (0 B) +DFS Remaining: 0 (0 B) +DFS Used: 0 (0 B) +DFS Used%: NaN% +Under replicated blocks: 0 +Blocks with corrupt replicas: 0 +Missing blocks: 0 +``` + +- 如果需要停止:`stop-dfs.sh` +- 查看 log:`cd $HADOOP_HOME/logs` + + +## YARN 运行 + +``` +start-yarn.sh +然后 jps 你会看到一个:ResourceManager + +从节点你会看到:NodeManager + +停止:stop-yarn.sh + +``` + +## 端口情况 + +- 主节点当前运行的所有端口:`netstat -tpnl | grep java` +- 会用到端口(为了方便展示,整理下顺序): + +``` +tcp 0 0 172.16.0.17:9000 0.0.0.0:* LISTEN 22932/java >> NameNode +tcp 0 0 0.0.0.0:50070 0.0.0.0:* LISTEN 22932/java >> NameNode +tcp 0 0 0.0.0.0:50090 0.0.0.0:* LISTEN 23125/java >> SecondaryNameNode +tcp6 0 0 172.16.0.17:8030 :::* LISTEN 23462/java >> ResourceManager +tcp6 0 0 172.16.0.17:8031 :::* LISTEN 23462/java >> ResourceManager +tcp6 0 0 172.16.0.17:8032 :::* LISTEN 23462/java >> ResourceManager +tcp6 0 0 172.16.0.17:8033 :::* LISTEN 23462/java >> ResourceManager +tcp6 0 0 172.16.0.17:8088 :::* LISTEN 23462/java >> ResourceManager +``` + +- 从节点当前运行的所有端口:`netstat -tpnl | grep java` +- 会用到端口(为了方便展示,整理下顺序): + +``` +tcp 0 0 0.0.0.0:50010 0.0.0.0:* LISTEN 14545/java >> DataNode +tcp 0 0 0.0.0.0:50020 0.0.0.0:* LISTEN 14545/java >> DataNode +tcp 0 0 0.0.0.0:50075 0.0.0.0:* LISTEN 14545/java >> DataNode +tcp6 0 0 :::8040 :::* LISTEN 14698/java >> NodeManager +tcp6 0 0 :::8042 :::* LISTEN 14698/java >> NodeManager +tcp6 0 0 :::13562 :::* LISTEN 14698/java >> NodeManager +tcp6 0 0 :::37481 :::* LISTEN 14698/java >> NodeManager +``` + +------------------------------------------------------------------- + +## 管理界面 + +- 查看 HDFS NameNode 管理界面: +- 访问 YARN ResourceManager 管理界面: +- 访问 NodeManager-1 管理界面: +- 访问 NodeManager-2 管理界面: + + +------------------------------------------------------------------- + +## 运行作业 + +- 在主节点上操作 +- 运行一个 Mapreduce 作业试试: + - 计算 π:`hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar pi 5 10` +- 运行一个文件相关作业: + - 由于运行 hadoop 时指定的输入文件只能是 HDFS 文件系统中的文件,所以我们必须将要进行 wordcount 的文件从本地文件系统拷贝到 HDFS 文件系统中。 + - 查看目前根目录结构:`hadoop fs -ls /` + - 查看目前根目录结构,另外写法:`hadoop fs -ls hdfs://linux-05:9000/` + - 或者列出目录以及下面的文件:`hadoop fs -ls -R /` + - 更多命令可以看:[hadoop HDFS常用文件操作命令](https://segmentfault.com/a/1190000002672666) + - 创建目录:`hadoop fs -mkdir -p /tmp/zch/wordcount_input_dir` + - 上传文件:`hadoop fs -put /opt/input.txt /tmp/zch/wordcount_input_dir` + - 查看上传的目录下是否有文件:`hadoop fs -ls /tmp/zch/wordcount_input_dir` + - 向 yarn 提交作业,计算单词个数:`hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /tmp/zch/wordcount_input_dir /tmp/zch/wordcount_output_dir` + - 查看计算结果输出的目录:`hadoop fs -ls /tmp/zch/wordcount_output_dir` + - 查看计算结果输出内容:`hadoop fs -cat /tmp/zch/wordcount_output_dir/part-r-00000` +- 查看正在运行的 Hadoop 任务:`yarn application -list` +- 关闭 Hadoop 任务进程:`yarn application -kill 你的ApplicationId` + + +------------------------------------------------------------------- + +## 资料 + +- [如何正确的为 MapReduce 配置内存分配](http://loupipalien.com/2018/03/how-to-properly-configure-the-memory-allocations-for-mapreduce/) +- +- +- +- \ No newline at end of file diff --git a/markdown-file/Harbor-Install-And-Usage.md b/markdown-file/Harbor-Install-And-Usage.md index 9a1d41a8..38a437e2 100644 --- a/markdown-file/Harbor-Install-And-Usage.md +++ b/markdown-file/Harbor-Install-And-Usage.md @@ -5,16 +5,20 @@ - CentOS 7.4 - IP:`192.168.0.105` - 需要访问的机子 hosts 需要映射(如果绑定真实域名就不需要这一步了):`192.168.0.105 harbor.gitnavi.com` + - 直接用 IP 也是可以的,只是不用起来不美观 ## 官方文档 -- 安装指导: +- 安装指导: - 从中我们可以知道需要:[Docker、Docker Compose 环境](./Docker-Install-And-Usage.md) - 硬件最低要求:2C + 4GB(推荐 8GB) -- 下载: + - 官网有推荐配置说明:[hardware](https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md#hardware) +- 下载: - 当前(201806)最新版本:**v1.5.1** + - 当前(201810)最新版本:**v1.5.3 和 1.6.0** - 分 offline 和 online 版本,推荐使用 offline - **v1.5.1** 下载地址: + - **v1.5.3** 下载地址: ## 安装 @@ -95,7 +99,7 @@ registry_storage_provider_config = - `5000` - `1514` - 后面重新启动 Harbor 也靠这个文件了:`docker-compose -f /usr/local/harbor/docker-compose.yml restart` -- 开始安装:`sh /usr/local/harbor/install.sh`,控制台输出如下: +- 开始安装:`sh /usr/local/harbor/install.sh`,控制台输出如下(预计需要 5 ~ 10 分钟): ``` @@ -227,19 +231,18 @@ For more details, please visit https://github.com/vmware/harbor . - 安装成功后,可以访问: - 默认用户名:`admin` - 默认密码:`Harbor12345` -- docker 客户端默认是使用 https 访问 docker registry,我们默认在安装 Harbor 的时候配置文件用的时候 http,所以这里需要修改 +- docker 客户端默认是使用 https 访问 docker registry,我们默认在安装 Harbor 的时候配置文件用的时候 http,所以其他 docker 客户端需要修改 - `vim /lib/systemd/system/docker.service` - 修改默认值为:`ExecStart=/usr/bin/dockerd` - 改为:`ExecStart=/usr/bin/dockerd --insecure-registry harbor.gitnavi.com` - `systemctl daemon-reload` - `systemctl reload docker` - `systemctl restart docker` - - `docker-compose -f /usr/local/harbor/docker-compose.yml restart` - 访问:,创建一个项目,比如:`youmeek`,等下需要用到。 - 这里用 admin 用户,不再另外创建用了,但是实际使用最好新建用户。 - `docker login -u admin -p Harbor12345 harbor.gitnavi.com` - 给本地的一个 maven 镜像打 tag:`docker tag maven:3.3-jdk-8 harbor.gitnavi.com/youmeek/harbor-maven:3.3-jdk-8` -- push 到仓库:`docker push harbor.gitnavi.com/youmeek/harbor-maven:3.3-jdk-8` +- push 到仓库:`docker push 182.61.19.178/demo/springboot-jenkins-docker:3` ---------------------------------------------------------------------------- diff --git a/markdown-file/Influxdb-Install-And-Settings.md b/markdown-file/Influxdb-Install-And-Settings.md new file mode 100644 index 00000000..82fe262d --- /dev/null +++ b/markdown-file/Influxdb-Install-And-Settings.md @@ -0,0 +1,70 @@ +# Influxdb 安装和配置 + + + +## Influxdb Docker 安装 + +- 官网库: + + +``` +docker run -d --name influxdb \ +-p 8086:8086 -p 8083:8083 \ +-e INFLUXDB_HTTP_AUTH_ENABLED=true \ +-e INFLUXDB_ADMIN_ENABLED=true -e INFLUXDB_ADMIN_USER=admin -e INFLUXDB_ADMIN_PASSWORD=123456 \ +-e INFLUXDB_DB=mydb1 \ +-v /Users/gitnavi/docker_data/influxdb/data:/var/lib/influxdb influxdb +``` + + +- 进入终端交互: + +``` +docker exec -it influxdb /bin/bash + +输入:influx,开始终端交互 + +auth admin 123456 +show databases; + +use springboot +show measurements + +show series from "jvm_buffer_total_capacity" + +select * from "jvm_buffer_total_capacity" + + +如果你要再额外创建数据库: +create database demo + +如果你要再创建用户: +create user "myuser" with password '123456' with all privileges +``` + + +---------------------------------------------------------------------------------------------- + +## 配置 + + + +---------------------------------------------------------------------------------------------- + + + +---------------------------------------------------------------------------------------------- + + +## 其他资料 + +- +- <> +- <> +- <> +- <> +- <> +- <> +- <> +- <> + diff --git a/markdown-file/JMeter-Install-And-Settings.md b/markdown-file/JMeter-Install-And-Settings.md index 3fd087b9..31946f33 100644 --- a/markdown-file/JMeter-Install-And-Settings.md +++ b/markdown-file/JMeter-Install-And-Settings.md @@ -160,8 +160,8 @@ remote_hosts=192.168.0.1:1099,192.168.0.2:1099 - [快速学习Jmeter性能测试工具](http://gitbook.cn/books/58de71a8be13fa66243873ef/index.html) - [jmeter:菜鸟入门到进阶系列](http://www.cnblogs.com/imyalost/p/7062784.html) - 国内视频教程: - - [JMeter 性能测试入门篇 - 慕课网](https://www.imooc.com/learn/735) - [JMeter 之 HTTP 协议接口性能测试 - 慕课网](https://www.imooc.com/learn/791) + - [接口测试基础之入门篇 - 慕课网](https://www.imooc.com/learn/738) - [JMeter 性能测试进阶案例实战 - 慕课网](https://coding.imooc.com/class/142.html) - [性能测试工具—Jmeter- 我要自学网](http://www.51zxw.net/list.aspx?page=2&cid=520) - [jmeter 视频教学课程 - 小强](https://www.youtube.com/watch?v=zIiXpCBaBgQ&list=PL3rfV4zNE8CD-rAwlXlGXilN5QpkqDWox) diff --git a/markdown-file/Java-bin.md b/markdown-file/Java-bin.md index fdd3354b..edee24b9 100644 --- a/markdown-file/Java-bin.md +++ b/markdown-file/Java-bin.md @@ -1,10 +1,60 @@ # Java bin 目录下的工具 +## JVM 内存结构 + +- 参考资料:[JVM内存结构(基于JDK8)](https://blog.csdn.net/qq_34457118/article/details/81712293) + +#### 运行时数据区(JVM 规范) + +![image.png](https://upload-images.jianshu.io/upload_images/12159-f8cdb04243ea36e4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +- VM 栈(JVM 虚拟机栈) + - 是线程私有的,它的生命周期和线程相同。它描述的是 Java 方法执行的内存模式。 +- Java 堆区(Heap) + - 是 Java 虚拟机所管理的内存中最大的一块。是被所有线程共享的一块内存区域,在虚拟机启动时候创建。用于存放对象实例。 +- 方法区(Method Area) + - 也是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 + - 虽然在 JVM 规范上是描述为堆的一个逻辑部分,但是它有一个别名:Non-Heap(非堆),独立于堆区之外的。JDK8 它是:Metaspace 区 + - Metaspace:主要存放:Class、Package、Method、Field、字节码、常量池、符号引用等等 + - 方法区里面有一个:运行时常量池(Run-Time Constant Pool),用于存放编译期生成的各种字面量和符号应用,在类加载后进入该池存放。 +- 本地方法栈(Native Method Stacks) + - 与虚拟机栈所发挥的作用类似,之间的区别: + - 虚拟机栈是为虚拟机执行 Java 方法(也就是字节码)服务 + - 本地方法栈是为了虚拟机使用到 Native 方法服务。 + +#### JDK8 真实内存结构(HotSpot) + +- HotSpot--Java HotSpot Performance Engine,是 Java 虚拟机的一个实现,目前是 Oracle 在维护和发布。 + +![image.png](https://upload-images.jianshu.io/upload_images/12159-045ea5a11000e8df.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +#### JDK8 HotSpot 的堆内存区域结构 + +![image.png](https://upload-images.jianshu.io/upload_images/12159-6a94044da388bb0e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +- 组成:Eden + Surviver(S0 + S1) + Old +- 对象生命周期:Eden > Surviver(S0 + S1) > Old +- Eden:该区域是最主要的刚创建的对象的内存分配区域,绝大多数对象都会被创建到这里(除了部分大对象通过内存担保机制创建到Old区域,默认大对象都是能够存活较长时间的),该区域的对象大部分都是短时间都会死亡的,故垃圾回收器针对该部分主要采用标记整理算法了回收该区域。 +- Surviver:该区域也是属于新生代的区域,该区域是将在Eden中未被清理的对象存放到该区域中,该区域分为两块区域,采用的是复制算法,每次只使用一块,Eden与Surviver区域的比例是8:1,是根据大量的业务运行总结出来的规律。 +- Old:该区域是属于老年代,一般能够在Surviver中没有被清除出去的对象才会进入到这块区域,该区域主要是采用标记清除算法。 +- 总结:java堆的垃圾回收是垃圾回收器最主要的光顾对象,整体采用分代收集的策略,对不同区域结合其特点采用不同的垃圾收集算法。我们在编程中也应该关注这一块区域,尽量不适用大对象,尽可能的创建局部对象,使用过后确定废弃不用的对象及时断开引用,尽量避免使用循环的对象引用(可达性分析也是比较消耗资源的)等等。 + +#### JVM内存区域的详解图 + +![image.png](https://upload-images.jianshu.io/upload_images/12159-deafd9588b74a2cf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +#### 更多这类文章 + +- [从实际案例聊聊Java应用的GC优化](https://tech.meituan.com/jvm_optimize.html) + + +------------------------------------------------------------- + ## 频繁GC问题或内存溢出排查流程 - 使用 `jps`,查看线程ID,假设 PID 为 12011 -- 使用 `jstat -gc 12011 250 20`,查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。 -- 使用 `jstat -gccause`:额外输出上次GC原因 +- 使用 `jstat -gc PID 250 20`,查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。 +- 使用 `jstat -gccause PID`:额外输出上次GC原因 - 使用 `jmap -dump:format=b,file=/opt/myHeapDumpFileName 12011`,生成堆转储文件 - 使用 jhat 或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。 - 结合代码解决内存溢出或泄露问题。 @@ -14,6 +64,9 @@ - 使用 `jps`查看线程ID,假设 PID 为 12011 - 使用 `jstack 12011` 查看线程情况 +------------------------------------------------------------------- + + ## jps - 显示当前所有 java 进程 pid 的命令 @@ -26,10 +79,16 @@ - `jps -v` 跟:`ps -ef|grep java` 主要输出内容一样 - `12011` 是我这边的一个 java 应用的 pid,下面的其他命令都是自己与此应用进行分析的 -## jstat +------------------------------------------------------------------- + +## jstat(重要) - 显示进程中的类装载、内存、垃圾收集、JIT编译等运行数据。 -- `jstat -gc 12011 250 10`,查询进程 12011 的垃圾收集情况,每250毫秒查询一次,一共查询10次。 +- 查看类加载信息:`jstat -class PID` + +#### 垃圾回收统计 + +- `jstat -gc PID 250 10`,每250毫秒查询一次,一共查询10次。 ``` S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT @@ -46,21 +105,30 @@ ``` - 列含义说明: - -S0C 年轻代中第一个survivor(幸存区)的容量 (字节) - -S1C 年轻代中第二个survivor(幸存区)的容量 (字节) - -S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) - -S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) - -EC 年轻代中Eden(伊甸园)的容量 (字节) - -EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) - -OC Old代的容量 (字节) - -OU Old代目前已使用空间 (字节) - -PC Perm(持久代)的容量 (字节) - -PUPerm(持久代)目前已使用空间 (字节) - -YGC 从应用程序启动到采样时年轻代中gc次数 - -YGCT 从应用程序启动到采样时年轻代中gc所用时间(s) - -FGC 从应用程序启动到采样时old代(全gc)gc次数 - -FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) - -GCT 从应用程序启动到采样时gc用的总时间(s) + - **34944.0 表示 34M 大小,235729.8 表示 235M ** + - **SO + S1 + Eden = young 区** + -S0C 年轻代中第一个survivor(幸存区)的容量 (字节) + -S1C 年轻代中第二个survivor(幸存区)的容量 (字节) + -S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) (字母 U 表示 used) + -S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) (字母 U 表示 used) + -EC 年轻代中Eden(伊甸园)的容量 (字节) + -EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) + - **OC + OU = old 区** + -OC Old代的容量 (字节) + -OU Old代目前已使用空间 (字节) + - **MC + MU = Metaspace 区** + - MC 方法区大小 + - MU 方法区使用大小 + - 其他 + - CCSC 压缩类空间大小 + - CCSU 压缩类空间使用大小 + - YGC 年轻代垃圾回收次数 + - YGCT 年轻代垃圾回收消耗时间 + - FGC 老年代垃圾回收次数 + - FGCT 老年代垃圾回收消耗时间 + - GCT 垃圾回收消耗总时间 + +#### 堆内存统计 - `jstat -gccapacity 12011 250 10`,查询进程 12011 VM内存中三代(young,old,perm)对象的使用和占用大小,每250毫秒查询一次,一共查询10次。 @@ -89,17 +157,62 @@ - OGCMX old代的最大容量(字节) - OGC old代当前新生成的容量 (字节) - OC Old代的容量 (字节) - - PGCMN perm代中初始化(最小)的大小 (字节) - - PGCMX perm代的最大容量 (字节) - - PGC perm代当前新生成的容量 (字节) - - PC Perm(持久代)的容量 (字节) - - YGC 从应用程序启动到采样时年轻代中gc次数 - - FGC 从应用程序启动到采样时old代(全gc)gc次数 -- 更多其他参数的使用可以看:[Java命令学习系列(四)——jstat](https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid=402330276&idx=2&sn=58117de92512f83090d0a9de738eeacd&scene=21#wechat_redirect) + - MCMN 最小元数据容量 + - MCMX 最大元数据容量 + - MC 当前元数据空间大小 + - CCSMN 最小压缩类空间大小 + - CCSMX 最大压缩类空间大小 + - CCSC 当前压缩类空间大小 + - YGC 年轻代gc次数,从应用程序启动到采样时年轻代中gc次数 + - FGC 老年代GC次数,从应用程序启动到采样时old代(全gc = Full gc次数)gc次数 +- 更多其他参数的使用可以看: + - [Java命令学习系列(四)——jstat](https://mp.weixin.qq.com/s?__biz=MzI3NzE0NjcwMg==&mid=402330276&idx=2&sn=58117de92512f83090d0a9de738eeacd&scene=21#wechat_redirect) + - [java高分局之jstat命令使用](https://blog.csdn.net/maosijunzi/article/details/46049117) + - [ jstat命令查看jvm的GC情况 (以Linux为例)](https://www.cnblogs.com/yjd_hycf_space/p/7755633.html) + +#### gcutil + +- 使用:`jstat -gcutil PID 3000 10`: +- 正常情况结果应该是这样的: + +``` +S0 S1 E O M CCS YGC YGCT FGC FGCT GCT +0.00 0.00 67.63 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.71 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.71 38.09 78.03 68.82 124 0.966 5 0.778 1.744 + +``` + +- S0:SO 当前使用比例 +- S1:S1 当前使用比例 +- E:**Eden 区使用比例(百分比)(异常的时候,这里可能会接近 100%)** +- O:**old 区使用比例(百分比)(异常的时候,这里可能会接近 100%)** +- M:**Metaspace 区使用比例(百分比)(异常的时候,这里可能会接近 100%)** +- CCS:压缩使用比例 +- YGC:年轻代垃圾回收次数 +- FGC:老年代垃圾回收次数 +- FGCT:老年代垃圾回收消耗时间(Full gc耗时)(单位秒) +- GCT:垃圾回收消耗总时间(单位秒) +- **异常的时候每次 Full GC 时间也可能非常长,每次时间计算公式=FGCT值/FGC指)** +- 在 YGC 之前 年轻代 = eden + S1;YGC 之后,年轻代 = eden + S0。 +- 如果看到 YGC 之后 old 区空间没变,表示此次 YGC,没有对象晋升到 old 区 + + + +------------------------------------------------------------------- + ## jmap -- 生成堆转储快照(heapdump) +- 生成堆转储快照(heap dump) + - heap dump 主要记录了在某一时刻JVM堆中对象使用的情况,即某个时刻JVM堆的快照,是一个二进制文件,主要用于分析哪些对象占用了太对的堆空间,从而发现导致内存泄漏的对象。 - 堆Dump是反应Java堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。 一般,在内存不足、GC异常等情况下,我们就会怀疑有内存泄露。这个时候我们就可以制作堆Dump来查看具体情况,分析原因。 - 常见内存错误: - outOfMemoryError 年老代内存不足。 @@ -198,14 +311,29 @@ tenured generation: 535: 1 168 [[Ljava.math.BigInteger; ``` -## jstack +------------------------------------------------------------------- + + +## jstack(线程快照 -- CPU 负载高) - jstack命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁) -- jstack用于生成java虚拟机当前时刻的线程快照。 -- 线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。 +- jstack用于生成java虚拟机当前时刻的 **线程快照(thread dump)**。主要记录JVM在某一时刻各个线程执行的情况,以栈的形式显示,是一个文本文件。 +- 线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 + - 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 + - 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。 + - 另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。 - `jstack 12011`,查看线程情况 - `jstack -l 12011`,除堆栈外,显示关于锁的附件信息 -- 下面 demo 内容太多,所以选取其中一部分 +- 导出文件:`jstack -l PID >> /opt/jstack-tomcat1-20180917.log` + - 把占用 CPU 资源高的线程十进制的 PID 转换成 16 进制:`printf "%x\n" PID`,比如:`printf "%x\n" 12401` 得到结果是:`3071` + - 在刚刚输出的那个 log 文件中搜索:`3071`,可以找到:`nid=0x3071` +- 在线看某个线程 PID 的情况:`jstack 进程ID | grep 十六进制线程ID -A 10` + - `-A 10` 参数用来指定显示行数,否则只会显示一行信息 +- 下面 demo 内容太多,所以选取其中一部分结构: +- 常见线程状态 + - Runnable:正在运行的线程 + - Sleeping:休眠的线程 + - Waiting:等待的线程 ``` 2018-03-08 14:28:13 @@ -275,3 +403,5 @@ JNI global references: 281 ## 资料 - +- +- \ No newline at end of file diff --git a/markdown-file/Jenkins-Install-And-Settings.md b/markdown-file/Jenkins-Install-And-Settings.md index 6da80a5d..a4101dea 100644 --- a/markdown-file/Jenkins-Install-And-Settings.md +++ b/markdown-file/Jenkins-Install-And-Settings.md @@ -9,6 +9,7 @@ ## Docker 下安装 Jenkins +- 配置:至少需要 2G 内存 - 先禁用 selinux - 编辑配置文件:`vim /etc/selinux/config` - 把 `SELINUX=enforcing` 改为 `SELINUX=disabled` @@ -19,7 +20,7 @@ - 先创建一个宿主机以后用来存放数据的目录:`mkdir -p /data/jenkins/jenkins_home && chmod 777 -R /data/jenkins/jenkins_home` - 安装镜像(813MB,有点大):`docker pull jenkins/jenkins:lts` - 查看下载下来的镜像:`docker images` -- 首次运行镜像:`docker run --name jenkins-master -p 8123:8080 -p 50000:50000 -v /etc/localtime:/etc/localtime -v /data/jenkins/jenkins_home:/var/jenkins_home -e JAVA_OPTS="-Duser.timezone=Asia/Shanghai" -d --restart always jenkins/jenkins:lts` +- 首次运行镜像:`docker run --name jenkins-master -p 8123:18080 -p 50000:50000 -v /etc/localtime:/etc/localtime -v /data/jenkins/jenkins_home:/var/jenkins_home -e JAVA_OPTS="-Duser.timezone=Asia/Shanghai" -d --restart always jenkins/jenkins:lts` - 这里的 8080 端口是 jenkins 运行程序的端口,必须要有映射的。50000 端口是非必须映射的,但是如果你要用 Jenkins 分布式构建这个就必须开放 - 如果报下面的错误: @@ -68,6 +69,8 @@ Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permiss - Mailer Plugin - NotifyQQ([QQ 消息通知](https://github.com/ameizi/NotifyQQ)) - 钉钉通知([钉钉 消息通知](https://wiki.jenkins.io/display/JENKINS/Dingding+Notification+Plugin)) + - 360 FireLine:代码规范检查,已经集成了阿里巴巴的代码规约(P3C)检查 + - AnsiColor(可选):这个插件可以让Jenkins的控制台输出的log带有颜色 - oauth(具体名字要看下) - Build Failure Analyzer 分析构建错误日志并在构建页面显示错误 - SSH plugin 支持通过SSH执行脚本 @@ -81,61 +84,878 @@ Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permiss - Gitlab Plugin:可能会直接安装不成功,如果不成功根据报错的详细信息可以看到 hpi 文件的下载地址,挂代理下载下来,然后离线安装即可 - Gitlab Hook:用于触发 GitLab 的一些 WebHooks 来构建项目 - Gitlab Authentication 这个插件提供了使用GitLab进行用户认证和授权的方案 - - FireLine Plugin:代码规范检查,已经集成了阿里巴巴的代码规约(P3C)检查 - Docker Commons Plugin - Docker plugin - Kubernetes - Pre SCM BuildStep Plugin 在拉代码之前插入一些步骤 - GitHub Pull Request Builder Github Pull Request时自动构建 - GitHub API Plugin Github API插件 - - SonarQube Scanner for Jenkins :代码质量管理插件。 - - AnsiColor(可选):这个插件可以让Jenkins的控制台输出的log带有颜色 - NodeJS Plugin ## Docker 的 Jenkins 与 Docker 结合使用 -- 运行镜像命令:`docker run --name jenkins-master -p 8123:8080 -p 50000:50000 -v /etc/localtime:/etc/localtime -v /data/jenkins/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -e JAVA_OPTS="-Duser.timezone=Asia/Shanghai" -d --restart always jenkins/jenkins:lts` +- 运行镜像命令:`docker run --name jenkins-master -p 8123:18080 -p 50000:50000 -v /etc/localtime:/etc/localtime -v /data/jenkins/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -e JAVA_OPTS="-Duser.timezone=Asia/Shanghai" -d --restart always jenkins/jenkins:lts` - 比上面多了一步:`-v /var/run/docker.sock:/var/run/docker.sock` - 这样,在 jenkins 里面写 shell 脚本调用 docker 程序,就可以直接调用宿主机的 docker 了。 +------------------------------------------------------------------- -## Jenkins 安装 - -- Jenkins 安装 - - 官网使用 Tomcat 部署方式指导: - - 此时(20160207) Jenkins 最新版本为:**1.647** - - JDK 最低要求是 JDK 7,官网推荐是 JDK 8 - - 我个人习惯 `/opt` 目录下创建一个目录 `setups` 用来存放各种软件安装包;在 `/usr` 目录下创建一个 `program` 用来存放各种解压后的软件包,下面的讲解也都是基于此习惯 - - 我个人已经使用了第三方源:`EPEL、RepoForge`,如果你出现 `yum install XXXXX` 安装不成功的话,很有可能就是你没有相关源,请查看我对源设置的文章 - - Jenkins 下载:`wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war` (大小:61 M) - - 我们假设这个 Tomcat 就是为了 Jenkins 专用的 - - 把下载下来的 jenkins.war 移到 Tomcat 的 webapps 目录下,比如我的是:`/usr/program/tomcat8/webapps` - - 把 Jenkins.war 改名为 ROOT.war:`mv jenkins.war ROOT.war` - - 删除 Tomcat 下 webapps 目录下多余的一些目录 - - 首次启动 Tomcat,让 Tomcat 解压 war - - 设置 JENKINS_HOME: - - 寻找 jenkins home 目录地址:`find / -name .jenkins`,我这边得到的结果是:`/root/.jenkins` - - 对在 Tomcat 文章中讲解的系统变量 `CATALINA_OPTS` 进行设置: - - 旧值: - ``` - CATALINA_OPTS="-server -Xms528m -Xmx528m -XX:PermSize=256m -XX:MaxPermSize=358m" - export CATALINA_OPTS - ``` - - 改为: - ``` - CATALINA_OPTS="-server -DJENKINS_HOME=/root/.jenkins -Xms528m -Xmx528m -XX:PermSize=256m -XX:MaxPermSize=358m" - export CATALINA_OPTS - ``` - -- Jenkins 各个组件配置: - - 访问: -- 其他问题 - - 如果访问的时候报这个异常:`java.net.UnknownHostException`,可以查看这篇文章: +## Jenkins 安装(YUM) + +- **需要 JDK8 环境** +- 当前最新版本:`2.138.1-1.1`(201810) +- 官网安装说明 RedHat Linux RPM packages: +- 官网在线安装(72M),该安装方式会自己生成一个 jenkins 用户组和用户: + +``` +sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo +sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key + +sudo yum install -y jenkins +``` + +- 查看安装后的情况:`rpm -ql jenkins` + +``` +/etc/init.d/jenkins +/etc/logrotate.d/jenkins +/etc/sysconfig/jenkins +/usr/lib/jenkins +/usr/lib/jenkins/jenkins.war +/usr/sbin/rcjenkins +/var/cache/jenkins +/var/lib/jenkins +/var/log/jenkins +``` + +- jenkins 相关目录释义: + +``` +/usr/lib/jenkins/:jenkins安装目录,war 包会放在这里。 +/etc/sysconfig/jenkins:jenkins配置文件,“端口”,“JENKINS_HOME” 等都可以在这里配置。 +/var/lib/jenkins/:默认的 JENKINS_HOME。 +/var/log/jenkins/jenkins.log:jenkins 日志文件。 +``` + +- 控制台输出方式启动:`java -jar /usr/lib/jenkins/jenkins.war --httpPort=18080` +- 内置 Jetty,默认是 18080 端口,你也可以改为其他(建议修改为其他) +- 可以看到有一个这个重点内容,这是你的初始化密码,等下会用到的: + + +``` +Jenkins initial setup is required. An admin user has been created and a password generated. +Please use the following password to proceed to installation: + +daacc724767640a29ddc99d159a80cf8 + +This may also be found at: /root/.jenkins/secrets/initialAdminPassword +``` + +- 守护进程启动:`nohup java -jar /usr/lib/jenkins/jenkins.war --httpPort=18080 > /dev/null 2>&1 &` +- 浏览器访问 Jenkins 首页开始配置: +- 特殊情况: + - 如果配置插件过程遇到这个错误:`No valid crumb was included in the request`,则多重试几次。 + - 登录后把: 下面的 `防止跨站点请求伪造` 勾选去掉。遇到问题多试几次。 + + +## 忘记 admin 密码进行重置 + +- 备份配置文件:`cp /root/.jenkins/config.xml /root/.jenkins/config.xml.back` +- 编辑:`vim /root/.jenkins/config.xml`,删除 config.xml 文件中的这部分内容,在 10 行左右位置 + +``` +true + + true + + + true + false + +``` + +- 重启服务,进入首页此时系统是免密状态 +- 选择左侧的 `系统管理`,系统会提示你需要配置安全设置:`全局安全配置` + - 勾选 `启用安全` + - 安全域 > 勾选 `Jenkins专有用户数据库` + - 点击保存 +- 重新点击首页:`系统管理` + - 点击 `管理用户` + - 在用户列表中点击 admin 右侧齿轮 + - 修改密码,修改后即可重新登录。 +- 选择左侧的 `系统管理`,系统会提示你需要配置安全设置:`全局安全配置` + - 勾选 `启用安全` + - 授权策略 > 勾选 `登录用户可以做任何事` 或 `安全矩阵` + - 点击保存 + +------------------------------------------------------------------- + +## pipeline 语法 + +- 全局 pipeline 语法说明: +- 其他资料 + - + - + - + - + - + +#### 内置的参数 + +``` +BUILD_NUMBER = ${env.BUILD_NUMBER}" +BUILD_ID = ${env.BUILD_ID}" +BUILD_DISPLAY_NAME = ${env.BUILD_DISPLAY_NAME}" +JOB_NAME = ${env.JOB_NAME}" +JOB_BASE_NAME = ${env.JOB_BASE_NAME}" +WORKSPACE = ${env.WORKSPACE}" +JENKINS_HOME = ${env.JENKINS_HOME}" +JENKINS_URL = ${env.JENKINS_URL}" +BUILD_URL = ${env.BUILD_URL}" +JOB_URL = ${env.JOB_URL}" +``` + +- 输出结果: + +``` +BUILD_NUMBER = 21 +BUILD_ID = 21 +BUILD_DISPLAY_NAME = #21 +JOB_NAME = react +JOB_BASE_NAME = react +WORKSPACE = /root/.jenkins/workspace/react +JENKINS_HOME = /root/.jenkins +JENKINS_URL = http://192.168.0.105:18080/ +BUILD_URL = http://192.168.0.105:18080/job/react/21/ +JOB_URL = http://192.168.0.105:18080/job/react/ +``` + +#### 构建时指定参数 + +- 如果要构建的时候明确输入参数值,可以用 `parameters`: + +``` +pipeline { + agent any + + parameters { + string(name: 'assignVersionValue', defaultValue: '1.1.3', description: '构建之前请先指定版本号') + } + + tools { + jdk 'JDK8' + maven 'MAVEN3' + } + + options { + timestamps() + disableConcurrentBuilds() + buildDiscarder(logRotator( + numToKeepStr: '20', + daysToKeepStr: '30', + )) + } + + + environment { + gitUrl = "https://gitee.com/youmeek/springboot-jenkins-demo.git" + branchName = "master" + giteeCredentialsId = "Gitee" + projectWorkSpacePath = "${env.WORKSPACE}" + } + + + stages { + + stage('Check Env') { + + /*当指定的参数版本号等于空字符的时候进入 steps。这里的 when 对 当前 stage 有效,对其他 stage 无效*/ + when { + environment name: 'assignVersionValue', value: '' + } + + /*结束整个任务。如果不想结束整个任务,就不要用:exit 1*/ + steps { + sh "exit 1" + } + } + + stage('Pre Env') { + + steps { + echo "======================================项目名称 = ${env.JOB_NAME}" + echo "======================================项目 URL = ${gitUrl}" + echo "======================================项目分支 = ${branchName}" + echo "======================================当前编译版本号 = ${env.BUILD_NUMBER}" + echo "======================================项目空间文件夹路径 = ${projectWorkSpacePath}" + echo "======================================构建时自己指定的版本号值 = ${params.assignVersionValue}" + } + } + + } +} +``` + + +#### 定时构建 + +``` +pipeline { + agent any + + /*采用 linux cron 语法即可*/ + triggers { + cron('*/1 * * * *') + } + + tools { + jdk 'JDK8' + maven 'MAVEN3' + } + + options { + timestamps() + disableConcurrentBuilds() + buildDiscarder(logRotator( + numToKeepStr: '20', + daysToKeepStr: '30', + )) + } + + + environment { + gitUrl = "https://gitee.com/youmeek/springboot-jenkins-demo.git" + branchName = "master" + giteeCredentialsId = "Gitee" + projectWorkSpacePath = "${env.WORKSPACE}" + } + + + stages { + + stage('Pre Env') { + steps { + echo "======================================项目名称 = ${env.JOB_NAME}" + echo "======================================项目 URL = ${gitUrl}" + echo "======================================项目分支 = ${branchName}" + echo "======================================当前编译版本号 = ${env.BUILD_NUMBER}" + echo "======================================项目空间文件夹路径 = ${projectWorkSpacePath}" + } + } + + } +} + +``` + +#### 同时构建其他 Job + +``` +stage('运行其他任务') { + steps { + build job: '任务名称' + } +} +``` + + +------------------------------------------------------------------- + +## Jenkins 前端 React 项目构建 + +- **确保**:安装了 [Node.js](Node-Install-And-Usage.md) + +#### 简单的 pipeline 写法(开源项目) + +``` +pipeline { + agent any + + options { + timestamps() + disableConcurrentBuilds() + buildDiscarder(logRotator( + numToKeepStr: '20', + daysToKeepStr: '30', + )) + } + + /*=======================================常修改变量-start=======================================*/ + + environment { + gitUrl = "https://github.com/satan31415/heh_umi_template.git" + branchName = "master" + projectBuildPath = "${env.WORKSPACE}/dist" + nginxHtmlRoot = "/usr/share/nginx/react" + } + + /*=======================================常修改变量-end=======================================*/ + + stages { + + stage('Pre Env') { + steps { + echo "======================================项目名称 = ${env.JOB_NAME}" + echo "======================================项目 URL = ${gitUrl}" + echo "======================================项目分支 = ${branchName}" + echo "======================================当前编译版本号 = ${env.BUILD_NUMBER}" + echo "======================================项目 Build 文件夹路径 = ${projectBuildPath}" + echo "======================================项目 Nginx 的 ROOT 路径 = ${nginxHtmlRoot}" + } + } + + stage('Git Clone'){ + steps { + git branch: "${branchName}", url: "${gitUrl}" + } + } + + stage('NPM Install') { + steps { + sh "npm install" + } + } + + stage('NPM Build') { + steps { + sh "npm run build" + } + } + + stage('Nginx Deploy') { + steps { + sh "rm -rf ${nginxHtmlRoot}/" + sh "cp -r ${projectBuildPath}/ ${nginxHtmlRoot}/" + } + } + + + } +} +``` + + +#### 简单的 pipeline 写法(闭源项目 -- 码云为例) + +- 新增一个全局凭据: +- 类型:`Username with password` +- 范围:`全局` +- Username:`你的 Gitee 账号` +- Password:`你的 Gitee 密码` +- **ID**:`只要是唯一值就行,后面要用到` +- 描述:`最好跟 ID 一致,方便认` + +``` +pipeline { + agent any + + options { + timestamps() + disableConcurrentBuilds() + buildDiscarder(logRotator( + numToKeepStr: '20', + daysToKeepStr: '30', + )) + } + + /*=======================================常修改变量-start=======================================*/ + + environment { + gitUrl = "https://gitee.com/youmeek/react-demo.git" + branchName = "master" + giteeCredentialsId = "上面全局凭据填写的 ID" + projectBuildPath = "${env.WORKSPACE}/dist" + nginxHtmlRoot = "/usr/share/nginx/react" + } + + /*=======================================常修改变量-end=======================================*/ + + stages { + + stage('Pre Env') { + steps { + echo "======================================项目名称 = ${env.JOB_NAME}" + echo "======================================项目 URL = ${gitUrl}" + echo "======================================项目分支 = ${branchName}" + echo "======================================当前编译版本号 = ${env.BUILD_NUMBER}" + echo "======================================项目 Build 文件夹路径 = ${projectBuildPath}" + echo "======================================项目 Nginx 的 ROOT 路径 = ${nginxHtmlRoot}" + } + } + + stage('Git Clone'){ + steps { + git branch: "${branchName}", + credentialsId: "${giteeCredentialsId}", + url: "${gitUrl}" + } + } + + stage('NPM Install') { + steps { + sh "npm install" + } + } + + stage('NPM Build') { + steps { + sh "npm run build" + } + } + + stage('Nginx Deploy') { + steps { + sh "rm -rf ${nginxHtmlRoot}/" + sh "cp -r ${projectBuildPath}/ ${nginxHtmlRoot}/" + } + } + + + } +} +``` + + +------------------------------------------------------------------- + +## Jenkins 后端 Spring Boot 项目构建 + +#### 安装 Maven + +- [参考该文章](Maven-Install-And-Settings.md) + +#### 配置工具 + +- 访问: +- 我习惯自己安装,所以这里修改配置: + - **需要注意**:配置里面的 `别名` 不要随便取名字,后面 Pipeline 要用到的。在 tool 标签里面会用到。 + - 具体可以查看该图片说明:[点击查看](https://upload-images.jianshu.io/upload_images/12159-ef61595aebaa4244.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + +#### 简单的 pipeline 写法(Jar 方式运行)(闭源项目 -- 码云为例) + +###### 用 supervisord 做进程控制 + +- [supervisord 的使用](Daemontools.md) +- 生成 supervisord 的配置文件会写在 Pipeline,所以只要你保证服务器 supervisord 正常运行即可 + +###### 配置 Jenkins + +- **必须**:新增一个全局凭据,方法参考前端部分 + +``` +pipeline { + agent any + + /*=======================================工具环境修改-start=======================================*/ + tools { + jdk 'JDK8' + maven 'MAVEN3' + } + /*=======================================工具环境修改-end=======================================*/ + + options { + timestamps() + disableConcurrentBuilds() + buildDiscarder(logRotator( + numToKeepStr: '20', + daysToKeepStr: '30', + )) + } + + /*=======================================常修改变量-start=======================================*/ + + environment { + gitUrl = "https://gitee.com/youmeek/springboot-jenkins-demo.git" + branchName = "master" + giteeCredentialsId = "Gitee" + projectWorkSpacePath = "${env.WORKSPACE}" + projectBuildTargetPath = "${env.WORKSPACE}/target" + projectJarNewName = "${env.JOB_NAME}.jar" + supervisorConfigFileFullPath = "/etc/supervisor/conf.d/${env.JOB_NAME}.conf" + supervisorLogPath = "/var/log/supervisor" + + } + + /*=======================================常修改变量-end=======================================*/ + + stages { + + stage('Pre Env') { + steps { + echo "======================================项目名称 = ${env.JOB_NAME}" + echo "======================================项目 URL = ${gitUrl}" + echo "======================================项目分支 = ${branchName}" + echo "======================================当前编译版本号 = ${env.BUILD_NUMBER}" + echo "======================================项目空间文件夹路径 = ${projectWorkSpacePath}" + echo "======================================项目 build 后 jar 路径 = ${projectBuildTargetPath}" + echo "======================================项目 jar 新名称 = ${projectJarNewName}" + echo "======================================supervisor 配置文件路径 = ${supervisorConfigFileFullPath}" + echo "======================================supervisor 存放 log 路径 = ${supervisorLogPath}" + } + } + + stage('Git Clone'){ + steps { + git branch: "${branchName}", + credentialsId: "${giteeCredentialsId}", + url: "${gitUrl}" + } + } + + stage('Maven Clean') { + steps { + sh "mvn clean" + } + } + + stage('Maven Package') { + steps { + sh "mvn package -DskipTests" + } + } + + stage('Spring Boot Run') { + steps { + +sh """ +mv ${projectBuildTargetPath}/*.jar ${projectBuildTargetPath}/${projectJarNewName} + +if [ ! -f ${supervisorConfigFileFullPath} ]; then + +touch ${supervisorConfigFileFullPath} + +cat << EOF >> ${supervisorConfigFileFullPath} +[program:${env.JOB_NAME}] +command=java -jar ${projectBuildTargetPath}/${projectJarNewName} +stdout_logfile=${supervisorLogPath}/${env.JOB_NAME}.log +stderr_logfile=${supervisorLogPath}/${env.JOB_NAME}-err.log +user=root +autostart=true +autorestart=false +startsecs=5 +priority=1 +stopasgroup=true +killasgroup=true +EOF + +/usr/bin/supervisorctl update +fi + +/usr/bin/supervisorctl restart ${env.JOB_NAME} +""" + + } + } + + } +} +``` + + + +#### 简单的 pipeline 写法(Docker 方式运行)(闭源项目 -- 码云为例) + +- **确保** 项目根目录有 Dockerfile 文件(部分内容自己修改),内容模板: + +``` +FROM java:8 +VOLUME /tmp + +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +ADD ./target/buildApp.jar /app.jar + +RUN bash -c 'touch /app.jar' + +EXPOSE 8081 + +ENTRYPOINT ["java", "-jar", "-Xms512M", "-Xmx512M" , "-XX:MetaspaceSize=128M", "-XX:MaxMetaspaceSize=256M" ,"/app.jar"] +``` + +- Pipeline 写法 + +``` +pipeline { + agent any + + /*=======================================工具环境修改-start=======================================*/ + tools { + jdk 'JDK8' + maven 'MAVEN3' + } + /*=======================================工具环境修改-end=======================================*/ + + options { + timestamps() + disableConcurrentBuilds() + buildDiscarder(logRotator( + numToKeepStr: '20', + daysToKeepStr: '30', + )) + } + + /*=======================================常修改变量-start=======================================*/ + + environment { + gitUrl = "https://gitee.com/youmeek/springboot-jenkins-demo.git" + branchName = "master" + giteeCredentialsId = "Gitee" + projectWorkSpacePath = "${env.WORKSPACE}" + projectBuildTargetPath = "${env.WORKSPACE}/target" + projectJarNewName = "buildApp.jar" + + + dockerImageName = "docker.youmeek.com/demo/${env.JOB_NAME}:${env.BUILD_NUMBER}" + dockerContainerName = "${env.JOB_NAME}" + inHostPort = "8082" + inDockerAndJavaPort = "8081" + inHostLogPath = "/data/docker/logs/${dockerContainerName}/${env.BUILD_NUMBER}" + inDockerLogPath = "/data/logs" + dockerRunParam = "--name=${dockerContainerName} --hostname=${dockerContainerName} -v /etc/hosts:/etc/hosts -v ${inHostLogPath}:${inDockerLogPath} --restart=always -p ${inHostPort}:${inDockerAndJavaPort}" + } + + /*=======================================常修改变量-end=======================================*/ + + stages { + + stage('Pre Env') { + steps { + echo "======================================项目名称 = ${env.JOB_NAME}" + echo "======================================项目 URL = ${gitUrl}" + echo "======================================项目分支 = ${branchName}" + echo "======================================当前编译版本号 = ${env.BUILD_NUMBER}" + echo "======================================项目空间文件夹路径 = ${projectWorkSpacePath}" + echo "======================================项目 build 后 jar 路径 = ${projectBuildTargetPath}" + echo "======================================项目 jar 新名称 = ${projectJarNewName}" + echo "======================================Docker 镜像名称 = ${dockerImageName}" + echo "======================================Docker 容器名称 = ${dockerContainerName}" + } + } + + stage('Git Clone'){ + steps { + git branch: "${branchName}", + credentialsId: "${giteeCredentialsId}", + url: "${gitUrl}" + } + } + + stage('Maven Clean') { + steps { + sh "mvn clean" + } + } + + stage('Maven Package') { + steps { + sh "mvn package -DskipTests" + } + } + + stage('构建 Docker 镜像') { + steps { + sh """ + mv ${projectBuildTargetPath}/*.jar ${projectBuildTargetPath}/${projectJarNewName} + + cd ${projectWorkSpacePath} + + docker build -t ${dockerImageName} ./ + """ + } + } + + stage('运行 Docker 镜像') { + steps { + sh """ + docker stop ${dockerContainerName} | true + + docker rm -f ${dockerContainerName} | true + + docker run -d ${dockerRunParam} ${dockerImageName} + """ + } + } + + + + + + + } +} +``` + + +#### 简单的 pipeline 写法(Docker + Harbor 方式运行)(闭源项目 -- 码云为例) + +- 请先看懂上面 Docker 方式 +- 一共需要 3 台机子(要保证在内网环境,不然一定会有安全问题) + - 一台部署 [Harbor](Harbor-Install-And-Usage.md) + - 一台部署 Jenkins + - 一台运行项目 +- 确保 Jenkins 机子已经 Docker Login Harbor,这个就一次性的动作,所以自己在 Jenkins 服务器上操作即可 +- 确保 Spring Boot 项目运行的机子已经 Docker Login Harbor,这个就一次性的动作,所以自己在 Jenkins 服务器上操作即可 +- 确保 Spring Boot 项目运行的机子 docker remote api 开启(没有身份认证功能,所以才要保证内网) +- Pipeline 写法 + +``` +pipeline { + agent any + + /*=======================================工具环境修改-start=======================================*/ + tools { + jdk 'JDK8' + maven 'MAVEN3' + } + /*=======================================工具环境修改-end=======================================*/ + + options { + timestamps() + disableConcurrentBuilds() + buildDiscarder(logRotator( + numToKeepStr: '20', + daysToKeepStr: '30', + )) + } + + /*=======================================常修改变量-start=======================================*/ + + environment { + gitUrl = "https://gitee.com/youmeek/springboot-jenkins-demo.git" + branchName = "master" + giteeCredentialsId = "Gitee" + projectWorkSpacePath = "${env.WORKSPACE}" + projectBuildTargetPath = "${env.WORKSPACE}/target" + projectJarNewName = "buildApp.jar" + + projectDockerDaemon = "tcp://192.168.1.12:2376" + harborUrl = "192.168.1.13" + harborProjectName = "demo" + dockerImageName = "${harborUrl}/${harborProjectName}/${env.JOB_NAME}:${env.BUILD_NUMBER}" + dockerContainerName = "${env.JOB_NAME}" + inHostPort = "8082" + inDockerAndJavaPort = "8081" + inHostLogPath = "/data/docker/logs/${dockerContainerName}/${env.BUILD_NUMBER}" + inDockerLogPath = "/data/logs" + dockerRunParam = "--name=${dockerContainerName} --hostname=${dockerContainerName} -v /etc/hosts:/etc/hosts -v ${inHostLogPath}:${inDockerLogPath} --restart=always -p ${inHostPort}:${inDockerAndJavaPort}" + } + + /*=======================================常修改变量-end=======================================*/ + + stages { + + stage('Pre Env') { + steps { + echo "======================================项目名称 = ${env.JOB_NAME}" + echo "======================================项目 URL = ${gitUrl}" + echo "======================================项目分支 = ${branchName}" + echo "======================================当前编译版本号 = ${env.BUILD_NUMBER}" + echo "======================================项目空间文件夹路径 = ${projectWorkSpacePath}" + echo "======================================项目 build 后 jar 路径 = ${projectBuildTargetPath}" + echo "======================================项目 jar 新名称 = ${projectJarNewName}" + echo "======================================Docker 镜像名称 = ${dockerImageName}" + echo "======================================Docker 容器名称 = ${dockerContainerName}" + echo "======================================harbor 地址 = ${harborUrl}" + echo "======================================harbor 项目名称 = ${harborProjectName}" + echo "======================================项目在宿主机的端口 = ${inHostPort}" + echo "======================================项目在 Docker 容器中的端口 = ${inDockerAndJavaPort}" + echo "======================================项目在宿主机的 log 路径 = ${inHostLogPath}" + echo "======================================项目在 docker 容器的 log 路径 = ${inDockerLogPath}" + echo "======================================项目运行的 Docker remote ip 信息 = ${projectDockerDaemon}" + echo "======================================项目运行的参数 = ${dockerRunParam}" + } + } + + stage('Git Clone'){ + steps { + git branch: "${branchName}", + credentialsId: "${giteeCredentialsId}", + url: "${gitUrl}" + } + } + + stage('Maven Clean') { + steps { + sh "mvn clean" + } + } + + stage('Maven Package') { + steps { + sh "mvn package -DskipTests" + } + } + + stage('构建 Docker 镜像') { + steps { + sh """ + mv ${projectBuildTargetPath}/*.jar ${projectBuildTargetPath}/${projectJarNewName} + + cd ${projectWorkSpacePath} + + docker build -t ${dockerImageName} ./ + """ + } + } + + stage('Push Docker 镜像') { + options { + timeout(time: 5, unit: 'MINUTES') + } + steps { + sh """ + docker push ${dockerImageName} + docker rmi ${dockerImageName} + """ + } + } + + stage('运行远程 Docker 镜像') { + options { + timeout(time: 5, unit: 'MINUTES') + } + steps { + sh """ + docker -H ${projectDockerDaemon} pull ${dockerImageName} + + docker -H ${projectDockerDaemon} stop ${dockerContainerName} | true + + docker -H ${projectDockerDaemon} rm -f ${dockerContainerName} | true + + docker -H ${projectDockerDaemon} run -d ${dockerRunParam} ${dockerImageName} + """ + } + } + + + + + + + } +} +``` + + + + + +------------------------------------------------------------------- + +## 多节点 master 与 slave + +- 可以参考这篇: + + +------------------------------------------------------------------- ## 资料 - - -- \ No newline at end of file +- +- \ No newline at end of file diff --git a/markdown-file/Jira-Install-And-Settings.md b/markdown-file/Jira-Install-And-Settings.md index c3457adc..b831ae36 100644 --- a/markdown-file/Jira-Install-And-Settings.md +++ b/markdown-file/Jira-Install-And-Settings.md @@ -1,42 +1,82 @@ # Jira 安装和配置 +## Jira 7.13.3 -## Jira 安装 - -- Jira 安装 - - 官网: - - 官网下载: - - 中文在线试用: - - 官网帮助说明: - - 官网中文语言包: - - Jira 6.3.6 网盘下载: - - Jira 6.3.6 中文语言包网盘下载: - - 环境要求: - - JDK 7 或更新版本; - - Mysql - - 我们要使用的版本:**atlassian-jira-6.3.6.tar.gz** - - 我个人习惯 `/opt` 目录下创建一个目录 `setups` 用来存放各种软件安装包;在 `/usr` 目录下创建一个 `program` 用来存放各种解压后的软件包,下面的讲解也都是基于此习惯 - - 我个人已经使用了第三方源:`EPEL、RepoForge`,如果你出现 `yum install XXXXX` 安装不成功的话,很有可能就是你没有相关源,请查看我对源设置的文章 - - 解压:`tar zxvf atlassian-jira-6.3.6.tar.gz` - - 修改目录名:`mv atlassian-jira-6.3.6/ jira6.3.6/` - - 移到我个人的安装目录下:`mv jira6.3.6/ /usr/program/` - - 创建存放数据目录:`mkdir -p /usr/program/jira6.3.6/data/` - - 设置环境变量: - - 编辑:`vim /etc/profile` - - 在文件尾部添加: - ``` ini - JIRA_HOME=/usr/program/jira6.3.6/data/ - export JIRA_HOME - ``` - - 刷新配置:`source /etc/profile` - - 运行:`/usr/program/jira6.3.6/bin/start-jira.sh` - - 访问:`http://192.168.0.111:8080/` - - 汉化:`cp JIRA-6.3.6-language-pack-zh_CN.jar /usr/program/jira6.3.6/atlassian-jira/WEB-INF/lib/` - - 配置过程: - - ![Jira 安装和配置](../images/Jira-Install-And-Settings-a-1.jpg) - - ![Jira 安装和配置](../images/Jira-Install-And-Settings-a-2.jpg) - - ![Jira 安装和配置](../images/Jira-Install-And-Settings-a-3.jpg) - - ![Jira 安装和配置](../images/Jira-Install-And-Settings-a-4.jpg) - - ![Jira 安装和配置](../images/Jira-Install-And-Settings-a-5.jpg) - - ![Jira 安装和配置](../images/Jira-Install-And-Settings-a-6.jpg) - - 重新激活页面地址:`http://192.168.0.111:8090/secure/admin/ViewLicense.jspa` \ No newline at end of file +- 最新 7.13.3 版本时间:2019-04 + +#### 数据库 + +``` +docker run \ + --name mysql-jira \ + --restart always \ + -p 3306:3306 \ + -e MYSQL_ROOT_PASSWORD=adg123456 \ + -e MYSQL_DATABASE=jira_db \ + -e MYSQL_USER=jira_user \ + -e MYSQL_PASSWORD=jira_123456 \ + -d \ + mysql:5.7 +``` + +- 连上容器:`docker exec -it mysql-jira /bin/bash` + - 连上 MySQL:`mysql -u root -p` +- 设置编码:**必须做这一步,不然配置过程会报错,JIRA 的 DB 要求是 utf8mb4** + +``` +SET NAMES 'utf8mb4'; +alter database jira_db character set utf8mb4; +``` + + +#### 安装 + +- 下载: + - 选择:tar.gz 类型下载 +- 解压:`tar zxvf atlassian-jira-software-7.13.3.tar.gz` +- 创建 home 目录:`mkdir /usr/local/atlassian-jira-software-7.13.3-standalone/data` +- 配置 home 变量: + +``` +编辑:vim ~/.zshrc + +在文件尾部添加: + +JIRA_HOME=/usr/local/atlassian-jira-software-7.13.3-standalone/data +export JIRA_HOME + + +刷新配置:`source ~/.zshrc` +``` + +- 设置 MySQL 连接: +- 把 mysql-connector-java-5.1.47.jar 放在目录 `/usr/local/atlassian-jira-software-7.13.3-standalone/atlassian-jira/WEB-INF/lib` + + +#### License 过程 + +- 参考自己的为知笔记 + +#### 运行 + +- 启动:`sh /usr/local/atlassian-jira-software-7.13.3-standalone/bin/start-jira.sh` +- 停止:`sh /usr/local/atlassian-jira-software-7.13.3-standalone/bin/stop-jira.sh` + - `ps -ef | grep java` +- 查看 log:`tail -300f /usr/local/atlassian-jira-software-7.13.3-standalone/logs/catalina.out` +- 访问: + - 注意防火墙配置 +- 如果需要更换端口号可以修改:`/usr/local/atlassian-jira-software-7.13.3-standalone/conf/server.xml` 文件中的内容。 + + +#### 中文化 + +- 从 7.x 版本默认已经有中文支持,不需要再汉化了 +- 在安装后首次进入的时候就可以配置,选择中文了 + + +#### 首次配置 + +- 参考文章: +- 因为步骤一样,所以我就不再截图了。 + + diff --git a/markdown-file/K8S-Install-And-Usage.md b/markdown-file/K8S-Install-And-Usage.md new file mode 100644 index 00000000..bd14fb1d --- /dev/null +++ b/markdown-file/K8S-Install-And-Usage.md @@ -0,0 +1,536 @@ + + +# Kubernets(K8S) 使用 + +## 环境说明 + +- CentOS 7.5(不准确地说:要求必须是 CentOS 7 64位) +- Docker + +## Kubernetes + +- 目前流行的容器编排系统 +- 简称:K8S +- 官网: +- 主要解决几个问题: + - `调度` + - `生命周期及健康状况` + - `服务发现` + - `监控` + - `认证` + - `容器聚合` +- 主要角色:Master、Node + + +#### 安装准备 - Kubernetes 1.13 版本 + +- 推荐最低 2C2G,优先:2C4G 或以上 +- 特别说明:1.13 之前的版本,由于网络问题,需要各种设置,这里就不再多说了。1.13 之后相对就简单了点。 +- 优先官网软件包:kubeadm +- 官网资料: + - issues 入口: + - 源码入口: + - 安装指导: + - 按官网要求做下检查: + - 网络环境: + - 端口检查: + - **对 Docker 版本的支持,这里官网推荐的是 18.06**: +- 三大核心工具包,都需要各自安装,并且注意版本关系: + - `kubeadm`: the command to bootstrap the cluster. + - 集群部署、管理工具 + - `kubelet`: the component that runs on all of the machines in your cluster and does things like starting pods and containers. + - 具体执行层面的管理 Pod 和 Docker 工具 + - `kubectl`: the command line util to talk to your cluster. + - 操作 k8s 的命令行入口工具 +- 官网插件安装过程的故障排查: +- 其他部署方案: + - + - + - + +#### 开始安装 - Kubernetes 1.13.3 版本 + +- 三台机子: + - master-1:`192.168.0.127` + - node-1:`192.168.0.128` + - node-2:`192.168.0.129` +- 官网最新版本: +- 官网 1.13 版本的 changelog: +- **所有节点安装 Docker 18.06,并设置阿里云源** + - 可以参考:[点击我o(∩_∩)o ](https://github.com/judasn/Linux-Tutorial/blob/master/favorite-file/shell/install_docker_k8s_disable_firewalld_centos7-aliyun.sh) + - 核心,查看可以安装的 Docker 列表:`yum list docker-ce --showduplicates` +- 所有节点设置 kubernetes repo 源,并安装 Kubeadm、Kubelet、Kubectl 都设置阿里云的源 +- Kubeadm 初始化集群过程当中,它会下载很多的镜像,默认也是去 Google 家里下载。但是 1.13 新增了一个配置:`--image-repository` 算是救了命。 + +#### 安装具体流程 + +- 同步所有机子时间:`systemctl start chronyd.service && systemctl enable chronyd.service` +- 所有机子禁用防火墙、selinux、swap + +``` +systemctl stop firewalld.service +systemctl disable firewalld.service +systemctl disable iptables.service + +iptables -P FORWARD ACCEPT + +setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config + +echo "vm.swappiness = 0" >> /etc/sysctl.conf +swapoff -a && sysctl -w vm.swappiness=0 +``` + + +- 给各自机子设置 hostname 和 hosts + +``` +hostnamectl --static set-hostname k8s-master-1 +hostnamectl --static set-hostname k8s-node-1 +hostnamectl --static set-hostname k8s-node-2 + + +vim /etc/hosts +192.168.0.127 k8s-master-1 +192.168.0.128 k8s-node-1 +192.168.0.129 k8s-node-2 +``` + +- 给 master 设置免密 + +``` +ssh-keygen -t rsa + +cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys + + +ssh localhost + +ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@k8s-node-1(根据提示输入 k8s-node-1 密码) +ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@k8s-node-2(根据提示输入 k8s-node-2 密码) + +ssh k8s-master-1 +ssh k8s-node-1 +ssh k8s-node-2 +``` + + +- 给所有机子设置 yum 源 + +``` +vim /etc/yum.repos.d/kubernetes.repo + +[kubernetes] +name=Kubernetes +baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ +enabled=1 +gpgcheck=1 +repo_gpgcheck=1 +gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg + + +scp -r /etc/yum.repos.d/kubernetes.repo root@k8s-node-1:/etc/yum.repos.d/ +scp -r /etc/yum.repos.d/kubernetes.repo root@k8s-node-2:/etc/yum.repos.d/ +``` + +- 给 master 机子创建 flannel 配置文件 + +``` +mkdir -p /etc/cni/net.d && vim /etc/cni/net.d/10-flannel.conflist + +{ + "name": "cbr0", + "plugins": [ + { + "type": "flannel", + "delegate": { + "hairpinMode": true, + "isDefaultGateway": true + } + }, + { + "type": "portmap", + "capabilities": { + "portMappings": true + } + } + ] +} +``` + + + +- 给所有机子创建配置 + +``` +vim /etc/sysctl.d/k8s.conf + +net.bridge.bridge-nf-call-ip6tables = 1 +net.bridge.bridge-nf-call-iptables = 1 +net.ipv4.ip_forward=1 +vm.swappiness=0 + + +scp -r /etc/sysctl.d/k8s.conf root@k8s-node-1:/etc/sysctl.d/ +scp -r /etc/sysctl.d/k8s.conf root@k8s-node-2:/etc/sysctl.d/ + +modprobe br_netfilter && sysctl -p /etc/sysctl.d/k8s.conf +``` + +- 给所有机子安装组件 + +``` +yum install -y kubelet-1.13.3 kubeadm-1.13.3 kubectl-1.13.3 --disableexcludes=kubernetes +``` + +- 给所有机子添加一个变量 + +``` +vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf + +最后一行添加:Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs" +``` + + +- 启动所有机子 + +``` +systemctl enable kubelet && systemctl start kubelet + +kubeadm version +kubectl version + +``` + +- 初始化 master 节点: + +``` +echo 1 > /proc/sys/net/ipv4/ip_forward + + +kubeadm init \ +--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ +--pod-network-cidr 10.244.0.0/16 \ +--kubernetes-version 1.13.3 \ +--ignore-preflight-errors=Swap + +其中 10.244.0.0/16 是 flannel 插件固定使用的ip段,它的值取决于你准备安装哪个网络插件 + +这个过程会下载一些 docker 镜像,时间可能会比较久,看你网络情况。 +终端会输出核心内容: +[init] Using Kubernetes version: v1.13.3 +[preflight] Running pre-flight checks +[preflight] Pulling images required for setting up a Kubernetes cluster +[preflight] This might take a minute or two, depending on the speed of your internet connection +[preflight] You can also perform this action in beforehand using 'kubeadm config images pull' +[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" +[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" +[kubelet-start] Activating the kubelet service +[certs] Using certificateDir folder "/etc/kubernetes/pki" +[certs] Generating "front-proxy-ca" certificate and key +[certs] Generating "front-proxy-client" certificate and key +[certs] Generating "etcd/ca" certificate and key +[certs] Generating "etcd/server" certificate and key +[certs] etcd/server serving cert is signed for DNS names [k8s-master-1 localhost] and IPs [192.168.0.127 127.0.0.1 ::1] +[certs] Generating "etcd/peer" certificate and key +[certs] etcd/peer serving cert is signed for DNS names [k8s-master-1 localhost] and IPs [192.168.0.127 127.0.0.1 ::1] +[certs] Generating "etcd/healthcheck-client" certificate and key +[certs] Generating "apiserver-etcd-client" certificate and key +[certs] Generating "ca" certificate and key +[certs] Generating "apiserver-kubelet-client" certificate and key +[certs] Generating "apiserver" certificate and key +[certs] apiserver serving cert is signed for DNS names [k8s-master-1 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.0.127] +[certs] Generating "sa" key and public key +[kubeconfig] Using kubeconfig folder "/etc/kubernetes" +[kubeconfig] Writing "admin.conf" kubeconfig file +[kubeconfig] Writing "kubelet.conf" kubeconfig file +[kubeconfig] Writing "controller-manager.conf" kubeconfig file +[kubeconfig] Writing "scheduler.conf" kubeconfig file +[control-plane] Using manifest folder "/etc/kubernetes/manifests" +[control-plane] Creating static Pod manifest for "kube-apiserver" +[control-plane] Creating static Pod manifest for "kube-controller-manager" +[control-plane] Creating static Pod manifest for "kube-scheduler" +[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests" +[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s +[apiclient] All control plane components are healthy after 19.001686 seconds +[uploadconfig] storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace +[kubelet] Creating a ConfigMap "kubelet-config-1.13" in namespace kube-system with the configuration for the kubelets in the cluster +[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "k8s-master-1" as an annotation +[mark-control-plane] Marking the node k8s-master-1 as control-plane by adding the label "node-role.kubernetes.io/master=''" +[mark-control-plane] Marking the node k8s-master-1 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule] +[bootstrap-token] Using token: 8tpo9l.jlw135r8559kaad4 +[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles +[bootstraptoken] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials +[bootstraptoken] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token +[bootstraptoken] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster +[bootstraptoken] creating the "cluster-info" ConfigMap in the "kube-public" namespace +[addons] Applied essential addon: CoreDNS +[addons] Applied essential addon: kube-proxy + +Your Kubernetes master has initialized successfully! + +To start using your cluster, you need to run the following as a regular user: + + mkdir -p $HOME/.kube + sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config + sudo chown $(id -u):$(id -g) $HOME/.kube/config + +You should now deploy a pod network to the cluster. +Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: + https://kubernetes.io/docs/concepts/cluster-administration/addons/ + +You can now join any number of machines by running the following on each node +as root: + + kubeadm join 192.168.0.127:6443 --token 8tpo9l.jlw135r8559kaad4 --discovery-token-ca-cert-hash sha256:d6594ccc1310a45cbebc45f1c93f5ac113873786365ed63efcf667c952d7d197 +``` + +- 给 master 机子设置配置 + +``` +mkdir -p $HOME/.kube +sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config +sudo chown $(id -u):$(id -g) $HOME/.kube/config +export KUBECONFIG=$HOME/.kube/config +``` + +- 在 master 上查看一些环境 + +``` +kubeadm token list + +kubectl cluster-info +``` + +- 给 master 安装 Flannel + +``` +cd /opt && wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml + +kubectl apply -f /opt/kube-flannel.yml +``` + +- 到 node 节点加入集群: + +``` +echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables + +kubeadm join 192.168.0.127:6443 --token 8tpo9l.jlw135r8559kaad4 --discovery-token-ca-cert-hash sha256:d6594ccc1310a45cbebc45f1c93f5ac113873786365ed63efcf667c952d7d197 + +这时候终端会输出: + +[preflight] Running pre-flight checks +[discovery] Trying to connect to API Server "192.168.0.127:6443" +[discovery] Created cluster-info discovery client, requesting info from "https://192.168.0.127:6443" +[discovery] Requesting info from "https://192.168.0.127:6443" again to validate TLS against the pinned public key +[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.0.127:6443" +[discovery] Successfully established connection with API Server "192.168.0.127:6443" +[join] Reading configuration from the cluster... +[join] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml' +[kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.13" ConfigMap in the kube-system namespace +[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" +[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" +[kubelet-start] Activating the kubelet service +[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap... +[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "k8s-node-1" as an annotation + +This node has joined the cluster: +* Certificate signing request was sent to apiserver and a response was received. +* The Kubelet was informed of the new secure connection details. + +Run 'kubectl get nodes' on the master to see this node join the cluster. +``` + +- 如果 node 节点加入失败,可以:`kubeadm reset`,再来重新 join +- 在 master 节点上:`kubectl get cs` + +``` +NAME STATUS MESSAGE ERROR +controller-manager Healthy ok +scheduler Healthy ok +etcd-0 Healthy {"health": "true"} +结果都是 Healthy 则表示可以了,不然就得检查。必要时可以用:`kubeadm reset` 重置,重新进行集群初始化 +``` + + +- 在 master 节点上:`kubectl get nodes` + +``` +如果还是 NotReady,则查看错误信息:kubectl get pods --all-namespaces +其中:Pending/ContainerCreating/ImagePullBackOff 都是 Pod 没有就绪,我们可以这样查看对应 Pod 遇到了什么问题 +kubectl describe pod --namespace=kube-system +或者:kubectl logs -n kube-system +tail -f /var/log/messages +``` + + + +#### 主要概念 + +- Master 节点,负责集群的调度、集群的管理 + - 常见组件: + - kube-apiserver:API服务 + - kube-scheduler:调度 + - Kube-Controller-Manager:容器编排 + - Etcd:保存了整个集群的状态 + - Kube-proxy:负责为 Service 提供 cluster 内部的服务发现和负载均衡 + - Kube-DNS:负责为整个集群提供 DNS 服务 +- node 节点,负责容器相关的处理 + +- `Pods` + +``` +创建,调度以及管理的最小单元 +共存的一组容器的集合 +容器共享PID,网络,IPC以及UTS命名空间 +容器共享存储卷 +短暂存在 +``` + +- `Volumes` + +``` +数据持久化 +Pod中容器共享数据 +生命周期 +支持多种类型的数据卷 – emptyDir, hostpath, gcePersistentDisk, awsElasticBlockStore, nfs, iscsi, glusterfs, secrets +``` + +- `Labels` + +``` +用以标示对象(如Pod)的key/value对 +组织并选择对象子集 +``` + +- `Replication Controllers` + +``` +确保在任一时刻运行指定数目的Pod +容器重新调度 +规模调整 +在线升级 +多发布版本跟踪 +``` + +- `Services` + +``` +抽象一系列Pod并定义其访问规则 +固定IP地址和DNS域名 +通过环境变量和DNS发现服务 +负载均衡 +外部服务 – ClusterIP, NodePort, LoadBalancer +``` + + +#### 主要组成模块 + +- `etcd` + +``` +高可用的Key/Value存储 +只有apiserver有读写权限 +使用etcd集群确保数据可靠性 +``` + +- `apiserver` + +``` +Kubernetes系统入口, REST +认证 +授权 +访问控制 +服务帐号 +资源限制 +``` + +- `kube-scheduler` + +``` +资源需求 +服务需求 +硬件/软件/策略限制 +关联性和非关联性 +数据本地化 +``` + +- `kube-controller-manager` + +``` +Replication controller +Endpoint controller +Namespace controller +Serviceaccount controller +``` + +- `kubelet` + +``` +节点管理器 +确保调度到本节点的Pod的运行和健康 +``` + +- `kube-proxy` + +``` +Pod网络代理 +TCP/UDP请求转发 +负载均衡(Round Robin) +``` + +- `服务发现` + +``` +环境变量 +DNS – kube2sky, etcd,skydns +``` + +- `网络` + +``` +容器间互相通信 +节点和容器间互相通信 +每个Pod使用一个全局唯一的IP +``` + +- `高可用` + +``` +kubelet保证每一个master节点的服务正常运行 +系统监控程序确保kubelet正常运行 +Etcd集群 +多个apiserver进行负载均衡 +Master选举确保kube-scheduler和kube-controller-manager高可用 +``` + + +## 资料 + +- [如何更“优雅”地部署Kubernetes集群](https://juejin.im/entry/5a03f98d6fb9a04524054516) +- []() +- []() +- []() +- []() +- []() +- []() + + + + + + + + + + + + + + + + + + + + + diff --git a/markdown-file/Kafka-Install-And-Settings.md b/markdown-file/Kafka-Install-And-Settings.md index 4ff5826d..ff67a925 100644 --- a/markdown-file/Kafka-Install-And-Settings.md +++ b/markdown-file/Kafka-Install-And-Settings.md @@ -1,5 +1,14 @@ # Kafka 安装和配置 + +## 对于版本 + +- 由于 Kafka 经常会被连接到各个地方去,所以对于 Kafka 的版本,一般不能用太新的,要看你用在什么地方。 +- [Flink 的要求](https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/connectors/kafka.html) +- [Spark 的要求](https://spark.apache.org/docs/latest/streaming-kafka-integration.html) +- [Spring 的要求](http://projects.spring.io/spring-kafka/) + + ## 消息系统的好处 - 解耦(各个业务系统各自为政,有各自新需求,各自系统自行修改,只通过消息来通信) @@ -33,6 +42,7 @@ - Partition:是物理上的概念,每个 Topic 包含一个或多个 Partition。一般有几个 Broker,填写分区最好是等于大于节点值。分区目的主要是数据分片,解决水平扩展、高吞吐量。当 Producer 生产消息的时候,消息会被算法计算后分配到对应的分区,Consumer 读取的时候算法也会帮我们找到消息所在分区,这是内部实现的,应用层面不用管。 - Replication-factor:副本。假设有 3 个 Broker 的情况下,当副本为 3 的时候每个 Partition 会在每个 Broker 都会存有一份,目的主要是容错。 - 其中有一个 Leader。 + - 如果你只有一个 Broker,但是创建 Topic 的时候指定 Replication-factor 为 3,则会报错 - Consumer Group:每个 Consumer 属于一个特定的 Consumer Group(可为每个 Consumer 指定 group name,若不指定 group name 则属于默认的 group)一般一个业务系统集群指定同一个一个 group id,然后一个业务系统集群只能一个节点来消费同一个消息。 - Consumer Group 信息存储在 zookeeper 中,需要通过 zookeeper 的客户端来查看和设置 - 如果某 Consumer Group 中 consumer 数量少于 partition 数量,则至少有一个 consumer 会消费多个 partition 的数据 @@ -123,6 +133,8 @@ services: - /data/docker/kafka/logs:/data/docker/kafka/logs ``` +- 启动:`docker-compose up -d` +- 停止:`docker-compose stop` - 测试: - 进入 kafka 容器:`docker exec -it kafkadocker_kafka_1 /bin/bash` - 根据官网 Dockerfile 说明,kafka home 应该是:`cd /opt/kafka` @@ -358,15 +370,32 @@ wurstmeister/kafka:latest - 如果 kafka1 输入的消息,kafka2 和 kafka3 能收到,则表示已经成功。 +#### Kafka 认证配置 + +- 可以参考:[Kafka的SASL/PLAIN认证配置说明](http://www.2bowl.info/kafka%e7%9a%84saslplain%e8%ae%a4%e8%af%81%e9%85%8d%e7%bd%ae%e8%af%b4%e6%98%8e/) + + +#### Kafka 单纯监控 KafkaOffsetMonitor + +- Github 官网: + - README 带了下载地址和运行命令 + - 只是已经很久不更新了 + +#### 部署 kafka-manager + +- Github 官网: + - 注意官网说明的版本支持 +- 节点 1(没成功):`docker run -d --name=kafka-manager1 --restart=always -p 9000:9000 -e ZK_HOSTS="youmeekhost1:2181,youmeekhost2:2181,youmeekhost3:2181" sheepkiller/kafka-manager:latest` +- 源码类安装可以看:[Kafka监控工具—Kafka Manager](http://www.2bowl.info/kafka%e7%9b%91%e6%8e%a7%e5%b7%a5%e5%85%b7-kafka-manager/) +- Kafka manager 是一款管理 + 监控的工具,比较重 -#### 部署 kafka-manager(未能访问成功) -- 节点 1:`docker run -d --name=kafka-manager1 --restart=always -p 9000:9000 -e ZK_HOSTS="youmeekhost1:2181,youmeekhost2:2181,youmeekhost3:2181" sheepkiller/kafka-manager:latest` ---------------------------------------------------------------------------------------------- -## Kafka 1.0.1 源码安装 +## Kafka 1.0.1 源码安装(也支持 1.0.2、0.11.0.3、0.10.2.2) +- 测试环境:2G 内存足够 - 一台机子:CentOS 7.4,根据文章最开头,已经修改了 hosts - 确保本机安装有 JDK8(JDK 版本不能随便挑选) - 先用上面的 docker 方式部署一个 zookeeper,我这里的 zookeeper IP 地址为:`172.16.0.2` @@ -388,6 +417,8 @@ broker.id=1 listeners=PLAINTEXT://0.0.0.0:9092 # 向 Zookeeper 注册的地址。这里可以直接填写外网IP地址,但是不建议这样做,而是通过配置 hosts 的方式来设置。不然填写外网 IP 地址会导致所有流量都走外网(单节点多 broker 的情况下该参数必改) advertised.listeners=PLAINTEXT://youmeekhost:9092 +# zookeeper,存储了 broker 的元信息 +zookeeper.connect=youmeekhost:2181 # 日志数据目录,可以通过逗号来指定多个目录(单节点多 broker 的情况下该参数必改) log.dirs=/data/kafka/logs # 创建新 topic 的时候默认 1 个分区。需要特别注意的是:已经创建好的 topic 的 partition 的个数只可以被增加,不能被减少。 @@ -396,14 +427,13 @@ num.partitions=1 # 允许删除topic delete.topic.enable=false # 允许自动创建topic(默认是 true) -auto.create.topics.enable=false +auto.create.topics.enable=true # 磁盘IO不足的时候,可以适当调大该值 ( 当内存足够时 ) #log.flush.interval.messages=10000 #log.flush.interval.ms=1000 # kafka 数据保留时间 默认 168 小时 == 7 天 log.retention.hours=168 -# zookeeper,存储了 broker 的元信息 -zookeeper.connect=youmeekhost:2181 + # 其余都使用默认配置,但是顺便解释下: # borker 进行网络处理的线程数 @@ -426,12 +456,11 @@ socket.request.max.bytes=104857600 - 后台方式运行 kafka 服务:`cd /usr/local/kafka && bin/kafka-server-start.sh -daemon config/server.properties` - 停止 kafka 服务:`cd /usr/local/kafka && bin/kafka-server-stop.sh` - 再开一个终端测试: - - 进入目录:`cd /usr/local/kafka` - - 创建 topic 命令:`bin/kafka-topics.sh --create --zookeeper youmeekhost:2181 --replication-factor 1 --partitions 1 --topic my-topic-test` - - 查看 topic 命令:`bin/kafka-topics.sh --list --zookeeper youmeekhost:2181` - - 删除 topic:`bin/kafka-topics.sh --delete --topic my-topic-test --zookeeper youmeekhost:2181` - - 给 topic 发送消息命令:`bin/kafka-console-producer.sh --broker-list youmeekhost:9092 --topic my-topic-test`,然后在出现交互输入框的时候输入你要发送的内容 - - 再开一个终端,进入 kafka 容器,接受消息:`bin/kafka-console-consumer.sh --bootstrap-server youmeekhost:9092 --topic my-topic-test --from-beginning` + - 创建 topic 命令:`cd /usr/local/kafka && bin/kafka-topics.sh --create --zookeeper youmeekhost:2181 --replication-factor 1 --partitions 1 --topic my-topic-test` + - 查看 topic 命令:`cd /usr/local/kafka && bin/kafka-topics.sh --list --zookeeper youmeekhost:2181` + - 删除 topic:`cd /usr/local/kafka && bin/kafka-topics.sh --delete --topic my-topic-test --zookeeper youmeekhost:2181` + - 给 topic 发送消息命令:`cd /usr/local/kafka && bin/kafka-console-producer.sh --broker-list youmeekhost:9092 --topic my-topic-test`,然后在出现交互输入框的时候输入你要发送的内容 + - 再开一个终端,进入 kafka 容器,接受消息:`cd /usr/local/kafka && bin/kafka-console-consumer.sh --bootstrap-server youmeekhost:9092 --topic my-topic-test --from-beginning` - 此时发送的终端输入一个内容回车,接受消息的终端就可以收到。 - Spring Boot 依赖: @@ -455,6 +484,8 @@ socket.request.max.bytes=104857600 ``` +- 项目配置文件:bootstrap-servers 地址:`instance-3v0pbt5d:9092`(这里端口是 9092 别弄错了) + ---------------------------------------------------------------------------------------------- ## kafka 1.0.1 默认配置文件内容 diff --git a/markdown-file/Kibana-Base.md b/markdown-file/Kibana-Base.md index 22febb5a..45f85adc 100644 --- a/markdown-file/Kibana-Base.md +++ b/markdown-file/Kibana-Base.md @@ -2,12 +2,68 @@ ## 基础知识 -- 官网文档: +- 官网文档: +### 安装 Kibana -## 案例 +- CentOS 7.4 +- 至少需要 500M 内存 +- 官网文档: +- 官网文档 CentOS: +- 添加 KEY:`rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch` +- 添加源:`vim /etc/yum.repos.d/kibana.repo` +``` +[kibana-6.x] +name=Kibana repository for 6.x packages +baseurl=https://artifacts.elastic.co/packages/6.x/yum +gpgcheck=1 +gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch +enabled=1 +autorefresh=1 +type=rpm-md +``` +- 开始安装:`yum install -y kibana`,预计文件有 200M 左右,国内网络安装可能会很慢,慢慢等 + - 安装完后会多了一个:kibana 用户和组 +- 启动和停止软件(默认是不启动的): + - 启动:`systemctl start kibana.service` + - 状态:`systemctl status kibana.service` + - 停止:`systemctl stop kibana.service` + - 重新启动:`systemctl restart kibana.service` +- 安装完成后,增加系统自启动: + - `/bin/systemctl daemon-reload` + - `/bin/systemctl enable kibana.service` + +#### RPM 安装后的一些配置位置说明 + +- 官网文档 CentOS: +- 配置文件的参数说明: +- kibana 安装后位置:`/usr/share/kibana` +- kibana 的配置文件:`/etc/kibana/kibana.yml` +- Log 位置:`/var/log/kibana/` +- 数据位置:`/var/lib/kibana` +- 插件位置:`/usr/share/kibana/plugins` + + +#### 配置 + +- 编辑配置文件:`vim /etc/kibana/kibana.yml` +- 默认只能 localhost 访问,修改成支持外网访问 + +``` +打开这个注释:#server.host: "localhost" +改为:server.host: "0.0.0.0" +``` + +- 然后你可以访问:`http://192.168.0.105:5601`,可以看到 kibana 的相关界面。 + - 1. Create index pattern + - 如果你 Elasticsearch 新创建了索引,kibana 是不会自动帮你匹配到的,所以要匹配新索引,这一步都要走 + - 2. Discover | 右上角筛选时间区间 + - 这一步非常重要,里面的 filter,图表等都是基于此时间区间的 +- 在 logstash 安装这一步,如果你刚刚有按着我说的去做一个 elasticsearch 索引,那你此时不会看到这样的提示:`Unable to fetch mapping. Do you have indices matching the pattern?` + - 此时你可以直接点击 `create` 统计 `logstash-*` 格式的索引结果,看到相关内容 + - 如果你知道你的索引名称的规则,比如我现在要统计 Tomcat 的相关索引,我的索引名称是:`tomcat-log-*`,则我输入这个,点击:create 即可。 ## 资料 diff --git a/markdown-file/Maven-Install-And-Settings.md b/markdown-file/Maven-Install-And-Settings.md index 6a432db7..fa342b94 100644 --- a/markdown-file/Maven-Install-And-Settings.md +++ b/markdown-file/Maven-Install-And-Settings.md @@ -1,42 +1,42 @@ # Maven 安装和配置 +## Maven 资料 + +- 官网: +- 官网下载: +- 历史版本下载: +- 此时(20160208) Maven 最新版本为:**3.3.9** + +## Maven 安装(bash 环境) + +- Maven 3.3 的 JDK 最低要求是 JDK 7 +- 下载压缩包:`wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz` +- 解压:`tar zxvf apache-maven-3.3.9-bin.tar.gz` +- 修改目录名,默认的太长了:`mv apache-maven-3.3.9/ maven3.3.9/` +- 移到我个人习惯的安装目录下:`mv maven3.3.9/ /usr/local` +- 环境变量设置:`vim /etc/profile` +- 在文件最尾巴添加下面内容: + +``` ini +# Maven +MAVEN_HOME=/usr/local/maven3.3.9 +M3_HOME=/usr/local/maven3.3.9 +PATH=$PATH:$M3_HOME/bin +MAVEN_OPTS="-Xms256m -Xmx356m" +export M3_HOME +export MAVEN_HOME +export PATH +export MAVEN_OPTS +``` - -## Maven 安装 - -- Maven 安装 - - 官网: - - 官网下载: - - 历史版本下载: - - 此时(20160208) Maven 最新版本为:**3.3.9** - - Maven 3.3 的 JDK 最低要求是 JDK 7 - - 我个人习惯 `/opt` 目录下创建一个目录 `setups` 用来存放各种软件安装包;在 `/usr` 目录下创建一个 `program` 用来存放各种解压后的软件包,下面的讲解也都是基于此习惯 - - 我个人已经使用了第三方源:`EPEL、RepoForge`,如果你出现 `yum install XXXXX` 安装不成功的话,很有可能就是你没有相关源,请查看我对源设置的文章 - - 下载压缩包:`wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz` - - 解压:`tar zxvf apache-maven-3.3.9-bin.tar.gz` - - 修改目录名,默认的太长了:`mv apache-maven-3.3.9/ maven3.3.9/` - - 移到我个人习惯的安装目录下:`mv maven3.3.9/ /usr/program` - - 环境变量设置:`vim /etc/profile` - - 在文件最尾巴添加下面内容: - - ``` ini - # Maven - MAVEN_HOME=/usr/program/maven3.3.9 - PATH=$PATH:$MAVEN_HOME/bin - MAVEN_OPTS="-Xms256m -Xmx356m" - export MAVEN_HOME - export PATH - export MAVEN_OPTS - ``` - - - 刷新配置文件:`source /etc/profile` - - 测试是否安装成功:`mvn -version` - +- 刷新配置文件:`source /etc/profile` +- 测试是否安装成功:`mvn -version` ## Maven 配置 +- 创建本地参数:`mkdir -p /opt/maven-repository` - 配置项目连接上私服 -- 全局方式配置: +- 编辑配置文件:`vim /usr/local/maven3.3.9/conf/settings.xml` ``` xml @@ -44,7 +44,7 @@ - D:/maven/my_local_repository + /opt/maven-repository @@ -66,80 +66,23 @@ - + - nexus-releases + aliyun-releases * - http://localhost:8081/nexus/content/groups/public + http://maven.aliyun.com/nexus/content/groups/public/ - nexus-snapshots + aliyun-snapshots * - http://localhost:8081/nexus/content/groups/public-snapshots + http://maven.aliyun.com/nexus/content/groups/public/ - - - - nexus - - - nexus-releases - http://nexus-releases - - true - - - true - - - - nexus-snapshots - http://nexus-snapshots - - true - - - true - - - - - - nexus-releases - http://nexus-releases - - true - - - true - - - - nexus-snapshots - http://nexus-snapshots - - true - - - true - - - - - - - - nexus - - ``` -- 项目级别: - diff --git a/markdown-file/MongoDB-Install-And-Settings.md b/markdown-file/MongoDB-Install-And-Settings.md index 8c4873cd..f05e7b74 100644 --- a/markdown-file/MongoDB-Install-And-Settings.md +++ b/markdown-file/MongoDB-Install-And-Settings.md @@ -22,8 +22,9 @@ - 请查看介绍中支持哪个版本: - 目前 201712 支持 MongoDB 3.4 +------------------------------------------------------------------- -## Docker 下安装 MongoDB +## Docker 下安装 MongoDB(方式一) - 先创建一个宿主机以后用来存放数据的目录:`mkdir -p /data/docker/mongo/db` - 赋权:`chmod 777 -R /data/docker/mongo/db` @@ -48,18 +49,66 @@ db.createUser( - 然后删除容器:`docker rm cloud-mongo` - 重新运行镜像,这次增加需要授权才能访问的配置:`docker run -d -p 27017:27017 -v /data/docker/mongo/db:/data/db --restart always --name cloud-mongo mongo:3.4 --auth` - 重新启动服务:`docker restart cloud-mongo` +- 导出:`docker exec -it cloud-mongo mongoexport -h 127.0.0.1 -u 用户名 -p 密码 -d 库名 -c 集合名 -o /data/db/mongodb.json --type json` +- 导入:`docker exec -it cloud-mongo mongoimport -h 127.0.0.1 -u 用户名 -p 密码 -d 库名 -c 集合名 --file /data/db/mongodb.json --type json` -## 安装环境 -- CentOS 6 +## Docker 下安装 MongoDB(方式二) + +- 先创建一个宿主机以后用来存放数据的目录:`mkdir -p /data/docker/mongo/db` +- 赋权:`chmod 777 -R /data/docker/mongo/db` +- 运行镜像:`docker run --name cloud-mongo2 -p 37017:27017 -v /data/docker/mongo/db:/data/db -d mongo:3.4 --auth` +- 进入容器中 mongo shell 交互界面:`docker exec -it cloud-mongo2 mongo` +- 创建一个超级用户: + +``` +use admin + +db.createUser( + { + user: "mongo-admin", + pwd: "123456", + roles: [ + { role: "root", db: "admin" } + ] + } +) + +db.auth("mongo-admin","123456") +``` + +- 使用 db.auth() 可以对数据库中的用户进行验证,如果验证成功则返回 1,否则返回 0 +- 接着创建一个普通数据库和用户: + +``` + +use my_test_db -## MongoDB 安装 + +db.createUser( + { + user: "mytestuser", + pwd: "123456", + roles: [ + { role: "dbAdmin", db: "my_test_db" }, + { role: "readWrite", db: "my_test_db" } + ] + } +) + + +db.auth("mytestuser","123456") +``` + +------------------------------------------------------------------- + +## MongoDB 传统方式安装 - 关闭 SELinux - 编辑配置文件:`vim /etc/selinux/config` - 把 `SELINUX=enforcing` 改为 `SELINUX=disabled` -- MongoDB 安装 +- MongoDB 资料 - 官网: - 官网文档: - 此时(20170228) 最新稳定版本为:**3.4.2** @@ -361,6 +410,15 @@ $ne ->not equal 不等于 - Robomongo: +## 基准测试 + +- + +## 随机生成测试数据 + +- + + ## 资料 - diff --git a/markdown-file/Mysql-Install-And-Settings.md b/markdown-file/Mysql-Install-And-Settings.md index 4ab03b28..5eb73d43 100644 --- a/markdown-file/Mysql-Install-And-Settings.md +++ b/markdown-file/Mysql-Install-And-Settings.md @@ -1,11 +1,38 @@ # MySQL 安装和配置 -## Docker 安装 MySQL +## Docker 安装 MySQL(不带挂载) + +``` +docker run \ + --name mysql-jira \ + --restart always \ + -p 3306:3306 \ + -e MYSQL_ROOT_PASSWORD=adg_123456 \ + -e MYSQL_DATABASE=jira_db \ + -e MYSQL_USER=jira_user \ + -e MYSQL_PASSWORD=jira_123456 \ + -d \ + mysql:5.7 +``` + + +- 连上容器:`docker exec -it mysql-jira /bin/bash` + - 连上 MySQL:`mysql -u root -p` +- 设置编码: + +``` +SET NAMES 'utf8mb4'; +alter database jira_db character set utf8mb4; +``` + + + +## Docker 安装 MySQL(带挂载) - 关掉:SELinux - 创建本地数据存储 + 配置文件目录:`mkdir -p /data/docker/mysql/datadir /data/docker/mysql/conf /data/docker/mysql/log` -- 在宿主机上创建一个配置文件:`vim /data/docker/mysql/conf/mycat-mysql-1.cnf`,内容如下: +- 在宿主机上创建一个配置文件:`vim /data/docker/mysql/conf/mysql-1.cnf`,内容如下: ``` # 该编码设置是我自己配置的 @@ -36,10 +63,12 @@ max_allowed_packet = 50M - 赋权(避免挂载的时候,一些程序需要容器中的用户的特定权限使用):`chmod -R 777 /data/docker/mysql/datadir /data/docker/mysql/log` - 赋权:`chown -R 0:0 /data/docker/mysql/conf` - - 配置文件的赋权比较特殊,如果是给 777 权限会报:[Warning] World-writable config file '/etc/mysql/conf.d/mycat-mysql-1.cnf' is ignored,所以这里要特殊对待。容器内是用 root 的 uid,所以这里与之相匹配赋权即可。 + - 配置文件的赋权比较特殊,如果是给 777 权限会报:[Warning] World-writable config file '/etc/mysql/conf.d/mysql-1.cnf' is ignored,所以这里要特殊对待。容器内是用 root 的 uid,所以这里与之相匹配赋权即可。 - 我是进入容器 bash 内,输入:`whoami && id`,看到默认用户的 uid 是 0,所以这里才 chown 0 -- `docker run -p 3306:3306 --name cloud-mysql -v /data/docker/mysql/datadir:/var/lib/mysql -v /data/docker/mysql/log:/var/log/mysql -v /data/docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=adg123456 -d mysql:5.7` -- 连上容器:`docker exec -it 09747cd7d0bd /bin/bash` +- `docker run -p 3306:3306 --name cloud-mysql -v /data/docker/mysql/datadir:/var/lib/mysql -v /data/docker/mysql/log:/var/log/mysql -v /data/docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7` +- 连上容器:`docker exec -it cloud-mysql /bin/bash` + - 连上 MySQL:`mysql -u root -p` + - 创建表:`CREATE DATABASE wormhole DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;` - 关于容器的 MySQL 配置,官网是这样说的: >> The MySQL startup configuration is specified in the file /etc/mysql/my.cnf, and that file in turn includes any files found in the /etc/mysql/conf.d directory that end with .cnf.Settings in files in this directory will augment and/or override settings in /etc/mysql/my.cnf. If you want to use a customized MySQL configuration,you can create your alternative configuration file in a directory on the host machine and then mount that directory location as /etc/mysql/conf.d inside the mysql container. @@ -70,8 +99,31 @@ max_allowed_packet = 50M - 备份:`docker exec cloud-mysql /usr/bin/mysqldump -u root --password=123456 DATABASE_Name > /opt/backup.sql` - 还原:`docker exec -i cloud-mysql /usr/bin/mysql -u root --password=123456 DATABASE_Name < /opt/backup.sql` +------------------------------------------------------------------- + + +## MySQL 5.5 安装 + +- [来源](https://blog.csdn.net/qingtian_1993/article/details/79692479) +- 设置仓库 + +``` +rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm +rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm +``` + +- 安装:`yum install mysql55w mysql55w-server`,用同时生产 mysql 的组和用户 +- 启动:`service mysqld start` +- 重置密码:`mysqladmin -u root password '123456'` +- 默认配置文件:`vim /etc/my.cnf` +- log 目录:`cd /var/log/mysqld.log` +- 查看服务 log:`tail -300 /var/log/mysqld.log` +- 给指定目录增加 mysql 用户组权限:`chown mysql.mysql /var/run/mysqld/` +- 官网 MySQL 启动失败,这篇文章经验值得推荐:[CentOS 7下MySQL服务启动失败的解决思路](https://www.cnblogs.com/ivictor/p/5146247.html) -## MySQL 安装 +------------------------------------------------------------------- + +## MySQL 5.6 安装 - 假设当前用户为:root - Mysql 安装 @@ -91,25 +143,25 @@ max_allowed_packet = 50M - 我们这次安装以 5.6 为实例 - 进入下载目录:`cd /opt/setups` - 解压压缩包:`tar zxvf mysql-5.6.35.tar.gz` - - 移到解压包:`mv /opt/setups/mysql-5.6.35 /usr/program/` + - 移到解压包:`mv /opt/setups/mysql-5.6.35 /usr/local/` - 安装依赖包、编译包:`yum install -y make gcc-c++ cmake bison-devel ncurses-devel autoconf` - - 进入解压目录:`cd /usr/program/mysql-5.6.35/` - - 生成安装目录:`mkdir -p /usr/program/mysql/data` - - 生成配置(使用 InnoDB):`cmake -DCMAKE_INSTALL_PREFIX=/usr/program/mysql -DMYSQL_DATADIR=/usr/program/mysql/data -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_EXTRA_CHARSETS:STRING=utf8mb4 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1` + - 进入解压目录:`cd /usr/local/mysql-5.6.35/` + - 生成安装目录:`mkdir -p /usr/local/mysql/data` + - 生成配置(使用 InnoDB):`cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_EXTRA_CHARSETS:STRING=utf8mb4 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1` - 更多参数说明可以查看: - 编译:`make`,这个过程比较漫长,一般都在 30 分钟左右,具体还得看机子配置,如果最后结果有 error,建议删除整个 mysql 目录后重新解压一个出来继续处理 - 安装:`make install` - 配置开机启动: - - `cp /usr/program/mysql-5.6.35/support-files/mysql.server /etc/init.d/mysql` + - `cp /usr/local/mysql-5.6.35/support-files/mysql.server /etc/init.d/mysql` - `chmod 755 /etc/init.d/mysql` - `chkconfig mysql on` - - 复制一份配置文件: `cp /usr/program/mysql-5.6.35/support-files/my-default.cnf /etc/my.cnf` - - 删除安装的目录:`rm -rf /usr/program/mysql-5.6.35/` + - 复制一份配置文件: `cp /usr/local/mysql-5.6.35/support-files/my-default.cnf /etc/my.cnf` + - 删除安装的目录:`rm -rf /usr/local/mysql-5.6.35/` - 添加组和用户及安装目录权限 - `groupadd mysql` #添加组 - `useradd -g mysql mysql -s /bin/false` #创建用户mysql并加入到mysql组,不允许mysql用户直接登录系统 - - `chown -R mysql:mysql /usr/program/mysql/data` #设置MySQL数据库目录权限 - - 初始化数据库:`/usr/program/mysql/scripts/mysql_install_db --basedir=/usr/program/mysql --datadir=/usr/program/mysql/data --skip-name-resolve --user=mysql` + - `chown -R mysql:mysql /usr/local/mysql/data` #设置MySQL数据库目录权限 + - 初始化数据库:`/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --skip-name-resolve --user=mysql` - 开放防火墙端口: - `iptables -I INPUT -p tcp -m tcp --dport 3306 -j ACCEPT` - `service iptables save` @@ -118,10 +170,33 @@ max_allowed_packet = 50M - 编辑配置文件:`vim /etc/selinux/config` - 把 `SELINUX=enforcing` 改为 `SELINUX=disabled` - 常用命令软连接,才可以在终端直接使用:mysql 和 mysqladmin 命令 - - `ln -s /usr/program/mysql/bin/mysql /usr/bin` - - `ln -s /usr/program/mysql/bin/mysqladmin /usr/bin` - - `ln -s /usr/program/mysql/bin/mysqldump /usr/bin` - - `ln -s /usr/program/mysql/bin/mysqlslap /usr/bin` + - `ln -s /usr/local/mysql/bin/mysql /usr/bin` + - `ln -s /usr/local/mysql/bin/mysqladmin /usr/bin` + - `ln -s /usr/local/mysql/bin/mysqldump /usr/bin` + - `ln -s /usr/local/mysql/bin/mysqlslap /usr/bin` + +## MySQL 5.7 YUM 安装 + +- 官网: + +``` + +禁用 selinux:setenforce 0 + +wget https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm +yum localinstall mysql57-community-release-el7-11.noarch.rpm +yum install mysql-community-server +一共 194M + +配置文件:/etc/my.cnf +systemctl start mysqld +systemctl status mysqld + +查看初次使用的临时密码:grep 'temporary password' /var/log/mysqld.log + +``` + +------------------------------------------------------------------- ## MySQL 配置 @@ -131,15 +206,15 @@ max_allowed_packet = 50M ``` nginx /etc/my.cnf -/usr/program/mysql/my.cnf -/usr/program/mysql/mysql-test/suite/ndb/my.cnf -/usr/program/mysql/mysql-test/suite/ndb_big/my.cnf +/usr/local/mysql/my.cnf +/usr/local/mysql/mysql-test/suite/ndb/my.cnf +/usr/local/mysql/mysql-test/suite/ndb_big/my.cnf ............. -/usr/program/mysql/mysql-test/suite/ndb_rpl/my.cnf +/usr/local/mysql/mysql-test/suite/ndb_rpl/my.cnf ``` -- 保留 **/etc/my.cnf** 和 **/usr/program/mysql/mysql-test/** 目录下配置文件,其他删除掉。 +- 保留 **/etc/my.cnf** 和 **/usr/local/mysql/mysql-test/** 目录下配置文件,其他删除掉。 - 我整理的一个单机版配置说明(MySQL 5.6,适用于 1G 内存的服务器): - [my.cnf](MySQL-Settings/MySQL-5.6/1G-Memory-Machine/my-for-comprehensive.cnf) - 其中我测试的结果,在不适用任何配置修改的情况下,1G 内存安装 MySQL 5.6 默认就会占用 400M 左右的内存,要降下来的核心配置要补上这几个参数: @@ -165,9 +240,9 @@ table_open_cache=256 - 解决办法: - 在终端中执行(CentOS 6):`service mysql stop` - 在终端中执行(CentOS 7):`systemctl stop mysql` - - 在终端中执行(前面添加的 Linux 用户 mysql 必须有存在):`/usr/program/mysql/bin/mysqld --skip-grant-tables --user=mysql` + - 在终端中执行(前面添加的 Linux 用户 mysql 必须有存在):`/usr/local/mysql/bin/mysqld --skip-grant-tables --user=mysql` - 此时 MySQL 服务会一直处于监听状态,你需要另起一个终端窗口来执行接下来的操作 - - 在终端中执行:`mysql -u root mysql` + - 在终端中执行:`mysql -u root mysql` 或者:`mysql -h 127.0.0.1 -u root -P 3306 -p` - 把密码改为:123456,进入 MySQL 命令后执行:`UPDATE user SET Password=PASSWORD('123456') where USER='root';FLUSH PRIVILEGES;` - 然后重启 MySQL 服务(CentOS 6):`service mysql restart` - 然后重启 MySQL 服务(CentOS 7):`systemctl restart mysql` @@ -196,6 +271,24 @@ set password = password('新密码'); FLUSH PRIVILEGES; ``` +## MySQL 5.7 + +- 报错内容: + +``` +Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'youmeek.nm.id' +which is not functionally dependent on columns in GROUP BY clause; +this is incompatible with sql_mode=only_full_group_by +``` + +- 查下自己的模式:`select version(), @@sql_mode;` +- 解决办法,修改 my.cnf,增加这一行: + +``` +sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION; +``` + + ## 小内存机子,MySQL 频繁挂掉解决办法(1G + CentOS 7.4) - 保存系统日志到本地进行查看:`cd /var/log/ && sz messages` @@ -250,9 +343,9 @@ swapon /swapfile ### 主库机子操作 - 主库操作步骤 - - 创建一个目录:`mkdir -p /usr/program/mysql/data/mysql-bin` + - 创建一个目录:`mkdir -p /usr/local/mysql/data/mysql-bin` - 主 DB 开启二进制日志功能:`vim /etc/my.cnf`, - - 添加一行:`log-bin = /usr/program/mysql/data/mysql-bin` + - 添加一行:`log-bin = /usr/local/mysql/data/mysql-bin` - 指定同步的数据库,如果不指定则同步全部数据库,其中 ssm 是我的数据库名:`binlog-do-db=ssm` - 主库关掉慢查询记录,用 SQL 语句查看当前是否开启:`SHOW VARIABLES LIKE '%slow_query_log%';`,如果显示 OFF 则表示关闭,ON 表示开启 - 重启主库 MySQL 服务 @@ -296,8 +389,8 @@ swapon /swapfile - `Slave_IO_Running:Yes` - 如果不是 Yes 也不是 No,而是 Connecting,那就表示从机连不上主库,需要你进一步排查连接问题。 - `Slave_SQL_Running:Yes` -- 如果你的 Slave_IO_Running 是 No,一般如果你是在虚拟机上测试的话,从库的虚拟机是从主库的虚拟机上复制过来的,那一般都会这样的,因为两台的 MySQL 的 UUID 值一样。你可以检查从库下的错误日志:`cat /usr/program/mysql/data/mysql-error.log` - - 如果里面提示 uuid 错误,你可以编辑从库的这个配置文件:`vim /usr/program/mysql/data/auto.cnf`,把配置文件中的:server-uuid 值随便改一下,保证和主库是不一样即可。 +- 如果你的 Slave_IO_Running 是 No,一般如果你是在虚拟机上测试的话,从库的虚拟机是从主库的虚拟机上复制过来的,那一般都会这样的,因为两台的 MySQL 的 UUID 值一样。你可以检查从库下的错误日志:`cat /usr/local/mysql/data/mysql-error.log` + - 如果里面提示 uuid 错误,你可以编辑从库的这个配置文件:`vim /usr/local/mysql/data/auto.cnf`,把配置文件中的:server-uuid 值随便改一下,保证和主库是不一样即可。 diff --git a/markdown-file/Mysql-Optimize.md b/markdown-file/Mysql-Optimize.md index 1cbad473..cd0c58d5 100644 --- a/markdown-file/Mysql-Optimize.md +++ b/markdown-file/Mysql-Optimize.md @@ -3,6 +3,15 @@ - 下面说的优化基于 MySQL 5.6,理论上 5.5 之后的都算适用,具体还是要看官网 +## 优秀材料 + +- +- +- <> +- <> +- <> + + ## 服务状态查询 - 查看当前数据库的状态,常用的有: @@ -10,14 +19,23 @@ - 查看刚刚执行 SQL 是否有警告信息:`SHOW WARNINGS;` - 查看刚刚执行 SQL 是否有错误信息:`SHOW ERRORS;` - 查看已经连接的所有线程状况:`SHOW FULL PROCESSLIST;` + - 输出参数说明: + - 可以结束某些连接:`kill id值` - 查看当前连接数量:`SHOW STATUS LIKE 'max_used_connections';` - 查看变量,在 my.cnf 中配置的变量会在这里显示:`SHOW VARIABLES;` + - 查询慢 SQL 配置:`show variables like 'slow%';` + - 开启慢 SQL:`set global slow_query_log='ON'` + - 查询慢 SQL 秒数值:` show variables like 'long%';` + - 调整秒速值:`set long_query_time=1;` - 查看当前MySQL 中已经记录了多少条慢查询,前提是配置文件中开启慢查询记录了. - `SHOW STATUS LIKE '%slow_queries%';` - 查询当前MySQL中查询、更新、删除执行多少条了,可以通过这个来判断系统是侧重于读还是侧重于写,如果是写要考虑使用读写分离。 - `SHOW STATUS LIKE '%Com_select%';` + - `SHOW STATUS LIKE '%Com_insert%';` - `SHOW STATUS LIKE '%Com_update%';` - `SHOW STATUS LIKE '%Com_delete%';` + - 如果 rollback 过多,说明程序肯定哪里存在问题 + - `SHOW STATUS LIKE '%Com_rollback%';` - 显示MySQL服务启动运行了多少时间,如果MySQL服务重启,该时间重新计算,单位秒 - `SHOW STATUS LIKE 'uptime';` - 显示查询缓存的状态情况 @@ -35,79 +53,172 @@ - 6. Qcache_not_cached # 没有进行缓存的查询的数量,通常是这些查询未被缓存或其类型不允许被缓存 - 7. Qcache_queries_in_cache # 在当前缓存的查询(和响应)的数量。 - 8. Qcache_total_blocks #缓存中块的数量。 +- 查询哪些表在被使用,是否有锁表:`SHOW OPEN TABLES WHERE In_use > 0;` +- 查询 innodb 状态(输出内容很多):`SHOW ENGINE INNODB STATUS;` +- 锁性能状态:`SHOW STATUS LIKE 'innodb_row_lock_%';` + - Innodb_row_lock_current_waits:当前等待锁的数量 + - Innodb_row_lock_time:系统启动到现在、锁定的总时间长度 + - Innodb_row_lock_time_avg:每次平均锁定的时间 + - Innodb_row_lock_time_max:最长一次锁定时间 + - Innodb_row_lock_waits:系统启动到现在、总共锁定次数 +- 帮我们分析表,并提出建议:`select * from my_table procedure analyse();` + + +## 系统表 + +- 当前运行的所有事务:`select * from information_schema.INNODB_TRX;` +- 当前事务出现的锁:`select * from information_schema.INNODB_LOCKS;` +- 锁等待的对应关系:`select * from information_schema.INNODB_LOCK_WAITS;` + + +## otpimizer trace +- 作用:输入我们想要查看优化过程的查询语句,当该查询语句执行完成后,就可以到 information_schema 数据库下的OPTIMIZER_TRACE表中查看 mysql 自己帮我们的完整优化过程 +- 是否打开(默认都是关闭):`SHOW VARIABLES LIKE 'optimizer_trace';` + - one_line的值是控制输出格式的,如果为on那么所有输出都将在一行中展示,不适合人阅读,所以我们就保持其默认值为off吧。 +- 打开配置:`SET optimizer_trace="enabled=on";` +- 关闭配置:`SET optimizer_trace="enabled=off";` +- 查询优化结果:`SELECT * FROM information_schema.OPTIMIZER_TRACE;` +``` +我们所说的基于成本的优化主要集中在optimize阶段,对于单表查询来说,我们主要关注optimize阶段的"rows_estimation"这个过程,这个过程深入分析了对单表查询的各种执行方案的成本; +对于多表连接查询来说,我们更多需要关注"considered_execution_plans"这个过程,这个过程里会写明各种不同的连接方式所对应的成本。 +反正优化器最终会选择成本最低的那种方案来作为最终的执行计划,也就是我们使用EXPLAIN语句所展现出的那种方案。 +如果有小伙伴对使用EXPLAIN语句展示出的对某个查询的执行计划很不理解,大家可以尝试使用optimizer trace功能来详细了解每一种执行方案对应的成本,相信这个功能能让大家更深入的了解MySQL查询优化器。 +``` -## my.cnf 常配置项 -- `key_buffer_size`,索引缓冲区大小。 -- `query_cache_size`,查询缓存。 -- `max_connections = 1000`,MySQL 的最大并发连接数 -- ``, -- ``, -- ``, -- ``, -- ``, -- ``, -- ``, -- ``, +## 查询优化(EXPLAIN 查看执行计划) +- 使用 EXPLAIN 进行 SQL 语句分析:`EXPLAIN SELECT * FROM sys_user;`,效果如下: -## 查询优化 +``` +id|select_type|table |partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra| +--|-----------|--------|----------|----|-------------|---|-------|---|----|--------|-----| + 1|SIMPLE |sys_user| |ALL | | | | | 2| 100| | +``` -- 使用 EXPLAIN 进行 SQL 语句分析:`EXPLAIN SELECT * FROM sys_user;` -- 得到的结果有下面几列: - - **id**,该列表示当前结果序号,无特殊意义,不重要 +- 简单描述 + - `id`:在一个大的查询语句中每个 SELECT 关键字都对应一个唯一的id + - `select_type`:SELECT 关键字对应的那个查询的类型 + - `table`:表名 + - `partitions`:匹配的分区信息 + - `type`:针对单表的访问方法 + - `possible_keys`:可能用到的索引 + - `key`:实际上使用的索引 + - `key_len`:实际使用到的索引长度 + - `ref`:当使用索引列等值查询时,与索引列进行等值匹配的对象信息 + - `rows`:预估的需要读取的记录条数 + - `filtered`:某个表经过搜索条件过滤后剩余记录条数的百分比 + - `Extra`:一些额外的信息 +- 有多个结果的场景分析 + - 有子查询的一般都会有多个结果,id 是递增值。但是,有些场景查询优化器可能对子查询进行重写,转换为连接查询。所以有时候 id 就不是自增值。 + - 对于连接查询一般也会有多个接口,id 可能是相同值,相同值情况下,排在前面的记录表示驱动表,后面的表示被驱动表 + - UNION 场景会有 id 为 NULL 的情况,这是一个去重后临时表,合并多个结果集的临时表。但是,UNION ALL 不会有这种情况,因为这个不需要去重。 +- 根据具体的描述: + - **id**,该列表示当前结果序号 - **select_type**,表示 SELECT 语句的类型,有下面几种 - - SIMPLE,表示简单查询,其中不包括连接查询和子查询 - - PRIMARY,表示主查询,或者是最外面的查询语句。比如你使用一个子查询语句,比如这条 SQL:`EXPLAIN SELECT * FROM (SELECT sys_user_id FROM sys_user WHERE sys_user_id = 1) AS temp_table;` - - 这条 SQL 有两个结果,其中有一个结果的类型就是 PRIMARY - - UNION,使用 UNION 的 SQL 是这个类型 - - DERIVED,在 SQL 中 From 后面子查询 - - SUBQUERY,子查询 + - `SIMPLE`:表示简单查询,其中不包括 UNION 查询和子查询 + - `PRIMARY`:对于包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY + - `UNION`:对于包含UNION或者UNION ALL的大查询来说,它是由几个小查询组成的,其中除了最左边的那个小查询以外,其余的小查询的select_type值就是UNION + - `UNION RESULT`:MySQL选择使用临时表来完成UNION查询的去重工作,针对该临时表的查询的select_type就是UNION RESULT + - `SUBQUERY`:如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是不相关子查询,并且查询优化器决定采用将该子查询物化的方案来执行该子查询时,该子查询的第一个SELECT关键字代表的那个查询的select_type就是SUBQUERY + - `DEPENDENT SUBQUERY`:如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是相关子查询,则该子查询的第一个SELECT关键字代表的那个查询的select_type就是DEPENDENT SUBQUERY + - `DEPENDENT UNION`:在包含UNION或者UNION ALL的大查询中,如果各个小查询都依赖于外层查询的话,那除了最左边的那个小查询之外,其余的小查询的select_type的值就是DEPENDENT UNION + - `DERIVED`:对于采用物化的方式执行的包含派生表的查询,该派生表对应的子查询的select_type就是DERIVED + - `MATERIALIZED`:当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询时,该子查询对应的select_type属性就是MATERIALIZED - 还有其他一些 - **table**,表名或者是子查询的一个结果集 - **type**,表示表的链接类型,分别有(以下的连接类型的顺序是从最佳类型到最差类型)**(这个属性重要)**: - 性能好: - - system,表仅有一行,这是 const 类型的特列,平时不会出现,这个也可以忽略不计。 - - const,数据表最多只有一个匹配行,因为只匹配一行数据,所以很快,常用于 PRIMARY KEY 或者 UNIQUE 索引的查询,可理解为 const 是最优化的。 - - eq_ref,mysql 手册是这样说的:"对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了 const 类型。它用在一个索引的所有部分被联接使用并且索引是 UNIQUE(唯一键) 也不是 PRIMARY KEY(主键)"。eq_ref 可以用于使用 = 比较带索引的列。 - - ref,查询条件索引既不是 UNIQUE(唯一键) 也不是 PRIMARY KEY(主键) 的情况。ref 可用于 = 或 < 或 > 操作符的带索引的列。 - - ref_or_null,该联接类型如同 ref,但是添加了 MySQL 可以专门搜索包含 NULL 值的行。在解决子查询中经常使用该联接类型的优化。 + - `system`:当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system,平时不会出现,这个也可以忽略不计。 + - `const`:当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const,常用于 PRIMARY KEY 或者 UNIQUE 索引的查询,可理解为 const 是最优化的。 + - `eq_ref`:在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是eq_ref + - `ref`:当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是ref。ref 可用于 = 或 < 或 > 操作符的带索引的列。 + - `ref_or_null`:当对普通二级索引进行等值匹配查询,该索引列的值也可以是NULL值时,那么对该表的访问方法就可能是ref_or_null - 性能较差: - - index_merge,该联接类型表示使用了索引合并优化方法。在这种情况下,key 列包含了使用的索引的清单,key_len 包含了使用的索引的最长的关键元素。 - - unique_subquery,该类型替换了下面形式的IN子查询的ref: `value IN (SELECT primary_key FROM single_table WHERE some_expr)`。unique_subquery 是一个索引查找函数,可以完全替换子查询,效率更高。 - - index_subquery,该联接类型类似于 unique_subquery。可以替换 IN 子查询, 但只适合下列形式的子查询中的非唯一索引: `value IN (SELECT key_column FROM single_table WHERE some_expr)` - - range,只检索给定范围的行, 使用一个索引来选择行。 - - index,该联接类型与 ALL 相同, 除了只有索引树被扫描。这通常比 ALL 快, 因为索引文件通常比数据文件小。 + - `index_merge`:该联接类型表示使用了索引合并优化方法。在这种情况下,key 列包含了使用的索引的清单,key_len 包含了使用的索引的最长的关键元素。 + - `unique_subquery`:类似于两表连接中被驱动表的eq_ref访问方法,unique_subquery是针对在一些包含IN子查询的查询语句中,如果查询优化器决定将IN子查询转换为EXISTS子查询,而且子查询可以使用到主键进行等值匹配的话,那么该子查询执行计划的type列的值就是unique_subquery + - `index_subquery`:index_subquery与unique_subquery类似,只不过访问子查询中的表时使用的是普通的索引 + - `range`:只检索给定范围的行, 使用一个索引来选择行。 + - `index`:该联接类型与 ALL 相同, 除了只有索引树被扫描。这通常比 ALL 快, 因为索引文件通常比数据文件小。 + - 再一次强调,对于使用InnoDB存储引擎的表来说,二级索引的记录只包含索引列和主键列的值,而聚簇索引中包含用户定义的全部列以及一些隐藏列,所以扫描二级索引的代价比直接全表扫描,也就是扫描聚簇索引的代价更低一些 - 性能最差: - - ALL,对于每个来自于先前的表的行组合, 进行完整的表扫描。(性能最差) - - **possible_keys**,指出 MySQL 能使用哪个索引在该表中找到行。如果该列为 NULL,说明没有使用索引,可以对该列创建索引来提供性能。**(这个属性重要)** - - **key**,显示 MySQL 实际决定使用的键 (索引)。如果没有选择索引, 键是 NULL。**(这个属性重要)** - - **key**_len,显示 MySQL 决定使用的键长度。如果键是 NULL, 则长度为 NULL。注意:key_len 是确定了 MySQL 将实际使用的索引长度。 - - **ref**,显示使用哪个列或常数与 key 一起从表中选择行。 - - **rows**,显示 MySQL 认为它执行查询时必须检查的行数。**(这个属性重要)** - - **Extra**,该列包含 MySQL 解决查询的详细信息: - - Distinct:MySQL 发现第 1 个匹配行后, 停止为当前的行组合搜索更多的行。 - - Not exists:MySQL 能够对查询进行 LEFT JOIN 优化, 发现 1 个匹配 LEFT JOIN 标准的行后, 不再为前面的的行组合在该表内检查更多的行。 - - range checked for each record (index map: #):MySQL 没有发现好的可以使用的索引, 但发现如果来自前面的表的列值已知, 可能部分索引可以使用。 - - Using filesort:MySQL 需要额外的一次传递, 以找出如何按排序顺序检索行。 - - Using index: 从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。 - - Using temporary: 为了解决查询,MySQL 需要创建一个临时表来容纳结果。 - - Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。 - - Using sort_union(...), Using union(...), Using intersect(...): 这些函数说明如何为 index_merge 联接类型合并索引扫描。 - - Using index for group-by: 类似于访问表的 Using index 方式,Using index for group-by 表示 MySQL 发现了一个索引, 可以用来查 询 GROUP BY 或 DISTINCT 查询的所有列, 而不要额外搜索硬盘访问实际的表。 -- **了解对索引不生效的查询情况 (这个属性重要)** - - 使用 LIKE 关键字的查询,在使用 LIKE 关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不起作用。只有“%”不在第一个位置,索引才会生效。 - - 使用联合索引的查询,MySQL 可以为多个字段创建索引,一个索引可以包括 16 个字段。对于联合索引,只有查询条件中使用了这些字段中第一个字段时,索引才会生效。 - - 使用 OR 关键字的查询,查询语句的查询条件中只有 OR 关键字,且 OR 前后的两个条件中的列都是索引列时,索引才会生效,否则,索引不生效。 -- 子查询优化 - - MySQL 从 4.1 版本开始支持子查询,使用子查询进行 SELECT 语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的 SQL 操作。 - - 子查询虽然很灵活,但是执行效率并不高。 - - 执行子查询时,MYSQL 需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响。 - - 优化: - - 可以使用连接查询(JOIN)代替子查询,连接查询时不需要建立临时表,其速度比子查询快。 + - `ALL`:对于每个来自于先前的表的行组合, 进行完整的表扫描。(性能最差) + - `possible_keys`,指出 MySQL 能使用哪个索引在该表中找到行。如果该列为 NULL,说明没有使用索引,可以对该列创建索引来提供性能。**(这个属性重要)** + - possible_keys列中的值并不是越多越好,可能使用的索引越多,查询优化器计算查询成本时就得花费更长时间,所以如果可以的话,尽量删除那些用不到的索引。 + - `key`,显示 MySQL 实际决定使用的键 (索引)。如果没有选择索引, 键是 NULL。**(这个属性重要)** + - 不过有一点比较特别,就是在使用index访问方法来查询某个表时,possible_keys列是空的,而key列展示的是实际使用到的索引 + - `key_len`,表示当优化器决定使用某个索引执行查询时,该索引记录的最大长度。如果键是可以为 NULL, 则长度多 1。 + - `ref`,显示使用哪个列或常数与 key 一起从表中选择行。 + - `rows`,显示 MySQL 认为它执行查询时必须检查的行数。**(这个属性重要)** + - `Extra`,该列包含 MySQL 解决查询的详细信息: + - `Distinct` MySQL 发现第 1 个匹配行后, 停止为当前的行组合搜索更多的行。 + - `Not exists` 当我们使用左(外)连接时,如果WHERE子句中包含要求被驱动表的某个列等于NULL值的搜索条件,而且那个列又是不允许存储NULL值的,那么在该表的执行计划的Extra列就会提示Not exists额外信息 + - `range checked for each record (index map: #)` MySQL 没有发现好的可以使用的索引, 但发现如果来自前面的表的列值已知, 可能部分索引可以使用。 + - `Using filesort` 有一些情况下对结果集中的记录进行排序是可以使用到索引的 + - 需要注意的是,如果查询中需要使用filesort的方式进行排序的记录非常多,那么这个过程是很耗费性能的,我们最好想办法将使用文件排序的执行方式改为使用索引进行排序。 + - `Using temporary` 在许多查询的执行过程中,MySQL可能会借助临时表来完成一些功能,比如去重、排序之类的,比如我们在执行许多包含DISTINCT、GROUP BY、UNION等子句的查询过程中,如果不能有效利用索引来完成查询,MySQL很有可能寻求通过建立内部的临时表来执行查询。如果查询中使用到了内部的临时表,在执行计划的Extra列将会显示Using temporary提示 + - 如果我们并不想为包含GROUP BY子句的查询进行排序,需要我们显式的写上:ORDER BY NULL + - 执行计划中出现Using temporary并不是一个好的征兆,因为建立与维护临时表要付出很大成本的,所以我们最好能使用索引来替代掉使用临时表 + - `Using join buffer (Block Nested Loop)` 在连接查询执行过程过,当被驱动表不能有效的利用索引加快访问速度,MySQL一般会为其分配一块名叫join buffer的内存块来加快查询速度,也就是我们所讲的基于块的嵌套循环算法 + - `Using where` + - 当我们使用全表扫描来执行对某个表的查询,并且该语句的WHERE子句中有针对该表的搜索条件时,在Extra列中会提示上述额外信息 + - 当使用索引访问来执行对某个表的查询,并且该语句的WHERE子句中有除了该索引包含的列之外的其他搜索条件时,在Extra列中也会提示上述额外信息 + - `Using sort_union(...), Using union(...), Using intersect(...)` 如果执行计划的Extra列出现了Using intersect(...)提示,说明准备使用Intersect索引合并的方式执行查询,括号中的...表示需要进行索引合并的索引名称;如果出现了Using union(...)提示,说明准备使用Union索引合并的方式执行查询;出现了Using sort_union(...)提示,说明准备使用Sort-Union索引合并的方式执行查询。 + - `Using index condition` 有些搜索条件中虽然出现了索引列,但却不能使用到索引 + - `Using index` 当我们的查询列表以及搜索条件中只包含属于某个索引的列,也就是在可以使用索引覆盖的情况下,在Extra列将会提示该额外信息 + - `Using index for group-by` 类似于访问表的 Using index 方式,Using index for group-by 表示 MySQL 发现了一个索引, 可以用来查 询 GROUP BY 或 DISTINCT 查询的所有列, 而不要额外搜索硬盘访问实际的表。 + + +## 查询不走索引优化 + +- WHERE字句的查询条件里有不等于号(WHERE column!=…),MYSQL将无法使用索引 +- 类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=…),MYSQL将无法使用索引 +- 在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,否则即使建立了索引也不会使用 +- 如果WHERE子句的查询条件里使用了比较操作符LIKE和REGEXP,MYSQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKE 'abc%',MYSQL将使用索引;如果条件是LIKE '%abc',MYSQL将不使用索引。 +- 在ORDER BY操作中,MYSQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。尽管如此,在涉及多个数据表的查询里,即使有索引可用,那些索引在加快ORDER BY操作方面也没什么作用。 +- 如果某个数据列里包含着许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含了净是些诸如“0/1”或“Y/N”等值,就没有必要为它创建一个索引。 +- 索引有用的情况下就太多了。基本只要建立了索引,除了上面提到的索引不会使用的情况下之外,其他情况只要是使用在WHERE条件里,ORDER BY 字段,联表字段,一般都是有效的。 建立索引要的就是有效果。 不然还用它干吗? 如果不能确定在某个字段上建立的索引是否有效果,只要实际进行测试下比较下执行时间就知道。 +- 如果条件中有or(并且其中有or的条件是不带索引的),即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 +- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 +- 如果mysql估计使用全表扫描要比使用索引快,则不使用索引 + + +## 子查询优化 + +- MySQL 从 4.1 版本开始支持子查询,使用子查询进行 SELECT 语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的 SQL 操作。 +- 子查询虽然很灵活,但是执行效率并不高。 +- 执行子查询时,MYSQL 需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响。 +- 优化: + - 可以使用连接查询(JOIN)代替子查询,连接查询时不需要建立临时表,其速度比子查询快。 + +## 其他查询优化 + +- 关联查询过程 + - 确保 ON 或者 using子句中的列上有索引 + - 确保任何的 groupby 和 orderby 中的表达式只涉及到一个表中的列。 +- count()函数优化 + - count()函数有一点需要特别注意:它是不统计值为NULL的字段的!所以:不能指定查询结果的某一列,来统计结果行数。即 count(xx column) 不太好。 + - 如果想要统计结果集,就使用 count(*),性能也会很好。 +- 分页查询(数据偏移量大的场景) + - 不允许跳页,只能上一页或者下一页 + - 使用 where 加上上一页 ID 作为条件(具体要看 explain 分析效果):`select xxx,xxx from test_table where id < '上页id分界值' order by id desc limit 20;` + +## 创表原则 + +- 所有字段均定义为 NOT NULL ,除非你真的想存 Null。因为表内默认值 Null 过多会影响优化器选择执行计划 + + +## 建立索引原则 + +- 使用区分度高的列作为索引,字段不重复的比例,区分度越高,索引树的分叉也就越多,一次性找到的概率也就越高。 +- 尽量使用字段长度小的列作为索引 +- 使用数据类型简单的列(int 型,固定长度) +- 选用 NOT NULL 的列。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。 +- 尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。这样也可避免索引重复。 + ## 数据库结构优化 @@ -142,7 +253,9 @@ - 插入数据之前执行禁止事务的自动提交,数据插入完成后再恢复,可以提供插入速度。 - 禁用:`SET autocommit = 0;` - 开启:`SET autocommit = 1;` - + - 插入数据之前执行禁止对外键的检查,数据插入完成后再恢复 + - 禁用:`SET foreign_key_checks = 0;` + - 开启:`SET foreign_key_checks = 1;` ## 服务器优化 @@ -152,7 +265,36 @@ - 可以看我整理的这篇文章: - 由于 binlog 日志的读写频繁,可以考虑在 my.cnf 中配置,指定这个 binlog 日志到一个 SSD 硬盘上。 + +## 锁相关 + +InnoDB支持事务;InnoDB 采用了行级锁。也就是你需要修改哪行,就可以只锁定哪行。 +在 Mysql 中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql 语句操作了主键索引,Mysql 就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。 +InnoDB 行锁是通过给索引项加锁实现的,如果没有索引,InnoDB 会通过隐藏的聚簇索引来对记录加锁。也就是说:如果不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁,实际效果跟表锁一样。因为没有了索引,找到某一条记录就得扫描全表,要扫描全表,就得锁定表。 + + +数据库的增删改操作默认都会加排他锁,而查询不会加任何锁。 + +排他锁:对某一资源加排他锁,自身可以进行增删改查,其他人无法进行任何操作。语法为: +select * from table for update; + +共享锁:对某一资源加共享锁,自身可以读该资源,其他人也可以读该资源(也可以再继续加共享锁,即 共享锁可多个共存),但无法修改。 +要想修改就必须等所有共享锁都释放完之后。语法为: +select * from table lock in share mode; + + + ## 资料 - - +- +- +- +- +- +- <> +- <> +- <> +- <> +- <> \ No newline at end of file diff --git a/markdown-file/Mysql-Test.md b/markdown-file/Mysql-Test.md index 4a6edfb9..f18d3f0f 100644 --- a/markdown-file/Mysql-Test.md +++ b/markdown-file/Mysql-Test.md @@ -47,6 +47,8 @@ - `--debug-info` 代表要额外输出 CPU 以及内存的相关信息。 - `--only-print` 打印压力测试的时候 mysqlslap 到底做了什么事,通过 sql 语句方式告诉我们。 +------------------------------------------------------------------- + ## sysbench 工具 @@ -148,6 +150,8 @@ Threads fairness: events (avg/stddev): 2748.6000/132.71 --总处理事件数/标准偏差 execution time (avg/stddev): 119.9907/0.00 --总执行时间/标准偏差 +------------------------------------------------------------------- + ## QPS 和 TPS 和说明 ### 基本概念 @@ -171,6 +175,348 @@ Threads fairness: - 每天300wPV的在单台机器上,这台机器需要多少QPS?对于这样的问题,假设每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间。( 3000000 * 0.8 ) / (3600 * 24 * 0.2 ) = 139 (QPS). - 如果一台机器的QPS是58,需要几台机器来支持?答:139 / 58 = 3 +------------------------------------------------------------------- + +## Percona TPCC-MySQL 测试工具(优先推荐) + +- 可以较好地模拟真实测试结果数据 +- 官网主页: + +``` +TPC-C 是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业务处理系统。 +TPC-C是TPC(Transaction Processing Performance Council)组织发布的一个测试规范,用于模拟测试复杂的在线事务处理系统。其测试结果包括每分钟事务数(tpmC),以及每事务的成本(Price/tpmC)。 +在进行大压力下MySQL的一些行为时经常使用。 +``` + +### 安装 + +- 先确定本机安装过 MySQL +- 并且安装过:`yum install mysql-devel` + +``` +git clone https://github.com/Percona-Lab/tpcc-mysql +cd tpcc-mysql/src +make + +如果make没报错,就会在tpcc-mysql 根目录文件夹下生成tpcc二进制命令行工具tpcc_load、tpcc_start + +如果要同时支持 PgSQL 可以考虑:https://github.com/Percona-Lab/sysbench-tpcc +``` + +### 测试的几个表介绍 + +``` +tpcc-mysql的业务逻辑及其相关的几个表作用如下: +New-Order:新订单,主要对应 new_orders 表 +Payment:支付,主要对应 orders、history 表 +Order-Status:订单状态,主要对应 orders、order_line 表 +Delivery:发货,主要对应 order_line 表 +Stock-Level:库存,主要对应 stock 表 + +其他相关表: +客户:主要对应customer表 +地区:主要对应district表 +商品:主要对应item表 +仓库:主要对应warehouse表 +``` + +### 准备 + +- 测试阿里云 ECS 与 RDS 是否相通: +- 记得在 RDS 添加账号和给账号配置权限,包括:配置权限、数据权限(默认添加账号后都是没有开启的,还要自己手动开启) +- 还要添加内网 ECS 到 RDS 的白名单 IP 里面 +- 或者在 RDS 上开启外网访问设置,但是也设置 IP 白名单(访问 ip.cn 查看自己的外网 IP 地址,比如:120.85.112.97) +- RDS 的内网地址和外网地址不一样,要认真看。 + +``` +ping rm-wz9v0vej02ys79jbj.mysql.rds.aliyuncs.com + +mysql -h rm-wz9v0vej02ys79jbj.mysql.rds.aliyuncs.com -P 3306 -u myaccount -p + +输入密码:Aa123456 +``` + + + +``` +创库,名字为:TPCC: +CREATE DATABASE TPCC DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; + + +导入项目中的出初始化数据脚本: +创建表:create_table.sql +/usr/bin/mysql -h rm-wz9v0vej02ys79jbj.mysql.rds.aliyuncs.com -u myaccount -p tpcc < /root/tpcc-mysql/create_table.sql + +创建索引和外键:add_fkey_idx.sql +/usr/bin/mysql -h rm-wz9v0vej02ys79jbj.mysql.rds.aliyuncs.com -u myaccount -p tpcc < /root/tpcc-mysql/add_fkey_idx.sql +``` + + +### 测试 + +- 数据库:阿里云 RDS-MySQL-5.7-2C4G +- 测试机:阿里云 ECS-4C4G-CentOS7.6 +- 根据测试,不同的 ECS 测试机,不同的 RDS 测试结果有时候差距挺大的,这个很蛋疼。 + +- 需要注意的是 tpcc 默认会读取 /var/lib/mysql/mysql.sock 这个 socket 文件。因此,如果你的socket文件不在相应路径的话,可以做个软连接,或者通过TCP/IP的方式连接测试服务器 +- 准备数据: + +``` +cd /opt/tpcc-mysql +./tpcc_load -h rm-wz9v0vej02ys79jbj.mysql.rds.aliyuncs.com -P 3306 -d TPCC -u myaccount -p Aa123456 -w 80 +-w 80 表示创建 80 个仓库数据 +这个过程花费时间还是挺长的,建议测试机是高性能计算型。2CPU 差不多要 8h,你自己估量下。 +我这边 RDS 监控中,曲线上每秒 insert 差不多在 2W 差不多,如果你没有这个数,速度可能就很慢了。 +我这边差不多用了 2.5h 完成数据准备。 + + +插入过程 RDS-2C4G 的监控情况: +CPU利用率 24% +内存 30% ~ 40% (随着数据增加而增大) +连接数:1% +IOPS:9% +已使用存储空间:5.5G ~ 10G + +要模拟出够真实的数据,仓库不要太少,一般要大于 100, +下面是基于 80 个库的最终数据: + +select count(*) from customer; + 2400000 +select count(*) from district; + 800 +select count(*) from history; + 2400000 +select count(*) from item; + 100000 +select count(*) from new_orders; + 720000 +select count(*) from order_line; + 23996450 +select count(*) from orders; + 2400000 +select count(*) from stock; + 8000000 +select count(*) from warehouse; + 80 +``` + +- 开始测试: + +``` + +./tpcc_start -h rm-wz9v0vej02ys79jbj.mysql.rds.aliyuncs.com -P 3306 -d TPCC -u myaccount -p Aa123456 -w 80 -c 200 -r 300 -l 1800 -f /opt/mysql_tpcc_100_20190325 + +-w 100 表示 100 个仓库数据 +-c 200 表示并发 200 个线程 +-r 300 表示预热 300 秒 +-l 1800 表示持续压测 1800 秒 +``` + + +### 报表 + + +``` + +188.000 TpmC +TpmC结果值(每分钟事务数,该值是第一次统计结果中的新订单事务数除以总耗时分钟数,例如本例中是:372/2=186) +tpmC值在国内外被广泛用于衡量计算机系统的事务处理能力 +``` + +- RDS-2C4G-80个仓库结果: +- CPU:100%,内存:34%,连接数:17%,IOPS:62%,磁盘空间:20G + + +``` +1780, trx: 979, 95%: 1849.535, 99%: 2402.613, max_rt: 3401.947, 986|3248.772, 98|698.821, 103|4202.110, 101|4547.416 +1790, trx: 1021, 95%: 1898.903, 99%: 2700.936, max_rt: 3848.142, 999|3150.117, 100|500.740, 102|3600.104, 100|5551.834 +1800, trx: 989, 95%: 1899.472, 99%: 2847.899, max_rt: 4455.064, 989|3049.921, 101|699.144, 97|3599.021, 102|5151.141 + +STOPPING THREADS........................................................................................................................................................................................................ + + + [0] sc:2 lt:174378 rt:0 fl:0 avg_rt: 1192.8 (5) + [1] sc:253 lt:173935 rt:0 fl:0 avg_rt: 542.7 (5) + [2] sc:4726 lt:12712 rt:0 fl:0 avg_rt: 144.7 (5) + [3] sc:0 lt:17435 rt:0 fl:0 avg_rt: 3029.8 (80) + [4] sc:0 lt:17435 rt:0 fl:0 avg_rt: 3550.7 (20) + in 1800 sec. + + + [0] sc:2 lt:174378 rt:0 fl:0 + [1] sc:254 lt:174096 rt:0 fl:0 + [2] sc:4726 lt:12712 rt:0 fl:0 + [3] sc:0 lt:17437 rt:0 fl:0 + [4] sc:0 lt:17435 rt:0 fl:0 + + (all must be [OK]) + [transaction percentage] + Payment: 43.45% (>=43.0%) [OK] + Order-Status: 4.35% (>= 4.0%) [OK] + Delivery: 4.35% (>= 4.0%) [OK] + Stock-Level: 4.35% (>= 4.0%) [OK] + [response time (at least 90% passed)] + New-Order: 0.00% [NG] * + Payment: 0.15% [NG] * + Order-Status: 27.10% [NG] * + Delivery: 0.00% [NG] * + Stock-Level: 0.00% [NG] * + + + 5812.667 TpmC +``` + +- 升级:RDS-4C8G-80个仓库结果 +- CPU:100%,内存:55%,连接数:10%,IOPS:20%,磁盘空间:25G + +``` +1780, trx: 2303, 95%: 796.121, 99%: 1099.640, max_rt: 1596.883, 2293|2249.288, 232|256.393, 230|1694.050, 235|2550.775 +1790, trx: 2336, 95%: 798.030, 99%: 1093.403, max_rt: 1547.840, 2338|2803.739, 234|305.185, 232|1799.869, 228|2453.748 +1800, trx: 2305, 95%: 801.381, 99%: 1048.528, max_rt: 1297.465, 2306|1798.565, 229|304.329, 227|1649.609, 233|2549.599 + +STOPPING THREADS........................................................................................................................................................................................................ + + + [0] sc:7 lt:406567 rt:0 fl:0 avg_rt: 493.7 (5) + [1] sc:10485 lt:395860 rt:0 fl:0 avg_rt: 240.1 (5) + [2] sc:24615 lt:16045 rt:0 fl:0 avg_rt: 49.4 (5) + [3] sc:0 lt:40651 rt:0 fl:0 avg_rt: 1273.6 (80) + [4] sc:0 lt:40656 rt:0 fl:0 avg_rt: 1665.3 (20) + in 1800 sec. + + + [0] sc:7 lt:406569 rt:0 fl:0 + [1] sc:10487 lt:396098 rt:0 fl:0 + [2] sc:24615 lt:16045 rt:0 fl:0 + [3] sc:0 lt:40655 rt:0 fl:0 + [4] sc:0 lt:40659 rt:0 fl:0 + + (all must be [OK]) + [transaction percentage] + Payment: 43.46% (>=43.0%) [OK] + Order-Status: 4.35% (>= 4.0%) [OK] + Delivery: 4.35% (>= 4.0%) [OK] + Stock-Level: 4.35% (>= 4.0%) [OK] + [response time (at least 90% passed)] + New-Order: 0.00% [NG] * + Payment: 2.58% [NG] * + Order-Status: 60.54% [NG] * + Delivery: 0.00% [NG] * + Stock-Level: 0.00% [NG] * + + + 13552.467 TpmC +``` + + +- 升级:RDS-8C16G-80个仓库结果 +- CPU:100%,内存:35%,连接数:5%,IOPS:18%,磁盘空间:30G + +``` +1780, trx: 4502, 95%: 398.131, 99%: 501.634, max_rt: 772.128, 4473|740.073, 446|183.361, 448|1042.264, 442|1302.569 +1790, trx: 4465, 95%: 398.489, 99%: 541.424, max_rt: 803.659, 4476|845.313, 448|152.917, 450|997.319, 454|1250.160 +1800, trx: 4506, 95%: 397.774, 99%: 501.334, max_rt: 747.074, 4508|701.625, 453|108.619, 450|1052.293, 451|1107.277 + +STOPPING THREADS........................................................................................................................................................................................................ + + + [0] sc:20 lt:803738 rt:0 fl:0 avg_rt: 240.5 (5) + [1] sc:13844 lt:789535 rt:0 fl:0 avg_rt: 128.5 (5) + [2] sc:54560 lt:25817 rt:0 fl:0 avg_rt: 22.1 (5) + [3] sc:0 lt:80372 rt:0 fl:0 avg_rt: 739.8 (80) + [4] sc:0 lt:80378 rt:0 fl:0 avg_rt: 771.1 (20) + in 1800 sec. + + + [0] sc:20 lt:803747 rt:0 fl:0 + [1] sc:13845 lt:789916 rt:0 fl:0 + [2] sc:54561 lt:25817 rt:0 fl:0 + [3] sc:0 lt:80377 rt:0 fl:0 + [4] sc:0 lt:80381 rt:0 fl:0 + + (all must be [OK]) + [transaction percentage] + Payment: 43.47% (>=43.0%) [OK] + Order-Status: 4.35% (>= 4.0%) [OK] + Delivery: 4.35% (>= 4.0%) [OK] + Stock-Level: 4.35% (>= 4.0%) [OK] + [response time (at least 90% passed)] + New-Order: 0.00% [NG] * + Payment: 1.72% [NG] * + Order-Status: 67.88% [NG] * + Delivery: 0.00% [NG] * + Stock-Level: 0.00% [NG] * + + + 26791.934 TpmC +``` + + +- 升级:RDS-16C64G-80个仓库结果 +- CPU:100%,内存:18%,连接数:2%,IOPS:10%,磁盘空间:40G + +``` +1780, trx: 8413, 95%: 203.560, 99%: 279.322, max_rt: 451.010, 8414|441.849, 841|92.900, 839|583.340, 843|644.276 +1790, trx: 8269, 95%: 204.599, 99%: 282.602, max_rt: 444.075, 8262|412.414, 827|91.551, 831|665.421, 824|616.396 +1800, trx: 8395, 95%: 202.285, 99%: 255.026, max_rt: 436.136, 8404|446.292, 839|87.081, 839|609.221, 842|697.509 + +STOPPING THREADS........................................................................................................................................................................................................ + + + [0] sc:37 lt:1532893 rt:0 fl:0 avg_rt: 124.8 (5) + [1] sc:36091 lt:1496111 rt:0 fl:0 avg_rt: 68.5 (5) + [2] sc:105738 lt:47555 rt:0 fl:0 avg_rt: 11.4 (5) + [3] sc:0 lt:153285 rt:0 fl:0 avg_rt: 404.6 (80) + [4] sc:0 lt:153293 rt:0 fl:0 avg_rt: 389.5 (20) + in 1800 sec. + + + [0] sc:37 lt:1532918 rt:0 fl:0 + [1] sc:36093 lt:1496868 rt:0 fl:0 + [2] sc:105739 lt:47556 rt:0 fl:0 + [3] sc:0 lt:153297 rt:0 fl:0 + [4] sc:0 lt:153298 rt:0 fl:0 + + (all must be [OK]) + [transaction percentage] + Payment: 43.47% (>=43.0%) [OK] + Order-Status: 4.35% (>= 4.0%) [OK] + Delivery: 4.35% (>= 4.0%) [OK] + Stock-Level: 4.35% (>= 4.0%) [OK] + [response time (at least 90% passed)] + New-Order: 0.00% [NG] * + Payment: 2.36% [NG] * + Order-Status: 68.98% [NG] * + Delivery: 0.00% [NG] * + Stock-Level: 0.00% [NG] * + + + 51097.668 TpmC +``` + + +- 几轮下来,最终数据量: + +``` +select count(*) from customer; + 2400000 +select count(*) from district; + 800 +select count(*) from history; + 5779395 +select count(*) from item; + 100000 +select count(*) from new_orders; + 764970 +select count(*) from order_line; + 57453708 +select count(*) from orders; + 5745589 +select count(*) from stock; + 8000000 +select count(*) from warehouse; + 80 +``` ## 资料 @@ -181,3 +527,4 @@ Threads fairness: - - - +- \ No newline at end of file diff --git a/markdown-file/Nginx-Install-And-Settings.md b/markdown-file/Nginx-Install-And-Settings.md index 58a04b8c..6a5ffb0c 100644 --- a/markdown-file/Nginx-Install-And-Settings.md +++ b/markdown-file/Nginx-Install-And-Settings.md @@ -44,8 +44,8 @@ ## Nginx 的 Docker 部署 -- 预设好目录,在宿主机上创建下面目录:`mkdir -p /data/docker/nginx/html /data/docker/nginx/conf.d /data/docker/nginx/logs /data/docker/nginx/conf` -- **重点**:先准备好你的 nginx.conf 文件,存放在宿主机的:/data/docker/nginx/conf 目录下,等下需要映射。 +- 预设好目录,在宿主机上创建下面目录:`mkdir -p /data/docker/nginx/logs /data/docker/nginx/conf` +- **重点**:先准备好你的 nginx.conf 文件,存放在宿主机的:`vim /data/docker/nginx/conf/nginx.conf` 目录下,等下需要映射。 ``` worker_processes 1; @@ -74,14 +74,56 @@ http { } ``` +- 官网镜像: - 下载镜像:`docker pull nginx:1.12.2` -- 运行容器:`docker run --name youmeek-nginx -p 80:80 -v /data/docker/nginx/html:/usr/share/nginx/html:ro -v /data/docker/nginx/conf.d:/etc/nginx/conf.d -v /data/docker/nginx/logs:/var/log/nginx -v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx:1.12.2` +- 运行容器:`docker run --name youmeek-nginx -p 80:80 -v /data/docker/nginx/logs:/var/log/nginx -v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx:1.12.2` - 重新加载配置(目前测试无效,只能重启服务):`docker exec -it youmeek-nginx nginx -s reload` - 停止服务:`docker exec -it youmeek-nginx nginx -s stop` 或者:`docker stop youmeek-nginx` - 重新启动服务:`docker restart youmeek-nginx` -## Nginx 源码编译安装 +------------------------------------------------------------------- + + +## YUM 安装(版本一般滞后半年左右) + +- 安装:`yum install -y nginx`,同时增加了一个 nginx 用户组和用户 +- 默认配置文件位置:`vim /etc/nginx/nginx.conf` +- 其他配置文件位置:`cd /etc/nginx/conf.d/` +- 模块配置文件位置:`cd /usr/share/nginx/modules/` +- 默认 HTML 静态文件位置:`cd /usr/share/nginx/html` +- log 存放目录:`cd /var/log/nginx/` +- 状态:`systemctl status nginx` +- 启动:`systemctl start nginx` +- 启动:`systemctl stop nginx` +- 刷新配置:`nginx -s reload` +- 查看版本和 YUM 自带的模块:`nginx -V` + + +------------------------------------------------------------------- + +## Nginx 源码编译安装(带 Prometheus 模块) + +``` +./configure \ +--prefix=/usr/local/nginx \ +--pid-path=/var/local/nginx/nginx.pid \ +--lock-path=/var/lock/nginx/nginx.lock \ +--error-log-path=/var/log/nginx/error.log \ +--http-log-path=/var/log/nginx/access.log \ +--with-http_gzip_static_module \ +--http-client-body-temp-path=/var/temp/nginx/client \ +--http-proxy-temp-path=/var/temp/nginx/proxy \ +--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ +--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ +--with-http_ssl_module \ +--with-http_stub_status_module \ +--http-scgi-temp-path=/var/temp/nginx/scgi \ +--add-module=/usr/local/nginx-module-vts +``` + + +## Nginx 源码编译安装(带监控模块) - 官网下载最新稳定版本 **1.8.1**,大小:814K - 官网安装说明: @@ -110,33 +152,45 @@ http { --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ --with-http_ssl_module \ +--with-http_stub_status_module \ --http-scgi-temp-path=/var/temp/nginx/scgi ``` - - 编译:`make` - - 安装:`make install` +- 编译:`make` +- 安装:`make install` - 启动 Nginx - - 先检查是否在 /usr/local 目录下生成了 Nginx 等相关文件:`cd /usr/local/nginx;ll`,正常的效果应该是显示这样的: - - ``` nginx - drwxr-xr-x. 2 root root 4096 3月 22 16:21 conf - drwxr-xr-x. 2 root root 4096 3月 22 16:21 html - drwxr-xr-x. 2 root root 4096 3月 22 16:21 sbin - ``` - - - 停止防火墙:`service iptables stop` - - 或是把 80 端口加入到的排除列表: - - `sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT` - - `sudo service iptables save` - - `sudo service iptables restart` - - 启动:`/usr/local/nginx/sbin/nginx`,启动完成 shell 是不会有输出的 - - 检查 时候有 Nginx 进程:`ps aux | grep nginx`,正常是显示 3 个结果出来 - - 检查 Nginx 是否启动并监听了 80 端口:`netstat -ntulp | grep 80` - - 访问:`192.168.1.114`,如果能看到:`Welcome to nginx!`,即可表示安装成功 - - 检查 Nginx 启用的配置文件是哪个:`/usr/local/nginx/sbin/nginx -t` - - 刷新 Nginx 配置后重启:`/usr/local/nginx/sbin/nginx -s reload` - - 停止 Nginx:`/usr/local/nginx/sbin/nginx -s stop` - - 如果访问不了,或是出现其他信息看下错误立即:`vim /var/log/nginx/error.log` + - 先检查是否在 /usr/local 目录下生成了 Nginx 等相关文件:`cd /usr/local/nginx;ll`,正常的效果应该是显示这样的: + +``` nginx +drwxr-xr-x. 2 root root 4096 3月 22 16:21 conf +drwxr-xr-x. 2 root root 4096 3月 22 16:21 html +drwxr-xr-x. 2 root root 4096 3月 22 16:21 sbin +``` + +- 如果要检查刚刚编译的哪些模块,可以:`nginx -V` + +``` +nginx version: nginx/1.8.0 +built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) +built with OpenSSL 1.0.1e-fips 11 Feb 2013 +TLS SNI support enabled +configure arguments: --user=nginx --group=nginx --prefix=/usr/local/nginx --pid-path=/usr/local/nginx/run/nginx.pid --lock-path=/usr/local/nginx/lock/nginx.lock --with-http_ssl_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module +``` + + +- 停止防火墙:`service iptables stop` + - 或是把 80 端口加入到的排除列表: + - `sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT` + - `sudo service iptables save` + - `sudo service iptables restart` +- 启动:`/usr/local/nginx/sbin/nginx`,启动完成 shell 是不会有输出的 +- 检查 时候有 Nginx 进程:`ps aux | grep nginx`,正常是显示 3 个结果出来 +- 检查 Nginx 是否启动并监听了 80 端口:`netstat -ntulp | grep 80` +- 访问:`192.168.1.114`,如果能看到:`Welcome to nginx!`,即可表示安装成功 +- 检查 Nginx 启用的配置文件是哪个:`/usr/local/nginx/sbin/nginx -t` +- 刷新 Nginx 配置后重启:`/usr/local/nginx/sbin/nginx -s reload` +- 停止 Nginx:`/usr/local/nginx/sbin/nginx -s stop` +- 如果访问不了,或是出现其他信息看下错误立即:`vim /var/log/nginx/error.log` ## 把 Nginx 添加到系统服务中 @@ -256,6 +310,27 @@ upgrade: - 更新 `make upgrade` +## 为 Nginx 添加 basic_auth + +``` +yum install httpd-tools + +htpasswd -c /opt/nginx-auth/passwd.db myusername,回车之后输入两次密码 + + +server { + ... + + location / { + auth_basic "please input you user name and password"; + auth_basic_user_file /opt/nginx-auth/passwd.db; + .... + } +} + +``` + + ## Nginx 全局变量 - $arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。 @@ -544,6 +619,180 @@ http { ``` +- 最新版本的 Nginx SSL 配置 + +``` +listen 443 ssl; + +ssl_certificate /opt/jar/ssl/server.crt; +ssl_certificate_key /opt/jar/ssl/server.key; + +ssl_session_timeout 5m; +ssl_protocols TLSv1 TLSv1.1 TLSv1.2; +ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; +ssl_prefer_server_ciphers on; +``` + +---------------------------------------------------------------------- + +## Nginx 压力测试 + +- AB 测试工具安装:`yum install -y httpd-tools` +- 使用: + +``` +ab -n 1000 -c 100 http://www.baidu.com/ + +-n 总的请求数 +-c 单个时刻并发数 +``` + + +- 压测结果: + + +``` +This is ApacheBench, Version 2.3 <$Revision: 1430300 $> +Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ +Licensed to The Apache Software Foundation, http://www.apache.org/ + +Benchmarking juejin.im (be patient) +Completed 100 requests +Completed 200 requests +Completed 300 requests +Completed 400 requests +Completed 500 requests +Completed 600 requests +Completed 700 requests +Completed 800 requests +Completed 900 requests +Completed 1000 requests +Finished 1000 requests + + +Server Software: nginx +Server Hostname: juejin.im +Server Port: 443 +SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256 + +Document Path: / +Document Length: 271405 bytes + +Concurrency Level: 100(并发数:100) +Time taken for tests: 120.042 seconds(一共用了 120 秒) +Complete requests: 1000(总的请求数:1000) +Failed requests: 0(失败的请求次数) +Write errors: 0 +Total transferred: 271948000 bytes +HTML transferred: 271405000 bytes +Requests per second: 8.33 [#/sec] (mean)(QPS 系统吞吐量,平均每秒请求数,计算公式 = 总请求数 / 总时间数) +Time per request: 12004.215 [ms] (mean)(毫秒,平均每次并发 100 个请求的处理时间) +Time per request: 120.042 [ms] (mean, across all concurrent requests)(毫秒,并发 100 下,平均每个请求处理时间) +Transfer rate: 2212.34 [Kbytes/sec] received(平均每秒网络流量) + +Connection Times (ms) + min mean[+/-sd] median max +Connect: 57 159 253.6 77 1002 +Processing: 1139 11570 2348.2 11199 36198 +Waiting: 156 1398 959.4 1279 22698 +Total: 1232 11730 2374.1 11300 36274 + +Percentage of the requests served within a certain time (ms) + 50% 11300 + 66% 11562 + 75% 11863 + 80% 12159 + 90% 13148 + 95% 15814 + 98% 18882 + 99% 22255 + 100% 36274 (longest request) +``` + + +---------------------------------------------------------------------- + + +## Nginx 常规优化 + +#### 增加工作线程数和并发连接数 + +- 修改参数:`worker_processes 1;` +- 该参数是指:nginx 要开启的工作进程数(worker process),默认是 1,一把你不需要修改。(除了工作进程,还有一种 master process 的概念) +- 但是如果请求数比较多,一般推荐最大是修改成 CPU 的内核数等同的值,以增加能力。 +- 修改 events 参数 + +``` +events { + # 每一个进程可以打开的最大连接数(这个参数是受限制于系统参数的,默认是 1024)(进程数是上面 worker_processes 决定的) + worker_connections 1024; + # 可以一次建立多个连接 + multi_accept on; + # epoll 模式效率最高 + use epoll; +} +``` + +#### 启动长连接 + +``` +http { + sendfile on; # 减少文件在应用和内核之间的拷贝 + tcp_nopush on; # 当数据包达到一定大小再发送 + + keepalive_timeout 65; + + upstream tomcatCluster { + server 192.168.1.114:8080; + server 192.168.1.114:8081; + keepalive 300; # 300 个长连接 + } + +} +``` + +#### 启用缓存和压缩 + +``` +http { + gzip on; + gzip_buffers 8 16k; # 这个限制了nginx不能压缩大于128k的文件 + gzip_min_length 512; # 单位byte + gzip_disable "MSIE [1-6]\.(?!.*SV1)"; + gzip_http_version 1.1; # 1.0 的版本可能会有问题 + gzip_types text/plain text/css application/javascript application/x-javascript application/json application/xml; +} +``` + +#### 操作系统优化(机器好点的时候) + +###### 修改 sysctl 参数 + +- 修改配置文件:`vim /etc/sysctl.conf` + +``` +net.ipv4.tcp_fin_timeout = 10 #保持在FIN-WAIT-2状态的时间,使系统可以处理更多的连接。此参数值为整数,单位为秒。 +net.ipv4.tcp_tw_reuse = 1 #开启重用,允许将TIME_WAIT socket用于新的TCP连接。默认为0,表示关闭。 +net.ipv4.tcp_tw_recycle = 0 #开启TCP连接中TIME_WAIT socket的快速回收。默认值为0,表示关闭。 +net.ipv4.tcp_syncookies = 1 #开启SYN cookie,出现SYN等待队列溢出时启用cookie处理,防范少量的SYN攻击。默认为0,表示关闭。 +net.core.somaxconn = 1024 #定义了系统中每一个端口最大的监听队列的长度, 对于一个经常处理新连接的高负载 web服务环境来说,默认值为128,偏小。 +``` + +- 刷新 sysctl 配置:`sysctl -p` + +###### 修改 limits 参数 + +- ElasticSearch 一般也是要修改该参数 +- 修改配置文件:`vim /etc/security/limits.conf` + +``` +* soft nofile 262144 +* hard nofile 262144 +* soft core unlimited +* soft stack 262144 +``` + +---------------------------------------------------------------------- ## Nginx 监控模块 @@ -571,15 +820,16 @@ http { ```ini location /nginx_status { - #allow 192.168.1.100; - #deny all; + allow 127.0.0.1; + deny all; stub_status on; access_log off; } ``` - 当你访问:http://127.0.0.1/nginx_status,会得到类似下面的结果 -- 其中配置的 `allow 192.168.1.100;` 表示只允许客户端 IP 为这个才能访问这个地址 +- 其中配置的 `allow 127.0.0.1;` 表示只允许本机访问:http://127.0.0.1/nginx_status 才能看到 + - 所以我们也可以通过 curl 访问本机看到结果,不一定要对外开放。 - `deny all;` 除了被允许的,其他所有人都不可以访问 ``` @@ -589,12 +839,12 @@ server accepts handled requests Reading: 0 Writing: 5 Waiting: 0 ``` -- Active connections: 对后端发起的活动连接数(最常需要看的就是这个参数) +- Active connections: 当前活动连接数,包含 waiting 的连接(最常需要看的就是这个参数) - Server accepts handled requests: Nginx总共处理了 3 个连接,成功创建 6 次握手(证明中间没有失败的),总共处理了 9 个请求. -- Reading: Nginx 读取到客户端的 Header 信息数. -- Writing: Nginx 返回给客户端的 Header 信息数. +- Reading: Nginx 读取到客户端的 Header 信息数,如果很大,说明现在很多请求正在过来 +- Writing: Nginx 返回给客户端的 Header 信息数,如果很大,说明现在又很多请求正在响应 - Waiting: 开启keep-alive的情况下,这个值等于 active – (reading + writing),意思就是 Nginx 已经处理完成,正在等候下一次请求指令的驻留连接. -- 所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的.如果reading +writing数较多,则说明并发访问量非常大,正在处理过程中. +- 所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的。**如果reading + writing数较多,则说明并发访问量非常大,正在处理过程中** ## Nginx 配置文件常用配置积累 @@ -649,8 +899,30 @@ location ~ .*$ { } ``` +### 链接 aa 下,查询参数包含 bb + +- 这里必须使用:IF,但是 IF 是不被推荐的:[If Is Evil](https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/) + + +``` +location /aa/ { + if ( $args ~* '(.*bb.*)' ) { + return 601; + } +} +``` + +``` +location /aa/ { + if ($args ~ tag=bb){ + return 601; + } +} +``` + +------------------------------------------------------------------- ### HTTP 服务,绑定多个域名 diff --git a/markdown-file/Node-Install-And-Usage.md b/markdown-file/Node-Install-And-Usage.md index bd413346..46aa0d6f 100644 --- a/markdown-file/Node-Install-And-Usage.md +++ b/markdown-file/Node-Install-And-Usage.md @@ -21,7 +21,13 @@ curl --silent --location https://rpm.nodesource.com/setup_9.x | sudo bash - sudo yum -y install nodejs ``` +- 验证:`node -v` - 注意:因为网络原因,最好先把脚本下载到本地,再用代理进行安装 +## nrm 快速切换 NPM 源 +- 安装:`npm install -g nrm` +- 列表源:`nrm ls` +- 使用源:`nrm use taobao` +- 更多使用方法: diff --git a/markdown-file/PostgreSQL-Install-And-Settings.md b/markdown-file/PostgreSQL-Install-And-Settings.md new file mode 100644 index 00000000..b2f3182e --- /dev/null +++ b/markdown-file/PostgreSQL-Install-And-Settings.md @@ -0,0 +1,32 @@ +# PostgreSQL 安装和配置 + + +## 官网 + +- 官网: + - 201906 最新版本 + - 12 beat + - 11 release +- 官网 Docker hub: + + +## Docker 安装 PostgreSQL(带挂载) + +``` +docker run \ + -d \ + --name pgsql \ + -p 5432:5432 \ + -e POSTGRES_USER=adg_user \ + -e POSTGRES_PASSWORD=adg123456 \ + -v ~/docker_data/pgsql/data:/var/lib/postgresql/data \ + postgres:11 +``` + +- 连上容器:`docker exec -it pgsql /bin/bash` + - 连上 PostgreSQL:`psql -h 127.0.0.1 -p 5432 -U adg_user` + + +## 资料 + +- diff --git a/markdown-file/Prometheus-Install-And-Settings.md b/markdown-file/Prometheus-Install-And-Settings.md new file mode 100644 index 00000000..7780838c --- /dev/null +++ b/markdown-file/Prometheus-Install-And-Settings.md @@ -0,0 +1,313 @@ +# Prometheus 安装和配置 + +- 不错的发展史说明: +- 特别说明:一般这类环境要尽可能保证所有服务器时间一致 +- Prometheus 本地存储不适合存长久数据,一般存储一个月就够了。要永久存储需要用到远端存储,远端存储可以用 OpenTSDB +- Prometheus 也不适合做日志存储,日志存储还是推荐 ELK 方案 + +## Prometheus Docker 安装 + +- 官网: +- Docker 官方镜像: +- 这里以 Spring Boot Metrics 为收集信息 +- 创建配置文件:`vim /data/docker/prometheus/config/prometheus.yml` +- 在 scrape_configs 位置下增加我们自己应用的路径信息 + +``` +# my global config +global: + scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. + evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. + # scrape_timeout is set to the global default (10s). + +# Alertmanager configuration +alerting: + alertmanagers: + - static_configs: + - targets: + # - alertmanager:9093 + +# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. +rule_files: + # - "first_rules.yml" + # - "second_rules.yml" + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + - job_name: 'springboot' + metrics_path: '/tkey-actuator/actuator/prometheus' + static_configs: + - targets: ['192.168.2.225:8811'] +``` + +- 启动 + +``` +docker run -d --name prometheus -p 9091:9090 \ +-v /data/docker/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml \ +prom/prometheus +``` + +- 然后配置 Grafana,使用这个 dashboard: + + +---------------------------------------------------------------------------------------------- + +## 配置 + +- 官网 exporter 列表: +- 官网 exporter 暴露的端口列表: + + +### CentOS7 服务器 + +- 当前最新版本:node_exporter 0.18.1(201907) + +``` +mkdir -p /usr/local/prometheus/node_exporter + +cd /usr/local/prometheus/node_exporter + +wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz + +tar -zxvf node_exporter-0.18.1.linux-amd64.tar.gz + +``` + + +``` +创建Systemd服务 +vim /etc/systemd/system/node_exporter.service + + + +[Unit] +Description=node_exporter +After=network.target + +[Service] +Type=simple +User=root +ExecStart=/usr/local/prometheus/node_exporter/node_exporter-0.18.1.linux-amd64/node_exporter +Restart=on-failure + +[Install] +WantedBy=multi-user.target +``` + +- 关于 ExecStart 参数,可以再附带一些启动监控的参数,官网介绍: + - 格式:`ExecStart=/usr/local/prometheus/node_exporter/node_exporter-0.18.1.linux-amd64/node_exporter --collectors.enabled meminfo,hwmon,entropy` + + +``` +启动 Node exporter +systemctl start node_exporter + +systemctl daemon-reload + +systemctl status node_exporter + +``` + + +``` +修改prometheus.yml,加入下面的监控目标: + +vim /data/docker/prometheus/config/prometheus.yml + +scrape_configs: + - job_name: 'centos7' + static_configs: + - targets: ['192.168.1.3:9100'] + labels: + instance: centos7_node1 + +``` + +- 重启 prometheus:`docker restart prometheus` +- Grafana 有现成的 dashboard: + - + - + +---------------------------------------------------------------------------------------------- + + +### Nginx 指标 + +- 这里使用 Nginx VTS exporter: + +- 安装 nginx 模块: + +``` +git clone --depth=1 https://github.com/vozlt/nginx-module-vts.git + + +编译 nginx 的时候加上: +./configure --prefix=/usr/local/nginx --with-http_ssl_module --add-module=/opt/nginx-module-vts + +make(已经安装过了,就不要再 make install) +``` + + +``` +也有人做好了 docker 镜像: +https://hub.docker.com/r/xcgd/nginx-vts + +docker run --name nginx-vts -p 80:80 -v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -d xcgd/nginx-vts +``` + + +``` +修改Nginx配置 + + +http { + vhost_traffic_status_zone; + vhost_traffic_status_filter_by_host on; + + ... + + server { + + ... + + location /status { + vhost_traffic_status_display; + vhost_traffic_status_display_format html; + } + } +} + + +验证nginx-module-vts模块:http://192.168.1.3/status,会展示: +Nginx Vhost Traffic Status 统计表 + +``` + +``` +如果不想统计流量的server,可以禁用vhost_traffic_status,配置示例: +server { + ... + vhost_traffic_status off; + ... +} +``` + + +- 安装 nginx-vts-exporter + +``` +官网版本:https://github.com/hnlq715/nginx-vts-exporter/releases + +wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz + +tar zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz + +chmod +x /usr/local/nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter +``` + +``` +创建Systemd服务 +vim /etc/systemd/system/nginx_vts_exporter.service + + +[Unit] +Description=nginx_exporter +After=network.target + +[Service] +Type=simple +User=root +ExecStart=/usr/local/nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter -nginx.scrape_uri=http://192.168.1.3/status/format/json +Restart=on-failure + +[Install] +WantedBy=multi-user.target +``` + + +``` +启动nginx-vts-exporter +systemctl start nginx_vts_exporter.service +systemctl daemon-reload +systemctl status nginx_vts_exporter.service +``` + + +``` +修改 prometheus.yml,加入下面的监控目标: +vim /data/docker/prometheus/config/prometheus.yml + +scrape_configs: + - job_name: 'nginx' + static_configs: + - targets: ['192.168.1.3:9913'] + labels: + instance: nginx1 + + +如果nginx 有加 basic auth,则需要这样: +scrape_configs: + - job_name: "nginx" + metrics_path: /status/format/prometheus + basic_auth: + username: youmeek + password: '123456' + static_configs: + - targets: ['192.168.1.3:9913'] + labels: + instance: 'nginx1' + +``` + +- 重启 prometheus:`docker restart prometheus` +- Grafana 有现成的 dashboard: + - + - + +---------------------------------------------------------------------------------------------- + + + +### 微服务下的多服务收集 + +- + +---------------------------------------------------------------------------------------------- + + +### 告警 + +- +- + +- 告警配置 + +- 告警检测 + +- [Grafana+Prometheus系统监控之邮件报警功能](https://blog.52itstyle.vip/archives/2014/) +- [Grafana+Prometheus系统监控之钉钉报警功能](https://blog.52itstyle.vip/archives/2029/) +- [Grafana+Prometheus系统监控之webhook](https://blog.52itstyle.vip/archives/2068/) + + +## 远端存储方案 + +- + + +---------------------------------------------------------------------------------------------- + + +## 其他资料 + +- + - 写得非常非常非常好 +- +- +- <> +- <> +- <> +- <> +- <> + diff --git a/markdown-file/Python-Ubuntu.md b/markdown-file/Python-Ubuntu.md new file mode 100644 index 00000000..c7b8161b --- /dev/null +++ b/markdown-file/Python-Ubuntu.md @@ -0,0 +1,18 @@ +# Python Ubuntu 安装 + +## 为 Python 开发环境准备 + +#### 给 root 用户安装 Python + +- 切换用户:`sudo su -` +- 安装 Python 2:`apt-get install python` +- 安装 Python 3:`apt-get install python3` +- 查看版本: + - `python --version` + - `python3 --version` + +#### 给非 root 用户安装 Anaconda(Python 3 版本) + +- 官网下载: +- 进入命令行交互安装:`sh Anaconda3-5.2.0-Linux-x86_64.sh` + diff --git a/markdown-file/RabbitMQ-Install-And-Settings.md b/markdown-file/RabbitMQ-Install-And-Settings.md index 3ad9eb37..b3a84a9a 100644 --- a/markdown-file/RabbitMQ-Install-And-Settings.md +++ b/markdown-file/RabbitMQ-Install-And-Settings.md @@ -5,12 +5,25 @@ - 官网镜像: - 官网镜像说明: -- 运行: +- 一般情况,运行: ``` docker run -d --name cloud-rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=adg123456 rabbitmq:3-management ``` +- 带有 websocket stomp 功能(不知道是什么就不用管它): + +``` +docker run -d --name cloud-rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 -p 61613:61613 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=adg123456 rabbitmq:3-management + + +进入 Docker 容器启动 stomp 插件: +docker exec -it cloud-rabbitmq /bin/bash +cd /plugins +rabbitmq-plugins enable rabbitmq_web_stomp +``` + + - 参数解释: - rabbitmq:3-management:只有带 management 后缀的才有 web 端管理入口 - 15672:表示 RabbitMQ 控制台端口号,可以在浏览器中通过控制台来执行 RabbitMQ 的相关操作。容器启动成功后,可以在浏览器输入地址:http://ip:15672/ 访问控制台 @@ -98,3 +111,54 @@ yum install rabbitmq-server -y - ![RabbitMQ-Add-User](../images/RabbitMQ-Add-User-a-3.gif) - 交换机绑定队列(如下图所示): - ![RabbitMQ-Bindings-Queue](../images/RabbitMQ-Bindings-Queue-a-1.gif) + +## 集群环境(镜像队列) + +- TODO + +## 消息重复 + +- 消息重复无法避免,比如消费端异常重启就有可能,或者 MQ 应用挂了重启之后等场景,任何 MQ 应用没有保证消息不会重复发送。 +- 对于一定要保证幂等性的业务场景,在消费端做好标识。比如在 Redis 或 JVM 缓存中存有上一次消费的记录,业务操作之前下判断。 +- 如果是插入操作类的,也可以考虑用唯一约束的方式来保证插入不会重复等。 + +## 消息丢失 + +- 单节点,纯内存情况下一般有三种情况: + - 生产者提交消息到 MQ,但是网络抖动了,丢了。或是 MQ 拿到之后突然挂了,来不及登记 + - MQ 拿到消息,消费者还没消费,但是 MQ 挂了 + - 消费者拿到消息来不及处理,自己挂了,MQ 认为已经消费成功了。 +- 分别解决办法: + - 把 channel 设置为 confirm 模式 + - 持久化队列:创建 queue 的时候持久化 durable=true。持久化消息:生产者发送消息时候:deliveryMode = 2 + - 手动 ACK + +## 消息顺序 + +- 一般场景不需要消息顺序,要去做一般也开销很大,需要执行考虑。 +- 在能保证消息顺序的情况下,可以用来做数据同步 +- 解决: + - 消费者只有单个应用,并且内容不要使用异步或者多线程。在这种场景下绑定 queue,**基于消息队列本质是队列,消息是 FIFO(先进先出)的**,这样消息就能按顺序。但是缺点很明显:吞吐太差,效率太低,适合低效率的业务。 + - 基于上面方案并且对队列进行分片。假设我们原来 repay.queue下面有 10 个消费者线程,那么我们可以创建10个队列,每个队列下面只允许有一个消费者。一个比较简单的方式是,队列命名为 repay.queue-0,repay.queue-2…repay.queue-9,然后生产者推送信息的时候,基于用户的ID(Long类型)mod 10 取模 0…9(取余),再选择发送到相应的队列即可,这样就等保证同一个用户的顺序。 + +## 消息积压 + +- 如果消费者挂掉,消息会一直积压在 MQ 中 +- 解决办法 + - 如果原来有 3 个消费者应用,现在需要准备多倍的消费者应用,假设现在有 10 个新的消费者应用。 + - 创建一个临时的 topic,假设叫做 topic_abc + - 新的 10 个消费者应用绑定在新的 topic_abc 上 + - 修改原来 3 个消费者应用代码,改为接受到 MQ 消息后不操作入数据库了,而是直接发给 topic_abc + - 这样原来积压的消息就有 10 个消费者一起来分摊 + - 如果此时这个 MQ 扛不住压力,那只能让旧的 3 个消费者应用写到其他 MQ,然后 10 个新消费者消费新的 MQ。 + - 然后深夜找个时间重新欢迎旧的 3 个消费者代码。 + + +## 资料 + +- + + + + + diff --git a/markdown-file/Redis-Install-And-Settings.md b/markdown-file/Redis-Install-And-Settings.md index fcf54dc3..4278efae 100644 --- a/markdown-file/Redis-Install-And-Settings.md +++ b/markdown-file/Redis-Install-And-Settings.md @@ -22,9 +22,16 @@ - Redis 默认的配置文件内容: ``` ini -bind 0.0.0.0 +安全情况的几个特殊配置: +bind 127.0.0.1 requirepass adgredis123456 protected-mode yes + +免密情况: +bind 0.0.0.0 +protected-mode no + +其他: port 6379 tcp-backlog 511 timeout 0 @@ -88,6 +95,8 @@ aof-rewrite-incremental-fsync yes #### Redis 容器准备 - 目标:3 主 3 从(一般都是推荐奇数个 master) +- 最小集群数推荐是:3 +- 测试机的最低配置推荐是:2C4G - 拉取镜像:`docker pull registry.cn-shenzhen.aliyuncs.com/youmeek/redis-to-cluster:3.2.3` - 重新打个 tag(旧名字太长了):`docker tag registry.cn-shenzhen.aliyuncs.com/youmeek/redis-to-cluster:3.2.3 redis-to-cluster:3.2.3` - 创建网段:`docker network create --subnet=172.19.0.0/16 net-redis-to-cluster` @@ -246,17 +255,14 @@ M: 5d0fe968559af3035d8d64ab598f2841e5f3a059 172.19.0.7:6379 - 官网 Github 地址: - 此时(20160212) Redis 最新稳定版本为:**3.0.7** - 官网帮助中心: - - 我个人习惯 `/opt` 目录下创建一个目录 `setups` 用来存放各种软件安装包;在 `/usr` 目录下创建一个 `program` 用来存放各种解压后的软件包,下面的讲解也都是基于此习惯 - - 我个人已经使用了第三方源:`EPEL、RepoForge`,如果你出现 `yum install XXXXX` 安装不成功的话,很有可能就是你没有相关源,请查看我对源设置的文章 - - Redis 下载:`wget http://download.redis.io/releases/redis-3.0.7.tar.gz` (大小:1.4 M) + - Redis 下载(/usr/local):`wget http://download.redis.io/releases/redis-3.0.7.tar.gz` (大小:1.4 M) - 安装依赖包:`yum install -y gcc-c++ tcl` - 解压:`tar zxvf redis-3.0.7.tar.gz` - - 移动到我个人安装目录:`mv redis-3.0.7/ /usr/program/` - - 进入解压后目录:`cd /usr/program/redis-3.0.7/` + - 进入解压后目录:`cd /usr/local/redis-3.0.7/` - 编译:`make` - 编译安装:`make install` - 安装完之后会在:`/usr/local/bin` 目录下生成好几个 redis 相关的文件 - - 复制配置文件:`cp /usr/program/redis-3.0.7/redis.conf /etc/` + - 复制配置文件:`cp /usr/local/redis-3.0.7/redis.conf /etc/` - 修改配置:`vim /etc/redis.conf` - 把旧值:`daemonize no` - 改为新值:`daemonize yes` @@ -609,6 +615,88 @@ esac - 配置文件也跟原版本不一样,叫做:`redis.windows.conf` +## Redis Info + +- 客户端下命令行:`info` + - 参考: + +``` +server 部分记录了 Redis 服务器的信息,它包含以下域: + +redis_version : Redis 服务器版本 +redis_git_sha1 : Git SHA1 +redis_git_dirty : Git dirty flag +os : Redis 服务器的宿主操作系统 +arch_bits : 架构(32 或 64 位) +multiplexing_api : Redis 所使用的事件处理机制 +gcc_version : 编译 Redis 时所使用的 GCC 版本 +process_id : 服务器进程的 PID +run_id : Redis 服务器的随机标识符(用于 Sentinel 和集群) +tcp_port : TCP/IP 监听端口 +uptime_in_seconds : 自 Redis 服务器启动以来,经过的秒数 +uptime_in_days : 自 Redis 服务器启动以来,经过的天数 +lru_clock : 以分钟为单位进行自增的时钟,用于 LRU 管理 +clients 部分记录了已连接客户端的信息,它包含以下域: + +connected_clients : 已连接客户端的数量(不包括通过从属服务器连接的客户端) +client_longest_output_list : 当前连接的客户端当中,最长的输出列表 +client_longest_input_buf : 当前连接的客户端当中,最大输入缓存 +blocked_clients : 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 +memory 部分记录了服务器的内存信息,它包含以下域: + +used_memory : 由 Redis 分配器分配的内存总量,以字节(byte)为单位 +used_memory_human : 以人类可读的格式返回 Redis 分配的内存总量 +used_memory_rss : 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。 +used_memory_peak : Redis 的内存消耗峰值(以字节为单位) +used_memory_peak_human : 以人类可读的格式返回 Redis 的内存消耗峰值 +used_memory_lua : Lua 引擎所使用的内存大小(以字节为单位) +mem_fragmentation_ratio : used_memory_rss 和 used_memory 之间的比率 +mem_allocator : 在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。 +``` + +- 常关注信息: + +``` +used_memory_rss_human:系统给redis分配的内存(即常驻内存) +used_memory_peak_human : Redis 的内存消耗峰值 +used_memory_lua_human : 系统内存大小 +expired_keys : 过期的的键数量 +evicted_keys : 因为最大内存容量限制而被驱逐(evict)的键数量 +used_cpu_sys_children : Redis 后台进程在 内核态 消耗的 CPU +used_cpu_user_children : Redis 后台进程在 用户态 消耗的 CPU +``` + +## Redis 基准压力测试 + +- 默认安装包下就自带 +- 官网文档: +- 运行:`redis-benchmark -q -n 100000` + - `-q` 表示 quiet 安静执行,结束后直接输出结果即可 + - `-n 100000` 请求 10 万次 + +``` +PING_INLINE: 62189.05 requests per second +PING_BULK: 68634.18 requests per second +SET: 58241.12 requests per second +GET: 65445.03 requests per second +INCR: 57703.40 requests per second +LPUSH: 61199.51 requests per second +RPUSH: 68119.89 requests per second +LPOP: 58309.04 requests per second +RPOP: 63775.51 requests per second +SADD: 58479.53 requests per second +HSET: 61500.61 requests per second +SPOP: 58241.12 requests per second +LPUSH (needed to benchmark LRANGE): 59523.81 requests per second +LRANGE_100 (first 100 elements): 60350.03 requests per second +LRANGE_300 (first 300 elements): 57636.89 requests per second +LRANGE_500 (first 450 elements): 63251.11 requests per second +LRANGE_600 (first 600 elements): 58479.53 requests per second +MSET (10 keys): 56401.58 requests per second +``` + +- 只测试特定类型:`redis-benchmark -t set,lpush -n 100000 -q` + ## 资料 diff --git a/markdown-file/SSH-login-without-password.md b/markdown-file/SSH-login-without-password.md index ec33a561..b13e35cd 100644 --- a/markdown-file/SSH-login-without-password.md +++ b/markdown-file/SSH-login-without-password.md @@ -14,6 +14,8 @@ - 在 A 机器上输入命令:`ssh-keygen` - 根据提示回车,共有三次交互提示,都回车即可。 - 生成的密钥目录在:**/root/.ssh** +- 写入:`cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys` +- 测试:`ssh localhost` ## 把 A 的公钥发给 B @@ -23,4 +25,17 @@ ## 测试 A 免密登录到 B -- 在 A 机器上输入命令:`ssh -p 22 root@192.168.1.105`,则会相应登录成功的提示 \ No newline at end of file +- 在 A 机器上输入命令:`ssh -p 22 root@192.168.1.105`,则会相应登录成功的提示 + +------------------------------------------------------------------- + +## 如果是用 pem 登录的话,用 ssh-copy-id 是无法使用的 + +- 先保存 A 的 pub 到本地:`sz /root/.ssh/id_rsa.pub` +- 登录 B 机子:`cd /root/.ssh/` +- 如果 B 机子没有 authorized_keys 文件则创建:`touch /root/.ssh/authorized_keys` + - 设置权限:`chmod 600 /root/.ssh/authorized_keys ` +- 上传 pub 文件到 B 机子,并在 B 机子上执行:`cd /root/.ssh/ && cat id_rsa.pub >> authorized_keys` + + + diff --git a/markdown-file/SSR-Client-Ubuntu.md b/markdown-file/SSR-Client-Ubuntu.md new file mode 100644 index 00000000..21028f8c --- /dev/null +++ b/markdown-file/SSR-Client-Ubuntu.md @@ -0,0 +1,91 @@ +# SSR Ubuntu 客户端 + +## 介绍 + +- 因为某些原因,这个东西不做过多解释 + +## 安装 + +- 需要 Git 环境: +- 需要 Python 2 环境: +- 官网脚本: +- 我们这里使用别人提供的文件,如果该文件被屏蔽,就自行用上面官网的文件。 + +``` +wget http://www.djangoz.com/ssr + +sudo mv ssr /usr/local/bin + +sudo chmod 766 /usr/local/bin/ssr + +ssr install +``` + +- 配置:`ssr config` + - 这是一个 vim 的配置界面,也可以直接编辑其源文件: +- 主要修改如下内容: + +``` +"server":"12.26.68.99", //服务器ip +"server_port":9191, //端口 +"password":"123456", //密码 +"protocol":"auth_sha1_v4", //协议插件 +"obfs":"http_simple", //混淆插件 +"method":"aes-256-cfb", //加密方式 +``` + + +- 启动:`ssr start` +- 其他常用命令: + - `ssr stop` + - `ssr help` +- 然后就可以用 Chrome 的 SwitchyOmega +- AutoProxy:https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt + +## 配置终端代理 polipo + +- 安装:`sudo apt-get install polipo` +- 修改配置(一般不要变动,直接复制上去即可):`sudo vim /etc/polipo/config` + +``` +# This file only needs to list configuration variables that deviate +# from the default values. See /usr/share/doc/polipo/examples/config.sample +# and "polipo -v" for variables you can tweak and further information. + +logSyslog = true +logFile = /var/log/polipo/polipo.log + +proxyAddress = "0.0.0.0" + +socksParentProxy = "127.0.0.1:1080" +socksProxyType = socks5 + +chunkHighMark = 50331648 +objectHighMark = 16384 + +serverMaxSlots = 64 +serverSlots = 16 +serverSlots1 = 32 +``` + +- 重启:`sudo service polipo restart` + +#### 开始测试 polipo + +- 获取自己当前 IP:`curl ip.gs` + - 这时候应该是国内 IP + +- **开始使用代理**:`export http_proxy=http://127.0.0.1:8123` + +- 获取自己当前 IP:`curl ip.gs` + - 这时候应该是国外 IP + +- **取消代理**:`unset http_proxy` + +- 获取自己当前 IP:`curl ip.gs` + - 这时候应该是国内 IP +- 另外:在浏览器中输入 便可以进入到 Polipo 的使用说明和配置界面。 + +## 材料 + +- diff --git a/markdown-file/Sed.md b/markdown-file/Sed.md index ae5cdea6..fd5b73a6 100644 --- a/markdown-file/Sed.md +++ b/markdown-file/Sed.md @@ -1,6 +1,6 @@ # Sed 常用命令 -- 轻量级流编辑器,一般用来处理文本类文件 +- 轻量级流编辑器,一般用来处理文本类文件 - **sed 是非交互式的编辑器。它不会修改文件,除非使用 shell 重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上** - **用 sed -i 会实际写入**,下面为了演示,都没加该参数,有需要可以自行添加。 @@ -53,16 +53,6 @@ rootLogger.appenderRef.rolling.ref = rolling - `sed 's/^[0-9][0-9]*//g' /opt/log4j2.properties`:将文件中每一行以数字开头,都替换掉空字符并展示 - `sed '4,6s/^/#/g' /opt/log4j2.properties`:将文件中 4 ~ 6 行添加 # 开头 - `sed '4,6s/^#//g' /opt/log4j2.properties`:将文件中 4 ~ 6 行 # 开头去掉 -- ``: -- ``: -- ``: -- ``: -- ``: -- ``: -- ``: -- ``: -- ``: -- ``: ## 实用例子 @@ -70,14 +60,7 @@ rootLogger.appenderRef.rolling.ref = rolling - `ifconfig eth0 |grep 'inet addr' |sed 's/^.*addr://g' |sed 's/Bcast.*$//g'`:CentOS 6 只显示 IP - `ifconfig ens33 |grep 'inet' |sed 's/^.*inet//g' |sed 's/netmask.*$//g' |sed -n '1p'`:CentOS 7.3 只显示 IP。先用 grep 筛选中包含 inet 的数据。 - `s` 参数开头表示的是搜索替换,`/^.*inet` 表示从开头到 inet 之间,`//` 为空内容,`/g`,表示处理这一行所有匹配的内容。`/netmask.*$` 表示从 netmask 到这一行结束的内容 -- ``: -- ``: -- ``: -- ``: -- ``: -- ``: -- ``: -- ``: + diff --git a/markdown-file/SkyWalking-Install-And-Settings.md b/markdown-file/SkyWalking-Install-And-Settings.md new file mode 100644 index 00000000..db9cf77c --- /dev/null +++ b/markdown-file/SkyWalking-Install-And-Settings.md @@ -0,0 +1,202 @@ +# SkyWalking 安装和配置 + + +## OpenAPM 相关 + +- 目前市场工具一览: +- 目前最活跃的标准:[OpenTracing](https://opentracing.io/) +- 现在比较活跃的应该是: + - [Jaeger](https://www.jaegertracing.io/) + - [SkyWalking](https://skywalking.apache.org/) + + +## 官网资料 + +- 当前时间:2019-05,最新版本:6.1 +- 官网: +- 官网 Github: +- 官网文档: +- 官网下载: + - 该网页显示:官网目前推荐的是通过源码构建出包,docker 镜像推荐 + - 源码构建方法: +- 这里简单抽取下核心内容: +- 至少需要 jdk8 + maven3 +- 需要 Elasticsearch + - Elasticsearch 和 SkyWalking 的所在服务器的时间必须一致 + - 看了下源码依赖的 Elasticsearch 依赖包,目前支持 5.x 和 6.x + + +## 支持收集的组件列表 + +- 国内常用的组件目前看来都支持了 +- + + +## 基于 IntelliJ IDEA 直接运行、Debug + +- 这里选择 IntelliJ IDEA 运行服务,方便我们 debug 了解 SkyWalking: + +``` +cd skywalking/ + +git submodule init + +git submodule update + +mvn clean package -DskipTests + +因为需要设置 gRPC 的自动生成的代码目录,为源码目录,所以: +手工将下面提到的目录下的 grpc-java 和 java 目录设置为 IntelliJ IDEA 的源码目录(Sources Root) +/skywalking/apm-protocol/apm-network/target/generated-sources/protobuf +/skywalking/oap-server/server-core/target/generated-sources/protobuf +/skywalking/oap-server/server-receiver-plugin/receiver-proto/target/generated-sources/protobuf +/skywalking/oap-server/exporter/target/generated-sources/protobuf + + +手工将下面提到的目录下的 antlr4 目录设置为 IntelliJ IDEA 的源码目录(Sources Root) +/skywalking/oap-server/generate-tool-grammar/target/generated-sources + +手工将下面提到的目录下的 oal 目录设置为 IntelliJ IDEA 的源码目录(Sources Root) +/skywalking/oap-server/generated-analysis/target/generated-sources + +``` + +#### 启动 Server 项目 + +- 现在可以通过 IntelliJ IDEA 启动服务: +- 编辑 server 配置:`/skywalking/oap-server/server-starter/src/main/resources/application.yml` + - 里面有关 Elasticsearch 连接信息的配置,你可以根据自己的情况进行配置。 +- 启动类:`/skywalking/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/OAPServerStartUp.java` + - 第一次启动会创建 540 个左右的 Elasticsearch 索引库,会花点时间。 + + +#### 启动 UI 项目 + + +- 现在启动 UI 项目,找到:`/skywalking/apm-webapp/src/main/java/org/apache/skywalking/apm/webapp/ApplicationStartUp.java` +- 访问 UI 地址: + - 用户名:admin + - 密码:admin + + +## Java Agent(探针) + + +#### IntelliJ IDEA 项目调试 + +- 前面构建服务的时候记得构建出 jar 包出来,这里要用到 +- 自己的 Spring Boot 项目 +- 引包: + +``` + + + + org.apache.skywalking + apm-toolkit-trace + 6.1.0 + + +``` + +- 常用注解: + + +``` +@Trace +@ApiOperation(tags = {"用户系统管理->用户管理->用户列表"}, value = "查询所有用户列表", notes = "查询所有用户列表") +@RequestMapping(value = "/list", method = RequestMethod.GET) +@ResponseBody +public List list() { + List sysUserList = sysUserService.findAll(); + ActiveSpan.tag("一共有数据:", sysUserList.size() + "条"); + log.info("当前 traceId={}", TraceContext.traceId()); + return sysUserList; +} + +``` + +- 更多注解的使用: + +- 你的 demo 项目在 IntelliJ IDEA 启动的时候加上 VM 参数上设置: + +``` +-javaagent:/你自己的路径/skywalking-agent.jar -Dskywalking.agent.application_code=my_app_001 -Dskywalking.collector.backend_service=localhost:11800 +``` + +- 默认 11800 是 gRPC 的接收接口 +- 你自己构建出来的 jar 路径一般是:`/skywalking/apm-sniffer/apm-agent/target/skywalking-agent.jar` +- 然后请求你带有 Trace 的 Controller,然后去 UI 界面看统计情况 + +#### jar 包方式 + +- 你的 Spring Boot jar 包 run 之前加上 VM 参数: + +``` +java -javaagent:/你自己的路径/skywalking-agent.jar -Dskywalking.collector.backend_service=localhost:11800 -Dskywalking.agent.application_code=my_app_002 -jar my-project-1.0-SNAPSHOT.jar +``` + + +#### Docker 方式 + +- Dockerfile + +``` +FROM openjdk:8-jre-alpine + +LABEL maintainer="tanjian20150101@gmail.com" + +ENV SW_AGENT_NAMESPACE=java-agent-demo \ + SW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800 + +COPY skywalking-agent /apache-skywalking-apm-bin/agent + +COPY target/sky-demo-1.0-SNAPSHOT.jar /demo.jar + +ENTRYPOINT java -javaagent:/apache-skywalking-apm-bin/agent/skywalking-agent.jar -jar /demo.jar +``` + +- 构建镜像: + +``` +docker build -t hello-demo . +docker run -p 10101:10101 -e SW_AGENT_NAMESPACE=hello-world-demo-005 -e SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.10.0.2:11800 hello-demo +``` + + + +## 构建 jar 部署在服务器 + +- 如果想直接打包出 jar 部署与服务器,只需要这样: + +``` +cd skywalking/ + +git submodule init + +git submodule update + +mvn clean package -DskipTests +``` + +## 告警配置 + +- + + +## 资料 + +- +- +- +- +- <> +- <> +- <> +- <> + + + + + + diff --git a/markdown-file/Spark-Install-And-Settings.md b/markdown-file/Spark-Install-And-Settings.md new file mode 100644 index 00000000..004ce09c --- /dev/null +++ b/markdown-file/Spark-Install-And-Settings.md @@ -0,0 +1,49 @@ +# Spark 安装和配置 + +## 介绍 + +- 2018-12 发布最新:2.4.0 版本 +- 官网: +- 官网文档: +- 官网下载: +- 官网 Github: + +## 本地模式安装 + +- CentOS 7.4 +- IP 地址:`192.168.0.105` +- 必须 JDK 8.x +- 已经安装了 hadoop-2.6.5 集群(**这个细节注意**) +- 因为个人原因,我这里 Hadoop 还是 2.6.5 版本,Spark 要用的是 2.2.0 +- Spark 2.2.0 官网文档: + - 192M,下载速度有点慢 + - `cd /usr/local && wget https://archive.apache.org/dist/spark/spark-2.2.0/spark-2.2.0-bin-hadoop2.6.tgz` +- 解压:`tar zxvf spark-2.2.0-bin-hadoop2.6.tgz` +- 重命名:`mv /usr/local/spark-2.2.0-bin-hadoop2.6 /usr/local/spark` +- 增加环境变量: + +``` +vim /etc/profile + +SPARK_HOME=/usr/local/spark +PATH=$PATH:${SPARK_HOME}/bin:${SPARK_HOME}/sbin +export SPARK_HOME +export PATH + +source /etc/profile +``` + +- 修改配置:`cp $SPARK_HOME/conf/spark-env.sh.template $SPARK_HOME/conf/spark-env.sh` +- 修改配置:`vim $SPARK_HOME/conf/spark-env.sh` +- 假设我的 hadoop 路径是:/usr/local/hadoop-2.6.5,则最尾巴增加: + +``` +export HADOOP_CONF_DIR=/usr/local/hadoop-2.6.5/etc/hadoop +``` + +- 因为要交给 YARN 作业,所以到这里就好了。 + + +## 资料 + +- diff --git a/markdown-file/Tomcat-Install-And-Settings.md b/markdown-file/Tomcat-Install-And-Settings.md index 8d188020..beeedd53 100644 --- a/markdown-file/Tomcat-Install-And-Settings.md +++ b/markdown-file/Tomcat-Install-And-Settings.md @@ -58,131 +58,194 @@ - Tomcat 7 文档: - Tomcat 8 文档: - 如果你需要查看 Tomcat 的运行状态可以配置tomcat管理员账户,然后登陆 Tomcat 后台进行查看 -- 编辑 /opt/tomcat7/bin/conf/tomcat-users.xml 文件,在里面添加下面信息: +- 编辑 /opt/tomcat8/bin/conf/tomcat-users.xml 文件,在里面添加下面信息: + ``` xml - + - - - + + + +``` +- 编辑配置文件:`vim /usr/program/tomcat8/conf/server.xml` + +#### 打开默认被注释的连接池配置 + +- 默认值: + +``` xml + +``` + +- 修改为: + +``` xml + +``` + +- 重点参数解释: + - maxThreads,最大并发数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断 + - minSpareThreads,Tomcat 初始化时创建的线程数,默认设置 25 + - prestartminSpareThreads,在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了 + - maxQueueSize,最大的等待队列数,超过则拒绝请求 + - maxIdleTime,如果当前线程大于初始化线程,那空闲线程存活的时间,单位毫秒,默认60000=60秒=1分钟。 + +#### 修改默认的链接参数配置 + +- 默认值: + +``` xml + ``` -- 编辑配置文件:`vim /usr/program/tomcat7/conf/server.xml` - - 打开默认被注释的连接池配置: - - 默认值: - ``` xml - - ``` - - 修改为: - ``` xml - - ``` - - 重点参数解释: - - maxThreads,最大并发数,默认设置 200,一般建议在 500 ~ 800,根据硬件设施和业务来判断 - - minSpareThreads,Tomcat 初始化时创建的线程数,默认设置 25 - - prestartminSpareThreads,在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了 - - maxQueueSize,最大的等待队列数,超过则拒绝请求 - - maxIdleTime,如果当前线程大于初始化线程,那空闲线程存活的时间,单位毫秒,默认60000=60秒=1分钟。 - - 修改默认的链接参数配置: - - 默认值: - ``` xml - - ``` - - 修改为: - ``` xml - - ``` - - 重点参数解释: - - protocol,Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol(如果这个用不了,就用下面那个) - - protocol,Tomcat 6、7 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol - - enableLookups,禁用DNS查询 - - acceptCount,指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100 - - maxPostSize,以 FORM URL 参数方式的 POST 提交方式,限制提交最大的大小,默认是 2097152(2兆),它使用的单位是字节。10485760 为 10M。如果要禁用限制,则可以设置为 -1。 - - acceptorThreadCount,用于接收连接的线程的数量,默认值是1。一般这个指需要改动的时候是因为该服务器是一个多核CPU,如果是多核 CPU 一般配置为 2. - - maxHttpHeaderSize,http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。 - - 禁用 AJP(如果你服务器没有使用 Apache) - - 把下面这一行注释掉,默认 Tomcat 是开启的。 - ``` xml - - ``` - - - -## JVM 优化 + +- 修改为: + +``` xml + +``` + +- 重点参数解释: + - protocol,Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol(如果这个用不了,就用下面那个) + - protocol,Tomcat 6、7 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol + - enableLookups,禁用DNS查询,tomcat 8 默认已经是禁用了。 + - maxConnections,最大连接数,tomcat 8 默认设置 10000 + - acceptCount,指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100 + - maxPostSize,以 FORM URL 参数方式的 POST 提交方式,限制提交最大的大小,默认是 2097152(2兆),它使用的单位是字节。10485760 为 10M。如果要禁用限制,则可以设置为 -1。 + - maxHttpHeaderSize,http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。 +- 禁用 AJP(如果你服务器没有使用 Apache) + - 把下面这一行注释掉,默认 Tomcat 是开启的。 + +``` xml + +``` + +- 关闭自动部署功能: +- 旧值: +``` + +``` + +- 新值: +``` + +``` + +## JVM 优化(JDK 8) - 模型资料来源: - 配比资料: -- Java 的内存模型分为: - - Young,年轻代(易被 GC)。Young 区被划分为三部分,Eden 区和两个大小严格相同的 Survivor 区,其中 Survivor 区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在 Young 区间变满的时候,minor GC 就会将存活的对象移到空闲的Survivor 区间中,根据 JVM 的策略,在经过几次垃圾收集后,任然存活于 Survivor 的对象将被移动到 Tenured 区间。 - - Tenured,终身代。Tenured 区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在 Young 复制转移一定的次数以后,对象就会被转移到 Tenured 区,一般如果系统中用了 application 级别的缓存,缓存中的对象往往会被转移到这一区间。 - - Perm,永久代。主要保存 class,method,filed 对象,这部门的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到 java.lang.OutOfMemoryError : PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的 class 没有被卸载掉,这样就造成了大量的 class 对象保存在了 perm 中,这种情况下,一般重新启动应用服务器可以解决问题。 -- Linux 修改 /usr/program/tomcat7/bin/catalina.sh 文件,把下面信息添加到文件第一行。 - - 如果服务器只运行一个 Tomcat +- JDK8 配比:[关键系统的JVM参数推荐(2018仲夏版)](https://mp.weixin.qq.com/s/FHY0MelBfmgdRpT4zWF9dQ) +- JDK8 常用配比总结 8G 内存:`CATALINA_OPTS="-Dfile.encoding=UTF-8 -Xms4g -Xmx4g"` +- Java 的内存模型看:[这篇文章](Java-bin.md) +- Linux 修改 /usr/program/tomcat8/bin/catalina.sh 文件,把下面信息添加到文件第一行。 + - 如果服务器只运行一个 Tomcat,堆栈信息可以这样配置: - 机子内存如果是 4G: - - `CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms2048m -Xmx2048m -Xmn1024m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"` + - `CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms2g -Xmx2g"` - 机子内存如果是 8G: - - `CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms4096m -Xmx4096m -Xmn2048m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"` + - `CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms4g -Xmx4g"` - 机子内存如果是 16G: - - `CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms8192m -Xmx8192m -Xmn4096m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"` + - `CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms8g -Xmx8g"` - 机子内存如果是 32G: - - `CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms16384m -Xmx16384m -Xmn8192m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"` + - `CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms16g -Xmx16g"` - 如果是 8G 开发机 - - `-Xms2048m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=512m` + - `-Xms2g -Xmx2g` - 如果是 16G 开发机 - - `-Xms4096m -Xmx4096m -XX:NewSize=1024m -XX:MaxNewSize=2048m -XX:PermSize=256m -XX:MaxPermSize=512m` - - 参数说明: - ``` nginx - -Dfile.encoding:默认文件编码 - -server:表示这是应用于服务器的配置,JVM 内部会有特殊处理的 - -Xmx1024m:设置JVM最大可用内存为1024MB - -Xms1024m:设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 - -Xmn1024m:设置JVM新生代大小(JDK1.4之后版本)。一般-Xmn的大小是-Xms的1/2左右,不要设置的过大或过小,过大导致老年代变小,频繁Full GC,过小导致minor GC频繁。如果不设置-Xmn,可以采用-XX:NewRatio=2来设置,也是一样的效果 - -XX:NewSize:设置新生代大小 - -XX:MaxNewSize:设置最大的新生代大小 - -XX:PermSize:设置永久代大小(在 Tomcat8 移出了该参数) - -XX:MaxPermSize:设置最大永久代大小(在 Tomcat8 移出了该参数) - -XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与终身代的比值(除去永久代)。设置为 4,则年轻代与终身代所占比值为 1:4,年轻代占整个堆栈的 1/5 - -XX:MaxTenuringThreshold=10:设置垃圾最大年龄,默认为:15。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。需要注意的是,设置了 -XX:MaxTenuringThreshold,并不代表着,对象一定在年轻代存活15次才被晋升进入老年代,它只是一个最大值,事实上,存在一个动态计算机制,计算每次晋入老年代的阈值,取阈值和MaxTenuringThreshold中较小的一个为准。 - -XX:+DisableExplicitGC:这个将会忽略手动调用 GC 的代码使得 System.gc() 的调用就会变成一个空调用,完全不会触发任何 GC - ``` + - `-Xms4g -Xmx4g` + - 还有一个参数:`-XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=512M` + - 这个可以通过调试来确认什么值合适,一般通过使用 `jstat -gc PID 250 20`,查看 gc 情况下的 MC、MU 情况。 + - 默认 MaxMetaspaceSize 是 -1,无上限,所以如果硬件还行,不配置也没啥问题。 + - 自己也了解 JVM 实际情况,那就根据实际情况调整。一般项目可以推荐:`-XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=512M` - Windows 修改 /tomcat7/bin/catalina.bat 文件,找到这一行:`echo Using CATALINA_BASE: "%CATALINA_BASE%"`,然后在其上面添加如下内容,此方法只对解压版的 Tomcat 有效果,对于安装版本的需要点击安装后任务栏上的那个 Tomcat 图标,打开配置中有一个 `Java` Tab 的进行编辑。 ``` nginx set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding="UTF-8" -Dsun.jnu.encoding="UTF8" -Ddefault.client.encoding="UTF-8" -Duser.language=Zh -set JAVA_OPTS=%JAVA_OPTS% -server -Xms4096m -Xmx4096m -Xmn2048m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 -XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC +set JAVA_OPTS=%JAVA_OPTS% -server -Xms4g -Xmx4g ``` +## tomcat-manager 监控配置(tomcat 8.0.53) + +#### 开启步骤 + +- 不同的 Tomcat 版本会有差异。 +- 官网文档: +- **先确保解压的 tomcat/webapps 下有 manager 项目** +- 在配置文件里面添加可访问用户:`vim /usr/local/tomcat8/conf/tomcat-users.xml`,比如: + +``` + + + + + +``` + +- 正常情况下,manager ui 界面只运行内网:127.0.0.1 访问,这里我们要关闭这个限制。 +- 修改 webapps 下 manager 项目下的配置:`vim /usr/local/tomcat8/webapps/manager/META-INF/context.xml` +- 旧值: + +``` + + + + + > /root/.ssh/authorized_keys + +测试: +ssh localhost + +将公钥复制到其他机子 +ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@linux02(根据提示输入 linux02 密码) + +ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@linux03(根据提示输入 linux03 密码) + +ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 root@linux04(根据提示输入 linux04 密码) + + +在 linux01 上测试 +ssh linux01 + +ssh linux02 + +ssh linux03 + +ssh linux04 +``` + +- 安装基础软件:`yum install -y zip unzip lrzsz git epel-release wget htop deltarpm` +- 安装 Ansible:`yum install -y ansible` +- 配置 Inventory 编辑配置文件:`vim /etc/ansible/hosts` +- 在文件尾部补上如下内容 + +``` +[hadoop-host] +linux01 +linux02 +linux03 + +[kafka-host] +linux04 + +``` + +- 测试 Ansible:`ansible all -a 'ps'`,必须保证能得到如下结果: + +``` +linux01 | CHANGED | rc=0 >> + PID TTY TIME CMD +11088 pts/7 00:00:00 sh +11101 pts/7 00:00:00 python +11102 pts/7 00:00:00 ps + +linux02 | CHANGED | rc=0 >> + PID TTY TIME CMD +10590 pts/1 00:00:00 sh +10603 pts/1 00:00:00 python +10604 pts/1 00:00:00 ps + +linux03 | CHANGED | rc=0 >> + PID TTY TIME CMD +10586 pts/1 00:00:00 sh +10599 pts/1 00:00:00 python +10600 pts/1 00:00:00 ps + +linux04 | CHANGED | rc=0 >> + PID TTY TIME CMD +10574 pts/1 00:00:00 sh +10587 pts/1 00:00:00 python +10588 pts/1 00:00:00 ps +``` + + +#### 服务器基础组件(CentOS 7.x) + + +- 创建脚本文件:`vim /opt/install-basic-playbook.yml` + +``` +- hosts: all + remote_user: root + tasks: + - name: Disable SELinux at next reboot + selinux: + state: disabled + + - name: disable firewalld + command: "{{ item }}" + with_items: + - systemctl stop firewalld + - systemctl disable firewalld + + - name: install-basic + command: "{{ item }}" + with_items: + - yum install -y zip unzip lrzsz git epel-release wget htop deltarpm + + - name: install-vim + shell: "{{ item }}" + with_items: + - yum install -y vim + - curl https://raw.githubusercontent.com/wklken/vim-for-server/master/vimrc > ~/.vimrc + + - name: install-docker + shell: "{{ item }}" + with_items: + - yum install -y yum-utils device-mapper-persistent-data lvm2 + - yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + - yum makecache fast + - yum install -y docker-ce + - systemctl start docker.service + - docker run hello-world + + - name: install-docker-compose + shell: "{{ item }}" + with_items: + - curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose + - chmod +x /usr/local/bin/docker-compose + - docker-compose --version + - systemctl restart docker.service + - systemctl enable docker.service + +``` + +- 执行命令:`ansible-playbook /opt/install-basic-playbook.yml` + + +------------------------------------------------------------------- + +## Wormhole 所需组件安装 + +- 参考官网: +- 必须组件(版本请不要随便用,而是按照如下说明来): +- 我个人习惯软件都是放在:`/usr/local`,压缩包放在:`/opt` + +#### 关于版本号和端口问题 + +- 百度云打包下载(提取码:8tm3): +- 版本: + - **jdk-8u191-linux-x64.tar.gz** + - **zookeeper-3.4.13(Docker)** + - **kafka_2.11-0.10.2.2.tgz** + - **hadoop-2.6.5.tar.gz** + - **flink-1.5.1-bin-hadoop26-scala_2.11.tgz** + - **spark-2.2.0-bin-hadoop2.6.tgz** + - **mysql-3.7(Docker)** + - **wormhole-0.6.0-beta.tar.gz** +- 端口 + - 都采用组件默认端口 + +#### JDK 安装 + +- 将 linux01 下的 JDK 压缩包复制到所有机子的 /opt 目录下: + +``` +scp -r /opt/jdk-8u191-linux-x64.tar.gz root@linux02:/opt + +scp -r /opt/jdk-8u191-linux-x64.tar.gz root@linux03:/opt + +scp -r /opt/jdk-8u191-linux-x64.tar.gz root@linux04:/opt +``` + +- 在 linux01 创建脚本文件:`vim /opt/jdk8-playbook.yml` + +``` +- hosts: all + remote_user: root + tasks: + - name: copy jdk + copy: src=/opt/jdk-8u191-linux-x64.tar.gz dest=/usr/local + + - name: tar jdk + shell: cd /usr/local && tar zxf jdk-8u191-linux-x64.tar.gz + + - name: set JAVA_HOME + blockinfile: + path: /etc/profile + marker: "#{mark} JDK ENV" + block: | + JAVA_HOME=/usr/local/jdk1.8.0_191 + JRE_HOME=$JAVA_HOME/jre + PATH=$PATH:$JAVA_HOME/bin + CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar + export JAVA_HOME + export JRE_HOME + export PATH + export CLASSPATH + + - name: source profile + shell: source /etc/profile +``` + + +- 执行命令:`ansible-playbook /opt/jdk8-playbook.yml` +- 经过试验,发现还是要自己再手动:`source /etc/profile`,原因未知。 + + +#### Hadoop 集群(HDFS,YARN) + +- Hadoop 集群(HDFS,YARN)(linux01、linux02、linux03):`2.6.5` +- Hadoop 环境可以用脚本文件,剩余部分内容请参考上文手工操作:`vim /opt/hadoop-playbook.yml` + +``` +- hosts: hadoop-host + remote_user: root + tasks: + - name: Creates directory + file: + path: /data/hadoop/hdfs/name + state: directory + - name: Creates directory + file: + path: /data/hadoop/hdfs/data + state: directory + - name: Creates directory + file: + path: /data/hadoop/hdfs/tmp + state: directory + + - name: set HADOOP_HOME + blockinfile: + path: /etc/profile + marker: "#{mark} HADOOP ENV" + block: | + HADOOP_HOME=/usr/local/hadoop + HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop + YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop + PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin + export HADOOP_CONF_DIR + export YARN_CONF_DIR + export HADOOP_HOME + export PATH + + - name: source profile + shell: source /etc/profile +``` + + +- 执行命令:`ansible-playbook /opt/hadoop-playbook.yml` +- 剩余内容较多,具体参考:[点击我](Hadoop-Install-And-Settings.md) + - 解压压缩包:`tar zxvf hadoop-2.6.5.tar.gz` + - 这里最好把目录重命名下:`mv /usr/local/hadoop-2.6.5 /usr/local/hadoop` + - 剩下内容从:修改 linux01 配置,开始阅读 + + +#### Flink + +- 须安装在 linux01 +- Flink 单点(linux01):`1.5.1` +- 拷贝:`cd /usr/local/ && cp /opt/flink-1.5.1-bin-hadoop26-scala_2.11.tgz .` +- 解压:`tar zxf flink-*.tgz` +- 修改目录名:`mv /usr/local/flink-1.5.1 /usr/local/flink` +- 修改配置文件:`vim /usr/local/flink/conf/flink-conf.yaml` + - 在文件最前加上:`env.java.home: /usr/local/jdk1.8.0_191` +- 启动:`cd /usr/local/flink && ./bin/start-cluster.sh` +- 停止:`cd /usr/local/flink && ./bin/stop-cluster.sh` +- 查看日志:`tail -300f log/flink-*-standalonesession-*.log` +- 浏览器访问 WEB 管理:`http://linux01:8081/` +- yarn 启动 + - 先停止下本地模式 + - 测试控制台启动:`cd /usr/local/flink && ./bin/yarn-session.sh -n 2 -jm 2024 -tm 2024` + - 有可能会报:`The Flink Yarn cluster has failed`,可能是资源不够,需要调优内存相关参数 + + +#### Zookeeper + +- Zookeeper 单点(linux04):`3.4.13` +- 单个实例:`docker run -d --restart always --name one-zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime zookeeper:3.4.13` + +#### Kafka + +- Kafka 单点(linux04):`0.10.2.2` +- 上传压缩包到 /opt 目录下 +- 拷贝压缩包:`cd /usr/local && cp /opt/kafka_2.11-0.10.2.2.tgz .` +- 解压:`tar zxvf kafka_2.11-0.10.2.2.tgz` +- 删除压缩包并重命名目录:`rm -rf kafka_2.11-0.10.2.2.tgz && mv /usr/local/kafka_2.11-0.10.2.2 /usr/local/kafka` +- 修改 kafka-server 的配置文件:`vim /usr/local/kafka/config/server.properties` + +``` +034 行:listeners=PLAINTEXT://0.0.0.0:9092 +039 行:advertised.listeners=PLAINTEXT://linux04:9092 +119 行:zookeeper.connect=linux04:2181 +补充 :auto.create.topics.enable=true +``` + +- 启动 kafka 服务(必须制定配置文件):`cd /usr/local/kafka && bin/kafka-server-start.sh config/server.properties` + - 后台方式运行 kafka 服务:`cd /usr/local/kafka && bin/kafka-server-start.sh -daemon config/server.properties` + - 停止 kafka 服务:`cd /usr/local/kafka && bin/kafka-server-stop.sh` +- 再开一个终端测试: + - 创建 topic 命令:`cd /usr/local/kafka && bin/kafka-topics.sh --create --zookeeper linux04:2181 --replication-factor 1 --partitions 1 --topic my-topic-test` + - 查看 topic 命令:`cd /usr/local/kafka && bin/kafka-topics.sh --list --zookeeper linux04:2181` + - 删除 topic:`cd /usr/local/kafka && bin/kafka-topics.sh --delete --topic my-topic-test --zookeeper linux04:2181` + - 给 topic 发送消息命令:`cd /usr/local/kafka && bin/kafka-console-producer.sh --broker-list linux04:9092 --topic my-topic-test`,然后在出现交互输入框的时候输入你要发送的内容 + - 再开一个终端,进入 kafka 容器,接受消息:`cd /usr/local/kafka && bin/kafka-console-consumer.sh --bootstrap-server linux04:9092 --topic my-topic-test --from-beginning` + - 此时发送的终端输入一个内容回车,接受消息的终端就可以收到。 + +#### MySQL + +- MySQL 单点(linux04):`5.7` +- 创建本地数据存储 + 配置文件目录:`mkdir -p /data/docker/mysql/datadir /data/docker/mysql/conf /data/docker/mysql/log` +- 在宿主机上创建一个配置文件:`vim /data/docker/mysql/conf/mysql-1.cnf`,内容如下: + +``` +[mysql] +default-character-set = utf8 + +[mysqld] +pid-file = /var/run/mysqld/mysqld.pid +socket = /var/run/mysqld/mysqld.sock +datadir = /var/lib/mysql +symbolic-links=0 + +log-error=/var/log/mysql/error.log +default-storage-engine = InnoDB +collation-server = utf8_unicode_ci +init_connect = 'SET NAMES utf8' +character-set-server = utf8 +lower_case_table_names = 1 +max_allowed_packet = 50M +``` + +- 赋权(避免挂载的时候,一些程序需要容器中的用户的特定权限使用):`chmod -R 777 /data/docker/mysql/datadir /data/docker/mysql/log` +- 赋权:`chown -R 0:0 /data/docker/mysql/conf` +- `docker run -p 3306:3306 --name one-mysql -v /data/docker/mysql/datadir:/var/lib/mysql -v /data/docker/mysql/log:/var/log/mysql -v /data/docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=aaabbb123456 -d mysql:5.7` +- 连上容器:`docker exec -it one-mysql /bin/bash` + - 连上 MySQL:`mysql -u root -p` + - 创建表:`CREATE DATABASE wormhole DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;` +- **确保用 sqlyog 能直接在外网连上,方便后面调试** + + +#### Spark + +- 须安装在 linux01 +- Spark 单点(linux01):`2.2.0` +- 上传压缩包到 /opt 目录下 +- 拷贝压缩包:`cd /usr/local && cp /opt/spark-2.2.0-bin-hadoop2.6.tgz .` +- 解压:`tar zxvf spark-2.2.0-bin-hadoop2.6.tgz` +- 重命名:`mv /usr/local/spark-2.2.0-bin-hadoop2.6 /usr/local/spark` +- 增加环境变量: + +``` +vim /etc/profile + +SPARK_HOME=/usr/local/spark +PATH=$PATH:${SPARK_HOME}/bin:${SPARK_HOME}/sbin +export SPARK_HOME +export PATH + +source /etc/profile +``` + +- 修改配置:`cp $SPARK_HOME/conf/spark-env.sh.template $SPARK_HOME/conf/spark-env.sh` +- 修改配置:`vim $SPARK_HOME/conf/spark-env.sh` +- 假设我的 hadoop 路径是:/usr/local/hadoop,则最尾巴增加: + +``` +export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop +``` + + +#### 非必须组件 + +- Elasticsearch(支持版本 5.x)(非必须,若无则无法查看 wormhole 处理数据的吞吐和延时) +- Grafana (支持版本 4.x)(非必须,若无则无法查看 wormhole 处理数据的吞吐和延时的图形化展示) + + +------------------------------------------------------------------- + +## Wormhole 安装 + 配置 + +- 须安装在 linux01 +- wormhole 单点(linux01):`0.6.0-beta`,2018-12-06 版本 +- 先在 linux04 机子的 kafka 创建 topic: + +``` +cd /usr/local/kafka && bin/kafka-topics.sh --list --zookeeper linux04:2181 +cd /usr/local/kafka && bin/kafka-topics.sh --create --zookeeper linux04:2181 --replication-factor 1 --partitions 1 --topic source +cd /usr/local/kafka && bin/kafka-topics.sh --create --zookeeper linux04:2181 --replication-factor 1 --partitions 1 --topic wormhole_feedback +cd /usr/local/kafka && bin/kafka-topics.sh --create --zookeeper linux04:2181 --replication-factor 1 --partitions 1 --topic wormhole_heartbeat +``` + +- 上传压缩包到 /opt 目录下 +- 拷贝压缩包:`cd /usr/local && cp /opt/wormhole-0.6.0-beta.tar.gz .` +- 解压:`cd /usr/local && tar -xvf wormhole-0.6.0-beta.tar.gz` +- 修改配置文件:`vim /usr/local/wormhole-0.6.0-beta/conf/application.conf` + +``` + +akka.http.server.request-timeout = 120s + +wormholeServer { + cluster.id = "" #optional global uuid + host = "linux01" + port = 8989 + ui.default.language = "Chinese" + token.timeout = 1 + token.secret.key = "iytr174395lclkb?lgj~8u;[=L:ljg" + admin.username = "admin" #default admin user name + admin.password = "admin" #default admin user password +} + +mysql = { + driver = "slick.driver.MySQLDriver$" + db = { + driver = "com.mysql.jdbc.Driver" + user = "root" + password = "aaabbb123456" + url = "jdbc:mysql://linux04:3306/wormhole?useUnicode=true&characterEncoding=UTF-8&useSSL=false" + numThreads = 4 + minConnections = 4 + maxConnections = 10 + connectionTimeout = 3000 + } +} + +#ldap = { +# enabled = false +# user = "" +# pwd = "" +# url = "" +# dc = "" +# read.timeout = 3000 +# read.timeout = 5000 +# connect = { +# timeout = 5000 +# pool = true +# } +#} + +spark = { + wormholeServer.user = "root" #WormholeServer linux user + wormholeServer.ssh.port = 22 #ssh port, please set WormholeServer linux user can password-less login itself remote + spark.home = "/usr/local/spark" + yarn.queue.name = "default" #WormholeServer submit spark streaming/job queue + wormhole.hdfs.root.path = "hdfs://linux01/wormhole" #WormholeServer hdfslog data default hdfs root path + yarn.rm1.http.url = "linux01:8088" #Yarn ActiveResourceManager address + yarn.rm2.http.url = "linux01:8088" #Yarn StandbyResourceManager address +} + +flink = { + home = "/usr/local/flink" + yarn.queue.name = "default" + feedback.state.count=100 + checkpoint.enable=false + checkpoint.interval=60000 + stateBackend="hdfs://linux01/flink-checkpoints" + feedback.interval=30 +} + +zookeeper = { + connection.url = "linux04:2181" #WormholeServer stream and flow interaction channel + wormhole.root.path = "/wormhole" #zookeeper +} + +kafka = { + brokers.url = "linux04:9092" + zookeeper.url = "linux04:2181" + topic.refactor = 1 + using.cluster.suffix = false #if true, _${cluster.id} will be concatenated to consumer.feedback.topic + consumer = { + feedback.topic = "wormhole_feedback" + poll-interval = 20ms + poll-timeout = 1s + stop-timeout = 30s + close-timeout = 20s + commit-timeout = 70s + wakeup-timeout = 60s + max-wakeups = 10 + session.timeout.ms = 60000 + heartbeat.interval.ms = 50000 + max.poll.records = 1000 + request.timeout.ms = 80000 + max.partition.fetch.bytes = 10485760 + } +} + +#kerberos = { +# keyTab="" #the keyTab will be used on yarn +# spark.principal="" #the principal of spark +# spark.keyTab="" #the keyTab of spark +# server.config="" #the path of krb5.conf +# jaas.startShell.config="" #the path of jaas config file which should be used by start.sh +# jaas.yarn.config="" #the path of jaas config file which will be uploaded to yarn +# server.enabled=false #enable wormhole connect to Kerberized cluster +#} + +# choose monitor method among ES、MYSQL +monitor ={ + database.type="MYSQL" +} + +#Wormhole feedback data store, if doesn't want to config, you will not see wormhole processing delay and throughput +#if not set, please comment it + +#elasticSearch.http = { +# url = "http://localhost:9200" +# user = "" +# password = "" +#} + +#display wormhole processing delay and throughput data, get admin user token from grafana +#garfana should set to be anonymous login, so you can access the dashboard through wormhole directly +#if not set, please comment it + +#grafana = { +# url = "http://localhost:3000" +# admin.token = "jihefouglokoj" +#} + +#delete feedback history data on time +maintenance = { + mysql.feedback.remain.maxDays = 7 + elasticSearch.feedback.remain.maxDays = 7 +} + + +#Dbus integration, support serveral DBus services, if not set, please comment it + +#dbus = { +# api = [ +# { +# login = { +# url = "http://localhost:8080/keeper/login" +# email = "" +# password = "" +# } +# synchronization.namespace.url = "http://localhost:8080/keeper/tables/riderSearch" +# } +# ] +#} +``` + +- 初始化表结构脚本路径: + - 该脚本存在一个问题:初始化脚本和补丁脚本混在一起,所以直接复制执行会有报错,但是报错的部分是不影响 + - 我是直接把基础 sql 和补丁 sql 分开执行,方便判断。 +- 启动:`sh /usr/local/wormhole-0.6.0-beta/bin/start.sh` +- 查看 log:`tail -200f /usr/local/wormhole-0.6.0-beta/logs/application.log` +- 部署完成,浏览器访问: +- 默认管理员用户名:admin,密码:admin + +------------------------------------------------------------------- + +## 创建用户 + +- **参考官网,必须先了解下**: +- 必须创建用户,后面才能进入 Project 里面创建 Stream / Flow +- 创建的用户类型必须是:`user` +- 假设这里创建的用户叫做:`user1@bg.com` + +------------------------------------------------------------------- + +## 创建 Source 需要涉及的概念 + +#### 创建 Instance + +- Instance 用于绑定各个组件的所在服务连接 +- 一般我们都会选择 Kafka 作为 source,后面的基础也是基于 Kafka 作为 Source 的场景 +- 假设填写实例名:`source_kafka` +- URL:`linux04:9092` + +#### 创建 Database + +- 各个组件的具体数据库、Topic 等信息 +- 假设填写 Topic Name:`source` +- Partition:1 + +#### 创建 Namespace + +- wormhole 抽象出来的概念 +- 用于数据分类 +- 假设填写 Tables:`ums_extension id` +- 配置 schema,记得配置上 ums_ts + +``` +{ + "id": 1, + "name": "test", + "phone": "18074546423", + "city": "Beijing", + "time": "2017-12-22 10:00:00" +} +``` + + +------------------------------------------------------------------- + +## 创建 Sink 需要涉及的概念 + +#### 创建 Instance + +- 假设填写实例名:`sink_mysql` +- URL:`linux04:3306` + +#### 创建 Database + +- 假设填写 Database Name:`sink` +- config 参数:`useUnicode=true&characterEncoding=UTF-8&useSSL=false&rewriteBatchedStatements=true` + + + +#### 创建 Namespace + +- 假设填写 Tables: `user id` + + +------------------------------------------------------------------- + +## 创建 Project + +- 项目标识:`demo` + +------------------------------------------------------------------- + + +## Flink Stream + +- Stream 是在 Project 内容页下才能创建 +- 一个 Stream 可以有多个 Flow +- 并且是 Project 下面的用户才能创建,admin 用户没有权限 +- 要删除 Project 必须先进入 Project 内容页删除所有 Stream 之后 admin 才能删除 Project +- 新建 Stream + - Stream type 类型选择:`Flink` + - 假设填写 Name:`wormhole_stream_test` + +## Flink Flow + +- 假设 Flow name 为:`wormhole_flow_test` +- Flow 是在 Project 内容页下才能创建 +- 并且是 Project 下面的用户才能创建,admin 用户没有权限 +- Flow 会关联 source 和 sink +- 要删除 Project 必须先进入 Project 内容页删除所有 Stream 之后 admin 才能删除 Project +- 基于 Stream 新建 Flow + - Pipeline + - Transformation + - + - NO_SKIP 滑动窗口 + - SKIP_PAST_LAST_EVENT 滚动窗口 + - KeyBy 分组字段 + - Output + - Agg:将匹配的多条数据做聚合,生成一条数据输出,例:field1:avg,field2:max(目前支持 max/min/avg/sum) + - Detail:将匹配的多条数据逐一输出 + - FilteredRow:按条件选择指定的一条数据输出,例:head/last/ field1:min/max + - Confirmation +- 注意:Stream 处于 running 状态时,才可以启动 Flow + + +------------------------------------------------------------------- + +## Kafka 发送测试数据 + +- 在 linux04 机子上 +- `cd /usr/local/kafka/bin && ./kafka-console-producer.sh --broker-list linux04:9092 --topic source --property "parse.key=true" --property "key.separator=@@@"` +- 发送 UMS 流消息协议规范格式: + +``` +data_increment_data.kafka.source_kafka.source.ums_extension.*.*.*@@@{"id": 1, "name": "test1", "phone":"18074546423", "city": "Beijing", "time": "2017-12-22 10:01:00"} + +data_increment_data.kafka.source_kafka.source.ums_extension.*.*.*@@@{"id": 2, "name": "test2", "phone":"18074546423", "city": "Beijing", "time": "2017-12-22 10:02:00"} + +data_increment_data.kafka.source_kafka.source.ums_extension.*.*.*@@@{"id": 3, "name": "test3", "phone":"18074546423", "city": "Beijing", "time": "2017-12-22 10:03:00"} + +data_increment_data.kafka.source_kafka.source.ums_extension.*.*.*@@@{"id": 4, "name": "test4", "phone":"18074546423", "city": "Beijing", "time": "2017-12-22 10:04:00"} + +data_increment_data.kafka.source_kafka.source.ums_extension.*.*.*@@@{"id": 5, "name": "test5", "phone":"18074546423", "city": "Beijing", "time": "2017-12-22 10:05:00"} + +data_increment_data.kafka.source_kafka.source.ums_extension.*.*.*@@@{"id": 6, "name": "test6", "phone":"18074546423", "city": "Beijing", "time": "2017-12-22 10:06:00"} + +data_increment_data.kafka.source_kafka.source.ums_extension.*.*.*@@@{"id": 7, "name": "test7", "phone":"18074546423", "city": "Beijing", "time": "2017-12-22 10:07:00"} + +data_increment_data.kafka.source_kafka.source.ums_extension.*.*.*@@@{"id": 8, "name": "test8", "phone":"18074546423", "city": "Beijing", "time": "2017-12-22 10:08:00"} + +data_increment_data.kafka.source_kafka.source.ums_extension.*.*.*@@@{"id": 9, "name": "test9", "phone":"18074546423", "city": "Beijing", "time": "2017-12-22 10:09:00"} +``` + diff --git a/markdown-file/Zsh.md b/markdown-file/Zsh.md index 2186bc74..e0e294a3 100644 --- a/markdown-file/Zsh.md +++ b/markdown-file/Zsh.md @@ -64,6 +64,18 @@ - 编辑配置文件:`vim /root/.zshrc`,找到下图的地方,怎么安装,原作者注释写得很清楚了,别装太多了,默认 git 是安装的。 - ![oh-my-zsh 安装](../images/Zsh-c-1.jpg) - 插件推荐: + - `zsh-autosuggestions` + - 这个插件会对历史命令一些补全,类似 fish 终端 + - 插件官网: + - 安装,复制该命令:`git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions` + - 编辑:`vim ~/.zshrc`,找到这一行,后括号里面的后面添加:`plugins=( 前面的一些插件名称,换行,加上:zsh-autosuggestions)` + - 刷新下配置:`source ~/.zshrc` + - `zsh-syntax-highlighting` + - 这个插件会对终端命令高亮显示,比如正确的拼写会是绿色标识,否则是红色,另外对于一些shell输出语句也会有高亮显示,算是不错的辅助插件 + - 插件官网: + - 安装,复制该命令:`git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting` + - 编辑:`vim ~/.zshrc`,找到这一行,后括号里面的后面添加:`plugins=( 前面的一些插件名称,换行,加上:zsh-syntax-highlighting)` + - 刷新下配置:`source ~/.zshrc` - `wd` - 简单地讲就是给指定目录映射一个全局的名字,以后方便直接跳转到这个目录,比如: - 编辑配置文件,添加上 wd 的名字:`vim /root/.zshrc` @@ -80,12 +92,6 @@ - 进入解压后目录并安装:`cd autojump_v21.1.2/ ; ./install.sh` - 再执行下这个:`source /etc/profile.d/autojump.sh` - 编辑配置文件,添加上 autojump 的名字:`vim /root/.zshrc` - - `zsh-syntax-highlighting` - - 这个插件会对终端命令高亮显示,比如正确的拼写会是绿色标识,否则是红色,另外对于一些shell输出语句也会有高亮显示,算是不错的辅助插件 - - 插件官网: - - 安装,复制该命令:'git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting' - - 编辑:`vim ~/.zshrc`,找到这一行,后括号里面的后面添加:`plugins=( 前面的一些插件名称 zsh-syntax-highlighting)` - - 刷新下配置:`source ~/.zshrc` ### 主题 diff --git a/markdown-file/kali-linux-settings/kali-linux-basic-settings.md b/markdown-file/kali-linux-settings/kali-linux-basic-settings.md new file mode 100644 index 00000000..d3dc1404 --- /dev/null +++ b/markdown-file/kali-linux-settings/kali-linux-basic-settings.md @@ -0,0 +1,119 @@ +# 基础设置 + + +## 修改源 + +- 编辑配置文件:`vim /etc/apt/sources.list` +- 在文件 **最前面** 添加以下条目,官网文档: + +``` +#中科大的源 +deb https://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib +deb-src https://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib +``` + +- `apt-get update` 更新索引 + +## 安装公共工具 + +- `apt-get install -y zip unzip lrzsz git` + + +## 安装 Zsh、Vim + +``` +apt-get install -y zsh + +wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O - | sh + +chsh -s /bin/zsh root + +apt-get install -y vim + +curl https://raw.githubusercontent.com/wklken/vim-for-server/master/vimrc > ~/.vimrc +``` + +## 安装搜狗输入法 + +- 下载 deb 文件: +- 安装依赖:`apt-get install -y fcitx` +- 安装 deb 文件:`dpkg -i 文件名` + - 应该会提示有部分依赖不存在,则执行:`apt-get --fix-broken install -y` +- 安装完成后: + - 终端输入:`im-config`,一路确定,在有一个提示选项中选择:`fcitx`,重启电脑,按 Ctrl + Space 就可以切换输入法 + +## 安装 Visual Studio Code + +- 下载 deb 文件: +- 安装 deb 文件:`dpkg -i 文件名` + - 应该会提示有部分依赖不存在,则执行:`apt-get --fix-broken install -y` +- 安装扩展 + - 扩展仓库: + - 中文语言包 + - Markdown + - GitLens + - REST Client + - Atom One Dark Theme + +## 安装剪切板 + +- 命令:`sudo apt-get install parcellite` + - 修改快捷键:`右键软件 | 首选项 | Hotkeys | 历史记录按键组合` + +## 安装 Peek(Gif 录制) + +- 自己构建 deb 包安装 + +``` +sudo apt install cmake valac libgtk-3-dev libkeybinder-3.0-dev libxml2-utils gettext txt2man + +git clone https://github.com/phw/peek.git --depth=1 +mkdir peek/build +cd peek/build +cmake -DCMAKE_INSTALL_PREFIX=/usr -DGSETTINGS_COMPILE=OFF .. +make package + +sudo dpkg -i peek-*-Linux.deb +``` + +## 安装截图软 + +``` +wget http://packages.linuxdeepin.com/deepin/pool/main/d/deepin-scrot/deepin-scrot_2.0-0deepin_all.deb +sudo dpkg -i deepin-scrot_2.0-0deepin_all.deb + +apt-get --fix-broken install -y + +//终端下启动 +deepin-scrot +``` + +- 配置快捷键来截图方法(思路一样): + - Kali 的快捷键设置在:设置 - 设备 - Keyboard 下 + + +## 升级 firefox + +- 官网下载: +- 假设放在 /opt 目录下,进行解压:`tar xjf firefox-*.tar.bz2` +- 进入图标存放目录|:`cd /usr/share/applications` +- 创建文件并编辑:`sudo vim firefoxnew.desktop` + +``` ini +[Desktop Entry] +Name=firefoxnew +Name[zh_CN]=firefoxnew +Comment=firefox new +Exec=/opt/firefox/firefox +Icon=/opt/firefox/icons/updater.png +Terminal=false +Type=Application +Categories=Application; +Encoding=UTF-8 +StartupNotify=true +``` + + +## 安装 SSR 客户端 + +- 查看: diff --git a/markdown-file/kali-linux-settings/kali-linux-install.md b/markdown-file/kali-linux-settings/kali-linux-install.md new file mode 100644 index 00000000..f8fa9f83 --- /dev/null +++ b/markdown-file/kali-linux-settings/kali-linux-install.md @@ -0,0 +1,28 @@ +# Kali Linux 安装 + + +## 制作 U 盘 + + +- 准备一个 U 盘,下载这个软件:[USBWriter(提取码:5aa2)](https://pan.baidu.com/s/1gg83h9T) +- USBWriter 的使用很简单,如下图即可制作一个 CentOS 系统盘 + +![VMware 下安装](../../images/CentOS-7-Install-a-0.jpg) + + +## 安装过程 + +- 这几年的几个版本安装过程都是类似的,大家可以参考这个视频教程: + - + - 其中,安装第一步选择中文,安装完成就会是中文的,不需要像上面这个视频那么麻烦。 +- 安装过程,比较差的机子差不多要 20 ~ 30 分钟。 +- 比较重点的几个步骤推荐: + - `使用整个磁盘` + - `将所有文件放在同一个分区中` + - `分区设定结束并修改写入磁盘` + - `将改动写入磁盘 -- 是` + - `使用网络镜像 -- 是` + +## 软件及系统升级 + +- `apt-get update && apt-get upgrade` \ No newline at end of file diff --git a/markdown-file/kali-linux-settings/kali-linux-penetration-test.md b/markdown-file/kali-linux-settings/kali-linux-penetration-test.md new file mode 100644 index 00000000..58751c06 --- /dev/null +++ b/markdown-file/kali-linux-settings/kali-linux-penetration-test.md @@ -0,0 +1,61 @@ +# 渗透测试思路 + +- 来源:《Kali Linux 渗透测试的艺术》 + +## 范围界定 + +- 收集需求 +- 筹划工作 +- 边界分析 +- 明确业务指标 +- 项目管理和统筹调度 + +## 信息收集 + +- 互联网上的公开信息 +- 域名注册信息(whois) +- DNS 记录分析 +- 路由信息 +- 利用搜索引擎搜索目标历史记录 + - Google Hack,根据 Google 的 `inurl` 等高级用法查询一些系统可能存在风险 + - 比如查找链接是:`asp?id=`、`php?id=1` 的链接。asp 和 php 的系统相对比较薄弱。特别是对于 asp 的老系统,建议开发者还是放弃。 + +## 目标识别 + +- 识别目标还在线的主机 +- 识别目标在线主机的系统 + +## 服务枚举 + +- 获取目标主机的情况 + - 开放的端口 + - 操作系统 + - 网络服务 + +## 漏洞扫描 + +- 根据种类划分 + - 本地漏洞 + - 远程漏洞 +- 根据类型划分 + - 设计类漏洞 + - 实施类漏洞 + - 运营类漏洞 + +## 漏洞利用 + + +## 社会工程学攻击 + +- 心理学建模 +- 社会关系 + +## 提升权限 + +## 密码攻击 + +## 无线网络渗透测试 + +## 访问维护 + +- 创建后门 diff --git a/markdown-file/kali-linux-settings/kali-linux-social-engineering.md b/markdown-file/kali-linux-settings/kali-linux-social-engineering.md new file mode 100644 index 00000000..7432bd85 --- /dev/null +++ b/markdown-file/kali-linux-settings/kali-linux-social-engineering.md @@ -0,0 +1,23 @@ +# 社会工程学 + +## 简介 + + + +## SET 工具 + +- 命令:`setoolkit`(命令行向导式交互) +- 选择 1:`Social-Engineering Attacks`,结果如下: + +``` +1) Spear-Phishing Attack Vectors #鱼叉式钓鱼攻击向量(也称针对性钓鱼攻击) +2) Website Attack Vectors #网页攻击向量 +3) Infectious Media Generator #媒介感染生成器 +4) Create a Payload and Listener #生成一个payload和监听 +5) Mass Mailer Attack #大规模邮件钓鱼 +6) Arduino-Based Attack Vector #基于Arduino的攻击(类似于单片机) +7) Wireless Access Point Attack Vector #无线接入点攻击 +8) QRCode Generator Attack Vector #二维码攻击 +9) Powershell Attack Vectors #powershell攻击 +10) Third Party Modules #第三方模块 +``` diff --git a/markdown-file/kali-linux-settings/kali-linux-sql-injection.md b/markdown-file/kali-linux-settings/kali-linux-sql-injection.md new file mode 100644 index 00000000..e8d7815a --- /dev/null +++ b/markdown-file/kali-linux-settings/kali-linux-sql-injection.md @@ -0,0 +1,105 @@ +# SQL 注入 + +## 探测到底是不是通过拼接字符串方式使用 SQL + +- 常用字符: + +``` +' +" +' and 1=1 +' and 1=2 +1 or 1=1 +1' or '1'='1 +1" or "1"="1 +1' order by 1-- +union select 1,2-- +@@version +@@datadir +user() +database() +information_schema.tables + +``` + + +## sqlmap 分析数据库和表名、dump 表数据 + +#### sqlmap 介绍 + +- 目前做 SQL 注入的工具一般大家都是选择:[sqlmap](http://sqlmap.org/) + - 目前(2018年08月)只支持:2.6.x 和 2.7.x +- 支持的 5 种注入类型: + - 基于布尔的盲注,即可以根据返回页面判断条件真假的注入。 + - 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。 + - 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。 + - 联合查询注入,可以使用union的情况下的注入。 + - 堆查询注入,可以同时执行多条语句的执行时的注入。 + + +#### sqlmap 使用 + +- sqlmap 的输出信息按从简到繁共分为7个级别,依次为 0 ~ 6,级别越高,检测越全面。分别代表: + - 使用参数 `-v <级别>` 来指定某个等级,默认输出级别为 1 + +``` +0:只显示 Python 的 tracebacks 信息、错误信息 [ERROR] 和关键信息 [CRITICAL]; +1:同时显示普通信息 [INFO] 和警告信息[WARNING]; +2:同时显示调试信息[DEBUG]; +3:同时显示注入使用的攻击荷载; +4:同时显示 HTTP 请求; +5:同时显示 HTTP 响应头; +6:同时显示 HTTP 响应体。 +``` + +- 将 Google 搜索前一百个结果作为攻击目标:`sqlmap -g "inurl:\".asp?id=1\""` +- 检查注入点(GET):`sqlmap -u 目标网址` +- 检查注入点(POST 数据,多个数据用分号隔开):`sqlmap -u 目标网址 --data="id=0;name=werner" --param-del=";"` +- 检查注入点(Cookie,等级必须是 2 以上):`sqlmap -u 目标网址 --cookie –level 2 "JSESSIONID=123456;NAME=youmeek;" --cookie-del=";"` +- 获取所有数据库信息:`sqlmap -u 目标网址 --dbs` +- 获取所有数据库用户:`sqlmap -u 目标网址 --users` +- 获取当前数据库信息:`sqlmap -u 目标网址 --current-db` +- 获取当前用户:`sqlmap -u 目标网址 --current-user` +- 获取当前数据库和当前用户:`sqlmap -u 目标网址 --current-db --current-user` +- 获取有几张表:`sqlmap -u 目标网址 --tables` +- 获取指定表的字段有哪些:`sqlmap -u 目标网址 -T 表名 --columns` +- 获取指定表字段值:`sqlmap -u 目标网址 -T 表名 -C 字段名1,字段名2,字段名3 --dump` +- 获取指定表字段所有值:`sqlmap -u 目标网址 -T 表名 -C 字段名1,字段名2,字段名3 --dump-all` +- 让 HTTP 请求之间添加延迟,添加参数:`--delay 3`,单位是秒 +- 设置超时时间,默认是 30 秒,添加参数:`--timeout 50`,单位是秒 +- 设置超时后最大重试次数,默认是 3 次,添加参数:`--retries 5` +- 避免错误请求过多而被屏蔽: + +``` +有时服务器检测到某个客户端错误请求过多会对其进行屏蔽,而 sqlmap 的测试往往会产生大量错误请求,为避免被屏蔽,可以时不时的产生几个正常请求以迷惑服务器。有以下四个参数与这一机制有关: + +--safe-url: 隔一会就访问一下的安全 URL +--safe-post: 访问安全 URL 时携带的 POST 数据 +--safe-req: 从文件中载入安全 HTTP 请求 +--safe-freq: 每次测试请求之后都会访问一下的安全 URL + +这里所谓的安全 URL 是指访问会返回 200、没有任何报错的 URL。相应地,Sqlmap 也不会对安全 URL 进行任何注入测试。 +``` + +- 其他常用参数: + - 构造随机 user-agent:`–random-agent` + - 指定 HTTP Referer头:`–referer=设定值` + - 换行分开,加入其他的HTTP头:`–headers=设定值` + - 忽略响应的 Set–Cookie 头信息:`–drop-set-cookie` + +## 分析登录后台入口 + +- nikto + +## 资料 + +- +- +- <> +- <> +- <> +- <> +- <> +- <> +- <> +- <> \ No newline at end of file diff --git a/markdown-file/kali-linux-settings/kali-linux-toc.md b/markdown-file/kali-linux-settings/kali-linux-toc.md new file mode 100644 index 00000000..6c3bd1aa --- /dev/null +++ b/markdown-file/kali-linux-settings/kali-linux-toc.md @@ -0,0 +1,26 @@ + +# Kali Linux + +## 介绍 + +- 官网: +- 基于 Debian +- 设计用于数字鉴识和渗透测试,预装了很多渗透测试程序 +- 支持 x86 和 ARM 架构 +- 官网下载: + - 镜像名:Kali Linux 64 Bit,默认是用 GNOME 桌面,比较华丽,相对较卡(好点电脑推荐,习惯 Ubuntu 的基本都会用) + - 镜像名:Kali Linux Xfce 64 Bit,默认是用 Xfce 桌面,比较简洁,相对不卡(配置较差的推荐,我这里一台笔记本配置较差,用的就是这个) + - 镜像名:Kali Linux Kde 64 Bit,默认是用 Kde 桌面,比较华丽,相对较卡(不推荐) + - 镜像名:Kali Linux Mate 64 Bit,默认是用 Mate 桌面,比较华丽,相对较卡(不推荐) + - 镜像名:Kali Linux Lxde 64 Bit,默认是用 Lxde 桌面,比较简洁,相对不卡(类似 Windows 风格的桌面,不推荐) + +## 学习过程 + +- [Kali Linux 系统安装](kali-linux-install.md) +- [Kali Linux 基础设置](kali-linux-basic-settings.md) +- [Kali Linux 渗透测试思路](kali-linux-penetration-test.md) + + +## 其他资料 + +- \ No newline at end of file diff --git a/markdown-file/monitor.md b/markdown-file/monitor.md index 573d38cd..9a825839 100644 --- a/markdown-file/monitor.md +++ b/markdown-file/monitor.md @@ -66,6 +66,8 @@ procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- - `bi` 表示从块设备读取数据的量(读磁盘) - `bo` 表示从块设备写入数据的量(写磁盘) - **如果bi和bo两个数字比较高,则说明,磁盘IO压力大。** + - `in` 每秒 CPU 的中断次数,包括时间中断 + - `cs` 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目 - `wa` 表示I/O等待所占用CPU的时间比 #### 命令:sar(综合) @@ -266,6 +268,7 @@ atctive 和 passive 的数目通常可以用来衡量服务器的负载:接受 - 在 `top` 命令状态下按 shfit + m 可以按照 **内存使用** 大小排序 - 在 `top` 命令状态下按 shfit + p 可以按照 **CPU 使用** 大小排序 - 展示数据上,%CPU 表示进程占用的 CPU 百分比,%MEM 表示进程占用的内存百分比 +- mac 下不一样:要先输入 o,然后输入 cpu 则按 cpu 使用量排序,输入 rsize 则按内存使用量排序。 #### CPU 其他工具 @@ -460,13 +463,17 @@ vda 0.00 0.00 0.00 1.68 0.00 16.16 19.20 0 - `%util`: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率(就是繁忙程度,值越高表示越繁忙) - **总结** - `iowait%` 表示CPU等待IO时间占整个CPU周期的百分比,如果iowait值超过50%,或者明显大于%system、%user以及%idle,表示IO可能存在问题。 - - `%util` 表示磁盘忙碌情况,一般该值超过80%表示该磁盘可能处于繁忙状态 + - `%util` (重点参数)表示磁盘忙碌情况,一般该值超过80%表示该磁盘可能处于繁忙状态 #### 硬盘 IO 监控 - 安装 iotop:`yum install -y iotop` -- 查看命令:`iotop` +- 查看所有进程 I/O 情况命令:`iotop` +- 只查看当前正在处理 I/O 的进程:`iotop -o` +- 只查看当前正在处理 I/O 的线程,每隔 5 秒刷新一次:`iotop -o -d 5` +- 只查看当前正在处理 I/O 的进程(-P 参数决定),每隔 5 秒刷新一次:`iotop -o -P -d 5` +- 只查看当前正在处理 I/O 的进程(-P 参数决定),每隔 5 秒刷新一次,使用 KB/s 单位(默认是 B/s):`iotop -o -P -k -d 5` - 使用 dd 命令测量服务器延迟:`dd if=/dev/zero of=/opt/ioTest2.txt bs=512 count=1000 oflag=dsync` - 使用 dd 命令来测量服务器的吞吐率(写速度):`dd if=/dev/zero of=/opt/ioTest1.txt bs=1G count=1 oflag=dsync` - 该命令创建了一个 10M 大小的文件 ioTest1.txt,其中参数解释: @@ -543,17 +550,33 @@ kB_ccwr/s:任务取消的写入磁盘的 KB。当任务截断脏的 pagecache - 如果没有 EPEL 源:`yum install -y epel-release` - 常用命令: - `iftop`:默认是监控第一块网卡的流量 - - `iftop -i eth1`:监控eth1 + - `iftop -i eth0`:监控 eth0 - `iftop -n`:直接显示IP, 不进行DNS反解析 - `iftop -N`:直接显示连接埠编号, 不显示服务名称 - `iftop -F 192.168.1.0/24 or 192.168.1.0/255.255.255.0`:显示某个网段进出封包流量 + - `iftop -nP`:显示端口与 IP 信息 -### 端口使用情况 +``` nginx +中间部分:外部连接列表,即记录了哪些ip正在和本机的网络连接 + +右边部分:实时参数分别是该访问 ip 连接到本机 2 秒,10 秒和 40 秒的平均流量 + +=> 代表发送数据,<= 代表接收数据 + +底部会显示一些全局的统计数据,peek 是指峰值情况,cumm 是从 iftop 运行至今的累计情况,而 rates 表示最近 2 秒、10 秒、40 秒内总共接收或者发送的平均网络流量。 + +TX:(发送流量) cumm: 143MB peak: 10.5Mb rates: 1.03Mb 1.54Mb 2.10Mb +RX:(接收流量) 12.7GB 228Mb 189Mb 191Mb 183Mb +TOTAL:(总的流量) 12.9GB 229Mb 190Mb 193Mb 185MbW + +``` + +### 端口使用情况(也可以用来查看端口占用) #### lsof - 安装 lsof:`yum install -y lsof` -- 查看 3316 端口是否有被使用:`lsof -i:3316`,**有被使用会输出类似如下信息,如果没被使用会没有任何信息返回** +- 查看 3316 端口是否有被使用(macOS 也适用):`lsof -i:3316`,**有被使用会输出类似如下信息,如果没被使用会没有任何信息返回** ``` COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME @@ -573,7 +596,7 @@ docker-pr 13551 root 4u IPv6 2116824 0t0 TCP *:aicc-cmi (LISTEN) #### netstat - 更多用法可以看:[netstat 的10个基本用法](https://linux.cn/article-2434-1.html) -- 查看所有在用的端口:`netstat -ntlp` +- 查看所有在用的端口(macOS 也适用):`netstat -ntlp` ``` Active Internet connections (only servers) @@ -593,18 +616,55 @@ tcp6 0 0 :::8066 :::* LISTEN tcp6 0 0 :::43107 :::* LISTEN 12011/java ``` -- 查看当前连接80端口的机子有多少:`netstat -an|grep 80|sort -r` +- 查看当前连接80端口的机子有多少,并且是属于什么状态:`netstat -an|grep 80|sort -r` - 查看已经连接的IP有多少连接数:`netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n` - 查看已经连接的IP有多少连接数,只显示前 5 个:`netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n | head -5` -- 统计当前连接的一些状态情况:`netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn` +- 查看每个 ip 跟服务器建立的连接数:`netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn` ``` -8 TIME_WAIT -8 ESTABLISHED -7 LISTEN -1 Foreign -1 established) -1 CLOSE_WAIT +262 127.0.0.1 +118 +103 172.22.100.141 + 12 172.22.100.29 + 7 172.22.100.183 + 6 116.21.17.144 + 6 0.0.0.0 + 5 192.168.1.109 + 4 172.22.100.32 + 4 172.22.100.121 + 4 172.22.100.108 + 4 172.18.1.39 + 3 172.22.100.2 + 3 172.22.100.190 +``` + + +- 统计当前连接的一些状态情况:`netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'` 或者 `netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn` + +``` +TIME_WAIT 96(是表示系统在等待客户端响应,以便再次连接时候能快速响应,如果积压很多,要开始注意了,准备阻塞了。这篇文章可以看下:http://blog.51cto.com/jschu/1728001) +CLOSE_WAIT 11(如果积压很多,要开始注意了,准备阻塞了。可以看这篇文章:http://blog.51cto.com/net881004/2164020) +FIN_WAIT2 17 +ESTABLISHED 102(表示正常数据传输状态) +``` + +- TIME_WAIT 和 CLOSE_WAIT 说明: + +``` +Linux 系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态 的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。 + +来源:http://zhangbin.junxilinux.com/?p=219 + +================================= + +出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是另一端由于正在读写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。 +Linux分配给一个用户的文件句柄是有限的,而TIME_WAIT和CLOSE_WAIT两种状态如果一直被保持,那么意味着对应数目的通道就一直被占着,一旦达到句柄数上限,新的请求就无法被处理了,接着就是大量Too Many Open Files异常,导致tomcat崩溃。关于TIME_WAIT过多的解决方案参见TIME_WAIT数量太多。 + +常见错误原因: +1.代码层面上未对连接进行关闭,比如关闭代码未写在 finally 块关闭,如果程序中发生异常就会跳过关闭代码,自然未发出指令关闭,连接一直由程序托管,内核也无权处理,自然不会发出 FIN 请求,导致连接一直在 CLOSE_WAIT 。 +2.程序响应过慢,比如双方进行通讯,当客户端请求服务端迟迟得不到响应,就断开连接,重新发起请求,导致服务端一直忙于业务处理,没空去关闭连接。这种情况也会导致这个问题。一般如果有多个节点,nginx 进行负载,其中某个节点很高,其他节点不高,那可能就是负载算法不正常,都落在一台机子上了,以至于它忙不过来。 + +来源:https://juejin.im/post/5b59e61ae51d4519634fe257 ``` - 查看网络接口接受、发送的数据包情况(每隔 3 秒统计一次):`netstat -i 3` @@ -625,12 +685,12 @@ eth0 1500 10903437 0 0 0 10847867 0 0 0 BMRU lo 65536 453650 0 0 0 453650 0 0 0 LRU ``` -- 接收: +- 接收(该值是历史累加数据,不是瞬间数据,要计算时间内的差值需要自己减): - RX-OK 已接收字节数 - RX-ERR 已接收错误字节数(数据值大说明网络存在问题) - RX-DRP 已丢失字节数(数据值大说明网络存在问题) - RX-OVR 由于误差而遗失字节数(数据值大说明网络存在问题) -- 发送: +- 发送(该值是历史累加数据,不是瞬间数据,要计算时间内的差值需要自己减): - TX-OK 已发送字节数 - TX-ERR 已发送错误字节数(数据值大说明网络存在问题) - TX-DRP 已丢失字节数(数据值大说明网络存在问题) @@ -706,9 +766,159 @@ Address: 180.97.33.107 [1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB ``` +## 查看系统日志 + +- 查看系统日志:`tail -400f /var/log/messages` +- 可能会看到类似以下异常: + +``` +Out of memory: Kill process 19452 (java) score 264 or sacrifice child +``` + --------------------------------------------------------------------- +## 服务器故障排查顺序 + +#### 请求时好时坏 + +- 系统层面 + - 查看负载、CPU、内存、上线时间、高资源进程 PID:`htop` + - 查看网络丢失情况:`netstat -i 3`,关注:RX-DRP、TX-DRP,如果两个任何一个有值,或者都有值,肯定是网络出了问题(该值是历史累加数据,不是瞬间数据)。 +- 应用层面 + - 临时修改 nginx log 输出格式,输出完整信息,包括请求头 + +``` +$request_body 请求体(含POST数据) +$http_XXX 指定某个请求头(XXX为字段名,全小写) +$cookie_XXX 指定某个cookie值(XXX为字段名,全小写) + + +类似用法: +log_format special_main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$request_body" "$http_referer" ' + '"$http_user_agent" $http_x_forwarded_for "appid=$http_appid,appver=$http_appver,vuser=$http_vuser" ' + '"phpsessid=$cookie_phpsessid,vuser_cookie=$cookie___vuser" '; + + +access_log /home/wwwlogs/hicrew.log special_main; + +``` + + + +#### CPU 高,负载高,访问慢(没有数据库) + +- **记录负载开始升高的时间** +- 常见场景 + - 虚拟机所在的宿主机资源瓶颈,多个虚拟机竞争资源 + - 定时任务大量的任务并发 + - 消息、请求堆积后恢复时的瞬时流量引起 + - 持久化任务引起 + - 更多可以看这篇:[线上异常排查总结](https://blog.csdn.net/freeiceflame/article/details/78006812) +- 系统层面 + - 查看负载、CPU、内存、上线时间、高资源进程 PID:`htop` + - 查看磁盘使用情况:`df -h` + - 查看磁盘当前情况:`iostat -x -k 3 3`。如果发现当前磁盘忙碌,则查看是哪个 PID 在忙碌:`iotop -o -P -k -d 5` + - 查看 PID 具体在写什么东西:`lsof -p PID` + - 查看系统日志:`tail -400f /var/log/messages` + - 查看简化线程树:`pstree -a >> /opt/pstree-20180915.log` + - 其他机子 ping(多个地区 ping),看下解析 IP 与网络丢包 + - 查看网络节点情况:`traceroute www.youmeek.com` + - `ifconfig` 查看 dropped 和 error 是否在不断增加,判断网卡是否出现问题 + - `nslookup` 命令查看 DNS 是否可用 + - 如果 nginx 有安装:http_stub_status_module 模块,则查看当前统计 + - 查看 TCP 和 UDP 应用 + - `netstat -ntlp` + - `netstat -nulp` + - 统计当前连接的一些状态情况:`netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn` + - 查看每个 ip 跟服务器建立的连接数:`netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn` + - 查看与后端应用端口连接的有多少:`lsof -i:8080|grep 'TCP'|wc -l` + - 跟踪程序(按 `Ctrl + C` 停止跟踪):`strace -tt -T -v -f -e trace=file -o /opt/strace-20180915.log -s 1024 -p PID` + - 看下谁在线:`w`,`last` + - 看下执行了哪些命令:`history` +- 程序、JVM 层面 + - 保存、查看 Nginx 程序 log + - 通过 GoAccess 分析 log + - 保存、查看 Java 程序 log + - 使用内置 tomcat-manager 监控配置,或者使用类似工具:psi-probe + - 使用 `ps -ef | grep java`,查看进程 PID + - 根据高 CPU 的进程 PID,查看其线程 CPU 使用情况:`top -Hp PID`,找到占用 CPU 资源高的线程 PID + - 保存堆栈情况:`jstack -l PID >> /opt/jstack-tomcat1-PID-20180917.log` + - 把占用 CPU 资源高的线程十进制的 PID 转换成 16 进制:`printf "%x\n" PID`,比如:`printf "%x\n" 12401` 得到结果是:`3071` + - 在刚刚输出的那个 log 文件中搜索:`3071`,可以找到:`nid=0x3071` + - 使用 `jstat -gc PID 10000 10`,查看gc情况(截图) + - 使用 `jstat -gccause PID`:额外输出上次GC原因(截图) + - 使用 `jstat -gccause PID 10000 10`:额外输出上次GC原因,收集 10 次,每隔 10 秒 + - 使用 `jmap -dump:format=b,file=/opt/dumpfile-tomcat1-PID-20180917.hprof PID`,生成堆转储文件 + - 使用 jhat 或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。 + - 结合代码解决内存溢出或泄露问题。 + - 给 VM 增加 dump 触发参数:`-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat-1.hprof` + +#### 一次 JVM 引起的 CPU 高排查 + +- 使用 `ps -ef | grep java`,查看进程 PID + - 根据高 CPU 的进程 PID,查看其线程 CPU 使用情况:`top -Hp PID`,找到占用 CPU 资源高的线程 TID + - 也可以用:`ps -mp PID -o THREAD,tid,time` +- 保存堆栈情况:`jstack -l TID >> /opt/jstack-tomcat1-TID-20181017.log` +- 把占用 CPU 资源高的线程十进制的 TID 转换成 16 进制:`printf "%x\n" TID`,比如:`printf "%x\n" 12401` 得到结果是:`3071` +- 在刚刚输出的那个 log 文件中搜索:`3071`,可以找到:`nid=0x3071` +- 也可以在终端中直接看:`jstack TID |grep 十六进制线程 -A 30`,此时如果发现如下: + +``` +"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fd0ac01f000 nid=0x66f runnable +``` + +- 这种情况一般是 heap 设置得过小,而又要频繁分配对象;二是内存泄露,对象一直不能被回收,导致 CPU 占用过高 +- 使用:`jstat -gcutil PID 3000 10`: +- 正常情况结果应该是这样的: + +``` +S0 S1 E O M CCS YGC YGCT FGC FGCT GCT +0.00 0.00 67.63 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.68 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.71 38.09 78.03 68.82 124 0.966 5 0.778 1.744 +0.00 0.00 67.71 38.09 78.03 68.82 124 0.966 5 0.778 1.744 + +``` + +- S0:SO 当前使用比例 +- S1:S1 当前使用比例 +- E:**Eden 区使用比例(百分比)(异常的时候,这里可能会接近 100%)** +- O:**old 区使用比例(百分比)(异常的时候,这里可能会接近 100%)** +- M:**Metaspace 区使用比例(百分比)(异常的时候,这里可能会接近 100%)** +- CCS:压缩使用比例 +- YGC:年轻代垃圾回收次数 +- FGC:老年代垃圾回收次数 +- FGCT:老年代垃圾回收消耗时间(单位秒) +- GCT:垃圾回收消耗总时间(单位秒) +- **异常的时候每次 Full GC 时间也可能非常长,每次时间计算公式=FGCT值/FGC指)** +- `jmap -heap PID`,查看具体占用量是多大 +- 使用 `jmap -dump:format=b,file=/opt/dumpfile-tomcat1-PID-20180917.hprof PID`,生成堆转储文件(如果设置的 heap 过大,dump 下来会也会非常大) + - 使用 jhat 或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。 + - 一般这时候就只能根据 jhat 的分析,看源码了 +- 这里有几篇类似经历的文章推荐给大家: + - [三个神奇bug之Java占满CPU](http://luofei.me/?p=197) + - [CPU 负载过高问题排查](http://zhouyun.me/2017/10/24/cpu_load_issue/) + + +#### CPU 低,负载高,访问慢(带数据库) + +- 基于上面,但是侧重点在于 I/O 读写,以及是否有 MySQL 死锁,或者挂载了 NFS,而 NFS Server 出现问题 +- mysql 下查看当前的连接数与执行的sql 语句:`show full processlist;` +- 检查慢查询日志,可能是慢查询引起负载高,根据配置文件查看存放位置:`log_slow_queries` +- 查看 MySQL 设置的最大连接数:`show variables like 'max_connections';` + - 重新设置最大连接数:`set GLOBAL max_connections=300` + + + + ## 参考资料 - @@ -718,33 +928,9 @@ Address: 180.97.33.107 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +- +- +- diff --git a/markdown-file/speedtest.md b/markdown-file/speedtest.md new file mode 100644 index 00000000..2bf84c18 --- /dev/null +++ b/markdown-file/speedtest.md @@ -0,0 +1,29 @@ +# 终端测速 + + +- 目前大家主推这个项目: +- 用起来也比较简单,Python 2 ~ 3 都支持。 + +## 简单安装方式 + +- 命令:`pip install speedtest-cli` +- 官网还介绍了其他很多安装使用方式,大家可以自行看下。 + +## 运行 + +- 命令:`speedtest-cli` +- 结果如下: + +``` +Retrieving speedtest.net configuration... +Testing from China Telecom Guangdong (113.67.181.234)... +Retrieving speedtest.net server list... +Selecting best server based on ping... +Hosted by CTM Internet Services (Macau) [106.48 km]: 64.783 ms +Testing download speed................................................................................ +Download: 1.05 Mbit/s +Testing upload speed................................................................................................ +Upload: 2.28 Mbit/s +``` + + diff --git a/ubuntu-settings/Network-Settings.md b/markdown-file/ubuntu-settings/Network-Settings.md similarity index 100% rename from ubuntu-settings/Network-Settings.md rename to markdown-file/ubuntu-settings/Network-Settings.md diff --git a/ubuntu-settings/Ubuntu-Create-Desktop.md b/markdown-file/ubuntu-settings/Ubuntu-Create-Desktop.md similarity index 71% rename from ubuntu-settings/Ubuntu-Create-Desktop.md rename to markdown-file/ubuntu-settings/Ubuntu-Create-Desktop.md index fb5bdedf..475babec 100644 --- a/ubuntu-settings/Ubuntu-Create-Desktop.md +++ b/markdown-file/ubuntu-settings/Ubuntu-Create-Desktop.md @@ -2,16 +2,16 @@ ## 创建图标文件 -- 我们建设以创建 Eclipse 程序图标为例 +- 我们建设以创建 pycharm 程序图标为例 - 进入图标存放目录|:`cd /usr/share/applications` -- 创建文件并编辑:`sudo gedit eclipse.desktop` +- 创建文件并编辑:`sudo gedit pycharm.desktop` ``` ini [Desktop Entry] -Name=eclipse -Name[zh_CN]=eclipse -Comment=eclipse Client -Exec=/usr/programa/tools/eclipse/eclipse -Icon=/usr/programa/tools/eclipse/icon.xpm +Name=Pycharm +Name[zh_CN]=Pycharm +Comment=Pycharm3:The Python IDE +Exec=/pycharm-community-2017.1.1/bin/pycharm.sh +Icon=/pycharm-community-2017.1.1/bin/pycharm.png Terminal=false Type=Application Categories=Application; @@ -23,7 +23,7 @@ StartupNotify=true - Comment 为说明。 - Exec 为程序执行位置 - Icon 为图标所在路径 -- 最后,打开 Dash,在顶部搜索框搜索 **eclipse**,此时你应该能搜到它,先单击试一下看能不能打开,如果可以打开,拖到该图标启动器上,下次就可以直接从启动器打开了 +- 最后,打开 Dash,在顶部搜索框搜索 **pycharm**,此时你应该能搜到它,先单击试一下看能不能打开,如果可以打开,拖到该图标启动器上,下次就可以直接从启动器打开了 ## 资料 diff --git a/ubuntu-settings/Ubuntu-Extra-Packages.md b/markdown-file/ubuntu-settings/Ubuntu-Extra-Packages.md similarity index 100% rename from ubuntu-settings/Ubuntu-Extra-Packages.md rename to markdown-file/ubuntu-settings/Ubuntu-Extra-Packages.md diff --git a/ubuntu-settings/Ubuntu-Popular-Settings.md b/markdown-file/ubuntu-settings/Ubuntu-Popular-Settings.md similarity index 100% rename from ubuntu-settings/Ubuntu-Popular-Settings.md rename to markdown-file/ubuntu-settings/Ubuntu-Popular-Settings.md diff --git a/markdown-file/ubuntu-settings/Ubuntu-UI.md b/markdown-file/ubuntu-settings/Ubuntu-UI.md new file mode 100644 index 00000000..2471042e --- /dev/null +++ b/markdown-file/ubuntu-settings/Ubuntu-UI.md @@ -0,0 +1,40 @@ + + +## Ubuntu 常见桌面环境方案 + +- [GNOME](https://www.gnome.org/) +- [KDE](https://www.kde.org/) +- [Unity8](https://ubports.com/zh_CN/blog/1/post/unity8-on-the-desktop-95) +- MATE +- Cinnamon +- Lxde +- Xfce + +## Ubuntu 18.04 桌面环境方案 + +- 使用 GNOME + +## Ubuntu 16.04 桌面环境方案 + +- 使用 Unity + +------------------------------------------------------------ + +## GUI 工具包 + +- [GTK](https://www.gtk.org/) +- [Qt](https://www.qt.io/) + +------------------------------------------------------------ + +## 常见桌面环境方案 与 GUI 工具包关系 + +- GNOME、LXDE、Xfce 使用 GTK 工具包 +- KDE、Unity8 使用 Qt 工具包 + + +## 资料 + +- [自由之选:七大顶尖 Linux 桌面环境比拼](https://linux.cn/article-6021-1.html) +- [自由奔放的 Linux (3)—— Gnome 与 KDE](http://blog.sciencenet.cn/blog-530833-540604.html) +- [自由奔放的 Linux (2) ——Ubuntu 与 Fedora](http://blog.sciencenet.cn/home.php?mod=space&uid=530833&do=blog&id=540366) diff --git a/ubuntu-settings/ubuntu-settings-toc.md b/markdown-file/ubuntu-settings/ubuntu-settings-toc.md similarity index 81% rename from ubuntu-settings/ubuntu-settings-toc.md rename to markdown-file/ubuntu-settings/ubuntu-settings-toc.md index 1b320721..2c437314 100644 --- a/ubuntu-settings/ubuntu-settings-toc.md +++ b/markdown-file/ubuntu-settings/ubuntu-settings-toc.md @@ -2,13 +2,7 @@ - [Ubuntu 源设置](Ubuntu-Extra-Packages.md) - [Ubuntu 给 Dash 添加程序图标](Ubuntu-Create-Desktop.md) - [Ubuntu 常用设置](Ubuntu-Popular-Settings.md) -- []() -- []() -- []() -- []() -- []() -- []() -- []() +- [Ubuntu 常见桌面环境方案](Ubuntu-UI.md) diff --git a/markdown-file/wrk-Install-And-Settings.md b/markdown-file/wrk-Install-And-Settings.md new file mode 100644 index 00000000..f6b7c67f --- /dev/null +++ b/markdown-file/wrk-Install-And-Settings.md @@ -0,0 +1,65 @@ +# wrk 安装和配置 + + +## wrk 说明 + +- wrk 相对于 ab 来说最大的优点是它支持多线程,可以有更大的并发量 + + +## 安装 + +- CentOS 7.4 +- 官网说明: + +``` +# 安装工具包的时候差不多有 90 个左右的子工具 +sudo yum groupinstall 'Development Tools' +sudo yum install -y openssl-devel git +git clone --depth=1 https://github.com/wg/wrk.git wrk +cd wrk +make +# move the executable to somewhere in your PATH +sudo cp wrk /usr/local/bin +``` + +- 查看帮助:`wrk --help` + +## 使用 + +- 启用 10 个线程,每个线程发起 100 个连接,持续 30 秒:`wrk -t10 -c100 -d30s http://www.baidu.com` +- 最终报告: + +``` +Running 30s test @ http://www.baidu.com + 5 threads and 5 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 44.59ms 17.41ms 331.91ms 95.66% + Req/Sec 23.11 5.77 30.00 57.04% + 3439 requests in 30.03s, 50.47MB read + Socket errors: connect 0, read 10, write 0, timeout 0 +Requests/sec: 114.52 +Transfer/sec: 1.68MB +``` + +#### 使用 lua 脚本(发送一个 post 请求) + +- 创建:`vim /opt/post-wrk.lua` + +``` +wrk.method = "POST" +wrk.body = "hms_user_id=222222&routing_key=ad.sys_user.add" +wrk.headers["Content-Type"] = "application/x-www-form-urlencoded" +``` + +- 测试:`wrk -t10 -c100 -d15s --script=/opt/post-wrk.lua --latency http://127.0.0.1:9090/websocket/api/send-by-user-id` + + +## 其他说明 + +- wrk 使用的是 HTTP/1.1,缺省开启的是长连接 +- 要测试短连接:`wrk -H "Connection: Close" -c 100 -d 10 http://domain/path` + +## 资料 + +- +-