Linux阶段

Linux阶段

  1. Linux是由Unix操作系统为内核的类Unix操作系统,Mac OS也属于类Unix操作系统的。

  2. Linux第一个用户就是root,密码默认没有的可以直接进入。登录后最前方会出现一段字符字符串[username@host]#|$,#为管理员而$是普通用户。在远程登录可以连接ssh root@ip。Linux查看IP有两种:ifconfigip addr

  3. 配置网络:点击编辑在下拉框中选择虚拟网络编辑,选择VMnet8后勾选Nat模式、将主机虚拟适配器链接此网络和使用本地DHCP。设置子网和子网掩码并点击NAT设置,点进去之后设置网关即可。在Linux中配置vi /etc/sysconfig/network-scripts/ifcfg-ens33

  4. 乌班图操作系统下载地址:http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso。准备好vmware虚拟机,下载ubuntu后打开vmware并创建虚拟机。版本选择16.2后客户端类型选择Linux,版本选择Ubuntu64一直下一步即可。

  5. pycharm之linux版本下载地址:https://download.jetbrains.8686c.com/python/pycharm-community-2018.2.4.tar.gz。解压缩pycharm:yuchao@ubuntu:/tmp$ tar zxvf pycharm-professional-2018.2.4.tar.gz 。解压缩后进入文件夹:cd /tmp/pycharm-2018.2.4/bin。执行脚本,启动pycharmsource pycharm.sh。配置桌面快捷启动pycharm,在桌面创建一个文本文件,名为Pycharm.desktop。在文件中添加内容

    [Desktop Entry]
    Version=1.0
    Type=Application
    Name=Pycharm
    Icon=/home/yuchao/Downloads/pycharm-professional-2018.2.4/pycharm-2018.2.4/bin/pycharm.png
    Exec=/home/yuchao/Downloads/pycharm-professional-2018.2.4/pycharm-2018.2.4/bin/pycharm.sh
    MimeType=application/x-py
    Name[en_US]=pycharm
    
  6. 修改属性中选中Permissions后,勾选Allow executing file as pycharm。

  7. Python Automated Operations

    1. Python 本地文件服务器,用于当前目录下快速建立文件服务器,默认是localhost:8000

      python -m http.server
      
    2. Python 解释器快速解析JSON展示。

      echo '{"address":{"province":"zhejiang"},}' | python -m json.tool
      
    3. Python 安装模块后需要进行导入验证是否安装成功,在远程测试时可以使用-c快速执行命令。

      python -c "import paramiko"
      
    4. VIM一键执行Python代码,编写VIM配置文件/etc/vim/vimrc后,按下F5运行。

      """""""""""""""""""""
      "Quickly Run		"
      """""""""""""""""""""
      map <F5> :call CompileRunGcc()<CR>
      func! CompileRunGcc()
      	exec "w"
      	if &filetype == 'c'
      		exec "!g++ % -O %<"
      		exec "!time ./%<"
      	elseif &filetype == 'cpp'
      		exec "!g++ % -O %<"
      		exec "!time ./%<"
      	elseif &filetype == 'java'
      		exec "!javac %"
      		exec "!time java %<"
      	elseif &filetype == 'sh'
      		:!time bash %
      	elseif &filetype == 'python'
      		exec "!time python %"
      	elseif &filetype == 'html'
      		exec "!firefox % &"
      	elseif &filetype == 'go'
      		exec "!go build %<"
      		exec "!time go run %"
      	elseif &filetype == 'mkd'
      		exec "!~/.vim/markdown.pl % > %.html &"
      		exec "!firefox %.html &"
      	endif
      endfunc
      
    5. Python使用SSH&Telnet协议连接网络设备,实现批量设备配置完成自动化配置。在备份时需要服务器开启FTP服务dnf install vsftpd -y & systemctl start vsftpd

      # install paramiko module
      import paramiko
      import time
      import getpass
      import sys
      import socket
      
      username = input('Username: ')
      password = getpass.getpass('password: ')
      ip_file = sys.argv[1]
      cmd_file = sys.argv[2]
      switch_with_authentication_issue = []
      switch_not_reachable = []
      iplist = open(ip_file, 'r')
      for line in iplist.readlines(): 
      	try: 
      		ip = line.strip() 
              ssh_client = paramiko.SSHClient() 
              ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
              ssh_client.connect(hostname=ip, username=username, password=password) 
              print ("You have successfully connect to ", ip) 
              command = ssh_client.invoke_shell()  
              cmdlist = open(cmd_file, 'r') 
              cmdlist.seek(0) 
              for line in cmdlist.readlines(): 
                  command.send(line + "\n") 
              time.sleep(2) 
              cmdlist.close() 
              output = command.recv(65535) 
              print (output.decode(ascii)) 
      	except paramiko.ssh_exception.AuthenticationException: 
      		print ("User authentication failed for " + ip + ".") 
      		switch_with_authentication_issue.append(ip) 
      	except socket.error: 
      		print (ip + " is not reachable.") 
      		switch_not_reachable.append(ip)
      iplist.close()
      ssh_client.close
      print ('\nUser authentication failed for below switches: ')
      for i in switch_with_authentication_issue: 
      	print (i)
      print ('\nBelow switches are not reachable: ')
      for i in switch_not_reachable: 
      	print (i)
      

基本知识

  1. 了解一些Linux的基础只是可以让你更加方便的使用Linux。

    tab    												# 用于自动补全命令/文件名/目录名
    ctrl+l												# 清理终端显示 
    clear/cls  											# 清理终端显示
    ctrl+c 												# 终止当前操作
    
  2. Linux的目录与win的不同,Linux是文件系统下直接/开始并没有什么盘这个概念的。Linux使用正斜杠来跨文件夹,它的结构是树状结构。

    /													# 根目录,文件系统的入口,最高一级目录
    /bin												# 存放可执行二进制文件
    /boot												# 存放内核以及启动所需的文件
    /dev												# 用于存放设备文件的目录。
    /etc												# 存放系统管理和配置文件
    /home												# 系统默认的用户家目录
    /lib												# 存放跟文件系统中的程序运行所需要的共享库及内核模块
    /mnt												# 一般用于临时挂载存储设备的挂载目录
    /proc												# 存放存储进程和系统信息
    /root												# 系统管理员root的家目录
    /sbin												# 存放系统管理员使用的可执行命令
    /tmp												# 用于用户或正在执行的程序临时存放文件的目录
    /usr												# 存放系统应用程序、命令程序文件、程序库、手册和其他文档
    /var												# 存放系统一般执行时要改变的数据
    
    /etc/sysconfig/network-scripts/ifcfg-ethXX			# 网卡配置文件,用于配置本机ip、网关等
    /etc/resolv.conf									# 配置本机的服务端DNS
    /etc/shsts											# 配置ip与域名的对应解析表
    /etc/fstab/											# 记录开机要挂载的文件系统,所有分区开机都会自动挂载
    /etc/inittab										# 设定系统启动等级及启动文件设置
    /etc/init.d											# 存放系统启动脚本
    /etc/profile										# 系统全局变量配置路径
    /etc/passwd											# 系统中用户账户信息
    /etc/sudoers										# 命令的配置文件
    /etc/syslog.conf									# 系统日志选项配置
    /etc/skel/											# 默认创建用户时,把该目录拷贝到家目录下
    /etc/sysconfig/network								# 配置机器名及网络启动等配置
    /etc/exports										# 设定NFS系统用的配置文件路径
    /etc/xinetd.d										# 存放大部分的网络服务的配置文件
    /etc/rc or /etc/rc.d								# 启动或改变运行级时运行的脚本或脚本的目录
    /etc/group											# 设定用户的组名与相关信息
    /etc/motd											# 用户成功登录后自动输出通告信息
    /etc/modprobe.conf									# 内核模块额外选项设定
    /etc/DIR_COLORS										# 设定颜色
    /etc/protocols										# 系统支持的协议文件
    /etc/XllX											# Windows 的配置文件
    /etc/issue											# 记录用户登录前显示的信息
    /etc/mtab											# 当前安装的文件系统列表
    /etc/login.defs										# 设置用户账号限制的文件
    /etc/shells											# 存放有效登录shell的列表
    
    /proc/meminfo										# 存放内存信息
    /proc/cpuinfo										# 存放处理器的相关信息
    /proc/cmdline										# 加载kernel时所下达的相关选项
    /proc/filesystems									# 当前被内核支持的文件系统类型列表文件
    /proc/interrupts									# 存放当前系统的IRQ分配状态
    /proc/ioports										# 存放当前系统中各个装置所配置的I/O位址
    /proc/kcore											# 系统物理内存映像
    /proc/modules										# 当前装入内核的所有模块名称列表
    /proc/mounts										# 系统已经挂载的数据
    /proc/swaps											# 系统挂加载的内存位置
    /proc/pci											# 在PCI汇流排上面,每个装置的详细情况
    /proc/version										# 系统内核的版本
    /proc/interrupts									# 显示被占用的中断信息和占用者的信息,以及被占用的数量
    /proc/net											# 网络协议状态信息
    /proc/self											# 存放到查看/proc的程序的进程目录的符号连接
    /proc/devices										# 系统已经加载的所有块设备和字符设备的信息
    /proc/dma											# 每个正在使用且注册的ISA DMA通道的信息列表
    /proc/stat											# 实时记录自系统上次启动以来的多种统计信息
    
    /usr/X11R6											# 存放 X-Windows 的目录
    /usr/games											# 存放着XteamLinux 自带的小游戏
    /usr/doc											# Linux技术文档
    /usr/include										# 存放Linux下开发和编译应用程序所需要的头文件
    /usr/lib											# 存放一些常用的动态链接共享库和静态档案库
    /usr/man											# 帮助文档所在的目录
    /usr/src											# 存放Linux开放的源代码
    /usr/bin											# 存放非必要可执行文件
    /usr/lib											# 存放/usr/bin和/usr/sbin/中二进制文件的库
    /usr/sbin											# 存放非必要的系统二进制文件
    /usr/share											# 存放体系结构无关数据
    /usr/src											# 存放源代码
    /usr/local											# 用户自己编译的软件默认会安装到该目录
    
    /var/log/message									# 存放日志信息,按周自动轮询
    /var/spool/cron/root								# 定时器配置文件
    /var/log/secure										# 记录登录系统存取信息的文件
    /var/log/wtmp										# 记录登录者信息的文件
    /var/spool/clientmqueue								# 存放发给系统管理员的邮件
    /var/spool/mail/									# 邮件目录
    /var/tmp											# 需要存在较长时间的临时文件
    /var/lib											# 系统正常运行时要改变的文件
    /var/local											# 安装程序的可变数据
    /var/log											# 各种程序的log文件
    /var/run											# 保存到下次引导前有效的关于系统的信息文件
    
  3. 计算机中文件大小的表示方式,每一个单位乘以1024等于下一个单位。

    单位英文单位英文
    字节B(Byte)K(Kibibyte)
    M(Mebibyte)千兆G(Gigabyte)
    T(Terabyte)P(Petabyte)
    E(Exabyte)Z(Zettabyte)
    Y(Yottabyte)
  4. Linux文件的含义:绿色文件代表可执行文件、蓝色文件代表文件夹、白色文件代表普通文件。绝对路径和相对路径,绝对路径就是从根目录向下走的,相对文件就是以当前文件为基准向下走的。

  5. Linux的文件系统:用户在硬件存储设备中执行的文件建立,写入,读取,修改,转存与控制等操作都是依赖文件系统完成的。文件系统的作用是合理规划硬盘,保证用户正常使用。/etc/fstab是用来存放文件系统的静态信息的文件。Linux系统支持数十种文件系统,常见文件系统如下。

    1. Ext3 是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能 自动修复数据的不一致与错误。
    2. Ext4 Ext3 的改进版本,作为 RHEL 6 系统中的默认文件管理系统,它支持的存储容 量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4 文件系统能够批量分配 block 块,从而极大地提高了读写效率。
    3. XFS 是一种高性能的日志文件系统,而且是 RHEL 7 中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的 日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为 18EB, 这几乎满足了所有需求。
  6. Linux系统命令操作语法格式,一般情况下参数和文件路径都是可选的。参数之间用一个或多个空格分割。

    shutdown
    	-r now 								# 重启
    	-h now 								# 关机
    	-r +5								# 五分钟后重启
    	-h 8:00								# 8点关机
    reboot									# 重启
    poweroff								# 关机
    uname -a								# 查看系统信息
    date									# 查看当前时间
    date -s 2002-01-01						# 修改系统时间
    free -h									# 查看内存使用情况
    echo 'asdf'								# 输出字符串
    ps -u									# 查看进程状态
    pidof bash								# 查看指定进程PID
    
    kill -l									# 查看所有信号及其编号
    	kill -9 bash						# 杀死bash进程
    	1	SIGHUP							# 挂掉电话线或终端连接的挂起信号
    	2	SIGINT							# 结束进程,但并不是强制性
    	9	SIGKILL							# 杀死进程,既强制结束进程
    	15	SIGTERM							# 正常结束进程,是kill命令的默认信号
    	19	SIGSTOP							# 暂停进程
    	
    killall	bash							# 杀死进程
    # kill是杀死单个进程,killall杀死主进程并杀死依赖进程。
    alias									# 查询和设置命令的别名
    	alias pp=pwd						# pwd设置别名为pp
    history									# 显示用户最近执行的命令
    	!<code>								# 执行编号对应的命令
    hostname								# 查看主机名
    	'a'									# 临时修改主机名
    	set-hostname 'a'					# 永久修改主机名Ctrl+D立即生效
    pwd										# 显示当前目录的绝对路径
    cd "path"								# 切换文件夹
    										# 我们知道切换目录的指令是cd,那么首先得知道如何切换目录,这个得用心记呀!
    	cd .    							# 当前目录
    	cd ..    							# 回到上一层目录
    	cd ../    							# 回到指定的上一层目录
    	cd -    							# 返回前一个工作目录
    	cd ~|cd   							# 进入家目录
    ls										# 查看当前文件夹下内容,.代表当前,..代表上一级
    	-d									# 显示目录,但不显示文件
    	-r									# 将文件以相反次序显示
    	-t									# 将文件依建立时间之先后次序列出
    	-A									# 同-a
    	-R									# 若目录下有文件,则以下之文件依序列出
    	ls -l /								# 横向显示详细等于ll
    	ls -a /								# 显示文件夹下所有
    	ls -h /								# 配合-l个性化显示文件大小
    	ls -la /							# 横向显示该文件夹下的所有以详细参数、-l:横向显示详细、-a:显示文件夹下所有
    	man ls								# Linux下的帮助指令
    
    
    mkdir "name"							# 创建文件夹
    	mkdir -p "path name"				# 递归创建文件夹,mkdir默认只能在当前目录下创建
    	mkdir -p a/b  c/d 					# 递归创建两组文件夹
    	mkdir -p test/a,b,c,d				# 递归在指定文件夹下创建多个文件夹	
    	mkdir -p test/{a,b,c,d}				# 递归在指定文件夹下创建多个文件夹
    	mkdir -p a/b/c/d/e					# 递归创建一套文件夹
    	-m									# 为目录指定访问权限
    	-p									# 如果目录已经存在,则不会有错误提示。若父目录不存在,将会创建父目录
    	-v									# 显示指令执行过程
    rmdir "name"							# 删除空文件夹
    	-p									# 递归删除目录
    	-v									# 显示指令执行过程
    rm "file"								# 删除指定文件
    	-i  								# 需要删除确认
    	-f  								# 强制删除
    	-r  								# 递归删除目录和内容
    clear 									# 清屏
    echo  "alex"							# 表示输出
    	echo $PATH							# echo命令是有打印的意思、$符号后面跟上PATH,表示输出PATH的变量
    	echo "sb666" > /tmp/chaoge.txt		# 将需要的信息写入指定文件
    	echo "sb666" > e.txt				# 重定向>符号用于覆盖原有文件内容
    	echo "sb666" >> e.txt				# 重定向>>符号用于追加到原有文件内容后面
    which ls								# 在哪、从哪来
    stat "file"								# 显示文件的详细信息(最近访问)Access、(最近更改)Modify、(最近改动)Change
    	-L		--dereference     			# 跟随链接
    	-f		--file-system     			# 显示文件系统状态而非文件状态
    										# 格式化输出参数:%a 八进制权限、%A 用可读性较好的方式输出权限
    	-c		--format=%a      			# 使用指定输出格式代替默认值,每用一次指定格式,
    	-t		--terse         			# 使用简洁格式输出
    			--help            			# 显示此帮助信息并退出
    			--version         			# 显示版本信息并退出
    ctrl+alt+f[1~7]							# 可以切换(linux有7个终端)
    tty										# 查看当前终端
    who am i 								# 查看当前用户正在使用的终端和登陆时间
    w 										# 查看所有终端
    ls										# 查看当前目录的文件和文件夹
    ls .la									# 查看当前目录的文件和文件夹(包括隐藏的)
    ls -l /tmp/ 							# 查看详细信息
    cat name								# 查看文件
    	-b									# 与-n相似,但对与空白行不编号
    	cat -n xxx.py 						# 显示行号
    	cat -n /tmp/*.py 					# 找出以.py结尾的所有文件
    	cat -E 1.txt 						# 在每一行的结尾加上$符
    	cat >>/tmp/oldboy.txt << EOF		# 追加文字到文件,追加完后使用EOF退出追加模式
    more /etc/passwd 						# more命令文本会以百分比形式查看,按下空格space是翻页、按下b键是上一页、回车键向下读取内容
    	-n									# 定义一次显示的行数
    	+n									# 从第n行开始显示
    	+/'asd'								# 搜索该字符串 
    	-c									# 从顶部清屏,然后显示
    	-u									# 把文件内容中的下划线去掉
    	
    less 'file'								# 类似于more,功能更强
    	-N									# 显示行号
    	+n									# 从第n行开始显示
    	-g									# 只标志最后搜索到的关键字
    	-i									#  忽略搜索时的大小写
    	-m									# 显示类似more命令的百分比
    
    head 'file'								# 显示文件的开头内容,默认是10行
    	-n									# 显示行号
    	-c									# 显示的字节数
    
    tail									# 显示文件尾部的内容,默认是10行
    	-n									# 显示行号
    	-c									# 显示的字节数
    touch "file path"						# 如果文件不存在就创建文件
    	touch xxx.py						# 文件存在代表触摸,用于更新时间
    	touch -t'07101530' "file"			# 修改文件的时间,很多黑客就会在恶意修改文件之后再修改成之前的时间
    	-a									# 之更爱存取时间
    	-c									# 不建立任何文档
    	-m									# 只更改变动时间
    	-r									# 将文件的访问时间设置为和参考文档相同
    	-t									# 设定文件的访问时间
    
    cp startPath endPath					# 复制文件到指定位置
    	-a									# 用于复制目录,保留连接、文件属性,并复制目录下的所有内容
    	-d									# 复制时保留连接
    	-f									# 覆盖已经存在的目标文件时不给出提示
    	-i									# 覆盖已经存在的目标文件时给出提示
    	-l									# 不复制文件,只生成连接文件
    	-p									# 除复制文件的内容外,还把修改时间和访问权限也复制到新文件中
    	-r									# 复制该目录下所有的子目录和文件
    mv startPath endPath					# 移动文件到指定目录
    	-b									# 若需覆盖文件,则覆盖前先行备份
    	-f									# 若目标文件已经存在,直接覆盖
    	-i									# 若目标文件已经存在,询问是否覆盖
    	
    rm 'file'								# 删除文件或文件夹
    	-f									# 不提示,强制删除文件或目录
    	-i									# 删除已有文件或目录之前先询问用户
    	-r									# 递归删除,将指定目录下的所有文件与子目录一并删除
    	
    find 'path' 'file'						# 查找目录或文件的位置
    	-name								# 按照文件名进行查找,区分大小写
    	-iname								# 按照文件名进行查找,不区分大小写
    	-type								# 按照指定文件类型进行查询
    	-size								# 按照文件大小进行文件查询
    	-user								# 按照文件所有者进行文件查询
    	-group								# 按照文件所属组进行文件查询
    grep "wuddi" /tmp/oldboy.txt			# 全面搜索正则表达式并把行打印出来
    	-i									# 忽略大小写
    	-n									# 输出行号
    	-v									# 反向选择
    	--color = auto						# 给关键词部分添加颜色
    head									# 显示文件前几行,默认前10行
    
    tail									# 显示文件后几行,默认后10行
    	head -2 /tmp/oldboy.txt				# 查看前两行
    	tail -2 /tmp/oldboy.txt				# 查看后两行
    	tail -f xx.log						# 监听文件持续刷新显示
    alias a=ls 								# 给命令起别名,简单命令的书写	
    unalias a								# 取消别名
    	alias cp='cp -i'					# 默认别名
    	alias egrep='egrep --color=auto'
    	alias fgrep='fgrep --color=auto'
    	alias grep='grep --color=auto'
    	alias l.='ls -d .* --color=auto'
    	alias ll='ls -l --color=auto'
    	alias ls='ls --color=auto'
    	alias mv='mv -i'
    	alias rm='rm -i'
    	alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
    which python							# 查找环境变量中保存过的目录的文件绝对路径
    scp e.py root@192.168.1.155:/home/		# 传输本地文件到远程地址
    scp root@192.168.1.155:/y.txt			# 复制远程文件到本地
    	-r									# 递归复制整个目录
        -v									# 详细方式输出
        -q									# 不显示传输进度条
        -C									# 允许压缩
    du -h /tmp								# 显示指定的目录或文件所占用的磁盘空间。
        -s 									# 显示总计
        -h 									# 以k,M,G为单位显示,可读性强
    date									# 显示当前系统时间
    	-d    --date=string    				# 显示指定的时间,而不是当前时间
    	date +"%Y-%m-%d %T"					# 以年-月-日 时分秒 显示当前时间
    hwclock									# 硬件始终的查看
    	hwclock -w							# 以系统时间为基准,修改硬件时间
    	hwclock -s							# 以硬件时间为基准,修改系统时间
    cal										# 查看日志的意思
    	-1, --one        					# 只显示当前月份(默认)
    	-3, --three      					# 显示上个月、当月和下个月
    	-s, --sunday     					# 周日作为一周第一天
    	-m, --monday     					# 周一用为一周第一天
    	-j, --julian     					# 输出儒略日
    	-y, --year       					# 输出整年
    	-V, --version    					# 显示版本信息并退出
    	-h, --help       					# 显示此帮助并退出
    ntpdate -u ntp.aliyun.com				# 由于我们只需要用作客户端更新时间
    reboot									# 用于重启机器
    poweroff								# 用于关闭系统
    chattr +a test.py						# 给文件加锁,只能写入数据,无法删除文件
    chattr -a test.py						# 给文件去锁,可完全控制数据
    lsattr test.py							# 查看文件隐藏属性
    
    # TOP命令用于动态地监视进程活动与系统负载等信息
    
    # 第一行 (uptime):系统时间 主机运行时间 用户连接数(who) 系统1,5,15分钟的平均负载
    # 第二行:进程信息:进程总数 正在运行的进程数 睡眠的进程数 停止的进程数 僵尸进程数
    # 第三行:cpu信息
        1.5 us								# 用户空间所占CPU百分比
        0.9 sy								# 内核空间占用CPU百分比
        0.0 ni								# 用户进程空间内改变过优先级的进程占用CPU百分比
        97.5 id								# 空闲CPU百分比
        0.2 wa								# 等待输入输出的CPU时间百分比
        0.0 hi								# 硬件CPU中断占用百分比
        0.0 si								# 软中断占用百分比
        0.0 st								# 虚拟机占用百分比
    # 第四行:内存信息(与第五行的信息类似与free命令)
    	8053444 total						# 物理内存总量
        7779224 used						# 已使用的内存总量
        274220 free							# 空闲的内存总量(free+used=total)
        359212 buffers						# 用作内核缓存的内存量
    # 第五行:swap信息
        8265724 total						# 交换分区总量
        33840 used							# 已使用的交换分区总量
        8231884 free						# 空闲交换区总量
        4358088 cached Mem					# 缓冲的交换区总量,内存中的内容被换出到交换区,然后又被换入到内存,但是使用过的交换区没有被覆盖,交换区的这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。
    ls --help								# Linux的帮助是在命令后面加上
    man ls									# 想看更详细的可以在命令前加上
    
  7. 使用一个好的编辑器可以让工作事半功倍。

    1. vi编辑器

      # 一般模式
      	Ctrl+f								# 向下移动一页
      	Ctrl+b								# 向上移动一页
      	0 or Home							# 移动到当前行的最前面 
      	$ or End							# 移动到当前行的最后面
      	G									# 移动到最后一行
      	nG									# 移动到第n行
      	gg									# 移动到第一行
      	n									# 移动到n的下一行
      # 一般模式文本内容查找与替换
      	/abc								# 从光标所在位置向前查找指定字符串
      	/^abc								# 查找以指定为行首的行
      	/abc$								# 查找以指定为行尾的行
      	?abc								# 从光标所在位置向后查找字符串
      	n									# 向同一方向重复上次的查找指令
      	N									# 向相反方向重复上次的查找指定
      	r									# 替换贯标所在位置的字符
      	:s/a1/a2/g							# 将当前光标所在行中所有的a1替换为a2
      	:n1,n2/a1/a2/g						# 将文件n1到n2行中所有的a1替换为a2
      	:g/a1/a2/g							# 将文件中所有的a1替换为a2
      # 一般模式复制粘贴
      	y									# 复制当前行
      	nyy									# 从当前行开始向下复制n行
      	yG									# 复制当前行至最后所有行
      	p									# 从光标下一行开始粘贴
      	P									# 从光标上一行开始粘贴
      	u									# 恢复前一个动作
      # 一般模式删除内容
      	x									# 删除当前字符
      	nx									# 删除从光标开始的n个字符
      	dd									# 删除当前行
      	ndd									# 向下删除当前行在内的n行
      	u									# 撤销上一步操作
      	U									# 撤销对当前行的所有操作
      # 命令行模式操作
      	:q									# 不保存退出
      	:wq									# 写入并退出
      	:q!									# 不保存强制退出
      	:set nu								# 显示行号
      	:set nonu							# 取消行号,撤销上一步操作
      
    2. 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。但是目前我们使用比较多的是 vim 编辑器。vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode)输入模式(Insert mode)底线命令模式(Last line mode)

      w(e)									# 移动光标到下一个单词
      b										# 移动到光标上一个单词
      0										# 移动到本行开头
      $										# 移动光标到本行结尾
      H										# 移动光标到屏幕首行
      M										# 移动到光标到屏幕的中间一行
      L										# 移动光标到屏幕的尾行
      gg										# 移动光标到文档的首行
      G										# 移动光标到文档尾行
      ctrl + f								# 下一页
      ctrl + b								# 上一页
      `.										# 移动光标到上一次的修改行
      # 查找
      /chaoge									# 在整篇文档中搜索chaoge字符串,向下查找
      ?chaoge									# 在整篇文档中搜索chaoge字符串,向上查找
      *										# 查找整个文档,匹配光标所在的所有单词,按下n查找下一处,N上一处
      #										# 查找整个文档,匹配光标所在的所有单词,按下n查找下一处,N上一处
      gd										# 找到光标所在单词匹配的单词,并停留在非注释的第一个匹配上%找到括号的另一半!!
      # 复制,删除,粘贴
      yy										# 拷贝光标所在行
      dd										# 删除光标所在行
      D										# 删除当前光标到行尾的内容
      dG										# 删除当前行到文档尾部的内容
      p										# 粘贴yy所复制的内容x 删除光标所在的字符u 撤销上一步的操作
      # 数字与命令
      3yy										# 拷贝光标所在的3行
      5dd										# 删除光标所在5行
      
    3. SED是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用SED命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

    4. 接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。SED主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

      sed [options] 'command' file(s)
      sed [options] -f scriptfile file(s)
      # sed [options]
          -e	<script>	--expression=<script>		# 以选项中的指定的script来处理输入的文本文件;
          -f	<script "file">	--file=<script"file">	# 以选项中指定的script文件来处理输入的文本文件;
          -h	--help									# 显示帮助;
          -n	--quiet	——silent						# 仅显示script处理后的结果;
          -V	--version								# 显示版本信息。
          -i 											# 插入, i的后面可以接字串
      # sed "command"
          a\											# 在当前行下面插入文本。
          i\											# 在当前行上面插入文本。
          c\											# 把选定的行改为新的文本。
          d											# 删除,删除选择的行。
          D											# 删除模板块的第一行。
          s											# 替换指定字符
          h											# 拷贝模板块的内容到内存中的缓冲区。
          H											# 追加模板块的内容到内存中的缓冲区。
          g											# 获得内存缓冲区的内容,并替代当前模板块中的文本。
          G											# 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
          l											# 列表不能打印字符的清单。
          n											# 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
          N											# 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
          p											# 打印模板块的行。
          P											#(大写) 打印模板块的第一行。
          q											# 退出Sed。
          b											# lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
          r											# file 从file中读行。
          t											# label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
          T											# label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
          w											# file 写并追加模板块到file末尾。  
          W											# file 写并追加模板块的第一行到file末尾。  
          !											# 表示后面的命令对所有没有被选定的行发生作用。  
          =											# 打印当前行号码。  
      # 把注释扩展到下一个换行符以前。  
      # sed 替换标记
          g											# 表示行内全面替换。  
          p											# 表示打印行。  
          w											# 表示把行写入一个文件。  
          x											# 表示互换模板块中的文本和缓冲区中的文本。  
          y											# 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
          \1											# 子串匹配标记
          &											# 已匹配字符串标记
      # sed 元字符集
          ^											# 匹配行开始,如:/^sed/匹配所有以sed开头的行。
          $											# 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
          .											# 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
          *											# 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
          []											# 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。  
          [^]											# 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
          \(..\)										# 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
          &											# 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
          \<											# 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
          \>											# 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
          x\{m\}										# 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
          x\{m,\}										# 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
          x\{m,n\}									# 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。
      
  8. 用户管理&权限

    1. 管理命令

      useradd	'username'									# 建立用户账号,此命令只有root才可以使用
      	-d												# 指定用户登入时的起始目录
      	-e												# 指定用户账号的失效日期
      	-f												# 指定在密码过期后多少天既关闭该账
      	-g												# 指定用户所属的用户组
      	-G												# 指定用户所属的附加组
      	-r												# 建立系统用户账号
      	-s												# 指定用户登入后所使用的shell
      	-u												# 指定用户id
      	
      usermod 'username'									# 修改用户的基本信息,但不能修改已经登录系统使用的账户
      	-d												# 修改用户登录时的目录
      	-e												# 修改账号的有效期限
      	-g												# 修改用户所属的用户组
      	-G												# 修改用户所属的附加组
      	-l												# 修改用户账号名称
      	-L												# 锁定用户密码,使密码无效
      	-s												# 修改用户登录后锁使用的shell
      	-u												# 修改用户UID
      	-U												# 解除密码锁定
      
      userdel 'username'									# 删除用户的相关数据
      	-f												# 强制删除用户,即使用户当前已登录
      	-r												# 删除用户的同时,删除与用户相关的所有文件
      
      passwd 'username'									# 设置用户密码
      	-d												# 删除密码
      	-f												# 强制执行
      	-l												# 锁住用户密码
      	-s												# 列出密码的相关信息
      	-u												# 解开已锁定的账号
      	
      su 'username'										# 用户身份切换
      	-c<command>										# 执行完指定的命令后,既恢复原来的身份
      	-f												# 用于csh与tsch,使shell不读取启动文件
      	-l												# 变更用户身份时,变更环境变量
      	-s<shell>										# 指定要执行的shell
      	
      groupadd 'usergroupname'							# 建立新的用户组,只有系统管理员可以使用。
      	-g												# 指定新建用户组GID
      	-K												# 覆盖配置文件“/etc/login.defs”
      	-o												# 允许使用重复的用户组GID
      	-p												# 设置用户组密码
      	-r												# 创建系统用户组
      
      groupmod 'usergroupname'							# 修改用户组的相关信息
      	-g												# 修改用户组GID
      	-o												# 允许使用已存在的用户组GID
      	-n												# 修改用户组名称
      	
      gpasswd 'usergroupname'								# 将一个用户添加到用户组或者从用户组中删除。
      	-a												# 将一个用户加入到一个用户组中
      	-d												# 将一个用户从一个用户组中删除
      	-r												# 取消一个用户组的组密码
      	-R												# 限制其成员访问用户组
      	-A												# 指定用户组的管理员
      	
      groupdel 'usergroupname'							# 删除用户组,此命令root才可以使用。
      
      newgrp 'usergroupname'								# 用户的附加组中选择一个用户组
      
    2. 现代操作系统一般属于多用户的操作系统,普通用户相互之间不受影响。但是权限是有限制且用户太多的话,管理就不便。

    3. 所以系统会有一个超级用户来管理普通用户,并所在的组称为root组。“组”是具有相似权限的多个用户的集合。

    4. 这个root管理员就是所有UNIX系统中的超级用户,它拥有最高的系统所有权,能够管理系统的各项功能。因此“能力越大,责任越大”,root权限必须很好的掌握,否则一个错误的命令可能会摧毁整个系统。

    5. 在系统中有一个UID来区分用户0代表系统管理员、1~99是系统用户(Linux安装的服务程序都会创建独有的用户负责运行)、1000开始是普通用户。

    6. 不管任何系统中都会组这个概念,Linux 系统中还引入了用户组的概念。通过使用用户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中,从而方 便为组中的用户统一规划权限或指定任务。

    7. sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户使用sudo,则会发出邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。

      visudo /etc/sudoers									# 用visudo编辑sudoers表可以查错,只有root可以修改。
          root    ALL=(ALL)       ALL						# Allow root to run any commands anywhere
          chaoge  ALL=(ALL)       ALL   					# 允许chaoge在任何地方,执行任何命令
      sudo ls /root/										# 普通用户查看root用户的家目录
          -b												# 在后台执行指令;
          -h												# 显示帮助;
          -H												# 将HOME环境变量设为新身份的HOME环境变量;
          -k												# 结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。
          -l												# 列出目前用户可执行与无法执行的指令;
          -p												# 改变询问密码的提示符号;
          -s<shell>										# 执行指定的shell;
          -u<user>										# 以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;
          -v												# 延长密码有效期限5分钟;
          -V												# 显示版本信息。
      
  9. 权限

    1. 操作命令

      # 常见的文件类型
      	d												# 目录
      	-												# 普通文件
      	l												# 链接
      	b												# 可供储存的接口设备
      	c												# 串行端口设备
      
      # 权限划分
      	r	4											# 可读
      	w	2											# 可写
      	x	1											# 可执行
      # rwx有三组,第一组是创建者,第二组是组,第三组是其他用户
      
      chmod 'object'										# 设置问及那或目录的访问权限
      	+												# 增加某种权限
      	-												# 取消某种权限
      	=												# 赋予给定权限
      	-R												# 递归处理,将只当目录下的所有文件及子目录一并处理、
      chmod u+x /a.txt									# a用户对a.txt赋予x权限
      	u												# 表示文件锁属用户
      	g												# 表示文件所属组
      	o												# 表示文件所属组外其他用户
      	a												# 表示系统中所有用户
      
      chown 'username' 'file'								# 修改文件和目录的所属用户和所属组
      	-f												# 忽略错误信息
      	-R												# 处理指定目录以及目录下的所有文件
      	-v												# 显示详细的处理信息
      	
      chgrp 'username' 'file'								# 变更文件或目录的所属用户组
      	-f												# 忽略错误信息
      	-R												# 处理指定目录以及其子目录下的所有文件
      	-v												# 显示详细的处理信息
      	
      Set User ID											# 让执行者临时拥有所属用户权限。
      	chmod u+s or 4xxx file							# 添加SUID权限
      	chmod u-s or 0xxx file							# 取消SUID权限
      	
      Set Group ID										# 它是让执行者临时用户所属组的权限
      	chmod g+s or 2xxx file							# 添加SGID权限
      	chmod g-s or 0xxx file							# 取消SGID权限
      	
      StickBIT											# 主要用来防止其他用户修改或删除非本人的目录和文件。
      	chmod o+t or 1xxx file							# 添加SBIT权限
      	chmod o-t or 0xxx file							# 取消SBIT权限
      	
      Access Control List									# 一个针对文件或目录的访问控制列表,为文件系统提供一个额外的、更灵活的权限管理机制。
      getfacl	'path'										# 主要用来查看ACL权限
      	-a												# 仅显示文件访问控制列表
      	-c												# 不显示注释表头
      	-d												# 仅显示默认的访问控制列表
      	-e												# 显示所有的有效权限
      	-n												# 显示数字的用户或组标识
      	-t												# 使用制表符分隔的输出格式
      
      setfacl u:user2:r /etc								# 设置ACL权限,u代表用户,user2使用用户名,r是只读权限
      	-b												# 删除所有扩展访问控制列表条目
      	-d												# 应用到默认访问控制列表的操作
      	-k												# 移除默认访问控制列表
      	-m												# 更改文件的访问控制列表
      	-R												# 递归操作子目录
      	-x												# 根据文件中的访问控制列表移除条目
      
    2. Linux权限的目的是保护账户的资料,Linux权限主要依据三种身份来决定、文件属于哪个用户、文件属于哪个组、其他人。

    3. 权限就是对文件的增删改查的操作,有权限的就可以操作,没权限的就不可以操作。

    4. 查看权限ls -l /var/log/mysqld.log 、以空格划分分别为:权限、文件连接数、属主、属组、文件大小、修改日期时间、文件名。权限有10个杠第一个代表文件类型、2到4是当前用户权限、5到7是组权限、8到10是其他用户权限。

      # 类型
          -    											# 一般文件
          d    											# 文件夹
          l    											# 软连接(快捷方式)
          b    											# 块设备,存储媒体文件为主
          c    											# 代表键盘,鼠标等设备
      # 权限
          r     											# 数字为4 read可读,可以用cat等命令查看
          w    											# 数字为2 write写入,可以编辑或者删除这个文件
          x    											# 数字为1 executable,可以执行
      
    5. 修改文件权限属性

      chmod [u|g|o|a][=|-|+][r|w|x] [file]				# 修改权限,1.中是身份、2.是操作、3.是文件权限(|代表或,之选其中之一、[]只做区分)
      chmod [0~7|0~7|0~7] [file]							# 修改权限(|代表或,之选其中之一、[]只做区分)
      chown root pyyu.txt 								# 修改属主为root
      ll pyyu.txt 										# 查看信息
      chgrp root pyyu.txt 								# 修改属组
      
  10. 设置PS1

    1. 软连接软连接也叫做符号链接,类似于windows的快捷方式,创建软链接ln -s "file" "name"

    2. PS1变量是Linux命令提示符由PS1环境变量控制

      echo $PS1											# 查看ps1变量[\u@\h \W]\$
      	# 可以自行调整全局变量/etc/profile文件用于永久生效 PS1='[\u@\h \W\t]\$'
          \d												# 日期
          \H												# 完整主机名
          \h												# 主机名第一个名字
          \t												# 时间24小时制HHMMSS
          \T												# 时间12小时制
          \A												# 时间24小时制HHMM
          \u												# 当前用户账号名
          \v												# BASH的版本
          \w												# 完整工作目录
          \W												# 利用basename取得工作目录名
          \#												# 下达的第几个命令
          \$												# 提示字符,root为#,普通用户为$
      # PS1显示ip地址
      export PS1="[\u@\h `/sbin/ifconfig ens33 | sed -nr 's/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'` \w]\$"
      
  11. 解压命令:人们发明了各种各样的包,无论是双肩包,或者是装在口袋,都是为了让“文件”更方便携带。linux的文件打包工具最出名的是tar。

    1. tar 命令用来压缩和解压文件。tar本身不具有压缩功能。他是调用压缩功能实现的。

      tar -cf all_pic.tar *.jpg							# 压缩当前目录所有jpg结尾的文件
      tar -xjf xx.tar.bz2									# 解压缩bz2结尾的文件
          -A	--catenate									# 新增文件到以存在的备份文件;
          -B												# 设置区块大小;
          -c	--create									# 建立新的备份文件;
          -C <"directory">								# 这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
          -d												# 记录文件的差别;
          -x	--extract	--get							# 从备份文件中还原文件;
          -t	--list										# 列出备份文件的内容;
          -z	--gzip	--ungzip							# 通过gzip指令处理备份文件;
          -Z	--compress	--uncompress					# 通过compress指令处理备份文件;
          -f<"backups file">	--file=<"backups file">		# 指定备份文件;
          -v	--verbose									# 显示指令执行过程;
          -r												# 添加文件到已经压缩的文件;
          -u												# 添加改变了和现有的文件到已经存在的压缩文件;
          -j												# 支持bzip2解压文件;
          -v												# 显示操作过程;
          -l												# 文件系统边界设置;
          -k												# 保留原有文件不覆盖;
          -m												# 保留文件不被覆盖;
          -w												# 确认压缩文件的正确性;
          -p	--same-permissions							# 用原来的文件权限还原文件;
          -P	--absolute-names							# 文件名使用绝对名称,不移除文件名称前的“/”号;
          -N <"datetype">	--newer=<"datetime">			# 只将较指定日期更新的文件保存到备份文件里;
          --exclude=<"style">								# 排除符合范本样式的文件。
      
    2. gzip用来压缩文件,是个使用广泛的压缩程序,被压缩的以".gz"扩展名,gzip可以压缩较大的文件,以60%~70%压缩率来节省磁盘空间。

      gzip * 												# 压缩当前目录所有文件为.gz文件
      gzip -dv *											# 把上例中每个压缩的文件解压,并列出详细的信息
          -d	--decompress	----uncompress				# 解开压缩文件;
          -f	——force										# 强行压缩文件。
          -h	——help										# 在线帮助;
          -l	——list										# 列出压缩文件的相关信息;
          -L	——license									# 显示版本与版权信息;
          -r	——recursive									# 递归处理,将指定目录下的所有文件及子目录一并处理;
          -v	——verbose									# 显示指令执行过程;
      

磁盘管理

  1. linux系统中有一个重要的概念,一切都是文件。

  2. Linux支持多种文件系统:

    1. ext文件系统是linux扩展文件系统,它们采用日志式的管理机制,使文件系统具有更强的快速恢复能力。ext文件系统是Linux支持度最广、最完整的文件系统,但其最显著的缺点是,磁盘容量越大,格式化越慢。
    2. xfs文件系统是一种全性能的日志文件系统,其优点是处理大文件,同时提供平滑的数据传输。ext4单个文件最大是16TB,而xfs文件系统可以支持EB级别,从7.0开始选择xfs作为默认的文件系统了。
    3. swap文件系统是作为交换分区使用的,交换分区是必须建立的,并且他采用的文件系统类型必须是swap且没有其他选择。
    4. vfat文件系统是linux中DOS采用的,其实就是FAT文件系统。
    5. nfs文件系统是指网络文件系统,他可以在不同机器、不同操作系统之间建立网络共享文件,而且NFS文件系统访问速度快、稳定性高,尤其在嵌入式领域。
    6. ISO9660文件系统是光盘所使用的文件系统。
  3. 磁盘分区类型

    1. 分区就是将一个硬盘驱动器分成若干个逻辑驱动器,每一个硬盘分区的缩影称为分区。

    2. MBR分区是主引导记录,它是存在与驱动器开始部分的一个特殊的启动扇区。MBR支持最大2TB磁盘,MBR格式的磁盘分区主要分为主分区(primary partion)、扩展分区(extension partion)、逻辑分区(logical partion)。主分区数量不能大于4个,扩展分区最多只能有一个,在扩展分区上可以创建多个逻辑分区。

    3. GPT分区意为GUID分区表,驱动器上的每个分区都有一个全局唯一的标识符(GUID)。支持最大磁盘可达18EB,它没有主分区和逻辑分区,每个硬盘最多可以有128个分区,具有更强的兼容性,并且将逐步取代MBR分区方式。分区号直接从1开始累加一直到128.

    4. 硬盘容量查看

      df												# 显示Linux系统中文件系统的硬盘空间占用情况,以KB为单位显示容量大小。
      	-a											# 显示全部文件系统列表
      	-h											# 以KB、MB、GB等单位显示容量
      	-T											# 显示文件系统类型
      	-l											# 只显示本地文件系统
      	-t<File System Type>						# 只显示选定文件系统的信息
      	-x<File System Type>						# 不显示选定文件系统的情况
      
      du 'file'										# 显示指定的目录或文件所占用的磁盘空间大小。
      	-a											# 使用目录下每个文件所占磁盘空间大小
      	-h											# 以KB、MB、GB等单位显示占用磁盘空间大小
      	-s											# 显示目录占用磁盘空间大小
      	
      fdisk 'file'									# 硬盘划分为若干个区,同时也能为每个分区指定文件系统,但fdisk命令不支持大于2TB的分区操作。
      	-d											# 删除一个分区
      	-l											# 列出已知的分区类型
      	-m											# 显示帮助菜单
      	-n											# 创建一个分区
      	-p											# 显示分区列表
      	-q											# 不保存退出
      	-t											# 改变一个分区的类型
      	-u											# 改变显示的单位
      	-w											# 保存并退出
      	
      parted 'file'									# 用户容量大于2TB的硬盘分区,对于超过2TB硬盘,不能使用fdisk命令。	
      # 交互命令
      	mklabel										# 设置分区表的格式
      	mkpart										# 创建一个分区
      	name NUMBER NAME							# 给分区命名
      	print										# 打印分区表
      	quit										# 退出parted命令
      	rm NUMBER									# 删除一个分区
      	unit UNIT									# 修改显示单位
      	
      mkfs 'file'										# 用于对硬盘分区进行格式化,硬盘格式化其实就是创建文件系统。
      	-t 'FileSystemType' 'name'					# 将分区转为指定的文件系统
      
      mount dev/sdb1 /mnt/sdb1						# 用户挂载linux系统外的文件。磁盘或者分区经过格式化后,必须要挂载才能正常使用。
      	-a											# 自定挂载所有支持自动挂载的设备
      	-t 'filesystem'								# 指定要挂载的设备的文件系统类型,通常不必指定
      	-L 'name'									# 挂载指定卷标的分区
      	-o auto/noauto								# 是否允许此文件系统支持自动挂载,默认是auto
      	-o dev/nodev								# 是否支持在此文件系统上使用设备文件
      	-o exec/noexec								# 是否允许在此文件系统中执行可执行文件,默认是exec
      	-o suid/nosuid								# 是否支持在此文件系统上使用特殊权限,默认是具有
      	-oremount									# 重新挂载已经挂载的文件系统,一般用于指定修改特殊权限
      	-o rw/ro									# 文件挂载时,是否具有读写权限,默认是rw
      	-o user/nouser								# 是否允许普通用户挂载
      
      umount /dev/sr0									# 用于卸除文件系统,可卸除目前挂在Linux目录中的文件系统
       
      
  4. 磁盘高级应用

    1. LVM中文翻译为逻辑卷管理器,可以对磁盘分区管理。LVM还能通过快照在备份的过程中保证日志文件和表空间文件在同一时间点的一致性。
    2. 物理卷(Physical Volume,PV)。物理卷就是指磁盘分区或从逻辑上和磁盘分区具有同样功能的设备,是LVM的基本存储逻辑块。
    3. 卷组(Volume Group,VG)。一个卷组就是一个存储池,卷组建立在物理卷之上,一个卷组中至少包括一个物理卷,在卷组创建之后可以动态地扩展或缩小空间。
    4. 逻辑卷(Logical Volume,LV)。一个逻辑卷是卷组的一部分,由逻辑区段组成。逻辑卷可用文件系统格式化,并挂载到任意目录。
    5. 物理区域(Physical Extent,PE)。一个物理区段是一小段均匀的磁盘空间,物理卷可以分解为许多的物理区段。物理盘区是物理卷中可用于分配的最小的存储单元,物理盘区的大小可根据实际情况在建立物理卷的时候指定。物理盘区大小一旦确定将不能更改,同一卷组中所有的物理盘区大小都一致。
    6. 逻辑区段(Logical Extent,LE)。每个物理区段关联着一个逻辑区段,这些逻辑区段可以组成一个逻辑卷。
  5. 物理卷管理

    pvcreate /dev/sdb1									# 用于将物理硬盘分区初始化为逻辑卷
    pvscan 												# 用于扫描系统中所有硬盘,列出找到的物理卷列表。
    	-e												# 仅显示属于卷组的物理卷
    	-n												# 仅显示不属于任何卷组的物理卷
    	-s												# 短格式输出
    	-u												# 显示UUID
    pvdisplay /dev/sdb1									# 用于使用物理卷的属性,包括物理卷名称、所属的卷组、物大小、EP大小、总PE数、可用PE数、已分配的PE数和UUID。
    	-s												# 短格式输出
    	-m												# 显示PE到LV和LE的映射、
    	
    pvremove /dev/sdb8									# 用户删除一个存在的物理卷
    
    vgcreate vg1 /dev/sdb1								# 用于创建LVM卷组。卷组可以将多个物理卷组织成一个整体,屏蔽了底层卷细节。vg1是卷组名
    	-l												# 卷组上允许创建的最大逻辑卷数
    	-p												# 卷组中允许添加的最大物理卷数
    	-s												# 卷组上的物理卷的PE大小
    	
    vgscan												# 用于查找系统中存在的LVM卷组,并显示找到的卷组列表。
    
    vgs													# 用于格式化输出卷组信息报表,用于vgs命令仅能得到卷组的简要信息。
    vgdisplay vg1										# 用于显示LVM卷组的属性信息,如果不指定卷组名,则分别显示所有卷组的属性。
       	-A												# 仅显示活动卷组的属性
       	-s												# 短格式输出
    
    vgreduce vg3 /dev/sdb7								# 用于从卷组中删除物理卷,通过删除LVM卷组中的物理卷来减少卷组容量,但不能删除LVM卷组中剩余的最后一个物理卷。
    
    vgextend vg3 /dev/sdb7								# 用于增加卷组容量,通过向卷组中添加物理卷来增加卷组的容量。
    
    vgremove vg4 										# 用于删除一个存在的卷宗
    
    lvcreate -L 300M va1								# 用于创建LVM的逻辑卷,逻辑卷是创建在卷组之上的。
       	-L												# 指定逻辑卷的容量
       	-l												# 通过设定LE数量指定逻辑卷的容量
       	-n												# 指定逻辑卷名
       	-s												# 创建快照
    
    lvscan												# 用于扫描系统中存在的所有的LVM逻辑卷,并显示找到的逻辑卷列表。
    lvdisplay /dev/vg2/lv1								# 用于显示LVM逻辑卷的属性信息,包括LVM逻辑卷空间大小、读写状态和快照信息等属性。
    
    lvreduce -L -400M /dev/vg2/lvl						# 用于减少LVM逻辑卷占用的空间大小,减少逻辑卷的空间大小有可能会删除逻辑卷上已有的数据,所以在操作前必须惊醒确认操作。
       	-L												# 减少逻辑卷的容量大小
       	-l												# 减少逻辑卷的容量大小(LE数量)
    
    lvextend -L -400M /dev/vg2/lvl						# 用于在线扩展逻辑卷的空间大小,而不中断应用程序对逻辑卷的访问。
    lvremove /dev/vg2/lv1								# 用于删除指定LVM逻辑卷。如果逻辑卷已经使用mount命令加载,则不能使用lvremove命令删除,必须使用 umount命令卸载后,逻辑卷方可被删除。
    
    mdadm												# 命令可以创建磁盘阵列,也可以管理磁盘阵列。
    	-C or --create									# 创建RAID
    	-l or --level									# 指定要创建的RAID的级别
    	-n or --raid-devices							# 指定RAID中活跃设备的数目
    	-x or --spare-device							# 指定RAID中备份设备的数目
    	-c or --chunk									# 指定块大小,以KB为单位,默认为64KB
    	-a or --auto									# 创建设备文件,使用时需要加上参数yes、no,默认yes
    	-f or --force									# 允许使用一块硬盘创建RAID
    	--manage										# 管理RAID中的设备
    	-a or --add										# 给RAID添加设备
    	-f or --fail									# 指定RAID中某设备状态为错误
    	-r or --remove									# 从RAID中移除设备,只能移除状态为错误和备份的设备。
    	-A or --assemble								# 用于重组RAID,配合-s
    	-D or --detail									# 用于显示RAID的详细信息
    	-S or --stop									# 用于停止RIAD
    	-G or --grow									# 用于增加磁盘设备,为阵列扩容
    

网络认识

  1. Http协议,全称是HyperText Tansfer Protocol,中文叫超文本传输协议,是互联网最常见的协议。Http最重要的是www(World Wide Web)服务,也叫web服务器,中文叫“万维网”。web服务端口默认是80,另外一个加密的www服务应用https默认端口是443,主要用于支付,网银相关业务

  2. 版本:http协议诞生以来有若干个版本,主要是http/1.0 http/1.1;http/1.0规定浏览器和服务器只能保持短暂的连接,浏览器的每次请求都需要和服务器建立一个TCP连接,服务器完成请求后即断开TCP连接,服务器不跟踪每个链接,也不记录请求;http/1.1是对HTTP的缺陷进行重点修复,从可扩展性,缓存,带宽优化,持久连接,host头,错误通知等访问改进;http/1.1支持长连接,增加了更多的请求头和响应头信息,例如配置请求头的Connection的值为keep-alive,表示请求结果返回后保持连接。

  3. Http请求方法:在HTTP通信中,每个请求报文都包含一个方法,以告诉web服务器端需要执行哪些操作,这些动作被称为HTTP的请求方法

    1    GET     # 请求指定的页面信息,并返回实体主体。
    2    HEAD    # 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
    3    POST    # 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
    4    PUT     # 从客户端向服务器传送的数据取代指定的文档的内容。
    5    DELETE  # 请求服务器删除指定的页面。
    6    CONNECT # HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
    7    OPTIONS # 允许客户端查看服务器的性能。
    8    TRACE   # 回显服务器收到的请求,主要用于测试或诊断。
    
  4. HTTP状态码,HTTp状态码表示web服务器响应http请求状态的数字代码

    常见状态码以及作用是
    1**    信息,服务器收到请求,需要请求者继续执行操作
    2**    成功,操作被成功接收并处理
    3**    重定向,需要进一步的操作以完成请求
    4**    客户端错误,请求包含语法错误或无法完成请求
    5**    服务器错误,服务器在处理请求的过程中发生了错误
    
  5. HTTP状态码的命令查看

    curl -I www.oldboyedu.com
    Server: OES
    Date: Sun, 12 Aug 2018 04:18:24 GMT
    Content-Type: text/html
    Content-Length: 152
    Connection: keep-alive
    Location: https://www.oldboyedu.com/
    
  6. Http报文

    1. HTTP请求由请求行,请求头部,空行,请求报文主体几个部分组成

    2. HTTP报文:它是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文都是在客户端、服务器和代理之间流动。

      请求报文的格式:
          起始行: <method> <request-URL> <version>
          头部:   <headers>
          主体:   <entity-body>
      
    3. 请求行:请求报文第一行,表示客户端想要什么,由请求方法 url 协议版本   组成。

    4. 请求头部:请求头由 关键字 : 值 组成,通过客户端把请求相关信息告诉服务器。

    5. 空行:请求头信息之后是一个空行,发送回车和换行符,通知web服务器以下没有请求头信息了。

    6. 请求报文主体

       POST / HTTP/1.1
       Host: www.example.com
       User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
       Gecko/20050225 Firefox/1.0.1
       Content-Type: application/x-www-form-urlencoded
       Content-Length: 40
       Connection: Keep-Alive
      
       sex=man&name=Professional 
      
    7. 请求体中包含了要发送给web服务器的数据信息,请问报文主体不用于get方法,而是用于post方法。post方法适用于客户端填写表单的场合。

  7. HTTP响应报文

    1. HTTP 响应与 HTTP 请求相似,HTTP响应也由3个部分构成,分别是:状态行、响应头(Response Header)、响应正文。

    2. 状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。

    3. 状态行,用来说明服务器响应客户端的状况,一般分为协议版本号,数字状态码,状态情况。

      常见响应头信息
      Connection: Keep-Alive
      Content-Encoding: gzip
      Content-Type: text/html;charset=utf-8
      Date: Mon, 13 Aug 2018 06:06:54 GMT
      Expires: Mon, 13 Aug 2018 06:06:54 GMT
      
    4. 空白行,通知客户端空行以下没有头部信息了。响应报文主体,主要包含了返回给客户端的数据,可以是文本,二进制(图片,视频)。

  8. 静态网页资源

    1. 在网页设计中,纯HTMl格式的网页(包含图片,视频,JS,CSS等样式)通常被称作“静态网页”。
    2. 静态网页是相对于动态网页而言的,是指没有后台数据库,不包含程序,不可交互的网页。
    3. 开发人员写了什么,显示就是什么,一旦编写完成,就不会有任何改变。静态网页一般适用于更新较少的展示型网页,例如(酒水,家具,水果等宣传页),是很多中小网站的展示方式。
    4. 静态网页重要特性
      1. 每个页面有一个固定的url地址,url地址不含有问号"?“或”&"等符号
      2. 网页一经发布到服务器,网页内容是保存在服务器文件系统上的,每个网页都是独立的一个文件
      3. 网页内容固定不变,容易被搜索引擎收录(优点)
      4. 网页没有数据库支撑,在网站制作和维护上工作量很大(缺点)
      5. 网页的交互性很差,缺少程序的功能实现(缺点)
      6. 客户端解析网址时,由于不需要读取数据库,因此服务器端可以接受更高的并发访问。请求到来时,直接从磁盘上返回数据。(优点)
    5. 有关高并发架构思想:在高并发,高访问量的场景下做架构优化时,比较关键的就是把动态网页转化成静态网页,而不是直接请求数据库和动态服务器,并且可以吧静态内容推到缓存中,这样就提升用户体验,节约服务器压力成本。
  9. 动态网页资源

    1. 动态网页是和静态网页相对而言的,动态网页的url后缀一般是.asp .aspx .php .js .cgi 并且动态网页都有标志性的符号"? &",后端都有数据库的支持。
    2. 动态网页资源特点:
      1. 网页以数据库技术为支撑,大大降低网站维护的工作量。
      2. 动态网页技术的网站可以实现更多的功能,如用户注册,用户登录,投票,用户管理,博客管理等。
      3. 动态网页不是独立存在服务器上的网页文件,用户请求动态程序时,服务器解析程序并且可能读取数据库返回一个完整的网页内容。
      4. 搜索引擎(爬虫)一般不会抓取网址中的“?”后面的内容,因此企业都会做伪静态技术页面。
  10. 网站流量术语

    1. 网站统计一般以数值较大的IP,PV统计,比较好看
    2. IP:IP即Internet Protocol,这里是指独立ip数,不同的ip地址的计算机访问网站时被计算的总次数。独立ip数是网站流量的一个重要指标。一般相同ip地址的客户端访问网站页面一天内只会被计算一次。
    3. PV:pv(Page View)即是页面浏览量,不管客户端是不是相同,也不管ip是否相同,用户只要访问网站页面就会被计算PV,一次计算一个PV。pv的度量方法就是客户端从浏览器发出一个web请求(request),服务器接收请求返回一个页面给客户端,这样就产生一个pv。pv是衡量网站被访问的一个标准,但并不准确有多少人访问了网站。
    4. UV:UV即unique visitor,同一个客户端(pc或移动端)访问网站被计算为一个访客。一天内相同的客户端访问同一个网站只计一次uv,uv是以cookie等技术为统计依据,实际统计存在误差。一台计算机可能有多人使用,因此uv也不是最准确的。
    5. 并发数:并发数指系统同时能处理的请求数量,也反应了系统的负载能力。
    6. 响应时间:响应时间是指执行一个请求从开始到最后收到响应数据所花费的总体时间。
    7. QPS:Query Per Second每秒查询数,服务器在一秒内处理了多少个请求,显然数字越大代表服务器的负载越高,处理能力越强。
  11. 如果电脑上找不到ifconfig哪应该是你在安装Linux时并没有安装上,如果向往下学就是用yum install net-tools -y 它去下载即可。

  12. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令。

    ifup eth33	 										# 脚本命令,更简单的方式启动网络
    ifdown eth33										# 脚本命令,更简单的方式关闭网络
    ip													# 符合指令,直接修改上述功能,这个ip命令是结合了ifconfig和route两个命令的功能。
    	ip addr show 									# 查看ip信息
    cat /etc/redhat-release 							# 查看系统版本信息
    uname -r											# 查看内核版本号
    uname -m											# 查看系统多少位
    uname -a											# 查看内核所有信息
    
  13. 网卡配置文件详解

    /etc/sysconfig/network								# 网络配置文件
    /etc/sysconfig/network-scripts/ifcfg-INTERFACE_NAME	# 网络接口配置文件
        DEVICE=											# 关联的设备名称,要与文件名的后半部“INTERFACE_NAME”保持一致; 
        BOOTPROTO={static|none|dhcp|bootp}				# 引导协议;要使用静态地址,使用static或none;dhcp表示使用DHCP服务器获取地址;
        IPADDR=											# IP地址
        NETMASK=										# 子网掩码
        GATEWAY=										# 设定默认网关;
        ONBOOT=											# 开机时是否自动激活此网络接口;
        HWADDR=											# 硬件地址,要与硬件中的地址保持一致;可省;
        USERCTL={yes|no}								# 是否允许普通用户控制此接口;
        PEERDNS={yes|no}								# 是否在BOOTPROTO为dhcp时接受由DHCP服务器指定的DNS地址;
    
  14. ifconfig是网络中必须要用到的,不然你是无法查看ip的除IP addr

    ifconfig											# 查询、设置网卡和ip等参数,其中inet代表ip地址、netmask代表子网掩码、broadcast代表广播地址
    ifconfig eth0										# 单独显示eth0的信息
        eth0											# 网卡的代号 
        lo												# 回环地址loopback
        inet											# IPv4的Ip地址
        netmask											# 子网掩码
        broadcast										# 广播地址
        RX/TX 											# 流量发/收情况 tx是发送(transport),rx是接收(receive)
        packets											# 数据包数
        errors											# 数据包错误数
        dropped											# 数据包有问题被丢弃的数量
        collisions										# 数据包碰撞情况,数值太多代表网络状况差
    
  15. netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况。

    netstat -tunlp										# 查看网络信息
        -t	--tcp										# 显示TCP传输协议的连线状况;
        -u	--udp										# 显示UDP传输协议的连线状况;
        -n	--numeric									# 直接使用ip地址,而不通过域名服务器;
        -l	--listening									# 显示监控中的服务器的Socket;
        -p	--programs									# 显示正在使用Socket的程序识别码和程序名称;-a或--all:显示所有连线中的Socket;
    
  16. ps 命令用于查看系统中的进程状态。

    ps													# 查看系统中的进程状态
        -a												# 显示所有进程
        -u												# 用户以及其他详细信息
        -x												# 显示没有控制终端的进程
    
  17. kill命令用来删除执行中的程序或工作。kill可将指定的信息送至程序。

    ps -ef | grep vim									# ps查找进程
    kill 3268											# 用kill杀掉
    	-a												# 当处理当前进程时,不限制命令名和进程号的对应关系;
        -l <"infonum">									# 若不加<信息编号>选项,则-l参数会列出全部的信息名称;
        -p												# 指定kill 命令只打印相关进程的进程号,而不发送任何信号;
        -s <"infoname or infonum">						# 指定要送出的信息;
        -u												# 指定用户。
    # 只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略,**下面是常用的信号:**
        HUP     1    									# 终端断线
        INT     2    									# 中断(同 Ctrl + C)
        QUIT    3    									# 退出(同 Ctrl + \)
        TERM   15    									# 终止
        KILL    9    									# 强制终止
        CONT   18    									# 继续(与STOP相反, fg/bg命令)
        STOP   19    									# 暂停(同 Ctrl + Z)
    # 通常来讲,复杂软件的程序会有多个进程提供服务,如果逐个去结束这些进程会比较麻烦,此时可以使用 killall 命令来批量结束某个服务程序带有的全部进程。
    killall nginx     
    
  18. 其他一些配置的操作

    # df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。
    df													# 查看系统磁盘设备,默认是KB为单位:
        -h	--human-readable							# 以可读性较高的方式来显示信息;
        -k	--kilobytes									# 指定区块大小为1024字节;
        -T	--print-type								# 显示文件系统的类型;
        --help											# 显示帮助;
        --version										# 显示版本信息。
    tree												# 命令以树状图列出目录的内容。
        -a												# 显示所有文件和目录;
        -A												# 使用ASNI绘图字符显示树状图而非以ASCII字符组合;
        -C												# 在文件和目录清单加上色彩,便于区分各种类型;
        -d												# 先是目录名称而非内容;
        -D												# 列出文件或目录的更改时间;
        -f												# 在每个文件或目录之前,显示完整的相对路径名称;
        -F												# 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","@","|"号;
        -g												# 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码;
        -i												# 不以阶梯状列出文件和目录名称;
        -l												# <范本样式> 不显示符号范本样式的文件或目录名称;
        -l												# 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录;
        -n												# 不在文件和目录清单加上色彩;
        -N												# 直接列出文件和目录名称,包括控制字符;
        -p												# 列出权限标示;
        -P												# <范本样式> 只显示符合范本样式的文件和目录名称;
        -q												# 用“?”号取代控制字符,列出文件和目录名称;
        -s												# 列出文件和目录大小;
        -t												# 用文件和目录的更改时间排序;
        -u												# 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码;
        -x												# 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该目录予以排除在寻找范围外。
    hostnamectl set-hostname "pyyuc"					# 设置主机名
    
  19. Linux中文显示设置:此项优化为可选项,根据个人情况选择是否调整Linux系统的字符集,字符集就是一套文字符号以及编码。Linux下常用字符集有:GBK实际企业应用较少、UTF-8广泛支持,MYSQL也使用UTF-8,企业广泛使用。

    echo $LANG												# 查看系统当前字符集
    #检查xshell crt的字符集
    # vim /etc/profile.d/locale.sh
        export LC_CTYPE=zh_CN.UTF-8							# 命令修改字符集
        export LC_ALL=zh_CN.UTF-8
    # vim /etc/locale.conf
        LANG=zh_CN.UTF-8
    # vim /etc/sysconfig/i18n
        LANG=zh_CN.UTF-8
    # vim /etc/environment
        LANG=zh_CN.UTF-8
        LC_ALL=zh_CN.UTF-8
        
    # 英文版本
    # vim /etc/profile.d/locale.sh
        export LC_CTYPE=en_US.UTF-8
        export LC_ALL=en_US.UTF-8
    
    # vim /etc/locale.conf
        LANG=en_US.UTF-8
    
    # vim /etc/sysconfig/i18n
        LANG=en_US.UTF-8
    
    # vim /etc/environment
        LANG=en_US.UTF-8
        LC_ALL=en_US.UTF-8
        
    # 乱码核心解决办法,:系统字符集utf8,xshell字符集utf8,文件字符集一致zh_CN.UTF-8。
    
  20. DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。查看Linux的dns,唯一配置文件cat /etc/resolv.conf,本地强制dns解析文件vi /etc/hosts,前面是ip后面是域名。

  21. nslookup命令是常用域名查询工具,就是查DNS信息用的命令。nslookup4有两种工作模式,即“交互模式”和“非交互模式”。在“交互模式”下,用户可以向域名服务器查询各类主机、域名的信息,或者输出域名中的主机列表。而在“非交互模式”下,用户可以针对一个主机或域名仅仅获取特定的名称或所需信息。进入交互模式,直接输入nslookup命令,不加任何参数,则直接进入交互模式,此时nslookup会连接到默认的域名服务器(即/etc/resolv.conf的第一个dns地址)。或者输入nslookup -nameserver/ip。进入非交互模式,就直接输入nslookup 域名就可以了。解析nslookup www.oldboyedu.com

  22. crond:有些事情是要定时完成的,我们就要用到,crond服务相关的软件包rpm -qa |grep cron,crontab命令被用来提交和管理用户的需要周期性执行的任务。这些包在最小化安装系统时就已经安装了,并且会开机自启动crond服务,并为我们提供好编写计划任务的crontab命令。

    cat /etc/crontab									# 在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件
    crontab -e
    	*/3 * * * * /usr/sbin/ntpdate ntp1.aliyun.com  	# 每隔三分钟执行下时间同步
        -e												# 编辑该用户的计时器设置;
        -l												# 列出该用户的计时器设置;
        -r												# 删除该用户的计时器设置;
        -u<"username">									# 指定要设定计时器的用户名称。存放定时任务的文件/var/spool/cron
    *****command										# 代表,分钟(0-59)、小时(0-23)、日期(1-31)、月份(1-12)、星期(0-6,0代表星期天)、命令
    	*												# 代表所有可能的值
    	,												# 可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
    	-												# 可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
    	/												# 可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。
    
    注意:
    
    1. 查看计划任务的执行:tail -f /var/log/cron
    2. 写计划任务时,命令必须加上绝对路径,否则会出现这种情况:从日志中看,确实触发了计划任务的执行,但是命令却没有执行成功,比如* * * * * reboot就会出现这种情况,需要将reboot写成/usr/sbin/reboot
    3. 计划任务执行的命令 是否存在,软件是否安装 
    4. 确保crontab服务运行 :`systemctl status cron`&`ps -ef|grep crond`。
    5. 检测crontab是否开机启动:`systemctl is-enabled crond`
    6. crontab配置文件
    
  23. 系统服务管理命令 :如果大家之前学习或者使用过RHEL6系统,应该已经习惯了service、chkconfig等命令来管理系统服务,但是在RHEL7系统中改变了systemctl来管理系统服务。

    # System V init(RHEL6)
    	service foo start										# 启动服务
        service foo restart										# 重启服务
        service foo stop										# 停止服务
        service foo reload										# 重新加载配置文件(不终止服务)
        service foo status										# 查看服务状态
        chkconfig foo on										# 开机自动启动
        chkconfig foo off										# 开机不自动启动
        chkconfig foo											# 查看特定服务是否为启动
    # System V init(RHEL7)
    	systemctl start foo.service								# 启动服务
        systemctl restart foo.service							# 重启服务
        systemctl stop foo.service								# 停止服务
        systemctl reload foo.service							# 重新加载配置文件(不终止服务)
        systemctl status foo.service							# 查看服务状态
        systemctl enable foo.service							# 开机自动启动
        systemctl disable foo.service							# 开机不自动启动
        systemctl is-enabled foo.service						# 查看特定服务是否为启动
    
  24. /etc:这个目录用来存放所有的系统管理所需要的配置文件和子目录。

    /etc/sysconfig/network-script/ifcfg-eth0					# 网卡配置文件
    /etc/sysconfig/network										# 修改机器名以及网卡,网管等配置
    /etc/resolv.conf											# linux的dns客户端配置文件,实现域名和ip的互相解析
    /etc/hosts/													# 本地dns解析文件,设定ip和域名的对应解析,开发测试最常用的临时域名解析
    /etc/profile												# 系统全局环境变量永久生效的配置文件,如PATH等
    ~/.bash_profile												# 用户的环境变量
    ~/.bashrc													# 用户的环境变量
    /usr/sbin													# 存放可执行程序的目录,大多是系统管理命令
    /usr/local													# 存放用户自编译安装软件的目录  > 等同于C:\Program files (windows)
    /proc/cpuinfo												# 关于处理器的信息,还可以top指令查看
    /proc/meminfo 												# 查看内存信息,还可以free -m
    
  25. SELinux(Security-Enhanced Linux)防火墙 是美国国家安全局(NSA)对于强制访问控制的实现,这个功能管理员又爱又恨,大多数生产环境也是关闭的做法,安全手段使用其他方法。

    # 永久关闭方式
    # 1.修改配置文件,永久生效关闭selinux
    cp /etc/selinux/config /etc/selinux/config.bak 		# 修改前备份
    # 2.用sed替换
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    # 3.检查状态
    grep "SELINUX=disabled" /etc/selinux/config
    
    # 临时关闭selinux(命令行修改,重启失效)
    getenforce 											# 获取selinux状态
    # 修改selinux状态
    setenforce 
    usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]
    # 数字0 表示permissive,给出警告,不会阻止,等同disabled
    # 数字1表示enforcing,表示开启
    
  26. iptables防火墙,在学习阶段,关闭防火墙可以更方便的学习,在企业环境中,一般只有配置外网ip的linux服务器才会开启防火墙,但是对于高并发流量的业务服务器仍然是不能开启的,会有很大性能损失,因此需要更nb的硬件防火墙。

    # centos7默认已经使用firewall作为防火墙了
    # 1.关闭防火墙
    systemctl status firewalld 							# 查看防火墙状态
    systemctl stop firewalld    						# 关闭防火墙
    systemctl disable firewalld							# 关闭防火墙开机启动systemctl is-enabled firewalld.service
    #检查防火墙是否启动
    
  27. 软件包顾名思义就是将应用程序、配置文件和数据打包的产物,所有的linux发行版都采用了某种形式的软件包系统,这使得linux软件管理和在windows下一样方便,suse、red hat、fedora等发行版都是用rpm包,Debian和Ubuntu则使用.deb格式的软件包。

  28. RPM:软件包管理器核心功能,制作软件包.rpm,安装、卸载、升级、查询、校验。在 RPM(红帽软件包管理器)公布之前,要想在 Linux 系统中安装软件只能采取源码包 的方式安装。早期在 Linux 系统中安装程序是一件非常困难、耗费耐心的事情。RPM 机制则为解决这些问题而设计的。RPM 有点像 Windows 系统中的控制面板,会建 立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系。

    wget https://xx.net/xx.rpm							# 下载软件包
    rpm -i filename.rpm
    	i												# 表示安装   
    	v												# 显示详细过程  
    	h												# 以进度条显示
    rpm -ivh filename.rpm  								# 安装软件的命令格式   
    rpm -Uvh filename.rpm								# 升级软件的命令格式
    rpm -e filename.rpm									# 卸载软件的命令格式,需要手动解决依赖,不如 yum remove
    rpm -qpi filename.rpm								# 查询软件描述信息的命令格式
    rpm -qpl filename.rpm								# 列出软件文件信息的命令格式
    rpm -qf filename									# 查询文件属于哪个 RPM 的命令格式
    
  29. yum:yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

    1. 尽管 RPM 能够帮助用户查询软件相关的依赖关系,但问题还是要运维人员自己来解决, 而有些大型软件可能与数十个程序都有依赖关系,在这种情况下安装软件会是非常痛苦的。 Yum 软件仓库便是为了进一步降低软件安装难度和复杂度而设计的技术。Yum 软件仓库可以 根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安 装到系统。

    2. Yum 软件仓库中的 RPM 软件包可以是由红帽官方发布的,也可以是第三方发布的,当然也可以是自己编写的。

    3. yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。

      yum install yum-fastestmirror							# 自动搜索最快镜像插件
          -h													# 显示帮助信息;
          -y													# 对所有的提问都回答“yes”;
          -c													# 指定配置文件;
          -q													# 安静模式;
          -v													# 详细模式;
          -d													# 设置调试等级(0-10);
          -e													# 设置错误等级(0-10);
          -R													# 设置yum处理一个命令的最大等待时间;
          -C													# 完全从缓存中运行,而不去下载或者更新任何头文件。
      
    4. yum源配置,说到yum源就必须说到linux系统中特有的依赖关系问题,yum就是为了解决依赖关系而存在的。yum源就相当是一个目录项,当我们使用yum机制安装软件时,若需要安装依赖软件,则yum机制就会根据在yum源中定义好的路径查找依赖软件,并将依赖软件安装好。

    5. YUM的基本工作机制如下:

      1. 服务器端:在服务器上面存放了所有的RPM软件包,然后以相关的功能去分析每个RPM文件的依赖性关系,将这些数据记录成文件存放在服务器的某特定目录内。
      2. 客户端:如果需要安装某个软件时,先下载服务器上面记录的依赖性关系文件(可通过WWW或FTP方式),通过对服务器端下载的纪录数据进行分析,然后取得所有相关的软件,一次全部下载下来进行安装。
    6. yum源的目录ll /etc/yum.repos.d/,查看yum源文件,以repo结尾的都是yum源配置文件,BASE.repo是主文件。

    7. 配置阿里云yum源

      mkdir /repo_bak												# 创建备份文件夹
      cp *.repo /repo_bak/										# 将yum源备份到创建的文件下
      wget http://mirrors.aliyun.com/repo/Centos-7.repo			# 下载阿里云repo文件
      yum clean allyum makecache									# 清空yum缓存并且生成新的yum缓存
      yum install -y epel-release									# 安装软件扩展源
      
    8. yum的操作

      yum repolist all											# 列出所有仓库
      yum list all												# 列出仓库所有软件包
      yum info "appname"											# 查看软件包信息
      yum install "appname"										# 安装软件包
      yum reinstall "appname"										# 重新安装软件包
      yum update "appname"										# 升级软件包
      yum remove "appname"										# 移除软件包
      yum clean all												# 清楚所有仓库缓存
      yum check-update											# 检查可以更新的软件包
      yum grouplist												# 查看系统中已安装的软件包
      yum groupinstall "appgroup"									# 安装软件包组
      

Python

  1. Installer Python3.

    # 安装python前的库环境,非常重要
    yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
    wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz
    # 在win系统上用迅雷到https://www.python.org/downloads/release/python-362/地址下载
    yum install lrzsz
    rz -y
    xz -d Python-3.6.7.tar.xz								# 解压xz
    tar -xf Python-3.6.7.tar								# 解压tar
    
    # 生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制
    cd /opt/Python-3.4.7									# 进入的是解压后的文件夹
    ./configure --prefix=/opt/python						# 这后面的是要将解释器存储的位置
    make && make install									# 编译
    
    # 配置软连接,快捷启动python3和pip3
    	ln -s /opt/python347/bin/python3    /usr/bin/python3
    	ln -s /opt/python347/bin/pip3  /usr/bin/pip3
    	
    # 配置系统环境变量,配置PATH,加入python3的目录
    	PATH=$PATH:/opt/python347/bin/
    	/etc/profile # 这个文件开机后自动加载,可以实现永久设置。
    
  2. 虚拟环境:在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题;我们需要对于不同的工程使用不同的虚拟环境来保持开发环境以及宿主环境的清洁。virtualenv 可以在系统中建立多个不同并且相互不干扰的虚拟环境。

    pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
    pip3 install --upgrade pip
    mkdir Myproject|cd Myproject							# 创建存放虚拟解释器的目录
    virtualenv --no-site-packages --python=python3  venv	# 创建独立运行环境-命名,得到独立第三方包的环境,并且指定解释器是python3
    source venv/bin/activate								# 进入虚拟环境,此时进入虚拟环境(venv)Myproject
    (venv)Myproject: pip3 install django==1.9.8				# 安装第三方包,此时pip的包都会安装到venv环境下,venv是针对Myproject创建的
    deactivate												# 退出venv环境
    # virtualenv原理很简单,就是把系统Python复制一份到virtualenv的环境,用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。
    
  3. 自动虚拟环境:virtualenv的一个最大的缺点就是:每次开启虚拟环境之前要去虚拟环境所在目录下的 bin 目录下 source 一下 activate,这就需要我们记住每个虚拟环境所在的目录。并且还有可能你忘记了虚拟环境放在哪。一种可行的解决方案是,将所有的虚拟环境目录全都集中起来,例如/opt/all_venv/,并且针对不同的目录做不同的事。使用virtualenvwrapper管理你的虚拟环境(virtualenv),其实他就是统一管理虚拟环境的目录,并且省去了source的步骤。

    pip3 install virtualenvwrapper							# 安装virtualenvwrapper
    # 设置Linux的环境变量,每次启动就加载virtualenvwrapper
    # 把下面两行代码添加到 ~/.bashrc文件中
    vim ~/.bashrc
        # 写入以下两行代码
        export WORKON_HOME=~/Envs   						# 设置virtualenv的统一管理目录
        export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'   # 添加virtualenvwrapper的参数,生成干净隔绝的环境
        export VIRTUALENVWRAPPER_PYTHON=/opt/python347/bin/python3     	# 指定python解释器
        source /opt/python34/bin/virtualenvwrapper.sh 		# 执行virtualenvwrapper安装脚本
        
    # 基本使用virtualenvwrapper
    mkvirtualenv my_django115								# 创建一个虚拟环境,这会在 ~/Envs 中创建 my_django115 文件夹。
    workon my_django115										# 在虚拟环境上工作:激活虚拟环境my_django115
    mkvirtualenv my_django2									# 再创建一个新的虚拟环境
    virtualenvwrapper										# 提供环境名字的tab补全功能.
    workon													# 可以列出所有虚拟环境,
    workon django1.15										# 可以在多个虚拟环境中来回切换
    deactivate												# 也可以手动停止虚拟环境
    rmvirtualenv my_django115								# 删除虚拟环境,需要先退出虚拟环境
    
    # 常用其他命令
    lsvirtualenv											# 列举所有的环境。
    cdvirtualenv											# 导航到当前激活的虚拟环境的目录中,比如说这样您就能够浏览它的 site-packages 。
    cdsitepackages											# 和上面的类似,但是是直接进入到 site-packages 目录中。
    lssitepackages											# 显示 site-packages 目录中的内容。完整官网介绍:https://virtualenvwrapper.readthedocs.io/en/latest/command_ref.html
    
  4. 确保开发环境的一致性:假设我们在本地开发环境,准备好了项目+依赖包环境现在需要将项目上传至服务器,上线发布,那么就要保证服务器的python环境一致性。解决方案:

    pip3 freeze > requirements.txt   						# 通过命令保证环境的一致性,导出当前python环境的包
    pip3 install -r requirements.txt						# 上传至服务器后,在服务器下创建virtualenv,在venv中导入项目所需的模块依赖
    
  5. 这将会创建一个 requirements.txt 文件,其中包含了当前环境中所有包及 各自的版本的简单列表。可以使用 “pip list”在不产生requirements文件的情况下, 查看已安装包的列表。

MySQL

  1. MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

  2. yum安装mariadb,Red Hat Enterprise Linux/CentOS 7.0 发行版已将默认的数据库从 MySQL 切换到 MariaDB。

    # 安装前先用命令卸载旧的版本
    rpm -qa mariadb-libs
    yum remove mariadb-libs
    
    vi /etc/yum.repos.d/MariaDB.repo						# 编辑创建mariadb.repo仓库文件
        [mariadb]											# 添加repo仓库配置
        name = MariaDB
        baseurl = http://yum.mariadb.org/10.1/centos7-amd64
    	gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
        gpgcheck=
    yum install MariaDB-server MariaDB-client -y			# 当 MariaDB 仓库地址添加好后,你可以通过下面的一行命令轻松安装 MariaDB。
    # 启动mariadb相关命令
    systemctl start mariadb  								# 启动MariaDB
    systemctl stop mariadb  								# 停止MariaDB
    systemctl restart mariadb  								# 重启MariaDB
    systemctl enable mariadb  								# 设置开机启动
    
  3. 初始化mysql在确认 MariaDB 数据库软件程序安装完毕并成功启动后请不要立即使用。为了确保数据库的安全性和正常运转,需要先对数据库程序进行初始化操作。这个初始化操作涉及下面 5 个 步骤。

    1. 设置 root 管理员在数据库中的密码值(注意,该密码并非 root 管理员在系统中的密码,这里的密码值默认应该为空,可直接按回车键)。
    2. 设置 root 管理员在数据库中的专有密码。
    3. 随后删除匿名账户,并使用 root 管理员从远程登录数据库,以确保数据库上运行的业务的安全性。
    4. 删除默认的测试数据库,取消测试数据库的一系列访问权限。
    5. 刷新授权列表,让初始化的设定立即生效。
  4. 确保mariadb服务器启动后,执行命令初始化

    mysql_secure_installation								# 初始化mariadb
    	Set root password? 									# 设置root用户密码?
    	Remove anonymous users?								# 删除匿名用户?
    	Disallow root login remotely?						# 禁止root远程登陆?
    	Remove test database and access to it?				# 删除test数据库并取消对它的访问权限?
    	Reload privilege tables now?						# 刷新授权表,让初始化后的设定立即生效?
    
  5. 用户的基本操作

    set password = PASSWORD('redhat123');					# 修改mysql密码
    # 为了数据库的安全以及和其他用户协同管理数据库,就需要创建其他数据库账户,然后分配权限,满足工作需求。
    create user yuch@'127.0.0.1' identified by 'redhat123';	# 创建新用户
    use mysql;												# 进入mysql数据库
    select host,user,password from user where user='yuch';	# 查看指定用户的连接、密码、用户名
    mysql -uyuchao -p -h 127.0.0.1							# 切换普通用户yuch
    
  6. 数据库权限设置,权限就是“create、insert、update、delete…”

    # mysql使用grant命令对账户进行授权,grant命令常见格式如下
    grant "permissions" on "database"."tablename" to "username"@"computername"		# 对特定数据库中的特定表授权
    grant "permissions" on "database".* to "username"@"computername"				# 对特定数据库中的所有表给与授权
    grant "permissions","permissions" on *.* to "username"@"computername"			# 对所有库中的所有表给与多个授权
    grant all privileges on *.* to "username"@"computername"						# 对所有库和所有表授权所有权限
    revoke all privileges on *.* to "username"@"computername"						# 移除权限
    
  7. 中文编码设置,编辑mysql配置文件/etc/my.cnf,下入以下内容

    [mysqld]
    character-set-server=utf8
    collation-server=utf8_general_ci
    log-error=/var/log/mysqld.log
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    
  8. 授权配置

    grant all privileges on *.* to root@'%' identified by 'password';		# 远程连接设置哦设置所有库,所有表的所有权限,赋值权限给所有ip地址的root用户
    mysql > create user 'username'@'%' identified by 'password';			# 创建用户
    flush privileges;														# 刷新权限
    
  9. 数据库备份与恢复

    mysqldump -u root -p --all-databases > /tmp/db.dump						# mysqldump命令用于备份数据库数据
    mysqldump -uroot -proot --databases db1 db2 >/tmp/user.sql				# 导出db1、db2两个数据库的所有数据
    drop database s11;														# 进入mariadb数据库,删除一个db
    mysql -uroot -p < /tmp/db.dump											# 进行数据恢复,吧刚才重定向备份的数据库文件导入到mysql中
    
  10. MySQL数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上。MySQL数据库支持单向、双向、链式级联,等不同业务场景的复制。在复制的过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(slave),接收来自Master上binlog文件的日志内容,解析出SQL,重新更新到Slave,使得主从服务器数据达到一致。在生产环境中,MySQL主从复制都是异步的复制方式,即不是严格的实时复制,但是给用户的体验都是实时的。MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,且有效的保护了服务器宕机的数据备份。

  11. master主库配置

    systemctl status mariadb												# 查看数据库状态
    systemctl stop mariadb													# 停mariadb
    vim /etc/my.cnf															# 修改配置文件
    	[mysqld]
    	server-id=1															# 解释:server-id服务的唯一标识(主从之间都必须不同); 
    	log-bin=mysql-bin													# log-bin启动二进制日志名称为mysql-bin
    systemctl start mariadb													# 重启mariadb
    
    # master主库添加从库账号
    create user 'chaoge'@'192.168.178.130' identified by 'redhat';			# 新建用于主从同步的用户chaoge,允许登录的从库是'192.168.178.130'
    set global validate_password_policy=0;									# 题外话:如果提示密码太简单不复合策略加在前面加这句
    grant replication slave on *.* to 'chaoge'@'192.168.178.130';			# 给从库账号授权,说明给chaoge从库复制的权限,在192.168.178.130机器上复制
    select user,host from mysql.user;										# 检查主库创建的复制账号
    show grants for chaoge@'192.168.178.130';								# 检查授权账号的权限
    flush table with read lock;												# 实现对主数据库锁表只读,防止数据写入,数据复制失败
    show master status														# 检查主库的状态,File是二进制日志文件名,Position 是日志开始的位置。
    mysqldump -uroot -p --all-databases > /data/all.sql 					# 锁表后,一定要单独再打开一个SSH窗口,导出数据库的所有数据,
    show master status;														# 确保数据导出后,没有数据插入,完毕再查看主库状态
    unlock tables;															# 导出数据完毕后,解锁主库,恢复可写;
    scp /data/all.sql root@192.168.178.130:/data/							# 将备份导出的数据scp至Slave数据库
    
  12. slave从库配置

    # 方式一
    # 设置server-id值并关闭binlog功能参数,数据库的server-id在主从复制体系内是唯一的,Slave的server-id要与主库和其他从库不同,并且注释掉Slave的binlog参数。
    # 因此修改Slave的/etc/my.cnf,写入
        [mysqld]
        server-id=3
    systemctl restart mariadb											# 重启数据库
    # 检查Slava从数据库的各项参数
    show variables like 'log_bin';
    show variables like 'server_id';
    source /data/all.sql;												# 恢复主库Master的数据导入到Slave库,导入数据(注意sql文件的路径)
    
    # 方法二
    #mysql -uroot -p  < abc.sql 
    # 配置复制的参数,Slave从库连接Master主库的配置
    change master to master_host='192.168.178.129',
    master_user='chaoge',
    master_password='redhat',
    master_log_file='mysql-bin.000001',
    master_log_pos=575;
    start slave;														# 启动从库的同步开关,测试主从复制的情况
    show slave status\G;												# 查看复制状态
    
    # 注意此处还未配置从库的只读模式,只需在slave服务器上配置/etc/my.cnf,加上以下配置,并且在slave上创建普通用户,使用普通用户主从同步即可达到只读的效果
    [mysqld]
    character-set-server=utf8
    collation-server=utf8_general_ci
    log-error=/var/log/mysqld.log
    server-id=3
    read-only=true
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    

NoSQL

  1. 存储结构与mysql这一种关系型数据库完全不同,nosql存储的是KV形式,nosql有很多产品,都有自己的api和语法,以及业务场景。

  2. Nosql和sql的区别,应用场景不同,sql支持关系复杂的数据查询,nosql反之。sql支持事务性,nosql不支持

  3. redis特性,Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,redis是c语言编写的,支持数据持久化,是key-value类型数据库。

  4. redis优势,性能高,读取速度10万次每秒,写入速度8万次每秒,所有操作支持原子性用作缓存数据库,数据放在内存中替代某些场景下的mysql,如社交类app大型系统中,可以存储session信息,购物车订单。

    # 前提得配置好阿里云yum源,epel源
    yum list redis														# 查看是否有redis包						
    redisyum install redis -y											# 安装
    redissystemctl start redis											# 安装好,启动
    redis-cli    														# redis 客户端工具
    ping																# 进入交互式环境后,执行ping,返回pong表示安装成功
    
  5. 源码安装redis,编译安装,大家用过yum,是相当省事好用吧,为什么还要学习源码安装?

  6. 编译安装的优势是:编译安装时可以指定扩展的module(模块),php、apache、nginx都是一样有很多第三方扩展模块,如mysql,编译安装时候,如果需要就定制存储引擎(innodb,还是MyIASM)、编译安装可以统一安装路径,linux软件约定安装目录在/opt/下面、软件仓库版本一般比较低,编译源码安装可以根据需求,安装最新的版本。

    wget http://download.redis.io/releases/redis-4.0.10.tar.gz			# 下载redis源码
    tar -zxf redis-4.0.10.tar.gz										# 解压缩
    cd redis-4.0.10.tar.gz												# 切换redis源码目录
    make|make install 									 				# 编译源文件,安装到指定目录,默认在/usr/local/bin
    # 编译好后,src/目录下有编译好的redis指令
    
  7. redis可执行文件

    ./redis-benchmark													# 用于进行redis性能测试的工具
    ./redis-check-dump													# 用于修复出问题的dump.rdb文件
    ./redis-cli															# redis的客户端
    ./redis-server														# redis的服务端
    ./redis-check-aof													# 用于修复出问题的AOF文件
    ./redis-sentinel													# 用于集群管理
    
  8. redis配置文件,redis配置文件名为redis.conf 这个文件可以自定义。

    # redis.conf核心配置项
    bind 127.0.0.1														# 绑定ip,如需要远程访问,需要填写服务器ip
    port 																# 端口,redis启动端口
    daemonize yes														# 守护进程方式运行
    dbfilename dump.rdb													# rdb数据文件
    dir /var/lib/redis/													# 数据文件存放路径
    logfile /var/log/redis/redis-server.log								# 日志文件
    slaveof 															# 主从复制
    
  9. 启动redis服务端,启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件:./redis-server ,../redis.conf默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379。

  10. 使用redis客户端

    ./redis-cli															# 执行客户端命令即可进入
        ping															# 测试是否连接上redis,返回pong代表连接上了
        set name "chaoge"												# 用set来设置key、value
        get name														# get获取name的值
    

Redis数据结构

  1. redis是一种高级的key:value存储系统,其中value支持五种数据类型:字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)。

    keys *																# 查看所有key
    type key															# 查看key类型
    expire key seconds													# 过期时间
    ttl key																# 查看key过期剩余时间,-2表示key已经不存在了
    persist																# 取消key的过期时间,-1表示key存在,没有过期时间
    exists key															# 判断key存在,存在返回1,否则0
    del keys															# 删除key,可以删除多个
    dbsize																# 计算key的数量
    
  2. strings

    set name 'yu'														# 设置key
    get name															# 获取value
    append name ' dsb'													# 追加key的string
    mset user1 'alex' user2 'xiaopeiqi'									# 设置多个键值对
    keys *																# 找到所有key
    mget user1 user2 name												# 获取多个value
    del name															# 删除key
    incr num															# 递增+1
    decr num															# 递减1  
    
  3. list

    lpush duilie 'alex' 'peiqi' 'ritian'  								# 新建一个duilie,从左边放入三个元素
    rpush duilie 'chaoge'   											# 从右边插入chaoge
    lrange duilie 0 -1  												# 查看duilie所有元素
    ltrim duilie 0 2  													# 截取队列的值,从索引0取到2,删除其余的元素
    lpop 																# 删除左边的第一个
    rpop 																# 删除右边的第一个
    llen duilie  														# 查看duilie长度
    lpushx duilie2  'dsb'  												# key存在则添加 dsb元素,key不存在则不作处理
    
  4. sets集合类型,redis的集合,是一种无序的集合,集合中的元素没有先后顺序。

    sadd zoo  wupeiqi yuanhao  											# 添加集合,有三个元素,不加引号就当做字符串处理
    srem zoo  wupeiqi 													# 删除zoo里面的alex
    smembers zoo  														# 查看集合zoo成员
    sismember zoo wupeiqi  												# 返回改是否是zoo的成员信息,不存在返回0,存在返回1
    sdiff zoo zoo2 														# 差集
    sinter zoo zoo1														# 交集
    sunion  zoo zoo1													# 并集
    
  5. 有序集合都是以z开头的命令,zset的每一个成员都有一个分数与之对应,并且分数是可以重复的。有序集合的增删改由于有啦排序,执行效率就是非常快速的,即便是访问集合中间的数据也是非常高效的。

    ZADD zoo  wupeiqi yuanhao  											# 添加集合,有三个元素,不加引号就当做字符串处理
    ZREVRANGE mid_test 0 -1 withscores									# 降序
    ZRANGE mid_test 0 -1 withscores										# 升序
    ZREM mid_test xiaofneg												# 删除一个
    ZCARD mid_test														# 基数
    ZSCORE mid_test alex												# score值
    ZRANK mid_test wusir												# zrank返回有序集合中,成员的排名。默认按score,从小到大排序。
    
  6. 哈希数据结构,哈希结构就是 k1 -> k1 : v1 如同字典 套字典 { k1 : { k2: v2 } } ,取出v2 必须 k1,取出k2。

    hset news1   title "first news title" 								# 设置第一条新闻 news的id为1,添加数据title的值是"news title"
    hget news1  content  												# 获取news的内容
    hmget news1  title content   										# 获取多对news:1的 值
    hmset news2 title "second news title" content "second Contents2"   	# 设置第二条新闻news:2 多个field
    hkeys news1   														# 获取新闻news:1的所有key
    hvals news1   														# 获取新闻news:1的所有值
    hlen news1    														# 获取新闻news:1的长度
    hdel news1 title   													# 删除新闻news:1的title
    hexists news1 title    												# 判断新闻1中是否有title,不存在返回0,存在返回1
    hsetnx  															# 如果散列已经存在,则不设置(防止覆盖key)
    

Redis安全

  1. 由于发现众多同学,在使用云服务器时,安装的redis3.0+版本都关闭了protected-mode,因而都遭遇了挖矿病毒的攻击,使得服务器99%的占用率!!因此我们在使用redis时候,最好更改默认端口,并且使用redis密码登录。

  2. redis没有用户概念,redis只有密码、redis默认在工作在保护模式下。不允许远程任何用户登录的(protected-mode)。

    # redis.conf设置
        protected-mode yes												# 打开保护模式
        port 6380														# 更改默认启动端口
        requirepass xxxxxx												# 设置redis启动密码,xxxx是自定义的密码
    # 启动redis服务端
    	redis-server /opt/redis-4.0.10/redis.conf &     				# 指定配置文件启动redis,且后台启动
    # 使用密码登录redis,使用6380端口
    
    # 方法1,使用这个
    redis-cli -p 6380
        auth xxxx
    # 方法2,此方案不安全,容易暴露密码
    redis-cli -p 6380 -a xxxx
        Warning: Using a password with '-a' option on the command line interface may not be safe.
        ping
    
    # CONFIG set requirepass "xxxxxx"									# 如果没有,也可以给redis设置密码(命令方式)
    

Redis主从同步

  1. 原理:

    1. 从服务器向主服务器发送 SYNC 命令。
    2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
    3. 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
    4. 主服务器将缓冲区储存的所有写命令发送给从服务器执行。
  2. 在开启主从复制的时候,使用的是RDB方式的,同步主从数据的

  3. 同步开始之后,通过主库命令传播的方式,主动的复制方式实现

  4. 2.8以后实现PSYNC的机制,实现断线重连

  5. 环境准备

    mkdir /data/638{0..2}  												# 创建6380 6381 6382文件夹
    # 配置文件示例:
    vim   /data/6380/redis.conf
        port 6380
        daemonize yes
        pidfile /data/6380/redis.pid
        loglevel notice
        logfile "/data/6380/redis.log"
        dbfilename dump.rdb
        dir /data/6380
        protected-mode no
    vim   /data/6381/redis.conf
        port 6381
        daemonize yes
        pidfile /data/6381/redis.pid
        loglevel notice
        logfile "/data/6381/redis.log"
        dbfilename dump.rdb
        dir /data/6381
        protected-mode no
    vim   /data/6382/redis.conf
        port 6382
        daemonize yes
        pidfile /data/6382/redis.pid
        loglevel notice
        logfile "/data/6382/redis.log"
        dbfilename dump.rdb
        dir /data/6382
        protected-mode no
    
    # 启动三个redis实例
    redis-server /data/6380/redis.conf
    redis-server /data/6381/redis.conf
    redis-server /data/6382/redis.conf
    # 配置主从同步, 6381/6382命令行
    redis-cli -p 6381
    	SLAVEOF 127.0.0.1 6380 											# 指明主的地址
    redis-cli -p 6382
    	SLAVEOF 127.0.0.1 6380 											# 指明主的地址
    # 检查主从状态
    # 从库:
    127.0.0.1:6382> info replication
    127.0.0.1:6381> info replication
    
    # 主库:
    127.0.0.1:6380> info replication
    
  6. 手动进行主从故障切换

    redis-cli -p 6380
    shutdown															# 关闭主库6380
    # 既然主库挂了,我想要在6381 6382之间选一个新的主库
    # 1.关闭6381的从库身份
        redis-cli -p 6381
        info replication
        slaveof no one
    # 2.将6382设为6381的从库
        redis-cli -p 6382
        SLAVEOF no one
        SLAVEOF 127.0.0.1 6381
    

Redis-Sentinel

  1. Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能。
  2. 而redis-sentinel就是一个独立运行的进程,用于监控多个master-slave集群,自动发现master宕机,进行自动切换slave > master。
  3. sentinel主要功能如下:
    1. 不时的监控redis是否良好运行,如果节点不可达就会对节点进行下线标识
    2. 如果被标识的是主节点,sentinel就会和其他的sentinel节点“协商”,如果其他节点也人为主节点不可达,就会选举一个sentinel节点来完成自动故障转义
    3. 在master-slave进行切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
Sentinel的工作方式
  1. 每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
  2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
  3. 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
  4. 当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
  5. 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令
  6. 当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
  7. 若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
  8. 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
  9. 主观下线和客观下线
    1. 主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断。
    2. 客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover.
  10. SDOWN适合于Master和Slave,只要一个 Sentinel 发现Master进入了ODOWN, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对下线的主服务器执行自动故障迁移操作。
  11. ODOWN只适用于Master,对于Slave的 Redis 实例,Sentinel 在将它们判断为下线前不需要进行协商, 所以Slave的 Sentinel 永远不会达到ODOWN。
redis主从复制背景问题
  1. Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用:
    1. 一旦主节点宕机,从节点作为主节点的备份可以随时顶上来。
    2. 扩展主节点的读能力,分担主节点读压力。
  2. 但是问题是:
    1. 一旦主节点宕机,从节点上位,那么需要人为修改所有应用方的主节点地址(改为新的master地址),还需要命令所有从节点复制新的主节点
  3. 那么这个问题,redis-sentinel就可以解决了。
Redis Sentinel架构
  1. redis的一个进程,但是不存储数据,只是监控redis。

  2. Sentinel会通过命令连接向被监视的主从服务器发送“HELLO”信息,该消息包含Sentinel的ip、端口号、ID等内容,以此来向其他Sentinel发布自己的存在。与此同时Sentinel会通过订阅连接接收其他Sentinel的“HELLO”信息,以此来发现监视同一个主服务器的其他Sentinel。

  3. Redis Sentinel故障转移

    1. 多个sentinel发现并确认master有问题后,选举出一个sentinel作为领导。
    2. 选出一个slave作为master,通知其余slave成为新的master的slave。
    3. 通知客户端主从变化,等待老的master复活成为新master的slave。
  4. redis命令整理

    # 官网地址:http://redisdoc.com/
    redis-cli info 															# 查看redis数据库信息
    redis-cli info replication 												# 查看redis的复制授权信息
    redis-cli info sentinel   												# 查看redis的哨兵信息
    
安装与配置
  1. 本实验是在测试环境下,考虑到学生机器较弱,因此只准备一台linux服务器用作环境!!

  2. 服务器环境,一台即可完成操作master 192.168.119.10

  3. 主节点master的redis-6379.conf

    port 6379
    daemonize yes
    logfile "6379.log"
    dbfilename "dump-6379.rdb"
    dir "/var/redis/data/"
    
  4. 从节点slave的redis-6380.conf

    port 6380
    daemonize yes
    logfile "6380.log"
    dbfilename "dump-6380.rdb"
    dir "/var/redis/data/" 
    slaveof 127.0.0.1 6379      // 从属主节点
    
  5. 从节点slave的redis-6381.conf

    port 6381
    daemonize yes
    logfile "6380.log"
    dbfilename "dump-6380.rdb"
    dir "/var/redis/data/" 
    slaveof 127.0.0.1 6379      // 从属主节点
    
  6. 启动redis主节点redis-server /etc/redis-6379.conf

  7. 测试redis主节点是否通信redis-cli ping

  8. 启动两slave节点

    -rw-r--r-- 1 root root 145 Nov  7 17:44 /etc/redis-6379.conf      # 这个为主,port是6379
    -rw-r--r-- 1 root root  93 Nov  7 17:42 /etc/redis-6380.conf    # 这个是从,port6380,并且得加上新的参数slaveof
    -rw-r--r-- 1 root root 115 Nov  7 17:42 /etc/redis-6381.conf      # 这个是从,port6381,并且得加上新的参数slaveof
    # redis-6380.conf slave配置文件详解,6381端口的配置文件,仅仅和6380端口不一样
    port 6380
    daemonize yes
    logfile "6379.log"
    dbfilename "dump-6379.rdb"
    dir "/var/redis/data"
    # Generated by CONFIG REWRITE
    slaveof 127.0.0.1 6379
    
  9. redis配置文件

  10. 启动slave从节点的redis服务:redis-server /etc/redis-6380.confredis-server /etc/redis-6381.conf

  11. 验证从节点的redis服务:redis-cli -p 6380 pingredis-cli -p 6381 ping

  12. 确定主从关系

    # 在主节点上查看主从通信关系
        [root@master ~]# redis-cli  -p 6379 info replication
        # Replication
        role:master
        connected_slaves:2
        slave0:ip=192.168.119.10,port=6380,state=online,offset=407,lag=0
        slave1:ip=192.168.119.10,port=6381,state=online,offset=407,lag=0
        master_repl_offset:407
        repl_backlog_active:1
        repl_backlog_size:1048576
        repl_backlog_first_byte_offset:2
        repl_backlog_histlen:406
    # 在从节点上查看主从关系(6380、6379)
        [root@slave 192.168.119.11 ~]$redis-cli  -p 6380 info replication
        # Replication
        role:slave
        master_host:192.168.119.10
        master_port:6379
        master_link_status:up
        master_last_io_seconds_ago:3
        master_sync_in_progress:0
        slave_repl_offset:505
        slave_priority:100
        slave_read_only:1
        connected_slaves:0
        master_repl_offset:0
        repl_backlog_active:0
        repl_backlog_size:1048576
        repl_backlog_first_byte_offset:0
        repl_backlog_histlen:0
    
  13. 开始配置Redis Sentinel

    [root@master tmp]# ll /etc/redis-*
    -rw-r--r-- 1 root root 556 Nov  7 17:42 /etc/redis-sentinel-26379.conf
    # redis-sentinel-26379.conf配置文件写入如下信息redis-sentinel-26379.conf配置文件写入如下信息
        // Sentinel节点的端口
        port 26379  
        dir /var/redis/data/
        logfile "26379.log"
    
        // 当前Sentinel节点监控 192.168.119.10:6379 这个主节点
        // 2代表判断主节点失败至少需要2个Sentinel节点节点同意
        // mymaster是主节点的别名
        sentinel monitor mymaster 192.168.119.10 6379 2
    
        //每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
        sentinel down-after-milliseconds mymaster 30000
    
        //当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
        sentinel parallel-syncs mymaster 1
    
        //故障转移超时时间为180000毫秒
        sentinel failover-timeout mymaster 180000
        
    redis-sentinel-26380.conf和redis-sentinel-26381.conf的配置仅仅差异是port(端口)的不同。
    # 然后启动三个sentinel哨兵
    redis-sentinel /etc/redis-sentinel-26379.conf
    redis-sentinel /etc/redis-sentinel-26380.conf
    redis-sentinel /etc/redis-sentinel-26381.conf
    
    # 此时查看哨兵是否成功通信
        [root@master ~]# redis-cli -p 26379  info sentinel
        # Sentinel
        sentinel_masters:1
        sentinel_tilt:0
        sentinel_running_scripts:0
        sentinel_scripts_queue_length:0
        sentinel_simulate_failure_flags:0
        master0:name=mymaster,status=ok,address=192.168.119.10:6379,slaves=2,sentinels=3#看到最后一条信息正确即成功了哨兵,哨兵主节点名字叫做mymaster,状态ok,监控地址是192.168.119.10:6379,有两个从节点,3个哨兵
    
redis高可用故障实验
  1. 大致思路

    1. 杀掉主节点的redis进程6379端口,观察从节点是否会进行新的master选举,进行切换
    2. 重新恢复旧的“master”节点,查看此时的redis身份
  2. 首先查看三个redis的进程状态:ps -ef|grep redis

  3. 检查三个节点的复制身份状态。

    # 第一个
        [root@master tmp]# redis-cli -p 6381 info replication
        # Replication
        role:slave
        master_host:127.0.0.1
        master_port:6380
    # 第二个
        [root@master tmp]# redis-cli -p 6380 info replication
        # Replication
        role:master
        connected_slaves:2
        slave0:ip=127.0.0.1,port=6381,state=online,offset=54386,lag=0
        slave1:ip=127.0.0.1,port=6379,state=online,offset=54253,lag=0
    # 第三个
        [root@master tmp]# redis-cli -p 6379 info replication
        # Replication
        role:slave
        master_host:127.0.0.1
        master_port:6380
    # 此时,干掉master!!!然后等待其他两个节点是否能自动被哨兵sentienl,切换为master节点
    ps -ef|grep 6380   		# 干掉master进程
    
    # 此时查看两个slave的状态,精髓就是查看一个参数
    master_link_down_since_seconds:13
    
    # 稍等片刻之后,发现slave节点成为master节点!!
        [root@master tmp]# redis-cli -p 6379 info replication
        # Replication
        role:master
        connected_slaves:1
        slave0:ip=127.0.0.1,port=6381,state=online,offset=41814,lag=1
    

Redis-Cluster配置

  1. 并发问题:redis官方生成可以达到 10万/每秒,每秒执行10万条命令,假如业务需要每秒100万的命令执行呢?
  2. 数据量太大:一台服务器内存正常是16~256G,假如你的业务需要500G内存。新浪微博作为世界上最大的redis存储,就超过1TB的数据,去哪买这么大的内存条?各大公司有自己的解决方案,推出各自的集群功能,核心思想都是将数据分片(sharding)存储在多个redis实例中,每一片就是一个redis实例。
  3. 解决方案:正确的应该是考虑分布式,加机器,把数据分到不同的位置,分摊集中式的压力,一堆机器做一件事。
  4. 客户端分片:redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。redis实例集群主要思想是将redis数据的key进行散列,通过hash函数特定的key会映射到指定的redis节点上。
  5. 数据分布理论:分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。
  6. 常见的分区规则有哈希分区和顺序分区。Redis Cluster采用哈希分区规则,因此接下来会讨论哈希分区规则。节点取余分区、一致性哈希分区、虚拟槽分区(redis-cluster采用的方式)。
    1. 顺序分区是在3个节点获得3分支1的任务,并且资源从小到大一次分配。
    2. 哈希分区,节点取余的方式,分三个节点1~100的数据对3取余,可以分为三类,0、1、2。
    3. 一致性哈希,客户端进行分片,哈希+顺时针取余。
  7. 虚拟槽分区
    1. Redis Cluster采用虚拟槽分区
    2. 虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。
    3. Redis Cluster槽的范围是0 ~ 16383。槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,每个节点负责一定数量的槽。
搭建redis cluster
  1. 搭建集群分为几部:准备节点、节点通信、分配槽位给节点。

  2. redis-cluster集群架构:多个服务端,负责读写,彼此通信,redis指定了16384个槽。多匹马儿,负责运输数据,马儿分配16384个槽位,管理数据。ruby的脚本自动就把分配槽位这事做了

  3. 安装方式:官方提供通过ruby语言的脚本一键安装。

  4. 环境准备:通过配置,开启redis-cluster

    port 7000
    daemonize yes
    dir "/opt/redis/data"
    logfile "7000.log"
    dbfilename "dump-7000.rdb"
    cluster-enabled yes   #开启集群模式
    cluster-config-file nodes-7000.conf  #集群内部的配置文件
    cluster-require-full-coverage no  #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no
    
  5. redis支持多实例的功能,我们在单机演示集群搭建,需要6个实例,三个是主节点,三个是从节点,数量为6个节点才能保证高可用的集群。

  6. 每个节点仅仅是端口运行的不同!

    [root@yugo /opt/redis/config 17:12:30]#ls
    redis-7000.conf  redis-7002.conf  redis-7004.conf
    redis-7001.conf  redis-7003.conf  redis-7005.conf#确保每个配置文件中的端口修改!!
    
  7. 运行redis实例:创建6个节点的redis实例

     1855  2018-10-24 15:46:01 redis-server redis-7000.conf
     1856  2018-10-24 15:46:13 redis-server redis-7001.conf
     1857  2018-10-24 15:46:16 redis-server redis-7002.conf
     1858  2018-10-24 15:46:18 redis-server redis-7003.conf
     1859  2018-10-24 15:46:20 redis-server redis-7004.conf
     1860  2018-10-24 15:46:23 redis-server redis-7005.conf
    
  8. 检查日志文件:cat 7000.log

  9. 检查redis服务的端口、进程:netstat -tunlp|grep redisps -ef|grep redis

  10. 此时集群还不可用,可以通过登录redis查看

    redis-cli -p 7000
    set hello world
    
  11. 创建开启redis-cluster,准备ruby环境:下载、编译、安装Ruby|安装rubygem redis|安装redis-trib.rb命令。

    1. 安装ruby(这些命令可以放入一个sh脚本文件里)

      #下载ruby
      wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
      
      #安装ruby
      tar -xvf ruby-2.3.1.tar.gz
      ./configure --prefix=/opt/ruby/
      make && make install
      #准备一个ruby命令#准备一个gem软件包管理命令
      #拷贝ruby命令到path下/usr/local/ruby
      cp /opt/ruby/bin/ruby /usr/local/cp bin/gem /usr/local/bin
      
    2. 安装ruby gem 包管理工具

      wget http://rubygems.org/downloads/redis-3.3.0.gem
      
      gem install -l redis-3.3.0.gem
      #查看gem有哪些包
      gem list -- check redis gem
      
    3. 安装redis-trib.rb命令:cp /opt/redis/src/redis-trib.rb /usr/local/bin/

  12. 一键开启redis-cluster集群

    #每个主节点,有一个从节点,代表--replicas 1
    redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    #集群自动分配主从关系  7000、7001、7002为 7003、7004、7005 主动关系
    
  13. 查看集群状态

    redis-cli -p 7000 cluster info  
    redis-cli -p 7000 cluster nodes  #等同于查看nodes-7000.conf文件节点信息
    集群主节点状态
    redis-cli -p 7000 cluster nodes | grep master
    集群从节点状态
    redis-cli -p 7000 cluster nodes | grep slave
    
  14. 安装完毕后,检查集群状态:redis-cli -p 7000 cluster info

  15. 测试写入集群数据,登录集群必须使用redis-cli -c -p 7000必须加上-c参数

    127.0.0.1:7000> set name chao     
    -> Redirected to slot [5798] located at 127.0.0.1:7001       
    OK
    127.0.0.1:7001> exit
    [root@yugo /opt/redis/src 18:46:07]#redis-cli -c -p 7000
    127.0.0.1:7000> ping
    PONG
    127.0.0.1:7000> keys *
    (empty list or set)
    127.0.0.1:7000> get name
    -> Redirected to slot [5798] located at 127.0.0.1:7001
    "chao"
    

Nginx

  1. nginx是一个开源的,支持高性能,高并发的Web服务和代理服务软件。它是一个俄罗斯人lgor sysoev开发的,作者将源代码开源出来供全球使用。

  2. nginx比它大哥apache性能改进许多,nginx占用的系统资源更少,支持更高的并发连接,有更高的访问效率。nginx不但是一个优秀的web服务软件,还可以作为反向代理,负载均衡,以及缓存服务使用。安装更为简单,方便,灵活。

  3. 我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务。

  4. Web 网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的 请求后才会响应,最终用于提供服务程序的 Web 服务器会通过 HTTP(超文本传输协议)或 HTTPS(安全超文本传输协议)把请求的内容传送给用户。

  5. 目前能够提供 Web 网络服务的程序有 IIS、Nginx 和 Apache 等。其中,IIS(Internet Information Services,互联网信息服务)是 Windows 系统中默认的 Web 服务程序。

  6. web服务器和web框架的不同在于web服务器用于接收请求并返回向应资源,而web框架接收请求后会对请求做出处理并返回处理结果。

  7. Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。

  8. OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。

    yum install gcc-c++												# nginx编译依赖gcc 环境
    yum install -y pcre pcre-devel									# perl兼容的正则表达式库
    yum install -y zlib zlib-devel									# 使用zlib对http包的内容进行gzip	
    yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
    																# 下载依赖
    wget -c https://nginx.org/download/nginx-1.12.0.tar.gz			# 下载源码包
    tar -zxvf nginx-1.12.0.tar.gz									# 解压缩源码
    # 配置,编译安装  开启nginx状态监测功能
    ./configure --prefix=/opt/nginx1-12/ --with-http_ssl_module --with-http_stub_status_module 
    make && make install 
    cd sbin															# 启动nginx,进入sbin目录,找到nginx启动命令
    ./nginx 														# 启动
    ./nginx -s stop 												# 关闭
    ./nginx -s reload 												# 重新加载
    
    netstat -tunlp |grep 80											# 安装完成后检测服务
    curl -I 127.0.0.1												# 如果访问不了,检查selinux,iptables
    vi nginx.conf
    location /{
        root   html;  												# 默认站点html文件夹,也就是/opt/nginx1-12/html/文件夹下
        index  index.html index.htm; 								# 站点首页文件名是index.html
    }
    
    # Nginx的目录结构:
    	conf 														# 存放nginx所有配置文件的目录,主要nginx.conf
    	html 														# 存放nginx默认站点的目录,如index.html、error.html等
    	logs 														# 存放nginx默认日志的目录,如error.log access.log
    	sbin 														# 存放nginx主命令的目录,sbin/nginx
    
  9. Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。

  10. Module

    # CoreModule核心模块
        user www;                      								# Nginx进程所使用的用户
        worker_processes 1;             							# Nginx运行的work进程数量(建议与CPU数量一致或auto)
        error_log /log/nginx/error.log  							# Nginx错误日志存放路径
        pid /var/run/nginx.pid          							# Nginx服务运行后产生的pid进程号
        
    # events事件模块
        events {            
            worker_connections  									# 每个worker进程支持的最大连接数
            use epool;          									# 事件驱动模型, epoll默认
        }
    
    # http内核模块
        # 公共的配置定义在http{}
        http {  													# http层开始
        ...    
            # 使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
            'server' {
                listen       80;        							# 监听端口, 默认80
                server_name  localhost; 							# 提供服务的域名或主机名
                access_log host.access.log  						# 访问日志
                //控制网站访问路径
                'location' / {
                    root   /usr/share/nginx/html;   				# 存放网站代码路径
                    index  index.html index.htm;    				# 服务器返回的默认页面文件
                }
                error_page   500 502 503 504  /50x.html;			# 指定错误代码, 统一定义错误页面, 错误代码重定向到新的Locaiton
            }
            ...
            # 第二个虚拟主机配置
            'server' {
            ...
            }
    
            include /etc/nginx/conf.d/*.conf;  						# 包含/etc/nginx/conf.d/目录下所有以.conf结尾的文件
    
        }   														# http层结束
    

虚拟主机

  1. 虚拟主机就是将一台服务器分割成多个“虚拟服务器”,每个站点使用各自的硬盘空间,由于省资源,省钱,众多网站都使用虚拟主机来部署网站。虚拟主机的概念就是在web服务里的一个独立的网站站点,这个站点对应独立的域名(IP),具有独立的程序和资源目录,可以独立的对外提供服务。

  2. 这个独立的站点配置是在nginx.conf中使用server{}代码块标签来表示一个虚拟主机。Nginx支持多个server{}标签,即支持多个虚拟主机站点。

  3. 虚拟主机类型:基于域名的虚拟主机、通过不同的域名区分不同的虚拟主机、是企业应用最广的虚拟主机、基于端口的虚拟主机通过不同的端口来区分不同的虚拟主机,一般用作企业内部网站,不对外直接提供服务的后台,基于IP的虚拟主机通过不同的IP区分不同的虚拟主机,此类比较少见,一般业务需要多IP的常见都会在负载均衡中绑定VIP。

  4. Nginx状态信息(status)配置:nginx与php-fpm一样内建了一个状态页,对于想了解nginx的状态以及监控nginx非常有帮助。为了后续的zabbix监控,我们需要先了解一下nginx的状态页。

  5. Nginx软件在编译时又一个with-http_stub_status_module模块,这个模块功能是记录Nginx的基本访问状态信息,让使用者了解Nginx的工作状态。要想使用状态模块,在编译时必须增加–with-http_stub_status_module参数。

  6. 启动status状态功能,修改配置文件

    /opt/nginx/sbin/nginx -V										# 监测你的nginx是否安装了status模块
    # 在访问ip/status的时候,进入状态功能        
    location /status {												# 开启nginx状态功能
    	stub_status on;
    }   
    ./sbin/nginx -s reload											# 平滑重启nginx
    yum -y install httpd-tools
    ab -kc 1000 -n 100000 http://192.168.119.10/					# 通过ab压测命令检测
        -n requests													# 执行的请求数,即一共发起多少请求
        -c concurrency												# 请求并发数
        -k															# 启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求
    ../sbin/nginx -t												# 检查nginx语法重新加载nginx
    ../sbin/nginx -s reload											# 平滑重启nginx
    netstat -tunlp|grep nginx
    ps -ef|grep nginx
    curl www.pyyuc.cn												# 我这里是有dns解析,没有的话则需要/etc/hosts解析,配置pyyuc虚拟主机站点
    <meta charset=utf8>我是pyyuc站点
    
  7. 配置多个域名的虚拟主机

    egrep -v '#|^$' /opt/nginx1-12/conf/nginx.conf
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  logs/access.log  main;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  www.pyyuc.cn;
            location /{
                root   html/pyyuc;
                index  index.html index.htm;
            }
    }
        server {
            listen       80;
            server_name  www.pythonav.cn;
            location /{
                root   html/pythonav;
                index  index.html index.htm;
            }
    }
        }
        
    # 创建pythonav虚拟主机站点的目录和文件
    mkdir -p /opt/nginx1-12/html/pythonav
    echo "<meta charset=utf8>我是pythonav,未成年禁止入内"> /opt/nginx1-12/html/pythonav/index.html
    ./sbin/nginx -t
        nginx: the configuration file /opt/nginx1-12/conf/nginx.conf syntax is ok
        nginx: configuration file /opt/nginx1-12/conf/nginx.conf test is successful
    ./sbin/nginx -s reload
    
  8. nginx访问日志(access_log)日志功能对每个用户访问网站的日志信息记录到指定的日志文件里,开发运维人员可以分析用户的浏览器行为,此功能由ngx_http_log_module模块负责,官网地址是:http://nginx.org/en/docs/http/ngx_http_log_module.html

    # 控制日志的参数
    log_format    													# 记录日志的格式,可定义多种格式
    accsss_log    													# 指定日志文件的路径以及格式
    
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    
    # 对应参数解析
    $remote_addr    												# 记录客户端ip
    $remote_user    												# 远程用户,没有就是 “-”
    $time_local														# 对应[14/Aug/2018:18:46:52 +0800]
    $request														# 对应请求信息"GET /favicon.ico HTTP/1.1"
    $status															# 状态码
    $body_bytes_sent												# 571字节 请求体的大小
    $http_referer													# 对应“-”  由于是直接输入浏览器就是 -
    $http_user_agent												# 客户端身份信息
    $http_x_forwarded_for											# 记录客户端的来源真实ip 97.64.34.118
    
    # 日志效果如下
    66.102.6.6 - - [14/Aug/2018:18:46:52 +0800] "GET /favicon.ico HTTP/1.1" 404 571 "-"
    
     "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon" "97.64.34.118"
     
    # nginx.conf默认配置
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log  logs/access.log  main;
    
    # 日志格式配置定义:log_format是日志关键字参数,不能变,main是日志格式指定的标签,记录日志时通过main标签选择指定的格式。 
    # nginx限制网站来源IP访问,如果哪天发现你的nginx很慢,或者检查access.log时候,有一个some body疯狂请求你的nginx server,那么可以禁止这个IP访问。
    # 限制ip或ip段访问禁止访问/av/底下的资源
    location /av {
    deny 122.71.240.254;
    #alias /opt/nginx1-12/html/av;
    allow 10.1.1.0/16;  
    }
    
  9. 在网站运行过程中,可能因为页面不存在等原因,导致网站无法正常响应请求,此时web服务会返回系统的错误码,但是默认的错误页面很不友好。因此我们可以将404,403等页面的错误信息重定向到网站首页或者其他指定的页面,提升用户访问体验。

    server {
            listen       80;
            server_name  www.pythonav.cn;
            root html/pythonav;
            location /{
                index  index.html index.htm;
            }
            error_page 400 403 404 405 /40x.html;					# 在pythonav路径下的40x.html错误页面
    }
    # 40x.html
    <img style='width:100%;height:100%;' src=https://pic1.zhimg.com/80/v2-77a9281a2bebc7a2ea5e02577af266a8_hd.png>
    

代理讲解

  1. 正向代理,你不可以访问指定网站但是代理服务器可以,你可以访问代理服务器然后代理服务器去访问指定网站并拿回数据交给你。

  2. 反向代理,对于客户端而言,代理服务器就像是原始服务器。

  3. nginx实现负载均衡的组件ngx_http_proxy_module proxy代理模块,用于把请求抛给服务器节点或者upstream服务器池

  4. 简单实现反向代理,两台服务器master(主负载)、slave。

    # 主负载均衡节点的配置文件nginx.conf
    worker_processes  1;
    error_log  logs/error.log;
    pid        logs/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  logs/access.log  main;
        sendfile        on;
        keepalive_timeout  65;
            upstream slave_pools{
        server 192.168.11.64:80 weight=1;
    }
        server {
            listen       80;
            server_name  localhost;
            location / {
            proxy_pass  http://slave_pools;
                root   html;
                index  index.html index.htm;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    
    /opt/nginx1-12/sbin/nginx -t
    /opt/nginx1-12/sbin/nginx										# 启动nginx
    /opt/nginx1-12]$netstat -tunlp|grep nginx						# 检查端口
    # 此时访问master的服务器192.168.11.63:80地址,已经会将请求转发给slave的80端口,除了页面效果的展示以外,还可以通过log(access.log)查看代理效果
    
  5. location

    # Location语法优先级排列
        匹配符 匹配规则 优先级
        =    精确匹配    1
        ^~    以某个字符串开头    2
        ~    区分大小写的正则匹配    3
        ~*    不区分大小写的正则匹配    4
        !~    区分大小写不匹配的正则    5
        !~*    不区分大小写不匹配的正则    6
        /    通用匹配,任何请求都会匹配到    7
        
    # nginx.conf配置文件实例
    server {
        listen 80;
        server_name pythonav.cn;
    
        #优先级1,精确匹配,根路径
        location =/ {
            return 400;
        }
    
        #优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
        location ^~ /av {
           root /data/av/;
        }
    
        #优先级3,区分大小写的正则匹配,匹配/media*****路径
        location ~ /media {
              alias /data/static/;
        }
    
        #优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
        location ~* .*\.(jpg|gif|png|js|css)$ {
           root  /data/av/;
            }
    
        #优先7,通用匹配
        location / {
            return 403;
        }
    }
    
  6. root和alias区别

    root <path (default html)>; config block :http{}、server {}、location{}
    alias <path>; config block :location{}
    # root和alias区别与如何解释location后面的url,这会使得两者分别以不同的方式讲请求映射到服务器文件上
    root+location
    location ^~ /av {
    	root /data/av;   											# 注意这里可有可无结尾的   /
    }# 请求url是pythonav.cn/av/index.html时,web服务器会返回服务器上的/data/av/av/index.html
    location ~* .*\.(jpg|gif|png|js|css)$ {
           root  /data/av/;
    }# 请求url是pythonav.cn/girl.gif时,web服务器会返回服务器上的/data/static/girl.gif
    
    # alias参数是使用alias路径替换location路径,alias是一个目录的别名,注意alias必须有 "/"  结束,alias只能位于location块中
    location ^~ /av {
        alias /data/static/;
    }# 请求url是pythonav.cn/av/index.html时,web服务器会返回服务器上的/data/static/index.html
    
  7. Keepalived是一个用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础架构提供简单而强大的负载均衡和高可用性设施。 还可以作为其他服务(nginx,mysql)的高可用软件keepalived主要通过vrrp协议实现高可用功能。vrrp叫(virtual router redundancy protocol)虚拟路由器冗余协议,目的为了解决单点故障问题,他可以保证个别节点宕机时。整个网络可以不间断的运行。

  8. 高可用故障切换原理:在keepalived工作时,主master节点会不断的向备节点发送心跳消息,告诉备节点自己还活着,当master节点故障时,就无法发送心跳消息,备节点就无法检测到来自master的心跳了,于是调用自身的接管程序,接管master节点的ip资源以及服务,当master主节点恢复时,备backup节点又会释放接管的ip资源和服务,回复到原本的备节点角色。

Docker

  1. Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。

  2. Docker 使用 Google 公司推出的 Go 语言进行开发实现。docker是linux容器的一种封装,提供简单易用的容器使用接口。它是最流行的Linux容器解决方案。

  3. docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。

  4. 但是虚拟化也是有局限性的,每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多道一定程度时,操作系统本身资源也就消耗殆尽,或者说必须扩容。

  5. 虚拟机也可以制作模板,基于模板创建虚拟机,保证环境问题一致。虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统。

  6. 镜像作为标准的交付件,可在开发、测试和生产环境上以容器来运行,最终实现三套环境上的应用以及运行所依赖内容的完全一致。

  7. Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写LXC)Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。在正常进程的外面套了一个保护层,对于容器里面进程来说,它接触的资源都是虚拟的,从而实现和底层系统的隔离。容器的应用直接就是底层系统的一个进程。多个容器可以共享资源,容器只要包含用到的组件即可。

  8. docker容器的优势:更高效的利用系统资源、更快速的启动时间、一致的运行环境、持续交付和部署、自定义应用镜像和更轻松的迁移。

  9. docker三大概念:镜像 image、容器 container、仓库 repositorydocker整个生命周期就是这三个概念。

  10. Docker镜像就是一个只读的模板也可以用来创建Docker容器。Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。Image的分层存储,因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。镜像不是ISO那种完整的打包文件,而是由一组文件组成,或者多组文件系统联合组成。

  11. docker容器(container),image和container的关系,就像面向对象程序设计中的 类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object)。镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

  12. docker仓库(repository),仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

  13. 最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问。当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了。Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。

  14. Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服 务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务 供用户管理私有镜像。

  15. 最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并 拥有大量的高质量的官方镜像。除此以外,还有 CoreOS 的 Quay.io,CoreOS 相 关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像 使用的就是这个服务。

  16. 由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针 对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见 的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后 面的章节中会有进一步如何配置加速器的讲解。

  17. 国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓 库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库等。

  18. Docker 是一个开源的商业产品,有社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。

    sudo yum remove docker docker-client docker-client-latest \ 	# 卸载旧版本
    	docker-common docker-latest docker-latest-logrotate \
        docker-logrotate docker-selinux docker-engine-selinux \
        docker-engine
    
    sudo yum install -y yum-utils device-mapper-persistent-data \	# 设置存储库
    	lvm2
    
    sudo yum-config-manager --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
    sudo yum install docker-ce										# 安装docker社区版
    systemctl start docker											# 启动关闭docker
    
    
    # https://www.daocloud.io/mirror								# accelerator-doc
    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh 		# Docker镜像加速器
    sh -s http://95822026.m.daocloud.io
    
  19. docker基础命令注释

    docker --help
    Usage:
    docker [OPTIONS] COMMAND [arg...]
           docker daemon [ --help | ... ]
           docker [ --help | -v | --version ]
    
    self-sufficient runtime for containers.
    Options:
        --config=~/.docker              							# 客户端配置文件的位置
        -D, --debug=false               							# 启用Debug调试模式
        -H, --host=[]                   							# 守护进程的套接字(Socket)连接
        -h, --help=false                							# 打印使用
        -l, --log-level=info            							# 设置日志级别
        --tls=false                     							# 使用TLS;由--tlsverify暗示
        --tlscacert=~/.docker/ca.pem    							# 信任证书签名CA
        --tlscert=~/.docker/cert.pem    							# TLS证书文件路径
        --tlskey=~/.docker/key.pem      							# TLS密钥文件路径
        --tlsverify=false               							# 使用TLS验证远程
        -v, --version=false             							# 打印版本信息并退出
    
    Commands:
        attach    													# 当前shell下attach连接指定运行镜像
        build     													# 通过Dockerfile定制镜像
        commit    													# 提交当前容器为新的镜像
        cp    														# 从容器中拷贝指定文件或者目录到宿主机中
        create    													# 创建一个新的容器,同run 但不启动容器
        diff    													# 查看docker容器变化
        events    													# 从docker服务获取容器实时事件
        exec    													# 在已存在的容器上运行命令
        export    													# 导出容器的内容流作为一个tar归档文件(对应import)
        history    													# 展示一个镜像形成历史
        images    													# 列出系统当前镜像
        import    													# 从tar包中的内容创建一个新的文件系统映像(对应export)
        info    													# 显示系统相关信息
        inspect    													# 查看容器详细信息
        kill    													# kill指定docker容器
        load    													# 从一个tar包中加载一个镜像(对应save)
        login    													# 注册或者登陆一个docker源服务器
        logout    													# 从当前Docker registry退出
        logs    													# 输出当前容器日志信息
        pause    													# 暂停容器
        port    													# 查看映射端口对应的容器内部源端口
        ps    														# 列出容器列表
        pull    													# 从docker镜像源服务器拉取指定镜像或者库镜像
        push    													# 推送指定镜像或者库镜像至docker源服务器
        rename    													# 重命名容器
        restart    													# 重启运行的容器
        rm    														# 移除一个或者多个容器
        rmi    														# 移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
        run    														# 创建一个新的容器并运行一个命令
        save    													# 保存一个镜像为一个tar包(对应load)
        search    													# 在docker
    
    # hub中搜索镜像
        start   													# 启动容器
        stats   													# 统计容器使用资源
        stop    													# 停止容器
        tag     													# 给源中镜像打标签
        top     													# 查看容器中运行的进程信息
        unpause 													# 取消暂停容器
        version  													# 查看容器版本号
        wait    													# 截取容器停止时的退出状态值
    
    Run 'docker COMMAND --help' for more information on a command.  # 运行docker命令在帮助可以获取更多信息
    
    # Use
    docker pull [option][docker registry Address] Warehouse: Labels	# docker registry获取镜像
    docker image ls													# 列出服务器所有镜像文件
    docker image rm [imagename]										# 删除文件
    docker search centos											# 搜索镜像
    docker pull centos												# 获取镜像
    docker run -it centos /bin/bash									# 完成后可以使用该镜像创建一个容器
    docker images													# 查看镜像
    docker rm <imageID>												# 移除容器
    docker rmi <imageID>											# 删除镜像
    docker save centos > /opt/centos.tar.gz							# 导出镜像至本地
    docker load < /opt/centos.tar.gz								# 导入本地镜像到镜像库
    
  20. docker register默认地址是docker hub,仓库名是两段格式,用户名/软件名,如果不写用户,默认docker hub用户名是library,也就是官方镜像。docker是把应用程序和其依赖打包在image文件里面,只有通过这个镜像文件才能生成docker容器。一个image文件可以生成多个容器实例。image文件是通用,可以共享的,为了节省时间,我们尽量。镜像的ID唯一标识了镜像,如果ID相同,说明是同一镜像。TAG信息来区分不同发行版本,如果不指定具体标记,默认使用latest标记信息。

  21. 启动docker容器的方式:启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。因为Docker的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。

    # 新建容器并且启动
    docker run centos /bin/echo "hehe"  							# 这跟在本地直接执行 /bin/echo'hehe' 
    docker run --name mydocker -it centos /bin/bash					# 启动一个bash终端,允许用户进行交互
        --name														# 给容器定义一个名称
        -i															# 则让容器的标准输入保持打开
        -t															# 让Docker分配一个伪终端,并绑定到容器的标准输入上
        /bin/bash													# 执行一个命令
    
  22. 当利用docker run来创建容器时,Docker在后台运行的标准操作包括:检查本地是否存在指定的镜像,不存在就从公有仓库下载、利用镜像创建并启动一个容器、分配一个文件系统,并在只读的镜像层外面挂在一层可读写层、从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去、从地址池配置一个ip地址给容器、执行用户指定的应用程序、执行完毕后容器被终止。

  23. 下载过程可以看出镜像是由多层存储构成的。下载也是一层一层,并非单一的文件。下载过程中给出每一层的前12位ID。下载结束后会给出sha246的文件一致性校验值。

    docker pull hello-world											# 获取镜像 hello-world
    docker images													# 检查镜像
    docker run hello-world											# 运行image文件,可以用容器id
    docker ps -a													# 检查所有运行过的容器
    docker pull ubuntu:14.04										#乌班图的镜像下载
    docker run -it --rm ubuntu:14.04 bash							# 此时会进入交互式的shell界面,即可以使用乌班图操作系统
    	-rm															# 容器退出后将其删除。也可以不指定参数,使用-rm可以避免浪费空间
    	-d															# 后台运行容器,返回容器ID
    

CentOS

  1. docker允许在容器内运行应用程序,使用docker run命令来在容器内运行应用程序。

    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
    docker pull docker.io/centos
    
  2. 运行一个交互式的容器

    docker run -it centos /bin/bash									# 此时进入docker容器
    	cat /etc/redhat-release
    docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"
    docker logs c02													# 查看容器内的标准输出
    docker stop c02													# 停止容器
    docker start c02												# 启动容器
    docker rm c02													# 删除容器
    docker images 													# 列出所有本级镜像
    docker pull centos 												# 获取新的centos镜像
    docker search nginx 											# 搜索nginx镜像
    # 构建镜像,通过commit修改镜像,编写dockerfile
    # 某些时候需要进入容器进行操作,有很多种方法
    docker  exec -it 												# 容器id
    docker attach 													# 容器id
    
    # 提交创建自定义的镜像(docker container commit)
    docker run -it centos
    yum install -y vim
    exit
    docker container ls -a											# 查看刚才安装好vim的容器记录
    docker commit 059fdea031ba chaoyu/centos-vim					# 提交这个容器,创建新的image
    docker images						
    docker run -d -P training/webapp python app.py					# 可以通过-p或-P参数指定端口映射,-P 随机映射端口
    docker ps -l													# 查映射的端口
    docker logs -f cfd												# 查看容器日志信息,不间断显示log
    docker run -d -p 9000:5000 training/webapp python app.py		# -p参数指定映射端口
    docker port c0b													# 查看指定容器的端口映射
    docker top c0b													# 查看容器内的进程
    
  3. 镜像的定制就是定制每一层所添加的配置、文件。如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

    FROM scratch													# 制作base image 基础镜像,尽量使用官方的image作为base image
    FROM centos														# 使用base image
    FROM ubuntu:14.04												# 带有tag的base image
    
    LABEL version="1.0" 											# 容器元信息,帮助信息,Metadata,类似于代码注释
    LABEL maintainer="yc_uuu@163.com"
    
    RUN yum update && yum install -y vim \							# 对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
        Python-dev 													# 反斜线换行
    RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME"
    
    WORKDIR /root 													# 相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
    WORKDIR /test 													# 如果没有就自动创建
    WORKDIR demo 													# 再进入demo文件夹
    RUN pwd     													# 打印结果应该是/test/demo
    
    # 优先使用COPY命令,ADD除了COPY功能还有解压功能,添加远程文件/目录使用curl或wget
    # ADD and COPY 
    ADD hello /  													# 把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
    ADD test.tar.gz /  												# 添加到根目录并解压
    
    WORKDIR /root
    ADD hello test/  												# 添加hello可执行命令到test目录,也就是/root/test/hello一个绝对路径
    COPY hello test/  												# 等同于上述ADD效果
    
    # ENV 															# 环境变量,尽可能使用ENV增加可维护性
    ENV MYSQL_VERSION 5.6 											# 设置一个mysql常量
    RUN yum install -y mysql-server="${MYSQL_VERSION}"
    
    # VOLUME and EXPOSE 											# 存储和网络
    
    # RUN and CMD and ENTRYPOINT
        RUN															# 执行命令并创建新的Image Layer
        CMD															# 设置容器启动后默认执行的命令和参数
        ENTRYPOINT													# 设置容器启动时运行的命令
    
    # Shell格式和Exec格式
    RUN yum install -y vim
    CMD echo "hello docker"
    ENTRYPOINT echo "hello docker"
    
    # Exec格式
    RUN ["apt-get","install","-y","vim"]
    CMD ["/bin/echo","hello docker"]
    ENTRYPOINT ["/bin/echo","hello docker"]
    
    
    # 通过shell格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令
    cat Dockerfile
        FROM centos
        ENV name Docker
        ENTRYPOINT ['/bin/echo','hello $name']						# 这个仅仅是执行echo命令,读取不了shell变量
        ENTRYPOINT  ['/bin/bash','-c','echo hello $name']
    
    # CMD容器启动时默认执行的命令,如果指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略,如果定义多个CMD,只有最后一个执行
    # ENTRYPOINT让容器以应用程序或服务形式运行,不会被忽略,一定会执行,最佳实践:写一个shell脚本作为entrypoint
    COPY docker-entrypoint.sh /usr/local/bin
    ENTRYPOINT ['docker-entrypoint.sh']
    EXPOSE 27017
    CMD ['mongod']
    
    more Dockerfile
    FROm centos
    ENV name Docker
    # CMD ["/bin/bash","-c","echo hello $name"]
    ENTRYPOINT ["/bin/bash","-c","echo hello $name”]
    
  4. 发布docker image到仓库

    # docker hub公有镜像发布
    https://hub.docker.com/
    docker <tag> <warehouse> <warehouse path>						# 如果tag不一致使用命令修改
    docker push yuchao163/centps-cmd-exec:latest					# 推送docker image到dockerhub
    docker pull yuchao163/centos-entrypoint-exec					# 删除本地镜像,测试下载pull 镜像文件
    
    # docker registry私有仓库
    https://yeasy.gitbooks.io/docker_practice/repository/registry.html
    docker run -d -p 5000:5000 -v \									# 启动registry镜像并映射到/var/lib/registry
    	/opt/data/registry:/var/lib/registry registry
    docker ps
    telnet 192.168.119.10 5000										# 测试连接容器
    docker tag hello-world:latest \									# 修改镜像tag,以docker registry的地址端口开头
    	192.168.119.10:5000/hello-world:latest
    docker images													# 查看docker镜像,找到registry的镜像
    cat /etc/docker/daemon.json										# Docker 默认不允许非 HTTPS 方式推送镜像。可以通过配置选项来取消限制,这里必须写正确json数据
    
    grep 'EnvironmentFile=/etc/docker/daemon.json' \				# 写入到docker服务中,写入到[Service]配置块中,加载此配置文件
    	/lib/systemd/system/docker.service
    systemctl daemon-reload											# 重新加载docker
    systemctl restart docker										# 重启docker
    docker run --privileged=true -d -p 5000:5000 \					# registry容器进程挂掉,重新启动
    	-v /opt/data/registry:/var/lib/registry registry \
    	--privileged=true \ 										# docker容器的安全机制:设置特权级运行的容器
    docker push 192.168.119.10:5000/hello-world						# 推送本地镜像
    12.
    https://docs.docker.com/registry/spec/api/						# 由于registry没有web教程,但是提供了API数据
    curl http://192.168.119.10:5000/v2/_catalog
    http://192.168.119.10:5000/v2/_catalog
    docker pull 192.168.119.10:5000/hello-world						# 删除本地镜像,从私有仓库中下载
    
  5. 打包flask程序与dockerfile

    # 确保app.py和dockerfile在同一个目录!,编写dockerfile
    FROM centos
    COPY CentOS-Base.repo /etc/yum.repos.d/
    COPY epel.repo /etc/yum.repos.d/
    RUN yum clean all
    RUN yum install python-setuptools -y
    RUN easy_install flask
    COPY s16-flask.py /opt/
    WORKDIR /opt
    EXPOSE 8080
    CMD ["python","s16-flask.py"]
    
    docker build -t yuchao163/flask-hello-docker .					# 构建镜像image
    docker image ls													# 查看创建好的images
    docker run -d -p 8080:8080 yuchao163/flask-hello-docker			# 启动此flask-hello-docker容器,映射一个端口供外部访问
    docker container ls												# 检查运行的容器
    
  6. docker跑一个selenium脚本

    pip3 list |grep selenium
    cat baidu.py
        from selenium import webdriver
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--headless')   				# 不需要可视化界面,linux无图形化
        chrome_options.add_argument('--no-sandbox')					# 以最高权限运行
        driver = webdriver.Chrome(executable_path='/tmp/chromedriver', options=chrome_options)
        															# 找到webdriver浏览器驱动
        driver.get("http://www.baidu.com")
        print(driver.title)
        driver.close()
    
    # 获取浏览器驱动
    wget http://npm.taobao.org/mirrors/chromedriver/71.0.3578.33/chromedriver_linux64.zip
    python3 baidu.py
    
    # 准备好一个装好selenium的镜像,并且是执行baidu.py功能的,准备好Dockerfile
    cat Dockerfile
        FROM python:3.7
        RUN echo 'nameserver 119.29.29.29' >> /etc/resolv.conf
        RUN pip3 install -i https://pypi.douban.com/simple selenium
        ADD baidu.py /opt/
        WORKDIR /opt/
        CMD ['python3','/opt/baidu.py']
    docker build -t se_python .										# 构建镜像
    
    # 如果构建失败,网速问题,则
    vim /etc/sysctl.conf  											# 添加,修改代码
        net.ipv4.ip_forward=1
        systemctl restart network
    sysctl net.ipv4.ip_forward										# 检查
    docker images													# 检查镜像
    
    
  7. Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。端口映射允许外部访问容器、–link 容器互联、容器桥接网络。

    # 通过--link容器通信,给test2添加一个hosts解析记录,test2可以ping通test1,反之不可以
    docker run -d --name test2 --link test1 busybox /bin/sh -c "while true;do sleep 3600;done"
    
    # 但是--link是不推荐使用的,而是更强大的自定义docker网络链接容器
    docker network create -d bridge my-net							# 新建一个docker网络
    	-d 															# 指定网络类型,有 bridge overlay
    
    # 连接容器
    docker run -it --rm --name busybox1 --network my-net busybox sh	# 运行一个容器并连接到新建的 my-net 网络
    docker container ls
    ping busybox2
    
  8. 外部访问容器,容器中可以运行网络应用,但是要让外部也可以访问这些应用,可以通过-p或-P参数指定端口映射。

    docker run -d -P training/webapp python app.py
    docker ps -l													# 检查映射的端口
    docker logs -f cfd												# 查看容器日志信息,不间断显示log
    docker run -d -p 9000:5000 training/webapp python app.py		# 也可以通过-p参数指定映射端口
    docker port c0b													# 查看指定容器的端口映射
    docker top c0b													# 查看容器内的进程
    

Saltstack

  1. saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统。

  2. 早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护。系统管理员面临的问题主要是系统配置管理和远程执行命令,因此诞生了很多开源软件,系统维护方面有fabric、puppet、chef、ansible、saltstack等,擅长维护系统状态或方便的对大量主机进行批量的命令执行。

  3. salt灵活性强大,可以进行大规模部署,也能进行小规模的系统部署。salt的设计架构适用于任意数量的服务器,从少量本地网络系统到跨越数个数据中心,拓扑架构都是c/s模型,配置简单。

  4. Salt是python编写的,支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。

  5. 在安装salt之前,先理解salt架构中各个角色,主要区分是salt-master(中心控制系统)和salt-minion,顾名思义master(客户端)。

  6. salt架构中的一种就是master > minion。在远程执行系统中,salt用python通过函数调用完成任务。

  7. 修改虚拟机ip地址为静态地址,并且确保可上网

    # master网卡配置
        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"
        UUID="7d4f9ede-810f-4976-a01b-250b845c99cc"
        DEVICE="ens33"
        ONBOOT="yes"
        IPADDR=192.168.11.131
        NETMASK=255.255.255.0
        GATEWAY=192.168.11.1
        DNS1=119.29.29.29
        
    # slave网卡配置
        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"
        UUID="f9fc5929-8594-466e-a041-34caee8c1e32"
        DEVICE="ens33"
        ONBOOT="yes"
        IPADDR=192.168.11.132
        NETMASK=255.255.255.0
        GATEWAY=192.168.11.1
        DNS1=119.29.29.29
        
    # dns配置文件
        # Generated by NetworkManager
        nameserver 119.29.29.29
        
    # /etc/hosts
        127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
        ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
        192.168.11.132  slave
        192.168.11.131  master
        
    # 关闭服务器安全策略
        systemctl disable firewalld								# 关闭firewalld
        systemctl stop firewalld
    	iptables -F												# 关闭iptables
    
  8. EPEL的全称叫 Extra Packages for Enterprise Linux 。EPEL是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL之后,就相当于添加了一个第三方源。

    yum python zeromq pyzmp pycrypto msgpack-python yaml jinja2	# 运行salt依赖包
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    yum clean all 												# 清空缓存
    yum makecache 												# 生成yum缓存
    yum list salt												# 查看salt包
    yum install salt-master -y									# 安装salt-master
    yum install salt-minion -y									# 安装salt-minion
    
  9. 配置文件在/etc/salt/master or minion,master默认监听4505(publish port,远程命令发送功能)、4506(ret port,认证、文件、结果集)。

    # 配置salt-master
    user: root													# salt运行的用户,影响到salt的执行权限
    interface: 0.0.0.0											# 绑定到本地的0.0.0.0地址
    worker_threads: 10											# salt的运行线程,开的线程越多一般处理的速度越快
    publish_port : 4505											# master的管理端口
    ret_port : 4506												# master跟minion的通讯端口,用于文件服务,认证,接受返回结果等
    syndic_master_port : 4506									# master运行的salt-syndic连接到一个更高层级的master,那么参数需要配置成连接到高层级master的监听端口
    auto_accept: True   										# 如果对Minion信任,可以配置master自动接受请求
    pidfile: /var/run/salt-master.pid							# 指定pid文件位置
    log_file:/var/log/salt/master								# 日志文件地址#自动接收minion的keyauto_accept: False
    
    # 配置salt-minion
    id: slave													# minion的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
    user: root													# salt运行的用户权限
    master : master												# master的识别ID,可以是IP,域名,或是可以通过DNS解析的字符串
    master_port: 4506											# master通信端口
    backup_mode: minion											# 备份模式,minion是本地备份,当进行文件管理时的文件备份模式
    output: nested												# 执行salt-call时候的输出方式
    acceptance_wait_time: 10									# minion等待master接受认证的时间
    acceptance_wait_time_max: 0									# 失败重连次数,0表示无限次,非零会不断尝试到设置值后停止尝试
    random_reauth_delay: 60										# 重新认证延迟时间,避免因为master的key改变导致minion需要重新认证的syn风暴
    log_file: /var/logs/salt_minion.log							# 日志文件位置
    
  10. 启动salt-master和salt-minion

    systemctl start salt-minion
    systemctl start salt-master
    
    systemctl status salt-minionsystemctl status salt-master	# 检查salt状态
    
  11. master接收minion秘钥:在minion启动后连接master会请求master为其签发证书,等待证书签发完成后,master可以信任minion,并且minion和master之间的通信是加密的。

    salt-key -f slave											# 向指定minion颁发(master)
    salt-call --local key.finger								# 获取办法秘药(minion)
    salt-key -a slave											# 接收秘钥(master)
    salt-key -L													# 查看秘钥(master)
    
    salt-key -L													# Accepted:已经接受、Denied:拒绝、Unaccepted:#未加入、Rejected:吊销
        -L  													# 查看KEY状态
        -A  													# 允许所有
        -D  													# 删除所有
        -a  													# 认证指定的key
        -d 													  	# 删除指定的key
        -r  													# 注销掉指定key(该状态为未被认证)
        
    salt-key 													# 列出当前所有的key
    salt-key  -a salt1-minion.example.com -y					# 添加指定minion的key
    salt-key  -A  -y											# 添加所有minion的key
    salt-key -d salt1-minion.example.com -y						# 删除指定的key
    salt-key -D -y												# 删除所有的key
    
  12. 首先知道master和minion都安装了什么文件,然后才知道怎么操作

    rpm -ql salt-master
        /etc/salt/master      									#  salt master主配置文件
        /usr/bin/salt           								# salt master 核心操作命令
        /usr/bin/salt-cp       									# salt 文件传输命令
        /usr/bin/salt-key    									# salt证书管理
        /usr/bin/salt-master    								# salt master 服务命令
        /usr/bin/salt-run          								# salt master runner命令
        
    rpm -ql salt-minion
        /etc/salt/minion     									# minion配置文件
        /usr/bin/salt-call    									# 拉取命令
        /usr/bin/salt-minion   									# minion服务命令
        /usr/lib/systemd/system/salt-minion.service   			# minion启动脚本
    
  13. Salt命令

    salt [option] <*|[hostname]> <module> [command]
    salt '*' test.ping											# 探测minion主机存活命令
    salt '*' sys.list_functions test							# test模块实际上还有许多其他的函数
    salt '*' test.echo 'chaoge nb666'
    salt '*' test.fib 50										# 生成斐波那契数列
    salt --help													# 查看salt帮助
    salt --summary '*' cmd.run 'hostname'						# 显示salt命令的概要
    salt 'slave' sys.list_modules								# 列出所有salt的sys模块
    salt 'slave' cmd.run 'ps -ef|grep python'					# 远程执行命令模块,cmd是超级模块,所有shell命令都能执行
    
    # 远程安装nginx
    salt 'slave' pkg.install "nginx"							# 在minion上安装nginx
    salt 'slave' pkg.remove "nginx"								# 卸载minion上的nginx
    salt 'slave' pkg.version "nginx"							# 检查pkg包的版本
    salt 'slave' service.start "nginx"
    salt 'slave' service.status "nginx"
    salt 'slave' service.stop "nginx"
    
  14. 与标准的Linux命令一样,salt的命令一样用法,–out控制salt命令结果输出的格式。

    salt --out=json '*' cmd.run_all 'hostname'
    salt --out=yaml '*' cmd.run_all 'hostname'
    
  15. YAML是YAML Ain’t Markup Language的首字母缩写,SLS文件遵循YAML语法,yaml容易被解析,应用于配置文件。salt的配置文件是yaml配置文件,不能用tab。saltstack,k8s,ansible都用的yaml格式配置文件。

  16. 语法规则:大小写敏感;使用缩进表示层级关系;缩进时禁止tab键,只能空格;缩进的空格数不重要,相同层级的元素左侧对其即可;井号表示注释行。冒号分割为键值,而- 代表列表。遵循固定的缩进风格,表示数据层级结构关系,需要每个缩进级别由2个空格组成。

    my_key: my_value											# key在YAML中表现形式是一个冒号结果的字符串
    my_key:														# value还可以通过缩进和key关联,四个空格
        my_value 
    one_dict_key:												# YAML语法中字典是可以嵌套的
        two_dict_key:value_dict
    - list_value_one											# 短横杠表示列表,使用一个横杠加一个空格,同样的缩进级别作为同一个列表的部分
    - list_value_two
    - list_value_three
    
  17. 生产环境的服务器很可能是成千上百的minion,因此需要灵活地定位所需的服务器并且执行远程命令。

    salt '*' test.ping
        *               										# 代表任意字符,或空字符串
        ?               										# 代表一个字符,不可以为空
        [a-z] [0-9]     										# 代表任何一个小写字母
    
  18. 那么大量的minion上运行远程命令就必须使用salt提供的“状态管理”了,状态是对minion的一种描述和定义,运维不需要关心部署是如何完成的,只需要描述minion需要达到什么状态。

    vim /etc/salt/master # 打开注释,写入以下,必须严格遵循语法,空格,此步骤在master和minion都需要执行,都需要文件夹,和nginx.sls文件
    file_roots:
     base:
        - /srv/salt/base
     dev:
       - /srv/salt/dev
     test:
       - /srv/salt/test
     prod:
       - / srv/salt/prod
    \
    mkdir -p /srv/salt/{base,dev,test,prod}
    # 这个nginx.sls状态文件,在master和minion上都得有
    # 解释下nginx.sls描述文件sls配置文件都遵循YAML语言描述,第一条命令使用了pkg.install安装命令,相对于运行了yum install,而此时state模块会判断nginx是否安装了,如果没有安装就进行安装,安装了就什么都不做。状态描述都会遵循这个原则,只有检测到真实状态和所需状态不一就会执行此功能,这种性质叫做幂等性。
    cat nginx.sls
    nginx-install:
      pkg.installed:
        - name: nginx
    
    nginx-service:
      service.running:
        - name: nginx
        - enable: True
        
    salt 'slave' state.sls nginx							# 启动命令,此时slave已经安装且存活了nginx,进行状态管理
    salt 'slave' cmd.run 'ps -ef|grep nginx'				# 通过master检查slave的nginx状态
    
  19. Grains 是saltstack组件中非常重要之一,在配置部署时候回经常使用,Grains记录minion的静态信息,如常用属性,CPU、内存、磁盘、网络信息等。Minions的Grains信息是Minion启动时采集汇报给Master的Grains是以 key value形式存储的数据库,可以看做Host的元数据(metadata)Grains保存着收集到的客户端的详细信息如果slave机器数据变化,grains就过期了。用grains.items列出所有的数据匹配主机,以及根据单一信息定位数据,Grains还可以自定义来满足不同的需求。

    salt 'slave' sys.doc grains							# 查看grains的命令用法
    salt 'slave' grains.items							# 描述minion本身固有的静态属性数据
    salt 'slave' grains.ls								# 列出所有grains方法
    salt 'slave' grains.item os id host					# 检索某些数据
    salt '*' grains.item key1 key2 key3					# 利用Grains静态信息定位主机
    salt '*' -G 'os:CentOS' test.ping					# 定位Cenots的机器
    salt -G 'osrelease:7*' test.ping
    salt '*' grains.item fqdn_ip4						# 找出ip地址
    
  20. 在master端设置Grains静态数据,原理会将此数据添加到minion服务器的配置文件的/etc/salt/grains。Grains数据写入配置文件后,重启服务数据也不会丢失;想要删除可以通过命令,或者minion的配置文件删除配置一样完成操作(或者删除文件)。

    salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]'
    salt 'slave' grains.item cpu_info
    salt 'slave' grains.setval cpu_num 8				# 设置数据
    salt 'slave' grains.item cpu_num					# 查询数据
    
    # 清空值
    salt 'slave' grains.delval cpu_info
    salt 'slave' grains.delval cpu_num
    
    # 删除minion的grains配置文件,重启服务
    rm -rf /etc/salt/grains
    !sys
    systemctl restart salt-minion
    
  21. Pillar也是saltstack组件中非常重要的组件之一,称作数据管理中心,经常配合states在大规模的配置管理中使用。Pillar是动态并存储在master端,用于提供和管理minion的。Pillar在SaltStack中主要的作用是存储和定义配置管理中需要的一些数据,存储格式与Grains类似,都是YAML格式,在master配置文件中有一段Pillar settings选项专门定义Pillar的参数。

    cat /etc/salt/master  								# 此配置代表pillar的工作根目录,在/srv/pillar下,然后可以新建sls文件
    
    # 默认pillar的工作目录在/srv/pillar目录下
    mkdir -p /srv/pillar
    vim /srv/pillar/top.sls								# 指定环境,标记,引用packages.sls和services.sls
        base:
          '*':
              - packages
              - services
              
    vim /srv/pillar/packages.sls
        nginx:
            packages-name: nginx
            version: 1.12.2
            port: 80
            user: root
            
    salt '*' pillar.item nginx							# 检查我们设置的pillar值
    
    # pillar与Grains对比
    
    # 类型     数据采集方式   应用场景                   定义位置
    # Grains   静态         minion启动时收集  数据查询  目标选择  配置管理   minion
    # Pillar   动态         master进行自定义  目标选择  配置管理  敏感数据   master
    
  22. SaltStack本身提供salt(usr/bin/salt)来交互管理,但是去服务器上敲命令肯定不是一个长远之计,这时候python就体现了提有的功能。Python API就是给Python提供的API使用,需要在SaltStack master上运行。

    # /usr/bin/salt默认使用的接口是LocalClient,该接口只能在salt master上使用
    import salt.client
    import salt.config 									# 导入salt配置模块
    local = salt.client.LocalClient()  					# <salt.client.LocalClient object at 0x7f886dbdd850>
    local.cmd('*','cmd.run',['hostname'])				# 向所有minion发送命令
    m_opts=salt.config.client_config('/etc/salt/master')# 获取master配置文件
    salt.config.minion_config('/etc/salt/minion') 		# 获取minion配置文件
    ret= [ i for i in local.cmd_iter('*','test.ping')]	# 逐条返回结果
    local.cmd('*','test.fib',[10])						# 菲波那切数列
    local.cmd('*','cmd.run',['hostname'])
    local.cmd('*','cmd.run',['ifconfig'])
    local.cmd('*','cmd.run',['crontab -l'])
    local.cmd('*','cmd.run',['df -h'])
    local.cmd('*','service.stop',['nginx'])
    local.cmd('*','service.status',['nginx'])
    local.cmd('*','service.start',['nginx'])
    
  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值