RAID 的概念以及 RAID 卡的配置

RAID RAID 的概念以及 RAID 卡的配置 RAID 基础概念 基本原理 RAID ( Redundant Array of Independent Disks )即独立磁盘冗余阵列,通常简称为磁盘阵列。简单地说, RAID 是由多个独立的高性能磁盘驱动器组成的磁盘子系统,从而提供比单个磁盘更高的存储性能和数据冗余的技术。 RAID 是一类多磁盘管理技术,其向主机环境提供了成本适中、数据可靠性高的高性能存储。 SNIA 对 RAID 的定义是 :一种磁盘阵列,部分物理存储空间用来记录保存在剩余空间上的用户数据的冗余信息。当其中某一个磁盘或访问路径发生故障时,冗余信息可用来重建用户数据。磁盘条带化虽然与 RAID 定义不符,通常还是称为 RAID (即 RAID0 )。 这里要提一下 JBOD ( Just a Bunch of Disks )。最初 JBOD 用来表示一个没有控制软件提供协调控制的磁盘集合,这是 RAID 区别与 JBOD 的主要因素。目前 JBOD 常指磁盘柜,而不论其是否提供 RAID 功能。 软/硬 RAID 软件 RAID:操作系统下实现 RAID,软 RAID 不能保护系统盘。亦即系统分区不能参与实现 RAID。有些操作系统,RAID 的配置信息存在系统信息中,而不是存在硬盘上;当系统崩溃,需重新安装时,RAID 的信息也会丢失。 硬件 RAID:是采用集成的阵列卡或专用的阵列卡来控制硬盘驱动器,这样可以极大节省服务器系统 CPU 和操作系统的资源。从而使服务器的性能获得很大的提高。 RAID 的分类 RAID等级 RAID0 RAID1 RAID5 RAID6 RAID10 别名 条带 镜像 分布奇偶校验条带 双重奇偶校验条带 镜像加条带 容错性 无 有 有 有 有 冗余类型 无 有 有 有 有 热备盘 无 有 有 有 有 读性能 高 低 高 高 高 随机写性能 高 低 一般 低 一般 连续写性能 高 低 低 低 一般 需要磁盘数 n≥1 2n (n≥1) n≥3 n≥4 2n(n≥2)≥4 可用容量 全部 50% (n-1)/n (n-2)/n 50% RAID 的优势 大容量 这是 RAID 的一个显然优势,它扩大了磁盘的容量,由多个磁盘组成的 RAID 系统具有海量的存储空间。现在单个磁盘的容量就可以到 1TB 以上,这样 RAID 的存储容量就可以达到 PB 级,大多数的存储需求都可以满足。一般来说, RAID 可用容量要小于所有成员磁盘的总容量。不同等级的 RAID 算法需要一定的冗余开销,具体容量开销与采用算法相关。如果已知 RAID 算法和容量,可以计算出 RAID 的可用容量。通常, RAID 容量利用率在 50% ~ 90% 之间。 ...

redhat 系使用 scl 工具临时使用高级开发工具

Linux [[RedHat]] redhat 系使用 scl 工具临时使用高级开发工具 最近在做一次编译任务中,出现了 cc 指令错误,显示未找到 a.c 文件,猜测可能因为 gcc 版本问题。检测到可以在 Ubuntu 18.04 正常编译使用的 gcc 版本是 7.5,而基于 Centos7 的 Aliyun Linux 2.1903 却还是 4.8 版本。先升级 gcc 版本再测试编译问题。 在 redhat 系中升级 gcc 有两种方案,一种是下载源码进行编译,另外一种是借助 scl 工具。前者不推荐,一是因为编译速度慢,二是因为编译可能出现各种问题需要手动处理。后者 SCL 软件集(Software Collections)是为了给 RHEL/CentOS 用户提供一种以方便、安全地安装和使用应用程序和运行时环境的多个(而且可能是更新的)版本的方式,同时避免把系统搞乱。 普通 RHEL/Centos 使用 scl # 安装 scl 源: $ yum install centos-release-SCL scl-utils-build # 查看从 scl 中安装的包的列表: $ scl –list # 列出 scl 源有哪些包可以用: $ yum list all --enablerepo='centos-sclo-rh' # 安装高版本的 gcc、gcc-c++ yum install devtoolset-7-gcc devtoolset-7-gcc-c++ # devtoolset-3: gcc 4.9 # devtoolset-4: gcc 5 # devtoolset-6: gcc 6 # devtoolset-7: gcc 7 # devtoolset-8: gcc 8 # 测试下是否成功 $ scl enable devtoolset-7 'gcc --version' gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Aliyun Linux 2.1903 使用 scl # 先安装scl-utils $ yum install -y scl-utils # 打开YUM仓库支持 $ yum install -y alinux-release-experimentals # 从YUM源安装您需要的软件包,以下示例命令同时安装了SCL插件方式支持的所有开发工具包 $ yum install -y devtoolset-7-gcc devtoolset-7-gdb devtoolset-7-binutils devtoolset-7-make # 运行相关的SCL软件 $ scl enable devtoolset-7 'gcc --version' gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 使用高版本的开发工具 使用绝对路径 添加可执行文件路径到 PATH 环境变量 使用官方推荐的加载命令:scl enable devtoolset-x bash, x为要启用的版本 执行安装软件自带的脚本: source /opt/rh/devtoolset-x/enable,x为要启用的版本 推荐后两种方案。 ...

redis 安装使用

database Redis redis 安装使用 # 安装并编译 wget https://download.redis.io/releases/redis-6.0.9.tar.gz -O /tmp/redis-6.0.9.tar.gz cd /tmp tar xzf redis-6.0.9.tar.gz cd redis-6.0.9 make # 创建环境 BASE_PATH=/opt/redis-single-point mkdir -p $BASE_PATH mkdir -p $BASE_PATH/bin mkdir -p $BASE_PATH/conf mkdir -p $BASE_PATH/data mkdir -p $BASE_PATH/log/ cp /tmp/redis-6.0.9/src/redis-server /tmp/redis-6.0.9/src/redis-cli /tmp/redis-6.0.9/src/redis-benchmark $BASE_PATH/bin # 配置 redis.conf vi $BASE_PATH/conf/redis.conf bind 127.0.0.1 protected-mode no port 4399 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile "/opt/redis-single-point/log/redis.log" databases 16 always-show-logo yes save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb rdb-del-sync-files no dir /opt/redis-single-point/data/ replica-serve-stale-data yes replica-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-diskless-load disabled repl-disable-tcp-nodelay no replica-priority 100 acllog-max-len 128 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no lazyfree-lazy-user-del no oom-score-adj no oom-score-adj-values 0 200 800 appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes lua-time-limit 5000 cluster-enabled no cluster-node-timeout 15000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 stream-node-max-bytes 4096 stream-node-max-entries 100 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes jemalloc-bg-thread yes # 配置 redis 服务 vi /lib/systemd/system/redis.service [Unit] Description=redis service port 6379 [Service] User=Development Group=Development Type=forking ExecStart=/opt/redis-single-point/bin/redis-server /opt/lotus/redis-single-point/conf/redis.conf Restart=on-success [Install] WantedBy=multi-user.target # 启动服务并检测 systemctl daemon-reload systemctl start redis ps -ef|grep redis echo 'export PATH=$PATH:/opt/redis-single-point/bin' >> /etc/profile source /etc/profile redis-cli -h 127.0.0.1 -p 6379 redis>

redis 集群搭建

database Redis redis 集群搭建 高可用方案 一般常用的有两种高可用方案: redis 哨兵 redis 集群 在 redis 早期版本中,只能使用哨兵模式,但这种模式下,需要多一个守护对资源进行监控,并且在 master 断掉的时候切换过程比较慢。 在 5.0 之后,一般推荐使用 redis 集群方案实现高可用。 操作环境 使用了三台机器,以三主三从的方案进行部署,在一台机器上部署一主一从,其中 8001 是主节点,8002 是从节点。 redis01: 192.168.0.2 redis02: 192.168.0.3 redis03: 192.168.0.4 虽然这三台机器都是 Ubuntu Server 18.04,但是内核版本都不相同,所以都是单独执行的编译过程。 决定不使用系统空间,而使用 /opt/ 的上 TB 空间。 所有 redis 相关的数据都在 /opt/redis/ 下面: bin/ 二进制程序 conf/ 配置文件 data/ 运行产生文件 log/ 日志文件 redis-6.0.7/ 源代码 部署过程 主要是配置文件的处理: 主节点配置以下参数: daemonize yes port 8001 dir /opt/redis/data/master cluster-enabled yes cluster-config-file /opt/redis/conf/nodes-8001.conf cluster-node-timeout 15000 #bind 127.0.0.1 protected-mode no appendonly yes requirepass abcdefg masterauth abcdefg logfile /opt/redis/log/redis-master-8081.log 从节点配置以下参数: ...

Schema库的简单学习

Python Python Module Schema 库的简单学习 Schema 是一个简单易用的 python 数据校检三方库,Schema on Github. 在 web app 中,经常需要接收用户传过来的数据,然后做处理。但是用户由于各种原因,输入的数据并不如人意。前端发送 json 形式数据到后端 api,以往的解决方案甚是暴力,对 json 的 key 的值进行各种 if 检验,甚至要去做正则匹配。使用 schema 库能够非常优雅的解决这个问题。 Schema 和 marshmallow 的取舍。之前学习过 marshmallow,它有一个方法Schema.validate,同样可以完成数据校检,但是需要先生成一个独特的 Schema 类,用起来更适合序列化/反序列化的场景。而 Schema 库只做一件事,那就是数据校检。 核心类 Schema 数据检验最重要的类 Regex 正则匹配检验用到的类 Use And Or 一个类、一个方法 这是 schema 库里最重要的概念。 一个类是 Schema 类,可以理解为 schema 库的入口,什么都可以往里面传。 一个方法是 validate 方法,它接入一个数据或者一个 obj。 执行校检就是处理 validate 接收的数据和 Schema 类接收的 schema 之间的关系。 Schema 类传入基础类型 str,int,float,object >>> from schema import Schema >>> Schema(str).validate('abc') 'abc' >>> Schema(int).validate(123) 123 >>> Schema(float).validate(1.23) 1.23 >>> Schema(object).validate('abcd') 'abcd' >>> Schema(str).validate(123) schema.SchemaUnexpectedTypeError: 123 should be instance of 'str' 基础类型没什么好说的,只能检验最简单的数据。注意 object 是基类,也就是 validate 里的数据符合语法就会原样输出,但我们可以基于此做些类的判断 ...

scrapy框架初使用及爬取LOL信息

Python [[Web Crawler]] scrapy 框架初使用及爬取 LOL 信息 零、真前言 这篇文章是由 2018 年 4 月 16 日首次发布于 csdn,后来由于 “逃离csdn” 的想法中,将之前发布的文章重新排版,发表在个站中。 一、前言 了解到爬虫技术大概有 18 个月了,这期间自己写过几个爬虫,也 fork 过几个流行的爬虫 repo,包括 bilibili-user、iquery、WechatSogou 等,但一直没系统的写过爬虫,上一次心血来潮(17 年 10 月),想要爬下关于英雄联盟的数据,主要想获得皮肤原画数据。 当时决定的目标网站是英雄联盟中文官网,数据准确且更新快。LOL 数据库,但苦于该网页全篇使用 js 载入数据,无法直接读取,就退而求其次,改变目标网址多玩-英雄联盟-英雄数据库。 技术使用混杂,主要利用 requests+bs4 完成爬取,部分内容使用 scrapy 抓取,逻辑结构混乱,代码可见 spider-on-lol/v1.0/,功能基本实现,但不够美。七天之前,看到了这些代码,决定用 scrapy 重新实现功能,完成整个逻辑设计,这中间遇到了很多问题,从中得到了学习,完整代码可见 spider-on-lol。 二、爬虫设计全思路 目标网站:LOL 数据库 爬取内容: 英雄姓名 英雄头像 物品名称、id 物品图片 英雄皮肤原画 英雄背景故事 技术:scrapy,splash,docker 难点 图片获取 js 页面数据的获取 中文编码 三、环境搭建 工欲善其事,必先利其器。 1、 开发语言:python v3.6.5 2、开发语言环境:anaconda v1.6.9 (非必须,但隔离环境是一个好习惯) 3、docker 安装 deepin 下安装 docker 其他系统安装 docker 4、splash 安装方法 5、一些第三方库: scrapy:conda install Scrapy scrapy_splash: conda install scrapy_splash 四、什么是 Scrapy?什么是 Splash? 1、Scrapy Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 ...

scrapy框架初使用及爬取LOL信息

Python Web Crawler Scrapy with bilibili 一、前言 在一个月前,我写了一篇scrapy 框架初使用及爬取 LOL 信息记录了爬取 lol.qq.com 获取英雄联盟数据及英雄皮肤原画的过程。第一次使用 scrapy 后,了解了大致的爬取流程,但在细节上(例如防 ban 策略,奇怪数据处理)没太在意,处于编码第一阶段(能跑就行)。 中间学了半个月的 Qt5 和 pygame,(没学出个什么样子,了解了大致概念,翻指南能上手了),之后,看到 github 中早期 fork 了一个库,airingursb 写的bilibili-user,深有所悟,在此先感谢他的源码及他的开源精神。 但最近一段时间,BiliBili 的网站结构有了些许的变化,我就尝试着用 scrapy 重写这个功能,以只修改 item 的方式保证这个爬虫的生命(理论上,更换 item 对应的 xpath 位置就可以应对页面元素更改)。并在此基础上增加一些防 ban 策略,深化对爬虫的编写能力,以及应对可能过大的数据处理任务(单纯的构造 url,截止 5 月 3 日,b 站已经有了 323000449 账号详情界面,之前的 lol 爬虫上千条数据就把路由器撑爆了,这次可能要应付 3 亿条数据)。完整代码可见bilibili-user-scrapy 二、爬虫设计全思路 1、目标网站 账户详情页 2、爬取内容: uid 用户id,int mid 用户id,str name 用户姓名,str sex 用户性别,str regtime 用户注册时间,str birthday 用户生日,str place 用户住址,str fans 用户粉丝数,int attention 用户关注数,int level 用户等级,int 3、技术:scrapy,splash,docker,mysql 4、难点 数据库设计及数据插入 js 页面数据的获取 特殊数据的处理 防 ban 策略 三、环境搭建 1、开发语言:python v3.6.5 2、开发语言环境:anaconda v1.6.9 (非必须,但这是一个好习惯) 3、docker 安装 deepin 下安装 docker 其他系统安装 docker ...

sed 匹配内容的前一行和后一行添加内容

Linux sed 匹配内容的前一行和后一行添加内容 在某行的前一行或后一行添加内容 具休操作如下: # 匹配行前加 sed -i '/allow 361way.com/iallow www.361way.com' the.conf.file # 匹配行前后 sed -i '/allow 361way.com/aallow www.361way.com' the.conf.file 而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛。代码就变成了: sed -i '/2222222222/a\3333333333' test.txt sed -i '/2222222222/i\3333333333' test.txt a 是 append,行后加;i 是 insert,行前加。 配合find查找的内容处理,如下: find . -name server.xml|xargs sed -i '/directory/i <!--' find . -name server.xml|xargs sed -i '/pattern="%h/a -->' 在某行(指具体行号)前或后加一行内容 sed -i 'N;4addpdf' a.txt sed -i 'N;4ieepdf' a.txt 这里指定的行号是第四行 。 删除指定行的上一行或下一行 # 删除指定文件的上一行 sed -i -e :a -e '$!N;s/.*n(.*directory)/1/;ta' -e 'P;D' server.xml # 删除指定文件的下一行 sed -i '/pattern="%/{n;d}' server.xml 转载说明 sed 匹配内容的前一行和后一行 添加内容

ssh 服务的原理

Linux SSH ssh 服务的原理 读者大可以直接就自己的问题去 Google 解决方案,但是不理解这个过程,那么每次遇到都要去 search,自己只是‘工具人’,遇到了问题也不知道如何是好。这时候需要看下原理,有原理做基础,才能理解做配置的每一步的意义。 两种安全验证 SSH(即 Secure Shell),是一项创建在应用层和传输层基础上的安全协议,为计算机 Shell 提供安全的传输和使用环境。 所以为了安全,SSH 提供了两种级别的安全认证,基于密码的安全认证和基于密钥的安全认证。 基于密码的安全认证 基于密码的安全认证,登录的时候需要提供账号和密码;远程主机将自己的公钥分发给登录客户端,客户端访问主机使用该公钥加密;远程主机使用自己的私钥解密数据。 登录的流程如下: 远程主机收到用户登录请求,将自己的公钥发给用户 用户通过远程主机公钥的指纹确认主机的真实性,然后使用远程主机公钥将登录密码加密后,发送回远程主机 远程主机使用自己的私钥解码登录密码,验证密码正确后,允许用户登录 这种就是最常用的直接登录,需要输入密码,而传入过程中,明文密码会被加密,所以很安全。 基于密钥文件的安全认证 基于密钥的安全认证,客户端将将公钥上传到服务器。登录的时候,客户端向服务器发送登录请求;服务器收到请求后,向用户发送一段随机字符串;用户用自己的私钥加密后,再发送回服务器;服务器使用事先存储的公钥进行解密,如果解密成功,证明用户可信,允许登录。 这种方式,在登录服务器的过程中,不需要上传密码,增加了安全性。 known_hosts 文件 当第一次登陆远程主机时,不管是用密码还是密钥,都会有个提示: $ ssh user@host The authenticity of host 'host (***.***.***.***)' can't be established. RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d. Are you sure you want to continue connecting (yes/no)? 这段话提示用户无法确认远程主机的真实性,只知道 RSA 公钥的指纹,询问用户是否继续。 我们使用 ssh-keygen 工具可以生成 SSH 密钥对,其中公钥的长度可以很长,对用户来说不方便直接对比验证,因此对其进行了 MD5 计算,生成了一个128的指纹,这样再进行比较就比较容易了。 那么这里就要求我们事先知道远程主机的公钥指纹,才可以确认主机的真实性。 用户确认主机的真实性,输入 yes 继续连接: Warning: Permanently added 'host,***.***.***.***' (RSA) to the list of known hosts. 然后输入密码: ...

ssh 服务的配置

Linux SSH ssh 服务的配置 有了 ssh 服务的介绍以及原理之后,我们就可以做到 可以用很短的指令就登陆,并且不用输密码,最重要的就是要学会修改 ssh_config 文件。我们先介绍配置文件的一些可配置项,再针对免密登陆做操作。 配置文件 ssh程序可以从以下途径获取配置参数: 命令行选项 用户配置文件 (~/.ssh/config) 系统配置文件 (/etc/ssh/ssh_config) 配置文件可分为多个配置区段,每个配置区段使用 Host 来区分。我们可以在命令行中输入不同的host 来加载不同的配置段。 对每一个配置项来说,首次获取的参数值将被采用,因此通用的设置应该放到文件的后面,特定host相关的配置项应放到文件的前面。 常用配置项 下面介绍一些常用的SSH配置项: Host Host 配置项标识了一个配置区段。 ssh 配置项参数值可以使用通配符:* 代表0~n个非空白字符,? 代表一个非空白字符,! 表示例外通配。 我们可以在系统配置文件中看到一个匹配所有 host 的默认配置区段: $ cat /etc/ssh/ssh_config | grep '^Host' Host * 这里有一些默认配置项,我们可以在用户配置文件中覆盖这些默认配置。 GlobalKnownHostsFile 指定一个或多个全局认证主机缓存文件,用来缓存通过认证的远程主机的密钥,多个文件用空格分隔。默认缓存文件为:/etc/ssh/ssh_known_hosts, /etc/ssh/ssh_known_hosts2. HostName 指定远程主机名,可以直接使用数字IP地址。如果主机名中包含 %h ,则实际使用时会被命令行中的主机名替换。 IdentityFile 指定密钥认证使用的私钥文件路径。默认为 ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 或 ~/.ssh/id_rsa 中的一个。文件名称可以使用以下转义符: '%d' 本地用户目录 '%u' 本地用户名称 '%l' 本地主机名 '%h' 远程主机名 '%r' 远程用户名 可以指定多个密钥文件,在连接的过程中会依次尝试这些密钥文件。 Port 指定远程主机端口号,默认为 22 。 ...