redis-cluster集群
redis cluster集群介绍
一、redis cluster概述
redis集群搭建的方式有多种,例如哨兵模式、使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存相应的数据和整个集群实例状态,每个节点都和其他所有节点相互连接;
群集实现需要一个中间件,然后这个中间件负责将我们需要存入redis中的数据的key通过一套算法计算得出一个值。然后根据这个值找到对应的redis节点,将这些数据存在这个redis的节点中;
在取值的时候,同样先将key进行计算,得到对应的值,然后就去找对应的redis节点,从对应的节点中取出对应的值;
上图中每一个蓝色的圈都代表一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作;
二、redis cluster群集节点数据存取实现原理
首先,在redis的每一个节点上,都会存放以下两种数据;
1.一个是插槽(slot)可以理解为是一个可以存储两个数值的一个变量,这个变量的取值范围是:0-16383;
2.一个就是cluster,这个cluster理解为是一个集群管理的插件。当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作;
三、redis cluster集群结构特点
1.所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;
2.节点的fail是通过集群中超过半数的节点检测失效时才生效;
3.客户端与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;
4.redis-cluster把所有的物理节点映射到 [0-16383]slot上(不一定是平均分配),cluster 负责维护node <---> slot <---> value;
5.redis集群预分好16384个桶,当需要在redis集群中放置一个key-value时,根据CRC16(key)mod 16384的值,决定将一个key放到哪个桶中;
四、安装
1.安装环境
系统环境 | IP | 实例端口 | 所需软件 |
---|---|---|---|
centos7.8 | 192.168.100.101 (rd1) | 6379、6380 | redis-5.0.4.tar.gz |
centos7.8 | 192.168.100.102 (rd2) | 6379、6380 | redis-5.0.4.tar.gz |
centos7.8 | 192.168.100.103 (rd3) | 6379、6380 | redis-5.0.4.tar.gz |
2.安装部署redis环境,三处节点部署一致
[root@rd1 ~]# wget http://download.redis.io/releases/redis-5.0.4.tar.gz
[root@rd1 ~]# tar xf redis-5.0.4.tar.gz
[root@rd1 ~]# cd redis-5.0.4/
[root@rd1 redis-5.0.4]# make
3.准备实例,每个节点两个实例
[root@rd1 ~]# mkdir /usr/local/redis{6379..6380}
[root@rd1 ~]# cp redis-5.0.4/src/redis-server /usr/local/redis6379/ #准备实例主程序
[root@rd1 ~]# cp redis-5.0.4/src/redis-server /usr/local/redis6380/
[root@rd1 ~]# cp redis-5.0.4/src/redis-cli /usr/local/redis6379/ #准备实例客户端程序
[root@rd1 ~]# cp redis-5.0.4/src/redis-cli /usr/local/redis6380/
[root@rd1 ~]# cp redis-5.0.4/redis.conf /usr/local/redis6379/ #准备实例主配置文件
[root@rd1 ~]# cp redis-5.0.4/redis.conf /usr/local/redis6380/
[root@rd1 ~]# mkdir /usr/local/redis6379/data #准备实例数据存放位置
[root@rd1 ~]# mkdir /usr/local/redis6380/data
4.修改实例主配置文件,注意多个实例端口不一致
[root@rd1 ~]# vi /usr/local/redis6379/redis.conf
bind 192.168.100.101 #本机IP
port 6379 #实例1端口6379、实例2端口6380
daemonize yes #设置redis后台运行
pidfile /var/run/redis_6379.pid #pidfile文件
logfile "/usr/local/redis6379/redis.log" #日志位置
dir /usr/local/redis6379/data/ #数据文件存放位置,手动创建
masterauth <123123> #密码根据实际情况设置
requirepass 123123 #两处密码一致,根据实际情况设置
appendonly yes # aof日志开启,有需要就开启,时间长了文件会很大
cluster-enabled yes #开启cluster集群模式
cluster-config-file nodes-7000.conf #cluster集群配置文件,无需创建,自动生成
cluster-node-timeout 15000 #cluster节点超时时间,默认15秒
5.启动redis实例进程,三处节点一致
[root@rd1 ~]# /usr/local/redis6379/redis-server /usr/local/redis6379/redis.conf
[root@rd1 ~]# /usr/local/redis6379/redis-server /usr/local/redis6380/redis.conf
验证端口状态
[root@rd1 ~]# netstat -utpln |grep redis
tcp 0 0 192.168.100.101:6379 0.0.0.0:* LISTEN 23798/redis-server
tcp 0 0 192.168.100.101:6380 0.0.0.0:* LISTEN 23790/redis-server
tcp 0 0 192.168.100.101:16379 0.0.0.0:* LISTEN 23798/redis-server
tcp 0 0 192.168.100.101:16380 0.0.0.0:* LISTEN 23790/redis-server
6.创建redis集群
[root@rd1 ~]# /usr/local/redis6379/redis-cli -a 123123 --cluster create 192.168.100.101:6379 192.168.100.101:6380 192.168.100.102:6379 192.168.100.102:6380 192.168.100.103:6379 192.168.100.103:6380 --cluster-replicas 1
#-a 用户设置密码
#--cluster create:创建集群
#--cluster-replicas 1:表示一个master 对应一个slave
7.验证集群状态
[root@rd1 ~]# /usr/local/redis6379/redis-cli -a 123123 -h 192.168.100.101 -p 6379 -c #-c:表示集群,不可省略
192.168.100.101:6379> cluster nodes
ea7d12b13afa68dfc55db677c5e1f7e0e48aec54 192.168.100.103:6379@16379 master - 0 1645965731000 5 connected 10923-16383
ea3bc664387735cef6254d0e4f905a1376218b0b 192.168.100.102:6380@16380 slave c8043ea17379327de9bdf21d8687e1b4d057e100 0 1645965731556 4 connected
1077ab28be4e60b782880b64eaf69c7ae762412b 192.168.100.101:6380@16380 slave ea7d12b13afa68dfc55db677c5e1f7e0e48aec54 0 1645965731000 5 connected
c8043ea17379327de9bdf21d8687e1b4d057e100 192.168.100.101:6379@16379 myself,master - 0 1645965732000 1 connected 0-5460
8d2e2b93298f1d02fdd08e783c1bebef147a242b 192.168.100.102:6379@16379 master - 0 1645965733000 3 connected 5461-10922
d2d03bfa6ae11db9d172276087c3bfa3afe57464 192.168.100.103:6380@16380 slave 8d2e2b93298f1d02fdd08e783c1bebef147a242b 0 1645965733604 6 connected
#master插入数据并验证
192.168.100.101:6379> set name zs
-> Redirected to slot [5798] located at 192.168.100.102:6379 #访问192.168.100.101的6379实例,插入数据时,被写入192.168.100.102的6379实例,并且将终端直接转入相应实例
OK
192.168.100.102:6379> keys * #且对应实例可以查到相应数据
1) "name"
192.168.100.102:6379> get name
"zs"
192.168.100.102:6379>
#slave验证
[root@rd1 ~]# /usr/local/redis6379/redis-cli -a 123123 -h 192.168.100.103 -p 6380 -c #访问相应从节点也是可以看见数据
192.168.100.103:6380> keys *
1) "name"
192.168.100.103:6380> get name
-> Redirected to slot [5798] located at 192.168.100.102:6379
"zs"
8.总结
插入数据时,redis计算key值,将其存放到192.168.100.102的6379实例,会直接跳转到192.168.100.102的6379实例,查找数据时可以通过192.168.100.102的6379实例192.168.100.103的6380实例查看;这也是redis cluster的特点,它是去中心化,每个节点都是对等的,连接哪个节点都可以获取和设置数据;
GlusterFS
一、GlusterFS概述
概述:GlusterFS(Google File System)是一个开源的分布式文件系统,Gluster借助TCP/IP网络将存储资源分散存储在网络的不同节点,在通过汇聚为客户端提供统一的资源访问,在存储方面具有很强大的横向扩展能力,通过扩展不同的节点可以支持PB级别的存储容量:Bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、DB、NB.
特点:
扩展性与高性能:通过Scale-out架构可以增加存储节点的方式来提高容量和性能(磁盘、计算、I/O资源都可以独立增加),Gluster弹性哈希(Elastic Hash)解决了Gluster服务对元数据服务器的依赖,Gluster采用弹性哈希算法来确定数据在chunk节点中的分布情况,无须元数据服务器,实现了存储的横向扩展,改善了元数据服务器节点的压力以及单点故障;
高可用性:GlusterFS通过配置不同类型的卷,可以对数据进行自动复制(类似于RAID1),即使某节点故障,也不影响数据的访问;
通用性:GlusterFS没有设置独立的私有数据文件系统,而是采用以往的ext4、ext3等,数据可以通过传统的磁盘访问方式被客户端所访问;
弹性卷管理:GlusterFS通过将数据存储在逻辑卷上,逻辑卷从逻辑存储池进行独立逻辑划分,逻辑存储池可以在线进行增加和删除,不会导致业务中断,逻辑卷的数量可以根据实际需求进行自行增加和缩减;
二、GlusterFS存储架构
专业术语:
Brick(存储块):存储池中节点对外提供存储服务的目录;
Volume(逻辑卷):一个逻辑卷是一组Brick的集合,卷是数据存储的逻辑设备,类似LVM中的逻辑卷,大部分GlusterFS管理操作都是在逻辑卷上进行的;
FUSE(用户空间文件系统):是一个内核模块,用户自行创建挂载的的文件系统;
VFS(接口):内核空间对用户空间提供的访问磁盘的接口;
Glusterd(后台管理进程):在存储集群中的每个节点上都要运行;
三、GlusterFS工作原理
数据访问流程
- 首先是在客户端,用户通过glusterfs的mount point 来读写数据, 对于用户来说, 集群系统的存在对用户是完全透明的, 用户感觉不到是操作本地系统还是远端的集群系统。
- 用户的这个操作被递交给 本地linux系统的VFS来处理。
- VFS 将数据递交给FUSE 内核文件系统:在启动 glusterfs 客户端以前, 需要想系统注册一个实际的文件系统FUSE,如上图所示,该文件系统与ext3在同一个层次上面,ext3 是对实际的磁盘进行处理,而 fuse 文件系统则是将数据通过/dev/fuse 这个设备文件递交给了glusterfs client端。所以我们可以将 fuse 文件系统理解为一个代理。
- 数据被 fuse 递交给 Glusterfs client 后,client 对数据进行一些指定的处理(所谓的指定,是按照client 配置文件据来进行的一系列处理, 我们在启动glusterfs client 时 需 要 指 定 这 个 文 件 , 其 默 认 位 置 :/etc/glusterfs/client.vol)。
- 在glusterfs client的处理末端,通过网络将数据递交给 Glusterfs Server,并且将数据写入到服务器所控制的存储设备上。
四、GlusterFS卷的类型
分布式卷、条带卷、复制卷、分布式条带卷、分布式复制卷、条带复制卷、分布式条带复制卷;
1. 分布式卷
分布式卷是GlusterFS的默认卷,在创建卷时,默认选项是创建分布式卷。在该模式下,并没有对文件进行分块处理,文件直接存储在某个Server节点上。由于使用本地文件系统,所以存取效率并没有提高,反而会因为网络通信的原因而有所降低,另外支持超大型文件也会有一定的难度,因为分布式卷不会对文件进行分块处理,一个文件要么在Server1上,要么在Serve2上,不能分块同时存放在Sever1和Server2上;
特点:
文件分布在不同的服务器,不具备冗余性;
更容易且廉价地扩展卷的大小;
单点故障会造成数据丢失;
依赖底层的数据保护;
创建方法
[root@localhost ~]# gluster volume create dis-volume server1:/dir1 server2:/dir2
2.条带卷
Stripe模式相当于RAIDO,在该模式下,根据偏移量将文件分成N块,轮询地存储在每个Brick Server节点。节点把每个数据块都作为普通文件存入本地文件系统中,通过扩展属性记录总块数(Stripe-count) 和每块的序号(Stripe-index),在配置时指定的条带数必须等于卷中Brick所包含的存储服务器数,在存储大文件时,性能尤为突出,但是不具备冗余性;
特点:
数据被分割成更小块分布到块服务器群中的不同;
分布减少了负载且更小的文件提高了存取速度;
没有数据冗余;
创建方法
[root@localhost ~]# gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1
3.复制卷
也称为AFR(AutGilePepliatio)相当于RAD1,即同一文件保存一份或多份副本。每个节点上保存相同的内容和目录结构。复制模式因为要保存副本,所以磁盘利用率较低,复制卷时,复制数必须等于卷中Brick所包含的存储服务器数,复制卷具备冗余性,即使一个节点损坏,也不影响数据的正常使用;
特点:
卷中所有的服务器均保存一个完整的副本;
卷的副本数量可由客户创建的时候决定;
最少保证两个块服务器或更多服务器;
具备冗余效果;
创建方法
[root@localhost ~]# gluster volume create rep-volume replica 2 transport tcp server1:/dir1
4.分布式条带卷
分布式条带卷兼顾分布式卷和条带卷的功能,可以理解成为大型的条带卷,主要用于大文件访问处理,创建一个分布式条带,卷最少需要4台服务器;
创建方法
[root@localhost ~]# gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4
上述命令创建了一个名为dis-stripe的分布式条带卷,配置分布式条带卷时,卷中Brick所包含的存储服务器必须是条带数的倍数(大于等于2倍),如上述命令,Brick的数量为4,条带数为2;
5.分布式复制卷
分布式复制卷兼顾分布式卷和复制卷的功能,可以理解成为大型的复制卷,主要用于冗余的场景下,创建一个分布式复制卷,最少需要4块brick;
创建方法
[root@localhost ~]# gluster volume create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4
6.条带复制卷
条带复制卷兼顾了条带卷和复制卷两者的优点,相当于RADI 10,用于存储效率高,备份冗余的场景下,创建条带复制卷,最少需要四个brick;
创建方法
[root@localhost ~]# gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4
7.分布式条带复制卷
分布式条带复制卷将分布条带数据在复制卷集群。为了获得最佳效果,可以选择使用分布在高并发的条带复制卷环境下并行访问非常大的文件和性能是至关重要的;
五、搭建Gluster分布式文件系统
系统类型 | IP | 主机名 | 所需软件 |
---|---|---|---|
Centos7.8 | 192.168.100.101 | data1 | glusterfs 、glusterfs-server、glusterfs-fuse、glusterfs-rdma |
Centos7.8 | 192.168.100.102 | data2 | glusterfs 、glusterfs-server、glusterfs-fuse、glusterfs-rdma |
Centos7.8 | 192.168.100.103 | data3 | glusterfs 、glusterfs-server、glusterfs-fuse、glusterfs-rdma |
Centos7.8 | 192.168.100.104 | client | glusterfs 、glusterfs-fuse |
1.配置主机之间的解析(在此所有主机配置相同,在此只列举data1节点的配置)
[root@data1 ~]# cat <<END >>/etc/hosts
192.168.100.101 data1
192.168.100.102 data2
192.168.100.103 data3
192.168.100.104 client
END
2.在所有data节点上安装GlusterFS(在此所有主机配置相同,在此只列举data1节点的配置);
# 连接阿里云镜像源,安装gluster包的yum源
[root@data1 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@data1 ~]# yum -y install centos-release-gluster
#安装
[root@data1 ~]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
#启动并设置开机自启
[root@data1 ~]# systemctl start glusterd
[root@data1 ~]# systemctl enable glusterd
Created symlink from /etc/systemd/system/multi-user.target.wants/glusterd.service to /usr/lib/systemd/system/glusterd.service.
#查看端口
[root@data1 ~]# netstat -utpln |grep glu
tcp 0 0 0.0.0.0:24007 0.0.0.0:* LISTEN 1470/glusterd
3.在data1节点上进行创建集群,其他节点会同步
[root@data1 ~]# gluster peer probe data1 #添加本机节点
peer probe: Probe on localhost not needed
[root@data1 ~]# gluster peer probe data2 #添加data2节点
peer probe: success
[root@data1 ~]# gluster peer probe data3 #添加data3节点
peer probe: success
#查看gluster集群状态
[root@data1 ~]# gluster peer status
Number of Peers: 2
Hostname: data2
Uuid: 9b323b83-e247-4928-ab0a-611fe5e8c18c
State: Peer in Cluster (Connected)
Hostname: data3
Uuid: 41fed8d3-c50f-4d70-8f57-282155cb15e7
State: Peer in Cluster (Connected)
4.在多个data节点创建数据存储的位置
[root@data1 ~]# mkdir /data
[root@data1 ~]# gluster volume info
No volumes present
5.在data1节点创建数据存储的卷(复制卷),其他节点会同步配置
##创建复制卷,名称如下
[root@data1 ~]# gluster volume create rep-volume replica 3 transport tcp data1:/data data2:/data data3:/data force
volume create: rep-volume: success: please start the volume to access data
[root@data1 ~]# gluster volume info #查看集群中的卷信息
Volume Name: rep-volume
Type: Replicate
Volume ID: 586bb64e-3cf4-441d-946b-5591b77c3cc2
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: data1:/data
Brick2: data2:/data
Brick3: data3:/data
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
#启动该卷
[root@data1 ~]# gluster volume start rep-volume
volume start: rep-volume: success
6.在client客户端节点上安装gluster客户端工具并测试挂载
[root@client ~]# yum install -y glusterfs glusterfs-fuse
[root@client ~]# mount -t glusterfs data1:rep-volume /mnt/
[root@client ~]# df -hT |tail -1
data1:rep-volume fuse.glusterfs 17G 1.7G 16G 10% /mnt
7.client客户端节点测试存放文件;
[root@client ~]# touch /mnt/{1..10}.file
[root@client ~]# ls /mnt/
10.file 1.file 2.file 3.file 4.file 5.file 6.file 7.file 8.file 9.file
[root@client ~]# dd if=/dev/zero of=/mnt/1.txt bs=1G count=1
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,37.3296 秒,28.8 MB/秒
[root@client ~]# ll -lh /mnt/
总用量 1.0G
-rw-r--r-- 1 root root 0 3月 24 21:54 10.file
-rw-r--r-- 1 root root 0 3月 24 21:54 1.file
-rw-r--r-- 1 root root 1.0G 3月 24 21:56 1.txt
-rw-r--r-- 1 root root 0 3月 24 21:54 2.file
-rw-r--r-- 1 root root 0 3月 24 21:54 3.file
-rw-r--r-- 1 root root 0 3月 24 21:54 4.file
-rw-r--r-- 1 root root 0 3月 24 21:54 5.file
-rw-r--r-- 1 root root 0 3月 24 21:54 6.file
-rw-r--r-- 1 root root 0 3月 24 21:54 7.file
-rw-r--r-- 1 root root 0 3月 24 21:54 8.file
-rw-r--r-- 1 root root 0 3月 24 21:54 9.file
8.gluster集群验证
#data1验证
[root@data1 ~]# ll -h /data/
总用量 1.0G
-rw-r--r-- 2 root root 0 3月 24 21:54 10.file
-rw-r--r-- 2 root root 0 3月 24 21:54 1.file
-rw-r--r-- 2 root root 1.0G 3月 24 21:56 1.txt
-rw-r--r-- 2 root root 0 3月 24 21:54 2.file
-rw-r--r-- 2 root root 0 3月 24 21:54 3.file
-rw-r--r-- 2 root root 0 3月 24 21:54 4.file
-rw-r--r-- 2 root root 0 3月 24 21:54 5.file
-rw-r--r-- 2 root root 0 3月 24 21:54 6.file
-rw-r--r-- 2 root root 0 3月 24 21:54 7.file
-rw-r--r-- 2 root root 0 3月 24 21:54 8.file
-rw-r--r-- 2 root root 0 3月 24 21:54 9.file
#data2验证
[root@data2 ~]# ll -lh /data/
-rw-r--r-- 2 root root 0 3月 24 21:54 10.file
-rw-r--r-- 2 root root 0 3月 24 21:54 1.file
-rw-r--r-- 2 root root 1.0G 3月 24 21:56 1.txt
-rw-r--r-- 2 root root 0 3月 24 21:54 2.file
-rw-r--r-- 2 root root 0 3月 24 21:54 3.file
-rw-r--r-- 2 root root 0 3月 24 21:54 4.file
-rw-r--r-- 2 root root 0 3月 24 21:54 5.file
-rw-r--r-- 2 root root 0 3月 24 21:54 6.file
-rw-r--r-- 2 root root 0 3月 24 21:54 7.file
-rw-r--r-- 2 root root 0 3月 24 21:54 8.file
-rw-r--r-- 2 root root 0 3月 24 21:54 9.file
#data3验证
[root@data3 ~]# ll -h /data/
-rw-r--r-- 2 root root 0 3月 24 21:54 10.file
-rw-r--r-- 2 root root 0 3月 24 21:54 1.file
-rw-r--r-- 2 root root 1.0G 3月 24 21:56 1.txt
-rw-r--r-- 2 root root 0 3月 24 21:54 2.file
-rw-r--r-- 2 root root 0 3月 24 21:54 3.file
-rw-r--r-- 2 root root 0 3月 24 21:54 4.file
-rw-r--r-- 2 root root 0 3月 24 21:54 5.file
-rw-r--r-- 2 root root 0 3月 24 21:54 6.file
-rw-r--r-- 2 root root 0 3月 24 21:54 7.file
-rw-r--r-- 2 root root 0 3月 24 21:54 8.file
-rw-r--r-- 2 root root 0 3月 24 21:54 9.file
9.Gluster的管理命令
gluster peer status ##查看所有的节点信息
gluster peer probe name ##添加节点
gluster peer detach name ##删除节点
gluster volume create xxx ##创建卷
gluster volume info ##查看卷信息
Oracle11g静默安装
系统 | IP | 安装软件 |
---|---|---|
centos7.8 | 192.168.100.101 | Oracle11g |
1.在/etc/hosts文件中添加主机名、关闭selinux、关闭防火墙
[root@centos ~]# vi /etc/hosts
192.168.100.101 centos
[root@centos ~]# vi /etc/selinux/config
SELINUX=disabled
[root@centos ~]# systemctl stop firewalld
[root@centos ~]# systemctl disable firewalld
2.上传安装包
安装包可自行提取
链接:https://pan.baidu.com/s/1chTrmweSGNRE7-Z-PJm_Bg
提取码:01ig
[root@centos soft]# ls
p13390677_112040_Linux-x86-64_1of7.zip p13390677_112040_Linux-x86-64_2of7.zip
3.解压Oracle安装包
[root@centos soft]# unzip p13390677_112040_Linux-x86-64_1of7.zip -d /tmp && unzip p13390677_112040_Linux-x86-64_2of7.zip -d /tmp
等待解压完成后,会在目录下生产一个database文件夹,里面有Oracle 11g安装文件
4.安装依赖包
[root@centos ~]# yum install gcc make binutils gcc-c++ compat-libstdc++-33 elfutils-libelf-devel elfutils-libelf-devel-static ksh libaio libaio-devel numactl-devel sysstat unixODBC unixODBC-devel pcre-devel –y
5.添加用户和用户组
[root@centos ~]# groupadd oinstall
[root@centos ~]# groupadd dba
[root@centos ~]# useradd -g oinstall -G dba oracle
[root@centos ~]# passwd oracle #这里密码设置为oracle
[root@centos ~]# id oracle
uid=1000(oracle) gid=1000(oinstall) 组=1000(oinstall),1001(dba)
6.修改内核参数配置文件
添加以下内容
[root@centos ~]# vi /etc/sysctl.conf
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
[root@centos ~]# sysctl -p
其中kernel.shmmax = 2147483648为本机物理内存的一半,单位为byte,我这里是4G内存
7.修改用户的限制文件
[root@centos ~]# vi /etc/security/limits.conf
添加以下内容
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
修改/etc/pam.d/login文件
[root@centos ~]# vi /etc/pam.d/login
添加以下内容
session required /lib64/security/pam_limits.so
session required pam_limits.so
修改/etc/profile文件
[root@centos ~]# vi /etc/profile
添加以下内容
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
[root@centos ~]# source /etc/profile
8.创建安装目录和设置文件权限
[root@centos ~]# mkdir -p /u01/app/oracle/product/11.2.0
[root@centos ~]# mkdir /u01/app/oracle/oradata
[root@centos ~]# mkdir /u01/app/oracle/inventory
[root@centos ~]# mkdir /u01/app/oracle/fast_recovery_area
[root@centos ~]# chown -R oracle:oinstall /u01/app/oracle
[root@centos ~]# chmod -R 775 /u01/app/oracle
[root@centos ~]# dd if=/dev/zero of=/home/swapfile bs=1M count=512
[root@centos ~]# mkswap /home/swapfile
[root@centos ~]# swapon /home/swapfile
[root@centos ~]# vi /etc/fstab #追加
/home/swapfile swap swap defaults 0 0
9.设置oracle用户环境变量
[root@centos ~]# su - oracle
[oracle@centos ~]$ vi .bash_profile
添加内容如下:
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.2.0
ORACLE_SID=jcms #其中实例名自建
PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH
[oracle@centos ~]$ source .bash_profile
10.编辑静默安装响应文件
[oracle@centos ~]$ cp -R /tmp/database/response/ .
[oracle@centos ~]$ cd response/
[oracle@centos response]$ vi db_install.rsp
29 oracle.install.option=INSTALL_DB_SWONLY
37 ORACLE_HOSTNAME=centos
42 UNIX_GROUP_NAME=oinstall
49 INVENTORY_LOCATION=/u01/app/oracle/inventory
86 SELECTED_LANGUAGES=en,zh_CN
91 ORACLE_HOME=/u01/app/oracle/product/11.2.0
96 ORACLE_BASE=/u01/app/oracle
107 oracle.install.db.InstallEdition=EE
154 oracle.install.db.DBA_GROUP=dba
160 oracle.install.db.OPER_GROUP=dba
400 DECLINE_SECURITY_UPDATES=true
11.根据响应文件静默安装Oracle 11g
[oracle@centos response]$ cd /tmp/database/
[oracle@centos database]$ ./runInstaller -silent -responseFile /home/oracle/response/db_install.rsp -ignorePrereq
执行开始会有一点时间没反应,稍等会就ok了,Oracle在后台静默安装。安装过程中,如果提示[WARNING]不必理会,此时安装程序仍在后台进行,如果出现[FATAL],则安装程序已经停止了。
可以在以下位置找到本次安装会话的日志:
/u01/app/oracle/inventory/logs/installActions…log
可以切换终端执行top命令查看后台进程一直是在安装的,/u01目录也在不断增大
按照要求新打开终端,以root身份登录,执行脚本:
[root@centos ~]# sh /u01/app/oracle/inventory/orainstRoot.sh
[root@centos ~]# sh /u01/app/oracle/product/11.2.0/root.sh
12.以静默方式配置监听
[oracle@centos database]$ netca /silent /responsefile /home/oracle/response/netca.rsp
正在对命令行参数进行语法分析:
参数"silent" = true
参数"responsefile" = /home/oracle/response/netca.rsp
完成对命令行参数进行语法分析。
Oracle Net Services 配置:
完成概要文件配置。
Oracle Net 监听程序启动:
正在运行监听程序控制:
/u01/app/oracle/product/11.2.0/bin/lsnrctl start LISTENER
监听程序控制完成。
监听程序已成功启动。
监听程序配置完成。
成功完成 Oracle Net Services 配置。退出代码是0
成功运行后,在/u01/app/oracle/product/11.2.0/network/admin/中生成listener.ora和sqlnet.ora
通过netstat命令可以查看1521端口正在监听。
[oracle@centos database]$ netstat -tnulp | grep 1521
tcp 0 0 0.0.0.0:1521 0.0.0.0:* LISTEN 4861/tnslsnr
13.以静默方式建立新库,同时也建立一个对应的实例。
[oracle@centos database]$ vi /home/oracle/response/dbca.rsp
78 GDBNAME = "jcms"
170 SID = "jcms"
211 SYSPASSWORD = "oracle"
221 SYSTEMPASSWORD = "oracle"
252 SYSMANPASSWORD = "oracle"
262 DBSNMPPASSWORD = "oracle"
360 DATAFILEDESTINATION = /u01/app/oracle/oradata
370 RECOVERYAREADESTINATION=/u01/app/oracle/fast_recovery_area
418 CHARACTERSET = "ZHS16GBK"
553 TOTALMEMORY = "3276"
其中TOTALMEMORY = "3276" 为3276MB,物理内存4G*80%
14.进行静默配置
[oracle@centos database]$ dbca -silent -responseFile /home/oracle/response/dbca.rsp
复制数据库文件
1% 已完成
3% 已完成
11% 已完成
18% 已完成
37% 已完成
正在创建并启动 Oracle 实例
40% 已完成
45% 已完成
50% 已完成
55% 已完成
56% 已完成
60% 已完成
62% 已完成
正在进行数据库创建
66% 已完成
70% 已完成
73% 已完成
85% 已完成
96% 已完成
100% 已完成
有关详细信息, 请参阅日志文件 "/u01/app/oracle/cfgtoollogs/dbca/jcms/jcms.log"。
查看监听状态
[oracle@centos database]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 03-APR-2022 12:44:44
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date 03-APR-2022 12:24:09
Uptime 0 days 0 hr. 20 min. 35 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/centos/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc) (KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=centos)(PORT=1521)))
Services Summary...
Service "jcms" has 1 instance(s).
Instance "jcms", status READY, has 1 handler(s) for this service...
Service "jcmsXDB" has 1 instance(s).
Instance "jcms", status READY, has 1 handler(s) for this service...
The command completed successfully
登录查看实例状态
[oracle@centos database]$ sqlplus / as sysdba
SQL> select status from v$instance;
STATUS
------------
OPEN
15.创建用户表空间,给予权限,用plsql工具连接
SQL> CREATE TABLESPACE test_data LOGGING DATAFILE '/u01/app/oracle/oradata/jcms/jcms01.dbf' SIZE 32M AUTOEXTEND ON NEXT 32M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL;
Tablespace created.
SQL> CREATE USER jcms IDENTIFIED BY 12345678 DEFAULT TABLESPACE TEST_DATA ;
User created.
SQL> GRANT dba TO jcms;
Grant succeeded.
命令验证:
16.Oracle开机自启动设置
1.修改/u01/app/oracle/product/11.2.0/bin/dbstart
[oracle@centos ~]$ vi /u01/app/oracle/product/11.2.0/bin/dbstart
将ORACLE_HOME_LISTNER=$1修改为ORACLE_HOME_LISTNER=$ORACLE_HOME
2.修改/u01/app/oracle/product/11.2.0/bin/dbshut
[oracle@centos ~]$ vi /u01/app/oracle/product/11.2.0/bin/dbshut
将ORACLE_HOME_LISTNER=$1修改为ORACLE_HOME_LISTNER=$ORACLE_HOME
3.修改/etc/oratab文件
将jcms:/u01/app/oracle/product/11.2.0:N中最后的N改为Y,成为jcms:/u01/app/oracle/product/11.2.0:Y
4.输入命令dbshut和dbstart测试
[oracle@centos ~]$ dbshut
Processing Database instance "jcms": log file /u01/app/oracle/product/11.2.0/shutdown.log
[oracle@centos ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 03-APR-2022 14:53:34
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 2: No such file or directory
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP) (HOST=centos)(PORT=1521)))
TNS-12541: TNS:no listener
TNS-12560: TNS:protocol adapter error
TNS-00511: No listener
Linux Error: 111: Connection refused
[oracle@centos ~]$ ps -ef |grep ora_ |grep -v grep
[oracle@centos ~]$
Oracle监听停止,进程消失
[oracle@centos ~]$ dbstart
Processing Database instance "jcms": log file /u01/app/oracle/product/11.2.0/startup.log
[oracle@centos ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 03-APR-2022 14:55:50
Copyright (c) 1991, 2013, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date 03-APR-2022 14:55:06
Uptime 0 days 0 hr. 0 min. 43 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.2.0/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/centos/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=centos)(PORT=1521)))
Services Summary...
Service "jcms" has 1 instance(s).
Instance "jcms", status READY, has 1 handler(s) for this service...
Service "jcmsXDB" has 1 instance(s).
Instance "jcms", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@centos ~]$ ps -ef |grep ora_ |grep -v grep
oracle 24136 1 0 14:55 ? 00:00:00 ora_pmon_jcms
oracle 24140 1 0 14:55 ? 00:00:00 ora_psp0_jcms
oracle 24144 1 1 14:55 ? 00:00:00 ora_vktm_jcms
oracle 24150 1 0 14:55 ? 00:00:00 ora_gen0_jcms
oracle 24154 1 0 14:55 ? 00:00:00 ora_diag_jcms
oracle 24158 1 0 14:55 ? 00:00:00 ora_dbrm_jcms
oracle 24162 1 0 14:55 ? 00:00:00 ora_dia0_jcms
oracle 24166 1 0 14:55 ? 00:00:00 ora_mman_jcms
oracle 24170 1 0 14:55 ? 00:00:00 ora_dbw0_jcms
oracle 24174 1 0 14:55 ? 00:00:00 ora_lgwr_jcms
oracle 24178 1 0 14:55 ? 00:00:00 ora_ckpt_jcms
oracle 24182 1 0 14:55 ? 00:00:00 ora_smon_jcms
oracle 24186 1 0 14:55 ? 00:00:00 ora_reco_jcms
oracle 24190 1 0 14:55 ? 00:00:00 ora_mmon_jcms
oracle 24194 1 0 14:55 ? 00:00:00 ora_mmnl_jcms
oracle 24198 1 0 14:55 ? 00:00:00 ora_d000_jcms
oracle 24202 1 0 14:55 ? 00:00:00 ora_s000_jcms
oracle 24224 1 0 14:55 ? 00:00:00 ora_qmnc_jcms
oracle 24332 1 0 14:55 ? 00:00:00 ora_q000_jcms
oracle 24336 1 0 14:55 ? 00:00:00 ora_q001_jcms
oracle 24340 1 0 14:55 ? 00:00:00 ora_cjq0_jcms
Oracle监听启动,进程启动
5.切换到root账户建立自启动脚本
[root@centos ~]# vi /etc/rc.d/init.d/oracle
#!/bin/bash
# oracle: Start/Stop Oracle Database 11g R2
# chkconfig: 345 90 10
# description: The Oracle Database is an Object-Relational Database Management System.
#
. /etc/rc.d/init.d/functions
LOCKFILE=/var/lock/subsys/oracle
ORACLE_HOME=/u01/app/oracle/product/11.2.0
ORACLE_USER=oracle
case "$1" in
'start')
if [ -f $LOCKFILE ]; then
echo $0 already running.
exit 1
fi
echo -n $"Starting Oracle Database:"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/lsnrctl start"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/emctl start dbconsole"
touch $LOCKFILE
;;
'stop')
if [ ! -f $LOCKFILE ]; then
echo $0 already stopping.
exit 1
fi
echo -n $"Stopping Oracle Database:"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/lsnrctl stop"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/dbshut"
su - $ORACLE_USER -c "$ORACLE_HOME/bin/emctl stop dbconsole"
rm -f $LOCKFILE
;;
'restart')
$0 stop
$0 start
;;
'status')
if [ -f $LOCKFILE ]; then
echo $0 started.
else
echo $0 stopped.
fi
;;
*)
echo "Usage: $0 [start|stop|status]"
exit 1
esac
exit 0
[root@centos ~]# chmod 755 /etc/rc.d/init.d/oracle
[root@centos ~]# chkconfig oracle on
[root@centos ~]# chkconfig --list oracle
oracle 0:关 1:关 2:开 3:开 4:开 5:开 6:关
service oracle start/stop/restart测试
[root@centos ~]# service oracle stop
Stopping oracle (via systemctl): [ 确定 ]
[root@centos ~]# service oracle status
/etc/init.d/oracle stopped.
reboot重启查看Oracle监听和实例进程均能自动启动
Nginx平滑升级
原理
1.nginx的主进程(master process)启动后完成配置加载和端口绑定等动作,fork出指定数量的工作进程(worker process),这些子进程会持有监听端口的文件描述符(fd),并通过在该描述符上添加监听事件来接收连接(accept);
2.nginx主进程在启动完成后会进入等待状态,负责响应各类系统消息,入SIGCHLD、SIGHUP、SIGUSR2等;
3.主进程支持的信号:
TERM,INT:立刻退出;
QUIT:等待工作进程结束后再退出;
KILL:强制终止进程;
HUP:重新加载配置文件,使用新的配置启动工作进程,并逐步支持的信号;
USR1:重新打开日志文件;
USR2:启动新的主进程,实现热升级
WINCH:逐步关闭进程及工作进程支持的信号;
注:USR2信号用于在旧版本进程的基础上,重新生成新版本的进程,但是旧版本进程仅限是nginx命令的绝对路径启动
过程
1.查看旧版nginx的编译参数
2.编译新版本nginx源码包,安装路径需与旧版本一直,注意:不要执行 make install;
3.备份旧版本nginx二进制文件,用新版本的替换;
4.确保配置文件无报错;
5.发送USR2信号:向主进程(master)发送USR2信号,nginx会启动一个新版本的master进程和对应工作进程,和旧版本一起处理请求;
6.发送WINCH信号:向旧的nginx主进程(master)发送WINCH信号,他会逐步关闭自己的工作进程(主进程不退出),这时所有请求都会由新版本nginx处理;
7.发送QUIT信号:升级完毕,可向旧的nginx主进程(master)发送(QUIT、TERM或者KILL)信号,使旧的主进程退出;
8.验证nginx版本号,并访问测试;
配置
查看旧版nginx的编译参数
[root@localhost ~]# /data/nginx/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/data/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre
安装新版本nginx
[root@localhost ~]# tar xf nginx-1.12.2.tar.gz -C /data/
[root@localhost ~]# cd /data/nginx-1.12.2/
[root@localhost nginx-1.12.2]# ./configure --prefix=/data/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre && make
注:##不能加make install,如若添加,则覆盖了
备份旧版本nginx二进制文件
[root@localhost nginx-1.12.2]# mv /data/nginx/sbin/nginx /data/nginx/sbin/nginx.old
[root@localhost nginx-1.12.2]# cp objs/nginx /data/nginx/sbin/nginx
[root@localhost nginx-1.12.2]# /data/nginx/sbin/nginx -t
nginx: the configuration file /data/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /data/nginx/conf/nginx.conf test is successful
使用信号实现热升级
[root@localhost ~]# ps aux |grep nginx |grep -v grep
root 3496(旧版本主进程) 0.0 0.2 45000 1128 ? Ss 01:13 0:00 nginx: master process nginx
nginx 3497(旧版本从进程) 0.0 0.4 45432 2004 ? S 01:13 0:00 nginx: worker process
[root@localhost ~]# kill -USR2 3496
##发送 USR2 信号:向旧版本主进程( master)发送 USR2 信号, nginx 会启动一个新版本的 master 进程和对应工作进程,和旧版一起处理请求。
[root@localhost ~]# ps aux |grep nginx |grep -v grep
root 3496(旧版本主进程) 0.0 0.2 45000 1296 ? Ss 02:39 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 3497(旧版本从进程) 0.0 0.3 45432 1724 ? S 02:39 0:00 nginx: worker process
root 6041(新版本主进程) 0.0 0.6 45184 3144 ? S 02:41 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 6042(新版本从进程) 0.0 0.3 45636 1756 ? S 02:41 0:00 nginx: worker process
[root@localhost ~]# kill -WINCH 3496 ##向旧版本主进程发送WINCH信号,用来关闭旧版本的worker进程
[root@localhost ~]# ps aux |grep nginx |grep -v grep
root 3496(旧版本主进程) 0.0 0.2 45000 1300 ? Ss 02:39 0:00 nginx: master process /usr/local/nginx/sbin/nginx
root 6041(新版本主进程) 0.0 0.6 45184 3144 ? S 02:41 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 6042(新版本从进程) 0.0 0.3 45636 1756 ? S 02:41 0:00 nginx: worker process
[root@localhost ~]# kill -QUIT 3496 ##关闭旧版本的master进程
[root@localhost ~]# ps aux |grep nginx |grep -v grep
root 6041(新版本主进程) 0.0 0.6 45184 3144 ? S 02:41 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 6042(新版本从进程) 0.0 0.3 45636 1756 ? S 02:41 0:00 nginx: worker process
[root@localhost ~]# /data/nginx/sbin/nginx -V
nginx version: nginx/1.12.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/data/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre
验证
斗图网站
import requests, os, re
from fake_useragent import FakeUserAgent
class BQBSpider(object):
os_path = os.getcwd()+'/爱斗图/'
if not os.path.exists(os_path):
os.mkdir(os_path)
def __init__(self):
'''1.准备数据'''
user_agent = FakeUserAgent().random
self.start_url = 'https://adoutu.com/picture/list/{}'
self.headers = {
'User-Agent': 'user_agent'
}
def parse_start_url(self):
''' 2.发送请求,获取响应 '''
# 循环遍历模拟翻页
for page in range(1, 2777):
# 地址的完整性拼接
start_url = self.start_url.format(page)
# 发送请求
response = requests.get(start_url, headers=self.headers)
'''调用其他方法,前面加self,传递数据'''
self.parse_response_data(response,page)
def parse_response_data(self, response, page):
'''3.解析数据,数据提取'''
# 解析响应
resp_data = response.content.decode()
# 数据提取
img_url_list = re.findall(r'src="(.*?)"', resp_data)
'''三木运算符结合列表推导式的判断'''
img_url_list = [img_url for img_url in img_url_list if 'http' in img_url]
for img_url in img_url_list:
# 去除表情包的名称和格式
img_name = img_url[30:]
# 发送请求,获取二进制数据
data = requests.get(img_url).content
self.save_data(data,img_name)
def save_data(self,data,img_name):
'''4.保存数据'''
with open(self.os_path + img_name,'wb')as f:
f.write(data)
print(f'{img_name}===========保存完成')
if __name__ == '__main__':
f = BQBSpider()
f.parse_start_url()
异常
异常
python遇到错误后,会引发异常。如果异常对象并未被处理或捕捉,则程序就会用所谓的晦朔(Traceback,一种错误信息)来终止执行。
处理异常
1.异常是指在程序执行过程中发生的一个时间,会影响程序的正常运行,所以一般需要进行捕获异常处理。
2.异常的捕获使用try/except/finally语句进行捕获操作,并告诉python发生异常时怎么。
语法:
try:
<语句>
except <异常类型1>[, 异常参数名1]:
<异常处理代码1>
except <异常类型2>[, 异常参数名2]:
<异常处理代码2>
else:
<没有异常时候的处理代码>
finally:
<不管是否有异常,最终执行的代码块>
例如:
try:
print(aaa) #如果这句话有错,就会捕获到异常
except NameError: #NameError异常
print('变量未定义') #对NameError异常的处理
结果为:
变量为定义
捕获异常的具体信息
例如:
try:
print(aaa) #如果这句话有错,就会捕获到异常
except NameError as e:
print(e) #打印具体的异常信息
print('变量未定义')
结果为:
name 'aaa' is not defined
变量未定义
包含多个异常
例如:
try:
# print(aaa)
files = open('aaa.txt','r',encoding='utf-8') #如果这句话有错,就会捕获到异常
except (NameError,FileNotFoundError) as e:
print(e) #打印具体的异常信息
万能方法Exception
例如:
try:
files = open('aaa.txt','r',encoding='utf-8') #如果这句话有错,就会捕获到异常
except Exception as e:
print(e)
else
:没有异常时要执行的语句
例如:
try:
files = open('aaa.txt','r',encoding='utf-8') #如果这句话有错,就会捕获到异常
except Exception as e: #有异常时执行
print(e)
else: #没有异常时执行
print('没什么问题')
结果为:
没什么问题
finally
:不管有没有异常都会执行的代码块
例如:
try:
print("打开文件!")
files = open('aaa.txt','w',encoding='utf-8')
try:
files.write('测试下行不行')
except:
print('写入失败!')
else:
print('写入成功!')
finally:
print('关闭文件!')
files.close()
except Exception as e:
print(e)
结果为:
打开文件!
写入成功!
关闭文件!
例如:
加法运算:提示用户提供数值输入时,常出现的一个问题是,用户提供的是文本而不是数字。
在这种情况下,当你尝试将输入转换为整数时,将引发TypeError 异常。编写一个程序,
提示用户输入两个数字,再将它们相加并打印结果。在用户输入的任何一个值不是数字时都捕获TypeError 异常,
并打印一条友好的错误消息。对你编写的程序进行测试:先输入两个数字,再输入一些文本而不是数字。
try:
num1 = int(input('请输入第一个数字:'))
num2 = int(input('请输入第二个数字:'))
except ValueError:
print('请输入一个整数')
else:
print(num1 + num2)
常出现异常类型