1 redis当前实例
1.1目前配置与使用状态
现象:redis目前上课等高峰期cpu使用率达到60%-80%,所以单实例目前已经不能满足要求,需要拆分成两个实例,拆分原则和结论与下面mysql类似。
1.2 redis从4到5的主要优化:
1)内存优化:
主动碎片整理 3.0只能定期重启 4.0主动或手动个清理 5.0增强版(更快速、低延迟)主动碎片整理
HyperLogLog算法得到改进,优化了计数统计时的内存使用效率。
INFO命令返回信息更加详实。
2)RDB支持存储LFU、LRU
3) 支持多播的可持久化消息队列,支持消费分组,ack机制
4)命令新增和优化 如:LOLWUT命令 Redis-cli支持集群管理 help结果更丰富 有序集合新增两个命令:ZPOPMIN和ZPOPMAX。
5)对Redis核心代码进行了重构并在许多方面进行了改进
建议升级到5.0
结论:redis需要升级相关配置,升级核数,然后版本升级到5.0.
bcy-pm-env对应的redis、mysql跟运维确认使用场景,看看是否可以清退或升级。
问题:
redis一共3个实例,除了现在的的生产和测试,下面的实例是用在哪里呢?:
r-8vbj65ybljj55iw2j5 bcy-pm-env
mysql同样有一个pm实例:bcy-pm-en。。。
2 mysql当前实例
主(写)库配置与监控
图略
从(读)库配置与监控
图略
结论:磁盘好像不太够了,下面该清理的表清理后继续观察。
梳理可清除的表、库
mysql prod 中的库:
coding-cloud:废弃库,确定可以清掉。确认下最近的连接情况,无连接确认可以清楚
noc-cloud:以前noc使用的库,待确认后期是否需要。确认下最近的连接情况,无连接确认可以清楚
sa-cloud :小大使对应的库,待确认后期是否需要。确认下最近的连接情况,无连接确认可以清楚
editor-channel :评测共有库,其中judge_result2个月产生200万数据,后期数据量会很大。
班课库中可以彻底清除的表包括:
stats_lesson_answer_detail 千万级别
stats_lesson_answer_title
stats_stu_practice_detail
stats_stu_practice_title
checkpoint_file还在用,几千条记录 4G磁盘,需要确认check_point字段老数据是否在使用,如果不在使用可以删除该字段。
scratch_exercise表,因xml字段表大,在用。
3 业务角度梳理平台
班课:学生端 教师端 管理端
社区:社区作品、个人中心、自由创作
竞赛:题库、竞赛
基础服务:editor-channel coding-judge 以及未来可能拆出来的服务
各平台特性:
数据量 (磁盘) | 数据增长速度 | 有无高峰期 (cpu、内存) | 稳定性 | ||
---|---|---|---|---|---|
班课 | 百万且表多 | 快 | 有 | 高 | |
基础服务 | 百万但表少 | 快 | 有,且同班课与竞赛 | 高 | |
竞赛 | 万 | 慢 | 有 | 高 | |
社区 | 千 | 慢 | 无 | 低 |
总结:
库层面拆分策略:
竞赛一个库 --已经独立
c++题库一个库 --待从班课库拆分
社区相关(社区作品、个人中心、自由创作)一个库 --待从班课库拆分
每个基础服务一个库 --editor-channel已拆分(feign实现的rpc调用)
数据统计相关一个库 --待从班课库拆分(拆分后存在相互rpc调用的问题)
mysql实例拆分:
根据数据量、错开高峰期与稳定性要求的原则,竞赛、基础服务放到一个mysql实例中;
班课、社区、题库单独一个mysql实例;
具体过程:
1)申请新的mysql实例,将竞赛库(competition_cloud)、基础服务库(editor_channel)对应数据同步到该实例中
2)修改项目中配置,上线,测试,修改班课mysql实例中竞赛库(competition_cloud)、基础服务库(editor_channel)的库名称
3)运行2周无问题后彻底删除班课mysql实例中竞赛库(competition_cloud)、基础服务库(editor_channel)的数据
redis 的database和实例做类似mysql的拆分。
具体过程:
1)申请新的redis实例,不需要做预热吧
2)修改竞赛、基础服务 项目中redis配置,上线,测试
库拆分
题库一个库 --待从班课库拆分,可以直接拆分。
具体过程:
1)梳理题库相关表,以及是否需要获取班课表中的数据?
2)进行表中数据的迁移
3)修改题库项目中配置,上线,测试
4)删除班课库中的题库相关的表
社区相关(社区作品、个人中心、自由创作)一个库 --待从班课库拆分,可以直接拆分
拆分时间:社区相关功能上线后可以进行拆分,需要拆分代码和库
数据统计相关一个库 --待从班课库拆分(拆分后存在相互rpc调用的问题,需要梳理好解决方案)
4 告警配置
redis mysql的磁盘、cpu、内存、IOPS分别配置告警策略
慢sql能告警吗 如同一慢sql执行频率为天3条以上
确定先把竞赛、基础服务(editor)拆开到单独mysql和redis实例中。
题库、社区后面逐步处理,先拆项目后拆库,与竞赛使用同一redis和mysql实例
竞赛与channel物理隔离准备工作
需要与运维确认的问题:
1 下面两个实例是做什么用的?费用怎么样?最近三个月是否有流量进入
mysql实例:bc*** 还有个只读从库rr-8vb5ozxs7xoie34b9
redis的实例,r-8vb****
运维确认的结果是:redis还有会话在,replic config config,但是看cmd 像是自身服务的会话
运维建议:先关机一个月,确认这段时间没响应再考虑备份删除。
2 确定三个库的使用情况,6月1号-11月30号,下面的库是否在使用,是否有写入和连接?
rm-8****n1的库:
coding-cloud 无用
noc-cloud 无用
sa-cloud 无用
无法按照时间筛选,后来发现数据量都不大,dump后直接删除了。
3 redis升级版本和配置
现有redis实例版本从4修改到5,redis cpu使用较高
运维老师确认升级可能带来的问题?
已确认:
升级版本问题不大
针对cpu高的问题,redis因为是单线程的,所以需要做读写分离解决cpu过高的问题,同时解决大对象写入导致的查询延迟的问题。
4 申请新的redis和mysql实例
1)redis
按照3中升级后的结果申请一个相同的redis实例,即5.0版本 8G主从版
名称:bcy-competition-prod
2)mysql
mysql申请实例 1写2读,共三个机器
1写,配置与现有写(rm-***8tn1)大致相同,不同点:磁盘200G,名称:bcy-competition-prod-write
2读,配置与现有读(rr-****qc)大致相同,不同点:磁盘200G,机器核数4核,
名称:bcy-competition-prod-read1和bcy-competition-prod-read2
5 能否进行mysql的跨实例数据迁移?
如:将rm-***tn1中竞赛库(competition_cloud)、基础服务库(editor_channel)对应数据同步到该实例中
假设上面同步完成后,rm-***8tn1中竞赛库(competition_cloud)又新插入了数据,那么跨mysql实例可以同步增量吗
刘海峰和阿里运维已经确认支持dts的增量同步。
6 执行mysql实例的拆分
具体过程:
1)申请新的mysql实例,将rm-8vbc8o86198mx8tn1中竞赛库(competition_cloud)、基础服务库(editor_channel)对应数据同步到该实例中
2)修改项目中配置,上线,测试,修改班课mysql实例中竞赛库(competition_cloud)、基础服务库(editor_channel)的库名称,名称后增加_del
3)运行2周无问题后彻底删除班课mysql实例中竞赛库(competition_cloud)、基础服务库(editor_channel)的数据
执行redis实例的拆分
1)申请新的新的redis实例
2)修改竞赛和基础服务项目中的redis配置,上线,测试
7 告警配置
redis 和 mysql 新老均需要配置
8 清理和迁移库、表完成后,验证是否需要对bcy-prod-01-r增加磁盘,现在使用率达到71%
9 库和表的删除策略:
统一修改表或库名称增加_del,两周后彻底删除表和库。
要修改的库:
coding-cloud
noc-cloud
sa-cloud
要修改的表:
stats_lesson_answer_detail 千万级别
stats_lesson_answer_title
stats_stu_practice_detail
stats_stu_practice_title
要修改的字段:
checkpoint_file.check_point字段还在使用,所以不删除。
主要信息记录
1 待关闭的redis和mysql所有密码都完成了重置
统一重置为:**********
2 新建的mysql实例
生产竞赛平台和channel平台现在使用的redis和mysql实例如下:
mysql:
host:rm-8****
port:3306
name:cloudcompetition
pwd:
redis:
database: 0 --- 竞赛
database: 1 --- channel
host: r-8vbxdm7d***
port: 6379
password:
竞赛与channel物理隔离实施过程记录
本周五(12月11日)执行的操作
先关闭redis和mysql实例 -刘** done 修改的账号密码
关闭(注意:不是删除)如下mysql实例:写:bcy-p** 读:rr-8vb5ozxs7xoie34b9
关闭(注意:不是删除)redis实例:r-8v** bcy-pm-env
问题与解决:
发现不能关闭,只能释放;所以最终采取的方案是重置了所有账号的密码
申请新的redis和mysql实例,并提供新的连接方式等 --刘**
redis(bcy-competition-prod) 8G读写(1读1写),两个机器 最大连接数20000 最大私网带宽:192mb/S
mysql 班课对应实例配置
1写 8核 16G内存,IOPS 8000,最大连接数:4000,磁盘400G 名称:bcy-mysql-prod(rm-8vbc8o86198mx8tn1)
2读 8核 16内存,IOPS 8000,最大连接数:4000,磁盘300G或400G 名称:bcy-prod-01-r(rr-8vbjtdvd4659803qc)和
bcy-prod-02-r(rr-8vb2zf880p2im3n57)
mysql申请实例 1写2读,共三个机器
1写,8核 16G内存,IOPS 8000,最大连接数:4000,磁盘200G 名称:bcy-competition-prod-write(rm-8vb4v53h0l8u19581)
2读,4核 8G内存,IOPS 5000,最大连接数:2000,磁盘200G 名称:bcy-competition-prod-read1(rr-8vbfs4pk6fyi8s7tl)和
bcy-competition-prod-read2(rr-8vb9hho4yl8bice34)
并将现有mysql(rm-8vbc8o86198mx8tn1)实例中的两个库(competition_cloud和editor-channel)通过dts同步到新的实例中。
怎么验证mysql数据同步成功?
重要表result验证了总量,正常
验证了增量与减量
问题与解决:editor-channel库的cpp_judge_result表新增记录id=9999,增量确实未同步,联系阿里服务后解决。
修改竞赛库(competition_cloud)、基础服务(editor_channel)两个项目的redis和mysql配置 -马* done
redis:host port password
mysql:url username password
修改如下库与表名-马* done
rm-8vbc8o86198mx8tn1 mysql实例中
codingcloud 修改库名为 codingcloud_del
noc-cloud 修改库名为 noc-cloud_del
sa-cloud 修改库名为 sa-cloud_del
因为Innodb不支持修改库名,方式为dump后直接删除。
stats_lesson_answer_detail 修改表名
stats_lesson_answer_title 修改表名
stats_stu_practice_detail 修改表名
stats_stu_practice_title 修改表名
11月14日执行如下操作:
1 merge modifyConf新的配置,服务上线 --马*
2 测试回归 竞赛、c++评测 python运行等 -- 屈*
3 修改班课mysql实例中竞赛库(competition_cloud)、基础服务库(editor_channel)的表名称,名称后增加_del,表如下:
user、bundle_formal、cpp_exercise、cpp_judge_result
4 将新的mysql实例同步给大家:
mysql:
host:rm-8vb***
port:3306
name:cloudcompetition
pwd:咨询运维 刘海*pwd
redis:
database: 0 --- 竞赛
database: 1 --- channel
host: r-8v***
port: 6379
password: 咨询运维刘海*
升级原本redis实例为1写1读 --刘海*
redis从4.0标准升级到5.0读写是否会修改地址? 不修改,所以升级不用做代码中配置的修改
redis读写版本是否向mysql那样需要配置代理? 不需要,阿里服务已经封装好了,提供的直接就是代理的url
新的redis实例能否做预热?可以,直接班课的redis实例中的数据同步到竞赛redis实例即可。
是否需要配置白名单?在竞赛和channel机器上ping新申请的redis和mysql的url,可以ping通即可。结果是通的,不需要做白名单配置
怎么确保上线后redis立即可用?
验证新申请的redis实例到竞赛的网络、端口是通的,或者暗转redis客户端直连尝试
班课redis数据同步到新redis实例,没做,刚开始慢点,省点钱吧
班课mysql数据同步到新实例,200元买了dts服务
本地环境连接生产的配置,直接测试。。。
token无效,但是一般本地项目,从生产拷贝的token是可以的???从登陆开始测试是ok的
coding-judge 没用到redis和mysql
2个redis实例的告警配置 --刘海*
redis average-cpu 70%告警 统计周期3分钟
redis average-内存 70%告警 统计周期3分钟
redis average-磁盘 80%告警 统计周期3分钟
intranet out ratio 80%告警
intranet in ratio 80%告警
mysql另外1写4读机器也需要做类似配置 --刘海*
mysql 写机器做了如下告警配置:
MySQL_NetworkOutNew 60秒 如果MySQL_NetworkOutNew出现3次平均值>=8589934592undefined就通知byc-ops
IOPS使用率 60秒 如果IOPS使用率出现3次平均值>=45%就通知byc-ops
MySQL_NetworkInNew 60秒 如果MySQL_NetworkInNew出现3次平均值>=8589934592undefined就通知byc-ops
内存使用率 60秒 如果内存使用率出现3次平均值>=70%就通知byc-ops
磁盘空间使用率 60秒 如果磁盘空间使用率出现3次平均值>=80%就通知byc-ops
MySQL_ActiveSessions 60秒 如果MySQL_ActiveSessions出现3次平均值>=540undefined就通知byc-ops
CPU使用率 60秒 如果CPU使用率出现3次平均值>=45%就通知byc-ops
问题:
因为redis连接不上导致启动竞赛项目失败,又因为noc竞赛今日老师需要使用竞赛平台阅卷,所以先回滚项目。。
异常如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisLettuceAutoInit' defined in class path resource [com/alicp/jetcache/autoconfigure/RedisLettuceAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Illegal character in authority at index 8: redis://L^……nnnnnnnn@r-8vbxdm7dg***:6379/0
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(
最终本地测试,发现是因为redis密码中含有特殊字符,但redisLettuce不支持导致的,最终重置密码后次日重试。
12月15(周二工作)
1 merge modifyConf新的配置,服务上线 --马*
2 测试回归 竞赛、c++评测 python运行等 -- 屈**雷
3 修改班课mysql实例中竞赛库(competition_cloud)、基础服务库(editor_channel)的表名称,名称后增加_del,表如下:
user bundle_formal cpp_exercise cpp_judge_result
4 将新的mysql实例同步给大家:
生产竞赛平台和channel平台现在使用的redis和mysql实例如下:
mysql:
host:rm-8vb4**
port:3306
name:cloudcompetition
pwd:
redis:
database: 0 --- 竞赛
database: 1 --- channel
host: r-8vbxd**
port: 6379
password:
测试发版不在运维支持群里发告警通知 -- 何**
12.29(或1月中旬?)
删除如下库与表(测试 dev 和 prod)-马*
stats_lesson_answer_detail_del
stats_lesson_answer_title_del
stats_stu_practice_detail_del
stats_stu_practice_title_del
删除班课mysql实例中无效库(测试 dev 和 prod):
competition_cloud_del
editor_channel_del
coding-cloud_del
noc-cloud_del
sa-cloud_del
清理和迁移库、表完成后,验证是否需要对bcy-prod-01-r增加磁盘,现在使用率达到71%
删除redis和mysql实例 -刘**
关闭如下mysql实例:写:bcy-p*** 读:rr-8vb5ozxs7xoie34b9
关闭redis实例:r-8vbj65ybljj55iw2j5 bcy-pm-env
跟踪查看redis和mysql的使用情况,调整对应机器的告警配置。
mysql 班课对应实例配置
1写 8核 16G内存,IOPS 8000,最大连接数:4000,磁盘400G 名称:bcy-mysql-prod(rm-8vbc8o86198mx8tn1)
2读 8核 16内存,IOPS 8000,最大连接数:4000,磁盘300G或400G 名称:bcy-prod-01-r(rr-8vbjtdvd4659803qc)和
bcy-prod-02-r(rr-8vb2zf880p2im3n57)
12月4-12月11监控结果:
mysql写机器:
内存 60%左右
cpu最大 30% 上课2%
iops 最大3000 有该表结构的操作
连接数 300-1000
网络流量: 最大输入1500 输出3000-5000 kb
mysql读机器:
内存 60%左右
cpu最大 7%
iops 最大3000 有该表结构的操作
连接数 300-800
网络流量: 最大输入1500 输出3000-5000 kb
redis
redis(bcy-competition-prod) 8G读写(1读1写),两个机器 最大连接数20000 最大私网带宽:192mb/S
cpu 50%-80%
内存 800M
总qps 3万-7万
get 3万-5万
put 1.5万-2.5万
连接数 200-230
命中数 3万-5万