日期: 2024 年 10 月 21 日

  • 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服务挂掉,会自动启动新容器,而不是继续重启容器服务。
    • 数据库利用中间件和容器化系统能够自动伸缩、容灾、切换、自带多个节点,也是可以进行容器化的。

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