创新路
我们一直在努力

Linux—单一工作排程(at)

王宇恒阅读(13)评论(0)

首先确保atd功能开启,并且开机自启

image.png

使用 at 这个命令来产生所要运行的工作,并将这个工作以文字档的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与运行了。我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制。

加上这两个文件后, at 的工作情况其实是这样的:

  1. 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);

  2. 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 咯;

  3. 如果两个文件都不存在,那么只有 root 可以使用 at 这个命令。

at命令运行参数如下

image.png

假设需要系统在2019年9月25日23:00关机,操作如下

image.png

假如设定了一个工作之后,想要删除可以用atq命令找到任务编号,用atrm+编号删除。

设定任务时如果用batch替代at的话。系统就会在空闲时再执行命令。 

Confd+Etcd+Nginx实现配置自动管理

jwenshan阅读(32)评论(0)

Confd+Etcd+Nginx实现配置自动管理

Confd是一个轻量级的配置管理工具。通过查询Etcd,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。其后端支持的数据类型有:etcdconsulvaultenvironment variablesrediszookeeperdynamodbstackenginerancher。不过一般使用Confdetcd的配合使用比较多。

绘图4.jpg

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

Hadoop高可用

李鑫宇阅读(30)评论(0)

    NameNode 是 HDFS 的核心配置,HDFS 又是Hadoop 的核心组件,NameNode 在 Hadoop 集群中至关重要,NameNode机器宕机,将导致集群不可用,如果NameNode 数据丢失将导致整个集群的数据丢失,而 NameNode 的数据的更新又比较频繁,实现 NameNode 高可用势在必行

    官方提供了两种解决方案

    A. HDFS with NFS  //nfs存储数据还是一个单点

    B. HDFS with QJM   //做两个namenode,一主一备,备只接受数据,不发送

        注:QJM全称是Quorum Journal Manager, 由JournalNode(JN)组成,一般是奇数点结点组成。每个JournalNode对外有一个简易的RPC接口,以供NameNode读写EditLog到JN本地磁盘。当写EditLog时,NameNode会同时向所有JournalNode并行写文件,只要有N/2+1结点写成功则认为此次写操作成功,遵循Paxos协议,还有一点非常重要,任何时刻,只能有一个ActiveNameNode,否则将会导致集群操作的混乱,那么两个NameNode将会分别有两种不同的数据状态,可能会导致数据丢失,或者状态异常,这种情冴通常称为“split-brain”(脑裂,三节点通讯阻断,即集群中不同的Datanode 看到了不同的Active NameNodes)。对于JNS而言,任何时候只允讲一个NameNode作为writer;在failover期间,原来的Standby Node将会接管Active的所有职能,并负责向JNS写入日志记录,这中机制阻止了其他NameNode基于处于Active状态的问题。

  (如果看到两个active,直接干掉一个,数据会保留一半)

架构图:

image.png

hadoop 高可用

      ALL: 配置 /etc/hosts

          注:ALL代表所有机器

          192.168.1.10 nn01

          192.168.1.20 nn02

          192.168.1.11 node1

          192.168.1.12 node2

          192.168.1.13 node3

    ALL: 除了 zookeeper 其他 hadoop ,kafka 服务全部停止

    ALL: 初始化 hdfs 集群,删除 /var/hadoop/*

    nn02: 关闭 ssh key 验证,部署公钥私钥

        StrictHostKeyChecking no

        scp nn01:/root/.ssh/id_rsa /root/.ssh/

        scp nn01:/root/.ssh/authorized_keys /root/.ssh/

        同步/var/hadoop到所有的主机

    nn01上配置core-site.xml

          <configuration>

                <property>

                        <name>fs.defaultFS</name>

                        <value>hdfs://nsdcluster</value>

                </property>

                <property>

                        <name>hadoop.tmp.dir</name>

                        <value>/var/ha</value>

                </property>

                <property>

                        <name>ha.zookeeper.quorum</name>

                        <value>node1:2181,node2:2181,node3:2181</value>

                </property>

                <property>

                        <name>hadoop.proxyuser.lxy.groups</name>

                        <value>*</value>

                </property>

                <property>

                        <name>hadoop.proxyuser.lxy.hosts</name>

                        <value>*</value>

                </property>

          </configuration>

 

    nn01上配置hdfs-site.xml  //secondarynamenode 在高可用里面没有用途,这里把他关闭

          <configuration>

            <property>

              <name>dfs.replication</name>

              <value>2</value>

            </property>

            <property>

              <name>dfs.nameservices</name>

                     //指定两台namenode集群名nsdcluster

              <value>nsdcluster</value>

            </property>

            <property>

              <name>dfs.ha.namenodes.nsdcluster</name>

                 //定义集群的两个namenode的名称为nn1,nn2,声明的名字,不能乱改!,不是两台namenode的主机名!

              <value>nn1,nn2</value>

            </property>

 

            <property>

              <name>dfs.namenode.rpc-address.nsdcluster.nn1</name>

                  //配置nn1和nn2的rpc通信端口,(nn1和2是上面声明的名字)

              <value>nn1:8020</value>

            </property>

            <property>

              <name>dfs.namenode.rpc-address.nsdcluster.nn2</name>

              <value>nn2:8020</value>

            </property>

 

            <property>

              <name>dfs.namenode.http-address.nsdcluster.nn1</name>

                 //配置nn1和2的http通信端口

              <value>nn1:50070</value>

            </property>

            <property>

              <name>dfs.namenode.http-address.nsdcluster.nn2</name>

              <value>nn2:50070</value>

            </property>

 

            <property>

              <name>dfs.namenode.shared.edits.dir</name>

              <value>qjournal://node1:8485;node2:8485;node3:8485/nsdcluster</value>

            </property>

 

          <property>

            <name>dfs.journalnode.edits.dir</name>

            <value>/var/ha/journal</value>

          </property>

 

          <property>

            <name>dfs.client.failover.proxy.provider.nsdcluster</name>

            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

          </property>

 

          <property>

            <name>dfs.ha.fencing.methods</name>

            <value>sshfence</value>

          </property>

 

          <property>

            <name>dfs.ha.fencing.ssh.private-key-files</name>

            <value>/root/.ssh/id_rsa</value>

          </property>

 

          <property>

            <name>dfs.ha.automatic-failover.enabled</name>

            <value>true</value>

          </property>

        </configuration>

 

    nn01上配置yarn-site.xml

            <configuration>

        <!– Site specific YARN configuration properties –>

            <property>

                <name>yarn.nodemanager.aux-services</name>

                <value>mapreduce_shuffle</value>

            </property>

            <property>

                <name>yarn.resourcemanager.ha.enabled</name>

                <value>true</value>

            </property>

            <property>

                <name>yarn.resourcemanager.ha.rm-ids</name>

                <value>rm1,rm2</value>

            </property>

            <property>

                <name>yarn.resourcemanager.recovery.enabled</name>

                <value>true</value>

            </property>

            <property>

                <name>yarn.resourcemanager.store.class</name

                <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>

            </property>

            <property>

                <name>yarn.resourcemanager.zk-address</name>

                <value>node1:2181,node2:2181,node3:2181</value>

            </property>

            <property>

                <name>yarn.resourcemanager.cluster-id</name>

                <value>yarn-ha</value>

            </property>

            <property>

                <name>yarn.resourcemanager.hostname.rm1</name>

                <value>nn1</value>

            </property>

            <property>

                <name>yarn.resourcemanager.hostname.rm2</name>

                <value>nn2</value>

            </property>

        </configuration>

 

初始化启动集群

    nodeX代表node1和node2 和node3

ALL:  同步配置到所有集群机器

nn01: 初始化ZK集群  ./bin/hdfs zkfc -formatZK

nodeX:  启动 journalnode 服务

            ./sbin/hadoop-daemon.sh start journalnode

nn01: 格式化  ./bin/hdfs  namenode  -format

nn02: nn1数据同步到本地 /var/hadoop/dfs

         Rsync -aSH nn1:/var/hadoop/dfs /var/hadoop/dfs

nn01: 初始化 JNS

        ./bin/hdfs namenode -initializeSharedEdits

nodeX: 停止 journalnode 服务

           ./sbin/hadoop-daemon.sh stop journalnode

 

启动集群

nn01: ./sbin/start-all.sh

nn02: ./sbin/yarn-daemon.sh start resourcemanager

 

查看集群状态

./bin/hdfs haadmin -getServiceState nn1  

./bin/hdfs haadmin -getServiceState nn2

./bin/yarn rmadmin -getServiceState rm1

./bin/yarn rmadmin -getServiceState rm2

 

./bin/hdfs dfsadmin -report

./bin/yarn  node  -list

 

访问集群:

./bin/hadoop  fs -ls  /

./bin/hadoop  fs -mkdir hdfs://nsdcluster/input

 

验证高可用,关闭 active namenode

./sbin/hadoop-daemon.sh stop namenode

./sbin/yarn-daemon.sh stop resourcemanager

 

恢复节点

./sbin/hadoop-daemon.sh start namenode

./sbin/yarn-daemon.sh start resourcemanager

RAID–磁盘阵列的学习

王宇恒阅读(24)评论(0)

磁盘阵列全名是『 Redundant Arrays of Inexpensive Disks, RAID 』,英翻中的意思是:容错式廉价磁盘阵列。 RAID 可以透过一个技术(软件或硬件),将多个较小的磁碟整合成为一个较大的磁碟装置; 而这个较大的磁碟功能可不止是储存而已,他还具有数据保护的功能呢。整个 RAID 由於选择的等级 (level) 不同,而使得整合后的磁碟具有不同的功能, 基本常见的 level 有这几种:

  • RAID-0 (等量模式, stripe):效能最佳

    这种模式如果使用相同型号与容量的磁碟来组成时,效果较佳。这种模式的 RAID 会将磁碟先切出等量的区块 (举例来说, 4KB), 然后当一个文件要写入 RAID 时,该文件会依据区块的大小切割好,之后再依序放到各个磁碟里面去。由於每个磁碟会交错的存放数据, 因此当你的数据要写入 RAID 时,数据会被等量的放置在各个磁碟上面。举例来说,你有两颗磁碟组成 RAID-0 , 当你有 100MB 的数据要写入时,每个磁碟会各被分配到 50MB 的储存量。如图

 RAID-0 的磁碟写入示意图

上图的意思是,在组成 RAID-0 时,每颗磁碟 (Disk A 与 Disk B) 都会先被区隔成为小区块 (chunk)。 当有数据要写入 RAID 时,数据会先被切割成符合小区块的大小,然后再依序一个一个的放置到不同的磁碟去。 由於数据已经先被切割并且依序放置到不同的磁碟上面,因此每颗磁碟所负责的数据量都降低了!照这样的情况来看, 越多颗磁碟组成的 RAID-0 效能会越好,因为每颗负责的数据量就更低了! 这表示我的数据可以分散让多颗磁碟来储存,当然效能会变的更好啊!此外,磁碟总容量也变大了! 

只是使用此等级你必须要自行负担数据损毁的风险,由上图我们知道文件是被切割成为适合每颗磁盘分区区块的大小, 然后再依序放置到各个磁碟中。想一想,如果某一颗磁碟损毁了,那么文件数据将缺一块,此时这个文件就损毁了。 由於每个文件都是这样存放的,因此RAID-0 只要有任何一颗磁碟损毁,在 RAID 上面的所有数据都会遗失而无法读取。

  • RAID-1 (映射模式, mirror):完整备份

这种模式也是需要相同的磁碟容量的,最好是一模一样的磁碟啦!如果是不同容量的磁碟组成 RAID-1 时,那么总容量将以最小的那一颗磁碟为主!这种模式主要是『让同一份数据,完整的保存在两颗磁碟上头』。举例来说,如果我有一个 100MB 的文件,且我仅有两颗磁碟组成 RAID-1 时, 那么这两颗磁碟将会同步写入 100MB 到他们的储存空间去。 因此,整体 RAID 的容量几乎少了 50%

 RAID-1 的磁碟写入示意图

如上图所示,一份数据传送到 RAID-1 之后会被分为两股,并分别写入到各个磁碟里头去。 由於同一份数据会被分别写入到其他不同磁碟,因此如果要写入 100MB 时,数据传送到 I/O 汇流排后会被复制多份到各个磁碟, 结果就是数据量感觉变大了!因此在大量写入 RAID-1 的情况下,写入的效能可能会变的非常差。

由于两颗磁碟内的数据一模一样,所以任何一颗硬盘损毁时,你的数据还是可以完整的保留下来的! 所以我们可以说, RAID-1 最大的优点大概就在於数据的备份吧!不过由於磁碟容量有一半用在备份, 因此总容量会是全部磁碟容量的一半而已。虽然 RAID-1 的写入效能不佳,不过读取的效能则还可以。这是因为数据有两份在不同的磁碟上面,如果多个 processes 在读取同一笔数据时, RAID 会自行取得最佳的读取平衡。

  • RAID 0+1,RAID 1+0

RAID-0 的效能佳但是数据不安全,RAID-1 的数据安全但是效能不佳,那么能不能将这两者整合起来配置 RAID 呢? 可以啊!那就是 RAID 0+1 或 RAID 1+0。所谓的 RAID 0+1 就是: (1)先让两颗磁碟组成 RAID 0,并且这样的配置共有两组; (2)将这两组 RAID 0 再组成一组 RAID 1。这就是 RAID 0+1。

 RAID-0+1 的磁碟写入示意图

如上图所示,Disk A + Disk B 组成第一组 RAID 0,Disk C + Disk D 组成第二组 RAID 0, 然后这两组再整合成为一组 RAID 1。如果我有 100MB 的数据要写入,则由於 RAID 1 的关系, 两组 RAID 0 都会写入 100MB,但由於 RAID 0 的关系,因此每颗磁碟仅会写入 50MB 而已。 如此一来不论哪一组 RAID 0 的磁碟损毁,只要另外一组 RAID 0 还存在,那么就能够透过 RAID 1 的机制来回复数据。

由於具有 RAID 0 的优点,所以效能得以提升,由於具有 RAID 1 的优点,所以数据得以备份。 但是也由於 RAID 1 的缺点,所以总容量会少一半用来做为备份。

  • RAID 5:效能与数据备份的均衡考量

RAID-5 至少需要三颗以上的磁碟才能够组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类似 RAID-0 , 不过每个循环的写入过程中,在每颗磁碟还加入一个同位检查数据 (Parity) ,这个数据会记录其他磁碟的备份数据, 用於当有磁碟损毁时的救援。

 RAID-5 的磁碟写入示意图

如上图所示,每个循环写入时,都会有部分的同位检查码 (parity) 被记录起来,并且记录的同位检查码每次都记录在不同的磁碟, 因此,任何一个磁碟损毁时都能够藉由其他磁碟的检查码来重建原本磁碟内的数据喔!不过需要注意的是, 由於有同位检查码,因此 RAID 5 的总容量会是整体磁碟数量减一颗。以上图为例, 原本的 3 颗磁碟只会剩下 (3-1)=2 颗磁碟的容量。而且当损毁的磁碟数量大於等於两颗时,这整组 RAID 5 的数据就损毁了。 因为 RAID 5 默认仅能支持一颗磁碟的损毁情况。



解决中文显示乱码的情况

舒旭东阅读(29)评论(0)

Python 编码转换与中文处理

python 中的 unicode是让人很困惑、比较难以理解的问题. utf-8是unicode的一种实现方式,unicode、gbk、gb2312是编码字符集.

decode是将普通字符串按照参数中的编码格式进行解析,然后生成对应的unicode对象

写python时遇到的中文编码问题:

➜  /test sudo vim test.py
#!/usr/bin/python
#-*- coding:utf-8 -*-
def weather():
        import time
        import re
        import urllib2
        import itchat
        #模拟浏览器
        hearders = "User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
        url = "<a href="https://tianqi.moji.com/weather/china/guangdong/shantou" style="text-decoration-line: none; margin: 0px !important; padding: 0px !important; color: rgb(42, 0, 255) !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 26px !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">https://tianqi.moji.com/weather/china/guangdong/shantou</a>"    ##要爬去天气预报的网址
        par = '(<meta name="description" content=")(.*?)(">)'    ##正则匹配,匹配出网页内要的内容
        ##创建opener对象并设置为全局对象
        opener = urllib2.build_opener()
        opener.addheaders = [hearders]
        urllib2.install_opener(opener)
        ##获取网页
        html = urllib2.urlopen(url).read().decode("utf-8")
        ##提取需要爬取的内容
        data = re.search(par,html).group(2)
        print type(data)
        data.encode('gb2312')
        b = '天气预报'
        print type(b)
        c = b + '\n' + data
        print c
weather()

➜  /test sudo python test.py
<type 'unicode'>
<type 'str'>
Traceback (most recent call last):
  File "test.py", line 30, in <module>
    weather()
  File "test.py", line 28, in weather
    c = b + '\n' + data
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

解决方法:

➜  /test sudo vim test.py
#!/usr/bin/python
#-*- coding:utf-8 -*-
import sys
reload(sys)
# Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding('utf-8')
def weather():
        import time
        import re
        import urllib2
        import itchat
        #模拟浏览器
        hearders = "User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
        url = "<a href="https://tianqi.moji.com/weather/china/guangdong/shantou" style="text-decoration-line: none; margin: 0px !important; padding: 0px !important; color: rgb(42, 0, 255) !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 26px !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">https://tianqi.moji.com/weather/china/guangdong/shantou</a>"    ##要爬去天气预报的网址
        par = '(<meta name="description" content=")(.*?)(">)'    ##正则匹配,匹配出网页内要的内容
        ##创建opener对象并设置为全局对象
        opener = urllib2.build_opener()
        opener.addheaders = [hearders]
        urllib2.install_opener(opener)
        ##获取网页
        html = urllib2.urlopen(url).read().decode("utf-8")
        ##提取需要爬取的内容
        data = re.search(par,html).group(2)
        print type(data)
        data.encode('gb2312')
        b = '天气预报'
        print type(b)
        c = b + '\n' + data
        print c
weather()

测试后:

➜  /test sudo python test.py
<type 'unicode'>
<type 'str'>

天气预报

汕头市今天实况:20度 多云,湿度:57%,东风:2级。白天:20度,多云。 夜间:晴,13度,天气偏凉了,墨迹天气建议您穿上厚些的外套或是保暖的羊毛衫,年老体弱者可以选择保暖的摇粒绒外套。

个人感觉网上说中文乱码通用解决办法都是错误的,因为类型不一样解决方法也不一样,所以最近刚好出现了这种问题,从网上找了很多办法没解决到,最后自己去查看资料,才发现需要对症下药。

这是一个抓取网页代码的python脚本

➜  /test sudo cat file.py
#!/usr/bin/python
#_*_ coding:UTF-8 _*_
import urllib,urllib2
import re
url = '<a href="http://sports.sohu.com/nba.shtml" style="text-decoration-line: none; margin: 0px !important; padding: 0px !important; color: rgb(42, 0, 255) !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 26px !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://sports.sohu.com/nba.shtml</a>' #抓取的url
par = '20180125.*\">(.*?)</a></li>'
req = urllib2.Request(url)
response = urllib2.urlopen(req).read()
#response = unicode(response,'GBK').encode('UTF-8')
print type(response)
print response

遇到的问题:

使用中文抓取中文网页时,print出来的中文会出现乱码

➜  /test sudo python file.py
special.wait({
itemspaceid : 99999,
form:"bigView",
adsrc : 200,
order : 1,
max_turn : 1,
spec :{
onBeforeRender: function(){
},
onAfterRender: function(){
},
isCloseBtn:true//�Ƿ��йرհ�ť
}
});

解决方法:

查看网页源代码发现charset=GBK的类型所以python中要进行类型转换

➜  /test sudo cat file.py
#!/usr/bin/python
#_*_ coding:UTF-8 _*_
import urllib,urllib2
import re
url = '<a href="http://sports.sohu.com/nba.shtml" style="text-decoration-line: none; margin: 0px !important; padding: 0px !important; color: rgb(42, 0, 255) !important; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 26px !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://sports.sohu.com/nba.shtml</a>' #抓取的url
par = '20180125.*\">(.*?)</a></li>'
req = urllib2.Request(url)
response = urllib2.urlopen(req).read()
response = unicode(response,'GBK').encode('UTF-8')
print type(response)
print response
➜  /test sudo python file.py
special.wait({
itemspaceid : 99999,
form:"bigView",
adsrc : 200,
order : 1,
max_turn : 1,
spec :{
onBeforeRender: function(){
},
onAfterRender: function(){
},
isCloseBtn:true//是否有关闭按钮
}
});

现在已经把中文乱码解决了

import json

#打印字典

dict = {‘name’: ‘张三’}

print json.dumps(dict, encoding=“UTF-8”, ensure_ascii=False) >>>{‘name’: ‘张三’}

#打印列表

list = [{‘name’: ‘张三’}]

print json.dumps(list, encoding=“UTF-8”, ensure_ascii=False) >>>[{‘name’: ‘张三’}]

动态路由的原理与配置

梦回归墟阅读(26)评论(0)

一、动态路由简介

1. 动态路由选择

指路由器使用路由选择协议来获悉网络并更新路由选择表。

2. 路由协议分类

3. 管理距离介绍

管理距离(AD)用于判断从邻接路由器收到的路由选择信息的可信度,它是0-255的整数,0表示可信度最大,255意味着他不会有数据流使用相应的路由。

默认管路距离(Show ip protocols查看动态路由的AD值)

4. 度量值

度量是指路由协议来分配到达远程网络的路由开销的值。

IP路由协议中使用的度量如下:

5. 收敛

  • 路由器收敛完成

  • 当所有路由表包含相同网络信息

  • 当路由器继续交换路由信息

  • 当无信息时候收敛结束

  • 网络在到达收敛前无法完全正常工作

6. 距离矢量-路由环路

(1) 什么是路由环路?

路由环路是指数据包在一系列路由器之间不断传输却始终无法到达其预期目的网络的一种现象。

(2) 路由环路会造成的影响

  • 环路内的路山器占用链路带宽来反复收发流量

  • 路由器的CPU因不断循环数据包而不堪重负

  • 影响到网络收敛

  • 路由更新可能会失或无法得到及时处理

(3) 防环机制

  • 定义最大度量以防止计数至无穷大

  • 抑制计时器

  • 水平分割

  • 路由毒化或毒反转

  • 触发更新

二、RIP路由信息的更新

1. RIP路由信息更新依托于时间周期的更新(更新周期为30秒)

当路由器A连接的网络拓扑发生改变后A路由器更新路由表,等到下一个发送周期通告更新后的路由表,路由器B收到此更新信息后更新自己的路由表

2. RIP配置

配置命令:

router rip

network 分类网络 (network10.0.0.0network告诉路由协议RIP该通告哪些分类网络)

  • version 2

  • no auto-summary(关闭汇总)

查看命令show ip route

实验环境如下:

(1) 配置路由器R2接口ip地址和配置RIP路由

(2) 同样的设置R1和R3路由器

(3) 查看路由表show ip route

Nginx配置-反向代理

略懂阅读(44)评论(0)

  反向代理,就是客户端只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标后端服务器获取数据,在返回给客户端,此时反向代理服务器和后端服务器对外只有一个代理服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

1、安装配置后端服务器(10.0.0.2),正常安装运行,访问如下:

image.png

2、安装反代理服务器(10.0.0.4)的nginx服务,安装启动之后,如图:

1568086524647192.png

3、配置反代理服务器(10.0.0.4)的 nginx.conf

server {

        listen       80;

        server_name  www.luedong.com;

        location / {

            proxy_pass http://10.0.0.2;

            index  index.html index.htm index.jsp;

        }

    }

1568086705100563.png

重启nginx,命令“./nginx -s reload” 再次访问 www.luedong.com 如图:

1568086801871774.png

分布式键值高可用存储集群架构搭建(ETCD)

jwenshan阅读(46)评论(0)

       ETCD 是一个高可用的分布式键值数据库,可用于服务发现。ETCD 采用 raft 一致性算法,基于 Go 语言实现,随着CoreOSKubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。etcd为解决这类问题带来了福音,本文将从etcd的应用场景开始,深入解读etcd的实现方式,以供开发者们更为充分地享用etcd所带来的便利。

特点

简单:安装配置使用简单,提供 HTTP API

安全:支持 SSL 证书

可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性

图片.png

图片.png

图片.png
图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

Hadoop安装

李鑫宇阅读(48)评论(0)

Hadoop:是一个开源框架,允许使用简单的编程模型在跨计算机集群的分布式环境中存储和处理大数据。它的设计是从单个服务器扩展到数千个机器,每个都提供本地计算和存储。包含有HDFS分布式文件系统模块,Mapreduce模块是一种编程模型,用于大规模数据集的并行运算,Yarn模块是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度以及等等

HDFS 角色及概念 :hadoop分布式文件系统(空间≈单台datanode空间*datanode数量)

  1. HDFS是Hadoop体系中数据存储管理的基础。它是一个高度容错的系统,用于在低成本的通用硬件上运行。(分布式的文件存储系统)

  2. 角色和概念 (fsimage:文件存储位置文件,fsedit:数据位置变更日志)

    A. Client :切分文件,访问HDFS,与NameNode交互,获取文件位置信息,与DataNode交互,读取和写入数据。 (存数据和切分文件分布式存储)

    B. Namenode  :Master节点,管理HDFS的名称空间和数据块映射信息,配置副本策略,处理所有客户端请求。(管理者:数据存哪个datanode,记录文件存哪儿)

    C. Secondarynode :定期合幵 fsimage 和fsedits,推送给NameNode,紧急情况下,可辅劣恢复NameNode (综合文件存储文件和数据位置变更日志,让fsedit不臃肿,数据出现紧急情况可以参考)

    D. Datanode :数据存储节点,存储实际的数据,汇报存储信息给NameNode。

    E. Block(数据块大小):每块缺省64MB大小,每块可以多个副本

 

Mapreduce 角色及概念:一种编程模型,用于大规模数据集的并行运算

  1. JobTracker

    Master节点,只有一个管理所有作业,作业/任务的监控、错误处理等,将任务分解成一系列任务,幵分派给TaskTracker。

  2. TaskTracker

    Slave节点,一般是多台,运行Map Task和Reduce Task,并与JobTracker交互,汇报任务状态

  3. Map Task

    解析每条数据记录,传递给用户编写的map(),幵执行,将输出结果写入本地磁盘(如果为map-only作业,直接写入HDFS)。

  4. Reducer Task

    从Map Task的执行结果中,远程读取输入数据,对数据进行排序,将数据按照分组传递

给用户编写的reduce函数执行。

 

Yarn 角色及概念:

  Yarn 是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度

  Yarn 的角色

    1. Resourcemanager:处理客户端请求,启动 / 监控 ApplicationMaster,监控 NodeManager

    2. Nodemanager:单个节点上的资源管理,处理来自 ResourceManager 的命令,处理来自 ApplicationMaster 的命令

    3. ApplicationMaster:数据切分,为应用程序申请资源,幵分配给内部任务,任务监控不容错Yarn 角色及概念

    4. Container:对任务运行行环境的抽象,封装了 CPU 、内存等,多维资源以及环境变量、启动命令等任务运行相关的,信息资源分配不调度

    5. Client:用户与 YARN 交互的客户端程序,提交应用程序、监控应用程序状态,杀死应用程序等

 

Hadoop 安装配置

    Hadoop 的部署模式有三种

    1. 单机

    2. 伪分布式 (安装在一台机器上)

    3. 完全分布式(安装在多台机器上)

一、单机模式

  1. 设置hostname名字,例如node1

     设置hosts:xxx.xxx.xxx.xxx node1

  2. 装软件包yum -y install java-1.8.0-openjdk-devel(依赖)

  3. 在http://hadoop.apache.org上下在hadoop包

  4. 解压hadoop包,移动/usr/local/hadoop(改名)

  5. 配置hadoop:改配置脚本/usr/local/hadoop/etc/hadoop/hadoop-env.sh

            export

            jAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre"

            //配置JAVA的主目录,可rpm -ql java-1.8.0-openjdk查看

            export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/usr/local/hadoop/etc/hadoop"}

            //配置hadoop的配置文件目录

  6 可添加PATH路径,然后hadoop version查看版本信息

  

例:查看单词的出现次数

    hadoop jar ./share/hadoop/

    mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount input output

    Jar:运行java文件    

    hadoop-mapreduce-examples-2.7.3.jar:jar文件的路径,事先有的jar文件在share/hadoop/ mapreduce/下

    Wordcount:单词统计次数的方法

    input output:输入输出的目录,输入目录可以有多个,输出只能有一个,但是输出的目录不能存在

    注:不知道填写什么直接回车,会产生提示

    例子:hadoop jar ./share/hadoop/

    mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount ooo xxx

 

二、Hadoop完全分布式

    1.HDFS分布式文件系统(OpenJdk必须同版本!)

        192.168.1.10 nn1 //namenode,secondarynamenode

        192.168.1.11 node1 //datanode

        192.168.1.12 node2 //datanode

        192.168.1.13 node3 //datanode

        安装java-1.8.0-openjdk-devel

        A. 所有机器配置 /etc/hosts(里面所有的机器都要有,包括本机的)

        B. 在nn1上的ssh的配置文件,不是d的文件中/etc/ssh/ssh_config里面的Host * 下加入StrictHostKeyChecking no  //避免连接时出现yes/no

        C. nn1:生成密钥,传给ALL,包括nn1自己,ssh自己时不需要密码!

        D. 在nn1上配置vim /usr/local/hadoop/etc/hadoop/core-site.xml

            <configuration>

               <property>

                 <name>fs.defaultFS</name>              //文件系统配置

                 <value>hdfs://nn01:9000</value>       //注意hdfs格式

               </property>

               <property>

                 <name>hadoop.tmp.dir</name>      //配置hdfs数据存储位置

                 <value>/var/hadoop</value>      //修改到这个目录下,习惯

               </property>

             </configuration>

        E.在nn1上配置vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml

           <configuration>

              <property>

                  <name>dfs.namenode.http-address</name>  

                  <value>nn1:50070</value>

              </property>

              <property>

                  <name>dfs.namenode.secondary.http-address</name>

                  <value>nn1:50090</value>

              </property>

              <property>

                  <name>dfs.replication</name>

                  <value>2</value>

              </property>

           </configuration>

            dfs.namenode.http-address:配置namenode(也就是nn1)的地址参数,声明namenode的地址,给datanode用的

            dfs.namenode.secondary.http-address:声明secondarynode的地址,我们也把它配置到这台机器上

            dfs.replication:切块的数据存几份,默认存3份,包括原数据!

           拓展:dfs.namenode.name.dir :记录数据的位置及变更文件的路径,默认不修改file://${hadoop.tmp.dir}/dfs/name,在hadoop存数据的位置下

            dfs.datanode.data.dir :存真实数据的位置,也默认不修改,默认:file://${hadoop.tmp.dir}/dfs/data下

        F. 在每台机器上面创建/var/hadoop文件夹

        G. 从nn1上面拷贝/usr/local/hadoop到每台机器上

        H. ./bin/hdfs namenode -format  //在 namenode 上执行格式化操作

        I. /sbin/start-dfs.sh   //启动集群

    验证:在每台机器上使用jps查看,nn1有namenode和secondarynamenode,但是没有datanode,其他只有datanode,在nn1上 bin/hdfs dfsadmin -report查看每台机器的信息,也算是验证是否成功

    2. 部署分布式计算框架

        在etc/hadoop下把mapred-site.xml.template拷贝成mapred-site.xml文件并加入配置

            <configuration>

                <property>

                  <name>mapreduce.framework.name</name>  //部署分布式计算框架

                  <value>yarn</value>   //单击使用local,集群使用yarn

                 </property>

            </configuration>

    3. 安装部集群的资源管理

        在etc/hadoop下添加文件yarn-site.xml的配置

            <configuration>

               <property>             

                  <name>yarn.resourcemanager.hostname</name>       

                             //配置resourcemanager的address

                  <value>nn1</value>   地址写hosts里面的nn1

               </property>

               <property>

                   <name>yarn.nodemanager.aux-services</name>

                            //配置nodemanager的计算框架

                   <value>mapreduce_shuffle</value>                       

                            //使用默认的框架mapreduce_shuffle

               </property>

            </configuration>

    4. 同步配置到所有主机

    5. 启动服务 ./sbin/start-yarn.sh

    6. 验证角色 jps

    7. 验证节点状态 ./bin/yarn node -list

 

HDFS 基本命令 (./bin/hadoop fs回车可以查看到可以使用的命令!)

    如果不能写入,应该是在保护状态,操作./hadoop dfsadmin -safemode leave

    – ./bin/hadoop fs –ls /

        – 对应 shell 命令 ls /

    – ./bin/hadoop fs –mkdir /abc

        – 对应 shell 命令 mkdir /abc

    – ./bin/hadoop fs –rmdir /abc

        – 对应 shell 命令 rmdir /abcHDFS 使用

    – ./bin/hadoop fs –touchz /urfile

        – 对应 shell 命令 touch /urfile

    – ./bin/hadoop fs –cat /urfile

        – 对应 shell 命令 cat /urfile

    – ./bin/hadoop fs –rm /urfile

        – 对应 shell 命令 rm /urfileHDFS 使用

    – 上传文件

        – ./bin/hadoop fs –put localfile /remotefile

    – 下载文件

        – ./bin/hadoop fs –get /remotefile

 

例:词频统计

  ./bin/hadoop fs -mkdir /oo

  ./bin/hadoop fs -put *.txt /oo/

  ./bin/hadoop jar

    ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar  

      wordcount /oo /xx

  (注意oo xx 前面要加/斜线!)

  ./bin/hadoop fs -ls /

 

Hadoop 节点管理

    一、HDFS 增加节点

        1. 启动一个新的系统,禁用 selinux、禁用 firewalld

        2. 设置 ssh 免密码登录

        3. 在所有节点增加新新节点的主机信息 /etc/hosts

        4. 安装 java openjdk 运行环境

        5. 拷贝namnode的 /usr/local/hadoop 到本机

        6. 修改namenode的slaves文件增加该节点

        7. 创建/var/hadoop文件存储位置

        8. 在该节点启动Datanode

            ./sbin/hadoop-daemon.sh start datanode

        9. 设置同步带宽,并同步数据

            ./bin/hdfs dfsadmin -setBalancerBandwidth 67108864

            ./sbin/start-balancer.sh

        10. 查看集群状态

            ./bin/hdfs dfsadmin -report

    二、HDFS 修复节点

        1. 修复节点比较简单,不增加节点基本一致

        2. 需要注意新节点的 ip 不 主机名 要不损坏节点一致

        3. 启动服务

              ./sbin/hadoop-daemon.sh start datanode

        4. 数据恢复是自动的:上线以后会自动恢复数据,如果数据量非常巨大,可能需要一定的时间

    三、HDFS 删除节点

        配置NameNode的 hdfs-site.xml

            1. 增加 dfs.hosts.exclude 配置

                <property>

                  <name>dfs.hosts.exclude</name>

                  <value>/usr/local/hadoop/etc/hadoop/exclude</value>

                </property>

            2. 增加 exclude 配置文件,写入要删除的节点 主机名

            3. 更新数据

                ./bin/hdfs dfsadmin -refreshNodes

            4. 查看状态 ./bin/hdfs dfsadmin -report

                – Normal 正常状态

                – Decommissioned in Program 数据正在迁移

                – Decommissioned 数据迁移完成

                – 注意:只有当状态变成 Decommissioned 才能 down机下线

 

Yarn 的相关操作

  – 由于在 2.x hadoop 引入了 yarn 框架,对于计算节点的操作已经变得非常简单

  – 增加节点

    sbin/yarn-daemon.sh start nodemanager

  – 删除节点

    sbin/yarn-daemon.sh stop nodemanager

  – 查看节点 (Resourcemanager)

./bin/yarn node -list

由于 yarn 不包含数据,所以在增加删除修复节点的时候比较简单,hdfs 要注意数据安全!!

 

NFS 网关

    NFS 网关用途

        1. 用户可以通过操作系统兼容的本地NFSv3客户端来阅览HDFS文件系统

        2. 用户可以从HDFS文件系统下载文档到本地文件系统

        3. 用户可以通过挂载点直接流化数据。支持文件附加,但是丌支持随机写

    NFS 网关支持NFSv3和允许HDFS 作为客户端文件系统的一部分被挂载

    特性与注意事项

    HDFS超级用户是不NameNode进程本身具有相同标识的用户,超级用户可以执行任何操作,因为权限检查永远不会为超级用户失败。

    1. 在非安全模式,运行网关的用户是代理用户

    2. 在安全模式时,Kerberos keytab中的用户是代理用户

    配置 

        1. 启动一个新的系统(nfsgetway),禁用 selinux、禁用 firewalld

            在nfsgetway上添加一个uid和gid相同的用户!

            groupadd -g 200 lxy

            useradd -u 200 -g 200 lxy

            id lxy

           配置nfsgetway的hosts,所有datanode节点和namenode节点

        2. 在nn1上停止集群  ./sbin/stop-all.sh

        3. 在nn1上增加配置 core-site.xml

            <property>

                <name>hadoop.proxyuser.lxy.groups</name>

                   //访问时使用的组,*代表任意组

                <value>*</value>

            </property>

            <property>

                <name>hadoop.proxyuser.lxy.hosts</name>

                  //访问时使用的hosts *代表任意主机

                <value>*</value>

            </property>

        4. 同步配置到datanode(node1,node2,node3)

        5. 在nn1上启动集群./sbin/start-dfs.sh

        6. 查看集群的状态./bin/hdfs dfsadmin -report

        7. 卸载 rpcbind 、nfs-utils

        8. 安装 java openjdk 的运行环境

        9. 同步 namenode 的 /usr/local/hadoop 到本机

        10. 配置 hdfs-site.xml

            … …

            <property>

                <name>nfs.exports.allowed.hosts</name>

                 //设置哪些主机进行什么操作

                <value>* rw</value>  //注意中间的空格

                //所有主机都进行读写操作

            </property>

            … …

            <property>

                <name>nfs.dump.dir</name>

                 //设置文件上传转存的目录(在上传过程中,上传完成才会切分文件,所以要把文件临时放置在一个目录下再切分)

                <value>/var/nfstmp</value>

                 //设置目录

            </property>

        11. 给/var/nfstmp设置属主和属组为lxy

             给/usr/local/hadoop/logs配置lxy的ACL权限rwx

        12. 使用 root 用户启动 portmap 服务(nfs依赖于portmap)

             ./sbin/hadoop-daemon.sh –script ./bin/hdfs start portmap

        13. 使用代理用户(lxy)启动 nfs3

            ./sbin/hadoop-daemon.sh –script ./bin/hdfs start nfs3

            注意:启动 portmap 需要使用 root 用户

            启动 nfs3 需要使用 core-site 里面设置的代理用户

            必须先启动 portmap 之后再启动 nfs3

            如果 portmap 重启了,在重启之后 nfs3 也需要重启

            停止需要先停止nfs3再停止portmap

        14. 客户挂载

            可以先showmount -e 192.168.1.200 查看

            挂载:mount -t nfs -o vers=3,proto=tcp,nolock,noatime,sync,noacl 192.168.1.15:/  /mnt/

            可做开机自动挂载,作为数据库的仓库或者web服务器存放页面

            查看注册服务:rpcinfo -p 192.168.1.15

 

Zookeeper(协调执行顺序)

  进行需要写的操作都有leader处理,读的请求直接交follower处理,如果有冲突,则由leader发起投票解决。

  一个分布式的,开放源码的分布式应用程序协调服务

  用来保证数据在集群间的事务性一致

zookeeper 角色不特性

  – Leader:接受所有Follower的提案请求并统一协调发起提案的投票,负责不所有的Follower内部的数据交换

  – Follower:直接为客户端服务并参不提案的投票,同时不Leader数据交换

  – Observer:直接为客户端服务但并不参与提案的投票,同时也不Leader迚行数据交换

zookeeper 角色与选举

  – 服务在启动的时候是没有角色的 (LOOKING)

  – 角色是通过选举产生的

  – 选举产生一个 leader,剩下的是 follower

  – 选举 leader 原则:

  – 集群中超过半数机器投票选择leader.

  – 假如集群中拥有n台服务器,那么leader必须得到n/2+1台服务器投票  

zookeeper 角色与选举

  – 如果 leader 死亡,从新选举 leader

  – 如果死亡的机器数量达到一半,集群挂起

  – 如果无法得到足够的投票数量,就重新发起投票,如果参不投票的机器不足 n/2+1 集群停止工作

  – 如果 follower 死亡过多,剩余机器丌足 n/2+1 集群也会停止工作

  – observer 不计算在投票总设备数量里面

配置zookeeper(配置一台observer,一台leader,两台follower)

  环境:nn1做observer,node{1..3}做follower和leader

      1. 先配置所有机器的hosts,包括自己的,关闭防火墙和selinux

      2. 安装java环境,最好1.8.0

      3. 解压zookeeper包到/usr/local/zookeeper  习惯

      4. 在zookeeper的conf目录下把zoo_sample.cfg改为zoo.cfg(复制备份源文件)

      5. 在zoo.cfg配置文件中的最后添加

        格式:server.序号=hostname:2888:3888  做observer的在最后冒号注明observer

        例:

            server.1=node1:2888:3888

            server.2=node2:2888:3888

            server.3=node3:2888:3888

            server.4=hann1:2888:3888:observer

      6. 把zookeeper目录传递给所有的主机

      7. 所有的主机创建目录mkdir /tmp/zookeeper,因为上面配置文件中声明了数据存放在这个位置

      8. 在/tmp/zookeeper下创建一个myid文件,每台主机都需要创建,文件内容存放上面zoo.cfg配置文件中的序号就可以了 例:echo 1 > /tmp/zookeeper/myid

         注:myid文件中确保只有一个数字,每台机器上的myid文件的数字都不一样,server.id中的id(也就是上面提到的序号)必须和myid文件中的id一致!Id的范围1~255

      9. 在每台机器上依次启动服务

        /usr/local/zookeeper/bin/zkServer.sh start

        查看状态信息

        /usr/local/zookeeper/bin/zkServer.sh status

        就可以看到那一台机器时leader,哪一台机器时follower

 

利用 api 查看状态的脚本

#!/bin/bash

function getstatus(){

    exec 9<>/dev/tcp/$1/2181 2>/dev/null

    echo stat >&9

    MODE=$(cat <&9 |grep -Po "(?<=Mode:).*")

    exec 9<&-

    echo ${MODE:-NULL}

}

for i in node{1..3} nn01;do

    echo -ne "${i}\t"

    getstatus ${i}

done

 

输出结果为

 

node1 follower

node2 leader

node3 follower

nn1 observer

CentOS重置root密码

洪登科阅读(27)评论(0)

CentOS重置root密码


启动CentOS,在启动界面时,按下e

image.png

进入编辑页面

image.png

找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh

image.png

现在按下 Control+x ,使用单用户模式启动

image.png

现在,可以使用下面的命令访问系统

chroot /sysroot

然后键入命令

passwd

回车后,根据提示,输入新密码,接着执行

touch /.autorelabel

然后依次执行

exit


reboot

即可。

天府云博 - 做有态度的开发&运维&设计学习分享平台!

联系我们百度云主机