中台项目中遇到的问题:

1.数据库大:

2.单表大:

3,月增长数据量大

mysql 运维进阶指南书 mysql运维方案_数据库

----------------------------------------------------------------------------

一、引入PARTITION表:

1.1如果物理分表,会增大处于快速迭代敏捷开发的中台组工作量和工作难度,因此采用

MYSQL自身分区技术,将对应用侵袭影响降到最低

itf_imp_lines(接口):按头表ID hash分区

PARTITION BY HASH(HEADER_ID)

PARTITIONS 32;

ae_tfr_dtl_accounts (账务明细表):每个月一个分区

PARTITION BY RANGE ( to_days( ACCOUNTING_DATE ))(

PARTITION p0 VALUES LESS THAN (TO_DAYS('2018-03-01')),

itf_ar_interface(还款计划表):每4个月一个分区

PARTITION BY RANGE (I_INCOME_PERIOD)(

PARTITION p0 VALUES LESS THAN (201701),

PARTITION p1 VALUES LESS THAN (201705),

contract_balance(合同余额表):

ITF_COMMISSION(佣金目标表):

PARTITION BY RANGE ( to_days( ACCOUNTING_DATE )

1.2分区后遇到的问题-----------------------------------------------------------------

ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's

partitioning function

分区键必须被添加到PRIMARY KEY定义中!!!

- 分区键数据不可为NULL,因此需要考虑对分区键NULL值刷数

- 死锁!

LATEST DETECTED DEADLOCK

*** (1) TRANSACTION:update hscs_ae_tfr_dtl_accounts

set TFR_SUM_ACCOUNT_ID =

1766752,summary_flag='Y' where

TFR_DTL_ACCOUNT_ID in (90154363, 90154356,

90158344, 90158337, 90154461, 90150361, ...

*** (2) TRANSACTION:update hscs_ae_tfr_dtl_accounts

set TFR_SUM_ACCOUNT_ID =

1766743,summary_flag='Y' where

TFR_DTL_ACCOUNT_ID in (90150239, 90142046,

90154332, 90146139, 90137946, 90150232, ...

应对:

1,MYSQL升级(5.7.12-5.7.19):见效最快

2,应用修改:原UPDATE xxx where PK = XXX

修改为UPDATE xxx where PK = XXX and ‘分区键’ = YYYY:最彻底

二、分库后遇到的问题-----------------------------------------------------------------

2.1 将业务库按一定规则拆分为业务库(hscs)和归档库(hscs_archive),部署在同一数据库实例上;

衍生问题:部分业务逻辑需要业务库关联归档库一起查询,SQL复杂且难以优化

2.2 应对:中台月增数据很大部分来自账务明细表,经项目组小伙伴努力,优化对应明细账未发生则不写入核算中台,将月增数据减少近50%

影响:

1,提高了OTTER同步核算中台数据到EBS的效率;

2,减少了主从同步延时

-------------------------------------------------------

三、性能问题:----------------------------------------------------------

3.1 现象:创建账务期间,MYSQL主从库延迟很大

应对:

1,修改应用,尽量将大事务修改为适中的小事务;(理论最优方案)

2,修改binlog_format:ROW->MIX(效果一般)

3,开启MYSQL并行复制(效果一般)

4,MYSQL升级:5.7.19->5.7.27(综合最佳解决方案)

3.2 现象:多个并发导入任务时,数据加载速度慢

应对:

修改MYSQL默认隔离级别

RR(READ REPEATABLE)-> RC(READ COMMIT)

四、实战参数-----------------------------------------------

innodb_buffer_pool_size:60%-80%物理

innodb_log_file_size: 4G(512MB*3)

max_connections:2000

innodb_file_per_table:ON

innodb_flush_log_at_trx_commit:

1:全ACID支持:每次commit时会将redo buffer写入到redo file,然后刷新到磁盘中

0: COMMIT时不写,每隔一秒将redo buffer写入到redo file,然后刷新到磁盘中(适用于replica)

2: COMMIT时redo buffer写入到redo file ,每隔一秒将刷新到磁盘中

innodb_flush_method:推荐O_DIRECT

fsync: 刷新数据文件和REDO日志时,使用fsync()系统调用;

O_DSYNC: InnoDB 使用O_SYNC 来打开和刷新REDO日志文件;使用fsync()来刷新数据文件

O_DIRECT: InnoDB使用O_DIRECT 来打开数据文件,使用fsync()来刷新数据和REDO日志文件

innodb_log_buffer_size:8M(如果GLOBAL STATUS的innodb_log_waits>0,则增加)

query_cache_size:建议为0

log_bin: ON

skip_name_resolve: ON