博客

  • Supervisord 进程管理工具

    Supervisord 进程管理工具

    Supervisor 是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能

    安装

     # pip install supervisor
    Collecting supervisor
      Downloading https://files.pythonhosted.org/packages/ca/1f/07713b0e1e34c312450878801d496bce8b9eff5ea9e70d41ff4e299b2df5/supervisor-4.1.0-py2.py3-none-any.whl (318kB)
         |████████████████████████████████| 327kB 10.1MB/s
    Installing collected packages: supervisor
    Successfully installed supervisor-4.1.0
    

    配置

    1. systemctl 服务

    https://github.com/selboo/config/blob/master/usr/lib/systemd/system/supervisord.service

    # wget https://raw.githubusercontent.com/selboo/config/master/usr/lib/systemd/system/supervisord.service -O /usr/lib/systemd/system/supervisord.service
    
    1. supervisord.conf 配置

    https://raw.githubusercontent.com/selboo/config/master/etc/supervisord.conf

    完整配置可以使用 echo_supervisord_conf 命令生成
    这里我,按照自己需求简单修改了下

     # wget https://raw.githubusercontent.com/selboo/config/master/etc/supervisord.conf -O /etc/supervisord.conf
    

    supervisord.conf的配置参数较多,下面介绍一下常用的参数配置,详细的配置及说明,请参考官方文档介绍。

    unix_http_server]
    file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 会使用
    ;chmod=0700                 ;socket文件的mode,默认是0700
    ;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid
    
    ;[inet_http_server]         ;HTTP服务器,提供web管理界面
    ;port=127.0.0.1:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
    ;username=user              ;登录管理后台的用户名
    ;password=123               ;登录管理后台的密码
    
    [supervisord]
    logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
    logfile_maxbytes=50MB        ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
    logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份
    loglevel=info                ;日志级别,默认info,其它: debug,warn,trace
    pidfile=/tmp/supervisord.pid ;pid 文件
    nodaemon=false               ;是否在前台启动,默认是false,即以 daemon 的方式启动
    minfds=1024                  ;可以打开的文件描述符的最小值,默认 1024
    minprocs=200                 ;可以打开的进程数的最小值,默认 200
    
    [supervisorctl]
    serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
    ;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord
    
    1. 启动 supervisord
    # systemctl daemon-reload
    # systemctl enable supervisord.service
    # systemctl restart supervisord.service
    

    添加 Program

     # cat /etc/supervisor.d/program_tail.conf
    [program:tail]
    command=sh -c "tail -F -q /var/log/messages"
    stdout_logfile=/var/log/program_tail.log
    stdout_logfile_maxbytes=128MB
    stdout_logfile_backups=5
    stderr_logfile=/var/log/program_tail.error
    numprocs=1
    autostart=true
    autorestart=false
    startsecs=3
    stopsignal=INT
    stopasgroup=true
    killasgroup=true
    stopwaitsecs=10
    directory=/etc
    user=nobody
    priority=999
    
    ; [program:xx]是被管理的进程配置参数,xx是进程的名称
    [program:xx]
    command=sh -c "tail -F -q /var/log/messages"    ; 程序启动命令
    autostart=true                                  ; 在supervisord启动的时候也自动启动
    startsecs=10                                    ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
    autorestart=true                                ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
    startretries=3                  ; 启动失败自动重试次数,默认是3
    user=tomcat                     ; 用哪个用户启动进程,默认是root
    priority=999                    ; 进程启动优先级,默认999,值小的优先启动
    stopwaitsecs=10               ; stop 等待多长时间, 超过后发送 SIGKILL 信号
    redirect_stderr=true            ; 把stderr重定向到stdout,默认false
    stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默认50MB
    stdout_logfile_backups = 20     ; stdout 日志文件备份数,默认是10
    stdout_logfile=/var/log/program_tail.log
    stopasgroup=false               ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
    killasgroup=false               ;默认为false,向进程组发送kill信号,包括子进程
    

    supervisorctl update tail 启动 tail 服务

    supervisorctl 命令

    1. 查看帮助
      help
      help
    2. 关闭supervisord
      shutdown
    3. 重载配置文件并重启supervisord和program
      reload
    4. 读取当前运行配置和program配置文件的差异
      reread
    5. 重载配置文件并重启受影响的program
      update
    6. 重启program(不会重载配置文件)
      restart
      restart
      restart all
    7. 清空program日志
      clear
      clear
      clear all
    8. 前台显示program(Ctrl+C退出)
      fg
    9. 显示supervisord或program ID
      pid
      pid
      pid all
    10. 启动program
      start
      start
      start all
    11. 停止program
      stop
      stop
      stop all
    12. 查看program状态
      status
      status
      status
    13. 输出program最新日志(默认stdout,Ctrl+C退出)
      tail [-f] [stdout|stderr] (default stdout)
    14. 输出supervisord最新日志(Ctrl+C退出)
      maintail [-f]

    转载请注明:爱开源 » Supervisord 进程管理工具

  • Nginx 代理 Gravatar头像服务

    Nginx 代理 Gravatar头像服务

    Gravatar 头像服务入口, 都在海外, 经常超时, 所以我们在国内添加入口

    http {
      ......
      proxy_cache_path /dev/shm/proxy_cache_gravatar levels=1:2 keys_zone=ngx_proxy_cache_gravatar:8m inactive=1d max_size=128m;
      ......
    }
    
    server
    {
        listen 80;
        listen [::]:80;
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name gravatar.aikaiyuan.com;
    
        proxy_buffering on;
        proxy_buffer_size 32k;
        proxy_buffers 4 64k;
        proxy_busy_buffers_size 128k;
        proxy_temp_file_write_size  1m;
        proxy_cache ngx_proxy_cache_gravatar;
        proxy_ignore_headers Expires Set-Cookie Cache-Control;
        proxy_hide_header Cache-Control;
        proxy_hide_header Set-Cookie;
        proxy_hide_header Expires;
        proxy_pass_header X-Forwarded-For;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        add_header Aikaiyuan-Cache "$upstream_cache_status from Cache";
    
        ssl_certificate      ssl/gravatar.aikaiyuan.com.crt;
        ssl_certificate_key  ssl/gravatar.aikaiyuan.com.key;
    
        include ssl/main.conf;
    
        include HSTS.conf;
    
        location = /favicon.ico {
            root html;
        }
    
        location /avatar {
    
            valid_referers none blocked aikaiyuan.com *.aikaiyuan.com;
            if ($invalid_referer) {
                rewrite ^/ http://www.aikaiyuan.com/;
            }
    
            proxy_cache_key $host$uri;
            proxy_cache_valid 200 100d;
            proxy_cache_valid 404 2s;
            proxy_redirect / /;
    
            proxy_pass http://secure.gravatar.com;
            proxy_set_header Host "secure.gravatar.com";
            proxy_set_header Accept-Encoding "";
            proxy_set_header User-Agent $http_user_agent;
    
        }
    

    修改主题模版 function.php 添加如下配置:

    //gravatar反代
    function myself_get_avatar($avatar) {
        $avatar = str_replace(array("www.gravatar.com","0.gravatar.com","1.gravatar.com","2.gravatar.com"),"gravatar.liyang.io",$avatar);
        return $avatar;
    }
    add_filter( 'get_avatar', 'myself_get_avatar', 10, 3 );
    

    curl 测试

     # curl -I 'https://gravatar.aikaiyuan.com/avatar/c5d991ee0c6fa4701b4cdd62edd15496?s=72&d=mm'
    HTTP/1.1 200 OK
    Server: openresty
    Date: Mon, 25 Nov 2019 04:18:19 GMT
    Content-Type: image/png
    Content-Length: 6581
    Connection: keep-alive
    Last-Modified: Mon, 04 Nov 2019 07:37:47 GMT
    Link: <https://www.gravatar.com/avatar/c5d991ee0c6fa4701b4cdd62edd15496?s=72&d=mm>; rel="canonical"
    Content-Disposition: inline; filename="c5d991ee0c6fa4701b4cdd62edd15496.png"
    Access-Control-Allow-Origin: *
    X-nc: HIT bur 4
    Source-Age: 1002368
    Expires: Thu, 28 Nov 2019 04:18:19 GMT
    Cache-Control: max-age=259200
    Aikaiyuan-Cache: HIT from Cache
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    Accept-Ranges: bytes
    

    转载请注明:爱开源 » Nginx 代理 Gravatar头像服务

  • CentOS 设置Python 默认版本

    CentOS 设置Python 默认版本

    CentOS 8 默认情况下不安装任何 版本的 Python, 需要管理员自己安装

    • Python 3.6 是 CentOS 8中的默认Python
    • Python 2.7 实现有限支持。

    如果有多个版本,如何设定 默认版本? 可以使用alternatives 控制默认版本

    参考: update-alternatives 管理软件版本

    [root@aikaiyuan ~]# dnf install python2 python3 -y
    [root@aikaiyuan ~]# python2 -V
    Python 2.7.15
    [root@aikaiyuan ~]# python3 -V
    Python 3.6.8
    [root@aikaiyuan ~]# python -V
    -bash: /usr/bin/python: No such file or directory
    [root@aikaiyuan ~]#
    

    Python 3 默认

    [root@aikaiyuan ~]# alternatives --set python /usr/bin/python3
    [root@aikaiyuan ~]# python -V
    Python 3.6.8
    

    Python 2 默认

    [root@aikaiyuan ~]# alternatives --set python /usr/bin/python2
    [root@aikaiyuan ~]# python -V
    Python 2.7.15
    

    转载请注明:爱开源 » CentOS 设置Python 默认版本

  • RHEL 8.0 新特性

    RHEL 8.0 新特性

    内核和支持CPU架构

    Red Hat Enterprise Linux 8.0基于Fedora 28和上游Linux内核4.18版本,为用户提供了跨混合云和数据中心部署的安全,稳定和一致的基础,以及支持所有级别工作负载所需的工具。

    支持的CPU架构是:

    • AMD和Intel 64位架构
    • 64位ARM架构
    • IBM Power Systems,Little Endian
    • IBM Z

    内容分发

    Red Hat Enterprise Linux 8有两种内容分发模式,只需要启用两个存储库。

    • BaseOS存储库 – BaseOS存储库以传统RPM包的形式提供底层核心OS内容,BaseOS组件的生命周期与之前的Red Hat Enterprise Linux版本中的内容相同。
    • AppStream存储库 – Application Stream存储库提供您可能希望在给定用户空间中运行的所有应用程序,具有特殊许可的其他软件可在Supplemental存储库中获得。

    AppStream的解释:

    • AppStream允许您在独立的生命周期中安装其他版本的软件,并使您的操作系统保持最新,同时拥有适合您的用例的正确版本的应用程序,请注意,不能同时将两个流安装到同一用户空间中。
    • 应用程序流通常根据其分发的软件版本命名,例如mongodb:3.4或mongodb:3.6,但也可以使用“latest”,“stable”和“latest”等名称。

    桌面环境

    RHEL 8默认桌面环境是GNOME,GNOME项目由GNOME Foundation支持,RHEL 8中提供的Gnome版本是3.28版本,它可以自动下载Boxes中的操作系统,

    其他新功能包括:

    • 新的屏幕键盘
    • 新的GNOME Boxes功能
    • 扩展设备支持Thunderbolt 3接口的最显着集成
    • GNOME软件,dconf编辑器和GNOME终端的改进
    • GNOME软件实用程序,可用于安装和更新应用程序和gnome-shell扩展
    • GNOME显示管理器(GDM)使用Wayland作为其默认显示服务器,而不是X.org服务器

    附:Wayland显示服务器的特点

    • 更强大的安全模型
    • 改进了多显示器处理
    • 改进的用户界面(UI)缩放
    • 桌面可以直接控制窗口处理

    软件管理

    RHEL 8 YUM软件包管理器现在基于DNF技术:新一代的RPM软件包管理器,它提供对模块化内容的支持,提高的性能以及与工具集成的精心设计的稳定API,RPM的版本是4.14.2,它在开始安装之前验证整个包的内容。

    RHEL 8中提供的YUM版本是v4.0.4,基于DNF的YUM与RHEL 7上使用的先前YUM v3相比具有以下优势:

    • 提高性能
    • 支持模块化内容
    • 精心设计的稳定API,可与工具集成

    Web服务器、Web工具、编译器、语言和数据库

    红帽企业版Linux 8包括多个版本的数据库、语言、编译器和其他可供您使用的工具的应用程序,以下是Red Hat Enterprise Linux 8上可用的组件列表:

    • Python:RHEL 8中的默认Python是Python 3.6版本
    • 数据库服务器:RHEL 8提供的数据库有:MariaDB 10.3、MySQL 8.0、PostgreSQL 9.6、PostgreSQL 10
    • Redis:可用的redis版本是4.0
    • Web服务器:httpd 2.4和Nginx 1.14
    • OpenLDAP由369 LDAP Server取代
    • Varnish Cache 6.0
    • Git 2.17
    • Maven 3.5
    • Perl 5.26和5.24
    • PHP 7.2和7.1
    • Ruby 2.5
    • Node.js 10和8
    • Python 3.6和2.7
    • Rust Toolset 1.26
    • Scala 2.10
    • Go Toolset 1.10
    • GCC编译器8.1
    • .NET Core 2.1
    • Java 8和11
    • Pacemaker集群资源管理器2.0.0,pcs配置系统完全支持Corosync 3,knet和node名称
    • glibc库基于2.28版

    联网

    以下是网络方面的新变化:

    • RHEL 8与TCP网络堆栈版本4.16一起发布,提供更高的性能,更好的可扩展性和更高的稳定性
    • 网络堆栈升级到上游版本4.18
    • Iptables已被nftablesframework取代为默认的网络数据包过滤工具
    • nftables框架是iptablesip6tables、arptables和ebtables工具的指定继承者,这为IPv4和IPv6协议提供了单一框架
    • firewalld守护程序现在使用nftables作为其默认后端
    • 支持IPVLAN虚拟网络驱动程序,支持多个容器的网络连接
    • NetworkManager现在支持单根IO虚拟化(SR-IOV)虚拟功能(VF),NetworkManager允许配置VF的某些属性,例如MAC地址、VLAN、允许的比特率

    虚拟化

    • Red Hat Enterprise Linux 8与qemu-kvm 2.12一起发布 – 支持Q35客户机类型,UEFI客户机启动支持,vCPU热插拔和热插拔,NUMA调优和客户I/O线程中的固定
    • QEMU仿真器引入了沙盒功能,QEMU沙盒为QEMU可以执行的系统调用提供了可配置的限制,从而使虚拟机更加安全
    • KVM虚拟化现在支持用户模式指令防护(UMIP)功能,该功能有助于防止用户空间应用程序访问系统范围的设置
    • KVM虚拟化现在支持5级分页功能,这显着增加了主机和客户机系统可以使用的物理和虚拟地址空间
    • NVIDIA vGPU现在与VNC控制台兼容
    • 在Red Hat支持的所有CPU架构上,KVM虚拟化支持Ceph存储
    • Q35,RHEL 8 Virtualization支持更现代的基于PCI Express的机器类型,默认情况下,在RHEL 8中创建的所有虚拟机都设置为使用Q35 PC机器类型

    网络管理– Cockpit

    • RHEL 8自动安装了Cockpit,Cockpit所需的防火墙端口会自动打开
    • Cockpit界面可用于将基于策略的解密(PBD)规则应用于受管系统上的磁盘
    • 对于在身份管理(IdM)域中注册的系统,Cockpit默认使用域的集中管理的IdM资源
    • Cockpit菜单和页面可以在移动浏览器变体上导航
    • 可以从Cockpit Web界面创建和管理虚拟机
    • 现在可以将“虚拟机”页面添加到Cockpit界面,该界面使用户可以创建和管理基于libvirt的虚拟机

    系统用户

    RHEL 7中可用的用户nfsnobody已经与用户nobody合并到nobody用户和组对,

    其UID和GID为65534,这种更改减少了对任何人拥有但与NFS无关的文件的混淆。

    安全

    RHEL 8支持OpenSSL 1.1.1和TLS 1.3,这使您能够使用最新的加密保护标准保护客户的数据。

    RHEL 8自带了系统范围的加密策略,可帮助您管理加密合规性,无需修改和调整特定应用程序。

    OpenSSH已经改为版本7.8p1,不支持SSH版本1协议,Blowfish/CAST/RC4密码,hmac-ripemd160消息认证码。

    Linux containers

    RHEL 8通过基于开放标准的容器工具包为Linux容器提供企业支持:

    • Buildah有助于构建OCI图像
    • Skopeo用于在Docker注册表,Atomic注册表,私有注册表,本地目录和本地OCI布局目录上共享/查找容器映像
    • Podman用于运行容器而无需守护进程

    注:Buildah和Podman都是用于OCI图像和容器的命令行工具,下面附上Buildah与Podman的不同之处介绍。

    • Buildah的命令复制Dockerfile中的所有命令,实际上只是创建了Buildah容器,以允许将内容添加回容器映像。
    • Podman专注于帮助您维护和修改OCI images的所有命令和功能,例如拉动和标记,它还允许您创建,运行和维护从这些images创建的容器。

    存储和文件系统

    Stratis是RHEL 8的新本地存储管理器,它在存储池之上提供托管文件系统,并为用户提供附加功能,Stratis通过集成Linux的devicemapper子系统和XFS文件系统来提供ZFS/Btrfs风格的功能。

    Stratis支持LUKSv2磁盘加密和网络绑定磁盘加密(NBDE),以实现更强大的数据安全性。
    使用Stratis,您可以轻松执行存储任务,例如:

    • 维护文件系统
    • 管理快照和精简配置
    • 根据需要自动增大文件系统大小

    Pools是从一个或多个存储设备创建的,而卷是从pool创建的,文件系统是在卷上创建的,因此调整卷的大小也会自动调整FS的大小,Stratis使用的默认文件系统是XFS。
    其他值得注意的存储功能包括:

    • XFS文件系统现在支持共享的写时复制数据扩展功能,这使两个或多个文件能够共享一组公共数据块,创建共享副本不会使用磁盘I/O,也不会占用额外的磁盘空间,共享公共块的文件就像常规文件一样
    • 在创建XFS文件系统时,默认情况下会启用共享的写时复制数据扩展区,从xfsprogs软件包版本4.17.0-2.el8开始
    • 在RHEL 8支持的所有体系结构上支持虚拟数据优化器(VDO)
    • LUKS2现在是加密卷的默认格式,这取代了RHEL 7中分发的旧版LUKS(LUKS1)格式,如果遇到部分元数据损坏,LUKS2会为加密卷提供元数据自动恢复和冗余

    参考:

    8.0 RELEASE NOTES
    RHEL 8 限制与生命周期

    转载请注明:爱开源 » RHEL 8.0 新特性

  • RHEL 8 限制与生命周期

    RHEL 8 限制与生命周期

    RHEL 8 限制

    x86_64 RHEL 7 RHEL 8
    最大逻辑 CPU 数量 768 [5120]~14 768 [8192]
    最大内存 12TB [64TB]~12 24TB [64TB]
    最低内存要求 最小 1GB, 推荐每个逻辑 CPU 使用 1 GB~18 最小1.5GB, 推荐每个逻辑 CPU 使用 1.5GB18
    最低所需的磁盘空间 最少 10GB, 推荐 20GB 最少 10GB, 推荐 20GB
    文件系统和存储限制 Ext3 16TB 16TB
    文件系统和存储限制 Ext4 50TB [1EB] 50TB [1EB]
    文件系统和存储限制 XFS 500TB [16EB] 1PB
    Kernel foundation 3.10 4.18
    Compiler/toolchain GCC 4.8.2 GCC 8.2.1
    Desktop GUI Gnome 3.8 Gnome 3.28
    默认浏览器 Firefox 24.5 Firefox 60.5.1
    Python 2.7.5 3.6.8
    Perl 5.16.3 5.26.3
    yum 3.4.3 4.0.9
    Git 1.8.3 2.18.1
    Apache 2.4.6 2.4.37
    1. 支持 12TB 内存需要 Red Hat Enterprise Linux 7.2。Red Hat Enterprise Linux 7.1 可以最多支持 6TB 内存。 Red Hat Enterprise Linux 7 的早期版本(如 Red Hat Enterprise Linux 7.0)可以最多支持 3TB 内存。
    2. 对 448 个 CPU 的支持需要 Red Hat Enterprise Linux 6.7 或更新的版本。以前对于较早版本所支持的最大 CPU 数量为 288 个 CPU。
    3. 对 768 个 CPU 的支持需要带有勘误内核 3.10.0-514.26.2.el7 或更新版本的 Red Hat Enterprise Linux 7.3。对 576 个 CPU 的支持需要带有勘误内核 3.10.0-327.18.2.el7 或更新版本的 Red Hat Enterprise Linux 7.2。对 384 个 CPU 的支持需要 Red Hat Enterprise Linux 7.2 或更新版本。以前对于较早版本所支持的最大 CPU 数量为 288 个 CPU。此外,对于7.2 或更高版本,请参考以下红帽知识库文章:Memory swap occurs while the pagecache is reclaimed.

    https://access.redhat.com/zh_CN/support/policy/updates/errata

    RHEL 生命周期

    提供 12 年 支持

    计划发布 8 个版本

    建议从 8.1 开始用于生产系统

    转载请注明:爱开源 » RHEL 8 限制与生命周期

  • CentOS 8 开启 TCP BBR

    CentOS 8 开启 TCP BBR

    TCP 拥塞控制算法

    传统 TCP 拥塞控制算法,基于丢包反馈的协议。

    基于「丢包反馈」的协议是一种 被动式 的拥塞控制机制,其依据网络中的丢包事件来做网络拥塞判断。即便网络中的负载很高时,只要没有产生拥塞丢包,协议就不会主动降低自己的发送速度。

    这种协议可以最大程度的利用网络剩余带宽,提高吞吐量。然而,由于基于丢包反馈协议在网络近饱和状态下所表现出来的侵略性,一方面大大提高了网络的带宽利用率;但另一方面,对于基于丢包反馈的拥塞控制协议来说,大大提高网络利用率同时意味着下一次拥塞丢包事件为期不远了,所以这些协议在提高网络带宽利用率的同时也间接加大了网络的丢包率,造成整个网络的抖动性加剧。

    还有谁导致了丢包?

    丢包并不总是拥塞导致,丢包可能原因是多方面,比如:

    • 全球最牛的防火墙 GWF 的随机丢包策略
    • 网路中由于多路径衰落(multi-path fading)所造成的信号衰减(signal degradation)
    • 通道阻塞造成的丢包(packet drop),再者损坏的封包(corrupted packets)被拒绝通过
    • 有缺陷的网路硬件、网路驱动软件发生故障
    • 信号的信噪比(SNR)的影响

    Google BBR 的出现

    我们自然不喜欢 GWF 这种人为的随机丢包策略,当路过 GWF 时,数据被丢包,我们在此时应该立刻重新发包,增大发送的频率,而不希望降低速度,也就是不希望传统的 TCP 拥塞算法去控制。

    由此,就出现了基于不丢包的拥塞控制算法 CDG, 以 延迟 作为判断依据,延迟增大说明拥塞, 数据开始在路由器的缓冲中积累. 降低发送 窗口。然而 CDG 算法与基于丢包的算法不兼容, 只有全球的设备都换上 CDG,但这是不可能的,目前市面上的设备不可能一下子都切换到 CDG,因此 Google 就不开心了,Google 的科学家们开发了一种过渡算法来解决这个问题,这个算法的名字就是 BBR(Bottleneck Bandwidth and RTT),它是一种全新的 拥塞控制算法,BBR 同 CDG 一致的思想是不以丢包作为拥塞控制信号,但是和 CDG 不同的是,BBR 能和 cubic 和 reno 共存。

    Google云端平台博客提供, 使用BBR前后网络吞吐量对比图 / By Google

    CentOS 8 开启 TCP_BBR

    centos 8 支持 BBRNV 拥塞算法, 但默认 未启动

    https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/8.0_release_notes/rhel-8_0_0_release

    1. 查看当前启动 拥塞算法
    [root@aikaiyuan ~]# sysctl net.ipv4.tcp_congestion_control
    net.ipv4.tcp_congestion_control = cubic
    [root@aikaiyuan ~]# sysctl net.ipv4.tcp_available_congestion_control
    net.ipv4.tcp_available_congestion_control = reno cubic
    
    1. 加载 tcp_bbr.ko 模块
    [root@aikaiyuan ~]# modprobe tcp_bbr
    [root@aikaiyuan ~]# sysctl net.ipv4.tcp_available_congestion_control
    net.ipv4.tcp_available_congestion_control = reno cubic bbr
    
    1. 自动加载 tcp_bbr.ko 模块
    [root@aikaiyuan ~]# echo "tcp_bbr" >> /etc/modules-load.d/bbr.conf
    [root@aikaiyuan ~]# cat /etc/modules-load.d/bbr.conf
    tcp_bbr
    
    1. 修改 sysctl
    [root@aikaiyuan ~]# echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    [root@aikaiyuan ~]# echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
    [root@aikaiyuan ~]# sysctl -p
    [root@aikaiyuan ~]# sysctl net.ipv4.tcp_congestion_control
    net.ipv4.tcp_congestion_control = bbr
    

    CentOS 7 开启 TCP_BBR

    [root@usa ~]# yum install curl wget vim net-tools iproute2 openssh-server openssh python3 python3-pip -y
    
    1. 升级内核
    [root@usa ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
    [root@usa ~]# yum install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
    [root@usa ~]# yum --enablerepo=elrepo-kernel install kernel-ml
    [root@usa ~]# rpm -qa | grep kernel-ml
    kernel-ml-5.5.3-1.el7.elrepo.x86_64
    [root@usa ~]# /sbin/reboot
    

    CentOS 8.x 和 RHEL 8.x 更改默认启动项
    CentOS 7内核升级后内核启动顺序的更改

    1. 自动加载 tcp_bbr.ko 模块
    [root@usa ~]# echo "tcp_bbr" >> /etc/modules-load.d/bbr.conf
    [root@usa ~]# cat /etc/modules-load.d/bbr.conf
    tcp_bbr
    
    1. 修改 sysctl
    [root@usa ~]# echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    [root@usa ~]# echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
    [root@usa ~]# sysctl -p
    [root@usa ~]# sysctl net.ipv4.tcp_congestion_control
    net.ipv4.tcp_congestion_control = bbr
    [root@usa ~]# /sbin/reboot
    
    1. 检查
    [root@usa ~]# sysctl net.ipv4.tcp_available_congestion_control
    net.ipv4.tcp_available_congestion_control = reno cubic bbr
    [root@usa ~]# sysctl net.ipv4.tcp_congestion_control
    net.ipv4.tcp_congestion_control = bbr
    [root@usa ~]# lsmod | grep tcp
    tcp_bbr                20480  1
    

    https://access.redhat.com/solutions/3713681

    转载请注明:爱开源 » CentOS 8 开启 TCP BBR

  • CentOS 8 Chronyd 时间同步服务

    CentOS 8 Chronyd 时间同步服务

    chronyd vs ntpd

    安装 chronyd

    # dnf install chrony -y
    # systemctl enable chronyd.service
    

    配置 chronyd

    # cat /etc/chrony.conf |grep -v ^#|grep -v ^$
    server 0.centos.pool.ntp.org iburst
    server 1.centos.pool.ntp.org iburst
    server 2.centos.pool.ntp.org iburst
    server 3.centos.pool.ntp.org iburst
    stratumweight 0
    driftfile /var/lib/chrony/drift
    rtcsync
    makestep 10 3
    bindcmdaddress 127.0.0.1
    bindcmdaddress ::1
    cmdallow 127.0.0.1
    allow 192.168.0.0/16
    deny 10.0.0.0/8
    keyfile /etc/chrony.keys
    commandkey 1
    generatecommandkey
    noclientlog
    logchange 0.5
    logdir /var/log/chrony
    
    • server – 该参数可以多次用于添加时钟服务器,必须以”server “格式使用。一般而言,你想添加多少服务器,就可以添加多少服务器;
    • stratumweight – stratumweight指令设置当chronyd从可用源中选择同步源时,每个层应该添加多少距离到同步距离。默认情况下,CentOS中设置为0,让chronyd在选择源时忽略源的层级;
    • driftfile – chronyd程序的主要行为之一,就是根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中是最合理的,它会在重启后为系统时钟作出补偿,甚至可能的话,会从时钟服务器获得较好的估值;
    • rtcsync – rtcsync指令将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC);
    • allow / deny – 这里你可以指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器;
    • cmdallow / cmddeny – 跟上面相类似,只是你可以指定哪个IP地址或哪台主机可以通过chronyd使用控制命令;
    • bindcmdaddress – 该指令允许你限制chronyd监听哪个网络接口的命令包(由chronyc执行)。该指令通过cmddeny机制提供了一个除上述限制以外可用的额外的访问控制等级。
    • makestep – 通常,chronyd将根据需求通过减慢或加速时钟,使得系统逐步纠正所有时间偏差。在某些特定情况下,系统时钟可能会漂移过快,导致该调整过程消耗很长的时间来纠正系统时钟。该指令强制chronyd在调整期大于某个阀值时步进调整系统时钟,但只有在因为chronyd启动时间超过指定限制(可使用负值来禁用限制),没有更多时钟更新时才生效。

    chronyd 命令

    1. 检查ntp源服务器状态:
    # chronyc sourcestats -v
    
    1. 查看时间同步源状态:
    # chronyc sources -v
    
    1. accheck – 检查NTP访问是否对特定主机可用
    2. activity – 该命令会显示有多少NTP源在线/离线
    3. add server – 手动添加一台新的NTP服务器。
    4. clients – 在客户端报告已访问到服务器
    5. delete – 手动移除NTP服务器或对等服务器
    6. settime – 手动设置守护进程时间
    7. tracking – 显示系统时间信息

    时区设置

    1. 查看日期时间、时区及NTP状态:
    # timedatectl
    
    1. 查看时区列表:
    # timedatectl list-timezones
    
    1. 修改时区
    # timedatectl set-timezone Asia/Shanghai
    
    1. 修改日期时间
    # timedatectl set-time "2015-01-21 11:50:00"(可以只修改其中一个)
    
    1. 开启NTP
    # timedatectl set-ntp true/flase
    

    时区概念

    1. UTC 整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。
    2. GMT 格林威治标准时间 (Greenwich Mean Time)指位于英国伦敦郊区的×××格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。(UTC与GMT时间基本相同,本文中不做区分)
    3. CST 中国标准时间 (China Standard Time) GMT + 8 = UTC + 8 = CST
    4. DST夏令时(Daylight Saving Time) 指在夏天太阳升起的比较早时,将时间拨快一小时,以提早日光的使用。(中国不使用)

    转载请注明:爱开源 » CentOS 8 Chronyd 时间同步服务

  • 树莓派4B 安装 Raspbian 系统

    树莓派4B 安装 Raspbian 系统

    下载镜像

    https://www.raspberrypi.org/downloads/raspbian/

    根据自己需求, 我这里安装 Raspbian Buster Lite https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2019-09-30/2019-09-26-raspbian-buster-lite.zip

    解压得到 2019-09-26-raspbian-buster-lite.img 文件

    安装 Win32 Disk Imager

    下载地址:https://sourceforge.net/projects/win32diskimager/ 安装直接下一步,选择上面解压镜像 2019-09-26-raspbian-buster-lite.img 设备选择 SD卡 设备

    千万不要弄错,确认后点击 写入
    成功后, 把 SD卡 插入到 树莓派4B 上

    连接树莓派

    • 因为树莓派默认没有SSH, 所以需要连接显示器
    • 看到 树莓派4B 已经自动获取的IP: 192.168.199.148
    • 默认用户名: pi
    • 默认密码: raspberry

    简单配置树莓派

    # apt-get update
    # apt-get install openssh-server
    # systemctl enable ssh
    # cat /etc/network/interfaces.d/eth0
    auto eth0
    iface eth0 inet static
      address 192.168.199.4
      netmask 255.255.255.0
      broadcast 192.168.199.255
      network 192.168.199.0
      gateway 192.168.199.1
    # systemctl disable dhcpcd.service dhcpcd5.service
    
    1. 安装并启动 sshd 服务
    2. 手动配置 eth0 地址
    3. 关闭dhcp服务

    转载请注明:爱开源 » 树莓派4B 安装 Raspbian 系统

  • Local Dns 服务器(NS记录)选择算法介绍-SRTT

    Local Dns 服务器(NS记录)选择算法介绍-SRTT

    大家都知道BIND在作为递归服务器时在向权威DNS请求时会使用优选策略,不过这个优选策略目前没有清晰的资料。小编查阅了一些公开的资料发现基本都是各种传抄,没有什么清晰的说明。因此小编专门编写此文来科普递归是如何进行优选的。本文以BIND9.8/BIND9.9/BIND9.11的代码为基础,并假定域名有多个质量不同的NS来进行计算。

    BIND9.8及之前版本的SRTT策略

    目前可以查询到的一部分公开的资料都是基于BIND9.8版本的,小编仔细查阅了BIND9.8的源代码后,判定这些公开资料的描述基本符合事实情况。小编针对BIND9.8的SRTT计算过程描述如下:

    1. 首先BIND在第一次计算SRTT时为所有的NS记录一个初始化的值,赋值方法是:
    isc_random_get(&r);
    e->srtt = (r & 0x1f) + 1;
    e->expires = 0;
    

    注释:这个值为随机1-32us,由于这个值非常小远小于正常的SRTT,因此可以认为在初始化的时候,所有的NS都会得到一个很小的近乎为零的SRTT,因此所有的NS都有机会去被第一次优选。

    1. 在所有的NS中选择SRTT最小的一个NS服务器发起解析请求,如得到应答则记录这次请求的RTT,并重新计算这个NS的SRTT,计算方法是:
    new_srtt = (addr->entry->srtt / 10 * factor)+ (rtt / 10 * (10 - factor));
    

    注释:这里的factor定义如下:

    #define DNS_ADB_RTTADJDEFAULT           7       /*%< default scale */
    #define DNS_ADB_RTTADJREPLACE           0       /*%< replace with our rtt */
    #define DNS_ADB_RTTADJAGE               10      /*%< age this rtt */
    

    因此,在正常收到应答的情况:

            factor = DNS_ADB_RTTADJDEFAULT;
    

    所以在正常的请求中,factor的值为7,所以这个新的NS的SRTT计算方法如下,也就是说这次请求的RTT在新的SRTT值的计算中权重占30%:old_srtt 0.7 + curr_rtt 0.3

    1. 在这次请求中计算了请求的NS的同时,还需要对其他的NS进行衰减计算,计算方法如下:
    if (factor == DNS_ADB_RTTADJAGE)
         new_srtt = addr->entry->srtt * 98 / 100;
    

    注释:即所有的SRTT赋值为原来的98%

    1. 如果本次NS请求以失败告终,即发出请求并没有得到应答的情况,这里就要对这个NS进行惩罚,计算方法如下:
    INSIST(no_response);
         rtt = query->addrinfo->srtt + 200000;
         if (rtt > 10000000)
         rtt = 10000000;
    

    注释:直接给SRTT加上200ms,且SRTT最大值不能超过10s

    1. 1800s后,所有的SRTT清零,重复以上的计算

    这个1800来自源码的宏定义:

    #define ADB_ENTRY_WINDOW        1800    /*%< seconds */
    

    BIND9.9及以后版本的SRTT策略

    1. 首先BIND在第一次计算SRTT时为所有的NS记录一个初始化的值,用样的赋值方法,随机1-32us。
    2. 在所有的NS中选择SRTT最小的一个NS服务器发起解析请求,如得到应答则记录这次请求的RTT,并重新计算这个NS的SRTT,同样的计算方法old_srtt 0.7 + curr_rtt 0.3
    3. 其他NS的计算方法如下:
    if (addr->entry->lastage != now) {
           new_srtt = addr->entry->srtt;
           new_srtt <<= 9;
           new_srtt -= addr->entry->srtt;
           new_srtt >>= 9;
           addr->entry->lastage = now;
    

    注释:大概值为 “SRTT = ((SRTT<<9)-SRTT)>>9″,即赋值为原来的SRTT的511/512,大概99.8%,这是BIND9.9和之前版本在计算SRTT中的一个最重要的差别

    1. 如果本次NS请求以失败告终,则惩罚方式如下:
    INSIST(no_response);
    rtt = query->addrinfo->srtt + 200000;
    if (rtt > MAX_SINGLE_QUERY_TIMEOUT_US)
           rtt = MAX_SINGLE_QUERY_TIMEOUT_US;
    

    注释:这里MAX_SINGLE_QUERY_TIMEOUT_US为宏定义,定义为

    #define MAX_SINGLE_QUERY_TIMEOUT 9U
    #define MAX_SINGLE_QUERY_TIMEOUT_US (MAX_SINGLE_QUERY_TIMEOUT*US_PER_SEC)
    

    共9s,也就是SRTT的最大值降低了1s。值得说明的是,在BIND9.11中,这里的惩罚逻辑又有了变化,计算方法如下:

    INSIST(no_response);
    isc_random_get(&value);
    if (query->addrinfo->srtt > 800000)
           mask = 0x3fff;
    else if (query->addrinfo->srtt > 400000)
           mask = 0x7fff;
    else if (query->addrinfo->srtt > 200000)
           mask = 0xffff;
    else if (query->addrinfo->srtt > 100000)
           mask = 0x1ffff;
    else if (query->addrinfo->srtt > 50000)
           mask = 0x3ffff;
    else if (query->addrinfo->srtt > 25000)
           mask = 0x7ffff;
    else
           mask = 0xfffff;
    ……
    rtt = query->addrinfo->srtt + (value & mask);
    

    注释:这里面根据当前SRTT值的不同,重新定义了一个随机数,而且是如果当前值的SRTT越小则惩罚的度量越大。

    1. 同样的1800s后,所有的SRTT清零,重复以上的计算SRTT策略&DNS解析质量。所以BIND的SRTT整个过程如下:

    SRTT从设计上来说即兼顾了DNS异常依赖的优选以及容灾措施,在所有NS的存活的情况下能够保持绝大部分的递归请求可以优选最好的NS,同时在个别NS挂掉的情况下又能容灾切换至其他的NS。同时,根据BIND版本演进中的衰减/惩罚机制变化来看, BIND在保障容灾的前提下尽可能更加选择优选(衰减策略从原来BIND9.8版本的98%变更至BIND9.9版本的99.8%),因此对于被优选NS的质量也提出了更高要求。在此小编假设一种场景,对于BIND9.11版本的递归来讲如果一直优选的那个NS因为异常原因发生了丢包从而被递归惩罚,将使用更长的时间和次数来为这个NS进行衰减,从而有更长的时间/更多的递归次数不能被优选(比如一个原本20ms的NS因为一次丢包导致SRTT增加至220ms,那么需要2300次的衰减/或者等1800s过期才能使SRTT重新恢复至20ms),这对于递归的性能有本质上的影响。

    因此,在衡量权威服务器本身性能的同时,是否拥有高质量的网络/是否拥有低丢包率的权威软硬件服务,也是重要的考量指标。在这里小编需要指出,阿里云在DNS这种互联网基础协议上持续进行基础设施的投入,使得云解析拥有全球高质量的BGP网络和自研的高性能DNS,几乎将云解析权威的丢包率降低为零,从而实现了更高质量的递归解析性能。

    相关文章:

    转载请注明:爱开源 » Local Dns 服务器(NS记录)选择算法介绍-SRTT

  • error: Arch dependent binaries in noarch package

    rpmbuild -bb aikaiyuan.spec

    error: Arch dependent binaries in noarch package
    

    rpmbuild 返回错误

    修复

    aikaiyuan.spec 添加如下

    %define _binaries_in_noarch_packages_terminate_build   0
    

    转载请注明:爱开源 » error: Arch dependent binaries in noarch package