数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

「深度学习福利」大神带你进阶工程师,立即查看>>>
在与Symantec(Symantec)脱离10年(通常令人不愉快的关系)一周年之际,Veritas Technologies在2月22日宣布与Microsoft Corp. 建立了多年战略全球合作伙伴关系,以说服企业使用Microsoft Azure进行托管混合云环境。

Veritas希望知道它自己的Enterprise Vault.cloud存储管理和治理服务也托管在Azure上。
两家公司之间的长期合作关系建立了合作伙伴关系,其中包括协作工具,可共同向共同客户出售混合云存储解决方案。
像这样的混合云存储程序包旨在让客户利用云来降低存储成本,提高数据管理敏捷性并从其数据中获取更大的价值。业务数据一旦存储在云中,就可以通过一整套Azure云服务进行处理以找到答案,包括高级分析和机器学习。
作为合作伙伴关系的一部分,Veritas NetBackup 8.0是公司用于企业的旗舰数据保护解决方案,现在在Azure中提供存储分层,从而可以通过优化数据移动来改善数据生命周期管理。Veritas说,这降低了企业成本,并增加了Azure的运营优势,同时减少了使用单独的单点产品部署额外存储的需求。
对于中小型企业,Veritas Backup Exec 16现在支持将备份数据移至Azure,从而减少了时间和成本,并节省了资源。
Azure上的Enterprise Vault.cloud提供基于策略的信息保留,以简化电子发现,并帮助Office 365订阅者在需要时快速找到存档的信息。Veritas说,Enterprise Vault.cloud将继续提供先进的生产力和合规性功能。
本文地址: https://www.linuxprobe.com/veritas-azure.html
系统运维
2019-11-12 17:31:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
6、管道符和作业控制
7、Shell 变量(上)
8、Shell 变量(下)
9、环境变量配置文件
系统运维
2019-11-12 16:08:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
ubuntu 下经常需要更新源,非常慢,可以通过替换源列表文件的方式来加速,步骤:
1.备份源列表文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
2.修改源列表 /etc/apt/sources.list 内容替换为: # deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties deb http://mirrors.aliyun.com/ubuntu/ xenial universe deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties deb http://archive.canonical.com/ubuntu xenial partner deb-src http://archive.canonical.com/ubuntu xenial partner deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
之后执行 sudo apt-get update 就非常快了
系统运维
2019-11-13 22:10:00
「深度学习福利」大神带你进阶工程师,立即查看>>> i=1; for f in ~/dir/*.jpg do i=$(expr $i + 1) convert $f -rotate -90 $i.jpg done
系统运维
2019-11-13 19:19:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化 脚本 ( shell ),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。
Python 3.8.0 正式发布了,以下是主要更新内容
PEP 572, 赋值表达式
PEP 570, 仅位置参数
PEP 587, Python 初始化配置(改进嵌入)
PEP 590, Vectorcall:CPython 的快速调用协议
PEP 578, 运行时审核挂钩
PEP 574, 带外数据的 Pickle 协议 5
Typing 相关:PEP 591,PEP 586,PEP 589
并行文件系统缓存,用于编译的字节码
调试版本与发行版本共享 ABI
f 字符串支持一个方便的 = 说明符进行调试
continue 现在在 finally: 块中
在 Windows 上,默认的异步事件循环现在是 ProactorEventLoop
在 macOS 上,默认情况下现在在多处理中使用 spawn start 方法
现在,多处理(multiprocessing)可以使用共享内存段
typed_ast 合并回 CPython
LOAD_GLOBAL 现在快了 40%
pickle 现在默认使用协议 4,提高了性能
​https://article.pchome.net/content-2103559.html
http://www.51cto.com/it/news/2019/1111/16471.html
https://www.csdn.net/article/a/2019-11-11/15983970
系统运维
2019-11-13 17:09:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
安装Red Hat Enterprise Linux 8教学环境时,学员们都需要将这个环境安装到虚拟机中,以便在自己的笔记本电脑上练习使用。一般推荐使用VMware Workstation来托管整个教学环境。
准备:
1)移动硬盘
2)16G以上的USB盘
3)RHEL8教学环境软件
第1步:校验教学环境软件是否完整 # yum install -y http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/python3-pyyaml-3.12-12.el8.i686.rpm # ./rht-usb-8.x-7.r2019052915git14db55b verify RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf Verifying manifest file RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf Publish date: 2019-05-29 15:41:50 type md5sum artifact-name ----------- ------- ----------------------------------------------- content GOODSUM rhel-8.0-x86_64-dvd.iso content GOODSUM foundation-config-8.x-7.r2019052915git14db55b.noarch.rpm content GOODSUM foundation0-config-8.x-7.r2019052915git14db55b.noarch.rpm content GOODSUM redhat-survey-7.x-58.0.noarch.rpm content GOODSUM redhat-training-survey-7-59.4.noarch.rpm content GOODSUM redhat-training-roster-7-59.1.noarch.rpm content GOODSUM rhci-foundation-8.0-7.r2019052915gitc76cfec.iso content GOODSUM rht-usb-8.x-7.r2019052915git14db55b content GOODSUM rht-usb-7.x-6.r2019052915git14db55b content GOODSUM ClassroomSetup-8.x-7.r2019052915git14db55b.txt content GOODSUM ClassroomReset-8.x-7.r2019052915git14db55b.txt content GOODSUM ClassroomTroubleshooting-8.x-7.r2019052915git14db55b.txt content GOODSUM ClassPrep-8.x-7.r2019052915git14db55b.txt ===================================================================== INFO Manifest RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf passed. INFO Verification SUCCEEDED
第2步:格式化USB盘
# lsblk # umount /dev/sdc1 # cd /mnt/hd/rhel8 //我的红帽教学环境放在移动硬盘里,挂载到这个目录下 # ./rht-usb-8.x-7.r2019052915git14db55b usbmkpart /dev/sdc gpt //有一个rht-usb-xxxx的工具,用它来为U盘分区,分为gpt分区 INFO Configuration file: /root/.icrm/config.yml INFO Partitioning USB Device: /dev/sdc Confirm gpt partitioning /dev/sdc (y/N) y Wipe existing partitioning of /dev/sdc (y/N) y INFO /dev/sdc: zap partitions OK INFO /dev/sdc: wipe partitions OK INFO /dev/sdc: partitioning OK INFO /dev/sdc3: apparent RHTINST partition INFO Now run usbformat of /dev/sdc3 INFO Appear to have properly partitioned USB device.
查看一下,发现上述命令将我这个64G的USB盘分成3个区,如下: sdc 8:32 1 60G 0 disk ├─sdc1 8:33 1 1M 0 part ├─sdc2 8:34 1 200M 0 part └─sdc3 8:35 1 59.8G 0 part
将第3个分区格式化。 # ./rht-usb-8.x-7.r2019052915git14db55b usbformat /dev/sdc3 INFO Configuration file: /root/.icrm/config.yml INFO Formatting USB Partition: /dev/sdc3 Confirm reformatting /dev/sdc3 (y/N) y INFO mkfs.ext4 64-bit support INFO mkfs.ext4 no metadata_csum support INFO /dev/sdc3: format OK INFO Appear to have properly formatted USB device.

第3步:将Foundation虚拟机拷贝到USB盘上 # ./rht-usb-8.x-7.r2019052915git14db55b usbadd RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf INFO Configuration file: /root/.icrm/config.yml INFO Adding to USB: RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf INFO New files needed space is 7.2G out of 7.2G INFO Calculation finds we need: 7779043345 bytes (7.2G) INFO USB space Total: 59.8G Used: 51.8M Free: 56.7G INFO Copying manifest file: RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf (3.2K) to /tmp/tmpa2r6ijh6/manifests/RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf INFO Starting copy of RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf INFO Copying artifact: rhel-8.0-x86_64-dvd.iso INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/rhel-8.0-x86_64-dvd.iso (6.6G) to /tmp/tmpa2r6ijh6/rhel8.0/x86_64/isos/rhel-8.0-x86_64-dvd.iso INFO Copying artifact: foundation-config-8.x-7.r2019052915git14db55b.noarch.rpm INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/foundation-config-8.x-7.r2019052915git14db55b.noarch.rpm (37.8K) to /tmp/tmpa2r6ijh6/ucf/Packages/foundation-config-8.x-7.r2019052915git14db55b.noarch.rpm INFO Copying artifact: foundation0-config-8.x-7.r2019052915git14db55b.noarch.rpm INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/foundation0-config-8.x-7.r2019052915git14db55b.noarch.rpm (110.9K) to /tmp/tmpa2r6ijh6/ucf/Packages/foundation0-config-8.x-7.r2019052915git14db55b.noarch.rpm INFO Copying artifact: redhat-survey-7.x-58.0.noarch.rpm INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/redhat-survey-7.x-58.0.noarch.rpm (4.5K) to /tmp/tmpa2r6ijh6/rhtops/Packages/redhat-survey-7.x-58.0.noarch.rpm INFO Copying artifact: redhat-training-survey-7-59.4.noarch.rpm INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/redhat-training-survey-7-59.4.noarch.rpm (853.8K) to /tmp/tmpa2r6ijh6/ucf/Packages/redhat-training-survey-7-59.4.noarch.rpm INFO Copying artifact: redhat-training-roster-7-59.1.noarch.rpm INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/redhat-training-roster-7-59.1.noarch.rpm (906.0K) to /tmp/tmpa2r6ijh6/ucf/Packages/redhat-training-roster-7-59.1.noarch.rpm INFO Copying artifact: rhci-foundation-8.0-7.r2019052915gitc76cfec.iso INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/rhci-foundation-8.0-7.r2019052915gitc76cfec.iso (642.4M) to /tmp/tmpa2r6ijh6/boot/rhci-foundation-8.0-7.r2019052915gitc76cfec.iso INFO Extracting boot files: rhci-foundation-8.0-7.r2019052915gitc76cfec.iso INFO Copying /tmp/tmp35jicn2f/ (dir) to /tmp/tmpa2r6ijh6/boot (exists) INFO Copying artifact: rht-usb-8.x-7.r2019052915git14db55b INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/rht-usb-8.x-7.r2019052915git14db55b (154.8K) to /tmp/tmpa2r6ijh6/ks/rht-usb-8.x-7.r2019052915git14db55b INFO Copying artifact: rht-usb-7.x-6.r2019052915git14db55b INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/rht-usb-7.x-6.r2019052915git14db55b (154.8K) to /tmp/tmpa2r6ijh6/ks/rht-usb-7.x-6.r2019052915git14db55b INFO Copying artifact: ClassroomSetup-8.x-7.r2019052915git14db55b.txt INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/ClassroomSetup-8.x-7.r2019052915git14db55b.txt (48.1K) to /tmp/tmpa2r6ijh6/docs/ClassroomSetup-8.x-7.r2019052915git14db55b.txt INFO Copying artifact: ClassroomReset-8.x-7.r2019052915git14db55b.txt INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/ClassroomReset-8.x-7.r2019052915git14db55b.txt (20.5K) to /tmp/tmpa2r6ijh6/docs/ClassroomReset-8.x-7.r2019052915git14db55b.txt INFO Copying artifact: ClassroomTroubleshooting-8.x-7.r2019052915git14db55b.txt INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/ClassroomTroubleshooting-8.x-7.r2019052915git14db55b.txt (38.4K) to /tmp/tmpa2r6ijh6/docs/ClassroomTroubleshooting-8.x-7.r2019052915git14db55b.txt INFO Copying artifact: ClassPrep-8.x-7.r2019052915git14db55b.txt INFO Copying /mnt/hd/Redhat/rhce8/f0_rhel8/ClassPrep-8.x-7.r2019052915git14db55b.txt (31.2K) to /tmp/tmpa2r6ijh6/docs/ClassPrep-8.x-7.r2019052915git14db55b.txt INFO USBAdd completed.
第4步:检验拷贝的内容是否完整 # ./rht-usb-8.x-7.r2019052915git14db55b usbvalidate INFO Configuration file: /root/.icrm/config.yml INFO Validating USB Mountpoint: /tmp/tmptydq1lon INFO Device has three gpt partitions INFO Does have a required RHCIfoundation manifest INFO Not configured to be bootable Verifying manifest file RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf Publish date: 2019-05-29 15:41:50 type md5sum artifact-name ----------- ------- ----------------------------------------------- content GOODSUM rhel-8.0-x86_64-dvd.iso content GOODSUM foundation-config-8.x-7.r2019052915git14db55b.noarch.rpm content GOODSUM foundation0-config-8.x-7.r2019052915git14db55b.noarch.rpm content GOODSUM redhat-survey-7.x-58.0.noarch.rpm content GOODSUM redhat-training-survey-7-59.4.noarch.rpm content GOODSUM redhat-training-roster-7-59.1.noarch.rpm content GOODSUM rhci-foundation-8.0-7.r2019052915gitc76cfec.iso content GOODSUM rht-usb-8.x-7.r2019052915git14db55b content GOODSUM rht-usb-7.x-6.r2019052915git14db55b content GOODSUM ClassroomSetup-8.x-7.r2019052915git14db55b.txt content GOODSUM ClassroomReset-8.x-7.r2019052915git14db55b.txt content GOODSUM ClassroomTroubleshooting-8.x-7.r2019052915git14db55b.txt content GOODSUM ClassPrep-8.x-7.r2019052915git14db55b.txt ===================================================================== INFO Manifest RHCIfoundation-RHEL80-7.r2019052915-ILT-7-en_US.icmf passed. INFO USBValidate SUCCEEDED

第5步:将U盘设为可启动
* This operation will manipulate the MBR of the mounted USB device. *
* If something misleads the tool, IT COULD RENDER YOUR SYSTEM *
* UNBOOTABLE. YOU HAVE BEEN WARNED!
说有可能会把系统弄得无法启动,怎么办?
这一步需要系统上有两个命令parted和syslinux-extlinux。我的CentOS 7上没有syslinux-extlinux,于是我来安装一下。 # yum -y install syslinux-extlinux
运行命令,将USB设置成可以启动的盘。 # ./rht-usb-8.x-7.r2019052915git14db55b usbmkboot INFO Configuration file: /root/.icrm/config.yml WARNING - You get to keep all the pieces if system becomes unbootable WARNING - We really mean it - do not cry to us if your system is destroyed Confirm writing to /dev/sdc3 mounted to /tmp/tmpmoukp5en (y/N) y INFO Making bootable: /tmp/tmpmoukp5en INFO Formatting FAT and copying EFI/ files to /dev/sdc2 INFO /dev/sdc2: vfat format OK INFO Copying /tmp/tmpmoukp5en/boot/EFI (dir) to /tmp/tmpgc7y97_l (exists) INFO Copying extlinux menu files to /tmp/tmpmoukp5en/boot/extlinux INFO Copying /usr/share/syslinux/vesamenu.c32 (149.5K) to /tmp/tmpmoukp5en/boot/extlinux (exists) INFO Using extlinux to install to /tmp/tmpmoukp5en/boot/extlinux INFO /tmp/tmpmoukp5en/boot/extlinux: extlinux OK INFO Using chattr to remove immutable of /tmp/tmpmoukp5en/boot/extlinux/ldlinux.sys INFO /tmp/tmpmoukp5en/boot/extlinux: chattr OK INFO Using dd to write /usr/share/syslinux/gptmbr.bin to /dev/sdc INFO /dev/sdc: dd of mbr.bin OK INFO Using sgdisk to tag bootable /dev/sdc3 INFO /dev/sdc3: sgdisk set of Legacy BIOS bootable flag OK INFO Appear to have successfully made USB bootable.
它只是向/tmp里写一个文件,怎么会弄坏我的操作系统呢?但是这是红帽公司的警告,是继续,还是放弃呢?最后,我还是按下了y!
一切正常!!!
/dev/sdc2被格式化成vfat格式,写入的是/boot/EFI?
第6步:将课程的内容拷贝到USB盘上
还是使用那个
rht-usb-xxx usbadd RHCI*.icmf //添加foundation虚拟机
rht-usb-xxx usbadd RH124*.icmf //添加课程RH124
rht-usb-xxx usbadd RH134*.icmf //添加课程RH134
rht-usb-xxx usbadd RH294*.icmf //添加课程RH294
以上几个步骤会花费很久的时间。
第7步:用Foundation ISO安装到一个虚拟机上
这一步有一个难点: RHEL 8 / CentOS 8 无法识别硬盘 。我也看到网上有不少朋友通过修改虚拟机的配置文件来纠正,可是,我的虚拟机上看不到那个选项。而实际上并没有那么复杂。我们在创建完成后,不要启动,把原来的硬盘删除, 重新创建一个SATA硬盘即可 。VMware Workstation 推荐使用的是SCSI硬盘。配置如下: 处理器:2 (虚拟化:勾选Intel VT-x或AMD-V)
内存:8G
硬盘:150G (SATA)
USB:支持3.0(以挂载我的USB或移动硬盘)
光驱:使用ISO文件rhci-foundation-8.0-7.r2019052915gitc76cfec.iso
出现安装界面后,输入:f0 rh124
第8步:添加课程
安装成功后,启动,再添加课程:
sudo rht-usb courseusb rh134
sudo rht-usb courseusb rh294
系统运维
2019-11-13 16:31:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
CentOS 7.x系统默认安装了rpcbind和nfs-utils服务,如果没有安装的话,可以通过yum自行安装。
一、通过nfs协议配置nas
1. 配置nfs协议:
# vim /etc/sysconfig/nfs
设置各种*port=...参数

2.配置nas
# vim /etc/exports
本地NAS存储目录 192.168.1.0/24(授权访问客户端的地址段)(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501)

3. 网络配置
# systemctl start rpcbind nfs
# rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 60791 status
100024 1 tcp 46839 status
100005 1 udp 892 mountd
100005 1 tcp 892 mountd
100005 2 udp 892 mountd
100005 2 tcp 892 mountd
100005 3 udp 892 mountd
100005 3 tcp 892 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 32769 nlockmgr
100021 3 udp 32769 nlockmgr
100021 4 udp 32769 nlockmgr
100021 1 tcp 32803 nlockmgr
100021 3 tcp 32803 nlockmgr
100021 4 tcp 32803 nlockmgr
将这些端口添加到防火墙后,重启firewalld服务。

4. 配置访问客户端
# showmount -e NAS服务器IP地址
Export list for 192.168.1.100:
/opt/nas 192.168.1.0/24
# mount -t nfs 192.168.1.100:NAS存储目录 本地挂载目录 // 临时挂载
# vim /etc/fstab // 永久挂载
192.168.1.100:NAS存储目录 本地挂载目录 nfs defaults 0 0
系统运维
2019-11-13 16:28:00
「深度学习福利」大神带你进阶工程师,立即查看>>> 以下文章来源于Jenkins,作者LinuxSuRen
Jenkins 社区的网络基础设施都是架设在国外的服务器上,而且,并没有在国内有 CDN 或者负载均衡的配置。对所有的 Jenkins 用户而言,1500+的插件可以帮助他们解决很多问题。然而,我相信,对于国内的很多用户来说, 可能有过一些不太愉快的经历——插件下载速度很慢,甚至会超时。难道遇到这种情况下,我们就只能等吗?
程序员,作为天生懒惰的人,总是希望能通过手中的键盘来解决各种个样的问题。凭什么?下载一个插件, 我还的苦苦地等待来自美国的数据包呢?数数你手里的 Jenkins 都安装了多少个插件。30个算少的吧。经过一番搜索,发现果然已经有前人帮忙把大树种好了。让我们一起感谢“清华大学开源软件镜像站”提供的镜像服务:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/
但是,当我兴冲冲地把 Jenkins 插件管理页面的更新中心的地址修改后,却发现了一个奇怪的情况,好像还是那么慢啊。不管是换地址,还是换4G,换电脑都解决不了这个网络排队的问题。本着开源的精神(不满意就提 issue 或者 Pull Request), 我只好继续挖掘这里的秘密。下面,是我向 TUNA 提的一个 issue(可以看到貌似我并不是第一个吐槽的人):
https://github.com/tuna/issues/issues/659
是的, rsync 可以帮我们把106G的文件同步过来,免去了出国下载插件的麻烦,可没有解决最后一公里的痛。通过下面的 PR 我们可以大致了解到,Jenkins 是通过解析 update-center.json 文件的方式来获取插件版本, 以及下载插件的。另外,如果你认为只是修改下文件里的 URL 就能解决这个问题的话,那么,请再仔细想一下这个事情。既然小白兔可以把地址修改为一个比较方便的值,那么,大灰狼为啥不能往那些插件里加点辣椒水呢。Jenkins 作为一个在 CI/CD 领域里领先了15年之久的大叔,当然不会输给了一些小毛贼。简单来说呢,这个事情 是通过两把钥匙来解决的——官方用其中一把钥匙给文件做了签名,并保管起来;把另外一把钥匙对外公布(保存在发行版中)。只有通过了公钥验证的 update-center.json 文件,才会被使用到。
https://github.com/jenkins-infra/update-center2/pull/245
知道了问题所在,解决起来自然就容易了。Jenkins 中文社区帮大家把钥匙和地址的问题解决了,按图索骥三步走:

想了解技术细节?担心我们是大灰狼?我们欢迎喜欢学习的同学,更欢迎大家的检阅。提问题、提需求、提代码、提文档......都是可以的。实际上,我们的整套方案中,所有的部分(除了拿一把钥匙以外) 都是开源的,包括还不够完善的设计文档。而且,并不需要花一分钱,完全利用现有的计算、存储资源。此处,让我们再次感谢清华开源镜像站点、GitHub Actions、码云 Page 等。
https://github.com/jenkins-zh/mirror-adapter
最重要的事情,一定要在最后才说出来(不喜欢认真阅读文档的同学,对不起了)。想要体验极速 安装插件的同学,请认准 Jenkins 简体中文插件的版本:1.0.10
https://plugins.jenkins.io/localization-zh-cn
点击“ 阅读 ”了解京东云Jenkins插件产品
欢迎点击“ 京东云 ”了解更多精彩内容
系统运维
2019-11-13 13:47:00
「深度学习福利」大神带你进阶工程师,立即查看>>>

对于DevOps而言,监控是其中重要的一环,上一次的专题内容中,我们与大家分享了大型企业级监控系统的设计。今天我们将和大家从另一个角度进一步探讨互联网工程技术领域的监控设计(monitoring):系统的可观测性(observerbality)。
无论监控,还是可观测性,都是工程界的术语,并非严格定义的概念。人们可以描述它,但很难定义它。所以本文不会纠结于这些名词之间的区别。
在实践中,所有这些概念/术语,目标都是增强工程师对于线上系统运行情况的了解。
对工程师而言,监控/可观测性工程存在的意义,是帮助工程师发现问题,定位问题,解决问题。
对系统自身而言,这些工作都是通过数据的采集/存储/分析,以及进一步迭代来完成。
一、监控需求的产生
当程序被交付,部署到生产环境,才是其生命周期中最长的部分的开始。人们需要了解生产环境是否一切正常,监控需求自然而然产生。
互联网发展过程中涌现大量监控相关的工具/系统,Ganlia, Zabbix, RRDTools, Graphite,各自在不同的层面为“是否正常”提供答案。
监控本身,无论是业界对监控的认知,监控工具/系统自身的能力,也在以下两个方向演进着: 黑盒到白盒 资源到业务
这个阶段监控的愿景是很明确的,如何落地则各显神通。
直到 Etsy 于 2011 年通过博客公开了他们的 监控实践,利用 StatsD(已开源),以非常简单统一的方式,实现资源/业务层面的数据采集/存储/分析。后来的监控系统,尤其是基于 metrics 的监控系统,大多受过 StatsD 的启发和影响。
二、可观测性的提出
互联网工程界,Twitter 应该是最早提出可观测性 的组织。在这系列文章中,Twitter 集中阐述了他们的可观测性技术栈,其中包括了 Zipkin,Google Dapper 的开源实现。
如前言所说,本文不纠结于几个名词之间的包含关系。
抛开这些名词的辩论,可观测性相对于过去监控,最大的变化就是系统需要处理的数据,从 metrics 为主,扩展到了更广的领域。综合起来,大约有几类数据被看作是可观测性的支柱(pillar) metrics logging tracing events
因此,一个现代化的监控系统/可观测性工程系统,也就必须具备妥善存储以上几种数据的能力。
三、存储
Metrics
Metrics,通常是数值类型的时间序列数据。这类需求的存在如此广泛,以至于衍生了专门服务于这个目标的数据库子类,时间序列数据库,TSDB。
TSDB 经历了大约如下几个方面的重要演进 数据模型。描述信息从 metric naming 中剥离出来,形成 tag。现代的 tsdb 通常都已采用 tag 化的数据模型。 数据类型。从简单的数值记录,到为不同场景衍生出 gauge, counter, timer 等等更多的数据类型 索引结构。索引结构跟数据模型密切相关,在 tag 为主的现代 tsdb, 倒排索引已经是主流索引结构。 数据存储。从 rrdtool 写环形队列到文件的时代,到 OpenTSDB 这样自行编解码写入底层数据库,再到 Facebook 提出的时序数据压缩算法,通常会是若干种技术的综合使用,并且针对不同的数据类型采用不同方案
Metrics 存储,或者是 TSDB 的研究和演进,我们会有另外的文章专门介绍。
logging
logging 通常会是工程师定位生产环境问题最直接的手段。日志的处理大约在如下几个方面进行演进 集中存储/检索。使得工程师免于分别登陆机器查看日志之苦,日志被统一采集,集中存储于日志服务,并提供统一的检索服务。这个过程牵扯到例如日志格式统一,解析,结构化等等问题。 日志的监控。 原文中的关键字,例如 error, fatal 大概率意味着值得关注的错误产生 从日志中提取的 metrics,例如 access log 中携带的大量数据,都可以被提取成有用的信息。至于提取的手段,有的通过客户端在日志本地进行解析,有的在集中存储过程中进行解析。
tracing
随着互联网工程日渐复杂,尤其是微服务的风潮下,分布式 tracing 通常是理解系统,定位系统故障的最重要手段。
在存储层面,tracing 已经有相对明确的方案,无论是 OpenZipkin,还是 CNCF 的 Jaeger ,都提供几乎开箱即用的后端软件,其中当然包括存储。
Tracing 的存储设计主要考虑
1、稀疏数据:tracing 数据通常是稀疏的,这通常有几个原因 不同业务的 trace 路径通常不同,也就是 span 不同,因而稀疏 同种业务的 trace ,在不同内外部条件下,路径也不同。例如访问数据库,是否命中缓存,都会产生不同的 span 链 访问正常/异常的 trace ,产生不同 span
2、多维度查询:通常的解决思路 二级索引:在以 HBase, Cassandra 为基础的方案中比较常见 引入倒排索引,在二级索引方案无法满足全部查询请求时,可能会引入 Elasticsearch 辅助索引,提升查询灵活性
Events
同样是一个难以定义,但是很容易描述的术语。我们把,一次部署,一次配置变更,一次dns 切换,诸如此类的变更,称为事件。
它们通常意味着生产环境的变更。而故障,通常因为不恰当的变更引起。
对 events 的处理主要包括 集中存储: 事件种类很多,较难归纳共同的查询纬度,所以倒排索引在这种无法事先确定查询纬度的场景下,是非常合适的存储结构 Dashboard: 以恰当的方式,把事件查询 /展示出来。上文提到 Etsy 的博客中,展示了很好的实践方法,使得工程师能够通过 dashboard ,非常轻松确认网站登陆失败,与登录模块部署事件之间的关系。
总结
现代的监控,或者可观测性工程,通常是对不同类型数据的采集/存储/分析。这些数据各有特点,因而存储也不存在银弹。通常是根据各自特点,独立设计存储方案,上层提供一个统一、综合的存储系统。
京东云监控具有实时展现监控数据变化及迅速报警等优势,能够满足日常业务监控管理和处理异常等场景。
目前京东云 监控提供免费服务 ,点击【 阅读 】,了解更多关于京东云监控的内容。
欢迎点击“ 京东云 ”了解更多精彩内容

系统运维
2019-11-13 11:35:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
随着互联网技术的发展,越来越多企业开始认识DevOps重要性,在企业内部推进实施DevOps,期望获得更好的软件质量,缩短软件开发生命周期,提高服务稳定性。但在DevOps 的实施与落地的过程中,或多或少的会碰到一系列问题,使得DevOps实施的效果打了折扣。
比如当我们在谈论敏捷开发的时候,自动化测试是对团队的较高要求,但到了 DevOps 时代,自动化测试已经是基本要求,我们更多谈论的是持续集成。
同时缺少自助式的持续交付平台也是企业推进 DevOps 面临的难题,DevOps 不仅仅是关于运维的自动化,同时也是关于开发、测试到运维各个职能围绕着每一次软件变更的紧密协作,在协作过程中各个环节的任务涉及到一系列工具构成的工具链,但是很多团队在工具上是割裂的,无法保证持续交付。
另外在 DevOps 的实施落地中,寻找经验丰富,身经百战的 DevOps 工程师往往很难,同时DevOps的实施需要多个团队与组织的协作,涉及稳定性、效率、成本与安全等多个层面,为此大多企业都需要一个漫长的探索过程。DevOps文化的建立,是一个“任重道远”的过程。
京东云 DevOps 作为京东云的核心技术产品,在京东云服务中是最被看中的部分,对于京东云来说,无论是在持续交付、监控系统设计还是质量平台建设上都积累了很多经验,涉及到落地时还有更多细节值得和开发者一起讨论,如果你对自动化运维感兴趣,请关注 11 月 23 日由京东云开发者社区和英特尔联合举办的「京东云 DevOps 自动化运维技术实践」沙龙专场 ,京东云 4 位技术专家将分享他们的实践之路,你的种种疑问,在这次分享中,都能够得到解答。
点击“ 链接 ”即可报名!



当天到达现场的开发者将赠送京东云纪念品,还有最新活动预告,不容错过!🎁🎁🎁
欢迎点击“ 京东云 ”了解更多精彩内容
系统运维
2019-11-13 10:18:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
命令 # yum install XXX --enablerepo=YYY XXX:需要要安装的软件。 YYY:相应源的“repo id”。
注意:建议安装的时候尽量选择同一个源,因为不同的源安装的软件可能会有冲突。
eg : 指定当前某个repo源进行salt-minion的安装。
1.查看当前repo源的情况 # yum repolist
2.开始安装 # yum -y install salt-minion --enablerepo=salt-latest
系统运维
2019-11-13 09:58:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
前言
在Java并发编程中,volatile关键字有着至关重要的作用,在面试中也常常会是必备的一个问题。本文将会介绍volatile关键字的作用以及其实现原理。
volatile作用
volatile在并发编程中扮演着重要的角色,volatile是轻量级的synchronized,volatile关键字有两个作用:
1)保证共享变量的可见性
可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。笔者此前一篇文章Java并发编程:Java内存模型JMM中有说到,Java内存模型中有主内存和本地内存之分,本地内存持有共享变量的一份副本,线程对共享变量的修改是先修改本地内存的副本,然后再回写到主内存中去。
可能存在这样的情况,线程A和线程B同时去修改一个共享变量C,假设线程A先对共享变量C做了修改,而此时线程B却没能及时感知到共享变量C已经发生了改变,紧接着B对本地过期的副本数据进行了修改,这造成了共享变量的不可见问题。
而使用了volatile关键字修改的共享变量,当线程修改了共享变量之后,会立马刷新到主内存中,并且会使其他线程缓存了该地址的数据失效,这就保证了线程之间共享变量的可见性。
2)防止指令重排序
volatile关键字的另外一个作用就是防止指令重排序。代码在实际执行过程中,并不全是按照编写的顺序进行执行的,在保证单线程执行结果不变的情况下,编译器或者CPU可能会对指令进行重排序,以提高程序的执行效率。但是在多线程的情况下,指令重排序可能会造成一些问题,最常见的就是双重校验锁单例模式: public class SingletonSafe { private static volatile SingletonSafe singleton; private SingletonSafe() { } public static SingletonSafe getSingleton() { if (singleton == null) { synchronized (SingletonSafe.class) { if (singleton == null) { singleton = new SingletonSafe(); } } } return singleton; } }
如果没有使用volatile关键字,则可能会出现其他线程获取了一个未初始化完成的singleton对象,具体原因笔者不在这里赘述了,有兴趣的同学可以搜索一下“double checked locking with delay initialization”学习下,笔者后续有时间再写篇文章分析下。
volatile实现原理
1)可见性实现原理
对于volatile关键字修饰的变量,当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中。但是就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议。
缓存一致性协议:每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。
所以,如果一个变量被volatile所修饰的话,在每次数据变化之后,其值都会被强制刷入主存。而其他处理器的缓存由于遵守了缓存一致性协议,也会把这个变量的值从主存加载到自己的缓存中。这就保证了一个volatile在并发编程中,其值在多个缓存中是可见的。
2)防止指令重排序实现原理
volatile防止指令重排序是通过内存屏障来实现的。内存屏障分为如下三种:
Store Barrier
Store屏障,是x86的”sfence“指令,强制所有在store屏障指令之前的store指令,都在该store屏障指令执行之前被执行。
Load Barrier
Load屏障,是x86上的”ifence“指令,强制所有在load屏障指令之后的load指令,都在该load屏障指令执行之后被执行
Full Barrier
Full屏障,是x86上的”mfence“指令,复合了load和save屏障的功能。
Java内存模型中volatile变量在写操作之后会插入一个store屏障,在读操作之前会插入一个load屏障。一个类的final字段会在初始化后插入一个store屏障,来确保final字段在构造函数初始化完成并可被使用时可见。也正是JMM在volatile变量读写前后都插入了内存屏障指令,进而保证了指令的顺序执行。 原文来自: https://www.linuxprobe.com/java-volatile-keyword.html
系统运维
2019-11-13 08:56:00
「深度学习福利」大神带你进阶工程师,立即查看>>> 由于我本地的mysql版本比较低,最近想着要升级一下mysql版本,鉴于docker容器的火热,就想着在本地装个docker环境,然后下载最新版的mysql镜像,完成mysql8.0的安装。电脑是windows 10版本。
一 启用Hyper-V
打开控制面板-->程序-->启用或关闭windows功能,勾选Hyper-V,然后点击确定即可。 点击确定后,提示重启系统。
二 安装Docker
下载地址: https://hub.docker.com/editions/community/docker-ce-desktop-windows ,先要注册账号才能下载,这样直接下载非常 慢 。 另一种获取方式是关注公众号 情系IT 回台回复 docker 获取安装exe文件。
三 启动docker
获取到exe文件后,直接点击下一步即可完成安装,安装后会提示重启电脑。桌面上会出现docker图标,点击启动。打开windows命令行模式,输入docker version或docker -v查看,若出现如下信息则安装成功。
四 国内镜像加速
阿里云镜像加速地址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 获取专属加速器地址,如下图: 打开docker,右键Settings-->Daemon-->Registry mirrors复制刚才的专属加速器地址到此即可,这样就完成了国内镜像加速。
五 移动镜像存储目录
win10下的docker有可视化操作界面和命令行操作,下载了docker-ce.exe双击后就自己开始到结束自动完成,默认安装到了C盘目录下,也就是很多默认的参数或配置文件都在C盘目录下。考虑C盘是系统盘,docker使用过程中可能会拉取很多镜像文件,所以我们需要把docker默认的镜像文件存储地址修改一下。 打开Hyper-V管理器,1.开始菜单右键->控制面板->管理工具->Hyper-V 管理器 右键选择Hyper-V设置,修改下图所示的存储路径为你要存储的位置。
然后Settings-->Daemon-->Advanced中添加如下配置:
可能遇到的问题
解决办法为: cd "C:\Program Files\Docker\Docker" DockerCli.exe -SwitchDaemon
这样我们就完成windows10的docker安装,下一章我们将进行mysql8.0镜像的安装与运行。 如果文章对您有帮助,请记得点赞关注哟~ 欢迎大家关注我的公众号<情系IT>,每日推送技术文章供大家学习参考。
系统运维
2019-11-12 22:16:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
pika 地址: https://github.com/Qihoo360/pika/wiki
Step 1.下载安装pika 下载地址:https://github.com/Qihoo360/pika/releases/ 说明:选择pika-linux-x86_64-v3.2.8.tar.bz2 下载后上传服务器. #解压 $ tar -xvf pika-linux-x86_64-v3.2.8.tar.bz2 $ mv output /usr/local/pika #做软连接 $ ln -s /usr/local/pika/bin/pika /usr/bin/pika #启动 $ pika -c /usr/local/pika/conf/pika.conf
Step 2.pika 配置文件说明 # pika 端口 port : 9221 # pika是多线程的, 该参数能够配置pika的线程数量, 不建议配置值超过部署服务器的CPU核心数量 thread-num : 1 # 处理命令用户请求命令线程池的大小 thread-pool-size : 8 # sync 主从同步时候从库执行主库传递过来命令的线程数量 sync-thread-num : 6 # sync 处理线程的任务队列大小, 不建议修改 sync-buffer-size : 10 # Pika日志目录, 用于存放INFO, WARNING, ERROR日志以及用于同步的binlog(write2fine)文件 log-path : ./log/ # Pika数据目录 db-path : ./db/ # Pika 底层单个rocksdb单个memtable的大小, 设置越大写入性能越好但会在buffer刷盘时带来更大的IO负载, 请依据使用场景合理配置 [RocksDb-Tuning-Guide](https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide) write-buffer-size : 268435456 # Pika 的连接超时时间配置, 单位为秒, 当连接无请求时(进入sleep状态)开始从配置时间倒计时, 当倒计时为0时pika将强行 # 断开该连接, 可以通过合理配置该参数避免可能出现的pika连接数用尽问题, 该参数默认值为60 timeout : 60 # 密码管理员密码, 默认为空, 如果该参数与下方的userpass参数相同(包括同时为空), 则userpass参数将自动失效, 所有用户均为 # 管理员身份不受userblacklist参数的限制 requirepass : password # 同步验证密码, 用于slave(从库)连接master(主库)请求同步时进行验证, 该参数需要与master(主库)的requirepass一致 masterauth : # 用户密码, 默认为空, 如果该参数与上方的userpass参数相同(包括同时为空), 则本参数将自动失效, 所有用户均为管理员身份不 # 受userblacklist参数的限制 userpass : userpass # 指令黑名单, 能够限制通过userpass登录的用户, 这些用户将不能使用黑名单中的指令, 指令之间使用","隔开, 默认为空 # 建议将高风险命令配置在该参数中 userblacklist : FLUSHALL, SHUTDOWN, KEYS, CONFIG # 分为经典模式和分片模式,[classic | sharding],经典模式中支持多db的配置 instance-mode : classic # 经典模式下下指定db的数量,使用方式和redis一致 databases : 1 # 分片模式下每一个table中默认的slot数量 default-slot-num:16 # Pika的dump文件名称前缀, bgsave后生成的文件将以该前缀命名 dump-prefix : backup- # 守护进程模式 [yes | no] daemonize : yes # slotmigrate [yes | no], pika3.0.0暂不支持该参数 #slotmigrate : no # Pika dump目录设置, bgsave后生成的文件将存放在该目录中 dump-path : /data1/pika9001/dump/ # dump目录过期时间, 单位为天, 默认为0即永不过期 dump-expire: 0 # pidfile Path pid文件目录 pidfile : /data1/pika9001/pid/9001.pid # pika最大连接数配置参数 maxclients : 20000 # rocks-db的sst文件体积, sst文件是层级的, 文件越小, 速度越快, 合并代价越低, 但文件数量就会超多, 而文件越大, 速度相对变慢, 合并代价大, 但文件数量会很少, 默认是 20M target-file-size-base : 20971520 # binlog(write2file)文件保留时间, 7天, 最小为1, 超过7天的文件会被自动清理 expire-logs-days : 7 # binlog(write2file)文件最大数量, 200个, 最小为10, 超过200个就开始自动清理, 始终保留200个 expire-logs-nums : 200 # root用户连接保证数量:2个, 即时Max Connection用完, 该参数也能确保本地(127.0.0.1)有2个连接可以同来登陆pika root-connection-num : 2 # 慢日志记录时间, 单位为微秒, pika的慢日志记录在pika-ERROR.log中, pika没有类似redis slow log的慢日志提取api slowlog-log-slower-than : 10000 # slave是否是只读状态(yes/no, 1/0) # slave-read-only : 0 # Pika db 同步路径配置参数 db-sync-path : ./dbsync/ # 该参数能够控制全量同步时的传输速度, 合理配置该参数能够避免网卡被用尽, 该参数范围为1~125, 意为:1mb~125mb,当该参数 # 被配置为小于0或大于125时, 该参数会被自动配置为125 db-sync-speed : -1 # 指定网卡 # network-interface : eth1 # 同步参数配置, 适用于从库节点(slave), 该参数格式为ip:port, 例如192.168.1.2:6666, 启动后该示例会自动向192.168.1.2的 # 6666端口发送同步请求 # slaveof : master-ip:master-port # 配置双主或Hub需要的server id, 不使用双主或Hub请忽略该参数 server-id : 1 # 双主配置, 不使用双主请忽略以下配置 double-master-ip : 双主对端Ip double-master-port : 双主对端Port double-master-server-id : 双主对端server id # 自动全量compact, 通过配置的参数每天定时触发一次自动全量compact, 特别适合存在多数据结构大量过期、删除、key名称复用的场景 # 参数格式为:"启动时间(小时)-结束时间(小时)/磁盘空余空间百分比", 例如你需要配置一个每天在凌晨3点~4点之间自动compact的任务 # 同时该任务仅仅在磁盘空余空间不低于30%的时候执行, 那么应配置为:03-04/30, 该参数默认为空 compact-cron : # 自动全量compact, 该参与与compact-cron的区别为, compact-cron每天仅在指定时间段执行, 而compact-interval则以配置时间为周期 # 循环执行, 例如你需要配置一个每4小时执行一次的自动compact任务, 同时该任务仅仅在磁盘空余空间不低于30%的时候执行, 那么该参 # 数应配置为:4/30, 该参数默认为空 compact-interval : # 从库实例权重设置, 仅配合哨兵使用,无其它功能, 权重低的slave会优先选举为主库, 该参数默认为0(不参与选举) slave-priority : # 该参数仅适用于pika跨版本同步时不同版本的binlog能够兼容并成功解析, 该参数可配置为[new | old] # 当该参数被配置为new时, 该实例仅能作为3.0.0及以上版本pika的从库, 与pika2.3.3~2.3.5不兼容 # 当该参数被配置为old时, 该时候仅能作为2.3.3~2.3.5版本pika的从库, 与pika3.0.0及以上版本不兼容 # 该参数默认值为new, 该参数可在没有配置同步关系的时候通过config set动态调整, 一旦配置了同步关系则不可动态修改 # 需要先执行slaveof no one关闭同步配置, 之后即可通过config set动态修改 identify-binlog-type : new # 主从同步流量控制的的窗口,主从高延迟情形下可以通过提高该参数提高同步性能。默认值9000最大值90000。 sync-window-size : 9000 ################### #Critical Settings# # 危险参数 # ################### # write2file文件体积, 默认为100MB, 一旦启动不可修改, limited in [1K, 2G] binlog-file-size : 104857600 # 压缩方式[snappy | zlib | none]默认为snappy, 一旦启动不可修改 compression : snappy # 指定后台flush线程数量, 默认为1, 范围为[1, 4] max-background-flushes : 1 # 指定后台压缩线程数量, 默认为1, 范围为[1, 4] max-background-compactions : 1 # DB可以使用的打开文件的数量, 默认为5000 max-cache-files : 5000 # pika实例所拥有的rocksdb实例使用的memtable大小上限,如果rocksdb实际使用超过这个数值,下一次写入会造成刷盘 [Rocksdb-Basic-Tuning](https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning) max-write-buffer-size : 10737418240 # 限制命令返回数据的大小,应对类似于keys *等命令,返回值过大将内存耗尽。 max-client-response-size : 1073741824 # pika引擎中层级因子, 用于控制每个层级与上一层级总容量的倍数关系, 默认为10(倍), 允许调整为5(倍) max-bytes-for-level-multiplier : 10
系统运维
2019-11-12 21:00:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1.docker安装phpmyadmin管理宿主机mysql
#docker pull phpmyadmin/phpmyadmin
查看是否安装成功
宿主机9997端口映射到phpadmin容器的80端口
# docker run -d --name myadmin -e PMA_HOST=$(ip route show | grep docker0 | awk '{print $9}') -e PMA_PORT=3306 -p 9997:80 phpmyadmin/phpmyadmin
浏览器访问查看是否安装成功:
http://*.239:9997/
登录账号就是自己数据库中创建的账号登录即可
2.docker安装phpmyadmin管理容器中的mysql # docker 中下载 mysql docker pull mysql #启动 container1: #docker run -p 3307:3306 --name mysql5.6 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 container2: #docker run -p 3308:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 #进入容器 docker exec -it mysql5.6 bash #登录mysql mysql -u root -p ALTER USER 'root'@'localhost' IDENTIFIED BY '123456!'; #添加远程登录用户 CREATE USER 'oschina'@'%' IDENTIFIED WITH mysql_native_password BY 'oschina!'; GRANT ALL PRIVILEGES ON *.* TO 'oschina'@'%';
# docker run --name mysql5.6admin -d --link mysql5.6:db -p 8086:80 phpmyadmin/phpmyadmin
访问:http://*239:8086/
即可使用phpmyadmin管理容器中的5.6版本mysql
# docker run --name mysql5.7admin -d --link mysql5.7:db -p 8087:80 phpmyadmin/phpmyadmin
访问:http://*239:8087/
即可使用phpmyadmin管理容器中的5.7版本mysql
3.docker容器安装vim编辑器
docker容器默认没有编辑器,需要手动安装
# apt-get update
# apt-get install vim
4.docker swarm集群搭建nginx服务
192.168.213.146、192.168.213.148、192.168.213.149
step1:146管理节点依次执行
创建管理节点
# docker swarm init --advertise-addr 192.168.213.146:2377 --listen-addr 192.168.213.146:2377
查看swarm中的节点
# docker node ls
查看管理节点接入swarm的token
# docker swarm join-token manager
查看工作节点接入swarm的token
# docker swarm join-token worker
step2:创建自定义的overlay网络(146)
#docker network create --driver overlay --subnet 10.10.10.0/16 my-overlay-network
其他命令:
查看网络
#docker network ls
删除自定义网络
#docker network rm my-overlay-network
step3:worker节点加入
148节点执行:
# docker swarm join --token SWMTKN-1-2l3snr2vp4tuewwq8bjec8hha7sg4uplkiws00pmsj98gz9npf-cje1lazn630pvn6vxjakdigej 192.168.213.146:2377 --advertise-addr 192.168.213.148:2377 --listen-addr 192.168.213.148:2377
149节点执行:
# docker swarm join --token SWMTKN-1-2l3snr2vp4tuewwq8bjec8hha7sg4uplkiws00pmsj98gz9npf-cje1lazn630pvn6vxjakdigej 192.168.213.146:2377 --advertise-addr 192.168.213.149:2377 --listen-addr 192.168.213.149:2377
step4:拉取nginx镜像并启动nginx服务(146节点执行)
#docker pull linuxserver/nginx
#docker service create --name webapp-nginx --replicas 3 --network my-overlay-network --publish 8089:80 linuxserver/nginx
分别访问如下地址,查看服务启动情况
http://192.168.213.146:8089/
http://192.168.213.148:8089/
http://192.168.213.149:8089/
5.docker-compose安装
#pip install docker-compose
6.创建镜像
7.docker容器中安装vim命令
# apt-get update
# apt-get install vim
【常见问题】
1.docker mysql容器与宿主机时间不一致 (美国时间,晚了八个小时)
1.启动时保持一致
以启动mysql为例,将宿主机的/etc/localtime文件挂载到容器即可规避时间同步问题
# docker run --name mysqlcn -e MYSQL_ROOT_PASSWORD=123456 -it -v /etc/localtime:/etc/localtime -p 3309:3306 -d mysql:5.7
2.已经启动并运行了如何修改
方案一:将宿主机的/etc/localtime文件拷贝到容器中(限1.8以上版本,1.8之前版本会报异常,见下面截图)
docker1.8版本之前拷贝方式,粗暴拷贝(操作系统不同,拷贝的文件也不同)
下边是Debian GNU/Linux 8容器的拷贝方式
#cp /etc/localtime /var/lib/docker/aufs/mnt/3ae1d5d90a37457d5f04859697cd147f0e698c966b06cfa935200bdff3b9b475/etc/localtime
或(Debian GNU/Linux 9)
# cp /usr/share/zoneinfo/UTC /var/lib/docker/aufs/mnt/a95a1c0f99294026256471f89e502a5fc91ccbabd8c22dae62101beacb226e37/usr/share/zoneinfo/UTC
拷贝后,登录容器,时间已经和宿主机时间一直,但是容器中的mysql时间还没有改过来。
我的操作方式是,先停掉这个容器,再启动时间,mysql的时间也和宿主机保持一致了。
规范做法是执行下面命令,但在1.8之前此命令有bug
#docker cp /etc/localtime 3ae1d5d90a37:/etc/localtime
Error: Path not specified
方案二:升级docker版本,直接执行下面命令
#docker cp /etc/localtime 3ae1d5d90a37:/etc/localtime
直接执行拷贝命令会报异常
接下来我们对docker进行升级,然后再执行拷贝命令
3.docker mysql容器插入中文乱码 (????)- 容器编码问题
进入容器,执行如下命令即可
locale -a
临时修改 ,则执行如下命令即可
export LC_ALL=C.UTF-8
这是容器内的中文内容就不会乱码了
退出容器,再进入容器,中文乱码依然存在
永久修改
将export LC_ALL=C.UTF-8分别加入下面两个文件
#vim /etc/profile
#vim /root/.bashrc
让配置生效
#source /etc/profile
#source /root/.bashrc
此时退出容器,再进入容器,中文乱码不会存在
另外在设置字段时排序规则的设置也会导致中文乱码(utf8_bin中文不会乱码)
4.如何搭建自己的hub仓库镜像中心
系统运维
2019-11-12 18:03:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
在使用 redis-cli 连接 redis 集群,进行数据操作时,有报错
./redis-cli -h 192.24.54.1 -p 6379 -a '123456' 192.24.54.1:6379> get name (error) MOVED 5798 192.24.54.2:6379
解决方法:
这种情况一般是因为启动 redis-cli 时没有设置集群模式所导致。
启动时使用 -c 参数来启动集群模式,命令如下: ./redis-cli -h 192.24.54.1 -p 6379 -a '123456' -c 192.24.54.1:6379> get name -> Redirected to slot [5798] located at 192.24.54.2:6379 "yayun"
> 关注本公众号,后台回复「2018」即可获取传智播客 2018 最新 Python 和 Java 教程。
> 公众号提供CSDN资源免费下载服务!
系统运维
2019-11-12 17:50:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
一、Prometheus安装及配置
1、下载及解压安装包 cd /usr/local/src/ export VER="2.13.1" wget https://github.com/prometheus/prometheus/releases/download/v${VER}/prometheus-${VER}.linux-amd64.tar.gz mkdir -p /data0/prometheus groupadd prometheus useradd -g prometheus prometheus -d /data0/prometheus tar -xvf prometheus-${VER}.linux-amd64.tar.gz cd /usr/local/src/ mv prometheus-${VER}.linux-amd64 /data0/prometheus/prometheus_server cd /data0/prometheus/prometheus_server/ mkdir -p {data,config,logs,bin} mv prometheus promtool bin/ mv prometheus.yml config/ chown -R prometheus.prometheus /data0/prometheus
2 、设置环境变量 vim /etc/profile PATH=/data0/prometheus/prometheus_server/bin:$PATH:$HOME/bin source /etc/profile
3、检查配置文件 promtool check config /data0/prometheus/prometheus_server/config/prometheus.yml Checking /data0/prometheus/prometheus_server/config/prometheus.yml SUCCESS: 0 rule files found
4、创建prometheus.service 的 systemd unit 文件 4.1、常规服务 sudo tee /etc/systemd/system/prometheus.service <<-'EOF' [Unit] Description=Prometheus Documentation=https://prometheus.io/ After=network.target [Service] Type=simple User=prometheus ExecStart=/data0/prometheus/prometheus_server/bin/prometheus --config.file=/data0/prometheus/prometheus_server/config/prometheus.yml --storage.tsdb.path=/data0/prometheus/prometheus_server/data --storage.tsdb.retention=60d Restart=on-failure [Install] WantedBy=multi-user.target EOF systemctl enable prometheus.service systemctl stop prometheus.service systemctl restart prometheus.service systemctl status prometheus.service 4.2、使用supervisor管理prometheus_server yum install -y epel-release supervisor sudo tee /etc/supervisord.d/prometheus.ini<<-"EOF" [program:prometheus] # 启动程序的命令; command = /data0/prometheus/prometheus_server/bin/prometheus --config.file=/data0/prometheus/prometheus_server/config/prometheus.yml --storage.tsdb.path=/data0/prometheus/prometheus_server/data --storage.tsdb.retention=60d # 在supervisord启动的时候也自动启动; autostart = true # 程序异常退出后自动重启; autorestart = true # 启动5秒后没有异常退出,就当作已经正常启动了; startsecs = 5 # 启动失败自动重试次数,默认是3; startretries = 3 # 启动程序的用户; user = prometheus # 把stderr重定向到stdout,默认false; redirect_stderr = true # 标准日志输出; stdout_logfile=/data0/prometheus/prometheus_server/logs/out-prometheus.log # 错误日志输出; stderr_logfile=/data0/prometheus/prometheus_server/logs/err-prometheus.log # 标准日志文件大小,默认50MB; stdout_logfile_maxbytes = 20MB # 标准日志文件备份数; stdout_logfile_backups = 20 EOF systemctl daemon-reload systemctl enable supervisord systemctl stop supervisord systemctl restart supervisord supervisorctl restart prometheus supervisorctl status
5、prometheus.yml配置文件 #创建Alertmanager告警规则文件 mkdir -p /data0/prometheus/prometheus_server/rules/ touch /data0/prometheus/prometheus_server/rules/node_down.yml touch /data0/prometheus/prometheus_server/rules/memory_over.yml touch /data0/prometheus/prometheus_server/rules/disk_over.yml touch /data0/prometheus/prometheus_server/rules/cpu_over.yml #prometheus配置文件 cat > /data0/prometheus/prometheus_server/config/prometheus.yml << \EOF # my global config global: scrape_interval: 15s # 设置抓取(pull)时间间隔,默认是1m evaluation_interval: 15s # 设置rules评估时间间隔,默认是1m # scrape_timeout is set to the global default (10s). # 告警管理配置,默认配置 alerting: alertmanagers: - static_configs: - targets: - 192.168.56.11:9093 # 这里修改为 alertmanagers 的地址 # 加载rules,并根据设置的时间间隔定期评估 rule_files: # - "first_rules.yml" # - "second_rules.yml" - "/data0/prometheus/prometheus_server/rules/node_down.yml" # 实例存活报警规则文件 - "/data0/prometheus/prometheus_server/rules/memory_over.yml" # 内存报警规则文件 - "/data0/prometheus/prometheus_server/rules/disk_over.yml" # 磁盘报警规则文件 - "/data0/prometheus/prometheus_server/rules/cpu_over.yml" # cpu报警规则文件 # 抓取(pull),即监控目标配置 # 默认只有主机本身的监控配置 scrape_configs: # The job name is added as a label `job=` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. # 可覆盖全局配置设置的抓取间隔,由15秒重写成5秒。 scrape_interval: 10s static_configs: - targets: ['localhost:9090', 'localhost:9100'] - job_name: 'DMC_HOST' file_sd_configs: - files: ['./hosts.json'] # 被监控的主机,可以通过static_configs罗列所有机器,这里通过file_sd_configs参数加载文件的形式读取 # 被监控的主机,可以json或yaml格式书写,我这里以json格式书写,target里面写监控机器的ip,labels非必须,可以由你自己定 EOF #file_sd_configs参数形式配置主机列表 cat > /data0/prometheus/prometheus_server/config/hosts.json << \EOF [ { "targets": [ "192.168.56.11:9100", "192.168.56.12:9100", "192.168.56.13:9100" ], "labels": { "service": "db_node" } }, { "targets": [ "192.168.56.14:9100", "192.168.56.15:9100", "192.168.56.16:9100" ], "labels": { "service": "web_node" } } ] EOF # 服务器存活报警 cat > /data0/prometheus/prometheus_server/rules/node_down.yml <<\EOF groups: - name: 实例存活告警规则 rules: - alert: 实例存活告警 expr: up == 0 for: 1m labels: user: prometheus severity: warning annotations: description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes." EOF # mem报警 cat > /data0/prometheus/prometheus_server/rules/memory_over.yml <<\EOF groups: - name: 内存报警规则 rules: - alert: 内存使用率告警 expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes )) / node_memory_MemTotal_bytes * 100 > 80 for: 1m labels: user: prometheus severity: warning annotations: description: "服务器: 内存使用超过80%!(当前值: {{ $value }}%)" EOF # disk报警 cat > /data0/prometheus/prometheus_server/rules/disk_over.yml <<\EOF groups: - name: 磁盘报警规则 rules: - alert: 磁盘使用率告警 expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100 > 80 for: 1m labels: user: prometheus severity: warning annotations: description: "服务器: 磁盘设备: 使用超过80%!(挂载点: {{ $labels.mountpoint }} 当前值: {{ $value }}%)" EOF # cpu报警 cat > /data0/prometheus/prometheus_server/rules/cpu_over.yml <<\EOF groups: - name: CPU报警规则 rules: - alert: CPU使用率告警 expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]) )) * 100 > 90 for: 1m labels: user: prometheus severity: warning annotations: description: "服务器: CPU使用超过90%!(当前值: {{ $value }}%)" EOF
6、查看ui
Prometheus自带有简单的UI, http://192.168.56.11:9090/ http://192.168.56.11:9090/targets http://192.168.56.11:9090/graph
二、node_exporter安装及配置
1、下载及解压安装包 cd /usr/local/src/ export VER="0.18.1" wget https://github.com/prometheus/node_exporter/releases/download/v${VER}/node_exporter-${VER}.linux-amd64.tar.gz mkdir -p /data0/prometheus groupadd prometheus useradd -g prometheus prometheus -d /data0/prometheus tar -xvf node_exporter-${VER}.linux-amd64.tar.gz cd /usr/local/src/ mv node_exporter-${VER}.linux-amd64 /data0/prometheus/node_exporter chown -R prometheus.prometheus /data0/prometheus
2、创建node_exporter.service的 systemd unit 文件 centos下创建服务 cat > /usr/lib/systemd/system/node_exporter.service < /etc/systemd/system/node_exporter.service <3、启动服务 systemctl daemon-reload systemctl stop node_exporter.service systemctl enable node_exporter.service systemctl restart node_exporter.service
4、运行状态 systemctl status node_exporter.service
5、客户监控端数据汇报
访问: http://192.168.56.11:9100/metrics 查看从exporter具体能抓到的数据.如下:
三、部署Alertmanager钉钉报警
1、下载及解压安装包 cd /usr/local/src/ export VER="0.19.0" wget https://github.com/prometheus/alertmanager/releases/download/v${VER}/alertmanager-${VER}.linux-amd64.tar.gz mkdir -p /data0/prometheus groupadd prometheus useradd -g prometheus prometheus -d /data0/prometheus tar -xvf alertmanager-${VER}.linux-amd64.tar.gz cd /usr/local/src/ mv alertmanager-${VER}.linux-amd64 /data0/prometheus/alertmanager chown -R prometheus.prometheus /data0/prometheus
2、配置Alertmanager alertmanager的webhook集成了钉钉报警,钉钉机器人对文件格式有严格要求,所以必须通过特定的格式转换,才能发送给你钉钉的机器人。有人已经写了转换插件,那就直接用吧(https://github.com/timonwong/prometheus-webhook-dingtalk.git) cat >/data0/prometheus/alertmanager/alertmanager.yml<<-"EOF" # 全局配置项 global: resolve_timeout: 5m # 处理超时时间,默认为5min # 定义路由树信息 route: group_by: [alertname] # 报警分组依据 receiver: ops_notify # 设置默认接收人 group_wait: 30s # 最初即第一次等待多久时间发送一组警报的通知 group_interval: 60s # 在发送新警报前的等待时间 repeat_interval: 1h # 重复发送告警时间。默认1h routes: - receiver: ops_notify # 基础告警通知 group_wait: 10s match_re: alertname: 实例存活告警|磁盘使用率告警 # 匹配告警规则中的名称发送 - receiver: info_notify # 消息告警通知 group_wait: 10s match_re: alertname: 内存使用率告警|CPU使用率告警 # 定义基础告警接收者 receivers: - name: ops_notify webhook_configs: - url: http://localhost:8060/dingtalk/ops_dingding/send send_resolved: true # 警报被解决之后是否通知 # 定义消息告警接收者 - name: info_notify webhook_configs: - url: http://localhost:8060/dingtalk/info_dingding/send send_resolved: true # 一个inhibition规则是在与另一组匹配器匹配的警报存在的条件下,使匹配一组匹配器的警报失效的规则。两个警报必须具有一组相同的标签。 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] EOF
3、启动alertmanager cat >/lib/systemd/system/alertmanager.service<<\EOF [Unit] Description=Prometheus: the alerting system Documentation=http://prometheus.io/docs/ After=prometheus.service [Service] ExecStart=/data0/prometheus/alertmanager/alertmanager --config.file=/data0/prometheus/alertmanager/alertmanager.yml Restart=always StartLimitInterval=0 RestartSec=10 [Install] WantedBy=multi-user.target EOF systemctl enable alertmanager.service systemctl stop alertmanager.service systemctl restart alertmanager.service systemctl status alertmanager.service #查看端口 netstat -anpt | grep 9093
4、将钉钉接入 Prometheus AlertManager WebHook #命令行测试机器人发送消息,验证是否可以发送成功,有的时候prometheus-webhook-dingtalk会报422的错误,就是因为钉钉的安全限制(这里的安全策略是发送消息,必须包含prometheus才可以正常发送) curl -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"prometheus alert test"}}' https://oapi.dingtalk.com/robot/send?access_token=18f977769d50518e9d4f99a0d5dc1376f05615b61ea3639a87f106459f75b5c9 curl -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"prometheus alert test"}}' https://oapi.dingtalk.com/robot/send?access_token=11a0496d0af689d56a5861ae34dc47d9f1607aee6f342747442cc83e36715223 4.1、二进制包方式部署插件 cd /usr/local/src/ export VER="0.3.0" wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v${VER}/prometheus-webhook-dingtalk-${VER}.linux-amd64.tar.gz tar -zxvf prometheus-webhook-dingtalk-${VER}.linux-amd64.tar.gz mv prometheus-webhook-dingtalk-${VER}.linux-amd64 /data0/prometheus/alertmanager/prometheus-webhook-dingtalk #使用方法:prometheus-webhook-dingtalk --ding.profile=钉钉接收群组的值=webhook的值 cat > /etc/systemd/system/prometheus-webhook-dingtalk.service<<\EOF [Unit] Description=prometheus-webhook-dingtalk After=network-online.target [Service] Restart=on-failure ExecStart=/data0/prometheus/alertmanager/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk \ --ding.profile=ops_dingding=https://oapi.dingtalk.com/robot/send?access_token=18f977769d50518e9d4f99a0d5dc1376f05615b61ea3639a87f106459f75b5c9 \ --ding.profile=info_dingding=https://oapi.dingtalk.com/robot/send?access_token=11a0496d0af689d56a5861ae34dc47d9f1607aee6f342747442cc83e36715223 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl stop prometheus-webhook-dingtalk systemctl restart prometheus-webhook-dingtalk systemctl status prometheus-webhook-dingtalk netstat -nltup|grep 8060 4.2、docker方式部署插件 docker pull timonwong/prometheus-webhook-dingtalk:v0.3.0 #docker run -d --restart always -p 8060:8060 timonwong/prometheus-webhook-dingtalk:v0.3.0 --ding.profile="=" docker run -d --restart always -p 8060:8060 timonwong/prometheus-webhook-dingtalk:v0.3.0 --ding.profile="ops_dingding=https://oapi.dingtalk.com/robot/send?access_token=18f977769d50518e9d4f99a0d5dc1376f05615b61ea3639a87f106459f75b5c9" --ding.profile="info_dingding=https://oapi.dingtalk.com/robot/send?access_token=11a0496d0af689d56a5861ae34dc47d9f1607aee6f342747442cc83e36715223" 这里解释一下两个变量: :prometheus-webhook-dingtalk 支持多个钉钉 webhook,不同 webhook 就是靠名字对应到 URL 来做映射的。要支持多个钉钉 webhook,可以用多个 --ding.profile 参数的方式支持,例如:sudo docker run -d --restart always -p 8060:8060 timonwong/prometheus-webhook-dingtalk:v0.3.0 --ding.profile="webhook1=https://oapi.dingtalk.com/robot/send?access_token=token1" --ding.profile="webhook2=https://oapi.dingtalk.com/robot/send?access_token=token2"。而名字和 URL 的对应规则如下,ding.profile="webhook1=......",对应的 API URL 为:http://localhost:8060/dingtalk/webhook1/send :这个就是之前获取的钉钉 webhook 4.3、源码方式部署插件 #安装golang环境 cd /usr/local/src/ wget https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz tar -zxvf go1.13.4.linux-amd64.tar.gz mv go/ /usr/local/ #vim /etc/profile export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin #添加环境变量GOPATH mkdir -p /opt/path export GOPATH=/opt/path #若 $GOPATH/bin 没有加入$PATH中,你需要执行将其可执行文件移动到$GOBIN下 export GOPATH=/opt/path export PATH=$PATH:$GOROOT/bin:$GOPATH/bin source /etc/profile #下载插件 cd /usr/local/src/ git clone https://github.com/timonwong/prometheus-webhook-dingtalk.git cd prometheus-webhook-dingtalk go get github.com/timonwong/prometheus-webhook-dingtalk/cmd/prometheus-webhook-dingtalk make #(make成功后,会产生一个prometheus-webhook-dingtalk二进制文件) #将钉钉告警插件拷贝到alertmanager目录 cp prometheus-webhook-dingtalk /data0/prometheus/alertmanager/ #启动服务 nohup /data0/prometheus/alertmanager/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk --ding.profile="ops_dingding=https://oapi.dingtalk.com/robot/send?access_token=18f977769d50518e9d4f99a0d5dc1376f05615b61ea3639a87f106459f75b5c9" --ding.profile="info_dingding=https://oapi.dingtalk.com/robot/send?access_token=11a0496d0af689d56a5861ae34dc47d9f1607aee6f342747442cc83e36715223" 2>&1 1>/tmp/dingding.log & #检查端口 netstat -anpt | grep 8060
四、Grafana安装及配置
1、下载及安装 cd /usr/local/src/ export VER="6.4.3" wget https://dl.grafana.com/oss/release/grafana-${VER}-1.x86_64.rpm yum localinstall -y grafana-${VER}-1.x86_64.rpm
2、启动服务 systemctl daemon-reload systemctl enable grafana-server.service systemctl stop grafana-server.service systemctl restart grafana-server.service
3、访问WEB界面
默认账号/密码:admin/admin http://192.168.56.11:3000
4、Grafana添加数据源 在登陆首页,点击"Configuration-Data Sources"按钮,跳转到添加数据源页面,配置如下: Name: prometheus Type: prometheus URL: http://192.168.56.11:9090 Access: Server 取消Default的勾选,其余默认,点击"Add",如下: 需要安装饼图的插件 grafana-cli plugins install grafana-piechart-panel systemctl restart grafana-server.service 请确保安装后能正常添加饼图。 安装consul数据源插件 grafana-cli plugins install sbueringer-consul-datasource systemctl restart grafana-server.service
五、替换grafana的dashboards
https://grafana.com/dashboards
https://grafana.com/grafana/dashboards/11074 基础监控-new https://grafana.com/dashboards/8919 基础监控 https://grafana.com/dashboards/7362 数据库监控
参考文档:
https://www.jianshu.com/p/e59cfd15612e Centos 7 部署 Prometheus、Alertmanager、Grafana 监控 Linux 主机
https://juejin.im/entry/5c2c4a7f6fb9a049b82a90ee 使用 Prometheus 监控 Ceph
https://blog.csdn.net/xiegh2014/article/details/84936174 CentOS7.5 Prometheus2.5+Grafana5.4监控部署
https://www.cnblogs.com/smallSevens/p/7805842.html Grafana+Prometheus打造全方位立体监控系统
https://www.cnblogs.com/sfnz/p/6566951.html安装prometheus+grafana监控mysql redis kubernetes等
https://blog.csdn.net/hzs33/article/details/86553259 prometheus+grafana监控mysql、canal服务器
系统运维
2019-11-12 17:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
导读
nginx 配置反向代理之前说过使用nginx 搭建CDN 服务器的方法《nginx 配置反向代理》 我的web服务和CDN都是用nginx来配置的,使用了一些时间后发现主服务器上日志记录的信息都是来自CDN服务器的请求,如果直接访问CDN 的话主服务器上无法记录到来访者的IP地址,网上查了下几种方案,最后还是使用nginx 自带的realip_module 来处理更合适。
使用nginx -V 查看一下nginx 参数中有没有--with-http_realip_module [root@aliyun cnyunwei]# nginx -V nginx version: nginx/1.10.1 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) built with OpenSSL 1.0.2h 3 May 2016 TLS SNI support enabled configure arguments: --prefix=XXXXXX --with-http_realip_module XXXXXX
默认是不安装该模块的,所以如果检测出来没有这个模块就需要重新编译了,重新编译也非常方便,即使是线上不能停机当然也可以编译,平滑升级即可。 进入nginx 源码安装包目录下 configure 的参数就和原来保持一样,只是增加一个--with-http_realip_module 例如:--prefix=/usr/local/nginx --with-http_stub_status_module --with-http_realip_module make && make install 至于平滑升级,可直接执行 killall -s USR2 nginx
接下来是编辑对应的配置文件设置 location 中加入以下信息: set_real_ip_from 222.222.222.222; #这里是需要填写具体的CDN服务器IP地址 real_ip_header X-Forwarded-For; real_ip_recursive on;
写一个测试页面来检测读取的访问IP地址是否已经获取到了用户IP地址 vim ip.php < ?php echo "Welcome cnyunwei.cc !"; echo ' server_addr : '; echo $_SERVER['SERVER_ADDR']; echo 'remote_addr : '; echo $_SERVER['REMOTE_ADDR']; echo 'host : '; echo $_SERVER['HTTP_HOST']; ?>
下面即可直接访问测试,remote_addr 是否为你当前的公网IP地址,然后修改本地电脑hosts 重定向到CDN服务器再测试验证IP地址是否正确读取,如果正确的情况访问日志中也会正确显示对应的来访IP地址而不是CDN服务器的地址。 原文来自: https://www.linuxprobe.com/getting-ip-address.html
系统运维
2019-11-11 09:42:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
LoRa是Long Range Radio的缩写,从这个名字上面就能看出来他的特点是传输距离远,在同样的功耗条件下比其他无线方式传播的距离要更远,实现了低功耗和远距离的统一。
什么是LoRa?
LoRa是Long Range Radio的缩写,从这个名字上面就能看出来他的特点是传输距离远,在同样的功耗条件下比其他无线方式传播的距离要更远,实现了低功耗和远距离的统一,它在同样的功耗下比传统的无线射频通信距离要远3-5倍。是由美国陞特(semtech)公司创建的低功耗局域网无线标准。
什么是LoRaWAN?
LoRaWAN(Lora Wide Area Network)LoRa广域物联网的简称,是基于LoRa技术的一种通信协议。它主要由(LoRa终端、LoRa网关、LoRa服务器)三个实体组成。如果按协议分层来说LoRaWAN是MAC层,LoRa是物理层。
LoRa的优点有哪些?
距离远:超远的传输距离,采用扩频增益、它的传输距离约FSK的三倍。特别是在普通的无线传输信号较弱的室内和地下环境,LoRa技术优势明显。
功耗低:尽管它通信距离空旷能达到5KM,仍然具有良好的节能特性。
免 费:与我们上一篇文章所介绍的NB-IOT所不同的是LoRa工作在免费ISM频段,用户不依靠运营商就可完成LoRa网络部署,不仅布设更快,而且成本更低。这为普通用户使用该无线网络打开了一道便捷之门。
LoRa的缺点有哪些?
传输速率低:因为扩频后的通信带宽窄,一般只适合传感器等传输信息量较低的网络。对于数据量高的应用场合(如图像传输)就不适用了。
技术过于集中:LoRa技术过于集中于semtech公司。不利于产业的发展。
需要新建网络:LoRa在布设过程中,需要新建信号塔、工业基站甚至是便携式家庭网关。这对于一般的普通用户就存在一定的难度。因此行业中基本没有见到有百万连接的项目。
LoRa芯片有哪些?
目前支持LoRa这种通讯技术协议的终端芯片大部分是由semtech公司推出的,或是其授权生产的。行业内最为主流的是SX1276和SX1278,二者封装一致,应用电路有细微差别,前者面向的是欧美市场(频段137-1020MHz),后者面向中国市场(频段137-525MHz)。除此之外SX1262也是一款比较流行的LoRa终端芯片,它的体积比上面的两款更小,支持的频段为150-960MHz,发射功率更高,被很多应用者所选择。
除了终端芯片以外如果要组成LoRaWAN还需要网关芯片,SX1301就是semtech公司推出的LoRa网关芯片,8个LoRa信道,1个是FSK信道,可以看成是FPGA+8路LoRa调制解调器,该芯片是Semtech公司的核心利益模块,从数据手册到软件驱动再到协议算法都是不公开的。
LoRa与其他无线通信技术有何区别?
我们目前常见的无线通讯方式有WiFi、蓝牙、2G-GSM、3G\4G、NB-IOT、ZigBee和常见小无线(sub 1G)等。下图是笔者根据这几种无线通信方式的相关特性做的分类比较,大家可以看出LoRa在很多方面都具有很大的优势,比如通讯距离以及通信成本等。
总结
笔者在去年深入的研究以及使用了LoRa这种通讯技术,包括其硬件设计和软件驱动,如果是单纯的用来传输传感器数据LoRa都是很合适的选择,比一般的小无线如Ti的CC1101、芯科实验室的SI4432和SI4463(我竟然发现这货有bug,官方已承认)都要优秀很多。如果组成LoRaWAN其他小无线更是无法比拟。
目前与其竞争比较激烈的是NB-IOT,需要了解NB-IOT的朋友可以看我上一篇文章,对比NB-IOT来说虽然它们在一些细分领域不具有竞争关系,但是在很多常见领域都是有所竞争的,LoRa因为其技术的垄断导致了其闭塞,而不像NB-IOT那样的开放,这对于无线通信这个庞大的领域来说无疑是不讨好的。
LoRa与NB-IOT的比赛才刚刚开始,最终谁会成为物联网通信行业的领头羊都还是未知,作为用户的我们是这场比赛的参与者也是裁判者。希望它们会在未来给我们的生活带来更多的便利,更多的惊喜! 本文地址: https://www.linuxprobe.com/lora-lorawan.html
系统运维
2019-11-11 09:28:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
linux-day2
(1)快照
(2)systemctl 5个必须背过的命令
(3)命令参数
系统运维
2019-11-10 20:40:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
导读
链式调用是我们在写程序时候的一般流程,为了完成一个整体功能,会将其拆分成多个函数(或子模块),比如模块A调用模块B,模块B调用模块C,模块C调用模块D。
最近小L会听到很多学员说,在面试大型互联网公司的时候,很可能会被问到消息队列的问题: 在何种场景下使用了消息中间件?
为什么要在系统里引入消息中间件?
如何实现幂等?
链式调用是我们在写程序时候的一般流程,为了完成一个整体功能,会将其拆分成多个函数(或子模块),比如模块A调用模块B,模块B调用模块C,模块C调用模块D。但在大型分布式应用中,系统间的RPC交互繁杂,一个功能背后要调用上百个接口并非不可能,这种架构有如下几个劣势:
1、 这些接口之间耦合比较严重,每新增一个下游功能,都要对上有的相关接口进行改造;举个例子:假如系统A要发送数据给系统B和C,发送给每个系统的数据可能有差异,因此系统A对要发送给每个系统的数据进行了组装,然后逐一发送;当代码上线后,新增了一个需求:把数据也发送给D。此时就需要修改A系统,让他感知到D的存在,同时把数据处理好给D。在这个过程中你会看到,每接入一个下游系统,都要对A系统进行代码改造,开发联调的效率很低。其整体架构如下图:
2、 面对大流量并发时,容易被冲垮。每个接口模块的吞吐能力是有限的,这个上限能力如果堤坝,当大流量(洪水)来临时,容易被冲垮。
3、 存在性能问题。RPC接口基本上是同步调用,整体的服务性能遵循“木桶理论”,即链路中最慢的那个接口。比如A调用B/C/D都是50ms,但此时B又调用了B1,花费2000ms,那么直接就拖累了整个服务性能。
根据上述的几个问题,在设计系统时可以明确要达到的目标: 1、要做到系统解耦,当新的模块接进来时,可以做到代码改动最小;
2、设置流量缓冲池,可以让后端系统按照自身吞吐能力进行消费,不被冲垮;
3、强弱依赖梳理,将非关键调用链路的操作异步化,提升整体系统的吞吐能力,比如上图中A、B、C、D是让用户发起付款,然后返回付款成功提示的几个关键流程,而B1是通知付款后通知商家发货的模块,那么实质上用户对B1完成的时间容忍度比较大(比如几秒之后),可以将其异步化。
在现在的系统视线中,MQ消息队列是普遍使用的,可以完美的解决这些问题的利器。下图是使用了MQ的简单架构图,可以看到MQ在最前端对流量进行蓄洪,下游的系统ABC只与MQ打交道,通过事先定义好的消息格式来解析。
引入MQ之后的系统架构、交互方式与最初的链式调用架构非常不同,虽然可以解决上文提到的问题,但也要充分理解其原理特性来避免其带来的副作用,这里以消息队列如何保证“消息的可靠投递”为切入点,来看看MQ的实现方式。
一、Client如何将消息可靠投递到MQ 1.Client发送消息给MQ
2.MQ将消息持久化后,发送Ack消息给Client,此处有可能因为网络问题导致Ack消息无法发送到Client,那么Client在等待超时后,会重传消息;
3.Client收到Ack消息后,认为消息已经投递成功。
二、 MQ如何将消息可靠投递到Client 1.MQ将消息push给Client(或Client来pull消息)
2.Client得到消息并做完业务逻辑
3.Client发送Ack消息给MQ,通知MQ删除该消息,此处有可能因为网络问题导致Ack失败,那么Client会重复消息,这里就引出消费幂等的问题;
4.MQ将已消费的消息删除 原文来自: https://www.linuxprobe.com/java-message-queue.html
系统运维
2019-11-10 20:04:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
导读
使用docker过程中,我们需要查看容器中产生的数据,以及容器与容器之间、容器与主机之前进行数据共享、备份等操作,这里就需要到容器的数据管理。
数据的管理目前提供如下两种方式:
(1)数据卷 data volumes
(2)数据卷容器 data volumes containers
数据卷
数据卷,说白了就是一个特殊目录,类似 linux 下对目录或文件进行mount挂载操作,只不过他绕过了文件系统。具有如下特点:
(1)数据卷可以在容器之间进行共享和重用
(2)对数据卷的更改会立即生效
(3)对数据卷的更新不会影响到镜像 (镜像只读)
(4)卷会一直存在,直到没有容器使用
数据卷的添加可以通过-v 参数来设定,后边跟上目录。一下举例说明:
创建一个数据卷/homedata到容器os123中 [root@docker5 home]# docker run -d -ti --name os123 -v /homedata centos [root@docker5 home]# docker exex -ti os123 /bin/bash [root@d1a05a7d5efe /]# ll total 40 -rw-r--r--. 1 root root 18301 Jun 2 13:27 anaconda-post.log lrwxrwxrwx. 1 root root 7 Jun 2 13:25 bin > usr/bin drwxr-xr-x. 5 root root 380 Jun 23 02:42 dev drwxr-xr-x. 48 root root 4096 Jun 23 02:42 etc drwxr-xr-x. 2 root root 6 Aug 12 2015 home drwxr-xr-x. 2 root root 6 Jun 23 02:42 homedata .. [root@d1a05a7d5efe /]# cd homedata/ [root@d1a05a7d5efe homedata]# ll total 0 [root@d1a05a7d5efe homedata]# touch 21yunwei.txt ;echo 123>> 21yunwei.txt [root@d1a05a7d5efe homedata]# cat 21yunwei.txt 123
挂载本地服务器上的一个目录/home/data到容器os456 目录/homedata中
home/data事先里边建立一个文件1.txt并内容hello world [root@docker5 home]# docker run -d -ti --name os456 -v /home/data:/homedata centos [root@docker5 home]# docker exec -ti os456 /bin/bash [root@9347d5ef84ff homedata]# cd /homedata;cat 1.txt hello world
通过上边两个容器os123 和os456,基本了解了如何创建数据卷以及如何挂载本地目录到数据卷中。注意,两个容器中的如果是单独挂载的数据卷(即没有挂载同一个数据卷容器),那么数据是互不影响的,进入不同的数据卷相同目录下比如/homedata,内容可以不一样。
注意:删除容器的时候,数据卷不会删除。如果要删除容器的时候同时删除数据卷,需加上-v参数。比如: docker rm os456 -v /homedata
数据卷容器
建立的容器很多时候不是单一的,需要容器之间进行数据共享,进行数据同步和更新操作。这样就需要建立一个数据卷容器。
数据卷容器就是一个普通的容器,里边带有设置好的数据卷,专门提供给其他容器挂载使用。 通过–volumes-from 数据卷容器名 来实现。
我有一个网站程序放到了服务器本机的/home/webdata目录 ,下边创建一个数据卷容器webdata,同时将我服务器上的/home/webdata挂载到数据卷容器的/web目录: [root@docker5 home]# docker run -d -ti --name webdata -v /home/webdata:/home/web centos
进入容器并查看数据 [root@docker5 home]# docker exec -ti webdata /bin/bash [root@289598d6e24d /]# cd /home/web/ [root@289598d6e24d web]# ll total 7872 drwxr-xr-x. 3 root root 54 Mar 27 2013 META-INF drwxr-xr-x. 6 root root 4096 Dec 25 2014 WEB-INF drwxr-xr-x. 3 root root 63 Mar 27 2013 css drwxr-xr-x. 2 root root 8192 Mar 27 2013 flags -rw-r--r--. 1 root root 97 Mar 27 2013 index.jsp drwxr-xr-x. 2 root root 4096 Mar 27 2013 js drwxr-xr-x. 2 root root 6 Jun 23 03:43 probe
通过这里建立1.txt 并插入内容,可以看到服务器上的/home/webdata数据是同步的。可见容器以及目录挂载都没问题。 [root@docker5 home]# docker run -dti --volumes-from webdata --name os147 centos [root@docker5 home]# docker run -dti --volumes-from webdata --name os258 centos
分别创建了两个容器,都通过–volumes-from webdata 挂载了同一个数据卷容器,进入os147 和os258 分别查看/home/web可见数据都是存在的,于是这里就实现了数据的共享同步。 [root@docker5 home]# docker exec -ti os147 /bin/bash [root@b4cfa4c4e11c /]# cd /home/web/ [root@b4cfa4c4e11c web]# ll total 7876 -rw-r--r--. 1 root root 11 Jun 23 03:46 1.txt drwxr-xr-x. 3 root root 54 Mar 27 2013 META-INF drwxr-xr-x. 6 root root 4096 Dec 25 2014 WEB-INF drwxr-xr-x. 3 root root 63 Mar 27 2013 css drwxr-xr-x. 2 root root 8192 Mar 27 2013 flags -rw-r--r--. 1 root root 97 Mar 27 2013 index.jsp drwxr-xr-x. 2 root root 4096 Mar 27 2013 js drwxr-xr-x. 2 root root 6 Jun 23 03:43 probe
说明:
1,可以多次使用–volume-from参数从多个容器挂载多个目录。 也可以从其他已经挂载了数据卷的容器来挂载数据卷(类似传递)。
2,再次强调:如果删除了挂载的容器,数据卷不会被自动删除。如果要删除容器的时候同时删除数据卷,需加上-v参数。
通过数据卷容器进行数据备份、数据恢复和数据迁移
备份
我们创建一个专门用来备份probe的容器:probebak进行备份数据卷容器中的数据, 命令 如下 docker run -dti --volumes-from webdata --name probebak -v /home/web_probebak:/backup centos tar zcvf /backup/web_probe.tar.gz /home/web
命令 为创建一个专用备份的容器probebak,挂载了数据卷容器webdata,同时将服务器本地目录 /home/web_probebak挂载到了备份容器上的/backup目录容器启动以后,会执行tar zcvf /backup/web_proce.tar.gz /home/web操作,完成服务器上/home/web备份,打包到/backup/web_proce.tar.gz,也就是打包到了/home/web_probebak/web_probe.tar.gz 实现了数据备份。
恢复
创建一个容器os999 ,挂载有数据卷 /testdata [root@docker5 home]# docker run -v /testdata --name os999 centos /bin/bash
再建一个容器,通过–volumes-from os999挂载刚才设置好的数据卷,解压数据: [root@docker5 home]# docker run --volumes-from os999 -v /home/web_probebak:/backup busybox tar zxvf /backup/web_probe.tar.gz Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning. home/web/ home/web/probe.zip home/web/probe/ home/web/css/ home/web/css/classic/ home/web/css/classic/datasourcetest.css 原文来自: https://www.linuxprobe.com/docker-data-volumes.html
系统运维
2019-11-10 20:03:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1.Shell介绍
2.命令历史
3.命令补全和别名
4.通配符
5.输入输出重定向
系统运维
2019-11-12 14:38:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
序号 题目 需求 操作
1 配置SELinux
system1 & system2
要求SELinux的工作模式为enforcing,且重启依然有效 vim /etc/selinux/config
SELINUX= enforcing
setenforce 1
getenforce
2 配置SSH访问
system1 & system2
允许 group8.example.com 域的客户对 system1 和 system2 进行 ssh 访问
禁止 my133t.org 域的客户对 system1 和 system2 进行 ssh 访问
备注: my133t.org 是在 172.13.8.0/24 网络
firewall-config
firewall-cmd --list-all
3 自定义用户环境
system1 & system2
在系统system1和system2上创建自定义命令为qstat ,要求:
此自定义命令将执行以下命令:/bin/ps -Ao pid,tt,user,fname,rsz
此命令对系统中的所有用户有效
vim /etc/profile
alias qstat='/bin/ps -Ao pid,tt,user,fname,rsz'
source /etc/profile
qstat
4 配置端口转发
system1
在 172.24.8.0/24 网络中的系统,访问system1的本地端口 5423 将被转发到 80
此设置必须永久有效
firewall-config
firewall-cmd --list-all
题目已经明确源IP,建议使用firewall富规则配置
5 配置链路聚合
system1 & system2
此链路使用接口eth1和eth2
此链路在一个接口失效时仍然能工作
此链路在system1使用下面的地址172.16.3.40/255.255.255.0
此链路在system2使用下面的地址172.16.3.45/255.255.255.0
此链路在系统重启之后依然保持正常状态
nm-connection-editor
JSON配置: {"runner":{"name":"activebackup"}}
6 配置IPv6地址
system1 & system2
system1上的地址应该是2003:ac18::305/64
system2上的地址应该是2003:ac18::30a/64
两个系统必须能与网络2003:ac18/64内的系统通信
地址必须在重启后依然生效
两个系统必须保持当前的IPV4地址并能通信
nm-connection-editor
ping6 2003:ac18::305
ping6 2003:ac18::30a
7.1 配置本地邮件服务
system1 & system2
这些系统不接收外部发送来的邮件 vim /etc/postfix/main.cf
local_transport = error:local →新增100行
inet_interfaces = loopback-only →修改116行
7.2 从这些系统上发送的邮件显示来自于server.group8.example.com myorigin = server.group8.example.com →修改99行
7.3 在这些系统上本地发送的任何邮件都会自动路由到mail.group8.example.com relayhost = [mail.group8.example.com] →修改313行
7.4 重启postfix相关服务,并将服务加入到开机启动项 systemctl restart postfix
systemctl enable postfix
7.5 测试验证 mail dave
8.1 配置SMB共享目录
system1
安装samba服务 yum install -y samba samba-client
8.2 创建SMB共享目录 mkdir /common
8.3 修改SMB目录SELinux上下文安全域 chcon -R -t samba_share_t /common/
8.4 您的SMB服务器必须是STAFF工作组的一个成员 vim /etc/samba/smb.conf
workgroup = STAFF
8.5 共享/common目录,共享名必须为common
只有group8.example.com 域内的客户端可以访问common共享
共享目录/common必须是可以浏览的
[common]
path = /common
hosts allow = 172.24.8.
browseable = yes
8.6 用户andy必须能够读取共享中的内容,如果需要的话,验证密码是redhat smbpasswd -a andy
8.7 配置防火墙策略 firewall-cmd --permanent --add-service=samba
firewall-cmd --reload
8.8 重启SMB相关服务,并将服务加入到开机启动项 systemctl restart smb nmb
systemctl enable smb nmb
9.1 配置多用户SMB挂载
system1
在system1通过SMB共享目录/devops ,并满足下列要求: mkdir /devops
9.2 修改SMB目录SELinux上下文安全域 chcon -R -t samba_share_t /devops/
9.3 配置用户akira目录/devops读写权限 setfacl -m u:akira:rwx /devops/
9.4 共享名为devops
共享目录devops只能group8.example.com域中的客户端使用
共享目录devops必须可以被浏览
用户silene必须能以读的方式访问此共享,访问密码是redhat
用户akira必须能以读写的方式访问此共享,访问密码是redhat
vim /etc/samba/smb.conf
[devops]
path = /devops
hosts allow = 172.24.8.
browseable = yes
writable = no
write list = akira
9.5 创建SMB用户 smbpasswd -a silene
smbpasswd -a akira
9.6 重启SMB相关服务,并将服务加入到开机启动项 systemctl restart smb nmb
systemctl enable smb nmb
9.8 配置多用户SMB挂载
system2
安装SMB相关客户端服务 yum install -y samba-client cifs-utils
9.9 查看system1的SMB共享 smbclient -L //172.24.8.11/ -U silene
9.10 此共享永久挂载在system2.group8.example.com上的/mnt/dev 目录 mkdir /mnt/dev
9.11 并使用用户silene作为认证任何用户,可以通过用户akira来临时获取写的权限 vim /etc/fstab
//172.24.8.11/devops /mnt/dev cifs defaults,multiuser,username=silene,password=redhat,sec=ntlmssp 0 0
9.12 挂载/etc/fstab中所有文件系统 mount -a
df -h
9.13 测试验证,用户akira可读写 su - akira
cd /mnt/dev
cifscred add 172.24.8.11
touch 123
9.14 测试验证,用户silene只读 su - silene
cd /mnt/dev
cifscred add 172.24.8.11
cat 123
touch 456
10.1 配置NFS服务
system1
安装NFS服务 yum install -y nfs-utils
10.2 以只读的方式共享目录/public mkdir /public
10.3 以读写的方式共享目录/protected,目录/protected应该包含名为project mkdir -p /protected/project
10.4 子目录project所有者为andres
andres能以读写方式访问/protected/project
chown andres /protected/project
ls -ld /protected/project
10.5 修改SELinux上下文安全域 chcon -R -t public_content_t /public/
chcon -R -t public_content_t /protected/
10.6 访问/protected需要通过Kerberos安全加密,您可以使用下面URL提供的密钥
http://server.group8.example.com/pub/keytabs/system1.keytab
wget -O /etc/ krb5.keytab http://server.group8.example.com/pub/keytabs/ system1 .keytab
vim /etc/sysconfig/nfs
RPCNFSDARGS="-V 4.2"
10.7 NFS只读目录/public,只能被group8.example.com域中的系统访问
NFS读写目录/protected,只能被group8.example.com域中的系统访问
vim /etc/exports
/public 172.24.8.0/24(ro)
/protected 172.24.8.0/24(rw, sec=krb5p )
10.8 配置防火墙策略 firewall-cmd --permanent --add-service= nfs
firewall-cmd --permanent --add-service= rpc-bind
firewall-cmd --permanent --add-service= mountd
firewall-cmd --reload
10.9 重启NFS相关服务,并将服务加入到开机启动项
刷新并重新加载NFS配置
systemctl restart nfs-server rpcbind nfs-secure-server
systemctl enable nfs=server rpcbind
exportfs -ra
版本若为7.0,则执行以下操作:
systemctl restart nfs-server rpcbind nfs-secure-server
systemctl enable nfs=server rpcbind nfs-secure-server
exportfs -ra
11.1 挂载一个NFS共享
system2
检查system1 NFS共享状态 showmount -e 172.24.8.11
11.2 /public挂载到目录/mnt/nfsmount mkdir /mnt/nfsmount
11.3 /protected挂载到目录/mnt/nfssecure mkdir /mnt/nfssecure
11.4 挂载/protected需要使用安全的方式,密钥下载URL如下:
http://server.group8.example.com/pub/keytabs/system2.keytab
wget -O /etc/krb5.keytab http://server.group8.example.com/pub/keytabs/system2.keytab
11.5 这些文件系统在系统启动时自动挂载 vim /etc/fstab
172.24.8.11:/public /mnt/nfsmount nfs defaults 0 0
172.24.8.11:/protected /mnt/nfssecure nfs4 defautls, sec=krb5p 0 0
版本若为7.0,则执行以下操作:
vim /etc/fstab
172.24.8.11:/public /mnt/nfsmount nfs defaults 0 0
172.24.8.11:/protected /mnt/nfssecure nfs defautls,sec=krb5p, v4.2 0 0
11.6 重启NFS相关服务,并将服务加入到开机启动项 systemctl restart nfs-secure nfs-client.target
systemctl enable nfs-client.target
版本若为7.0,则执行以下操作:
systemctl restart nfs-secure
systemctl enable nfs-secure
11.7 挂载/etc/fstab中所有文件系统 mount -a
df -h
11.8 测试验证 su - andres
kinit
cd /mnt/nfssecure/project/
touch 123
12.1 实现一个Web服务器
system1
安装HTTPD服务 yum install -y httpd
12.2 拷贝HTTPD配置文件模板到配置文件目录 cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/conf.d/
12.3 编辑HTTPD配置文件 vim /etc/httpd/conf.d/httpd-vhosts.conf

DocumentRoot "/var/www/html"
ServerName system1.group8.example.com
12.4 从http://server.group8.example.com/pub/system1.html 下载文件,并且将文件重名为index.html不要修改此文件的内容 wget -O /var/www/html/index.html http://server.group8.example.com/pub/system1.html
12.5 配置防火墙策略 firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
12.6 重启httpd相关服务,并将服务加入到开机启动项 systemctl restart httpd
systemctl enble httpd
12.7 来自于my133t.org域的客户端拒绝访问此web服务 firewall-config
firewall-cmd --list-all
13.1 配置安全Web服务
system1
安装HTTPS模块 yum install -y mod_ssl
13.2 下载公钥、私钥和证书到/var/www/html目录 cd /var/www/html
wget http://***.crt
wget http://***.key
wget http://***ca.crt
13.3 提取SSL配置模板参数 grep SSL /etc/httpd/conf.d/ssl.conf > /etc/httpd/conf.d/ssl
vim /etc/httpd/conf.d/ssl
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
SSLHonorCipherOrder on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
13.4 编辑HTTPD配置文件 vim /etc/httpd/conf.d/httpd-vhosts.conf

DocumentRoot "/var/www/html"
ServerName system1.group8.example.com
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLHonorCipherOrder on
SSLCertificateFile /var/www/html/system1.crt
SSLCertificateKeyFile /var/www/html/system1.key
SSLCACertificateFile /var/www/html/ssl-ca.crt
13.5 重启httpd相关服务,并将服务加入到开机启动项 systemctl restart httpd
systemctl enble httpd
13.6 来自于my133t.org域的客户端拒绝访问此web服务 firewall-config
firewall-cmd --list-all
14.1 配置虚拟主机
system1
设置DocumentRoot 为 /var/www/virtual mkdir /var/www/virtual
14.2 从http://server.group8.example.com/pub/www8.html下载文件重名为 index.html ,不要对文件 index.html 的内容做任何修改 wget -O /var/www/virtual/index.html http://server.group8.example.com/pub/www8.html
14.3 确保andy用户能够在/var/www/virtual 目录下创建文件 setfacl -m u:andy:rwx /var/www/virtual/
14.4 并将文件index.html放到虚拟主机的DocumentRoot目录下,并编辑HTTPD配置文件 vim /etc/httpd/conf.d/httpd-vhosts.conf

DocumentRoot "/var/www/virtual"
ServerName www8.group8.example.com
14.5 重启httpd相关服务,并将服务加入到开机启动项 systemctl restart httpd
systemctl enble httpd
15.1 配置Web内容访问
system1
在您的system1上的web服务器的DocumentRoot目录下,创建一个名为private的目录 mkdir html/private
mkdir virtual/private
15.2 从http://server.group8.example.com/pub/private.html下载一个文件副本到这个目录,并且重命名为 index.html wget -O /var/www/html/private/index.html http://server.group8.example.com/pub/private.html
wget -O /var/www/virtual/private/index.html http://server.group8.example.com/pub/private.html
15.3 参考httpd主配置文件,摘取内容访问控制配置模板 cat /etc/httpd/conf/httpd.conf

AllowOverride none
Require all denied
15.4 从 system1 上,任何人都可以浏览 private 的内容,但是从其它系统不能访问这个目录的内容。 /etc/httpd/conf.d/httpd-vhosts.conf

AllowOverride none
Require all denied
Require local


AllowOverride none
Require all denied
Require local
15.5 重启httpd相关服务,并将服务加入到开机启动项 systemctl restart httpd
systemctl enble httpd
16.1 实现动态Web内容
system1
安装HTTPD动态脚本模块mod_wsgi yum install -y mod_wsgi
16.2 创建动态脚本目录,并下载动态脚本 mkdir /var/www/wsgi/
cd /var/www/wsgi/
wget http://server.group8.example.com/pub/webinfo.wsgi
16.3 虚拟主机侦听在端口8909,编辑httpd配置文件 vim /etc/httpd/conf.d/httpd-vhosts.conf
Listen 8909

ServerName wsgi.group8.example.com
WSGIScriptAlias / /var/www/wsgi/webinfo.wsgi
16.4 配置SELinux安全端口 semanage port -l | grep http
semanage port -a -t http_port_t -p tcp 8909
16.5 配置防火墙策略,开放TCP 8909端口 firewall-cmd --permanent --add-port=8909/tcp
firewall-cmd --reload
16.6 重启httpd相关服务,并将服务加入到开机启动项 systemctl restart httpd
systemctl enble httpd
17 创建一个脚本
system1
创建脚本
注意最后脚本文件需要赋予755权限
#! /bin/bash
case $1 in
redhat)
echo fedora
;;
fedora)
echo redhat
;;
*)
echo '/root/foo.sh redhat | fedora'
;;
esac
18.1 创建添加用户的脚本
system1
下载用户清单文件 cd /root
wget http://server.group8.example.com/pub/userlist
18.2 创建脚本
注意最后脚本文件需要赋予755权限
#! /bin/bash
if [ $# -eq 0 ]; then
echo 'Usage: /root/batchusers userfile'
exit 1
fi
if [ ! -f $1 ]; then
echo 'Input file not found'
exit 1
fi
while read line
do
useradd -s /bin/false $line
done < $1
19.1 配置iscsi服务端
system1
创建LVM逻辑卷iscsi_store
使用 iscsi_store 作其后端逻辑卷名称,其大小为 3G
fdisk /dev/sda, 划分出3G逻辑分区
pvcreat /dev/sda6
vgcreat iscsi_vg /dev/sda6
lvcreat -l 100%VG -n iscsi_store iscsi_vg
19.2 安装iscsi yum install -y targetd targetcli
19.3 配置iscsi服务端 targetcli
cd /backstores/block
creat disk0 /dev/iscsi_vg/iscsi_store
cd /iscsi
creat iqn.2014-08.com.example.group8:system1
cd iqn.2014-08.com.example.group8:system1/ tpg1/luns
create /backstores/block/disk0
cd iqn.2014-08.com.example.group8:system1/ tpg1/acls
create iqn.2014-08.com.example.group8: system2
cd iqn.2014-08.com.example.group8:system1/ tpg1/portals
delete 0.0.0.0 3260
create 172.24.8.11
exit
19.4 重启iscsi服务,并加入到开机启动项 systemctl restart target
systemctl enable target
19.5 此服务只能被 system2.group8.example.com 访问 firewall-config 开通仅允许system2访问3260端口
20.1 配置iscsi客户端
system2
安装iscsi客户端服务程序,RHEL7默认已经安装 yum install -y iscsi-initiator-utils
20.2 扫描发现system1的iscsi服务 iscsiadm -m discovery -t st -p 172.24.8.11
20.3 编辑iscsi客户端服务配置文件 vim /etc/iscsi/initiatorname.iscsi
20.4 重启iscsi客户端服务,并加入到开机启动项 systemctl restart iscsi iscsid
systemctl enable iscsi iscsid
20.5 登录system1的iscsi服务 iscsiadm -m node -T iqn.2014-08.com.example.group8:system2 -p 172.24.8.11 --login
20.6 块设备 iSCISI 上包含一个大小为 2100 MiB 的分区,并格式化为 ext4 fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
20.7 此分区挂载在 /mnt/data 上,创建目录 mkdir /mnt/data
20.8 同时在系统启动的期间自动挂载,编辑fstab文件
注意:一定要用UUID挂载,lsblk,blkid
vim /etc/fstab
UUID=****** /mnt/data ext4 defaults, _netdev 0 0
20.9 挂载iscsi mount -a
df -h
21.1 配置一个数据库
system1
安装mariaDB yum install -y mariadb*
21.2 数据库只能被 localhost 访问,修改数据库配置文件 vim /etc/my.conf
skip-networking=1
21.3 重启数据库服务,并加入到开机启动项 systemctl restart mariadb
systemctl enable mariadb
21.4 下载需要恢复的数据库文件 cd /root
wget http://server.group8.example.com/pub/users.mdb
21.5 进入数据库,创建数据库,并恢复数据库表文件
在 system1上创建一个 Maria DB 数据库,名为 Contacts
mysql -u root -p
create database Contacts;
show databases;
use Contacts;
source /root/users.mdb;
21.6
21.7
除了 root 用户,此数据库只能被用户 Mary 查询,此用户密码为 redhat
初始化数据库,root 用户的数据库密码为 redhat ,同时不允许空密码登录
grant select on Contacts.* to Mary @localhost identified by 'redhat';
mysql_secure_installation
系统运维
2019-11-12 14:11:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Step 1.创建一个目录来存储服务器密钥 & 证书 $ mkdir /usr/local/nginx/conf/vhost/sslkey
Step 2. 生成CSR
说明:会提示填:1.国家 2.省份 3.城市 4.公司名称....等,填完后会生成 sasha-lab.csr sasha-lab.key这两个文件 $ openssl req -new -newkey rsa:2048 -nodes -keyout sasha-lab.key -out sasha-lab.csr
Step 3.将sasha-lab.csr 复制到godaddy (1.点开Rekey & Manage 2.点开Re-Key certificate将 sasha-lab.csr 内容复制到框框里,保存即可)
Step 4.下载ssl证书(选择Apache)
Step 5. 把下载的ssl证书上传服务器 & 解压证书
Step 6.合并证书 $ cat f84e19a2f44c6386.crt gd_bundle-g2-g1.crt >> sasha-lab.crt

Step 7.配置nginx server { listen 80; server_name coolexample.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name coolexample.com; ssl_certificate /usr/local/nginx/conf/vhost/sslkey/sasha-lab.crt; ssl_certificate_key /usr/local/nginx/conf/vhost/sslkey/sasha-lab.key; root /usr/share/nginx/coolexample.com/; index index.php index.html index.htm; }
系统运维
2019-11-12 11:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
简介
Kafka是基于发布订阅的消息系统。最初起源于LinkedIn,于2011年成为开源Apache项目,然后于2012年成为Apache顶级项目。Kafka用Scala和Java编写,因其分布式可扩展架构及可持久化、高吞吐率特征而被广泛使用。
消息队列
通常在项目中,我们会因为如下需求而引入消息队列模块:
1.解耦:消息系统相当于在处理过程中间插入了一个隐含的、基于数据的接口层。无需预先定义不同的接口地址和请求应答规范,这允许数据上下游独立决定双方的处理过程,只需要约定数据格式即可任意扩展服务类型和业务需求。
2.缓冲:消息系统作为一个缓冲池,应对常见的访问量不均衡情形。比如特殊节假日的流量剧增和每日不同时段的访问量差异。以及处理不同数据类型所需的不同实时性。使整个业务处理架构以较低成本获得一定灵活性。
3. 异步:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
Kafka的特点
作为一种分布式的,基于发布/订阅的消息系统。Kafka的主要设计目标如下:
1.以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能。
2.高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。
3.支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输。
4.同时支持离线数据处理和实时数据处理。
5.支持在线水平扩展。
Kafka体系架构
如上图所示,一个典型的Kafka体系架构包括若干Producer(可以是服务器日志,业务数据,页面前端产生的page view等等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干Consumer (Group),以及一个Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。
名词解释:
Topic & Partition
一个topic可以认为一个一类消息,每个topic将被分成多个partition,每个partition在存储层面是append log文件。任何发布到此partition的消息都会被追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型的数字,它唯一标记一条消息。每条消息都被append到partition中,顺序写磁盘因此效率非常高。这是Kafka高吞吐率的重要基础。
Producer发送消息到broker时,会根据Paritition机制选择将其存储到哪一个Partition。如果Partition机制设置合理,所有消息可以均匀分布到不同的Partition里,这样就实现了负载均衡。如果一个Topic对应一个文件,那这个文件所在的机器I/O将会成为这个Topic的性能瓶颈,而有了Partition后,不同的消息可以并行写入不同broker的不同Partition里,极大的提高了吞吐率。可以通过配置项num.partitions来指定新建Topic的默认Partition数量,也可在创建Topic时通过参数指定,同时也可以在Topic创建之后通过Kafka提供的工具修改。
Kafka的复制机制
Kafka 中的每个主题分区都被复制了 n 次,其中的 n 是主题的复制因子(replication factor)。这允许 Kafka 在集群服务器发生故障时自动切换到这些副本,以便在出现故障时消息仍然可用。Kafka 的复制是以分区为粒度的,分区的预写日志被复制到 n 个服务器。 在 n 个副本中,一个副本作为 leader,其他副本成为 followers。顾名思义,producer 只能往 leader 分区上写数据(读也只能从 leader 分区上进行),followers 只按顺序从 leader 上复制日志。
日志复制算法(log replication algorithm)必须提供的基本保证是,如果它告诉客户端消息已被提交,而当前 leader 出现故障,新选出的 leader 也必须具有该消息。在出现故障时,Kafka 会从失去 leader 的 ISR 里面选择一个 follower 作为这个分区新的 leader ;换句话说,是因为这个 follower 是跟上 leader 写进度的。
每个分区的 leader 会维护一个 ISR。当 producer 往 broker 发送消息,消息先写入到对应 leader 分区上,然后复制到这个分区的所有副本中。只有将消息成功复制到所有同步副本(ISR)后,这条消息才算被提交。由于消息复制延迟受到最慢同步副本的限制,因此快速检测慢副本并将其从 ISR 中删除非常重要。 Kafka 复制协议的细节会有些细微差别。
Kafka的同步机制
Kafka不是完全同步,也不是完全异步,而是一种ISR(In-Sync Replicas)机制:
1. leader会维护一个与其基本保持同步的Replica列表,该列表称为ISR,每个Partition都会有一个ISR,而且是由leader动态维护 。
2. 如果一个follower比一个leader落后太多,或者超过一定时间未发起数据复制请求,则leader将其从ISR中移除
3. 当ISR中所有Replica都向Leader发送ACK时,leader才commit,这时候producer才能认为一个请求中的消息都commit了。
Kafka提供了数据复制算法保证,如果leader发生故障或挂掉,一个新leader被选举并被接受客户端的消息成功写入。Kafka确保从同步副本列表中选举一个副本为leader,或者说follower追赶leader数据。leader负责维护和跟踪ISR中所有follower滞后的状态。当producer发送一条消息到broker后,leader写入消息并复制到所有follower。消息提交之后才被成功复制到所有的同步副本。消息复制延迟受最慢的follower限制,重要的是快速检测慢副本,如果follower“落后”太多或者失效,leader将会把它从ISR中删除。
消息传输保障
前面已经介绍了Kafka如何进行有效的存储,以及了解了producer和consumer如何工作。接下来讨论的是Kafka如何确保消息在producer和consumer之间传输。有以下三种可能的传输保障(delivery guarantee):
At most once: 消息可能会丢,但绝不会重复传输
At least once:消息绝不会丢,但可能会重复传输
Exactly once:每条消息肯定会被传输一次且仅传输一次
Kafka的消息传输保障机制非常直观。当producer向broker发送消息时,一旦这条消息被commit,由于副本机制(replication)的存在,它就不会丢失。但是如果producer发送数据给broker后,遇到的网络问题而造成通信中断,那producer就无法判断该条消息是否已经提交(commit)。虽然Kafka无法确定网络故障期间发生了什么,但是producer可以retry多次,确保消息已经正确传输到broker中,所以目前Kafka实现的是at least once。consumer从broker中读取消息后,可以选择commit,该操作会在Zookeeper中存下该consumer在该partition下读取的消息的offset。该consumer下一次再读该partition时会从下一条开始读取。如未commit,下一次读取的开始位置会跟上一次commit之后的开始位置相同。当然也可以将consumer设置为autocommit,即consumer一旦读取到数据立即自动commit。如果只讨论这一读取消息的过程,那Kafka是确保了exactly once, 但是如果由于前面producer与broker之间的某种原因导致消息的重复,那么这里就是at least once。考虑这样一种情况,当consumer读完消息之后先commit再处理消息,在这种模式下,如果consumer在commit后还没来得及处理消息就crash了,下次重新开始工作后就无法读到刚刚已提交而未处理的消息,这就对应于at most once了。读完消息先处理再commit。这种模式下,如果处理完了消息在commit之前consumer crash了,下次重新开始工作时还会处理刚刚未commit的消息,实际上该消息已经被处理过了,这就对应于at least once。
要做到exactly once就需要引入消息去重机制。Kafka文档中提及GUID(Globally Unique Identifier)的概念,通过客户端生成算法得到每个消息的unique id,同时可映射至broker上存储的地址,即通过GUID便可查询提取消息内容,也便于发送方的幂等性保证,需要在broker上提供此去重处理模块,目前版本尚不支持。针对GUID, 如果从客户端的角度去重,那么需要引入集中式缓存,必然会增加依赖复杂度,另外缓存的大小难以界定。不只是Kafka, 类似RabbitMQ以及RocketMQ这类商业级中间件也只保障at least once, 且也无法从自身去进行消息去重。所以我们建议业务方根据自身的业务特点进行去重,比如业务消息本身具备幂等性,或者借助Redis等其他产品进行去重处理。
Kafka作为消息队列:
传统的消息有两种模式:队列和发布订阅。 在队列模式中,消费者池从服务器读取消息(每个消息只被其中一个读取); 发布订阅模式:消息广播给所有的消费者。这两种模式都有优缺点,队列的优点是允许多个消费者瓜分处理数据,这样可以扩展处理。但是,队列不像多个订阅者,一旦消息者进程读取后故障了,那么消息就丢了。而发布和订阅允许你广播数据到多个消费者,由于每个订阅者都订阅了消息,所以没办法缩放处理。
kafka中的Consumer Group有两种形式:
a、队列:允许同名的消费者组成员共同处理。
b、发布订阅:广播消息给多个消费者组。
kafka的每个topic都具有这两种模式。
传统的消息系统按顺序保存数据,如果多个消费者从队列消费,则服务器按存储的顺序发送消息,但是,尽管服务器按顺序发送,多个并行请求将会是异步的,因此消息可能乱序到达。这意味着只要消息存在并行消费的情况,顺序就无法保证。消息系统常常通过仅设1个消费者来解决这个问题,但是这意味着没用到并行处理。
kafka有比传统的消息系统更强的顺序保证。通过并行topic的parition,kafka提供了顺序保证和负载均衡。每个partition仅由同一个消费者组中的一个消费者消费到。并确保消费者是该partition的唯一消费者,并按顺序消费数据。每个topic有多个分区,则需要对多个消费者做负载均衡,但请注意,相同的消费者组中不能有比分区更多的消费者,否则多出的消费者一直处于空等待,不会收到消息。
Kafka作为存储系统
所有发布消息到消息队列和消费分离的系统,实际上都充当了一个临时存储系统。Kafka还是一个非常高性能的存储系统。写入到kafka的数据将写到磁盘并复制到集群中保证容错性。并允许生产者等待消息应答,直到消息完全写入。kafka的存储结构保证无论服务器上有50KB或50TB数据,执行效率是相似的,因此可达到水平扩展的目标。还可以认为kafka是一种专用于高性能,低延迟,提交日志存储,复制,和传播特殊用途的分布式文件系统。
Kafka流处理
Kafka的更高目标是实时流处理。在kafka中,流处理持续获取输入topic的数据,进行处理加工,然后写入输出topic。例如,一个零售APP,接收销售和出货的输入流,统计数量或调整价格后输出。
简单的需求可以直接使用producer和consumer API进行处理。对于复杂的转换,Kafka提供了更强大的Streams API。可构建聚合计算或连接流到一起的复杂应用程序。
综上所述,Kafka 的设计可以帮助我们解决很多架构上的问题。但是想要用好 Kafka 的高性能、低耦合、高可靠性等特性,我们需要非常了解 Kafka,以及我们自身的业务需求,综合考虑应用场景。
系统运维
2019-11-12 11:22:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.1.128 NETMASK=255.255.255.0 GATEWAY=192.168.1.2 DNS1=192.168.1.2
service network restart

设置静态IP脚本:setIP.sh
它的参数就是要设置的IP,如./setIP.sh 192.168.1.1 #!/bin/sh FILE="/etc/sysconfig/network-scripts/ifcfg-ens33" TEXT="TYPE=Ethernet\n\ PROXY_METHOD=none\n\ BROWSER_ONLY=no\n\ BOOTPROTO=static\n\ DEFROUTE=yes\n\ IPV4_FAILURE_FATAL=no\n\ IPV6INIT=yes\n\ IPV6_AUTOCONF=yes\n\ IPV6_DEFROUTE=yes\n\ IPV6_FAILURE_FATAL=no\n\ IPV6_ADDR_GEN_MODE=stable-privacy\n\ NAME=ens33\n\ DEVICE=ens33\n\ ONBOOT=yes\n\ IPADDR=192.168.119.150\n\ NETMASK=255.255.255.0\n\ GATEWAY=192.168.119.2\n\ DNS1=192.168.119.2" IPADDR="IPPADDR=$1" IPADDR=$1 _ckIPaddr () { ckStep1=`echo $1 | awk -F"." '{print NF}'` if [ $ckStep1 -eq 4 ] || [ $ckStep1 -eq 6 ] then ckStep2=`echo $1 | awk -F"." '{if ($1!=0 && $NF!=0) split ($0,IPNUM,".")} END \ { for (k in IPNUM) if (IPNUM[k]==0) print IPNUM[k]; else if (IPNUM[k]!=0 && IPNUM[k]!~/[a-z|A-Z]/ && length(IPNUM[k])<=3 && IPNUM[k]<255 && IPNUM[k]!~/^0/) print IPNUM[k]}'| wc -l` if [ $ckStep2 -eq $ckStep1 ] then echo 0 else echo 1 fi else echo 1 fi } CK_IPADDR=`_ckIPaddr $IPADDR` if [ $CK_IPADDR -eq 1 ] then echo "The string $IPADDR is not a correct ipaddr!!!" exit 1 fi echo "" > $FILE echo -e $TEXT > $FILE IPADDRSTR="IPADDR="$IPADDR echo -e $IPADDRSTR >> $FILE echo "NETMASK=255.255.255.0" >> $FILE GATEWAY="GATEWAY=" DNS1="DNS1=" sum=0 IPADDR=${IPADDR//./ } for element in $IPADDR do let "sum++" if [ $sum -ge 4 ];then break fi GATEWAY=$GATEWAY$element"." DNS1=$DNS1$element"." done GATEWAY=$GATEWAY"2" DNS1=$DNS1"2" echo -e $GATEWAY >> $FILE echo -e $DNS1 >> $FILE service network restart

系统运维
2019-11-12 11:30:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
概述
随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址……
对程序配置的期望值也越来越高:配置修改后实时生效,分环境、分集群管理配置,代码安全、审核机制……
在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。
所以,配置中心应运而生。
环境简介
目前公司使用阿里云管理所有服务,原因是为了降低运维成本——傻瓜式运维。
服务部署使用edas,配置管理使用acm。
调研目的
将所有代码中的基础依赖(如数据库、分布式存储等)相关配置回收到配置中心(acm或其他开源工具)管理,提升安全性,使资源可复用,减少因版本差异带来的开发工作量。
方案比较
方案 优点 缺点 备注
edas-acm
第三方
运维介入少,便于维护
扩容方便
扩容不方便,每次扩容都要重新为ecs实例单独授权,授权期间扩容实例服务不可用(4xx、5xx)
运维成本较高(服务器、人力),负载能力、稳定性待验证
edas团队有优化计划,但目前无排期

第三方配置中心产品 Disconf:百度开源的配置管理中心, 目前已经不维护了 Spring Cloud Config: Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。 Apollo: 携程开源的配置管理中心,具备规范的权限、流程治理等特性。 Nacos: 阿里开源的配置中心,也可以做DNS和RPC的服务发现。
由于Disconf不再维护,下面对比一下Spring Cloud Config、Apollo和Nacos。
产品功能特点比较
功能点 Spring Cloud Config Apollo Nacos
开源时间 2014.9 2016.5 2018.6
配置实时推送 支持(Spring Cloud Bus) 支持(HTTP长轮询1S内) 支持(HTTP长轮询1S内)
版本管理 支持(Git) 支持 支持
配置回滚 支持(Git) 支持 支持
灰度发布 支持 支持 待支持
权限管理 支持 支持 待支持
多集群 支持 支持 支持
多环境 支持 支持 支持
监听查询 支持 支持 支持
多语言 只支持java Go、C++、java、Python、PHP、.net、OpenAPI Python、Java、Node.js、OpenAPI
单机部署 Config-server+Git+Spring Cloud Bus(支持配置实时推送) Apollo-quikstart+MySQL Nacos单节点
分布式部署 Config-server+Git+MQ(部署复杂) Config+Admin+Portal+MySQL(部署复杂) Nacos+MySQL(部署简单)
配置格式校验 不支持 支持 支持
通信协议 HTTP和AMQP HTTP HTTP
数据一致性 Git保证数据一致性,Config-server从Git读数据 数据库模拟消息队列,Apollo定时读消息 HTTP异步通知
单机读 7(限流所致) 9000 15000
单机写 5(限流所致) 1100 1800
3节点读
3节点写 文档
21(限流所致)
5(限流所致) 详细
27000
3300 详细
45000
5600 有待完善(目前只有java开发相关文档)
说明: 压测环境: Nacos和Apollo使用同样的数据库(32C128G) 部署Server服务的机器使用的8C16G配置的容器,磁盘是100G SSD。 Spring Cloud Config使用2.0.0.M9版本,Apollo使用1.2.0 release版本,Nacos使用0.5版本。 Spring Cloud Config 依赖git,使用局限性较大。
调研结果
首先会进一步跟进阿里云edas优化的排期,但是眼下好像是很渺茫... ...
其次,如果接入开源配置中心,根据以上数据分析,建议使用Apollo(功能完善,但是配置复杂)或nacos(功能简单,配置简单,能满足要求,但是文档不够丰富)。
参考文档 Apollo wiki nacos手册 Spring Cloud Config
剧终
最终还是选择等待阿里云做优化了...
吐槽: 时间都浪费在LD的犹豫和不明确表达需求上...
请关注,楼主公众号!
系统运维
2019-11-12 11:03:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
导读
Nginx作为一个轻量级的HTTP服务器,相比Apache优势也是比较明显的,在性能上它占用资源少,能支持更高更多的并发连接,从而达到提高访问效率;在功能上它是一款非常优秀的代理服务器与负载均衡服务器;在安装配置上它安装,配置都比较简单。

关于Nginx部署、配置的文章公众号已经发布过很多:
深度总结|深入浅出Nginx
HTTP服务器Nginx服务介绍续
Nginx优化配置详解
1分钟搞定 Nginx 版本的平滑升级与回滚
指南:提高Nginx服务器硬度的12个技巧
大流量、高负载场景 Nginx+ Linux 性能调优
利用ELK分析Nginx日志生产实战(高清多图)
文章很多,就不再逐一列举了,有兴趣的、需要的可以去公众号通过检索功能查找相关的文章。
对于Nginx一些配置的详细解释,之前也写过相关的文章:
Nginx优化配置详解
但在实际的生产配置环境中,肯定会经常遇到需要修改、或者重新增加Nginx配置的问题,有的时候需求更是多种多样,修修改改经常会出现这样、那样的一些错误,特别的烦索。
基于以上的原因,肯定很多读者伙伴经常会收集一些配置文档、或者电脑里也保存着一些自己日常的常用配置案例,但是终究还是不是很便利。今天,民工哥给大家介绍一款「超级牛掰的神器」,可以在线一键生成Nginx的配置。
NGINX Config 支持 HTTP、HTTPS、PHP、Python、Node.js、WordPress、Drupal、缓存、逆向代理、日志等各种配置选项。在线生成 Web 服务器 Nginx 配置文件。
操作配置也非常简单,你需要做的只需要2步: 打开官方网站
按需求配置相关参数
系统就会自动生成特定的配置文件。虽然界面是英文的,但是功能的页面做的非常直观,生成的Nginx格式规范。
登陆之后大概的界面如下:
配置域名:mingongge.com 实现用户访问*.mingongge.com 域名时会自动跳转到 mingongge.com 此配置,并且开启http强制跳转到https的配置。

这时,Nginx的配置就会实时自动生成在下面,我把生成的配置复制过来,如下: /etc/nginx/sites-available/mingongge.com.conf #文件名都给你按规则配置好了 server { listen 443 ssl http2; server_name mingongge.com; # SSL ssl_certificate /etc/letsencrypt/live/mingongge.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mingongge.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/mingongge.com/chain.pem; # security include nginxconfig.io/security.conf; # additional config include nginxconfig.io/general.conf; } # subdomains redirect server { listen 443 ssl http2; server_name *.mingongge.com; # SSL ssl_certificate /etc/letsencrypt/live/mingongge.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mingongge.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/mingongge.com/chain.pem; return 301 https://mingongge.com$request_uri; } # HTTP redirect server { listen 80; server_name .mingongge.com; include nginxconfig.io/letsencrypt.conf; location / { return 301 https://mingongge.com$request_uri; } }
非常的方便与快速。
官方还提供一些Nginx的基础优化配置,如下: /etc/nginx/nginx.conf # Generated by nginxconfig.io user www-data; pid /run/nginx.pid; worker_processes auto; worker_rlimit_nofile 65535; events { multi_accept on; worker_connections 65535; } http { charset utf-8; sendfile on; tcp_nopush on; tcp_nodelay on; server_tokens off; log_not_found off; types_hash_max_size 2048; client_max_body_size 16M; # MIME include mime.types; default_type application/octet-stream; # logging access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log warn; # load configs include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
还有基于安全的配置,如下: /etc/nginx/nginxconfig.io/security.conf # security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always; # . files location ~ /\.(?!well-known) { deny all; }
都相当于是提供一些基础的模板配置,可以根据自己的实际需求去修改。
有了这个神器在手,再也不用为配置Nginx的各类配置而烦恼了!!民工哥也不敢私藏这么好的神器在手里,今天给大家分享一下,感觉有帮助的读者朋友们记得转发分享出去哦,感谢支持!!! 原文来自: https://www.linuxprobe.com/nginx-online-configuration.html
系统运维
2019-11-12 08:43:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
查看系统负载: w/uptime 最后面三个数字表示1分钟,5分钟,15分钟平均有多少个进程占用CPU 占用CPU的进程可以是Running,也可以是Waiting 某一时刻1颗CPU只能有一个进程在使用其资源 #查看cpu信息:lscpu或cat /proc/cpuinfo
top命令: top 回车就可以进入到top界面 每3秒刷新一次 默认按cpu百分比排序,可以按M键按照内存使用率大小排序 按数字1,可以显示所有CPU使用率详情
top -bn1 静态显示所有进程的情况,也是按cpu百分比排序 静态显示进程信息,方便在shell脚本中使用top命令
free命令: free查看内存和swap使用情况,关注最后一列的available,这个数字是真正剩余的物理内存大小 free -k -m -g -h
手动增加swap:(厂商为了避免影响磁盘性能,购买云服务器一般没有swap空间) dd if=/dev/zero of=/newswap bs=1M count=1000 mkswap /newswap #格式化 chmod 600 /newswap #变更权限(为了安全) swapon /newswap #挂载
监控磁盘: yum install -y sysstat iostat -dx 1 iostat -dx 1 5 #主要关注最后一列(util)当百分比数值过大,可能磁盘性能出问题了
yum install -y iotop iotop 回车 动态显示,按IO使用率大小排序
综合工具,断定瓶颈点: vmstat 1 vmstat 1 10 关注:r、b、si、so、bi、bo、id、wa
监控网卡流量: sar -n DEV 1 10 yum install -y epel-release yum install nload nload 回车后查看网卡流量,动态显示
ethtool ens33 mii-tool ens33
查看进程: ps aux 、 ps -elf 、 ps -eLf (查看线程)
STAT S Sleep R Running s 父进程 N 低优先级 < 高优先级 + 前台进程 l 多线程进程 Z 僵尸进程
ls -l /proc/pid/ #查看一个进程的一些详细信息
查看网络连接状况: netstat -lnp 、netstat -lntp 、 netstat -lntup netstat -an或ss -an (查看tcp通信状态,establish/ESTAB表示正通信,time_wait表示通信完成还没断开)
抓包工具: tcpdump (安装:yum install -y tcpdump) tcpdump -nn -i ens33 port 80 tcpdump -nn -i ens33 -c 100 -w 1.cap tcpdump -i ens33 -nn not port 22 and not port 80 and not host 192.168.222.1 tcpdump -nn -r 1.cap
wireshark (安装:yum install -y wireshark) tshark -i ens33 -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri" #wireshark可以在Windows端安装,图形显示,可以分析tcpdump抓的.cap文件
补充:
buffer和cached buffer : 这部分内存是从CPU产生即将写入到磁盘里去的那部分数据
cached 这部分数据是先从磁盘里读出来,然后临时存到内存里的那部分数据
系统运维
2019-11-11 22:57:00
「深度学习福利」大神带你进阶工程师,立即查看>>> 今天在工作上遇到一个问题,在做安全扫描的时候发现,openssh有比较多的漏洞,按照绿盟扫描器的建议需要升级到最新版本。但是生产环境升级的时候会遇到很多的问题,所以决定在测试环境下打成rpm包上传到生产环境下进行升级。
备份
在做所有的变更都要备份,如果有问题可以随时回滚。 mkdir /opensshbackup cd /opensshbackup mkdir -p /opensshbackup/ssh mkdir -p /opensshbackup/binssh mkdir -p /opensshbackup/sbinssh cp /etc/ssh/* /opensshbackup/ssh cp /etc/pam.d/sshd . cp /usr/bin/ssh* /opensshbackup/binssh cp /usr/sbin/ssh* /opensshbackup/sbinssh
安装基础依赖 yum install rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel unzip wget -y
使用rpmbuild进行构建
解压包 tar xvf openssh-8.1p1.tar.gz cd openssh-8.1p1
创建一个目录SOURCES mkdir SOURCES cd SOURCES cp /root/openssh-8.1p1/contrib/redhat/openssh.spec .
修改配置文件 sed -i -e "s/%define no_x11_askpass 0/%define no_x11_askpass 1/g" openssh.spec sed -i -e "s/%define no_gnome_askpass 0/%define no_gnome_askpass 1/g" openssh.spec
构建包 rpmbuild -ba openssh.spec
rpm在/root/rpmbuild/RPMS/x86_64目录下,直接将包放到生产环境更新就可以了。
安装的方式有两种
第一种 yum install -y ./openssh-*
第二种 rpm -ivh openssh-* --nodeps
修改/etc/ssh/sshd_config
如果不修改会导致连接不上 PermitRootLogin yes #加一行运行root登陆 PasswordAuthentication yes #允许密码登陆
问题
问题一:
如果报,是因为/root/rpmbuild/SOURCES/下面没有包,复制过去就OK cp openssh-8.1p1.tar.gz rpmbuild/SOURCES/
问题二:
wget http://ftp.riken.jp/Linux/momonga/6/Everything/SOURCES/x11-ssh-askpass-1.2.4.1.tar.gz
系统运维
2019-11-11 20:10:00
「深度学习福利」大神带你进阶工程师,立即查看>>> 下载安装vagrant: 点击这里
下载安装virtual box: 点击这里
这里使用的是win7系统,可能会出现powershell过低的情况,所以需要先检查本机的powershell版本
首先打开powershell,然后可以通过如下命令查看: $PSVersionTable
我这边直接升级到5.1(需要重启): 下载Win7AndW2K8R2-KB3191566-x64.zip
打开cmd,运行vagrant检查是否正常
将提前准备好的镜像加入到vagrant管理 vagrant box add centos/7 d:
系统运维
2019-11-11 15:22:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Sosreport 是 RHEL / CentOS 上的一个命令,它会收集 系统配置 和你linux机器上的诊断信息,如正在运行的内核版本、加载的模块和系统和服务配置文件之类的信息。这个命令同样可以运行外部的程序来收集更多的信息,并存储这些输出到一个结论文档中。
Sosreport在你需要获得redhat的技术支持时需要它。Redhat的支持工程师会要求你服务器上的sosreport来用于故障排除。
要运行sosreport,需要安装 sos 包。sos包是大多是linux的默认安装包中的一部分。如果因为某种原因没有安装,那么运行下面的yum命令来安装 sos 包 : # yum install sos
生成报告
打开终端输入sosreport命令: # sosreport
这条命令正常情况下会在 几分钟 里完成。根据本地配置,在某些情况下,某些选项可能需要更长的时间才能完成。一旦完成,sosreport将在 / tmp目录 目录中生成一个压缩文件。不同版本使用不同的压缩方案(** gz,bz2,或xz**)。该文件应提供给红帽的支持代表(在开放的情况下通常作为附件)。
注意 :sosreport需要root权限才能运行。
sosreport命令中不同的选项:
sosreport命令有一个 模块化结构 ,并允许用户启用和禁用模块,并通过在命令行指定模块。要 列出可用的模块 (插件),请使用以下命令: # sosreport -l
要禁用一个模块,用逗号隔开的列表传给-n/–skip-plugins选项。比如要kvmand 、amd这两个模块: # sosreport -n kvm,amd
各个模块可以通过-k选项提供额外的选项。例如,在Red Hat Enterprise Linux 5中安装的sos rpm模块默认收集“rpm -Va”的输出。因为这是个耗时行为,因此可以通过下面的命令禁用: # sosreport -k rpm.rpmva=off
系统运维
2019-11-09 17:27:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
九款Java性能调试工具,有什么更好、更多的工具,欢迎补充。
NetBeans Profiler
NetBeans中可以找到NetBeans Profiler。
NetBeans分析器是NetBeans的扩展,用于为NetBeans IDE提供分析功能。NetBeans IDE是一个开源的集成开发环境。NetBeans IDE支持开发所有Java应用程序类型(Java SE(包括JavaFX),Java ME,Web,EJB和移动应用程序)。 该分析器包括CPU,内存和线程分析等功能,还提供基本JVM监控的工具和功能。对于需要解决内存或性能相关问题的开发人员来说,这是非常有用的。
JProfiler
JProfiler是一个非常好的Java分析器。将CPU,内存和线程分析结合到一个应用程序中。可用于分析性能瓶颈,内存泄漏,CPU负载和解决线程问题。支持本地分析(分析在安装了JProfiler软件的同一台机器上运行的应用程序)和远程分析(这是可以分析在未安装JProfiler远程机器上运行的Java应用程序)。 JProfiler是由ej-technologies GmbH开发的商业的Java分析工具,主要用于与Java EE和Java SE应用程序一起使用。
GC查看器
GC查看器的截图 GC Viewer可以免费下载,并且开源。可用来可视化JVM的数据(使用vmflags -verbose:gc和-Xloggc:配置)GC Viewer可用于计算与垃圾回收相关的性能指标,包括吞吐量,累积暂停,最长暂停等。当通过更改生成大小或设置初始堆大小来调整应用程序的垃圾回收时,这非常有用。
VisualVM
VisualVM是从NetBeans平台派生的工具,模块化架构,意味着它可以通过使用插件来扩展。 Visual VM允许在Java虚拟机(JVM)上运行时获取有关Java应用程序的详细信息。生成的数据可以由JDK工具生成和检索,并且可以快速查看多个Java应用程序的所有数据和信息,包括本地和远程的应用程序。也可以保存和捕获有关JVM软件的数据,并将数据保存到本地,然后再查看数据或与其他人共享数据。 Visual VM可以执行CPU分析,内存分析,运行垃圾收集,快照等。
Java性能分析工具(Patty)* Beta
Patty在行动(图片最初来自 http://patty.sourceforge.net。) “Patty”项目是可从Source Forge的开源项目,旨在为Java 1.5.0及更高版本的虚拟机提供分析工具。Patty非常重视目标分析,这是与其他分析器的区别,还允许用户在运行时切换分析功能。 目前它处于beta状态,但是关于方法执行的分析,代码覆盖,线程中用到一些强大的功能可用于分析开销(内存CPU等)。可以把信息通过TCP / IP套接字发送到其他计算机。有一个易于使用的GUI界面,可用于堆的分析。
JRockit - 任务控制
JRockit是一个专有的Java虚拟机(JVM)。最初由Appeal Virtual Machines开发,并于2002年被BEA Systems收购,后来通过Sun Microsystems成为Oracle的一部分。 Oracle JRockit是Java SE的完整解决方案,包括高性能JVM,分析,监控和诊断工具,可用于预测Java应用程序中的延迟。 JRockit的当前迭代版本与一组名为JRockit Mission Control的工具捆绑在一起。这些工具能够可视化垃圾回收和其他性能统计信息,还有用于管理的控制台,。也可以用作运行时性能分析工具,称为运行时分析器,也可以分析内存问题。
Eclipse内存分析器
内存分析器(MAT)在Eclipse IDE中找到。 Eclipse内存分析器是一个Java堆分析器,可帮助你查找内存泄漏并减少内存消耗。它更适合作为分析Java堆转储和计算其大小的通用工具包。它也可以用来报告泄漏嫌疑和内存消耗的反模式。
Java Interactive Profiler
JIP是一种高性能,低开销的分析器。它目前根据BSD许可证发行 ,可从Source Forge下载 。对于使用JIP的开发人员,可以在VM运行时打开和关闭分析器,可以过滤类和包,并控制输出。
Profiler4J
Profiler4j是专用的CPU分析器。界面友好,支持远程分析,并可以“即时”配置。值得注意的功能包括基于动态字节码的检测,它不需要本地库,也不需要可执行文件。Profilter4J可以提供带有调用图,调用树,内存监视器和类列表的图形信息,支持细粒度的配置。它目前在Apache许可证v2.0下发布, 可从Source Forge 下载 。 如果文章对您有帮助,请记得点赞关注哟~ 欢迎大家关注我的公众号<情系IT>,每日推送技术文章供大家学习参考。
系统运维
2019-11-09 09:17:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
dockerfile 与 docker-compose的区别
先简单理解 docker 的使用过程 ,它分为镜像构建与容器启动。
镜像构建:即创建一个镜像,它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 dockerfile 来完成的。
容器启动:容器最终运行起来是通过拉取构建好的镜像,通过一系列运行指令(如端口映射、外部数据挂载、环境变量等)来启动服务的。针对单个容器,这可以通过 docker run 来运行。
而如果涉及多个容器的运行(如服务编排)就可以通过 docker-compose 来实现,它可以轻松的将多个容器作为 service 来运行(当然也可仅运行其中的某个),并且提供了 scale (服务扩容) 的功能。
简单总结:
1.dockerfile: 构建镜像;
2.docker run: 启动容器;
3.docker-compose: 启动服务;
从头说起。
假如你不用 docker ,搭建 wordpress 怎么弄?先找台 server ,假设其 OS 为 Ubuntu ,然后按照文档一步步敲命令,写配置,对吧?
用 docker 呢? 随便找台 server ,不管什么操作系统,只要支持 docker 就行, docker run ubuntu, docker 会从官方源里拉取最新的 Ubuntu 镜像,可以认为你开了个 Ubuntu 虚拟机,然后一步步安装,跟上面一样。
但是这样安装有个显著的缺点,一旦 container 被删,你做的工作就都没了。当然可以用 docker commit 来保存成镜像,这样就可以复用了。
但是镜像一般比较大,而且只分享镜像的话,别人也不知道你这镜像到底包含什么,这些问题都不利于分享和复用。
一个直观的解决方案就是,写个脚本把安装过程全部记录下来,这样再次安装的时候,执行脚本就行了。 Dockerfile 就是这样的脚本,它记录了一个镜像的制作过程。
有了 Dockerfile, 只要执行 docker build . 就能制作镜像,而且 Dockerfile 就是文本文件,修改也很方便。
现在有了 wordpress 的镜像,只需要 docker run 就把 wordpress 启动起来了。
如果仅仅是 wordpress, 这也就够了。但是很多时候,需要多个镜像合作才能启动一个服务,比如前端要有 nginx , 数据库 mysql, 邮件服务等等,当然你可以把所有这些都弄到一个镜像里去,但这样做就无法复用了。
更常见的是, nginx, mysql, smtp 都分别是个镜像,然后这些镜像合作,共同服务一个项目。
docker-compose 就是解决这个问题的。你的项目需要哪些镜像,每个镜像怎么配置,要挂载哪些 volume, 等等信息都包含在 docker-compose.yml 里。
要启动服务,只需要 docker-compose up 就行,停止也只需要 docker-compse stop/down
简而言之, Dockerfile 记录单个镜像的构建过程, docker-compse.yml 记录一个项目(project, 一般是多个镜像)的构建过程。
你说有些教程用了 dockerfile+docker-compose, 是因为 docker-compose.yml 本身没有镜像构建的信息,如果镜像是从 docker registry 拉取下来的,那么 Dockerfile 就不需要;如果镜像是需要 build 的,那就需要提供 Dockerfile.
docker-compose 是编排容器的。例如,你有一个php镜像,一个mysql镜像,一个nginx镜像。如果没有docker-compose,那么每次启动的时候,你需要敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,相当繁琐。而用了docker-composer之后,你就可以把这些命令一次性写在docker-composer.yml文件中,以后每次启动这一整个环境(含3个容器)的时候,你只要敲一个docker-composer up命令就ok了。
dockerfile 的作用是从无到有的构建镜像。它包含安装运行所需的环境、程序代码等。这个创建过程就是使用 dockerfile 来完成的。Dockerfile - 为 docker build 命令准备的,用于建立一个独立的 image ,在 docker-compose 里也可以用来实时 build
docker-compose.yml - 为 docker-compose 准备的脚本,可以同时管理多个 container ,包括他们之间的关系、用官方 image 还是自己 build 、各种网络端口定义、储存空间定义等
参考文献:
https://blog.csdn.net/DDFFR/article/details/77049118
系统运维
2019-11-09 07:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
安装方式:
1):通过ppa(源) 方式安装.
2):通过官网安装包安装.JDK官网下载地址
一:使用ppa(源)方式安装:
1):添加ppa源
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
2):安装oracle-java-installer(jdk8版本)
sudo apt-get install oracle-java8-installer
注:安装器会提示是否同意条款,根据提示选择yes即可,若不想手动输入,则可以采用以下方式自动完成:
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
3):设置默认的jdk,可以安装多个jdk版本
sudo update-java-alternatives -s java-8-oracle
4):测试jdk是否安装成功
java -version
javac -version
二:使用安装包安装:JDK官网下载地址
1):官方下载对应的.gz包,这里以jdk-8u181-linux-x64.tar.gz为例
2):创建一个目录用于存放解压后的文件,并解压缩到该目录下
sudo mkdir /usr/lib/jvm
sudo tar -zxvf jdk-8u181-linux-x64.tar.gz -C /usr/lib/jvm
3):修改环境变量
sudo vi ~/.bashrc
4):文件末尾追加如下内容
#set oracle jdk environment
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_181 ## 这里要注意目录要换成自己解压的jdk 目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
5):使环境变量生效
source ~/.bashrc
6):设置默认jdk
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_181/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_181/bin/javac 300
sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.8.0_181/bin/jar 300
sudo update-alternatives --install /usr/bin/javah javah /usr/lib/jvm/jdk1.8.0_181/bin/javah 300
sudo update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/jdk1.8.0_181/bin/javap 300
7):执行
sudo update-alternatives --config java
8):测试是否安装成功
java -version
javac -version
系统运维
2019-11-08 22:50:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1.前言
最近在优化网站的访问速度,为网站开启http2协议,这个协议有什么优点呢?如下: http2是下一代的传输协议,以后都会普遍用它,是一个趋势。 http2有多路复用特性,意思是访问一个域名下面的资源,多个请求共用一条TCP链路,所以比http1.1要快得多。
2.准备工作 需要重新编译openssl1.0.2以上版本,因为我们系统的版本都是centos6的,不支持直接yum更新openssl,如果是centos7,直接yum update openssl -y 即可更新 编译完成openssl后,需要重新使用openssl的库文件重新编译Tenginx,我们使用的Tengine版本是Tengine/2.2.2。
3.操作步骤 安装 openssl-1.0.2t #进入/usr/local/src,一般软件包都放这里 cd /usr/local/src #下载安装包 wget https://www.openssl.org/source/openssl-1.0.2t.tar.gz tar -zxvf openssl-1.0.2t.tar.gz cd openssl-1.0.2t ./config shared zlib #默认安装找/usr/local/ssl make && make install #先备份之前的老版本 mv /usr/bin/openssl /usr/bin/openssl.old mv /usr/include/openssl /usr/include/openssl.old #建立软连接 ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl ln -s /usr/local/ssl/include/openssl /usr/include/openssl #把动态库加入系统配置路径 echo "/usr/local/ssl/lib" >> /etc/ld.so.conf #查看动态库是否生效 ldconfig -p #检查openssl版本 openssl version 安装Tenginx cd /usr/local/src wget http://tengine.taobao.org/download/tengine-2.2.2.tar.gz tar tengine-2.2.2.tar.gz cd tengine-2.2.2 #这里需要修改一下tengine的代码,因为我们是手动编译的openssl,依赖库路径和原来系统安装的不太一样,所以需要手动指定 vim auto/lib/openssl/conf #在大概32行配置原来配置如下: CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include" CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h" CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a" CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a" #修改成如下,保存退出 CORE_INCS="$CORE_INCS $OPENSSL/include" CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h" CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a" CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a" #先安装一些依赖(我是升级,其实不需要安装依赖了,如果是首次安装tenginx,就需要安装依赖) yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake jemalloc jemalloc-devel #开始编译tenginx cd /usr/local/src/tengine-2.2.2 && ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_concat_module --with-jemalloc --with-http_v2_module --with-http_secure_link_module --with-openssl=/usr/local/ssl make ##注意,如果是第一安装tegninx,只需要只需执行以下命令 make install #但是我是安装过了,所以需要备份老的tenginx cp -af /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak cp -af /usr/local/nginx/sbin/dso_tool /usr/local/nginx/sbin/dso_tool_bak #拷贝编译好的tenginx到对应目录 cp /usr/local/src/tengine-2.2.2/objs/nginx /usr/local/nginx/sbin/ cp /usr/local/src/tengine-2.2.2/objs/dso_tool /usr/local/nginx/sbin/ #然后重启Tenginx,就算编译安装完成啦 Tenginx http2配置 #配置http2很简单,如下: server { #http 不支持http2的传输协议,所以80端口不变 listen 80 # listen在原https配置文件基础上添加http2 listen 443 ssl http2; server_name www.oneq.work; ..... } #另外附上一份完整的支持http2的Tenginx配置 upstream server_backend { server ip:80 weight=10; server ip:80 weight=10; keepalive 800; #下面检测端口的配置需要Tenginx的才有效,不是Tenginx需要安装额外的插件或者直接注释即可 check interval=5000 rise=3 fall=3 timeout=5000 type=tcp; } server { listen 80; listen 443 ssl http2; server_name xxx.xxx.xxx; req_status server; ssl_certificate /usr/local/nginx/certs/xxx.xxx.xxx.crt; ssl_certificate_key /usr/local/nginx/certs/xxx.xxx.xxx.key; ssl_session_timeout 5m; ssl_protocols TLSv1.1 TLSv1.2 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; 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_pass_header User-Agent; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Connection ""; proxy_http_version 1.1; access_log logs/access.log main; location / { proxy_pass http://server_backend/; access_log logs/server_backend.log main; } error_page 404 /404.html; location = /404.html { root html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
4.效果展示
5.总结
1.第一次安装tenginx和升级步骤有所区别,需要注意下
2.http不支持http2的传输协议,所以80端口还是使用http1.1的协议,https使用http2的传输协议
> 作者博客 青叶的博客
系统运维
2019-11-08 20:52:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1. 微服务项目部署的缺点?如何解决?
答: 假如在一个机子上部署会导致配置的混乱,每个系统的配置可能不同。解决方案:使用虚拟化技术

2. 如何部署项目到Docker上,并且 生成 一个 Docker镜像?
答: 直接使用docker-maven-plugin插件可完成从打包到构建镜像、构建 容器等过程。
步骤: 在pom.xml中配置插件,提交到仓库中,在linux上使用 git 将代码下下来,然后按照命令启动,
详细位置: 学成在线20天讲义maven构建镜像
3. jekins 如何 构建 一个 容器 的步骤?
答: 从 代码库中 拉取代码,构建镜像,推送到 镜像私服,拉取镜像,创建容器。
4. 使用 jekins 构建一个任务需要哪些配置?
(1)配置代码位置(代码 中 maven要将需要装的插件装好)
( 2 )构建镜像,创建容器(添加命令)

5. 是否可以用一句命令实现打包,构建镜像.,构建容器步骤?
答:可以,在 项目pom文件中需要安装相应的插件。
6。 打包,构建镜像等等这些命令能够执行的前提是什么?
答: 在项目中添加了相应的插件(要在pom.xml中配置)

系统运维
2019-11-08 19:17:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
常用选项:   -E :开启扩展(Extend)的正则表达式。   -i :忽略大小写(ignore case)。   -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。   -n :显示行号   -w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker   -c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。   -o :只显示被模式匹配到的字符串。   --color :将匹配到的内容以颜色高亮显示。   -A n:显示匹配到的字符串所在的行及其后n行,after   -B n:显示匹配到的字符串所在的行及其前n行,before   -C n:显示匹配到的字符串所在的行及其前后各n行,context 当grep只需要找一个单词里的几个字符时需要使用'',比如需要找test中的es则需要表示为 grep 'es' filename ;当列出的选项中有其他干扰选项的时候,比如aes,则需要剔除包含以a开头含有es的单词,可以这样表示 grep '[^a]es' filename 同理,当列出的内容中包含过多的其他内容,比如Aces,则需要剔除es前除了大写字符的所有内容。表达如下grep '[^a-z]es' filename 当需要列出以特定字符开头的行时可以这样表达 grep -n '^test' filename tip: 在[]中的^表示不以[]中的内容开头,而在[]外的^则表示以后面的内容开头。
系统运维
2019-11-08 17:43:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
7.3.1 Nessus
7.4.1 IP资源漏洞扫描
8.1.1 应急流程
Nessus
https://www.tenable.com/downloads/nessus

Docker方式安装
docker pull sometheycallme/docker-nessus
docker run -t --name nessus -p 8834:8834 sometheycallme/docker-nessus
IP资源漏洞扫描

yum install nmap
yum install openssl-devel pcre-devel ncpfs-devel postgresql-devel libssh-devel gcc -y
git clone https://github.com/vanhauser-thc/thc-hydra (9头蛇工具探测)
./configure
make
Make install
git clone https://github.com/robertdavidgraham/masscan.git
Make
git clone https://github.com/grayddq/PublicMonitors.git
pip install -r requirements.txt


参考文档 https://github.com/grayddq/PublicMonitors
应急流程
什么是应急响应

PDCERF模型
P (Preparation准备)
D(Detection诊断)
C(Containment抑制)
E(Eradication根除)
R(Recovery恢复)
F(follow-up跟踪)

准备阶段
应急工具:ls, ifconfig, ps, top 已经被黑,无法用来查看真正信息
busybox webshell检测,病毒查杀

诊断:CPU被占,挖矿病毒

阻断:联系相应负责人,避免扩大,蠕虫及时处理

根除:寻找攻击者原因,攻击者的源头
黑客如何攻进来的?利用什么漏洞?在服务器中做了什么?清楚攻击者后门、webshell等

恢复、监控:清楚后门口恢复上线

应急报告、自省,改进措施
系统运维
2019-11-08 16:12:00