标签: liunx

  • mysql究竟是否适合运行在docker容器中

    目前,容器和 Docker 依旧是技术领域最热门的词语,无状态的服务容器化已经是大势所趋,同时也带来了一个热点问题被大家所争论不以:数据库 MySQL 是否需要容器化?

    [TOC]

    认真分析大家的各种观点,发现赞同者仅仅是从容器优势的角度来阐述 MySQL 需要容器化,几乎没有什么业务场景进行验证自己的观点

    反过来再看反对者,他们从性能、数据安全等多个因素进行阐述 MySQL不需要容器化,也举证了一些不适合的业务场景。

    下面,我们就聊一下 Docker 不适合跑 MySQL 的 N 个原因!

    数据安全问题

    不要将数据储存在容器中,这也是 Docker 官方容器使用技巧中的一条。容器随时可以停止、或者删除。当容器被rm掉,容器里的数据将会丢失。

    为了避免数据丢失,用户可以使用数据卷挂载来存储数据。但是容器的 Volumes 设计是围绕 Union FS 镜像层提供持久存储,数据安全缺乏保证。如果容器突然崩溃,数据库未正常关闭,可能会损坏数据。另外,容器里共享数据卷组,对物理机硬件损伤也比较大。

    性能问题

    大家都知道,MySQL 属于关系型数据库,对IO要求较高。当一台物理机跑多个时,IO就会累加,导致IO瓶颈,大大降低 MySQL 的读写性能。

    在一次Docker应用的十大难点专场上,某国有银行的一位架构师也曾提出过:“数据库的性能瓶颈一般出现在IO上面,如果按 Docker 的思路,那么多个docker最终IO请求又会出现在存储上面。现在互联网的数据库多是share nothing的架构,可能这也是不考虑迁移到 Docker 的一个因素吧”。

    其实也有相对应的一些策略来解决这个问题,比如:

    1)数据库程序与数据分离

    如果使用Docker 跑 MySQL,数据库程序与数据需要进行分离,将数据存放到共享存储,程序放到容器里。如果容器有异常或 MySQL 服务异常,自动启动一个全新的容器。

    2)跑轻量级或分布式数据库

    Docker 里部署轻量级或分布式数据库,Docker 本身就推荐服务挂掉,自动启动新容器,而不是继续重启容器服务。

    3)合理布局应用

    对于IO要求比较高的应用或者服务,将数据库部署在物理机或者KVM中比较合适。目前腾讯云的TDSQL和阿里的Oceanbase都是直接部署在物理机器,而非Docker 。

    状态问题

    在 Docker 中水平伸缩只能用于无状态计算服务,而不是数据库。

    Docker 快速扩展的一个重要特征就是无状态,具有数据状态的都不适合直接放在 Docker 里面,如果 Docker 中安装数据库,存储服务需要单独提供。

    目前,腾讯云的TDSQL(金融分布式数据库)和阿里云的Oceanbase(分布式数据库系统)都直接运行中在物理机器上,并非使用便于管理的 Docker 上。

    资源隔离方面

    资源隔离方面,Docker 确实不如虚拟机KVM,Docker是利用Cgroup实现资源限制的,只能限制资源消耗的最大值,而不能隔绝其他程序占用自己的资源。如果其他应用过渡占用物理机资源,将会影响容器里 MySQL 的读写效率。

    需要的隔离级别越多,获得的资源开销就越多。相比专用环境而言,容易水平伸缩是Docker的一大优势。然而在 Docker 中水平伸缩只能用于无状态计算服务,数据库并不适用。

    难道 MySQL 不能跑在容器里吗?

    MySQL 也不是全然不能容器化。以下几种场景还是适合的。

    • 对数据丢失不敏感的业务(例如用户搜索商品)就可以数据化,利用数据库分片来来增加实例数,从而增加吞吐量。
    • docker适合跑轻量级或分布式数据库,当docker服务挂掉,会自动启动新容器,而不是继续重启容器服务。
    • 数据库利用中间件和容器化系统能够自动伸缩、容灾、切换、自带多个节点,也是可以进行容器化的。

    典型案例:同程旅游、京东、阿里的数据库容器化都是不错的案例,大家可以自行去查看。

  • nps内网穿透代理服务器

    nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理p2p等,并带有功能强大的web管理端。

    背景

     

    web

    1. 做微信公众号开发、小程序开发等—-> 域名代理模式

    2. 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,—-> tcp代理模式

    3. 在非内网环境下使用内网dns,或者需要通过udp访问内网机器等—-> udp代理模式

    4. 在外网使用HTTP代理访问内网站点—-> http代理模式

    5. 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备—-> socks5代理模式

    特点

     
    • 协议支持全面,兼容几乎所有常用协议,例如tcp、udp、http(s)、socks5、p2p、http代理…
    • 全平台兼容(linux、windows、macos、群辉等),支持一键安装为系统服务
    • 控制全面,同时支持服务端和客户端控制
    • https集成,支持将后端代理和web服务转成https,同时支持多证书
    • 操作简单,只需简单的配置即可在web ui上完成其余操作
    • 展示信息全面,流量、系统信息、即时带宽、客户端版本等
    • 扩展功能强大,该有的都有了(缓存、压缩、加密、流量限制、带宽限制、端口复用等等)
    • 域名解析具备自定义header、404页面配置、host修改、站点保护、URL路由、泛解析等功能
    • 服务端支持多用户和用户注册功能

    没找到你想要的功能?不要紧,点击进入文档查找吧

    快速开始

     

    安装

     

    GETHUB: https://github.com/ehang-io/nps/releasesreleases:

    GETEE: https://gitee.com/houlijiang/common/tree/master/nps

    下载对应的系统版本即可,服务端和客户端是单独的

    服务端启动

     

    下载完服务器压缩包后,解压,然后进入解压后的文件夹

    • 执行安装命令

    对于linux|darwin sudo ./nps install

    对于windows,管理员身份运行cmd,进入安装目录 nps.exe install

    • 默认端口

    nps默认配置文件使用了80,443,8080,8024端口

    80与443端口为域名解析模式默认端口

    8080为web管理访问端口

    8024为网桥端口,用于客户端与服务器通信

    • 启动

    对于linux|darwin sudo nps start

    对于windows,管理员身份运行cmd,进入程序目录 nps.exe start

    安装后windows配置文件位于 C:\Program Files\nps,linux和darwin位于/etc/nps

    如果发现没有启动成功,可以查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)

    • 访问服务端ip:web服务端口(默认为8080)
    • 使用用户名和密码登陆(默认admin/123,正式使用一定要更改)
    • 创建客户端

    客户端连接

     
    • 点击web管理中客户端前的+号,复制启动命令
    • 执行启动命令,linux直接执行即可,windows将./npc换成npc.exe用cmd执行

    如果需要注册到系统服务可查看注册到系统服务

    配置

     
    • 客户端连接后,在web中配置对应穿透服务即可
    • 更多高级用法见完整文档
  • NatTypeTester.exe 当前网络nat测试 1.98 MB

    NAT0: OpenInternet,没有经过NAT地址转换,公网IP NAT1: Full Cone NAT,动态家宽可以达到最优的状态,外网设备可以主动发信息给NAT1网络内的设备。 NAT2: Address-Restricted Cone NAT,只有内网设备(地址:任意端口)主动发过信息给外网设备,外网设备才能主动连接NAT2的该设备的地址(地址:任意端口) NAT3: Port-Restricted Cone NAT,只有内网设备(地址:指定端口)主动发过信息给外网设备,外网设备才能主动连接NAT3的该设备的地址(地址:指定端口),限制为通信过的端口 NAT4: Symmetric NAT,只能和NAT0设备通讯

    打开软件,点击左侧菜单栏RFC 3489

    上方菜单栏中可选择STUN服务器,大陆境内推荐使用QQ和MIWIFI

    点击TEST即可得到测试结果,如图FullCone即为NAT1,具体释义可参考上文

    公网IP,NAT0

    下载:https://gitee.com/houlijiang/common/raw/master/NatTypeTester.exe

  • Linux实例的/etc/fstab文件配置错误导致系统启动异常

    问题描述

    通过远程连接软件无法登录Linux实例,通过使用管理终端连接Linux实例远程连接时,发现系统出现进入到急救模式(emergency mode)的信息,且出现报错。

    • CentOS实例报如下错误。

    • Ubuntu实例报如下错误。

       
      An error occurred while mounting /alidata.
      Press S to skip mounting or M for manual recovery

      具体信息以下图所示。Ubuntu进入维护模式

    问题原因

    一般是因为/etc/fstab文件中写入了错误的文件系统,或者磁盘的分区信息不正确。/etc/fstab文件主要用于保存服务器的磁盘挂载信息,如果该配置文件中写入不正确的挂载信息或者该文件自身存在访问错误,例如:权限配置、文件丢失等,系统启动时就可能出现异常,导致启动失败。

    解决方案

    说明
    • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

    • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

    • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

    本节主要解决CentOS和Ubuntu系统因为/etc/fstab配置文件错误导致启动失败的解决方法。

    说明

    本文相关配置及说明适用于CentOS6.5、CentOS7.0、Ubuntu12.04和Ubuntu14.04等操作系统。在其它操作系统版本上的配置可能有所差异,具体情况请参阅相应操作系统官方文档。

    CentOS实例

    本文主要介绍以下两种方法解决该问题,推荐您使用方法一

    方法一

    1. 通过使用管理终端连接Linux实例远程连接ECS实例。系统提示进入急救模式时,输入实例登录密码。

    2. 执行以下命令,将根分区的挂载模式变更为读写。

       
      mount / -o remount,rw
    3. 执行blkid命令,查看ECS实例上磁盘的分区情况以及文件系统。如下图所示,ECS实例数据盘分区为/dev/xvdb1,文件系统类型为ext4。

    4. 执行以下命令,检查磁盘的分区信息与文件系统和上一步返回的结果是否一致。

       
      vim /etc/fstab
    5. 如果不一致,按以下步骤进行修改。

      1. 将光标移到异常的参数行,按i键进入编辑模式,写入正确的分区信息,如下所示。

         
        /dev/xvdb1 /mydata ext4 defaults,nofail 0 0
        说明

        建议您在挂载的时候添加nofail参数,在启动实例时,若设备不存在会直接忽略它,从而不发生报错。

      2. Esc键退出编辑模式,并输入:wq!,按Enter键保存并退出。

    6. 执行reboot命令,重启系统,确认能成功登录系统。

    方法二

    1. 在ECS控制台重启实例(或者强制重启示例),然后使用VNC连接实例,当系统启动至内核选项界面时,按e键进入修改grub引导文件。

    2. 将光标定位至Linux内核参数行,删除其余内核参数,添加rw init=/bin/bash参数,如下图所示,然后按Ctrlx键,进入单用户模式。

    3. 参见方法一的第3步至第6步,修改/etc/fstab配置后,重启实例即可。

    Ubuntu实例

    方法一

    1. 通过使用管理终端连接Linux实例远程连接ECS实例。

    2. S键跳过磁盘挂载,进入系统。

    3. 执行如下命令,变更根分区的挂载模式为读写。

       
      mount / -o remount,rw
    4. 执行blkid命令,查看ECS实例上磁盘的分区情况以及文件系统。如下图所示,ECS实例数据盘分区为/dev/xvdb1,文件系统为ext4。

    5. 执行如下命令,检查磁盘的分区信息与文件系统和上一步返回的结果是否一致。

       
      vim /etc/fstab
    6. 如果不一致,按以下步骤修改。

      1. 将光标移到异常的参数行,按i键进入编辑模式,写入正确的分区信息,如下所示。

         
        /dev/xvdb1 /mydata ext4 defaults,nofail 0 0
        说明

        建议您在挂载的时候添加nofail参数,在启动实例时,若设备不存在会直接忽略它,从而不发生报错。

      2. Esc键退出编辑模式,并输入:wq!,按Enter键保存并退出。

    7. 执行reboot命令,重启系统,确认能成功登录系统。

    方法二

    具体操作请参见CentOS实例的方法二

    相关文档

  • gunzip 命令详解

    gunzip

    用来解压缩文件

    补充说明

    gunzip命令 用来解压缩文件。gunzip是个使用广泛的解压缩程序,它用于解开被gzip压缩过的文件,这些压缩文件预设最后的扩展名为.gz。事实上gunzip就是gzip的硬连接,因此不论是压缩或解压缩,都可通过gzip指令单独完成。

    语法

    gunzip(选项)(参数)
    

    选项

    -a或——ascii:使用ASCII文字模式;
    -c或--stdout或--to-stdout:把解压后的文件输出到标准输出设备;
    -f或-force:强行解开压缩文件,不理会文件名称或硬连接是否存在以及该文件是否为符号连接;
    -h或——help:在线帮助;
    -l或——list:列出压缩文件的相关信息;
    -L或——license:显示版本与版权信息;
    -n或--no-name:解压缩时,若压缩文件内含有原来的文件名称及时间戳记,则将其忽略不予处理;
    -N或——name:解压缩时,若压缩文件内含有原来的文件名称及时间戳记,则将其回存到解开的文件上;
    -q或——quiet:不显示警告信息;
    -r或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
    -S或<压缩字尾字符串>或----suffix<压缩字尾字符串>:更改压缩字尾字符串;
    -t或——test:测试压缩文件是否正确无误;
    -v或——verbose:显示指令执行过程;
    -V或——version:显示版本信息;
    

    参数

    文件列表:指定要解压缩的压缩包。

    实例

    首先将 /etc目录下的所有文件以及子目录进行压缩,备份压缩包etc.zip到/opt目录,然后对etc.zip文件进行gzip压缩,设置gzip的压缩级别为9。

    zip –r /opt/etc.zip /etc
    gzip -9v /opt/etc.zip
    

    查看上述etc.zip.gz文件的压缩信息。

    gzip -l /opt/etc.zip.gz
    compressed        uncompressed ratio uncompressed_name
    11938745            12767265   6.5% /opt/etc.zip
    

    解压上述etc.zip.gz文件到当前目录。

    [root@mylinux ~]#gzip –d /opt/etc.zip.gz 
    或者执行
    [root@mylinux ~]#gunzip /opt/etc.zip.gz
    

    通过上面的示例可以知道 gzip –d等价于gunzip命令。

  • zip 压缩删除源文件

    Linux系统中,使用zip命令压缩文件时,可以通过添加-m参数来实现压缩完成后自动删除源文件的功能。这个参数告诉zip命令在完成文件的压缩操作后,自动删除原始文件,从而节省磁盘空间。例如,要将/home/Blinux/html/目录下的所有文件和文件夹打包为当前目录下的html.zip文件,并在压缩完成后删除原始文件,可以使用以下命令:

    bashCopy Code
    zip -m -r html.zip /home/Blinux/html/

    这个命令使用了-m参数来指示在压缩完成后删除原始文件,-r参数则用于递归地处理目录及其子目录中的所有文件。

    此外,在Python中,也可以通过编写代码来实现解压缩ZIP文件并删除源文件的功能。以下是一个简单的Python示例代码,展示了如何使用Python的zipfile模块来解压缩ZIP文件并在解压后删除源文件: