LVM逻辑卷管理与磁盘配额

一、LVM的基本概述和LVM的基本管理流程

  • LVM的基本概述

    • LVM的作用:对磁盘分区进行管理的一种逻辑机制(建立在分区之上),能保持现有数据不变而调整磁盘容量;
    • 物理卷(PV):将分区或磁盘划分为多个物理单元(PE),默认4M一个,通常对应一个分区或磁盘,与分区名一致;
    • 卷组(VG):由一个或多个物理卷(PV)组成的整体,名称自定义;
    • 逻辑卷(LV):建立在卷组(VG)之上,从卷组中划分出的PE,可直接在逻辑卷上创建文件系统,然后进行格式化、挂载、使用;
  • LVM的基本命令管理

功能 物理卷(PV) 卷组(VG) 逻辑卷(LV)
scan扫描 pvscan 设备名 vgscan lvscan
create建立 pvcreate 设备名 vgcreate lvcreate
display显示 pvdisplay 设备名 vgdisplay lvdisplay
remove删除 pvremove 设备名 vgremove 设备名 lvremove
extend扩展 vgextend lvextend
reduce减少 vgreduce lvreduce
  • VG卷组管理命令语法
  vgscan                                            ##扫描系统中已经存在的LVM卷组
  vgcreate 自定义卷组名 添加到此卷组的物理卷名称  ##将一个或多个物理卷创建成一个卷组
  vgdisplay 卷组名                             ##显示系统中此卷组的详细信息
  vgremove 卷组名                              ##删除系统中的此卷组
  vgextend 卷组名 物理卷名称                        ##将新物理卷添加到已有卷组中,扩容
  vgreduce 卷组名 物理卷名称                        ##将已在卷组中的此物理卷在此卷组中删除
  • LV逻辑卷管理命令语法
  lvscan                                            ##扫描系统中已建立的逻辑卷
  lvcreate -L 容量 -n 逻辑卷名 卷组名                ##在指定的卷组中分割逻辑卷
  lvdisplay 逻辑卷目录                               ##查看此逻辑卷的详细信息
  lvextend -L +扩容大小 /dev/卷组名/逻辑卷名       ##在当前卷组中为逻辑卷扩容
  resize2fs /dev/卷组名/逻辑卷名                   ##使系统重新读取文件系统大小
  lvremove 逻辑卷目录                            ##删除指定的逻辑卷
  lvreduce -L -缩减大小 /dev/卷组名/逻辑卷名       ##缩小指定的逻辑卷容量

二、LVM卷的基本管理流程

a.添加硬盘,创建主分区(fdisk ),将其文件系统ID更改为8e,并重新读取分区表(partx -a),不格式化;
b.创建PV物理卷(pvcreate 分区名称),可指定多个分区,用空格隔开;
c.创建VG卷组(vgcreate 自定义卷组名 物理卷名),可添加多个物理卷,用空格隔开;
d.创建LV逻辑卷(lvcreate -L 容量-n 逻辑卷名 卷组名);
e.格式化LV逻辑卷(mkfs -t ext4 逻辑卷目录);
f.挂载使用,临时挂载(mount 逻辑卷目录 挂载点),永久挂载(vi /etc/fstab 逻辑卷目录 挂载点 ext4 defaults 0 0);

三、LVM卷的动态扩容

  • 若卷组VG有可扩展空间
lvextend -L +扩容大小 逻辑卷目录
resize2fs 逻辑卷目录             ##重新读取逻辑卷大小
df -hT  ##验证逻辑卷的大小
  • 若卷组VG内无空间,则需要先添加物理卷,扩容卷组,在进行扩容逻辑卷
 fdisk 磁盘名称                     ##为新添加的硬盘分主分区,ID为8e
 partx -a 磁盘设备名                 ##重读分区表
 pvcreate 分区名称                  ##将新建的分区更改为物理卷
 vgextend 卷组名 分区的目录         ##将刚创建完成的物理卷扩容到已有卷组中
 lvextend -L +扩容大小 逻辑卷目录        ##将卷组VG中的容量扩容给逻辑卷
 或lvextend 逻辑卷目录 物理卷目录  ##将物理卷中的所有PE都添加给逻辑卷
 resize2fs 逻辑卷目录                ##重新读取逻辑卷大小
 df -hT         ##验证逻辑卷的大小
  • LVM逻辑卷的缩减容量
五、磁盘配额
  • 作用:限制普通用户使用磁盘资源;

  • 条件:需要linux内核支持,安装quota软件;

  • 作用范围:文件系统(分区);

  • 应用对象:用户(指定的账户)、组账户(注:组必须为基本组,否则不会生效,对组中所有以此组为基本组的用户生效,而不是组内所有用户,并且符合条件的组中用户共用一个配额,并且某个用户);

  • 限制类型:

    • 硬盘容量:限制用户可用此磁盘的大小,默认单位为KB;
    • 文件数量:限制用户可在此磁盘内拥有的文件个数(通过i节点进行限制);
  • 限制方法:

    • 软限制:软性限制,可以被超越,但会有警告;
    • 硬限制:硬性限制,不可以被逾越;
  • 总结:linux的磁盘限额是通过软、硬限制用户或组使用文件系统中的磁盘大小和文件数量;

  • 流程

    • 安装quota工具;
    mount /dev/cdrom /mnt                                       ##挂载光盘
    rpm -ivh /mnt/Packages/quota-3.17-20.el6.x86_64.rpm --nodeps      ##安装quota工具
    • 关闭selinux;
    getenforce
    sed -i "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config
    reboot
    • 分区、格式化在此不再过多介绍,以支持配额的方式进行挂载;

      • 临时挂载:
      mount -o remount,usrquota,grpquota 分区目录 挂载点
      • 永久挂载:
      vi /etc/fstab
      分区目录 挂载点 文件系统格式 defaults,usrquota,grpquota 0 0
    • 生成配额文件到挂载点目录;

    quotacheck -ugcv 挂载点目录
    ls 挂载点目录      ##验证配额文件的生成
    • 准备需要做配额的用户和组,并且赋予挂载点目录的权限;
    useradd 或groupadd 创建用户或者组
    usermod -g 修改用户的基本组
    passwd 用户名     设置用户的密码
    chmod 777 挂载点目录           ##为测试挂载点目录给予最大权限
    • 设置用户或者组的配额;
    setquota -u 用户名 磁盘大小软限制 磁盘大小硬限制 文件数量软限制 文件数量硬限制 挂载点
    setquota -g 组名 磁盘大小软限制 磁盘大小硬限制 文件数量软限制 文件数量硬限制 挂载点
    注:硬盘大小限制单位为KB,文件数量单位为个;
    • 启用配额;
    quotaon -a 或quotaon -ugv 挂载点        #两种方法都可以,前者较为常用
    • 验证配额是否成功;
    su - 用户名    ##切换至测试用户
    touch 命令创建文件  ##验证文件数量配额限制
    dd if=/dev/zero of=测试目录下文件 bs=每次拷贝的大小 count=次数        ##根据实际情况,复制数据流到测试目录中
    • 查看分区或用户的配额使用情况;
    quota -u 用户名                ##查看此用户的配额使用情况
    quota -g 组名               ##查看此组的配额使用情况
    repquota 挂载点          ##查看分区的配额使用情况

李泽信 发布于 2022-7-17 21:51

文件存储与磁盘管理

一、认识文件存储

  • 磁盘物理存储结构

  • 磁盘逻辑存储结构

    • 结构
      inode节点:简称i节点,存放文件的信息(权限、时间等),以及文件的信息所在的Block位置;
      Block块:以扇区(每个512字节)组成,每个Block 4K的大小,真正存放数据的单位;

      注:文件的文件名并没有存储在文件的i节点或者Block内,而是存放在文件所在目录的Block中;
    • 读取操作
      系统受到对改文件名的请求,找到文件名所在的目录,找到目录的Block后搜寻该文件名的i节点号码,进而获取到该文件的i节点信息,验证权限、读取该文件所在的Block,最后找到该Block,进行读取;

    • 删除操作
      删除操作其实只是删除了目录的Block中的文件名,然而i节点和文件所属Block块并没有删除,但是文件的i节点处会标记一个值为link,表示i节点无任何链接的文件名,那么系统就会认为此i节点无占用。当新建文件后,新文件会优先占用这些有link标记的i节点,进而覆盖i节点所关联的block。当无此类i节点,那么新建文件时,就会创建新的i节点。也就是说磁盘存放数据时,考虑的因素有两个,一个是Block块,也就是容量,另一个就是i节点的数量值;

    • 文件的软连接
      在源文件的基础上,在软连接所在的目录Block中创建文件名,同时为软连接创建新的i节点,但是i节点指定的文件存放位置就是源文件的位置,也就是说源文件的更改、删除操作会直接影响软连接文件;

    • 文件的硬连接
      在原有文件的基础上,并无新建i节点、Block,而是新建一个硬连接文件名,该文件与源文件使用同一i节点、Block块。但是在源文件的i节点的link标记处会+1,表示该i节点关联了两个文件名,即使源文件被删除,那么只会在源文件的i节点的link处-1,系统不会认为该i节点无用,所以硬连接文件工作正常,但由于两者使用相同i节点,硬连接文件会根据源文件内容的改变而改变;
      那么硬连接与复制文件的不同之处就是:节省i节点的占用,并且可以实现两个文件的内容同步,而复制文件无法做到以上两点;

      stat 文件位置   #此命令可以查看文件的i节点、Block块、权限等所有详细信息

管理磁盘分区

  • 何为磁盘?何为文件系统?
    为了碰见系统出现磁盘不足的情况,应添加磁盘增大存储空间;
    若把磁盘必做楼盘的话,那么分区则是每一间屋子,文件系统就是没意见物资的装修方式(机房、教室);

    • 文件系统:外部存储设备上管理和组织文件的方法
    • 分区方式:

      • MBR:支持单个磁盘分区数量为4个
      • GPT:支持单个磁盘分区数量为128个
  • 磁盘的分区类型

    • 主分区:相当于windows的C盘,存放系统
    • 扩展分区:是一个概念,实际上是看不到
    • 逻辑分区:建立在扩展分区智商的存储数据的分区,可以用来作交换分区等
  • 磁盘分区流程

    [root@localhost ~]# fdisk -l /dev/sdb

  • 流程

    • fdisk -l #查看系统磁盘设备
    • fdisk #磁盘设备名称
    • 按n #新建分区
    • 按p 新建主分区,e为扩展分区,l为逻辑分区
    • 按顺序输入编号
    • 开始位置默认回车即可
    • 结束位置,手动输入大小+5G,可随意指定大小,若直接回车则使用磁盘的所有空间
    • p验证分区情况,w保存退出,q不保存退出,d删除分区,t用来更改分区的文件系统类型,L查看文件系统类型的列表

三、管理文件系统

  • 文件系统:明确主机中的磁盘或者分区上文件的方法和数据结构
  • 配置系统分区:
mkfs -t ext4分区设备名称  #格式化文件系统为ext4格式的分区
mount 分区设备名称 挂载点    #挂载到系统
  • 配置交换分区
mkswap 分区设备名称   #格式化文件系统为swap格式的分区,注:分区是需要指定分区类型为82
swapon 分区设备名称   #开启交换分区
free -m #查看系统内存信息

四、挂载分区或文件到系统

  • 挂载分到系统中

    • 临时挂载:mount命令
    语法:
    例如:
    mount /dev/sdb1 /data1      #挂载点必须存在,可提前创建
    • 永久挂载
    vi /etc/fstab   #开机加载此文件
        /dev/sdb1   /data1  ext4    defaults    0 0
    mount -a    #重新读取文件,加载挂载关系
    df -h
    mount   #查看系统中所有文件挂载关系
    • 挂载iso镜像文件到系统中

      • 临时挂载
      语法:
      mount -o loop 镜像文件位置    挂载点
      • 永久挂载
      vi /etc/fstab   #开机加载此文件
          iso存放位置 挂载点 iso9660 defaults,loop 0 0
    • 卸载
    语法:
    umount  挂载点

五、扩展

  • 当硬盘大于2T时,需要将其分区格式改成GPT,分区方式为parted
例如:
[root@localhost ~]# parted /dev/sdb
(parted) mklabel gpt
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start  End  Size  File system  Name  标志
(parted) mkpart primary 0 5GB
忽略/Ignore/放弃/Cancel? i
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     标志
 1      17.4kB  5000MB  5000MB               primary
(parted) quit
注:创建分区使用mkpart命令,删除分区使用rm 分区编号;
[root@localhost ~]# mkfs -t ext4 /dev/sdb1
[root@localhost ~]# mount /dev/sdb1 /data1
[root@localhost ~]# ls /data1
  • 挂载U盘
ntfs格式U盘:
    编译安装ntfs-3g软件包
    mount -t ntfs-3g /dev/sdb1 /data1
fat32格式U盘:
    mount -t vfat /dev/sdb1 /data1

步骤:
1.插入U盘
2.重启服务器,开机后选择最后一块硬盘
3.如若U盘的文件系统格式是ntfs格式,那么需要编译安装软件包ntfs-3g,编译选项
./configure -->make -->make install
4.使用命令挂载
mount -t ntfs-3g /dev/sdb1 /data1
5.如若U盘格式是fat32,无需安装软件包,直接挂在使用
mount -t vfat /dev/sdb1 /data1

李泽信 发布于 2022-7-17 19:58

MySQL主从复制+MySQL读写分离

  • 环境
系统类型 IP 主机名 所需软件 硬件
centos7.8 192.168.100.105 master boost_1_59_0.tar.gz mysql-5.7.12.tar.gz 内存:4G
centos7.8 192.168.100.106 slave boost_1_59_0.tar.gz mysql-5.7.12.tar.gz 内存:4G
centos7.8 192.168.100.107 mycat jdk-8u171-linux-x64.tar.gz Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 内存:512M
centos7.8 192.168.100.108 lamp 内存:512M
[root@mycat ~]# tar xf jdk-8u171-linux-x64.tar.gz
[root@mycat ~]#  mv jdk1.8.0_171/ /usr/local/java
[root@mycat ~]#  vi /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
[root@mycat ~]# source /etc/profile
[root@mycat ~]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@mycat ~]# mv mycat/ /usr/local/
[root@mycat ~]# ls /usr/local/mycat/
bin  catlet  conf  lib  logs  version.txt
  • 在master节点进行授权允许mycat程序能够连接MySQL集群,slave节点会同步权限
[root@master ~]# mysql -uroot -p123123
mysql> grant all on *.* to 'linux'@'192.168.100.107' identified by '123123';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
  • 配置mycat节点的代理服务并启动
[root@mycat ~]# vi /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="VIR" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" ></schema>

        <dataNode name="dn1" dataHost="node1" database="cloud" />

        <dataHost name="node1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="192.168.100.105" url="192.168.100.105:3306" user="linux" password="123123">
                        <readHost host="192.168.100.106" url="192.168.100.106:3306" user="linux" password="123123" />
                </writeHost>
        </dataHost>
</mycat:schema>

[root@mycat ~]# vi /usr/local/mycat/conf/server.xml
     80         <user name="admin">                 ##管理员账户
     81                 <property name="password">admin</property>
     82                 <property name="schemas">VIR</property>
     95         <user name="user">                  ##普通用户,只读权限
     96                 <property name="password">user</property>
     97                 <property name="schemas">VIR</property>
     98                 <property name="readOnly">true</property>
     99         </user>

[root@mycat ~]# vi /usr/local/mycat/conf/log4j2.xml
     25         <asyncRoot level="debug" includeLocation="true">

[root@mycat ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@mycat ~]# netstat -utpln |grep 8066
tcp        0      0 0.0.0.0:8066            0.0.0.0:*               LISTEN      13090/java
[root@mycat ~]# netstat -utpln |grep 9066
tcp        0      0 0.0.0.0:9066            0.0.0.0:*               LISTEN      13090/java
[root@mycat ~]# tail /usr/local/mycat/logs/wrapper.log              ##服务日志
[root@mycat ~]# tail /usr/local/mycat/logs/mycat.log                    ##读写分离日志
  • 在master节点创建测试数据库及表
[root@master ~]# mysql -uroot -p123123
mysql> create database cloud;
Query OK, 1 row affected (0.00 sec)
mysql> create table cloud.it (id int,name char(16));
Query OK, 0 rows affected (0.02 sec)
mysql> exit
  • lamp节点客户端测试数据读写分离
[root@lamp ~]# mysql -uadmin -padmin -h 192.168.100.107 -P 8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| VIR      |
+----------+
1 row in set (0.00 sec)

MySQL [(none)]> use VIR;
MySQL [VIR]> show tables;
+-----------------+
| Tables_in_cloud |
+-----------------+
| it              |
| it1             |
+-----------------+
2 rows in set (0.01 sec)

李泽信 发布于 2022-7-17 17:06

账号管理及文件权限管理

一、用户和组账号的概述

1.概念:
  • 用户:包含一个名和密码,在计算机中的提现方式,包含root、普通用户、程序用户;
  • 组:用户的集合,批量管理用户群权限,包含基本组、附加组(一个用户只能属于一个基本组,但是可以属于多个附加组);
  • 权限:限制用户访问资源(文件、app、进程、硬件等);
  • UID: 每个用户账号都有一个数字标识(身份证),root(0)、普通用户(500-60000)、程序用户(1-499)
  • GID:没个组账号的唯一身份标识,root(0)、普通组账号(500-60000)、程序组账号(1-499);
2.用户和组的文件
/bash/passwd    #账号文件
/bash/shadow    #密码文件
/bash/group     #组账号文件
/etc/gshadow    #组密码文件,很少使用

二、用户及组账号的管理

  • 用户的管理
添加: 
    useradd [选项] 用户名
    选项:
        -d  #指定家目录
        -M  #不指定家目录
        -s  #指定用户的登录shell
        -g  #指定用户的基本组
        -G  #指定用户的附加组(可指定GID)
删除:
    userdel -r 用户名
    删除用户的同事也将家目录一并删除
改:
    usermod [选项] 用户名
    选项:
        包含创建用户的所有选项
    passwd  用户名 #为用户设置密码
    passwd  [选项] 用户名
    选项:
        -d  #清空用户的密码(不用密码登录)
        -l  #锁定用户
        -u  #解锁用户
        -S  #查看用户锁定状态
    chsh -s 解释器目录   用户名 #更改用户的shell解释器
查:
    grep 用户名 /etc/passwd    #查看账号信息
    id  用户名     #显示用户UID和所属组
    w   #查看当前主机的登录情况
  • 组的管理
    添加:
    groupadd    组名
    选项-g可指定GID
    删除:
    groupdel    组名
    改:
    gpasswd [选项] 用户名 组名
    选项:
        -a  #将单个用户添加到某个组
        -M  #将多个用户添加到某个组,用户之间用逗号隔开
        -d  #将某个用户在某个组中删除
    查:
    groups  用户名     #查看用户属组
    grep    组名  /etc/group  #查看组信息

三、文件的属性

  • 查看文件或目录的属性
ls -ld 目录或文件位置
  格式:文件类型、权限、inode数量、属主、属组、大小、日期、文件名
  权限列表:
    第一个字符:文件类型,d目录、b块设备文件、c字符设备文件、l链接文件、-普通文件;
    第2-4个字符:属主对文件的权限;
    第5-7个字符:属组对文件的权限;
    第8-10个字符:任何用户对文件的权限;
  权限的表示:
    r:读取,查看内容,也可以用4表示;
    w:写入,写入(删除、更改、移动等)内容,也可用2表示;
    x:执行,执行此文件或cd到此目录,也可用1表示;
  • 设置文件或目录的权限
语法:chmod [ugoa] [+-=] [rwx] 文件或目录
    举例:chmod g-x, o-r 文件或目录
    选项:-R 表示递归权限,目录下的子目录子文件继承父级目录的权限;
    语法:chmod 775 文件或目录
  • 设置目录或文件的归属
语法:
     chown 属主 文件或目录                 #设置其属主
     chown :属组 文件或目录                   #设置其属组
     chown 属主:属组 文件或目录              #设置其属主和属组
    注:选项-R 递归可将其子目录子文件继承父级目录的归属;
  • umask文件反权限:

    • umask #查看系统的默认权限反掩码值,文件最大权限为666,目录最大权限为777
    • umask 值 #手动更改文件权限的反掩码值,更改后创建文件或目录验证反掩码值
  • chattr锁定文件

    • chattr +i 文件路径 #锁定文件,不得移动删除等
    • chattr -i 文件路径 #解锁文件
  • 特殊权限setuid和setgid

    • chmod u+s 文件或目录位置 #设置setuid权限
    • chmod g+s 文件或目录位置 #设置setgid权限

/etc/passwd的权限为 -rw-r--r--。也就是说:该文件的所有者拥有读写的权限,而属组和其他人只有读取的权限。我们知道,在系统中我们要修改一个用户的密码,root用户和普通用户均可以用“/usr/bin/passwd 用户名” 这个命令来修改这个/etc/passwd这个文件,root用户本身拥有对/etc/passwd的写权限,可以理解;那普通用户没有写权限,那他怎么也能修改呢?这里就用到了setuid,setuid的作用是让执行该命令的用户以该命令拥有者的权限去执行,就是普通用户执行passwd时会拥有root的权限,这样就可以修改/etc/passwd这个文件了。它的标志为:s,会出现在x的地方,例:-rwsr-xr-x 。而setgid的意思和它是一样的,即让执行文件的用户以该文件所属组的权限去执行。

  • 特殊权限stick bit(粘滞位)

    • chmod o+t xxx #设置stick bit权限,针对目录

我们知道/tmp是系统的临时文件目录,所有的用户在该目录下拥有所有的权限,也就是说在该目录下可以任意创建、修改、删除文件,那如果用户A在该目录下创建了一个文件,用户B将该文件删除了,这种情况我们是不能允许的。为了达到该目的,就出现了stick  bit(粘滞位)的概念。它是针对目录来说的,如果该目录设置了stick  bit(粘滞位),则该目录下的文件除了该文件的创建者和root用户可以删除和修改/tmp目录下的stuff,别的用户均不能动别人的,这就是粘滞位的作用。

  • 特殊权限facl(文件的访问控制列表)的设置
语法:
    setfacl -m u:用户名:rwx 文件或目录
    setfacl -d -m u:用户名:rwx 目录      ##设置目录的默认facl并目录下所有子文件子目录都使用父目录的默认facl
   getfacl 目录或文件                    ##查看目标文件或目录的acl规则
   setfacl -b 文件或目录             ##删除文件所有的acl规则
    setfacl -x u:root 文件或目录         ##删除文件的一条acl规则
    setfacl  -m  m:w    /mnt/test           ##设置有效权限mask,有效权限(mask) 即用户或组所设置的权限必须要存在于mask的权限设置范围内才会生效 

李泽信 发布于 2022-7-17 16:55

linux系统程序管理及安装

linux应用程序的类型

  • *.rpm
    redhat系统默认的软件格式(使用了二进制的文件格式,代码相对来说比较封闭)
    rpm软件包名称格式:软件名-版本-发布次数-os平台-硬件平台(32bit/64bit).rpm
    硬件平台:
    32位:i386、i586、i686
    64位:x86
    不分硬件架构:noarch
  • 源码安装
    通用软件格式,压缩格式(xz、gz、bz2)的文件,也是生成rpm等包的基础自带安装程序或免安装软件。

程序文件存放位置

/etc/       #rpm包的配置文件
/var/log/   #日志文件
/usr/share/doc/     #软件的说明文档
/usr/bin/   #普通用户可运行的程序命令
/usr/sbin/  #root可运行的程序命令

一、rpm常用命令

  • 查询命令

      rpm -qa             #查询当前系统安装的所有rpm包
      rpm -ql 软件名       #查询软件包的所有有关文件
      rpm -qc 软件名       #查询软件包的所有配置文件
      rpm -qi 软件名       #查看软件包的详细信息
      rpm -qf 文件名       #查看此文件由哪个软件包提供
  • 安装、卸载、升级rpm软件包

    安装:
      rpm -ivh 软件包名  
    升级:
      rpm -F 软件包命   #为已安装的软件包升级
      rpm -U 软件包名   #为已安装的软件包升级,若未安装进行安装
    卸载:
      rpm -e 软件包名   #卸载软件包
    特殊用法:
    --force:强制安装,党已经安装的软件的文件丢失或者被损坏时用到,或系统中以存在新版本需要安装旧版本时;
    --nodeps:忽略依赖关系,安装或卸载时用到;
    --import:导入iso的公钥(检查包的合法性和完整性,不导入会在安装时报warning);

二、yum命令管理软件包

  • yum概述:C/S架构
    服务端:为客户端提供软件包的源,可以理解为一个服务站,

    • 可以使用ftp文件服务器提供yum的源
    • 可以使用http(apache、nginx)提供基于web的源
    • 可以使用本地file上传的文件
  • yum服务端搭建本地的yum源

    • 例如:
      mount /dev/cdrom /mnt 或者mount /dev/sr0 /mnt
      createrepo -g /mnt/repodata/repomd.xml /软件包位置 #根据光盘的repo文件作为模版
  • yum客户端的配置

    • 配置yum仓库,源的文件
      mount /dev/cdrom /mnt   #将光盘镜像文件挂载到/mnt下
      rm -rf /etc/yum.repos.d/*  #删除系统中自带的默认yum源文件
      vi /etc/yum.repos.d/local.repo
      [local] #自定义名称,标记
      name=local  #对repo文件的描述
      baseurl=file:///mnt #yum服务器的访问路径,可以指定多个
      enable=1    #为1代表开启此源,为0代表关闭此源,关闭后yum默认不会找到此源,需要使用yum --enablerepo=名称
      gpgcheck=0  #为0代表不进行gpg公钥的检查,为1代表进行检查
  • yum的配置文件

    /etc/yum.conf   #主配置文件
    keepcache=0 #将安装的软件包缓存到本地一份
    cachedir=/var/cache/yum/$basearch/$releasever   #指定缓存软件包的路径
    logfile=/var/log/yum.log    #yum的日志文件
  • yum 的用法

    • 查找

      yum list    #查看所有软件包
      yum repolist    #列出可用yum源
      yum search 软件名(关键字) #查找软件
      yum grouplist   #列出所有可安装的yum源的软件组
      yum groupinfo "软件组名"    #查看软件组中软件包
      yum provides */命令   #查看提供此命令的软件包
    • 安装

      yum -y install 软件包名
      yum -y groupinstall 软件组名
    • 卸载

      yum -y remove 软件包名
      yum -y erase 软件包名
      yum -y groupremove 软件组名
    • 修改(修改yum本身)

      yum clean all   #清空yum的所有缓存,出错时常用
      yum -y update   #更新系统,升级所有包,改变软件设置和系统设置,系统版本内核都升级
      yum -y upgrade  #升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变

李泽信 发布于 2022-7-17 15:21

MySQL主从复制 源码安装

  • 安装环境
系统 IP 主机名 所需软件 硬件
centos7.8 192.168.100.105 master boost_1_59_0.tar.gz mysql-5.7.12.tar.gz 内存:4G
centos7.8 192.168.100.106 slave boost_1_59_0.tar.gz mysql-5.7.12.tar.gz 内存:4G
  • 在master主机上安装ntp时间服务
[root@master ~]# yum -y install ntp
[root@master ~]# sed -i '/^server/s/^/#/g' /etc/ntp.conf
[root@master ~]# cat <<END >>/etc/ntp.conf 
 server 127.127.1.0
 fudge 127.127.1.0 stratum 8
 END
[root@master ~]# systemctl start ntpd
[root@master ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
  • 在slave主机中配置同步master的ntp时间
[root@slave ~]# yum -y install ntpdate
[root@slave ~]# ntpdate 192.168.100.105
[root@slave ~]# echo "/usr/sbin/ntpdate 192.168.100.105" >>/etc/rc.local
[root@slave ~]# chmod +x /etc/rc.local
  • 安装MySQL数据库,步骤相同,在此安装master
[root@master ~]# yum -y remove mysql-* boost-*      ##卸载系统中原有mysql与boost及依赖
[root@master ~]# rpm -qa mysql
[root@master ~]# rpm -qa boost
[root@master ~]# yum -y install gcc gcc-c++ ncurses bison libgcrypt perl cmake ncurses-devel
[root@master ~]# tar -zxvf boost_1_59_0.tar.gz
[root@master ~]# mv boost_1_59_0 /usr/local/boost/
[root@master ~]# groupadd mysql
[root@master ~]# useradd -r -g mysql mysql
[root@master ~]# tar zxvf mysql-5.7.12.tar.gz -C /usr/src/
[root@master ~]# cd /usr/src/mysql-5.7.12/          ##编译多次时,需要删除CMAKE的缓存,rm -rf /usr/src/mysql-5.7.12/CMakeCache.txt
[root@master mysql-5.7.12]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data \
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_TCP_PORT=3306 -DMYSQL_USER=mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 -DENABLE_DOWNLOADS=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost -DSYSCONFDIR=/etc

注释:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql                [MySQL安装的根目录]
-DMYSQL_DATADIR=/mydata/mysql/data                     [MySQL数据库文件存放目录]
-DDEFAULT_CHARSET=utf8                                 [设置默认字符集为utf8]
-DDEFAULT_COLLATION=utf8_general_ci                    [设置默认字符校对]
-DMYSQL_TCP_PORT=3306                                  [MySQL的监听端口]
-DMYSQL_USER=mysql                                     [MySQL用户名]    
-DWITH_MYISAM_STORAGE_ENGINE=1                         [安装MySQL的myisam数据库引擎]
-DWITH_INNOBASE_STORAGE_ENGINE=1                       [安装MySQL的innodb数据库引擎]
-DWITH_ARCHIVE_STORAGE_ENGINE=1                        [安装MySQL的archive数据库引擎]
-DWITH_BLACKHOLE_STORAGE_ENGINE=1                      [安装MySQL的blackhole数据库引擎]
-DWITH_MEMORY_STORAGE_ENGINE=1                         [安装MySQL的memory数据库引擎]
-DENABLE_DOWNLOADS=1                                   [编译时允许自主下载相关文件]
-DDOWNLOAD_BOOST=1                                     [允许下载BOOST]
-DWITH_BOOST=/usr/local/boost                          [指定系统中存在的BOOST]

-DSYSCONFDIR=/etc                                      [MySQL配置文件所在目录]
-DWITH_READLINE=1                                      [MySQL的readline library]
-DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock            [MySQL的通讯目录]
-DENABLED_LOCAL_INFILE=1                               [启用加载本地数据]
-DWITH_PARTITION_STORAGE_ENGINE=1                       [启动mysql的分区存储结构]
-DEXTRA_CHARSETS=all                                   [使MySQL支持所有的扩展字符]
-DWITH_DEBUG=0                                         [禁用调试模式]
-DMYSQL_MAINTAINER_MODE=0 
-DWITH_SSL:STRING=bundled                              [通讯时支持ssl协议]
-DWITH_ZLIB:STRING=bundled                              [允许使用zlib library]
[root@master ~]# make -j `cat /proc/cpuinfo | grep processor| wc -l`
[root@master mysql-5.7.12]# make install
[root@master mysql-5.7.12]# chown -R mysql:mysql /usr/local/mysql
[root@master mysql-5.7.12]# cp /usr/src/mysql-5.7.12/support-files/my-default.cnf /etc/my.cnf
[root@master mysql-5.7.12]# cp /usr/src/mysql-5.7.12/support-files/mysql.server /etc/init.d/
[root@master mysql-5.7.12]# chmod +x /etc/init.d/mysql.server
[root@master mysql-5.7.12]# cat <<END >>/usr/lib/systemd/system/mysqld.service
 [Unit]
 Description=mysqldapi
 After=network.target

 [Service]
 Type=forking
 PIDFile=/usr/local/mysql/logs/mysqld.pid
 ExecStart=/etc/init.d/mysql.server start
 ExecReload=/etc/init.d/mysql.server restart
 ExecStop=/etc/init.d/mysql.server stop
 PrivateTmp=Flase

 [Install]
 WantedBy=multi-user.target
 END

注解:
PrivateTmp=Flase        ##此配置必须关闭,不然mysql连接文件mysql.sock文件会默认生成在以下位置/tmp/systemd-private-83bba738e8ff4837b5ae657eff983821-mysqld.service-BPxWpJ/tmp/mysql.sock,导致数据库无法连接,将此配置项关闭后,则文件正常生成在/tmp/mysql.sock
[root@master mysql-5.7.12]# echo "export PATH=$PATH:/usr/local/mysql/bin/" >>/etc/profile
[root@master mysql-5.7.12]# source /etc/profile
[root@master ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data       初始化
注解:
--initialize-insecure               ##禁用mysql的密码策略(密码复杂性等),--initializeaize是开启密码策略,自动生成密码在mysqld.log文件中
--user=mysql                        ##运行的账户
--basedir=/usr/local/mysql          ##mysql的安装位置
--datadir=/usr/local/mysql/data     ##mysql数据库服务数据的物理存放路径

[root@master ~]# cat <<END >/etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
character_set_server=utf8
init_connect='SET NAMES utf8'
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/logs/mysqld.pid
skip-name-resolve
END

注解: 
[mysqld]                    ##声明区域
basedir = /usr/local/mysql          ##mysql的安装位置
datadir = /usr/local/mysql/data     ##mysql的物理文件存放位置
port = 3306                     ##mysql服务监听的端口
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES     ##mysql的模式
character_set_server=utf8           ##字符集
init_connect='SET NAMES utf8'       
log-error=/usr/local/mysql/logs/mysqld.log          ##指定日志文件位置
pid-file=/usr/local/mysql/logs/mysqld.pid           ##指定运行服务所产生的pid文件位置
skip-name-resolve                   ##禁用数据库的反向DNS解析

[root@master ~]# mkdir /usr/local/mysql/logs
[root@master ~]# chown mysql:mysql /usr/local/mysql/logs/
[root@master ~]# systemctl start mysqld
[root@master ~]#  systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
[root@master ~]# netstat -utpln |grep mysqld
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      18723/mysqld
  • 优化配置master主机的mysql服务
[root@master ~]#  vi /etc/my.cnf        ##末尾添加
log-bin=master-bin
log-slave-updates
server-id=1
innodb_flush_log_at_trx_commit=2
master_info_repository=table
relay_log_info_repository=TABLE

注解:
log-bin=master-bin                          ##指定生成二进制文件,可加目录
log-slave-updates                           ##指定开启slave角色的更新
server-id=1                             ##指定id号码
innodb_flush_log_at_trx_commit=2            ##见下方
master_info_repository=table
relay_log_info_repository=TABLE

[root@master ~]#  systemctl restart mysqld
[root@master ~]#  ls /usr/local/mysql/data/
...  master-bin.000001  master-bin.index  ...
  • 优化配置slave主机的mysql
[root@slave ~]# vi /etc/my.cnf          ##末尾添加
log-bin=relay1-bin
relay-log=relay1-log-bin
relay-log-index=slave-relay1-bin.index
server-id=2
innodb_flush_log_at_trx_commit=2
slave-parallel-type=LOGICAL_CLOCK
slave_parallel_workers=16
master_info_repository=table
relay_log_info_repository=TABLE

注解:
relay-log=relay-log-bin                     ##中继日志文件名
relay-log-index=slave-relay-bin.index           ##中继日志索引文件
server-id=2                             ##id号码
innodb_flush_log_at_trx_commit=2
##指定数据库在存储数据时,事务的刷新方式,如下:
0:该模式速度最快,但不太安全,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
1:最安全的,默认值,但是最慢是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘。在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务。
2:比0安全,速度比较快,是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。
slave-parallel-type=LOGICAL_CLOCK
##选择并行复制的类型
slave_parallel_workers=16
##worker线程数量
master_info_repository=table
##默认是file,master的更新或者slave的更新直接存放在文件内,若出现故障,会出现数据丢失;若改为table,则为表的方式进行存储更新,支持事务,安全性更高;
relay_log_info_repository=TABLE
##指定中继日志更新,提升性能

[root@slave ~]# systemctl restart mysqld
[root@slave ~]# ls /usr/local/mysql/data/
...  relay1-bin.000001  relay1-bin.index ...
  • 配置master主机上的master角色,配置主节点
[root@master ~]# mysql -uroot -p123123
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+

mysql> grant replication slave on *.* to 'linuxfan'@'192.168.100.%' identified by '123123';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql>  show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      1008 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> create database linuxfan;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| linuxfan             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
  • 配置slave主机的slave角色,配置从节点
[root@slave ~]# mysql -uroot -p123123
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
1 row in set (0.00 sec)

mysql> change master to master_host='192.168.100.105',master_user='linuxfan',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1008;
mysql> start slave;

mysql>  show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.100.105
                  Master_User: linuxfan
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 1008
               Relay_Log_File: relay1-log-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  • 如果出现以下错误解决

错误1
slave中出现无法识别Master的UUID(虚拟机克隆导致mysql服务的UUID一致冲突);

解决方法:

[root@slave ~]# rm -rf /usr/local/mysql/data/auto.cnf           ##重新生成UUID的配置文件
[root@slave ~]# systemctl restart mysqld

错误2:slave中指定的master的position值大于当前值;

解决方法:

[root@slave ~]# mysql -uroot -p123123           ##重新指定master的position值
mysql> stop slave;
mysql> change master to ...
mysql> start slave;
  • 配置master角色指定主从复制中特定的数据库优化
[root@master ~]# vi /etc/my.cnf
binlog-do-db=linuxfan
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
expire_logs_days=7

注解:
binlog-do-db=linuxfan                   ##允许同步的数据库名称
binlog-ignore-db=mysql              ##不允许同步的数据库名称
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
expire_logs_days=7                      ##指定日志存放的时间为7天

[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -uroot -p123123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| linuxfan              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use linuxfan;
Database changed
mysql> create table it(岗位 char(16),姓名 char(16),身份证号 char(48),学历 char(16),工资 int);
Query OK, 0 rows affected (0.02 sec)
mysql>  insert into it values('网络工程师','张三','150404199201091132','高 中','5500');
Query OK, 1 row affected (0.02 sec)
mysql> select * from it;
+-----------------+--------+--------------------+--------+--------+
| 岗位            | 姓名   | 身份证号           | 学历   | 工资   |
+-----------------+--------+--------------------+--------+--------+
| 网络工程师      | 张三   | 150404199201091132 | 高中   |   5500 |
+-----------------+--------+--------------------+--------+--------+
  • 验证slave角色的数据库复制情况
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| linuxfan           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

mysql> use linuxfan;
Database changed
mysql> select * from it;
+-----------------+--------+--------------------+--------+--------+
| 岗位            | 姓名   | 身份证号           | 学历   | 工资   |
+-----------------+--------+--------------------+--------+--------+
| 网络工程师      | 张三   | 150404199201091132 | 高中   |   5500 |
+-----------------+--------+--------------------+--------+--------+

错误:slave中无法找到当前insert语句所在的数据库,错误原因是在之前的同步中出现了失败,导致后续同步无法继续运行;

解决方案:在slave中创建缺少的数据库或者其他数据;

  • 查看并设置slave节点sql线程并发数量
mysql> show full processlist;
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| Id  | User        | Host      | db   | Command | Time | State                                                  | Info                  |
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| 130 | root        | localhost | haha | Query   |    0 | starting                                               | show full processlist |
| 131 | system user |           | NULL | Connect | 5527 | Waiting for master to send event                       | NULL                  |
| 132 | system user |           | NULL | Connect |   55 | Slave has read all relay log; waiting for more updates | NULL                  |
| 133 | system user |           | NULL | Connect |   55 | Waiting for an event from Coordinator                  | NULL                  |
| 134 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 135 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 136 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 137 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 138 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 139 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 140 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 141 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 142 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 143 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 144 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 145 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 146 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 147 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
| 148 | system user |           | NULL | Connect | 5527 | Waiting for an event from Coordinator                  | NULL                  |
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
19 rows in set (0.00 sec)

mysql>  set @@global.slave_parallel_workers=2;
Query OK, 0 rows affected (0.00 sec)

mysql> stop slave sql_thread;
Query OK, 0 rows affected (0.01 sec)

mysql> start slave sql_thread;
Query OK, 0 rows affected (0.03 sec)

mysql> show full processlist;
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| Id  | User        | Host      | db   | Command | Time | State                                                  | Info                  |
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
| 130 | root        | localhost | haha | Query   |    0 | starting                                               | show full processlist |
| 131 | system user |           | NULL | Connect | 5565 | Waiting for master to send event                       | NULL                  |
| 149 | system user |           | NULL | Connect |    4 | Slave has read all relay log; waiting for more updates | NULL                  |
| 150 | system user |           | NULL | Connect |    4 | Waiting for an event from Coordinator                  | NULL                  |
| 151 | system user |           | NULL | Connect |    4 | Waiting for an event from Coordinator                  | NULL                  |
+-----+-------------+-----------+------+---------+------+--------------------------------------------------------+-----------------------+
5 rows in set (0.00 sec)

李泽信 发布于 2022-7-14 13:07

个人资料

搜索

日历

时间进度

    今日剩余 59.6%
    本周剩余 37.1%
    本月剩余 22.0%
    本年剩余 52.2%

访问统计