Fork炸弹,定义一个函数,名为“:”,函数调用自身函数,管道符开子进程,最终导致消耗光内存资源
:(){ :|:& };:
for循环,获取cpu个数,执行对应数量的dd命令,从零设备文件,写到空设备文件,消耗光全部cpu资源
for i in seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l); do dd if=/dev/zero of=/dev/null & done
dd命令,从零设备读数据,写到/下的test文件,块大小1M,个数2000,也就是2G数据,可以根据需要调整
dd if=/dev/zero of=/test bs=1M count=2000
vim修改test文件,会将文件数据读到内存,文件够大会导致内存打满
vim test &
正则表达式元字符
~为区分大小写匹配
~*不区分大小写匹配
!~区分大小写不匹配
!~*不区分大小写不匹配
.匹配除换行符以外任意一个字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白字符
\d匹配数字
\b匹配单词开始或结束
^匹配字符串的开始
$匹配字符串的结束
*重复0次或更多次
+重复1次或更多次
?重复0次或1次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n次到m次
*?重复任意次,但尽可能少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或更多次,单尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复
\W匹配任意不是字母数字下划线汉字的字符
\S匹配任意不是空白符的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除x以为的字符
[^aeiou]匹配非aeiou这几个字母以外的任意字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
数据库mysql
• 常见存储引擎:innodb,myisam
• 索引:B加树索引
• 事务特性:ACID特性。原子性,一致性,隔离性,持久性
• 数据库隔离级别:读未提交,读已提交,可重复读,序列化
• 锁机制:读锁,写锁。死锁
• 日志:事务日志-redo log-undo log,错误日志,通用日志,慢查询日志,二进制日志,中继日志
• mysql备份和还原,mysqldump,xtrabackuo
• 主从复制原理,架构有:一主一从,一主多从。级联复制,双主。主从复制故障排错。半同步配置。
• 复制过滤器:方案一:白名单,黑名单,复制指定数据库或指定数据库的指定表。跨库操作不会成功。
• 复制加密
• GTID复制
• mysql中间件mycat实现读写分离
• MHA实现mysql的高可用性
• MYSQL的PXC和压力测试
运维自动化ansible
• 常用模块
• playbook格式yaml/yml
YAML 语言特性
YAML的可读性好
YAML和脚本语言的交互性好
YAML使用实现语言的数据类型
YAML有一个一致的信息模型
YAML易于实现
YAML可以基于流来处理
YAML表达能力强,扩展性好
• playbook中使用handlers和notify
• playbook中使用tags
• palybook中使用变量:setup模块中的变量,playbook命令行中定义变量,playbook文件中定义变量,使用变量文件,主机清单中定义变量:主机变量,组(公共)变量
• template模板:动态生成相类似的配置文件。template文件必须存放在templates目录下,命名.j2结尾。yaml/yml文件和templates目录平级。
jinja2语言,模板中可以使用变量,并参与运算,使用流程控制for和if实现动态生成文件功能。
playbook文件中定义变量
template文件中for,if中引用变量
{% for vhost in nginx_vhost %}
server{
listen {{ vhost.listen }}
{%if vhost.server_name is defined%}
server_name {{vhost.server_name}}
{% endif %}
root {{ vhost.root }}
}
{% endfor %}
• playbook中使用when
• playbook使用with_items(loop)
迭代:当需要重复性执行任务时,可以使用迭代机制。
对迭代项的引用,固定变量名为item。
要在tasks中使用with_items给定要迭代的元素:字符串,字典
ansible2.5版本后,可以使用loop代替with_items
• 管理节点过多导致超时问题解决办法:
serial: 2 每次只同时处理2个主机,将所有task执行完成后,再选下2个主机执行所有task,直至所有主机
• 处理速度慢:不使用setu模块或setup中变量时加上
gather_facts: no
• ansible的roles角色实现大型项目
nginx-role.yml
roles/
└── nginx
├── files
│ └── main.yml
├── tasks
│ ├── groupadd.yml
│ ├── install.yml
│ ├── main.yml
│ ├── restart.yml
│ └── useradd.yml
└── vars
└── main.yml
非关系型数据库Redis
• 慢查询
• 持久化RDB(Redis DataBase),快照。实现方式:save,bgsave,自动
• 持久化AOF(AppenOnlyFile),写日志。默认每秒fsync一次。恢复优先级AOF高。配置文件中启用aof会清空数据。
正确开启AOF姿势:先config set appenonly yes,再改配置文件。
bgrewriteaof手动重写可以整理文件变小
• 数据类型:字符串,列表,集合,有序集合,哈希
• 常用命令:info,select,keys,bgsave,dbsize,flushdb,flushall,shutdown,get,mgrt,set,mset,config,ttl(查看有效期),del。
字符串操作:append,getset,strlen(字符串长度:字节数),exists,expire(重新设置有效期),persist(设置永不过期),incr(数据递增),decr(数据递减)incrby(数值增加),deceby(减少数值)。
列表list特点:有序,可重复,左右都可以操作。lpush(左边插入),rpush,llen(列表长度),lrange(查看列表范围),lindex(查看列表索引的值),lset(设置列表索引对应的值),lpop(左边弹出),rpop,type,ltrim(保留),del(删除列表)。
集合set特点:无序,无重复,集合间操作。sadd(生成集合,追加数值),smembers(查看集合内所有数据),srem(删除集合内元素),sinter(交集),sunion(并集),sdiff(差集)
有序集合sorted set特点:有序,无重复元素,每个元素都是由score和value组成,score可以重复,value不可重复。zadd(生成有序集合),zrange(基于索引查看有序集合),zrange paihangbang 0 -1 withscores(正序显示所有key和分数),zrevrange(倒序),zcard(获取集合个数),zscore(获取分数)zrem(删除元素)
哈希hash:hset(设置hash的字段,值)hgetall(查看所有字段的值),hget(获取hash key对应的字段的值),hdel(删除hash key对应字段),hmset(批量设置hash key的多个field和value),hmget(获取指定值),hkeys(获取所有字段名field),hvals(获取所有field的value),hgetall(获取所有字段和值),del(删除hash)
• rename-command key * “”禁用此命令
• 安全:不要以root权限运行redis,要设置登录密码,防止黑客攻击
• 消息队列分为两种:生产者/消费者模式,发布者/订阅者模式。
列表元素的插入就是生产,弹出就是消费
订阅者监听频道:subscribe channel1
psubscribe *订阅所有频道
发布者发布消息:publish channel test
• redis集群和高可用
• redis主从复制:第一次全量,后续增量
• 避免全量复制:
第一次全量不可避免,后续全量可以利用小主节点(内存小复制快),业务低峰时进行全量
节点id不匹配:主节点重启导致运行id变化,可能触发全量复制,可以利用哨兵或集群
复制积压缓冲不足:调大repl-backlog-size大小
• 避免复制风暴:
单主节点复制风暴:可以更改一主三从拓扑为一主带一从,从节点再带二从
单机器复制风暴:机器宕机后,大量全量复制。可以主节点多实例分散到多个机器,避免单机器多主实例同时复制
• redis主从配置:
redis-cli replicsof IP 端口
redis-cli config set masterauth 123456
• 主从复制故障:配置不一致,例如别名
• redis的哨兵sentinel,解决高可用问题,mastet故障自动提升新主
• redis的cluster
LVS负载调度器
• LVS的NAT模式(重要)
请求和回应均经过director
必须开启ipforward
dip和rip可以跨网段
通讯过程更改目标ip和可以更改端口映射
lvs工作在prerouting链和input链中间,截获只要是发往vip的都修改为发往dip,通过postrouting链发出去。响应包时postrouting-->forward-->prerouting
• LVS的DR模式(重要)
请求经过director,回应直接返回客户端
rs上的lo网卡配置vip
rs修改内核参数屏蔽arp的回应和不通告vip
dip和rip必须同一网络
通讯过程只修改mac地址
• LVS的TUN模式
和dr类似,不过需要支持隧道技术
dip和rio可以跨网段,实现大型环境
• LVS的FULLNAT模式(了解即可)
• 查看系统内核支持的调度算法:grep -i ipvs -C 20 /boot/config-xxx
• LVS调度算法
静态方法:仅根据算法本身调度。
1、RR:roundrobin,轮询,较常用
2、WRR:weighted RR,加权轮询,较常用
3、SH:source hashing,源ip地址hash,实现session sticky;将来自于同一个ip地址的请求始终发往第一次挑中的RS,从而实现回话绑定。
4、DH:destination hashing,目标地址hash,第一次轮询调度到RS,后续将发往同一个目标地址的请求始终发至第一次挑中的RS,典型场景是正向代理缓存场景中的负载均衡,如:wrb缓存
动态方法:根据每台RS的负载状态及调度算法进行调度。往overhad值较小的什么调度。
1、LC:lesat connections,最少连接算法,适用于长连接应用
overhad=活动连接数*256+非活动连接数
2、WLC,weighted LC,加权最少连接,默认调度算法,较常用。
overhad=活动连接数*256+非活动连接数/权重(权重越大,负载值越小)
3、SED:shortest expection delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接
overhad=(活动连接数+1)*256/权重(权重越大,负载值越小)
4、NQ:never queue,第一轮均匀分配,后续SED
5、LBLC:locality-based LC,动态的DH算法,使用场景:根据负载状态实现正向代理,实现web cache等
6、LBLCR:LBLC with replication,带复制的LBLC,解决LBLC负载不均的情况,从负载重的复制到负载轻的
• 内核版本4.15版本后新增的调度算法FO和OVF
静态方法:
1、FO:weighted fail over调度算法,遍历虚拟服务器所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度。
动态方法:
2、OVF:overflow-connection调度算法,基于真实服务器的活动连接数量和权重值是嫌弃。将新连接调度到权重最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器。在此ovf算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:
未过载:未设置IP_VS_DEST_F_OVERLOAD标志
真实服务器当前的活动连接数量小于其权重值
其权重值不为0
• LVS相关软件:ipvsadm
unit file:ipvsadm.service
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save
规则重载工具:/usr/sbin/ipvsadm-restore
配置文件:/etc/sysconfig/ipvsadm-config
ipvs调度规则文件:/etc/sysconfig/ipvsadm
• 内核功能,不监听端口。
• 潜伏在input链之前
企业级linux虚拟化KVM
• 云计算是一种服务,虚拟化是一种技术
• 虚拟化技术分类:
1、模拟器/仿真器,通过软件模拟,可以模拟多种cpu。
2、全虚拟化:软件辅助全虚拟化。通过软件辅助的方式实现,以为自己运行在硬件上 实际上不是。遇到操作设备时,不能直接操作,因此vmm引入了两个机制:特权解除和陷入模拟。
硬件辅助全虚拟化。2005年intel提出并开发了由cpu直接支持的虚拟化技术,cpu可以明确分辨出来自guestos的特权指令,并针对guestos进行特权操作。
3、半虚拟化,需要guestos协助的虚拟化,需要更改其内核源码。
• 比较kvm和xen
• 虚拟机的主要特性:分区,隔离,封装,独立于硬件
• kvm是硬件辅助的虚拟化技术,主要负责比较繁琐的cpu和内存虚拟化,而qemu负责i/o虚拟化,两者合作各自发挥自身的优势。
• rhel对虚拟设备的三种工作模式:
1、虚拟和仿真设备
2、半虚拟化设备
3、透传物理主机设备
• 建议安装qemu-kvm libvirt virt-manager virt-install virt-viewer
• 创建虚拟机:
1、virt-manager图形工具创建
2、virt-install命令行创建,利用kickstart实现自动安装
复制qcow2镜像文件后,用virt-manager或virt-install模板创建新虚拟机
• libvirt管理虚拟机:使用virt-manager图形管理或virsh命令管理
• 存储管理
1、raw文件复制的格式控制,cp --sparse=alway vm2.img vm2.img.bak
2、创建后备差异虚拟磁盘。qemu-img create -f qcow2 -o backing-file=centos8.qcow2 centos8-test1.qcow2
虚拟磁盘格式转换qemu-img convert
调整虚拟磁盘大小qemu-img resize
快照管理
存储池管理
基于目录的存储池
基于文件系统的存储池
基于磁盘的存储池
基于lvm的存储池
基于nfs的存储池
存储卷管理
基于目录的存储池的存储卷管理
基于lvm的存储池的存储卷管理
克隆存储卷
向虚拟机添加存储卷
离线修改虚拟机磁盘文件工具libguestfs-tools
• 网络管理
基于nat的虚拟网络,virt-install的默认
基于自定义网桥的虚拟网络
基于自定义的隔离的虚拟网络
直接分配物理网络设备,包括VT-d和SR-IOV,性能最好
• 实战1:连接NAS共享存储实现虚拟机实时迁移
• 实战2:内外网隔离
虚拟化平台vmware vsphere
• 安装ESXI和vcenter
• 实现跨主机的虚拟机迁移
容器平台docker
• docker组成
• namespace名字空间(隔离):MNT,IPC,UTS,PID,NET,USER namespace
• control groups控制组(资源控制):blkio,cpu,cpuacct,cpuset,devices,freezer,memory,net_cls,ns,perf_event
• 容器管理工具:LXC,docker,pouch,podman
• docker的优势:
快速部署
高效率虚拟化
节省开支
简化配置
环境统一
快速迁移和扩展
更好的实现面相服务的架构,推荐一个容器只运行一个应用,实现分布的应用模型,可以方便的进行横向扩展
• docker的缺点:
内核有要求,3.8以上
多容器共享内核,各应用之间的隔离不如虚拟机彻底
由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和繁琐
由于容器内进程需要查看和调试,需要在各个容器内安装相应的工具
• docker安装
• 镜像管理:内核,镜像,容器
• docker的容器管理
• docker的镜像制作
docker commit
docker build
• dockerfile指令
FROM
LABEL
RUN
ENV
COPY
ADD
CMD
ENTRYPOINT
ARG
VOLUME
EXPOSE
WORKDIR
ONBIILD
USER
HEALTHCHECK
STOPSIGNAL
SHELL
• 容器的数据持久化
指定宿主机文件夹或文件
匿名卷
命名卷
数据卷容器 --volumes-from
利用数据卷容器备份指定容器的数据卷
• 容器间的网络通信
容器间网络互联和工作模式
同一宿主机下不同容器可相互通信,可以使用docker --icc=false禁止通信
可以修改默认网络设置,docker --bip 172.16.1.0/16或者先创建自定义网桥,docker -b docker1
容器名称互联 docker --link
docker支持的五种网络模式
none(单机)
bridge(默认桥接到docker0,然后通过nat出去)
host(共享宿主机网络)
container(共享其他容器网络)
network-name(自定义网络)
同宿主机不同网络的容器间实现通信
bridge网络和自定义的网络,修改防火墙规则使其互通iptables -I DOCKER-ISOLATION-STAGE-2 -j ACCEPT
将容器加入到另一个网络中(容器新加一个网卡)。docker network connect test-net test1
实现跨宿主机间的容器通信
方法1:利用桥接,把宿主机eth0桥接到docker0(缺点需要不同宿主机手动错开容器ip)brctl addif docker eth0
方法2:利用nat,两边添加路由,dnat。命令1:ip route add 192.168.1.0/24 via 10.0.0.101。命令2:iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT
利用open vswitch实现,创建gre网络。命令1:ovs-vsctl add-br obr0。命令2:ip link set dev obr0 up。命令3:ovs-vsctl add-port obr0 gre0 -- set interface gre0 type=gre options:remote_ip=10.0.0.102。命令4:brctl addif docker0 obr0。命令5:ip route add 192.168.2.0/24 dev docker0
利用weave实现。
• docker仓库实现。registry(了解)harbor安装(重点)
• 实现harbor的高可用(haproxy使用source调度算法,防止每个服务器写不同的layer。共享存储不限制)
• docker-compose单机编排工具
• 容器的资源限制
• 容器的创建与管理过程
• 存储引擎,改之前先备份镜像和数据
• 镜像加速,镜像分层构建
• docker优化参数,加到service文件或者daemon.json文件,存储引擎和数据目录
• 进程关系
• 端口映射关系
1.本地port:容器port
2.本地ip:本地port:容器port
3.本地port:本地随机port:容器port
4.本地ip:本地port:容器port/协议
5.一次性映射多个端口和协议
• 进入容器
1.docker attach
2.docker exec
3.nsenter -t 12979 -m -u -i -n -p
• dockerfile镜像制作
• cmd和entrypoint都可以用于容器启动时运行命令或脚本。混用时,会将cmd后面的指令当做entrypoint的参数。
• docker swarm实现容器高可用
企业级高性能web服务nginx
• I/O模型相关概念
同步/异步:关注的是消息通知机制。调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。同步:不提供。异步:提供。
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态。阻塞:不能做别的。非阻塞:能。
• 网络I/O模型:两个步骤,从磁盘或网络复制到内核。从内核加载到用户空间。
阻塞
非阻塞型
复用型
信号驱动型
异步
• I/O的具体实现
select
poll
epoll
rtsig
kqueue
/dev/poll
eventport
Iocp
• 常见io模型比较
select poll epoll
操作方式 遍历 遍历 回调
底层实现 数组 链表 哈希表
io效率 每次调用线性遍历O(n)同左O(1)
最大连接 1024/2048 无上限 无上限
fd拷贝 每次调用select需要把fd集合从用户态拷贝到内核态。每次调用poll,都需要把fd集合从用户态拷贝到内核态。调用epoll_ct时拷贝进内核并保存,之后每次epoll_wait不拷贝
• 零拷贝技术
MMAP
SENFFILE
DMA辅助的SENDFILE
• nginx安装和全局配置
通过修改源码重新编译,自定义响应报文server首部
主配置文件四部分:event事件驱动相关配置,http此协议相关配置,mail协议相关配置,stream服务器相关配置。
• nginx的虚拟主机和location优先级
apache基于ip,端口,主机头三种方式实现虚拟主机
root指令是以次目录当跟,下面找目标目录
alias是访问目标目录就去此目录去找
location语法规则:location [=|~|~*|^~] url {...}
优先级=,^~,~/~*,不带符号
=精确匹配,区分大小写
^~包含并匹配以指定正则表达式开头,不区分大小写
~包含,区分大小写
~*包含,不区分大小写,到磁盘找文件。linux文件区分大小写
• nginx基本配置
deny
allow
范围小的往前放,范围大的往后放
nginx账户认证功能
自定义错误页面
自定义错误日志
检测文件是否存在try_files
长连接配置
作为下载服务器
作为上传服务器
其他配置
• nginx的高级功能第三方模块
nginx状态页
nginx第三方模块比如echo模块
nginx变量使用
nginx自定义访问日志
nginx压缩功能
https功能
nginx rewrite示例,需要先按装pcre库,配合if单次判断,set自定义变量,break中断, return返回结果(可以实现域名跳转),rewrite通过正则表达式的匹配来改变uri
• nginx的SSL功能实现和rewite基础
• nginx rewrite示例及防盗链实现
• nginx反向代理简介及实现
http协议,apache,tomcat
tcp协议,redis,mysql
fastcgi协议,PHP
uwsgi协议,python
• nginx的http反向代理示例及tcp反向代理实现
[root@ka1-centos8 ~]
http {
upstream websrvs {
server 10.0.0.7:80 weight=1;
server 10.0.0.17:80 weight=1;
}
server {
listen 80;
location /{
proxy_pass http://websrvs/;
}
}
}
• nginx支持LNMP
• nginx编译安装实现LNMP
• lnmp安全加固和redis实现session共享
一台机器安装nginx,php-fpm,WordPress
一台机器安装mysql和redis
• nginx二次开发版本:tengine,openresty
• 调度算法:基于key的一致性哈希算法,源地址hash调度算法,最少连接调度算法,相当于lvs的WLC,轮训
高可用集群keeplived
• 高可用集群相关技术,实现lvs,nginx,haproxy负载均衡调度器自身的高可用
集群类型 LB,HA,HPC
LB:Load Balance 负载均衡
LVS/HAProxy/nginx(http/upstream, stream/upstream)
HA:High Availability 高可用集群
数据库、Zookeeper、Redis
SPoF: Single Point of Failure,解决单点故障
HPC:High Performance Computing 高性能集群
https://www.top500.org
• keeplived安装
• 基本核心功能vrrp实现
抢占式(默认)
抢占延迟模式,不能开严格模式,默认300s延时
非抢占式,均backup,非抢占关键词
多播,默认224.0.0.18
单播(推荐)添加到实例语句块,不能开严格模式
• keeplived核心功能
vrrp协议,飘动的ip
ipvsadm命令,内置lvs配置接口
内置脚本功能,nginx,proxy反向代理的高可用
• keeplived --help 日志相关参数-S -D
在符文配置文件中发现变量文件
修改变量文件加入-S 6参数
在/etc/rsyslog.conf文件中加入local6.* 文件路径
重启keeplived和rsyslog服务
• 可以配置多个vip,一下子都飘在一台机器上。负担重。解决方法:双主,各分担一部分vip
• 子配置文件实现。全局配置不动,后面加入include,将web1和web2实例放在子配置文件路径中
• 脚本功能实现主备切换邮件通知
• 实现ipvs高可用,后端健康性检查。
判断出后端挂了,自动把lvs的此后端地址的调度规则修改了
lvs不开启对应端口,不是基于应用的,是内核的功能
• keeplived+lvs双主架构第一台做web集群的主,第二台做mysql集群的主
• lvs是四层(传输层)代理。nginx和haproxy可以实现七层(应用层)代理
• 实现单主的lvs-dr模式,利用FWM绑定多个服务为1个集群服务
• 实现其他应用的高可用性VRRP script
nginx的高可用。killall -0 nginx
企业级反向代理HAproxy
• 四层:Redis、Mysql、RabbitMQ、Memcache等
• 七层:Nginx、Tomcat、Apache、PHP、图片、动静分离、API等
• 正向代理为客户端服务。如vpn
反向代理为服务器端服务。如负载均衡
• haproxy基础配置,只要包含global和proxies语句块(代理相关)
• global配置
多进程nbproc 4
多线程nbthread 10
cpu亲源性cpu-map 1 0 1号worker进程绑定0号cpu(进程和cpu绑定命令ps axo pid,cmd,psr)
最大并发数maxconn
每个进程ssl最大连接数maxsslconn
每个进程每秒创建最大连接数maxconnrate
后端cheek随机提前或延时时间百分比,也就是错峰。spread-cheek
pidfile
log日志功能。建议在其他服务器纪录日志。log 10.0.0.100 local6 info
多进程和socket文件。管理页面只能看一个进程的信息。可以通过一个socket对应一个进程来管理。stats socket /var/lib/haproxy/haproxy.socket1 mode 666 level admin process 1
• proxies配置
defaults [<name>]
frontend <name>
backend <name>
listen <name>
• 端口不够用
sysctl -a | grep ip_local_port_range
短时间的链接
加ip地址
• 子配置文件。在service文件中加-f 目录
• 在 Linux 如果需要绑定本机不存在的 IP, 例如在 HAproxy 及 Nginx 可能会用到, 需要开启 Kernel 的参数 net.ipv4.ip_nonlocal_bind
• HAproxy调度算法
HAProxy通过固定参数 balance 指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。
HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、连接数和响应速度等,且无法实时修改权重(只能为0和1,不支持其它值),只能靠重启HAProxy生效。
对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等
static-rr:基于权重的轮询调度,不支持运行时利用socat进行权重的动态调整(只支持0和1,不支持其它值)及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的 wrr
first:根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务,因此会忽略服务器的权重设置,此方式使用较少,不支持用socat进行动态修改权重,可以设置0和1,可以设置其它值但无效
动态算法:基于后端服务器状态进行调度适当调整,优先调度至当前负载较低的服务器,且权重可以在haproxy运行时动态调整无需重启。
roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不同于lvs中的rr轮训模式,
HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持4095个real server,支持对real server权重动态调整,roundrobin为默认调度算法,此算法使用广泛
leastconn加权的最少连接的动态,支持权重的运行时调整和慢启动,即:根据当前连接最少的后端服务器而非权重进行优先调度(新客户端连接),比较适合长连接的场景使用,比如:MySQL等场景。
在1.9版本开始增加 random的负载平衡算法,其基于随机数作为一致性hash的key,随机负载平衡对于大型服务器场或经常添加或删除服务器非常有用,支持weight的动态调整,weight较大的主机有更大概率获取新请求
其它算法即可作为静态算法,又可以通过选项成为动态算法
source:源地址hash,基于用户源地址hash并将请求转发到后端服务器,后续同一个源地址请求将被转发至同一个后端web服务器。此方式当后端服务器数据量发生变化时,会导致很多用户的请求转发至新的后端服务器,默认为静态方式,但是可以通过hash-type支持的选项更改这个算法一般是在不插入Cookie的TCP模式下使用,也可给拒绝会话cookie的客户提供最好的会话粘性,适用于session会话保持但不支持cookie和缓存的场景源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
map-based:取模法,对source地址进行hash计算,再基于服务器总权重的取模,最终结果决定将此请求转发至对应的后端服务器。此方法是静态的,即不支持在线调整权重,不支持慢启动,可实现对后端服务器均衡调度。缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因总权重发生变化而导致调度结果整体改变,hash-type 指定的默认值为此算法
一致性哈希,当服务器的总权重发生变化时,对调度结果影响是局部的,不会引起大的变动,hash(o)mod n ,该hash算法是动态的,支持使用 socat等工具进行在线权重调整,支持慢启动
uri:基于对用户请求的URI的左半部分或整个uri做hash,再将hash结果对总权重进行取模后,根据最终结果将请求转发到后端指定服务器,适用于后端是缓存服务器场景,默认是静态算法,也可以通过hash?type指定map-based和consistent,来定义使用取模法还是一致性hash。注意:此算法基于应用层,所以只支持 mode http ,不支持 mode tcp
url_param:对用户请求的url中的 params 部分中的一个参数key对应的value值作hash计算,并由服务器总权重相除以后派发至某挑出的服务器;通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server,如果无没key,将按roundrobin算法
hdr:针对用户每个http头部(header)请求中的指定信息做hash,此处由 name 指定的http首部将会被取出并做hash计算,然后由服务器总权重取模以后派发至某挑出的服务器,如果无有效值,则会使用默认的轮询调度。
rdp-cookie对远windows远程桌面的负载,使用cookie保持会话,默认是静态,也可以通过hash-type指定map-based和consistent,来定义使用取模法还是一致性hash。
static-rr--------->tcp/http
first------------->tcp/http
roundrobin-------->tcp/http
leastconn--------->tcp/http
random------------>tcp/http
source------------>tcp/http
Uri--------------->http
url_param--------->http
hdr--------------->http
rdp-cookie-------->tcp
first
static-rr
roundrobin
random
leastconn
source
Uri--------------->http
url_param--------->http
hdr
rdp-cookie
• . /etc/init.d/functions,action "$2 is up"
• 基于cookie的调度
• haproxy状态页配置
• 四层ip透传。客户端到haproxy走http,haproxy到nginx走proxy_portocol。mode tcp ,server send-proxy,nginx中listen 80 proxy_protocol,log_format加入$proxy_protocol_addr。缺点是nginx不能直接访问,只能走haproxy访问
• 七层ip透传。由haproxy发往后端主机的请求报文中添加X-Forwarded-For首部。mode http,options forwardfor,apache服务配置文件中日志格式加入首部字段那个值。
• 报文修改,添加删除发往nginx的请求报文,添加删除回应客户端的响应报文
• 自定义日志格式:http格式,listen语句块中添加option httplog选项
• haproxy起用压缩算法和格式
• 健康性检查,默认发送tcp三次握手。可以在listen语句块加入option httpchk启用七层探测。可以指定网页,指定方法和页面,指定方法,页面和http版本。
• ACL,在frontend语句块:定义acl,引用acl;在backed语句块添加不同主机。示例:
域名匹配
基于源ip或子网调度
基于源地址的访问控制
匹配浏览器类型
基于文件后缀名实现动静分离
匹配访问路径实现动静分离
预定义acl使用
• 自定义错误界面
• 高级功能四层代理:伪四层,后端服务器和haproxy建立三次握手连接,haproxy打开监听端口
• https实现
企业级堡垒机jumpserver
• docker方式安装jumpserver,需要安装docker,mysql,redis,jumpserver
• 用户和组管理。后端删除账号重新创建,需要推送
• 审计
• 资产管理:服务器资产,数据库资产
• 应用管理:数据库应用
企业级web应用服务器TOMCAT
web技术
jdk安装
• jre:java运行时环境,包含jvm和java核心类库。要运行java可以仅安装jre。
• jdk:java语言的软件开发工具包,比jre多了工具。
• java运行。源码--字节码--jvm翻译--windows和linux的机器码
• oracle jdk商业版,java se 8,11,17是LTS长期技术支持版
• openjdk开源版
tomcat安装和基本功能
• java文件先转换成servlet类文件,然后翻译成字节码文件class文件。
• 第一次运行慢,上架前先运行一遍,访问就快了
• tomcat内部组成有外到内,server,services,HTTP connector HTTPS connector AJP connector和 engine,host,context,web application,servlet JSP HTML
核心组件介绍
Tomcat启动一个Server进程。可以启动多个Server,即tomcat的多实例, 但一般只启动一个
创建一个Service提供服务。可以创建多个Service,但一般也只创建一个
每个Service中,是Engine和其连接器Connector的关联配置
可以为这个Service提供多个连接器Connector,这些Connector使用了不同的协议,绑定了不同的端口。其作用就是处理来自客户端的不同的连接请求或响应
Service 内部还定义了Engine,引擎才是真正的处理请求的入口,其内部定义多个虚拟主机Host
Engine对请求头做了分析,将请求发送给相应的虚拟主机,如果没有匹配,数据就发往Engine上的defaultHost缺省虚拟主机
Engine上的缺省虚拟主机可以修改
Host 定义虚拟主机,虚拟主机有name名称,通过名称匹配
Context 定义应用程序单独的路径映射和配置
tomcat处理请求过程
假设来自客户的请求为:http://localhost:8080/test/index.jsp
浏览器端的请求被发送到服务端端口8080,Tomcat进程监听在此端口上。通过侦听的HTTP/1.1 Connector获得此请求。
Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的响应
Engine获得请求localhost:8080/test/index.jsp,遍历它所有虚拟主机Host
Engine匹配到名为localhost的Host。如果匹配不到,就把请求交给该Engine中的defaultHost处理
localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
Host匹配到路径为/test的Context
path=/test的Context获得请求index.jsp,在它的mapping table中寻找对应的servlet
Context匹配到URL PATTERN为 *.jsp 的servlet,对应于JspServlet类构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法。
Context把执行完了之后的HttpServletResponse对象返回给Host
Host把HttpServletResponse对象返回给Engine
Engine把HttpServletResponse对象返回给Connector
Connector把HttpServletResponse对象返回给浏览器端
• apache网页中文可以显示,自动在主机头加入utf-8字符集
• nginx和tomcat中文乱码,需要在网页中加入utf-8字符集
• 默认页面在ROOT目录下,认为是一个项目和其他项目平级
• conf/web.xml是全局配置,项目名ROOT/web-inf/web.xml自定义子项目的个性化配置
• conf/server.xml文件中定义appbase默认网站目录,自动解包,自动加载到内存。通过jar cvf 指定存放路径 目标文件打成一个war包,再把他丢到webapps目录会自动解包就可以访问了
• 默认页面的管理页面打开需要修改两个文件,添加授权用户密码,授权登录地址。可以在网页部署
• 在server.xml文件中有个管理后面,8005端口,shutdown命令(可指定随机字符串来防止别人记住)关tomcat。端口号使用0是生成随机端口,端口-1表示无效端口,关闭此功能
• 在connector语句块后面加server指定版本号
多虚拟主机的实现
• 添加host语句块实现多虚拟主机
• 在host语句块内添加context可以修改映射目录
结合反向代理部署tomcat服务,nginx或者apache和tomcat在同一台机器
• nginx反向代理,实现html网页nginx程序处理,jsp网页tomcat处理,动静分离
• http反向代理AJP协议8009端口,转发给tomcat处理。需要http服务开启proxy代理模块和ajp模块。tomcat 8.5.51之后基于安全禁用了ajp,在tomcat的connector语句块开启ajp内容。
nginx代理到多个tomcat实现负载均衡,涉及到会话session保持问题
• 方案1:session sticky会话黏性
在nginx上加入ip hash;根据原地址调度。加入hash $cookie_JSESSION;则根据session调度。缺点是nat网络出去导致负载不均,以及基于cookie调度后端坏了session丢失。
httpd实现后端tomcat的负载均衡调度,可以走http和AJP协议。了解即可。
• 方案2:tomcat session复制集群
缺点是不适合大的环境
在tomcat服务器host语句块中开启session 集群配置
在网站web-inf目录中,修改web.xml配置文件,倒数第二行加入<distributable/>(注意文件权限)
重启tomcat服务
• 方案3:session server
tomcat session复制集群
memcached
MSM(memcached session manager)
• sticky模式工作原理
• sticky 模式即前端tomcat和后端memcached有关联(粘性)关系
• Tomcat-1(t1)主要将其会话存储在另一台计算机上运行的memcached-2(m2)中(m2是t1的常规节点)。 仅当m2不可用时,t1才会将其会话存储在memcached-1中(m1,m1是t1的failoverNode)。 使用此配置,当计算机1(服务于t1和m1)崩溃时,会话不会丢失。 以下非常好的ASCII艺术显示了此设置。 • •
• 部署方法:下载相关十个jar包,放到tomcat的lib目录。修改tomcat配置conf/context.xml文件,启动memcached的远程连接功能。重启timcat服务即可。
• non-sticky模式工作原理
• non-sticky 模式即前端tomcat和后端memcached无关联(无粘性)关系
• 从msm 1.4.0之后版本开始支持non-sticky模式。
• Tomcat session为中转Session,对每一个SessionID随机选中后端的memcached节点n1(或者n2)为主session,而另一个memcached节点n2(或者是n1)为备session。产生的新的Session会发送给主、备memcached,并清除本地Session。
• 后端两个memcached服务器对一个session来说是一个是主,一个是备,但对所有session信息来说每个memcached即是主同时也是备如果n1下线,n2则转正。n1再次上线,n2依然是主Session存储节点。 • •
• non-sticky模式部署。修改tomcat上的comf/context.xml。重启服务。
• 基于redis的non-sticky模式。
• redis服务修改bind 0.0.0.0,注释这行会远程连接不上,保护模式。
• 修改tomcat是conf/context.xml文件,修改memcachedNodes后面的地址。
tomcat性能优化(面试可能问)
• jvm组成部分,类加载子系统(将所需类加载到内存,必要时将类实例化为实例);运行时数据区(最占用内存,需要优化);执行引擎(包括jit既时编译器,GC垃圾回收器);本地方法接口(调用c,py库,系统调用能)。
• 栈(先进后出)队列(先进先出)
• 运行时数据区包括以下部分,重点关注heap堆,可以做优化。
• Method Area 方法区(线程共享):所有线程共享的内存空间,存放已加载的类信息(构造方法,接口定义),常量(final),静态变量(static), 运行时常量池等。但实例变量存放在堆内存中. 从JDK8开始此空间由永久代改名为元空间
• heap 堆(线程共享):虚拟机启动时创建,存放创建的所有对象信息。如果对象无法申请到可用内存将抛出OOM异常.堆是靠GC垃圾回收器管理的,通过-Xmx -Xms 指定最大堆和最小堆空间大小
• Java stack Java栈(线程私有):每个线程会分配一个栈,存放java中8大基本数据类型,对象引用,实例的本地变量,方法参数和返回值等,基于FILO()(First In Last Out),每个方法为一个栈帧
• Program Counter Register PC寄存器(线程私有):就是一个指针,指向方法区中的方法字节码,每一个线程用于记录当前线程正在执行的字节码指令地址。由执行引擎读取下一条指令.因为线程需要切换,当一个线程被切换回来需要执行的时候,知道执行到哪里了
• Native Method stack 本地方法栈(线程私有):为本地方法执行构建的内存空间,存放本地方法执行时的局部变量、操作数等。所谓本地方法,使用native 关健字修饰的方法,比如:Thread.sleep方法. 简单的说是非Java实现的方法,例如操作系统的C编写的库提供的本地方法,Java调用这些本地方法接口执行。但是要注意,本地方法应该避免直接编程使用,因为Java可能跨平台使用,如果用了Windows API,换到了Linux平台部署就有了问题
GC垃圾收集器
• 关注3个问题:哪些是垃圾要回收;怎么回收垃圾;什么时候回收垃圾。
• 确认垃圾的方法:1、引用计数。循环引用的垃圾无法回收,python使用此方法。2、根搜索(可达)算法。
• 垃圾回收基本算法:1、标记-清除 Mark-Sweep算法,优点速度快,缺点碎片,但是效率很高,不浪费空间;2、标记-压缩 Mark-Compact,比上次多了移动了碎片集中在一端;复制 copying,内存分两块空间,先放A区,A放不下了,把不是垃圾的迁移到B区。B区存满了,把不是垃圾的迁移到A区。循环此过程。
• STW,stop the world。GC线程工作时,停止所有工作的线程。GC完成时,恢复其他工作线程运行。
• JVM内存包括,heap(堆内存),PermGen方法区,Thrend栈。其中heap包括年轻代,老年代。方法区是永久带,java8后改名元空间,此空间物理上不属于heap,但逻辑上存在于heap内存。其中年轻代又分为伊甸园区和幸存区。幸存区分为两个幸存区,一个from区,一个to区,大小相等,地位相等,可互换。
• 默认空间大小比例,伊甸园区8份,幸存区s0占1份,幸存区s1占1份,老年区20份。一共30份。
• tomcat状态页显示元空间不在heap中,但是查看java -XX+PrintGCDetails heap显示heap中包含永久代,也就是元空间。但通过计算使用的空间发现,只包含年轻代和老年代。
• 默认java占物理内存的四分之一,而heap内存占物理总内存的64分之一。
• 年轻代回收Minor GC。伊甸园区满了触发,把不是垃圾的放到幸存区S0,下次伊甸园区满了检查伊甸园区和S0区,把不是垃圾的复制到S1区。重复此操作。15次后还没有被回收的升级到老年区。
• 老年代回收Major GC。老年区满了触发全局检查。等于full GC。
jvm内存常用参数,-标准选项,-X稳定的非标准选项,-XX不稳定的非标准选项。查看不稳定选项的默认值,java -XX:+PrintFlagsInitial。查看当前命令行的使用选项,java -XX:+PrintCommandLineFlags
OOM监控
• 安装jvisualvm工具,再安装Visual GC插件。监控java程序。安装插件后直观看到GC过程。
• 安装Jprediler工具排查OOM原因。
修改tomcat的java虚拟机选项,指定最大内存,新生代,老年代空间。在catalina.sh文件中,添加JAVA_OPTS="-server -Xms128m -Xmx512m -XX:NewSize=48m -XX:MaxNewSize=200m"重启服务。
垃圾收集方式
• 按工作模式不同:指的是GC线程和工作线程是否一起运行
• 独占垃圾回收器:只有GC在工作,STW 一直进行到回收完毕,工作线程才能继续执行
• 并发垃圾回收器:让GC线程垃圾回收某些阶段可以和工作线程一起进行,如:标记阶段并行,回收阶段仍然串行
• 按回收线程数:指的是GC线程是否串行或并行执行
• 串行垃圾回收器:一个GC线程完成回收工作
• 并行垃圾回收器:多个GC线程同时一起完成回收工作,充分利用CPU资源
垃圾回收器
• 新生代3个:Serial,PS(Parallel Scavenge),ParNew。
• 老年代3个:老年代串行收集器Serial Old,老年代并行回收收集器Parallel Old,CMS (Concurrent Mark Sweep并发标记清除算法) 收集器。
• 还有4个不关注新生代老年代:G1(Garbage First)收集器,ZGC收集器,Shenandoah收集器,Epsilon收集器。
jconsole工具
tomcat优化,通过调整jvm选项来优化设置。
非关系型数据库memcache
memcached和redis比较(/符号分割,前面是memcached后面是redis)
• 支持的数据类型。纯key-value/哈希,列表,集合,有序集合
• 持久化支持。无/有
• 高可用支持。需要二次开发/集群和sentinel哨兵
• 存储value容量。1M/512M
• 内存分配。预分配/临时申请空间,可能导致碎片
• 虚拟内存使用。所有数据存储在物理内存里/有自己的VM机制,理论上可以存储比物理内存更多的数据,当数据超量时,会触发swap,把冷数据刷到磁盘上
• 水平扩展支持。暂无/redis cluster可以横向扩展
• 过期策略。懒淘汰机制/专门线程清除缓存数据
• 单机QPS。60W/10W
• 源代码可读性。可能考虑太多扩展性,多系统的兼容性,代码不清爽/代码清爽简洁
• 适用场景。纯Key-Value,数据量非常大,并发量非常大的业务/复杂数据结构,有持久化,高可用需求,value存储内容较大
工作机制
• 内存分配机制:预分配
page默认1M,里面分chunk(每个page里面的chunk大小递增默认1.25递增)。slab class:slab按照chunk的大小分组。
• 懒过期。不会监控数据是否过期,取数据时才看是否过期,过期了标识为0,以后可以覆盖存储其他数据
• LRU。当内存不足时,会根据最近最少使用的淘汰
• 集群,客户端集群,memcache不支持集群。
yum安装,修改services文件里面的环境变量配置文件修改绑定的地址
memcached开发库和工具
• dnf repoquery -l libmemcached
• memping --server=10.0.0.7测试memcached是否存活
• memstat --server=10.0.0.7查看memcached的状态
set设置,add添加,replace修改,get获取,delete删除,五种基本命令
前三个命令是操作存储在memcached中键值对的标准修改命令语法如下:
• command <key> <flags> <expiration time> <bytes>回车后输入值
<value>
repcached项目,用官方memcached二次开发,使其具有数据同步功能。实现memcached之间数据同步。前端使用keeplived和Haproxy或者nginx来实现
部署repcached,./configure --prefix=/apps/repcached --enable-replication
• make编译报错解决方法,修改memcached.c文件,删除原有的57,59行。
启动memcached时加上-x选项实现双向复制
阿里云
阿里云概述及建站
• 申请域名
• 准备计算资源存储资源
• 备案
• 构建环境
• 发布网站
• yum install lrzsz就可以使用rz命令传文件
• nginx做负载均衡,实现网站安全https,购买证书
• 安全组放行入方向端口规则
阿里云RDB(关系型数据库)
• 流程:创建实例、设置白名单、申请外网地址、创建数据库、创建账号、连接并使用数据库
• 使用RDS来做WordPress的数据库
阿里云SLB(负载均衡器)
• 实现四层、七层负载均衡
• 可以添加转发策略
阿里云VPC+OSS(网络和对象存储)
• 同vpc下不同子网默认互通
• vpc网络默认不互通,实现互通
• bucket桶的使用
• MPS多媒体,视频转码
阿里云SDK(开发工具)
• RAM创建账号,保存accesskeyid,accesskeysecret
• 代码方式:在OpenAPIExplorer里面找到可视化调试,可在示例代码复制下来,填写上面的用户信息即可完成查询,创建ECS等资源
• 命令方式:在OpenAPIExplorer里面找到命令行工具集aliyun help获取命令帮助
监控服务Zabbix
zabbix规划及部署
• 部署环境ubuntu18.04.3或者centos7.x
• zabbix server(101)
• zabbix主动代理(102)
• zabbix被动代理(103)
• mysql master(104)
• mysql slave(105)
• web server1(106)
• web server2(107)
• 包安装及源码安装
• services文件开机自启
• 安装并配置语言包
• zabbix server 端口10051
• zabbix agent 端口10050
zabbix监控linux主机
zabbix配置文件详解
基于java gateway监控tomcat服务
• 默认端口10052
• 修改zabbix server配置文件,配置java gateway地址端口
• tomcat开启JMX监控,使用12345端口
• 在被监控主机添加JMX模板
zabbix主动与被动监模式
• 主动被动是对agent来说的
• 被动模式是zabbix周期性向agent的10050发起连接采集数据,默认模式。缺点zabbix压力大
• 主动模式是agent主动向zabbix的10051端口发起连接来获取监控项和采集周期
• 主动模式是由模板决定的
• 修改agent配置文件,指向主动的地址是zabbix server(因为没有使用代理),hostname指向自己
• 全克隆模板,监控项,类型,修改为主动模式
监控服务介绍
• 常见的开源监控方案
• cacti:网络流量监控及分析工具
• nagios:监控系统和网络
• smokeping:网络性能监控
• open-falcon:小米公司开源监控软件
• zabbix:监控网络与服务
• prometheus:容器环境监控
• 商业的监控方案
• 监控宝
• 听云
zabbix使用场景及概述
• zabbix是一个企业级解决方案支持实时监控数千台服务器,虚拟机和网络设备,采集百万级监控指标,适用于任何IT基础架构、服务、应用程序和资源的解决方案
• 使用场景:网络,服务,云,应用,服务,web监控,存储设备,虚拟机,java应用程序,数据库
短信发送功能,阿里大鱼,漫道科技
zabbix核心任务
• 数据采集
• 数据存储
• 数据展示:zabbix web,grafana
• 告警通知
zabbix proxy主被动详解和实现
架构演变
java gateway编译安装配置
面试必考:tcp三次握手四次挥手,数据库主从原理及实现
自定义监控项之linux端口tcp状态监控
• 通过命令或脚本来获取被监控数据
• 在agent配置文件修改UserParmeter
• 在zabbix server主机使用zabbix_get命令测试获取指定被监控数据
• 在zabbix web添加监控项和图形
• tcp有11种状态,在web添加11次监控项,导出为模板备用,后期可以给其他主机使用
自定义监控之memcached服务监控
自定义模板
自定义监控之redis服务监控
自定义监控之nginx服务监控
邮件通知
• 先有监控项,再根据监控项配置触发器
• 配置,报警媒介类型:电子邮件,短信,微信
• 配置,用户,报警媒介,配置收件人
• 配置,动作,调用报警媒介类型,发送信息或执行什么操作。
SNMP监控网络设备
• 在centos上安装net-snmp服务模拟网络设备
• 配置snmp配置文件,修改团体名称
• 重启snmp服务设置开机自启
• 安装net-snmp-utils包,snmpwalk命令测试能否拿到监控数据
• 在zabbix添加主机,snmp接口,udp161端口
• 关联模板,修改linux snmp v2模板的宏,继承模板的宏,修改团体名称
web监控
• 配置,主机,web监控,web场景,步骤,配置需要监控的网址和超时时间
• 触发器,添加触发器,触发条件状态码不等于200触发
故障自治愈功能
• 开启zabbix agent主机上的sudu权限,也就是授权zabbix用户执行特权命令
• zabbix agent主机开启远程命令和允许特殊字符
• 创建动作
• 执行远程操作
• 验证故障自治愈
故障分层报警,分类报警
zabbix基于percona监控mysql和自定义监控项监控mysql
聚合图形及grafana结合zabbix实现图形显示
zabbix实现短信通知
• 发送短信运营商:云片网(杰哥视频使用),阿里大鱼,漫道科技。均可。
• 实现步骤:
1. 添加短信报警媒介类型
2. 给用户创建报警媒介
3. 创建短信通知的动作
4. 配置短信发送具体内容
5. 配置恢复操作
6. 验证动作状态
7. 测试短信报警
zabbix实现微信报警通知
• 注册企业微信,在手机上安装企业微信
• 企业微信创建应用,添加微信成员
• 应用,发送信息测试,可以在微信上,或者企业微信上查看信息
• 编写python脚本,调用企业微信发信息
• 创建相应的报警媒介类型,用户里面创建相应的报警媒介,创建动作
• 停服务模拟故障测试
zabbix agent实现批量自动安装
• 编写脚本,准备源码包,services文件,agent配置文件,自定义监控的脚本和子配置文件的目录,打包
• 拷贝以上文件到目标主机
• ssh-keygen;ssh-cooy-id做好互信
• ssh 目标服务器 执行切换目录,解压,执行脚本。即可远程安装
zabbix api使用及批量添加主机案例
• zabbix server开启自动发现(扫扫描太慢大量消耗server性能,导致数据收集延时,不推荐),并且默认主机名是ip地址,不能自定义主机名称,不能区分业务,后期还要修改主机名及关联业务监控模板blogs.studylinux.net/?p=705
• zabbix api批量添加主机
DevOps之基于jenkins的CI与CD
jira,禅道
devops不能简单的认为是一种工具,方法,技能或组织机构。devops架构是结合所以这些元素来建立一个流水线的过程,使业务更快的运营并能更快的应对变化。
devops的目标是建立流水线式的准时制(JIT)的业务流程。devops旨在通过合适的准时制业务流程来最大化业务产出,例如增加销售和利润、提升业务速度、或尽量降低运营成本。
规范敏捷
持续交付
IT服务管理
以TPS(精益管理Lean)理念为基础
CI持续集成
CD持续部署
戴明环
• dev
• plan计划:JIRA,GitLab
• code代码:git
• build构建:maven
• test测试:selenium
• ops
• release发布:jenkins
• deploy部署:salkstack
• operate营运:ELK
• monitor监控:zabbix
常见的持续集成开源工具
• CVS早期的集中式的版本控制系统(现在已经淘汰)
• SVN集中式版本控制系统
• GitLib分布式版本控制
git是linus开发的分布式版本控制系统的服务,也是一个命令,一个工具
github基于git实现的在线代码仓库。为所有开源爱好者、企业提供的免费的代码存储分享
gitlab基于git实现的代码仓库。是为企业提供的开源免费的私有的分布式代码仓库
gitlib 是用于实现git功能的开发库
gitlab针对开发实现持续集成
• gitlab安装
• gitlab使用之group,user,project管理
▪ gitlab命令使用,代码上传与下载
• 常用命令
• gitlab-rails dbconsole
• gitlab-psql
• gitlab-rake
• gitlab-cli
• 关闭注册功能,免得产生废账号,由运维工程师创建
• 创建账号(人名)
• 创建组(项目名)
• 创建项目,关联组
• git clone下载
• git add添加到本地
• git commit提交
• git push推送到代码仓库
• git config配置
• git status查状态
• git pull拉代码,更新不同的文件
• git log看日志
• vim .gitignore定义忽略文件,一般由开发来写,定义不往web服务上部署的文件。定义后本地git push不往上传到gitlab服务器
• git reset --hard HEAD^^回滚
• git reflog获取每次提交的id,根据--hard提交的id进行版本回退
• git brance查看当前所处分支
• git checkout -b develop创建并切换到一个新的分支
• git checkout develop切换分支
• 工作区:clone的代码或者开发自己编写的代码文件所在目录。
• 暂存区:用于存储在工作区中对代码进行修改后文件所保存的地方。git add添加。
• 本地仓库:用于提交存储在工作区和暂存区中改过的文件的地方。git commit提交。
• 远程仓库:多个开发共同协作提交代码的仓库。即gitlab服务器。
• gitlab数据备份
1. 停止gitlab数据服务:gitlab-cli stop unicorn ; gitlab-cli stop sidekiq
2. 手动备份数据:gitlab-rake gitlab:backup:create ; gitlab-ctl start
3. 查看备份的文件:/var/opt/gitlab/backups/目录下
4. 恢复:先停俩服务,在执行恢复gitlab-rake gitlab:backup:restore BACKUP=备份文件(只要前面一半名称,写到版本号),再启动服务
• gitlab汉化
1. 停所有gitla服务
2. 查看gitlab版本
3. 在社区下载对应版本的汉化包
4. 备份原来的英文文件目录/opt/gitlab/embedded/service/gitlab-rails/*
5. 解压汉化包并把所有文件拷贝到相应目录
6. gitlab-ctl reconfigure
7. gitlab-ctl start
• 源文件汉化
1. 找到文件,在gitlab克隆下来源码
2. git diff v11.11.8 v11.11.8-zh >/root/v11.11.8-zh.diff
3. 停服务gitlab-ctl stop
4. patch -f -d /opt/gitlab/embedded/service/gitlab-rails/ -p1 </root/v11.11.8-zh.diff
5. gitlab-ctl reconfigure
6. gitlab-ctl start
• 常见代码部署方式
a. 蓝绿部署(准备两套环境,一套在线,另一套环境升级,测试没问题后切换负载均衡的流量到新版本环境)
b. 金丝雀发布(灰度升级,断开其中一个服务器做版本升级,升级后上线,调整负载均衡策略,讲少部分用户调度到新版本服务器使用,确认没问题后将其他服务器升级)
c. 滚动发布(先升级1个,再升级一个,直到所有升级完成)
d. A/B测试(两套环境在线,测试受欢迎程度)
• 企业标准化web环境部署
1. 两台主机部署keeplived和haproxy
2. 三台主机部署tomcat服务
jenkins针对运维实现持续部署
• jenkins部署与基础配置
• 在上面的'企业标准化web环境部署'环境基础上,用另外三台主机部署分布式jenkins
• hudsn是jenkins的前身
• jenkins离线问题解决,修改地址为清华大学地址,重启jenkins
• 安装插件慢,通过nginx的rewrite,将安装插件的请求通过清华大学镜像服务器实现插件安装加速
• jenkins默认端口8080
• 安装推荐使用rpm或者deb包安装,通过守护进程启动。
• 了解:使用java命令启动。使用tomcat启动jenkins
•
• 安装gitlab插件
• 安装role-base插件,支持多用户管理。
1. 全局安全配置,授权策略修改为role-base strategy。
2. 创建laomao,laoxiao用户,创建对应linux39_app1,linux39-app2,magedu-app1,magedu-app2项目
3. 系统管理,管理角色,global roles,创建 role,linux39,只给一个read权限
4. 在item roles添加laomao角色,匹配linux39.* 添加laoxiao角色,匹配magedu.*这里实际控制权限,给任务和运行等权限
5. 系统管理,分配角色,在global roleroles,添加laomao,laoxiao用户,关联全局角色linux39。在item roles中,添加laomao,laoxiao用户,关联laomao,laoxiao角色
• 邮件通知配置
1. 系统管理,系统配置,系统管理员邮件,最下面邮件通知。比如任务中,构建后可以发个邮件通知。
• jenkins实现代码clone(非交互式)
▪ 通过shell命令或脚本clone
a. 在jenkins服务器上执行ssh-kegrn生成密钥对,把公钥放到gitlab上。具体在gitlab页面,设置,ssh密钥。这样使用ssh clone就不需要使用密码了。
b. 在jenkins任务中,构建,选shell,cd值得目录&&删除web1目录&&git clone代码,执行任务,查看结果
▪ 通过jenkins clone
a. 因为是jenkins程序clone没办法直接用私钥去连接gitlab。在jenkins,凭据,系统,全局凭据,添加凭据,ssh username with private key,username:root,把服务器上的.rsa私钥文件放进来。这样就可以和gitlab上的公钥连接了。
b. 构建任务,在源码管理选git,url填写gitlab的ssh克隆地址。credentials:root。下面shell,对代码打包,scp到各个web服务器,停服务,代码替换,启动服务。
•
• gitlab分支管理,代码合并,实现master和develop分支代码部署
• keeplived分两个地址,分别给开发测试和生成环境登录,haproxy分为两个反向代理。git clone -b develop gitlab地址。
•
• jenkins触发器。在jenkins安装hook和认证插件,job中配置触发器,生成密码,在gitlab使用钩子,勾选开发分支版本库更新触发钩子(建议在开发分支使用钩子,生产环境选分支合并,但不不要使用)
• 项目关联。job拆分,第一个job构建后操作,构建其他工程。第二个一样。依次关联其他job
• jenkins视图应用示例。blue ocean插件的视图。jenkins,新建视图,列表视图,来区分各种项目的job。build pipeline插件,会在列表视图上面多一个视图。
•
• jenkins分布式实现代码部署和回滚
1. 系统管理,节点管理,新建节点,来添加slave节点。(需要被添加节点安装java8)
2. jenkins agent需要生成密钥对,拷贝公钥到后端web节点,实现免密登录来拷贝代码,部署代码
3. 回滚,新建一个job,ssh命令中添加一条删除压缩包,git reset --hard HEAD^来回滚到上一个版本
• pipeline流水线
• pipeline是帮助jenkins实现CI到CD转变的重要角色,是一套运行在jenkins上的工作流框架,将原本独立运行的单个或多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而实现单个任务很难实现的复杂流程编排和任务可视化,pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本。
• pipeline语法:声明式和脚本化的流水线语法,stage阶段,node节点,step步骤
• pipeline优势:可持续性,支持暂停,可扩展,并行执行。
• 基于pipeline的代码部署。可以看到每个步骤执行时间。创建job时选择流水线,将之前的shell任务替换为pipeline语法执行。
• 历史构建记录配置。job,通用配置,丢弃旧的构建。
▪ Sonarqube代码质量检测工具
• 代码clone后进行代码质量检测
• 七个纬度检测代码质量
a. 代码复杂度
b. 重复代码
c. 单元测试统计
d. 代码规则检查
e. 注释率
f. 潜在的bug
g. 结构与设计
• SonarQube安装
• 7.9LTS版本,服务端需要java11,客户端兼容java8和java11。并且不再支持mysql。不能root用户启动
• linux系统上必须打开内核参数和资源限制:运行sonarqube的用户可以打开65536个文件描述符和4096个线程。vm.max_map_count大于等于262144。fs.file_max大于等于65536
• 安装步骤:
1. 安装java11
2. 安装并配置Postgresql,更改监听地址和远程访问权限,数据库账号授权
3. 部署sonarqube,配置账号密码和地址
4. 启动服务
• sonarqube通过命令实现代码质量扫描
1. 修改sonar-scanner的配置文件,指定server端地址。
2. 进入代码目录,编辑sonar-projrct.properties文件指定扫描目录级使用py或其他模块
3. 在sonar-projrct.properties同级目录执行sonar-scanner的程序即可扫描。
• jenkins调用sonarqune实现代码扫码
1. 添加sonarqube server地址
2. 配置sonar-scanner扫描器,jenkins安装sonar-scanner或者指定路径调用已安装的sonar-scanner
3. 进行扫描配置,将sonar-projrct.properties文件内容贴到网页中的配置框里
▪ 推荐在构建shell界面直接添加一条命令进行扫描,也就是使用sonarqube通过命令实现代码质量扫描
▪
• jenkins实现devops自动化部署回退流程
• 在job的general,勾选'参数化构建过程'。
a. 选项参数。(实现服务器分组)名称GROUP,选项GROUP1,GROUP2,GROUP3。脚本中判断$1是GROUP1,变量hostip等于哪些服务器,中间空格隔开。循环在这些服务器中执行操作。
b. 字符参数。(实现选择分支来实现代码clone)名称:BRANCH,默认值develop(后面可以改为master)
c. 构建,执行shell。命令:bash 脚本 $GROUP $BRANCH来传递参数
消息队列RabbitMQ
rabbitmq简介
• MQ的目的是为了实现各个app之间的通信,跨网络通信,因此MQ实现了业务的解耦和异步机制。
• 先进先出,分流
• 特点:削峰填谷,系统解耦,提升性能,蓄流压测
• 目前主流的消息队列软件有RabbitMQ,kafka,ActiveMQ,RocketMQ等还有小众的消息队列软件如ZeroMQ,Apache Qpid等
• rabbitmq采用erlang语言开发,erlang在分布式编程和故障恢复方面表现出色,电信领域广泛使用。
a. Broker: 接收和分发消息的应用
b. Virtual host: 出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚 拟的分组中,类似于网络中的 namespace概念
c. Connection: publisher/consumer 和 broker 之间的 TCP 连接。
d. Channel: Channel是在 connection 内部建立的逻辑连接 channel之间是完全隔离的。
e. Exchange: message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
f. Queue: 消息最终被送到这里等待 consumer 取走。
g. Binding: exchange 和 queue 之间的虚拟连接
rabbitmq集群实现
• RabbitMQ 单机部署:
1. 主机名解析:
2. 服务器安装 RabbitMQ:
3. 启动 RabbitMQ 服务:
4. RabbitMQ 插件管理:
5672:消费者访问的 端口
15672:web 管理端口
25672:集群状态通信端口
新建用户,给管理员权限才能登陆管理界面
• RabbitMQ 集群部署:
普通模式:
镜像模式:
内存节点:
磁盘节点:
1. 各服务器关闭 RabbitMQ
2. 多台机器.erlang.cookie文件保持一致
3. 各服务器启动 RabbitMQ
4. 停止 app 服务
5. 清空元数据
6. 将 rabbitmq-server1、2 添加到集群当中
7. 将集群设置为镜像模式
zookeeper
• zookeeper最早源于雅虎研究院的一个研究小组。雅虎开发的一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。
• zookeeper。注册中心(服务发现)
• zookeeper加kafka。物理机和虚拟机时代,可以通过固定的ip地址调用其他服务。但是容器环境下,ip地址是随机变化的,就不适合固定的ip调用,就需要使用注册中心来实现服务的发现。
• zookeeper使用场景:
1.命名服务
2.状态同步
3.配置中心
4.集群管理
• zookeeper实现
1.安装jdk8
2.下载zookeeper并解压
3.配置zoom.cfg,修改数据目录,默认端口2181
4.zkserver.sh脚本启动服务
• zookeeper集群实现
1.配置文件添加server.1=ip:2888:3888。2888为数据同步端口,3888为选举通告端口
2.echo 1 >/apps/zookeeper/date/myid
3.启动zookeeper
4.zookeeper.out日志选举过程
• 命令行zkCli.sh
1.create /node1 "ip:端口"
2.delete /node1
• zookeeper客户端zoolnspector
• 集群选举
leader 选举过程:
当集群中的 zookeeper 节点启动以后,会根据配置文件中指定的 zookeeper 节点地址进行 leader 选择操作,过程如下:
1.每个 zookeeper 都会发出投票,由于是第一次选举 leader,因此每个节点都会把自己当做 leader 角色进行选举,每个 zookeeper 的投票中都会包含自己的 myid 和 zxid,此时 zookeeper 1 的投票为 myid 为 1,初始 zxid 有一个初始值,后期会随着数据更新而自动变化,zookeeper2 的投票为 myid 为2,初始 zxid 为初始生成的值。
2.每个节点接受并检查对方的投票信息,比如投票时间、是否状态为 LOOKING 状态的投票。
3.对比投票,优先检查 xvid,如果 xvid 不一样则 xvid 大的为 leader,如果 xvid相同则继续对比 myid,myid 大的一方为 leader
集群运行一段时间后,为了保证数据的完整性。看事务id比较新的为leader。其他节点向新的leader节点同步数据。
成为 Leader 的必要条件: Leader 要具有最高的 zxid;当集群的规模是 n 时,集群中大多数的机器(至少 n/2+1)得到响应并 follow 选出的 Leader。
心跳机制:Leader 与 Follower 利用 PING 来感知对方的是否存活,当 Leader 无法响应 PING 时,将重新发起 Leader 选举
kafka
• kafka被称为下一代分布式消息系统,有scala和java编写
• kafka用于构建实时数据管道和流应用程序。它具有水平可伸缩性,容错性,快速性。
• kafka最主要的优势是其具备分布式功能、并可以和zookeeper结合实现动态扩容,kafka是一种高吞吐量的分布式发布订阅消息系统。
• kafka角色:broker,topic,partition:每一个分区都有一个broker作为leader和一个broker作为follower,producer,consumer
• kafka集群实现
1.在三台服务器上下载2.4.1安装包,可以和zookeeper复用,需要java环境。
2.解压
3.修改配置文件conf/server.properties。
a.broker.id:不一样即可,可以是ip地址尾数
b.listeners:监听地址,端口默认9092
c.log.dir数据保存目录,可以放在安装目录下的data目录
d.num.partitions:分区数量,改成和kafka服务器一样的数量
e.zookeeper.connect:需要zookeeper维持高可用。三个zookeeper地址都写上
4.启动kafka服务kafka-server-start.sh -daemon 配置文件路径
5.查看日志确认服务启动状态
• zookeeper保存了kafka的元数据,如地址,端口,topic,分区等信息。业务数据保存在kafka上。
• 测试kafka读写数据,使用安装目录下bin目录下的一些脚本测试读写
• kafkatool连接kafka查看数据
• 分区的目的:
1.实现了数据高可用
2.提升了kafka的读写性能
3.存储空间横向扩展
• kafka的更高性能
1.顺序写入
2.零拷贝(读)磁盘读到内核空间,正常应该拷贝到应用程序的用户空间。为了节省时间,零拷贝,直接读到内核内存,构建响应报文,读成功。
3.MMAP内存映射(写)将内核空间的内存直接映射给kafka应用程序用。将数据写到用户空间的内存是即返回写成功,后续由内存写到磁盘。
微服务和dubbo
• 单体服务(单体应用)-->微服务-->容器(docker+k8s)
• 微服务的拆分方式:按照功能横向
• 微服务如何落地---容器
• 微服务如何发现对方---注册中心、服务发现
• 微服务之间如何调用---API
• 微服务如何扩容---服务治理,k8s实现服务编排
• 微服务监控---监控微服务的API等
• 微服务如何实现代码和回滚---CI/CD jenkins+gitlab
• 微服务的日志怎么看---ELK统一收集和展示
• 微服务开发---spring boot致力于开发单个微服务,spring cloud所有微服务的协调,dubbo
• 中间件:zookeeper,kafka,elasticsearch,consul,mysql,redis,mongodb
• 中间件是一种独立的系统软件服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。从这个意义上可以用一个等式来表示中间件:中间件=平台+通信,这也就限定了只有用于分布式系统中才能叫中间件,同时也把它与支撑软件和实用软件区分开来
• 微服务简介
• 基于dubbo的微服务案例。三台zookeeper,n多consumer消费者,n多provider提供者,一个dubboadmin。
• 微服务编译
• maven:对java代码进行编译,编译成功之后会有一个成品,多个成品会放在一个制品库。
• Maven 翻译为"专家"、"内行",是 Apache 基金会旗下的一个纯 Java 开发的开源项目,Maven 是一个项目管理工具,可以对 Java 项目进行构建、解决打包依赖等。
• POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等,在执行任务或目标时,Maven 会在当前目录中查找 pom 文件,通过读取pom 文件获取所需的配置信息,然后执行目标。 Pom 文件中可以指定以下配置:
项目依赖
插件
执行目标
项目构建 profile
项目版本
项目开发者列表相关邮件列表信息
• Nexus是一个强大的 Maven 仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。
• 默认端口8081
• 包括hosted本地库,proxy代理,group组
• 可以创建apt仓库,yum仓库,docker仓库,maven仓库,go仓库,pypi仓库等等
• nexus数据备份,同时备份普通数据和元数据
ELK
• ELK是elasticsearch,logstash,kibana三个软件的组合体,是elastic公司研发的一套完整的日志收集、分析和展示的企业级解决方案。
• elasticsearch集群实现(只能看index和分片,副本)
版本1.x,2.x,5.x,6.x,7.x
磁盘空间,磁盘io:每个服务器磁盘推荐,万转,sas, *8
cpu:2核心以上E5 2660 2.2Ghz
内存:128g/96g
修改配置文件elasticsearch.xml
默认端口9200
修改系统限制
修改jvm.options文件,最大最小内存限制,官方推荐最大30G以内
修改services文件修改内存限制,无限制使用内存
• elasticsearch插件使用
elasticsearch默认使用api查询,不方便运维管理,因此有一些爱好者开发了一些插件来进行elasticsearch集群管理。
elasticsearch-head(需要在配置文件中加入两行,开启允许跨域访问和允许远程访问的地址,默认9100端口,在web界面连接elasticsearch)
kopf(废弃了,只支持到2.x)
cerebro(配置文件中指定elasticsearch地址,也可以界面指定地址连接。默认9000端口)
• 可以通过调用elasticsearch的api,判断elasticsearch状态是green为正常
• logstash使用简介
是一个开源的数据收集引擎,可以水平伸缩,在整个ELK中插件最多,可以接收来自不同来源的数据并统一输出到指定的且可以是多个不同目的地。
• logstash收集日志示例
安装jdk8
安装logstash
测试标准输入到标准输出(-e传参)
测试标准输入到指定文件
测试标准输入到elasticsearch
测试使用配置文件输入输出(-f指定配置文件,-t测试语法)
• kibana(查看elasticsearch数据)
kibana是一款开源的数据分析和可视化平台,他是elastic stack成员之一,使用kibana对elasticsearch索引中的数据进行搜索、查看、交互操作,可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
默认端口5601
修改配置文件,地址和中文
• logstash实现多类型日志收集及分类
收集tomcat日志:tomcat日志转json
if判断,什么日志放到什么elasticsearch的哪个index上
收集java日志:使用multiline模块多行很合并
关于sincedb,记录了收集文件的inode信息
收集nginx日志:将nginx日志转为json。写logstash配置文件时加入codec=>json
收集tcp/udp日志:通常用于在向 elasticsearch 日志补录丢失的部分日志,可以将丢失的日志写到一个文件,然后通过 TCP 日志收集方式直接发送给 logstash 然后再写入到 elasticsearch 服务器。
收集haproxy日志:rsyslog 提供高性能,高安全性功能和模块化设计。可以接受来自各种来源的输入,转换它们,并将结果输出到不同的目的地。
• 防止很多web服务一下子都向elasticsearch提交日志消耗殆尽网络资源。可以先logstash收集日志到redis或者kafka缓存数据,再用logstash把数据从redis写到elasticsearch。
• logstash 收集日志并写入 redis:
用一台服务器按照部署 redis 服务,专门用于日志缓存使用,用于 web 服务器产生大量日志的场景。
• logstash 收集日志并写入 kafka:
• beats收集日志工具,代替logstash。
filebeat,metricbeat,heartbeat,packetbeat,winlogbeat,auditbeat等。
• logstash需要使用java环境,大概需要500多mb内存,而filebeat只需要十几mb内存,不需要java环境,是轻量级的日志收集工具,功能相对比较单一,没有,实现不了日志分类,不能做if判断。
• 使用filebeat收集同一台主机的多种服务日志到redis的同一个key中,再使用logstash把redis的数据取出来,根据不同的fieldstype区分开不同日志写到elasticsearch的不同index中。
• 监控redis数据长度,以免数据一直未取数据过大导致redis内存占用爆满被系统挂掉
• 在后端logstash往elasticsearch上写日志时,加入keeplived和haproxy实现elasticsearch的高可用问题。后期更改elasticsearchip地址了,业务方面也要改地址,重启服务等麻烦。使用haproxy直接改haproxy的配置即可。
• 防止kibana上误删数据,加入nginx反向代理实现认证
• 三个elasticsearch上都有kibana,使用keeplived和haproxy来访问kibana,实现负载均衡。
• -----------------------------
• 日志收集实战:
• 架构规划
• filebeat收集日志转发至logstash
• filebeat收集多类型日志
• 通过haproxy代理kibana
• 通过nginx代理kibana并实现登录认证
• 通过坐标地图统计客户ip所在城市
• 日志写入数据库
• -----------------------------
kubernetes
• kubernetes简称k8s(中间八个字母)
• k8s核心优势
基于yaml文件实现容器的自动创建、删除
更快速实现业务的弹性横向扩展
动态发现新扩容的容器并自动对用户提供访问
更简单、更快速的实现业务代码的升级和回滚
container storage interface(CSI)
container network interface(CNI)
container runtime interface(CRI)
container volume interface(CVI)
master节点和node节点。
master节点不保存数据,数据放在etcd集群。
node节点运行容器。
防止master受容器负载影响,master节点不运行容器。
master节点有kube-Controler-manager,kube-scheduler,kube-apiserver。
node节点有kube-proxy,kubelet。
组件介绍
kube-apiserver:Kubernetes API server 为 api 对象验证并配置数据,包括 pods、 services、replicationcontrollers和其它 api 对象,API Server 提供 REST 操作,并为集群的共享状态提供前端访问 入 口,kubernetes中的所有其他组件都通过该前端进 行 交互。
pods:在k8s里面运行容器的最小单元。k8s如果想替换CRI,CVI,替换替换容器技术,只需要将pod使用相关技术封装即可。
services:实现了从宿主机外层访问k8s内部不同宿主机上多个容器的访问方式,而且实现pod的动态发现,因此可以说service是k8s内部的负载均衡器,service的实现早期使用iptables,在k8s 1.11之后支持使用ipvs。
replicationcontrolers(早期的pod控制器)/deployment(现在主流的pod控制器):pod控制器,保证pod正常运行。
kube-scheduler是Kubernetes的pod调度器 ,负责将Pods指派到合法的节点上,kube-scheduler调度器 基于约束和可 用资源为调度队列 中每个Pod确定其可合法放置的节点,kube-scheduler 一个拥有丰富策略 、能够感知拓 扑变化、 支持特定负载的功能组件,kube-scheduler需要考虑独 立的和集体的资源需求、服务质量 需求、硬件/软件/策略 限制、亲和与反亲和规范等需求。
kube-controller-manager:Controller Manager作为集群内部的管理 控制中 心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理 ,当某个Node意外宕机时,Controller Manager会及时发现并执 行 自动化修复流程,确保集群中的pod副本始终处于预期的 工作状态。
kube-proxy:Kubernetes 网络代理 运 行 在 node 上,它反映了 node 上 Kubernetes API 中定义的服务,并可以通过 一组后端进 行 简单的 TCP、UDP 和 SCTP 流转发或者在 一组后端进 行 循环 TCP、UDP 和 SCTP 转发, 用户必须使 用 apiserver API 创建 一个服务来配置代理 ,其实就是kube-proxy通过在主机上维护 网络规则并执 行 连接转发来实现Kubernetes服务访问。
kubelet:是运 行 在每个worker节点的代理 组件,它会监视已分配给节点的pod,具体功能如下:
向master汇报node节点的状态信息
接受指令并在Pod中创建 docker容器
准备Pod所需的数据卷
返回pod的运 行 状态
在node节点执 行 容器 健康检查
etcd 是CoreOS公司开发 目前是Kubernetes默认使 用的key-value数据存储系统, 用于保存所有集群数据, 支持分布式集群功能, 生产环境使 用时需要为etcd数据提供定期备份机制。
apiserver:提供了 资源操作的唯 一 入 口,并提供认证、授权、访问控制、API注册和发现等机制
controller manager:负责维护集群的状态, 比如故障检测、 自动扩展、滚动更 新等
scheduler:负责资源的调度,按照预定的调度策略 将Pod调度到相应的机器 上
kubelet:负责维护容器 的 生命周期,同时也负责Volume(CVI)和 网络(CNI)的管理 ;
Container runtime:负责镜像管理 以及Pod和容器 的真正运 行 (CRI);
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡;
etcd:保存了 整个集群的状态
kube-dns:负责为整个集群提供DNS服务
Ingress Controller:为服务提供外 网 入 口
Heapster:提供资源监控
Dashboard:提供GUI
Federation:提供跨可 用区的集群
Fluentd-elasticsearch:提供集群 日志采集、存储与查询
• k8s部署
kubeadm:部署简单,官方出品。使用场景:开发环境,测试环境。
ansible:推荐github上的kubeasz。kubernetes后期维护方便。
添加master
添加node
升级k8s
• 架构:三个master,两个haproxy加keeplived,一个harbor,三个node节点。
k8s的设计理念-分层架构
云原生生态系统
接口层:客户端库和实用工具
管理层:自动化和策略管理
应用层:部署和路由
核心层:kubernetesAPI和执行环境
(包括容器运行时接口CRI,容器网络接口CNI,容器存储接口CSI,镜像仓库,云提供商,身份提供商)
k8s设计理念-API设计理念
1.所有API应该是声明式的
2.API对象是彼此互补而且可组合的
3.高层API操作意图为基础设计
4.低层API根据高层API的控制需要设计
5.尽量避免简单封装,不要有在外部API无法显式知道的内部隐藏机制
6.API操作复杂度与对象数量成正比
7.API对象状态不能依赖于网络连接状态
8.尽量避免让操作机制依赖于全局状态,因为在分布式系统中要保证全局状态的同步是非常困难的
kubectl命令使用
基础命令:create/delete/edit/get/describe/logs/exec/scale增删改查。explain命令说明。
配置命令:label标签管理。apply动态配置。
集群管理命令:cluster-info/top集群状态。cordon/uncordon/drain/taint node节点管理。api-resources/api-versions/version API资源。config客户端kube-config配置。
k8s几个重要概念
对象 k8s是和什么什么打交道? k8s声明式api
yaml文件 怎么打交道? 调用声明式api
必需字段 怎么声明?
1.apiVersion
2.kind
3.metadata
4.spec
5.status
POD
1.pod是k8s中的最小单元
2.一个pod中可以运行一个或多个容器
3.运行多个容器的话,这些容器是一起被调度的
4.pid的生命周期是短暂的,不会自愈,是用完就销毁的实体
5.一般我们是通过controller来创建和管理pod的
replication controller副本控制器简称rc
1.会自动保持副本数量和文件中一致,
2.监控多个节点上的多个pod
3.与手动创建pod不同的是由rc创建的pod在失败、被删除和被终止时会被自动替换
4.selector = !=
replicaset副本控制集
1.与副本控制器的区别是:对选择器的支持(selector还支持in notin)
2.replicaset下一代的rc
3.确保任何时间都有指定数量的pod在运行
deployment:
1.比rs更高一级的控制器,除了rs的功能之外,还有很多高级功能,比如滚动升级,回滚等
2.它管理replicaset和pod
目录管理
一般在/opt/k8s-data目录下
yaml目录
namespace目录(逻辑隔离)
对应项目的目录
dockerfile目录
service
1.why:pod重启之后ip就变了,pod之间访问会有问题
2.what:解耦了服务和应用
3.how:声明一个service对象
4.一般常用的有两种:
a.k8s集群内的service:selector指定pod,自动创建endpoints
b.k8s集群外的service:手动创建endpoints,指定外部服务的ip,端口和协议
volume
1.why:容器和数据解耦,以及容器间共享数据
2.what:k8s抽象出的一个对象,用来保存数据,做存储用
3.常用的几种卷:
emptydir:本地临时卷
hostpath:本地卷
nfs等:共享卷
configmap:配置文件
daemonset:会在当前k8s集群的每个node创建相同的pod,主要用于在所有的容器执行所有相同的操作的场景
日志收集
prometheus
flannel
pod探针
三种探测方法
execation探测,脚本写好探测命令,执行脚本结果$?返回0正常,其他异常
tcp探测,端口开启正常,否则异常
http探测,url访问状态码大于等于200小于400正常,否则异常
两种探测类型
存活探针:控制pod重启
就绪探针:控制pod从svc的endpoint去掉,恢复正常了会自动加上。一般两种探测结合使用。
HPA自动伸缩pod数量
ansible项目二进制部署k8s
k8s基础组件之kube-dns和coredns
使用方法:server name.namespace name.svc.集群域名后缀
比如:dashboard-metrics-scraper.kubernetes-dashboard.svc.magedu.local
services名称不会变,yaml文件中定义。跨服务调用使用完整域名访问。
master和node节点服务详解
kube-scheduler,提供了k8s各类资源对象,的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。对外暴露6443端口给其他服务访问。监听分127.0.0.1:8080非安全的端口来调用api。
kube-controller-manager,非安全默认端口10252。负责集群内的node,pod副本,ep,ns,服务账号,资源限定的管理,当某个node意外宕机,会及时发现并执行自动化修复流程,确保集群始终处于预期状态。调用kube-api-server本地8080端口进行通信
kube-scheduler,负责pod的调度,在整个系统起到承上启下的作用,负责接受controller manager创建新的pod,为其选择一个合适的node;启下:选择一个node后,node上的kubelet接管pod的生命周期。
调度方法:1是资源消耗最少的节点,2是选择含有指定label的节点,3是选择各项资源使用率最均衡的节点。
kubelet:每个节点都会启动kubelet进程,处理master下发到本节点的任务,管理pod和其中的容器。会在apiserver上注册节点信息,定期向master汇报节点资源使用情况,并通过cAdvisor(顾问)监控容器和节点资源。
kube-proxy:运行在每个节点上,监听apiserver中服务对象的变化,在通过管理iptables来实现网络的转发。不同版本可支持三种工作模式。
service基于iptables和ipvs实现
userspace k8sv1.2及以后已淘汰
iptables,1.1开始支持,1.2开始为默认。kube-proxy监听kubernetes master增加和删除service以及endpoint信息。对于每一个service,kube-proxy创建对应的iptables规则,并将发送到service cluster ip 的流量转发到service后端提供的服务pod的相应端口上。
注意:虽然可以通过svc的cluster ip和服务端口访问到后端pod提供的服务,但是该ip是ping不通的,其原因是cluster ip 只是iptables中的规则,并不对应到一个任何网络设备。ipvs模式的cluster ip是可以ping通的。
ipvs:1.9引入到1.11正式版本。效率比iptables更高,但是需要在节点安装ipvsadm,ipset工具包和加载ip_vs内核模块,当kube-proxy以ipvs模式启动是,kube_proxy将验证节点是否安装了ipvs模块,如果未安装将回退到iptables代理模式。使用ipvs模式,kube-proxy会监视kubernetes service对象和endpoint,调用宿主机netlink接口以相应的创建ipvs规则并定期与kubernetes service对象和endpoint对象同步ipvs规则,确保ipvs状态与期望一致,访问服务时,流量将被重定向到其中一个后端pod,ipvs使用哈希表作为底层数据结构并在内核空间中工作,这意味着ipvs可以更快的重定向流量,并且在同步代理规则时有更好的性能,此外为负载均衡算法提供了更多选项,例如rr,lc,dh,sh,sed,nq等。lsmod |grep vs
就算使用ipvs模式,还是有一些iptables规则,是nodeport到service的转发规则。比如nginx的svc监听宿主机的30012端口,iptables会转发宿主机的30012端口流量到容器的80端口。
etcd服务简介
高可用分布式键值数据库,etcd内部采用raft协议作为一致性算法,etcd基于go语言实现
监听端口2380
etcd增删改查数据etcdctl命令
etcd数据watch机制
etcd数据备份与恢复
网络组件之flannel简介_udp模式不可用
有coreos开源的针对k8s的网络服务,其目的是为解决k8s集群中各主机上pod的相互通信问题,其借助etcd维护网络ip地址分配,并为每一个node服务器分配一个不同的ip地址网段。
同一个k8s集群会给每个pod独一无二的ip地址,会给每一个node分配一个子网。flannel 24位掩码 calico 22位
flannel网络模型(后端),flannel目前有三种方式实现udp,vxlan,host-gw
udp模式:使用udp封装完成报文的跨主机转发。需要cni虚拟网桥转发,flannel.0(overlay网络设备)封装一次容器源目地址,eth0封装一次物理机源目地址,封装两次,到对面宿主机再解封两次。安全性和性能略有不足。
vxlan模式:linux内核在2012年底的v3.7.0之后加入了vxlan协议的支持,因此新版本的flannel也由udp转换为了vxlan,它本质上是一种tunnel隧道协议,用来基于三层网络实现虚拟二层网络。目前flannel的网络模型已经是基于vxlan的叠加(覆盖)网络。
host-gw模型:通过在node节点上创建到达各目标容器地址的路由表而完成报文的转发。因此这种方式要求各node节点本身必须处于同一个局域网(二层网络)中,因此不适用于网络变动频繁或比较大型的网络环境,但其性能好。
vxlan的直连网络模式,route -n 查看少了一层flannel.1的封装。
网络组件之calico使用详解
calico支持更多的网络安全策略,flannel不支持。大多数人认为calico性能略高与flannel
calico是一个纯三层的网络解决方案,为容器提供多node间的访问通信,calico将每一个node节点都当做一个vroute,各节点间通过BGP边界网关协议学习并在node节点生成路由规则,从而将不同node节点上的pod连接起来。
BGP是一个去中心化的协议,它通过自动学习和维护路由表实现网络的可用性,但并不是所有的网络都支持BGP,另外为了跨网络实现更大规模的网络管理,calico还支持ip-in-ip的叠加模型(简称IPIP),通过在各个node间做一个tunnel,再把两个网络连接起来的模式。启用IPIP模式时,将在各个node上创建一个名为tunl0的虚拟网络接口。配置calico的配置文件设置是否启用IPIP,如果公司内部k8s的node节点没有跨网段建议关闭IPIP,直接使用物理机作为虚拟路由器,不再额外创建tunnel。
•
• kubernetes实战案例之nginx+tomcat+nfs实现动静分离web站点
horizontal pod autoscaler HPA控制器简介及实现
手动扩容缩容方法:
修改yaml文件的副本数量
修改dashboard的deployment的pod数量
kubectl scale命令
kubectl edit命令
早高峰晚高峰定时执行扩缩容命令
自动扩容缩容方法:
HPA
管理员执行kubectl autoscale命令设置最小和最大pod数量,基于cpu负载50%来伸缩。这样会配置一个HPA控制器
使用metrices来实现对容器数据的采集,给hpa提供数据。达到目标值50%就扩容
或者使用yaml文件定义HPA
• kubernetes实战案例之基于set image及rollout实现镜像版本升级与回滚
harbor中要有基于tag的不同版本的镜像
升级方式一:kubrctl apply -f x.yaml --recard=true
升级方式二:kubectl set image
kubectl rollout undo只能用于一次回滚
kubectl rollout undo deployment xxx --to-revision=x来实现跨版本回滚
PV和PVC简介
PV(持久卷)基于已有存储ceph,nfs,nas,P是一个全局资源,不属于任何namespace,独立于pod
PVC(将持久卷挂载到pod中),消耗存储资源,是namespace中的资源,基于PV,独立于pod
PV,PVC三种访问模式,RWO,ROX,RWX
PV删除机制:retain(保持数据)、recycle(空间回收)、delete(自动删除)
• kubernetes实战案例之zookeeper集群部署
• kubernetes实战案例之zookeeper集群实现、dubbo实现provider与consumer微服务注册与发现及dubboadmin
• kubernetes实战案例之jenkins、redis及mysql一主多从
基于statefulset来实现如mysql、mongodb集群等有状态服务
statefulset本质上是deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的pod拥有固定的pod名称,启停顺序在statefulset中,pod的名字为网络标识(hostname),还必须要用到共享存储。
• kubernetes实战案例之单个pod多容器实现LNMP运行WordPress
• kubernetes实战案例之基于jenkins与gitlab实现容器代码升级及回滚
• kubernetes实战案例之基于ELK实现容器日志收集与展示
• kubernetes RBAC实现多用户授权
• prometheus简介
prometheus是基于go语言开发的一套开源的监控、报警和时间序列数据库的组合,是由soundcloud公司开发的开源监控系统,prometheus是CNCF(云原生计算基金会)继kubernetes之后毕业的第二个项目,在容器和微服务领域得到广泛的应用,其特点主要如下:
1.使用key-value的多维度格式保存数据
2.数据不使用mysql这样的传统数据库,而是使用时序数据库,目前使用的是TSDB
3.支持第三方dashboard实现更高的图形界面,如grafana2.5.0版本及以上
4.功能组件化
5.不需要依赖存储,数据可以本地保存和远程保存
6.服务自动发现
7.强大的数据查询语句promQL
• prometheus系统架构
prometheus server:主服务,接受外部http请求,收集、存储与查询数据等
prometheus targets:静态收集目标服务数据
service discovery:动态服务发现
prometheus alerting:报警通知
push gateway:数据收集代理服务器(类似zabbix proxy)
data visualization and export:数据可视化与数据导出(访问客户端)
• prometheus(默认端口9090)结合node_expoter(被监控节点安装,默认端口9100)、gragfana展示图形(打开http协议,默认端口3000)。以及cadvisor(默认端口8080)实现对node及pod资源监控
• kubernetes结合alertmanager(默认端口9093)实现报警通知
• 基于haproxy_exporter(默认端口9101)监控haproxy
• prometheus基于operator部署
openstack
mysql 3306
rabbitmq 5672
rabbitmq 网页 15672
memcached 11211
keyston 5000
glance 9292
placement 8778
nova-controller 8774
nova-api 8775
novncproxy 6080
neutron-controller 9696
dashboard 80
cinder 8776
• 脚本快速部署comoute节点
• controller高可用
• 镜像制作
• 实现内外网络
• 跨主机迁移
• opstack基于Keepalived结合haproxy高可用
• cinder云盘实现
• 自服务网络详解,多个自服务网络通信,虚拟机创建流程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具