路由交换--OSPF
基本概念OSPF(Open Shortest Path First)是典型的链路状态路由协议,简单概括其原理是每个路由器都产生一个描述自己家门口情况的通过泛洪到整个网络,路由器会将这些信息存在LSDB(链路状态数据库)中,所有路由器基于LSDB使用相同的算法生成一棵以自己为根的、无环的最短路径树,并将最优路径信息加载到自己的路由表
Router-ID用于OSPF的路由器唯一标识(与IPv4格式相同),一系列OSPF路由器组成的网络称为OSPF域,这些路由器采用相同的OSPF策略,ID必须全域唯一,该ID可以手动配置,一般手动指定为设备的Loopback接口IP地址,如果没有手动指定,设备会自动分配一个设备上的IP地址作为router id,为了稳定性最好是手动指定,配置案例:
12345678# 为设备创建Loopback接口,并指定ipinterface loopback 0ip address 1.1.1.1 32quit# 创建一个OSPF进程,并指定router-idospf 1 router-id 1.1.1.1# router-id配置之后,修改需要重启ospf服务 ...
路由交换--RIP
基本概念RIP(Routing Information Protocol)是最典型的距离矢量路由协议,是最先得到广泛使用的IGP(内部网关)协议,工作机制相对简单,所以是数通领域入门的动态路由协议,常用语小型网络中
目前RIP存在三个版本,面向IPv4的RIPv1和RIPv2,面向IPv6的RIPng(这个我们不做研究)
RIP路由更新初始化
初次交换路由
完成路由收敛
RIP路由更新与路由表
在以上网络结构中,四个路由设备上开启RIP协议,最终R4能和192.168.1.0/24网段通信,此时新增一个ISP高带宽链路,期望R3通过此链路与192.168.1.0/24通信,由于ISP不是直连链路,无法部署RIP(ISP为运营商提供的链路,其上同样有路由设备且没有操作权限),于是我们在R3上配置静态路由下一跳指向ISP
静态路由优先级为60,RIP为100,所以R3上到达192.168.1.0/24的静态路由会取代RIP路由,路由表中到达192.168.1.0/24的RIP路由小时,R3将此前通知给R4的该条RIP路由撤销,R4无法通过RIP学习到192.168.1.0/2 ...
路由交换--基础
路由的基本概念互联网上数据通过IP协议进行转发传输,基于路由器、交换机、防火墙、负载均衡器等设备进行转发,这些设备上都会维护自己的路由表,通过路由表来进行IP寻址
路由表
目的网络地址/掩码:路由指向的目的网段(注意是远端网段)
路由协议:Static是通过手工配置的静态路由,OSPF是一个路由协议自动学习路由信息
优先级:数值越小优先级越高,静态路由的默认优先级为60
度量值:只本条路由到达目的网段的代价值,直连路由和静态路由的默认代价值为0,不同的路由协议有自己的度量值计算方式
下一跳:下次转发到的路由器接口网段,可能要经过多次转发才能到达目的网段
出接口:数据转发出去的路由器接口
路由信息的来源
直连路由:路由器能自动获本设备直连接口的路由并写入路由表,加载到路由表的前提是该接口的物理状态和协议状态,也就是说即使物理接线也可以通过禁用协议来屏蔽该接口路由
静态路由:直连路由不能发现远端网络,可以手动配置,弊端是互联网结构复杂工作量太大且不能灵活变通
动态路由:通过动态路由设备间可以交互信息自动计算和发现网络中的路由
路由优先级
图中,R2可以通过R1或者R3到达1.1 ...
Alist + WebDAV 搭建教程
安装 Alistalist 是开源软件,功能很多,这里主要是当做远程文件服务器使用,用 docker 安装最方便
12345docker pull xhofe/alist:latestmkdir -vp /data/alistdocker run -d --restart=always -v /etc/alist:/opt/alist/data -v /data:/data -p 5244:5244 -e PUID=0 -e PGID=0 -e UMASK=022 --name="alist" xhofe/alist:latestecho "通过端口5244访问alist服务"echo "alist账户信息 : " $(docker exec -it alist ./alist admin)
初始化调整web 端访问地址,通过 5244 端口登录
http://164.0.0.0:5244
在个人资料页面可以修改密码
配置文件服务器在存储菜单中点击添加按钮
驱动:本机存储
挂载路径:这个是在页面中显示的路径,可 ...
Hexo + Typora + github搭建教程
简介hexo是一个开源的博客系统,对md有很好的支持,在本地安装后,可以推送到git上开启page即可使用github的服务器资源
优点:
md格式本身的通用性强,且无迁移成本
Typora编辑md非常方便
hexo的页面优化做得不错,解除软件和终端的限制
点名批评有道云,对md的支持是真的差,还有致命bug
一个哥们写的开源项目,可以用来导出有道云笔记Git地址(官方自己不再提供批量导出功能)
缺点:
多端编辑不方便,需要搭建环境,列举一些解决的思路
封装为Docker,进行一键化环境部署
在服务端的admin中进行简单的编辑
一、首次搭建安装依赖 nodejs,这里不赘述 nodejs 安装方式,请先安装 nodejs 和 npm 后继续
123456789101112131415# 安装hexo依赖npm install -g hexo-cli# 创建文件夹初始化一个hexo项目mkdir bloghexo init# 看下生成了一下目录文件ls_config.landscape.yml node_modules scaffolds ...
负载均衡--LVS
简介
LVS(Linux Virtual Server)Linux虚拟服务,是一个开源的软件项目,在linux2.4版本中内置了LVS,可以看出LVS的影响力非常大
LVS可以实现高可伸缩的、高可用的网络服务,也就是说Linux集成它之后,所有基于Linux内核的服务器原生即可实现集群
优点:
性能强:一方面是集成到内核里面的,对硬件资源的调度非常直接,另外是4层本身只做分发,这活本身也够简单,所以速度快,稳定性强(不容易出bug)
低成本,没啥好说,典型的软件优化替代硬件
配置简单,支持多做算法,支持多种工作模型,另外由于是在4层工作所以基本可以对所有应用进行负载均衡
不足:不支持7层规则修改,也就是没有7层那么多的功能,机制过于庞大,不适合小规模应用,比如说DPVS(基于LVS)一台设备基本可以到达百万级别的CPS(每秒建立连接数),一般也没有这么大的需求,可以选择七层的负载均衡达到更灵活的功能配置;所以其实这里提到的不足都不是LVS的缺陷,只是某些场景不适合使用LVS而已
核心组件LVS的管理工具和内核模块ipvsadm/ipvs
ipvsadm:命令行工具,用于管理集群 ...
负载均衡基础概念
相关名词
VIP
RS:真实服务器,即真正提供服务的机器
硬件负载均衡产品:F5等,这个是比较贵的,听说农行用了F5
软件负载均衡:LVS、DPVS(基于LVS)、Haproxy、Nginx,通常都使用软件负载均衡方案
OSI网络层负载均衡
二层(mac)虚拟mac地址,对外使用虚拟mac地址,接收后再分配给后端实际的mac地址
三层(ip)虚拟ip
四层(tcp)在三层负载均衡基础上,使用IP+port方式做虚拟映射,对流量做NAT处理,转发到后台服务器,并记录流量是由哪台服务器处理的,后续这个连接的所有流量会被转发到同一台服务器
注意,Nginx和Haproxy也可以实现四层的负载均衡,后面详细介绍
五元组通过五元组来决定流量的转发目的地
来源IP、端口
目标IP、端口
协议
VIP的实现
通过keepalive实现
通过BGP协议实现,这种方式可以让流量轮询实现均分
七层(http)虚拟url或者ip,在四层负载均衡基础上,根据应用层的特征来转发流量,比如URL、浏览器类别、语言等。
以TCP为例,负载均衡设备要根据应用层的内容来进行转发,那么势必需要对客户请求 ...
MongoDB -- 一、基础知识
基础知识
文档是mongo中数据的基础单元,类似于mysql中的行
集合类似于表
每个文档都有一个特殊的唯一键_id
mongo自带一个JS shell,可用于管理
文档文档是键值对的一个有序集合,例如:{"greeting" : "Hello, world!"}
文档的键是字符串(\0不能使用,空字符用于表示键的结尾;.和$具有特殊意义是保留字符,尽量避免使用)
键值不仅区分类型,同样会区分大小写
文档不能有重复的键
集合是一组文档,类似于表的概念
动态模式集合是动态模式的,一个集合里面的文档可以是各式各样的
12{"greeting" : "Hello, world!"}{"foo" : 5}
以上两个文档可以存储在同一个集合里面,这就和mysql大不相同了,既然所有结构的文档都可以存储在同一个集合里面,那集合这个层级存在的意义是什么
方便管理,对开发者来说也是很好的数据隔离策略
分开存储在查询效率上会更高
相同 ...
MongoDB -- 三、索引
索引简介索引的创建和分析
分析语句db.index_test.find({'name': 'yjvud'}).explain() 不是很靠谱,和文档里面展示的内容不同没看出什么信息
创建索引db.index_test.ensureIndex({'name': 1}) 创建后再进行分析查看,可以看到索引方案被使用了
创建复合索引db.index_test.ensureIndex({'age': 1, 'name': 1})
Mongo里面复合索引逆序不能生效,也就是说上面的索引只能通过年龄定位后顺序的拿出名称,要从z-a的获取名称的话效率就很低了,需要再创建一个索引db.index_test.ensureIndex({'age': 1, 'name': -1}),当然单个索引不需要,这个后面看具体的数据结构就知道原因了
覆盖索引,和mysql里面一样存在回表操作
隐式索引,复合索引同样存在前缀 ...
MongoDB -- 二、操作命令
前瞻
进入命令行:到服务器上运行(当然前提是使用docker方式进行安装的)docker exec -it mongodb mongo admin
通过navicat连接:正常输入用户名密码即可(注意要将开放服务器对应端口的防火墙)
DDL
创建数据库
use db_name
mongo不需要使用类似create这样的关键字来显式的创建数据库
查看数据库show dbs,注意上面我们使用use命令创建的数据库必须要插入数据之后才会被展示到dbs的结果列表中
查看当前数据库db
DML插入123db.first_table.insert({'name': 'liuxulu'})db.first_table.find()# { "_id" : ObjectId("61c0386a55fe7a268eff2b6d"), "name" : "liuxulu" }
由于没有指定_id,这个时候mongo会给文档自动增加一 ...