mysql和redis拆分实例与过程

16 篇文章 0 订阅

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万

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值