杂记2023-4-10

Posted 日 近 长 安 远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杂记2023-4-10相关的知识,希望对你有一定的参考价值。

检测和干预keeperalived脑裂的脚本

#!/bin/bash

# 定义变量
VIP="192.168.1.100"
MASTER_IP="192.168.1.101"
BACKUP_IP="192.168.1.102"
INTERVAL=5
STATE_FILE="/var/run/keepalived.state"

# 检测VIP是否被当前节点占用
check_vip() 
    local ip=$(ifconfig eth0 | grep -E "inet addr:[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+" | awk 'print $2' | cut -d ':' -f 2)
    if [[ "$ip" == "$VIP" ]]; then
        return 0
    else
        return 1
    fi


# 检测当前节点是否为主节点
check_master() 
    local state=$(cat $STATE_FILE)
    if [[ "$state" == "MASTER" ]]; then
        return 0
    else
        return 1
    fi


# 检测当前节点是否为备份节点
check_backup() 
    local state=$(cat $STATE_FILE)
    if [[ "$state" == "BACKUP" ]]; then
        return 0
    else
        return 1
    fi


# 检测主节点是否存活
check_master_alive() 
    ping -c 1 $MASTER_IP > /dev/null 2>&1
    if [[ $? -eq 0 ]]; then
        return 0
    else
        return 1
    fi


# 检测备份节点是否存活
check_backup_alive() 
    ping -c 1 $BACKUP_IP > /dev/null 2>&1
    if [[ $? -eq 0 ]]; then
        return 0
    else
        return 1
    fi


# 切换VIP到当前节点
switch_to_me() 
    ifconfig eth0:0 $VIP netmask 255.255.255.255 broadcast $VIP
    echo "MASTER" > $STATE_FILE


# 切换VIP到备份节点
switch_to_backup() 
    ifconfig eth0:0 down
    echo "BACKUP" > $STATE_FILE


# 检测并干预脑裂
while true; do
    if check_vip; then
        if check_master; then
            if ! check_master_alive; then
                switch_to_backup
            fi
        elif check_backup; then
            if check_master_alive; then
                switch_to_me
            fi
        fi
    else
        switch_to_me
    fi
    sleep $INTERVAL
done

此脚本首先定义了一些必要的变量,例如VIP、主节点IP、备份节点IP、检测间隔等。然后,它定义了一些函数来检测当前节点的状态和其他节点的存活状态,并根据需要切换VIP。

在主循环中,脚本首先检查当前节点是否占用VIP。如果是,则检查当前节点是否为主节点。如果是,则检查主节点是否存活。如果主节点死亡,则切换VIP到备份节点。如果当前节点为备份节点,则检查主节点是否存活。如果主节点存活,则切换VIP到当前节点。如果当前节点未占用VIP,则切换VIP到当前节点。

通过这种方式,脚本可以检测和干预keeperalived脑裂,确保VIP始终被正确地分配到活动节点.

常见的HTTP状态码

1xx(信息性状态码):服务器收到请求,需要进一步处理才能完成请求。

  • 100 Continue:服务器已经收到了请求头,并且客户端应该继续发送请求的请求体。
  • 101 Switching Protocols:服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成请求。

2xx(成功状态码):请求已成功处理。

  • 200 OK:请求成功,服务器已经返回请求的内容。
  • 201 Created:请求成功,服务器已经创建了新的资源。
  • 204 No Content:请求成功,但服务器没有返回任何内容。

3xx(重定向状态码):请求需要进一步操作才能完成。

  • 301 Moved Permanently:请求的资源已经永久移动到新的URL。
  • 302 Found:请求的资源已经暂时移动到新的URL。
  • 304 Not Modified:请求的资源没有被修改,可以直接从缓存中获取。

4xx(客户端错误状态码):请求包含语法错误或无法完成。

  • 400 Bad Request:请求语法错误,服务器无法理解请求。
  • 401 Unauthorized:请求需要用户验证。
  • 403 Forbidden:请求被服务器拒绝。
  • 404 Not Found:请求的资源不存在。

5xx(服务器错误状态码):服务器无法完成请求。

  • 500 Internal Server Error:服务器遇到了意料不到的情况,无法完成请求。
  • 502 Bad Gateway:服务器作为网关或代理,从上游服务器接收到无效的响应。
  • 503 Service Unavailable:服务器暂时无法处理请求,可能是过载或维护中。
  • 504 Gateway Timeout:服务器作为网关或代理,从上游服务器接收到超时响应。

session和cookie有什么区别?

Session和Cookie是Web应用程序中常用的两种技术,它们可以用于在客户端和服务器之间传递信息。下面是它们的区别:

  1. 存储位置不同:Cookie保存在客户端,而Session保存在服务器端。

  2. 安全性不同:由于Cookie保存在客户端,所以存在安全隐患。Cookie可以被篡改、伪造、窃取等,而Session则保存在服务器端,相对更加安全。

  3. 存储容量不同:Cookie的存储容量有限制,一般为4KB左右,而Session的存储容量相对较大,可以存储更多的数据。

  4. 生命周期不同:Cookie可以设置过期时间,可以长期保存在客户端,而Session的生命周期由服务器控制,一般在用户关闭浏览器或一段时间不活动后自动销毁。

  5. 作用不同:Cookie主要用于客户端的状态管理,如记住用户名、密码等;而Session主要用于服务器端的状态管理,如用户登录状态、购物车信息等。

总之,Session和Cookie各有优缺点,具体应用要根据实际情况选择。

nginx的四层和七层负载均衡

nginx的四层负载均衡是基于传输层(TCP/UDP)的负载均衡,可以根据IP地址和端口号进行负载均衡,但不能对应用层协议进行深度解析。四层负载均衡主要用于分发网络流量,可以提高系统的吞吐量和可靠性。

nginx的七层负载均衡是基于应用层的负载均衡,可以对HTTP、HTTPS、SMTP等应用层协议进行深度解析,根据协议的特性进行负载均衡。七层负载均衡能够更加精细地控制请求的分发,可以根据请求的内容、用户的IP地址、请求的来源等进行负载均衡。七层负载均衡主要用于分发Web请求,可以提高Web应用的性能和可靠性。

paramiko库、pyyaml、jinja

paramiko库是一个Python实现的SSH协议客户端,可以用来连接和远程管理Linux服务器。它提供了SSH客户端和服务器的实现,支持SSH协议的各种功能,如远程执行命令、传输文件、端口转发等。通过paramiko库,我们可以在Python中编写脚本来管理远程服务器,实现自动化运维。

PyYAML是Python语言的一个YAML解析器和生成器,用于读取和写入YAML格式的数据。YAML是一种人类可读的数据序列化格式,常用于配置文件、数据交换格式和存储数据等场景。PyYAML可以将YAML格式的数据转换为Python对象,也可以将Python对象转换为YAML格式的数据。它具有简单易用、可扩展性强、支持Unicode等特点,被广泛应用于Python项目的配置文件和数据交换等方面。

Jinja是一个Python模板引擎,它可以将数据和html、XML等文本混合在一起,生成动态的文本内容。它的主要用途是生成Web应用程序的HTML页面,但也可以用于生成其他文本格式,如电子邮件、文档等。Jinja的主要功能包括变量替换、条件语句、循环语句、宏定义等,使得模板设计更加灵活。Jinja还支持模板继承、过滤器、自定义标签等高级功能,可以帮助开发者更快速、更方便地构建Web应用程序。

ssh-copy-id -i

ssh-copy-id命令会将公钥添加到远程主机的authorized_keys文件中,如果该文件不存在,则会创建一个新的。如果该文件已经存在,则会将公钥添加到文件的末尾,不会覆盖原有的内容。因此,使用ssh-copy-id -i命令不会覆盖原有的内容。

exportsfs

exportsfs命令用于将文件系统导出为NFS共享,而exportsfs -av命令用于将所有已经导出的NFS共享重新导出一遍。

具体来说,exportsfs命令可以用以下方式导出一个文件系统:

exportsfs /mnt/share

而exportsfs -av命令会重新导出所有已经导出的共享:

exportsfs -av

这个命令会读取/etc/exports文件中的所有共享,并重新导出它们。这个命令通常用于在修改了/etc/exports文件后,重新导出所有共享以使更改生效。

总之,exportsfs命令用于单独导出一个共享,而exportsfs -av命令用于重新导出所有已经导出的共享。

linux内核五大子系统

  1. 进程管理子系统:负责进程的创建、调度、管理和撤销等操作。
  2. 文件系统子系统:负责文件系统的管理和访问,包括文件的读、写、创建、删除等操作。
  3. 网络子系统:负责网络通信相关的操作,包括网络协议栈的实现、网络设备的管理和驱动等。
  4. 内存管理子系统:负责内存的分配、回收、管理和保护,包括虚拟内存管理和页式管理等。
  5. 设备驱动子系统:负责设备的管理和驱动,包括输入设备、输出设备、存储设备、网络设备等。

异地多活

异地多活是一种分布式系统的架构设计,指将同一个系统部署在不同的地理位置的多个数据中心中,每个数据中心都可以独立地提供服务,同时也可以相互协同,使得整个系统具有更高的可用性和容错性。这种架构设计可以避免单点故障,降低系统故障的影响范围,提高系统的可靠性和性能。常见的异地多活应用包括云计算、电子商务、金融交易等领域。

python杂记

  • python命名规范:
  1. 类名:驼峰命名
  2. 函数和方法名:小写_和_下划线

 

  • 判断数据data的编码方法:
  1. type(data) == unicode

 

  • json文件中可以使用字典和列表。字典转json串:dump/dumps;json串转字典:load/loads(带有s就是和字符串沾边,不带s和文件对象沾边)

 

  • 获取环境变量:
1 >>>import os
2 >>>os.environ  #获取所有环境变量
3 >>>os.environ.get(“dade”)   #获取环境变量”dade”的值

 

  • 字典的get操作:
  1. print info[‘id‘]                         # 通过key取值
  2. print info.get(‘id‘)                        # 通过key取值

用中括号取值和get方法取值的区别 ,get方法获取不到key的时候不会报错,中括号取值找不到key会报错,所以get方法更常用。get方法还可以多传一个参数,如果get不到key的话,那么返回这个参数值。如果不写的话,默认get不到返回None。

  1. print all.keys()       #获取该字典的所有key。将返回一个字典中所有关键字组成的无序列表(如果想要排序,只需使用sorted(all.keys()))。使用 in 关键字,可以检查字典中是否存在某个关键字
  2. print all.values()    #获取该字典所有的value
  3. print all.items()      #获取字典的key和value,循环的时候用

 

  • assertEqual(self, excepted, observed, message=’’)
    excepted:期望值;observed:实际值;如果excepted和observed相等,则通过;msg为失败时打印的信息

 

  • 模块的模块名:通过全局变量 __name__ 得到

 

  • 内置函数 dir(模块名) 用于按模块名搜索模块定义,它返回一个字符串类型的存储列表

 

  • .format() 基本用法

1. 基本用法:

1 >>> print "wr are the {} who say {}!".format("knights","Ni")
2 wr are the knights who say Ni!

2. 大括号和其中的字符会被替换成传入 str.format() 的参数。大括号中的数值指明对象中的哪一个:

1 >>> print "{0} and {1}".format(span,eggs)
2 span and eggs
3 >>>
4 >>> print "{1} and {0}".format(span,eggs)
5 eggs and span

3. 也可以通过参数名来引用值:

1 >>> print "This {food} is {adjective}.".format(food="spam",adjective="absolutely horrible")
2 This spam is absolutely horrible.

4. 位置参数和关键字参数可以随意组合:

1 >>> print "The story of {0}, {1}, and {other}.".format("Bill","Manfred",other="Georg")
2 The story of Bill, Manfred, and Georg.

 

  • pip
  1. pip show:将会显示一个指定的包的信息 (例如:pip show requests)
  2. pip list:将会列出所有安装在虚拟环境的包(例如:pip list)

 


以上是关于杂记2023-4-10的主要内容,如果未能解决你的问题,请参考以下文章

运维杂记-02

运维杂记-05

Linux运维的Bash指南,11条Bash实践经验!

最全的Linux运维bash脚本常见用法总结

帮助Linux运维十分钟完成 Bash 脚本进阶!Bash经典用法及其案例详解列举!

运维基础--Linux中bash的基础特性