月度归档: 2024 年 10 月

  • mybatis中foreach使用

    一、foreach 属性使用

    <foreach collection="list" index="index" item="mchntCd" open="(" close=")" separator=",">
       #{mchntCd}
    </foreach>
    
    1. item:  集合中元素迭代时的别名,该参数为必选,通过别名进行取值
    2. index:在list和数组中,index是元素的序号,在map中,index是元素的key,非必填
    3. open: foreach代码的开始符号,一般是(和close=”)”合用。常用在in(),values()时。非必填
    4. separator:元素之间的分隔符,例如在in()的时候,separator=”,”会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。非必填
    5. close: foreach代码的关闭符号,一般是)和open=”(“合用。常用在in(),values()时。非必填
    6. collection: 要做foreach的对象,作为入参
      1. 传入是集合,也就是接口里面用的  List<String> nameList    那么 使用 collection = “list”
      2. 传入的是数组,接口里面 String[] namestrs ,那么 使用 collection = “array”
      3. 如果传入的是一个实体bean,实体bean里面有一个属性为 list<String> ids 那么collection = “ids ”,如果实体bean中对应ids是一个对象,ids 里面有一个属性为 List<Stirng> usernames,那么collection = “ids.usernames”

    二、代码使用

            1、实体类 list<String>  mchntCds
     mapper接口  —》 list方式
    int queryDiscDerateCount
    (List<String> mchntCds);
    mapper映射xml
    1. <select id=“queryDiscDerateCount” resultType=“Integer”>
    2. select count (*) from t_mchnt_disc_config where mchnt_cd in
    3. <foreach collection=“list” index=“index” item=“mchntCd” open=“(“ close=“)” separator=“,”>
    4. #{mchntCd}
    5. </foreach>
    6. </select>
     
       2、实体类 list<User>  userlist,实体类中有 list 属性
    实体类:
    1. @Data
    2. public class MchntDiscDerateDto {
    3. private String mchntCd = “”;
    4. }
    mapper接口
    
    List<TMchntDerateInfoDto> getDiscDerateList
    (List<MchntDiscDerateDto> discDto);
      mapper映射xml:
    1. <select id=“getDiscDerateList” parameterType=“MchntDiscDerateDto” resultType=“TMchntDerateInfoDto”>
    2. select
    3. t_mchnt_disc_derate_config
    4. where
    5. mchnt_cd in
    6. <foreach collection=“list” index=“index” item=“user” open=“(“ close=“)” separator=“,”>
    7. #{user.mchntCd}
    8. </foreach>
    9. </select>
     
    3、数组  String[] params      用 array
    mapper 接口  
    int queryDiscDerateCount
    (String[] mchntCds);
      mapper映射xml:
    1. <select id=“queryDiscDerateCount” resultType=“Integer”>
    2. select count (*) from t_mchnt_disc_derate_config where mchnt_cd in
    3. <foreach collection=“array” index=“index” item=“mchntCd” open=“(“ close=“)” separator=“,”>
    4. #{mchntCd}
    5. </foreach>
    6. </select>
     
    4、传入的参数是实体类,并且实体中包含数组和集合
    实体类:
    1. @Data
    2. public class UserVo {
    3. private Long id;
    4. private Long supplierId;
    5. private Long[] ids;
    6. private List<Long> clientIdList;
    7. }
    mapper接口
    List<UserVo> queryList
    (UserVo select);
    mapper映射文件xml
    1. <select id=“queryList” resultType=“UserVo” parameterType=“UserVo”>
    2. select *
    3. from bms_bills_memo
    4. <where>
    5. and id in
    6. <foreach collection=“ids” open=“(“ close=“)” item=“id” separator=“,”>
    7. #{id}
    8. </foreach>
    9. and
    10. client_id in
    11. <foreach collection=“clientIdList” separator=“,” item=“detail” open=“(“ close=“)” >
    12. #{detail}
    13. </foreach>
    14. </where>
    15. </select>
     
    5、传入多个list或者array,不使用实体进行封装。用注解@Params, collection使用到Param中定义的别名
    mapper接口
    List<UserVo> queryList
    (@Param("idArray") Long[] array, @Param("clientIdList") List<Long> list);
    mapper映射文件xml
    1. <select id=“queryList” resultType=“UserVo”>
    2. select *
    3. from t_user_inf
    4. <where>
    5. and id in
    6. <foreach collection=“idArray” open=“(“ close=“)” item=“id” separator=“,”>
    7. #{id}
    8. </foreach>
    9. and
    10. client_id in
    11. <foreach collection=“clientIdList” separator=“,” item=“detail” open=“(“ close=“)” >
    12. #{detail}
    13. </foreach>
    14. </where>
    15. </select>

     

    6、map参数
    当我们传入的参数为 Map<String,Objject>的时候,那么能不能正常使用 foreach呢,答案是肯定的,因为对象也是类似于map结构啊
    1. /**
    2. * map 获取数据
    3. * @param map
    4. * @return
    5. */
    6. List<SysUser> getUserByIds (Map<String,Object> map);
    1. // xml
    2. <select id=“getUserByIds” resultMap=“BaseResultMap”>
    3. select
    4. <include refid=“Base_Column_List” />
    5. from t_sys_user
    6. where status = #{status}
    7. and id in
    8. <foreach collection=“ids” item=“id” open=“(“ close=“)” separator=“,”>
    9. #{id}
    10. </foreach>
    11. </select>

    实际调用:

    1. @Test
    2. public void testMapUsers() {
    3. Map<String,Object> params = new HashMap<>();
    4. params.put(“status”, “1”);
    5. params.put(“ids”, Arrays.asList(1,2,3,4,5,6,7,8));
    6. List<SysUser> all = sysUserDao.getUserByIds(params);
    7. try {
    8. System.out.println(new JsonMapper().writeValueAsString(all));
    9. } catch (JsonProcessingException e) {
    10. e.printStackTrace();
    11. }
    12. }

    调用结果:

    三、总结

    1、mapper 接口中添加 @Param注解的场合,list,array将会失效;

    2、使用了 @Param注解 collection的内容需要使用Param中的别名来指定你需要用到的list或者array

  • 413 Request Entity Too Large

    最近我们的网站服务平台上传apk(应用程序)的时候 上传60M的app的时候 报错nginx

    413 Request Entity Too Large

    经过排查修改nginx配置

    这是最简单的一个做法,着报错原因是nginx不允许上传配置过大的文件,那么件把nginx的上传大小配置调高就好。

    1、打开nginx主配置文件nginx.conf, 找到http{}段并修改以下内容:

    http {
        include       mime.types;
        default_type  application/octet-stream;
        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 100m;
        limit_conn_zone $binary_remote_addr zone=one:32k;
        sendfile        on;
        tcp_nopush     on;
        keepalive_timeout  60;
        tcp_nodelay on;
        gzip  on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.0;
        gzip_comp_level 2;
        gzip_types       text/plain application/x-javascript text/css application/xml;
        gzip_vary on;
        log_format  wwwlogs  '$remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
        #include default.conf;
        include vhost/*.conf;
    }
    
    

    client_max_body_size 100m;

    当中的100修改成你需要的允许文件大小。

    2、修改后,测试nginx配置是否正确

    重启nginx

    我们的项目是以php运行的,这个大小client_max_body_size要和php.ini中的如下值的最大值差不多或者稍大,这样就不会因为提交数据大小不一致出现错误。

    post_max_size = 100M
    
    upload_max_filesize = 100M

    当中的100M修改成你需要的允许文件大小。把当中的100M修改成你第一步设置的大小。

    我们修改完php.ini文件后 重启一下php 然后我们再上传60M的APP时ok 没问题

  • IDEA中JS文件中文乱码

    521f7e8e3ee6fc0e8776946b15e1102f e33dce9c87ad4a54872f1ecdb9d4b35b

    开始我以为是导入的js文件没有设置编码的原因然后我加上charset=UTF-8,但是没有起作用,后我又以为是jsp文件编码的原因,于是我又加上了pageEncoding="utf-8",任然没有起作用。

    几次反思后我觉得可能问题出现在我用的开发工具IDEA上,网上查阅资料后找到问题了。

    一、设置全局和项目编码

    222b878f23f59693e1b35e09ab4e7765 83b8c1c582d3e083ec804ebd1a262967

    二、设置Tomcat启动项目用到的VM options

    f48c268e7f043df8b7c1c6259eafd5af 83c394bbefcc59f91102305b4e4e3654

    修改完后重启项目

  • 将 Docker 命令转化为 Docker Compose 文件

    如果你每天在正式或个人系统中使用 Docker,你应该知道有一个有用的应用叫 Composerize。在这个简短的指南中,我们将了解什么是 Composerize,以及如何使用 Composerize 在 Linux 中将 docker run 命令转换为 Docker Compose 文件格式。

    什么是 Composerize?

    Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。Docker Compose 只是一个 YAML 文件,我们在其中为 Docker 应用定义服务、网络和卷。

    不是每个人都擅长写高效的 Docker Compose 文件。你们中的一些人可能会发现,甚至写一个简单的 Docker Compose 文件都很困难。不用担心! 看下 Composerize,它可以帮助你从  docker run 命令中创建 Docker Compose 文件。

    Composerize 是一个命令行和基于网络的工具,可以将  docker run 命令转换成 Docker Compose 文件。

    无论  docker run 命令是简单、简短还是冗长、复杂,都没有关系。你所要做的就是把命令传给 Conposerize。Composerize 会立即将 docker run 命令变成 Docker Compose 文件!

    在 Linux 中安装 Composerize

    Composerize 是作为一个网络服务提供的。所以你不需要在你的系统上安装它。如果你因为任何原因想在本地安装它,请继续阅读。

    Composerize 可以用 npm 安装。确保你的系统中已经安装了 Nodejs。如果没有安装,请按照下面的链接来安装 Nodejs。

    安装完 Nodejs 后,运行以下命令来安装 Composerize:

    1. $ npm install composerize

    该命令将只为当前用户安装 Composerize。

    如果你想在全局(全系统)安装它,请运行上述命令并加上  -g 选项,如下所示。

    1. $ npm install composerize - g

    用 Composerize 将 Docker 命令转换为 Docker Compose 文件

    要将  docker run 命令转换为 Docker Compose 格式,只需用 Composerize 运行它,如下所示:

    1. $ composerize docker run - d - p 9000 : 9000 - v / var / run / docker . sock : /var/ run / docker . sock portainer / portainer

    它将以 Docker Compose 文件格式生成内容。

    示例输出:

    1. version : '3.3'
    2. services :
    3. portainer :
    4. ports :
    5. - '9000:9000'
    6. volumes :
    7. - '/var/run/docker.sock:/var/run/docker.sock'
    8. image : portainer / portainer

    Convert Docker Run Commands Into Docker-Compose Files With Composerize

    Convert Docker Run Commands Into Docker-Compose Files With Composerize

    现在在你的  docker-compose.yml 文件中复制上面几行。就这么简单!

    正如我所说,你也可以使用 Composerize 网络服务将  docker run 命令转换成 Docker Compose 格式。

    进入 https://www.composerize.com/,将 docker run 命令粘贴到框中,你就会立即得到 docker-compose.yml 文件!

    Turn Docker Run Commands Into Docker-compose Files Using Composerize

    Turn Docker Run Commands Into Docker-compose Files Using Composerize

    将命令转换为 Docker Compose 文件后,到你保存  docker-compose.yml 文件的位置,运行以下命令来启动 Docker 应用:

    1. $ docker - compose up

    Composerize 是对 Docker 用户有用的工具之一。你现在可以安全地告别漫无边际的 Docker 命令了。

  • NetHogs——Linux下按进程实时统计网络带宽利用率

    网上有很多适用于Linux操作系统的开源网络监视工具.比如说,你可以用命令iftop来检查带宽使用情况. netstat用来查看接口统计报告,还有top监控系统当前运行进程.但是如果你想要找一个能够按进程实时统计网络带宽利用率,那么NetHogs就是你所需要的唯一工具.

    080844ph0m069f1w4e9mj0

    1

    NetHogs – 网络带宽监控

    什么是NetHogs?

    NetHogs 是一个开源的命令行工具(类似于Linux的top命令),用来按进程或程序实时统计网络带宽使用率.

    来自NetHogs项目网站:

    NetHogs是一个小型的’net top’工具,不像大多数工具那样拖慢每个协议或者是每个子网的速度而是按照进程进行带宽分组.NetHogs NetHogs不需要依赖载入某个特殊的内核模块. 如果发生了网络阻塞你可以启动NetHogs立即看到哪个PID造成的这种状况.这样就很容易找出哪个程序跑飞了然后突然占用你的带宽.

    这篇文章为你讲解了如何在Unix/Linux操作系统下如何安装和使用NetHogs按进程监控网络带宽使用率。

    在RHEL,CentOS和Fedora下安装NetHogs:

    要安装NetHogs,你必须要启用你所用Linux下的EPEL源.然后运行下面的yum命令下载安装NetHogs包.

    1. [ root@tecmint ~]# yum y install nethogs
    2.  
    3. Loaded plugins : fastest mirror , refresh packagekit
    4. Loading mirror speeds from cached hostfile
    5. * base : mirrors . hns . net . in
    6. * epel : mirror . nus . edu . sg
    7. * extras : mirrors . hns . net . in
    8. * rpmfusion free updates : mirrors . ustc . edu . cn
    9. * rpmfusion nonfree updates : mirror . de . leaseweb . net
    10. * updates : mirrors . hns . net . in
    11. Setting up Install Process
    12. Resolving Dependencies
    13. –> Running transaction check
    14. —> Package nethogs . i6860 : 0.8 . 0 1.el6 will be installed
    15. –> Finished Dependency Resolution
    16.  
    17. Dependencies Resolved
    18.  
    19. ===========================================================================================================
    20. Package                  Arch                  Version                      Repository                      Size
    21. ===========================================================================================================
    22. Installing :
    23. nethogs                i686                 0.8 . 0 1.el6                 epel                         28k
    24.  
    25. Transaction Summary
    26. ===========================================================================================================
    27. Install        1 Package ( s )
    28.  
    29. Total download size : 28k
    30. Installed size : 50k
    31. Downloading Packages :
    32. nethogs 0.8 . 0 1.el6.i686.rpm                                                          |    28kB      00 : 00
    33. Running rpm_check_debug
    34. Running Transaction Test
    35. Transaction Test Succeeded
    36. Running Transaction
    37.    Installing : nethogs 0.8 . 0 1.el6.i686                                                            1 / 1
    38.    Verifying    : nethogs 0.8 . 0 1.el6.i686                                                            1 / 1
    39.  
    40. Installed :
    41.   nethogs . i6860 : 0.8 . 0 1.el6
    42.  
    43. Complete !

    在Ubuntu, Linux mint和Debian下安装NetHogs:

    键入apt-get命令安装NetHogs包

    1. $ sudo apt-get install nethogs

    样例输出

    1. tecmint@tecmint :~ $ sudo apt-get install nethogs
    2. [ sudo ] password fortecmint :
    3. Reading package lists Done
    4. Building dependency tree
    5. Reading state information Done
    6. The following NEW packages will be installed :
    7. nethogs
    8. 0 upgraded , 1 newly installed , 0 to remove and 318 not upgraded .
    9. Need to get 27.1kB of archives .
    10. After this operation , 100kB of additional disk space will be used .
    11. Get : 1 http : //in.archive.ubuntu.com/ubuntu/ quantal/universe nethogs i386 0.8.0-1 [27.1 kB]
    12. Fetched 27.1kB in 1s ( 19.8kB / s )
    13. Selecting previously unselected package nethogs .
    14. ( Reading database 216058 files and directories currently installed .)
    15. Unpacking nethogs ( from …/ nethogs_0 . 8.0 1 _i386 . deb )…
    16. Processing triggers forman db
    17. Setting up nethogs ( 0.8 . 0 1 )…

    NetHogs用法

    在基于RedHat系统下键入如下命令启动NetHogs工具.

    要执行NetHogs你必须拥有root权限,即如图所示用sudo命令

    1. $ sudo nethogs

    样例预览:

    080846zf0ef7bgautccuxx

    2

    CentOS 6.3 下的NetHogs预览

    080847mojvxe9h92jxr79h

    3

    Ubuntu 12.10 下的NetHogs预览

    正如上图所示, send列和received列显示的是按照每个进程的流量统计.总的收发数据带宽在最下方,而且可以用交互命令控制排序,下面将要讨论这些交互命令:

    NetHogs 命令行参数

    以下就是NetHogs命令行的参数,用’-d’来添加刷新频率参数,device name 用来检测给定的某个或者某些设备的带宽(默认是eth0).例如:设置5秒钟的刷新频率,键入如下命令即可:

    如果只用来监视设备(eth0)的网络带宽可以使用如下命令:

    1. $ sudo nethogs eth0

    如果要同时监视eth0和eth1接口,使用以下命令即可:

    1. # nethogs eth0 eth1

    其他参数和用法

    NetHogs 交互控制

    以下是NetHogs的一些很有用的交互控制(键盘快捷键)

    想要NetHogs命令行工具的完整参数列表请参考NetHogs的手册,使用方法是在终端里输入‘man nethogs‘ 或者 ‘sudo man nethogs‘,更多信息请参考NetHogs项目主页.

  • 查看linux接口进出口流量的命令;linux 网络监控;流量监控

    1、nload,左右键切换网卡

    2、sudo iftop

    3、sudo iptraf 按连接/端口查看流量

    4、sudo nethogs: 按进程查看流量占用

    5、ss: 连接查看工具

    6、dstat -nf

  • mysql开发使用规范

    本规范旨在帮助开发人员逐步建立合理使用数据库的意识,对数据库相关的资源申请、业务规范使用等提供规范性的指导,从而为公司业务系统稳定、健康地运行提供保障。

    以下所有规范会按照【强制】、【建议】两个级别进行标注,对于【强制】级别的设计需强制修改调整。


    [TOC]

    开发规范

    对象命名

    命名规范的对象,是指数据库SCHEMA、表TABLE、字段COLUMN、索引INDEX、约束CONSTRAINTS等

    • 【强制】凡是需要命名的对象,其标识符不能超过30个字符
    • 【强制】名称必须以英文字母开头,不得以 _(下划线) 作为起始和终止字母
    • 【强制】所有名称的字符范围为:a-z, 0-9 和_(下划线),禁用大写、特殊符号、保留字、汉字和空格
    • 【强制】所有名称统一使用小写,并采用下划线 _ 分割
    • 【强制】名称应该清晰明了,能够准确表达事物的含义,最好可读,遵循“见名知意”的原则
    • 【建议】数据库账户,一定要做到权限划分明确,读写帐号分离,并且有辨识度,能区分具体业务
      dba内部账户以dba_开头;
      应用账户以user_开头:如user_upc、user_upc_r 分别代表读写、只读账号;
      读写分离不提供额外账户,统一使用应用账户;
      所有账户必须都在主库创建,只读查询只能从非候选上操作;
      
    • 【建议】若按日期时间分表,必须符合 _YYYY[MM][DD] 格式
    • 【建议】若按HASH进行分表,库表名后缀使用十进制数,下标从0开始、下划线分隔、需要补0、每个库的表名相同,比如:
      db_00{table_00 - table_31}
      db_01{table_00 - table_31}
      db_02{table_00 - table_31}
      db_03{table_00 - table_31}
      
    • 【建议】备份用的库、表名须以bak为前缀,以日期yyyymmdd为后缀,比如 bak_order_20160425,便于查找和知道有效期
    • 【建议】临时用的库、表名须以tmp为前缀,以日期yyyymmdd为后缀,比如 tmp_order_20160425,正常业务用到的临时表、中间表,前后缀尽量不要包含 tmp 以免造成歧义

    库表设计

    • 【强制】生产/UAT环境建库建表,请参考《mysql建库建表规范》
    • 【强制】单实例的库数量不得超过20个,再多考虑拆分实例
    • 【强制】单库的表数量不得超过100个,再多考虑拆分库
    • 【强制】单表的字段数量不得超过30个,再多考虑垂直分表
    • 【强制】单表的数据量控制在2000万或数据容量超过10G以内,否则考虑归档或分库分表
    • 【强制】单表的分表数量不得超过256个
    • 【建议】如无特殊需求,必须使用Innodb存储引擎
      解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高;
    • 【建议】如无特殊需求,必须使用utf8mb4字符集,排序规则使用utf8mb4_unicode_ci
      解读:万国码,无需转码,无乱码风险,节省空间,utf8mb4更可保存emoj表情(utf8不行);
    • 【强制】新建的库表必须添加注释
      解读:N年后鬼知道这个r1,r2,r3字段是干嘛的
    • 【建议】表都必须要显式指定主键,推荐自增id主键
      解读:
      a)主键递增,数据行写入可以提高插入性能,可避免page分裂,减少表碎片提升空间和内存的使用
      b)主键要选择较短的数据类型,Innodb引擎普通索引都会保存主键的值,较短的数据类型可以有效的减少索引的磁盘空间,提高索引的缓存效率
      c)无主键的表删除,在row模式的主从架构,会导致备库夯住
      
    • 【强制】禁止使用外键,外键功能请在应用层实现
      解读:外键使得表之间相互耦合,影响update/delete等SQL性能,有可能造成死锁,高并发情况下容易成为数据库瓶颈
    • 【建议】日志类型的表必须提前规划轮转机制或者选择定期清理/归档 或者选择合适的db,比如hbase/mongodb
    • 【建议】建议将大字段,访问频度低的字段拆分到单独的表中存储,分离冷热数据
    • 【强制】数据库中不允许存储明文密码
    • 【建议】如果对时间精度有要求,建表的时候请注意一下时间精度,比如 timestamp 与 timestamp(3);
    • 【强制】无特殊需求,严禁使用分区表

    字段设计

    • 【强制】各表之间相同意义的字段必须同名
    • 【建议】字段类型在满足需求条件下越小越好,使用unsigned存储非负整数 ,实际使用时候存储负数场景不多
    • 【建议】数值类型优于字符类型,所以能使用数值类型的尽量不要使用字符类型
    • 【强制】小数类型应选择精确度高的decimal等类型,禁止使用float和double
      解读:浮点数(float和double)在存储的时候,超过指定精度后会四舍五入,这是浮点数特有的问题。因此在精度要求比较高的应用中(比如货币)要使用定点数(decimal)而不是浮点数(float和double)来保存数据。
    • 【建议】合理选择char、varchar、text等字符串类型
      对于长度基本固定的小字符类型,如果该列恰好更新又特别频繁,适合char
      不固定长度的大字符类型,应选择varchar类型,varchar(N),N代表的是字符数,N尽可能的小
      varchar虽然存储变长字符串,UTF8最多能存21844个汉字,或65532个英文
      
    • 【强制】禁止使用BLOB和TEXT字段。如要使用,尽可能把text/blob拆到独立的表中,用PK与主表关联;
    • 【强制】禁止在数据库中存储大文件,例如图片、文件等;
    • 【建议】合理选择bit、int、tinyint、decimal等数字类型
      使用tinyint来代替 enum和boolean
      使用Decimal 代替float/double存储精确浮点数
      建议使用 UNSIGNED 存储非负数值
      int使用固定4个字节存储,int(11)与int(4)只是显示宽度的区别
      列禁止使用bit类型,请用tinyint类型替代。bit类型加了索引可能会导致sql结果不准。
      
    • 【建议】合理选择timestamp与datetime等时间类型
      timestamp可以在insert/update行时,自动更新时间字段;
      列为timestamp类型,必须指定默认值,要么current_timestamp,要么'1970-01-02 01:01:01',不要设置为''或0;
      解读:DATETIME和TIMESTAMP都可用来表示YYYY-MM-DD HH:MM:SS类型的日期。两种都保存日期和时间信息,毫秒部分最高精确度都是6位数。建议使用TIMESTAMP(3)。
      A. TIMESTAMP占用4字节,DATETIME占用8字节,当保存毫秒部分时两者都使用额外的空间 (1-3 字节)。
      B. TIMESTAMP的取值范围比DATETIME小得多,不适合存放比较久远的日期。TIMESTAMP只能存储从 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999' 之间的时间。而DATETIME允许存储从 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999' 之间的时间。
      C. TIMESTAMP的插入和查询受时区的影响。如果记录的日期需要让不同时区的人使用,最好使用 TIMESTAMP。
      
    • 【建议】如无特殊需要,字段建议使用NOT NULL属性,可用默认值代替NULL。如果是索引字段,一定要定义为not null。因为null值会影响cordinate统计和优化器对索引的选择
    • 【强制】禁止在列上配置字符集
    • 【建议】使用unsigned int存储IPv4,不要使用char(15)
      解读:ip转int使用 INET_ATON 函数,int转ip使用 INET_NTOA 函数,比如:select inet_aton(‘192.168.1.1’),inet_ntoa(3232235777);
    • 【建议】使用varchar(20)存储手机号,不要使用整数
      解读:
      1)涉及到国家代号,可能出现+/-/()等字符,例如+86
      2)手机号不会用来做数学运算
      3)varchar可以模糊查询,例如 like '138%'
      

    索引设计

    • 【强制】单表索引的数量不得超过5个,否则增加维护负担、降低写入性能、占用更多空间
    • 【建议】建立的索引能覆盖80%主要的查询,不求全,解决问题的主要矛盾
    • 【建议】主键应选择不重复、长度小的列,没有特殊要求,使用自增id作为主键
    • 【建议】自增列的名字固定为id,指定unsigned,类型2选1(int/bigint),自增列的值必须从1开始
    • 【建议】主键禁止使用字符类型,禁止使用联合主键,推荐使用唯一索引来替代
    • 【建议】业务上具有唯一特性的字段,必须创建唯一索引
    • 【建议】不建议在频繁更新的字段上建立索引
    • 【建议】索引尽量建在选择性高的列上,不在低基数列上建立索引,例如性别、类型
      选择性的计算方式为: select count(distinct(col_name))/count(*) from tb_name
      如果结果小于0.2,则不建议在此列上创建索引,否则大概率会拖慢SQL执行
      
    • 【建议】合理利用覆盖索引,联合索引,避免过多的单列索引,合理使用索引来避免排序和临时表的使用
    • 【建议】对超过30个字符长度的列创建索引时,考虑使用前缀索引,比如 idx_cs_guid2 (f_cs_guid(26)) 表示截取前26个字符做索引,既可以提高查找效率,也可以节省空间
      解读:前缀索引的缺点是,如果在该列上 ORDER BY 或 GROUP BY 时无法使用索引,也不能把它们用作覆盖索引(Covering Index)
    • 【建议】blob列不能作为key
    • 【建议】bit类型字段禁止单独加索引,或者做联合索引的第一列
    • 【建议】尽量使用Btree索引,不要使用其它类型索引
    • 【建议】DML和order by和group by字段要建立合适的索引

    关于组合索引的几点建议

    • 【强制】组合索引的字段数量不得超过5个
      解读:如果5个字段还不能极大缩小row范围,八成是设计有问题
    • 【建议】组合索引 – 选择性高的永远在左边
    • 【建议】组合索引 – 避免冗余索引,比如:(a,b,c)、(a,b)、(a),后二者为冗余索引
    • 【建议】组合索引的最左匹配原则:数据库引擎使用组合索引时,从左向右(并非where条件顺序)匹配,遇到范围查询(>、<、between、like)则会停止索引匹配,无法用到后续的索引列。where条件里面字段的顺序与索引顺序无关,优化器会自动调整顺序。
      比如索引idx_a_b_c(a,b,c),相当于创建了(a)、(a,b)、(a,b,c)三个索引,后二者为冗余索引:
      ①where a=?                  用到(a)        ⑦where c=?           用不到
      ②where b=? and a=?          用到(a,b)      ⑧where b=? and c=?   用不到
      ③where a=? and c=?          用到(a)
      ④where a>? and b=?          用到(a)
      ⑤where a=? and b=? and c>?  用到(a,b,c)
      ⑥where a=? and b>? and c=?  用到(a,b)
      

    SQL设计

    • 【强制】禁止使用游标、存储过程、视图、触发器、自定义函数、event
      解读:高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,涉及CPU计算的还是放到应用服务器上吧
    • 【建议】建议将复杂的计算和逻辑操作放到程序端处理,而不是使用SQL语句处理,因为程序端方便扩容,数据库端扩容能力有限
    • 【建议】数据结构设计时,可以适当设计冗余字段,减少查询的复杂度,提高查询的性能
    • 【强制】禁止在数据库中存储大文件,例如图片、文件等,可以将大文件存储在对象存储系统,数据库中存储路径
    • 【强制】禁止使用全文检索(Full Text Search),后续有这种需求使用搜索引擎处理
    • 【强制】禁止在没有匹配索引的表上进行for update这类的操作,会锁定整个表
    • 【强制】未经过DBA同意,禁止在程序端大批量更新或者删除数据,因为这样操作很可能造成复制的大量阻塞和延时,批量归档/删除,可以向dba发邮件提需求,由dba来处理
    • 【强制】禁止在生产/线上环境进行代码逻辑或SQL语句性能的测试,这类操作应在开发或者测试环境进行
    • 【建议】减少锁等待和竞争,避免大事务,使用短小事务
    • 【建议】尽量避免使用子查询,使用join来代替
    • 【强制】禁止使用order by rand()
    • 【建议】多行数据需要做处理时,建议批量处理,而不是一条条来处理
    • 【强制】单表的数据量控制在2000万或数据容量超过10G以内,否则考虑归档或分库分表
    • 【强制】避免大表join,禁止3个大表的join,join字段类型需保持绝对一致,关联字段必须有索引
    • 【建议】线上业务修改或删除数据,务必根据主键来实现
    • 【建议】禁止使用 SELECT * ,必须明确指定列
    • 【建议】insert必须指定字段,禁止使用 insert into xxx values()
      解读:指定字段插入,在表结构变更时,能保证对应用程序无影响
    • 【建议】能确定返回结果只有一条时,使用 limit 1
    • 【建议】避免隐式类型转换
    • 【建议】禁止在where条件列上使用函数
    • 【建议】限制使用like模糊匹配,禁止使用左模糊或者全模糊,%不要放首位
    • 【建议】涉及到复杂sql时,务必先参考已有索引设计,先explain
    • 【建议】考虑使用union all,少使用union,注意考虑去重
    • 【建议】IN的内容尽量不超过200个
    • 【建议】建议在每条查询语句后面加上Limit关键字,控制返回的数据量,防止不可控的返回大量的数据
    • 【建议】禁止大批量的查询数据结果,如果需要返回大量数据,请使用分页的方式处理,遇到分页有大的offset查询,可以使用延迟关联来解决
    • 【建议】分页优化
      SELECT * FROM tel_record t1 INNER JOIN (SELECT id FROM tel_record WHERE qiye_id = xxx ORDER BY id DESC LIMIT 999900,100) t2 ON t1.f_id = t2.f_id;
      程序端保留当前页的最小id、最大id(id是主键),降序情况下,每次提取下一页的数据时,id < min_id order by id desc limit 100; 上一页 id > max_id order by id desc limit 100
      
    • 【建议】大表count是消耗资源的操作,甚至会拖慢整个库,查询性能问题无法解决的,应从产品设计上进行重构。例如当频繁需要count的查询,考虑使用汇总表
    • 【建议】数据库的隔离级别默认为READ-COMMITTED,如不能满足业务需求,可在session层面做相应调整(必须清楚相应的隔离级别带来的锁影响)
    • 【建议】数据库默认的sql_mode为严格模式(STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION),在此模式下任何不支持的语法或者数据校验不合格的,都将直接返回错误
    • 【建议】日志类数据不建议存储在MySQL上,优先考虑mongodb,如需要存储请找DBA评估使用压缩表存储
    • 【建议】禁止使用ENUM,可使用TINYINT代替
      解读:增加新的ENUM值要做DDL操作;ENUM的内部实际存储就是整数而非字符串;
    • 【建议】禁止使用OR条件,必须改为IN查询,并注意in的个数小于200
      解读:旧版本mysql的OR查询是不能命中索引的,即使能命中索引,为何要让数据库耗费更多的CPU帮助实施查询优化呢? 补充:通常情况下,如果条件中有or,即使其中有条件带索引也不会使用,所以除非每个列都建立了索引,否则不建议使用OR。在多列OR中,建议用UNION ALL替换。
    • 【建议】所有连接的SQL必须使用 join … on … 方式进行连接,而不允许直接通过普通的where条件关联方式。外连接的SQL语句,可以使用left join on的join方式,且所有外连接一律写成left join,而不要使用right join
    • 【建议】避免使用否定条件。
      例如,where 条件里面有<>、not in 、not exists的时候,即便是在这些判断字段上加有索引,也不会起作用。
    • 【建议】有NULL值的字段查询
      解读:
      A.不要使用count(列名)或者count(常量)来替代 count(*),count(*)是SQL92定义的标准统计行数的语法,跟数据库无关,跟null和非null无关。count(*)会统计值为null的行,而count(列名)不会统计此列为null的行。
      B.count(distinct col)计算该列除null之外不重复的行数。count(distinct col1, col2),如果其中一列全为null,那么即使另一列有不同的值,也返回0
      C.当某一列的值全为null,count(col)的返回结果为0,但sum(col)的返回结果为null,因此使用sum()时需要注意空指针异常的问题。可以使用ISNULL()来判断是否为NULL值: SELECT IF(ISNULL(SUM(g)), 0, SUM(g)) FROM table;
      
    • 【建议】SQL合并,主要是指的DML时候多个value合并,减少和数据库交互

    使用规范

    开发行为规范

    • 【强制】推广活动或上线新功能必须提前通知DBA进行流量评估
    • 【强制】禁止在线上环境申请个人账号,只能申请业务使用的账号
    • 【强制】超过10w条的大批量更新,如修复数据、导入导出,避开高峰期,并通知DBA。可直接执行的sql由DBA操作
    • 【建议】及时处理已下线业务的SQL
    • 【建议】复杂sql要主动上报DBA评估,比如多表join/count/group by等
    • 【建议】重要项目的数据库方案选型和设计必须提前通知DBA参与
    • 【建议】对单表的多次alter操作必须合并为一次操作
    • 【强制】分库分表情况下,确保所有库表字段顺序一致
    • 【强制】所有数据库账号必须在主库创建
    • 【强制】禁止在数据库中存放业务逻辑SQL
    • 【建议】对特别重要的库表,提前与DBA沟通确定维护和备份优先级
    • 【建议】维护脚本须部署在关联实例机器上,切勿乱放,比如归档,拉数据等
    • 【建议】线上大批量delete和update,为了降低锁影响和减少从库延迟,必须批量执行,思路参考pt-archiver
    • 【强制】线上业务不允许申请truncate、drop权限,如果需要删除表,请提交工单并由dba操作
    • 【建议】线上不允许建立业务相关数据库JOB,业务逻辑在代码层实现
    • 【建议】线上不允许使用长事务,慎用set autocommit=0或者begin,推荐使用set autocommit=1,超时5秒的事务,DBA JOB会自动kill

    线上变更规范

    • 【强制】生产系统变更数据,请参考《线上变更规范》
    • 【建议】数据变更流程,可参考下图:

    mysql-upd-eflow

  • 应用软件安装·版本指导

    关于应用软件版本的选择,推荐使用官方、最新的LTS版(长期支持版本)。

    注:LTS(Long-Term Support)版本被认为是最稳定的版本,它经历了广泛的测试,并且大多包含了多年积累的改进。
    注:此文更新日期 2023-09-08

    操作系统

    • 关于操作系统的选择,考虑到 CentOS 7.9 将于 2024-07-30 停止更新,企业服务则推荐 Redhat Enterprise 8.6(有授权费用),免费系统则推荐 Oracle Linux 7.9,阿里云则推荐 Alibaba Linux 3.2104 LTS
    • 信创场景,推荐 银河麒麟 Server V10 SP3,若华为服务器则推荐 EulerOS 2.5
    • 免费场景,推荐 Ubuntu 22.04
    系统名称 推荐的版本 发布日期 官方地址
    CentOS CentOS 7.9 2014-06-10 https://www.centos.org/centos-linux
    Red Hat Red Hat Enterprise Linux release 8.6 2022-05-10 https://developers.redhat.com/products/rhel/download
    银河麒麟 Kylin Server V10 SP3 2023-04-28 https://www.kylinos.cn
    Ubuntu Ubuntu 22.04.2 LTS 2023-02-23 https://cn.ubuntu.com/download/server/step1
    openEuler openEuler 22.03 LTS SP2 2022-04-15 https://www.openeuler.org/zh/download
    Oracle Linux Oracle Linux 9.3 2024-04-23 https://yum.oracle.com/oracle-linux-isos.html
    Windows Windows Server 2022 2021-11-05 https://www.microsoft.com/zh-CN/windows-server
    虚拟化 Proxmox VE 7.4-1 2023-03-23 https://pve.proxmox.com/wiki/Downloads
    VMware 服务端 VMware vSphere Hypervisor (ESXi) 8.0U1a 2023-06-01 https://customerconnect.vmware.com/en/downloads
    VMware 个人版 VMware Workstation 17.0.2 Pro 2023-04-25 https://www.vmware.com/products/workstation-pro.html
    VirtualBox 7.0.12 2023-10-17 https://www.virtualbox.org/wiki/Downloads

    运维相关

    软件名称 当前最新的版本 发布日期 官方地址
    Docker 24.0.1 2023-05-19 https://download.docker.com/linux/static/stable/x86_64
    docker-compose v2.18.1 2023-05-17 https://github.com/docker/compose/releases
    Harbor v2.8.1 2023-05-12 https://github.com/goharbor/harbor/releases
    Rancher 2.7.1 2023-04-14 https://ranchermanager.docs.rancher.com/getting-started/overview
    Kubernetes 1.25.13 2023-08-24 https://kubernetes.io/releases/download https://github.com/kubernetes/kubernetes/releases
    Istio 1.17.2 2023-04-05 https://istio.io/latest/docs/setup/getting-started/#download
    Jenkins 2.387.3 LTS 2023-05-03 https://www.jenkins.io/download
    Gitlab 16.0 2023-05-22 https://about.gitlab.com/releases
    Zabbix 6.4 2023-05-30 https://www.zabbix.com/download
    Prometheus 2.44.0 2023-05-13 https://prometheus.io/download
    SkyWalking 9.4.0 2023-03-11 https://archive.apache.org/dist/skywalking
    Sentinel 1.8.6 2022-10-25 https://github.com/alibaba/Sentinel/tags
    Gluster 11.0 2023-02-07 https://download.gluster.org/pub/gluster/glusterfs
    openssl 3.1.2 2023-08-01 https://ftp.openssl.org/source
    openssh 9.7p1 2024-03-11 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable

    DBA相关

    软件名称 当前最新的版本 发布日期 官方地址
    Redis 7.0.11 2023-04-17 https://redis.io/download
    MySQL 8.0.32 2023-03-20 https://www.percona.com/downloads https://downloads.mysql.com/archives
    MongoDB 6.0.6 2023-05-12 https://www.mongodb.com/try/download/community https://www.mongodb.com/try/download/shell
    PostgreSQL 15.3 2023-05-11 https://www.postgresql.org/download
    SQL Server 2022 2022-11-16 https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads
    SSMS 19.1 2023-05-24 https://docs.microsoft.com/en-us/sql/ssms
    Oracle 21c 2021-08-13 https://docs.oracle.com/en/database/oracle/oracle-database/index.html
    TiDB 7.1.0 2023-05-31 https://docs.pingcap.com/zh/tidb/stable/release-notes
    Couchbase 7.6.0 2024-03 https://www.couchbase.com/downloads
    Memcached 1.6.30 2024-09-05 https://memcached.org/downloads
    Archery v1.9.1 2022-10-07 https://github.com/hhyo/archery/releases
    sqle v2.2304.0 2023-04-28 https://github.com/actiontech/sqle/releases
    Yearning v3.1.4 2023-04-24 https://github.com/cookieY/Yearning/releases

    开发相关

    软件名称 当前最新的版本 发布日期 官方地址
    JDK 1.8.0_381 2023-03-21 https://www.oracle.com/java/technologies/downloads
    OpenJDK 20.0.2 2023-06-14 https://jdk.java.net/archive (开源jdk,但也是oracle维护)
    Python 3.11.3 2023-04-05 https://www.python.org/downloads
    Node.js v20.12.1 2024-04-03 https://nodejs.org/en/download
    Nginx 1.25.0 2023-05-23 https://nginx.org/en/download.html
    Apache httpd 2.4.57 2023-04-06 https://httpd.apache.org/download.cgi
    Apache Tomcat 10.1.9 2023-05-19 https://tomcat.apache.org
    Apache Log4j 2.20.0 2023-02-17 https://logging.apache.org/log4j/2.x/download.html
    OpenSSL 3.1.0 2023-03-14 https://www.openssl.org/source
    MinIO RELEASE.2023-09-07 2023-09-07 https://min.io/download#/linux https://dl.min.io/server/minio/release
    MinIO Client RELEASE.2023-09-07 2023-09-07 https://dl.min.io/client/mc/release
    xxl-job 2.4.0 2023-03-23 https://github.com/xuxueli/xxl-job/releases
    ZooKeeper 3.8.1 2023-01-30 https://zookeeper.apache.org/releases.html
    ElasticSearch 8.7.1 2023-05-03 https://www.elastic.co/cn/downloads/elasticsearch
    org.kie/drools 8.39.0.Final 2023-05-25 https://www.drools.org/download/download.html
    Go 1.20.5 2023-02-01 https://golang.google.cn/dl
    Maven 3.9.3 2023-06-26 https://maven.apache.org/download.cgi https://maven.apache.org/docs/history.html
    Metabase 0.50.6 2024-06-19 https://github.com/metabase/metabase/releases
    antd 5.8.6 2023-09-02
    element-ui 2.15.4 2021-08-03
    dva 2.6.0-beta.19 2019-11-21
    umi 4.0.79 2023-09-01
    react 18.2.0 2022-06-15
    react-dom 18.2.0 2022-06-15
    webpack 5.88.2 2023-07-13

    大数据相关

    软件名称 当前最新的版本 发布日期 官方地址
    Hadoop 3.3.5 2023-03-22 https://hadoop.apache.org/releases.html
    Hive 3.1.3 2022-04-08 https://hive.apache.org/general/downloads
    HBase 2.5.4 2023-04-14 https://hbase.apache.org/downloads.html
    Spark 3.4.0 2023-04-13 http://spark.incubator.apache.org/downloads.html
    azkaban 4.0.0 2021-03-18 https://github.com/azkaban/azkaban/tags
    Oozie 5.2.1 2022-07-18 https://archive.apache.org/dist/oozie
    DolphinScheduler 3.1.7 2023-05-25 https://dolphinscheduler.apache.org/zh-cn/download
    Flume 1.11.0 2022-10-24 https://flume.apache.org/releases/index.html
    Sqoop 1.4.7 2020-07-06 https://archive.apache.org/dist/sqoop
    DataX v202303 2023-03-23 https://github.com/alibaba/DataX/releases
    Flink 1.17.0 2023-03-23 https://flink.apache.org/downloads
    Storm 2.4.0 2022-03-25 https://storm.apache.org/downloads.html
    Kafka 3.4.0 2023-02-07 https://kafka.apache.org/downloads
    Erlang 26.0.1 2023-06-08 https://www.erlang.org/downloads https://github.com/rabbitmq/erlang-rpm/releases
    RabbitMQ 3.12.1 2023-06-26 https://www.rabbitmq.com/download.html https://www.rabbitmq.com/news.html

    微服务技术栈

    软件名称 当前最新的版本 发布日期 官方地址
    Nacos 2.2.4 2023-06-20 https://github.com/alibaba/nacos/tags
    seata v2.0.0 2023-11-24 https://github.com/seata/seata/tags
    Spring Cloud Alibaba 2022.0.0.0 2023-07-25 https://sca.aliyun.com/zh-cn/version/version
    vue 2.7.14 2022-11-09
    vuex 3.6.2 2021-01-26
    vue-router 3.6.5 2022-09-06
    apisix
    Apollo
    Sentinel

    好用的镜像站

    分类 网站用途 下载地址
    linux 基于linux的rpm下载 http://rpm.pbone.net
    linux 基于linux的rpm下载-推荐 https://rpmfind.net/linux/rpm2html/search.php
    ubuntu 基于ubuntu的deb下载-官方-推荐 https://packages.ubuntu.com
    ubuntu 基于ubuntu的deb下载 https://launchpad.net/ubuntu
    不限os系统 华为云-镜像库 https://mirrors.huaweicloud.com/repository
    不限os系统 清华大学-开源软件镜像站 https://mirrors.tuna.tsinghua.edu.cn
    信创-麒麟 麒麟V10的rpm源 https://update.cs2c.com.cn/NS/V10
    信创-鲲鹏 华为云-镜像库-鲲鹏系统 https://mirrors.huaweicloud.com/kunpeng
    python 基于python的package下载 https://pypi.org
    python 基于Wheel格式的python包下载 https://www.lfd.uci.edu/~gohlke/pythonlibs
    工具 i tell you 工具资源下载 https://msdn.itellyou.cn/
    Copyright © www.sqlfans.cn 2023 All Right Reserved
  • 常用软件快速安装

    [TOC]

    基础环境

    安装 docker 24.0.1

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Ubuntu 20.04、Oracle Linux 7.9
    curl -sL 'http://iso.sqlfans.cn/docker/install_docker_2401.sh' | bash
    docker --version
    

    安装 docker-compose 2.18.1

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Ubuntu 20.04、Oracle Linux 7.9
    curl -sL 'http://iso.sqlfans.cn/docker/install_docker_compose_2181.sh' | bash
    docker-compose --version
    

    安装 jdk 20.0.2

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Ubuntu 20.04、Oracle Linux 7.9
    curl -sL http://iso.sqlfans.cn/jdk/install_openjdk_2002.sh | bash
    source /etc/bashrc
    java -version
    

    安装 jdk 1.8.0_391

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Ubuntu 20.04、Oracle Linux 7.9
    curl -sL http://iso.sqlfans.cn/jdk/install_jdk_8u391.sh | bash
    source /etc/bashrc
    java -version
    

    安装 node.js 16.20.2

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Ubuntu 20.04、Oracle Linux 7.9,请使用与glibc兼容的node.js版本
    curl -sL http://iso.sqlfans.cn/linux/install_nodejs_16202.sh | bash
    node -v
    

    安装 gcc 4.8.5

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Oracle Linux 7.9,不支持 Ubuntu
    #.在线安装
    # yum install -y gcc
    
    #.离线安装
    curl -L http://iso.sqlfans.cn/linux/gcc-4.8.5.tar.gz -o /opt/gcc-4.8.5.tar.gz
    tar xvf /opt/gcc-4.8.5.tar.gz -C /opt/
    rpm -Uvh /opt/gcc-4.8.5/*.rpm --nodeps --force
    gcc --version
    

    安装 python 3.12.3

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Oracle Linux 7.9,不支持 Ubuntu
    #.安装gcc及zlib这2个必要依赖
    yum install -y gcc zlib zlib-devel
    
    #.开始安装
    curl -sL 'http://iso.sqlfans.cn/python/install_python_3123.sh' | bash
    python3 --version
    pip3 --version
    

    安装 pip 19.3.1

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Oracle Linux 7.9,不支持 Ubuntu
    #.基于 Python 2.7.5
    curl -sL 'http://iso.sqlfans.cn/python/install_pip_1931.sh' | bash
    pip --version
    

    常用中间件

    安装 nginx 1.25.0

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Oracle Linux 7.9,不支持 Ubuntu
    #.开始安装
    cd /opt
    wget -c http://iso.sqlfans.cn/linux/zlib-1.2.11.tar.gz
    wget -c http://iso.sqlfans.cn/linux/pcre-8.44.tar.gz
    wget -c http://iso.sqlfans.cn/linux/openssl-1.1.1g.tar.gz
    wget -c http://iso.sqlfans.cn/linux/nginx-1.25.0.tar.gz
    wget -c http://iso.sqlfans.cn/linux/nginx_openssl_conf.conf
    wget -c http://iso.sqlfans.cn/linux/install_nginx_1250.sh
    bash install_nginx_1250.sh
    
    #.确认版本
    /usr/local/nginx/sbin/nginx -version
    

    安装 mysql 5.7.44

    • 适用于:Centos 7.9、Kylin V10、Oracle Linux 7.9,不支持 Ubuntu
    #.ubuntu请改为:apt install -y libaio1 libaio-dev
    
    #.开始安装
    cd /opt
    curl -L http://iso.sqlfans.cn/mysql/percona-server-5.7.44-48.tar.gz -o /opt/percona-server-5.7.44-48.tar.gz
    curl -sL http://iso.sqlfans.cn/mysql/config/5.7/my_innodb.cnf -o /opt/my_innodb.cnf
    curl -sL http://iso.sqlfans.cn/mysql/install_percona_5744.sh -o /opt/install_percona_5744.sh
    bash install_percona_5744.sh /opt /data 3306
    
    #.登录测试
    mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3306.sock -e"select host,user,plugin,account_locked from mysql.user;"
    

    安装 mysql 8.0.32

    • 适用于:Centos 7.9、Kylin V10、Oracle Linux 7.9,不支持 Ubuntu
    #.开始安装
    cd /opt
    curl -L http://iso.sqlfans.cn/mysql/percona-server-8.0.32-24.tar.gz -o /opt/percona-server-8.0.32-24.tar.gz
    curl -sL http://iso.sqlfans.cn/mysql/config/8.0/my_innodb.cnf -o /opt/my_innodb.cnf
    curl -sL http://iso.sqlfans.cn/mysql/install_percona_8032.sh -o /opt/install_percona_8032.sh
    bash install_percona_8032.sh /opt /data 3306
    
    #.登录测试
    mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3306.sock -e"select host,user,plugin,account_locked from mysql.user;"
    

    安装 mysql 8.4.0

    • 适用于:Centos 7.9、Kylin V10、Oracle Linux 7.9,不支持 Ubuntu
    #.开始安装
    cd /opt
    curl -L http://iso.sqlfans.cn/mysql/percona-server-8.4.0-1.tar.gz -o /opt/percona-server-8.4.0-1.tar.gz
    curl -sL http://iso.sqlfans.cn/mysql/config/8.4/my_innodb.cnf -o /opt/my_innodb.cnf
    curl -sL http://iso.sqlfans.cn/mysql/install_percona_8401.sh -o /opt/install_percona_8401.sh
    bash install_percona_8401.sh /opt /data 3306
    
    #.登录测试
    mysql -udba_admin -pcf_rB1NKCzbaQuPH -S /tmp/mysql_3306.sock -e"select host,user,plugin,account_locked from mysql.user;"
    

    安装 redis 6.2.5

    • 适用于:Centos 7.9、Kylin V10、Ubuntu 20.04、Oracle Linux 7.9,在 EulerOS 2.5 会遇到 Permission denied 问题
    #.开始安装
    cd /opt/
    wget -c http://iso.sqlfans.cn/redis/redis-6.2.5.tar.gz
    wget -c http://iso.sqlfans.cn/redis/install_redis_625.sh
    bash install_redis_625.sh /data 6379
    
    #.登录测试
    echo "info keyspace" | /usr/local/bin/redis-cli -a RbY9k2_NBf1QWy8I -c -p 6379 2>/dev/null
    

    安装 redis 7.0.11

    • 适用于:Centos 7.9、Kylin V10、Ubuntu 20.04、Oracle Linux 7.9,在 EulerOS 2.5 会遇到 Permission denied 问题
    #.开始安装
    cd /opt/
    wget -c http://iso.sqlfans.cn/redis/redis-7.0.11.tar.gz
    wget -c http://iso.sqlfans.cn/redis/install_redis_7011.sh
    bash install_redis_7011.sh /data 6379
    
    #.登陆测试
    echo "info keyspace" | /usr/local/bin/redis-cli -a RbY9k2_NBf1QWy8I -c -p 6379 2>/dev/null
    

    安装 mongodb 6.0.6

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Oracle Linux 7.9,不支持 Ubuntu
    #.从5.0开始要求CPU必须支持AVX指令集,执行如下命令若无返回则表示不支持adx
    cat /proc/cpuinfo | grep avx
    
    #.开始安装
    cd /opt
    wget -c http://iso.sqlfans.cn/linux/numactl-2.0.12-5.el7.x86_64.rpm
    wget -c http://iso.sqlfans.cn/linux/openssl-1.0.2k-26.el7_9.x86_64.rpm
    wget -c http://iso.sqlfans.cn/mongodb/mongodb-linux-x86_64-rhel70-6.0.6.tgz
    wget -c http://iso.sqlfans.cn/mongodb/mongosh-1.6.0-linux-x64.tgz
    wget -c http://iso.sqlfans.cn/mongodb/install_mongodb_606.sh
    bash install_mongodb_606.sh /data 3717
    
    #.登陆测试
    echo "db.system.users.find();" | /usr/local/mongodb/bin/mongosh -u dba_admin -p 1_yyJnwRD48CbSql --authenticationDatabase admin --host 127.0.0.1 --port 3717 admin
    

    安装 postgresql 10.12-1

    • 适用于:Centos 7.9、Kylin V10、Oracle Linux 7.9,在 EulerOS 2.5 会遇到 Permission denied 问题
    #.开始安装
    cd /opt/
    wget -c http://iso.sqlfans.cn/postgresql/postgresql-10.12-1-linux-x64-binaries.tar.gz
    wget -c http://iso.sqlfans.cn/postgresql/install_pgsql_1012.sh
    wget -c http://iso.sqlfans.cn/postgresql/my_pgsql.conf
    bash install_pgsql_1012.sh /opt /data 1921
    
    #.登陆测试
    /opt/pgsql/bin/psql -h 127.0.0.1 -p 1921 -U postgres -d postgres -c "SELECT * FROM pg_shadow;"
    

    安装 oracle 11g

    • 适用于:Centos 7.9、Kylin V10、Oracle Linux 7.9
    #.开始安装
    cd /opt/
    wget -c http://iso.sqlfans.cn/oracle/p13390677_112040_Linux-x86-64_1of7.zip
    wget -c http://iso.sqlfans.cn/oracle/p13390677_112040_Linux-x86-64_2of7.zip
    wget -c http://iso.sqlfans.cn/oracle/install_oracle_11g.sh
    bash install_oracle_11g.sh
    
    #.登陆测试
    su - oracle -c "sqlplus / as sysdba"
    SQL> select * from v
    $version
    ;
    

    安装 minio 2023-06-29

    • 适用于:Centos 7.9、Kylin V10、EulerOS 2.5、Ubuntu 20.04、Oracle Linux 7.9
    #.开始安装
    mkdir -p /data/minio_9000/{data,logs}
    curl -L http://iso.sqlfans.cn/linux/minio.2023-06-29 -o /data/minio_9000/minio
    chmod +x /data/minio_9000/minio
    
    export MINIO_ROOT_USER
    =minioadmin
    export MINIO_ROOT_PASSWORD
    =Admin_147
    nohup /data/minio_9000/minio server /data/minio_9000/data --console-address=
    ":9100" > /data/minio_9000/logs/minio.log 2>
    &1 &
    
    #.登录测试
    地址:http://{ip}:9100
    账号:minioadmin
    密码:Admin_147
    

    安装 elasticsearch 7.10.1

    • 适用于:Centos 7.9、Kylin V10、Oracle Linux 7.9
    #.开始安装
    curl -sL 'http://iso.sqlfans.cn/linux/install_elasticsearch_7101.sh' | bash
    /data/elasticsearch_9200/bin/elasticsearch --version
    
    #.登陆测试
    curl http://127.0.0.1:9200/_cat/indices?v
    
    Copyright © www.sqlfans.cn 2023 All Right Reserved
  • 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服务挂掉,会自动启动新容器,而不是继续重启容器服务。
    • 数据库利用中间件和容器化系统能够自动伸缩、容灾、切换、自带多个节点,也是可以进行容器化的。

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