LVM逻辑卷管理与磁盘配额
一、LVM的基本概述和LVM的基本管理流程
-
LVM的基本概述
-
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 ##验证逻辑卷的大小
五、磁盘配额
-
作用:限制普通用户使用磁盘资源;
-
条件:需要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 挂载点 ##查看分区的配额使用情况
文件存储与磁盘管理
一、认识文件存储
-
-
结构
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个
-
磁盘的分区类型
-
磁盘分区流程
[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
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 |
-
安装mycat节点的mycat代理服务
[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)
账号管理及文件权限管理
一、用户和组账号的概述
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的权限设置范围内才会生效
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仓库,源的文件
-
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 #升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变
-
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)