Mysql数据库平滑扩容解决高并发和大数据量问题 3

本文涉及的产品
RDS AI 助手,专业版
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDSClaw,2核4GB
简介: Mysql数据库平滑扩容解决高并发和大数据量问题

5 数据库秒级平滑2N扩容实践

扩容部署架构:

5.1 新增数据库VIP

  1. 在Server2节点, 增加VIP
    修改/etc/keepalived/keepalived.conf,追加:
...
vrrp_instance VI_2 {       #vrrp实例定义
 state BACKUP        #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
 interface ens33        #绑定对外访问的网卡
 virtual_router_id 112     #虚拟路由标示,同一个vrrp实例采用唯一标示
 priority 100        #优先级,100代表最大优先级, 数字越大优先级越高
 advert_int 1        #master与backup节点同步检查的时间间隔,单位是秒
 authentication {      #设置验证信息
   auth_type PASS     #有PASS和AH两种
   auth_pass 6666     #验证密码,BACKUP密码须相同
 }
 virtual_ipaddress {     #KeepAlived虚拟的IP地址
    10.10.20.131
 }
}
virtual_server 10.10.20.131 3306 {    #配置虚拟服务器IP与访问端口
 delay_loop 6         #健康检查时间
 persistence_timeout 0     #会话保持时间,这里要做测试, 所以设为0, 实际可根
据session有效时间配置
 protocol TCP        #转发协议类型,支持TCP和UDP
 real_server 10.10.20.126 3306{   #配置服务器节点VIP1
 notify_down /usr/local/shell/mariadb.sh
 weight 1        #设置权重,越大权重越高
 TCP_CHECK {        #r状态监测设置
   connect_timeout 10    #超时配置, 单位秒
   retry 3       #重试次数
   delay_before_retry 3     #重试间隔
   connect_port 3306     #连接端口, 和上面保持一致
   }
 }
}

注意配置项:

virtual_router_id 112     #虚拟路由标示,同一个vrrp实例采用唯一标示
priority 100        #优先级,100代表最大优先级, 数字越大优先级越高

5.2 应用服务增加动态数据源

  1. 修改应用服务配置, 增加新的数据源, 指向新设置的VIP: 10.10.20.131
  2. 通过应用服务接口, 动态扩容调整

5.3 解除原双主同步

  1. 进入Server1: MariaDB [(none)]> stop slave;
  2. 进入Server2:MariaDB [(none)]> stop slave;
  3. 通过应用服务接口验证数据是否解除同步

5.4 安装MariaDB扩容服务器

  1. 新建两台虚拟机, 分别为Server3和Server4。
  2. 在Server3和Server4两台节点上安装MariaDB服务
    参考 MariaDB服务安装
  3. 配置Server3与Server1,实现新的双主同步
  4. Server3节点, 修改/etc/my.cnf:
[mysqld]
server-id = 2
log-bin=mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=information_schema.%
log-slave-updates=on
slave-skip-errors=all
auto-increment-offset=2
auto-increment-increment=2
binlog_format=mixed
expire_logs_days=10
  1. 重启Server3数据库
    service mariadb restart
  2. 创建replica用于主从同步的用户:
MariaDB [(none)]> grant replication slave, replication client on *.* to
'replica'@'%' identified by 'replica';
mysql> flush privileges;
  1. 在Server1节点,进行数据全量备份:
mysqldump -uroot -p654321 --routines --single_transaction --master-data=2 --
databases smooth > server1.sql
  1. 查看并记录master status信息:
...
--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=17748;
...

将备份的server1.sql通过scp命令拷贝至Server3节点。scp server1.sql root@10.10.20.127:/usr/local/

将数据还原至Server3节点:mysql -uroot -p654321 < /usr/local/server1.sql

  1. 配置主从同步信息

根据上面的master status信息, 在Server3中执行:

MariaDB [(none)]> change master to
master_host='10.10.20.125',master_user='replica', master_password='replica',
master_port=3306, master_log_file='mysql-bin.000002', master_log_pos=17748,
master_connect_retry=30;
Query OK, 0 rows affected (0.01 sec)
  1. 开启主从同步:
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

如果出现问题, 复原主从同步信息:

MariaDB [(none)]> reset slave;
Query OK, 0 rows affected (0.01 sec)
  1. 检查同步状态信息:
MariaDB [(none)]> show slave status \G
*************************** 1. row ***************************
       Slave_IO_State: Waiting for master to send event
        Master_Host: 10.10.20.125
        Master_User: replica
        Master_Port: 3306
       Connect_Retry: 30
      Master_Log_File: mysql-bin.000004
    Read_Master_Log_Pos: 11174
       Relay_Log_File: mysql-relay-bin.000002
       Relay_Log_Pos: 1746
   Relay_Master_Log_File: mysql-bin.000004
      Slave_IO_Running: Yes
     Slave_SQL_Running: Yes
  1. 配置Server1与Server3节点的同步
    查看Server3的日志信息:
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |   4781 |       |         |
+------------------+----------+--------------+------------------+

在Server1节点, 配置同步信息:

MariaDB [(none)]> reset slave;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> change master to
master_host='10.10.20.127',master_user='replica', master_password='replica',
master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=4781,
master_connect_retry=30;
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
  1. 配置Server4与Server2的双主同步
  2. Server4节点, 修改/etc/my.cnf:
[mysqld]
server-id = 3
log-bin=mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=information_schema.%
log-slave-updates=on
slave-skip-errors=all
auto-increment-offset=2
auto-increment-increment=2
binlog_format=mixed
expire_logs_days=10
  1. 重启Server4数据库
    service mariadb restart
  2. 创建replica用于主从同步的用户
MariaDB [(none)]> grant replication slave, replication client on *.* to
'replica'@'%' identified by 'replica';
mysql> flush privileges;
  1. 在Server2节点,进行数据全量备份:
mysqldump -uroot -p654321 --routines --single_transaction --master-data=2 --
databases smooth > server2.sql
  1. 查看并记录master status信息:
...
--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=4208;
...

将备份的server2.sql通过scp命令拷贝至Server4节点。scp server2.sql root@10.10.20.128:/usr/local/


将数据还原至Server4节点:mysql -uroot -p654321 < /usr/local/server2.sql


配置主从同步信息

根据上面的master status信息, 在Server4中执行:

MariaDB [(none)]> change master to
master_host='10.10.20.126',master_user='replica', master_password='replica',
master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=4208,
master_connect_retry=30;
Query OK, 0 rows affected (0.01 sec)
  1. 开启主从同步:
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

注意, 如果出现问题, 复原主从同步信息:

MariaDB [(none)]> reset slave;
Query OK, 0 rows affected (0.01 sec)
  1. 检查同步状态信息:
MariaDB [(none)]> show slave status \G
*************************** 1. row ***************************
       Slave_IO_State: Waiting for master to send event
        Master_Host: 10.10.20.125
        Master_User: replica
        Master_Port: 3306
       Connect_Retry: 30
      Master_Log_File: mysql-bin.000004
    Read_Master_Log_Pos: 11174
       Relay_Log_File: mysql-relay-bin.000002
       Relay_Log_Pos: 1746
   Relay_Master_Log_File: mysql-bin.000004
      Slave_IO_Running: Yes
     Slave_SQL_Running: Yes
  1. 配置Server2与Server4节点的同步
    查看Server4的日志信息:
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |   3696 |       |         |
+------------------+----------+--------------+------------------+

在Server2节点, 配置同步信息:

MariaDB [(none)]> reset slave;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> change master to
master_host='10.10.20.128',master_user='replica', master_password='replica',
master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=3696,
master_connect_retry=30;
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

5.5 增加KeepAlived服务实现高可用

  1. 确保新增的Server3和Server4节点安装Keepalived服务。
  2. 修改Server3节点配置
global_defs {
 router_id vip3      # 机器标识,一般设为hostname,故障发生时,邮件通知会使用
到。
}
vrrp_instance VI_1 {       #vrrp实例定义
 state BACKUP        #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
 interface ens33        #绑定对外访问的网卡
 virtual_router_id 111     #虚拟路由标示,同一个vrrp实例采用唯一标示
 priority 98        #优先级,100代表最大优先级, 数字越大优先级越高
 advert_int 1        #master与backup节点同步检查的时间间隔,单位是秒
 authentication {      #设置验证信息
   auth_type PASS     #有PASS和AH两种
   auth_pass 6666     #验证密码,BACKUP密码须相同
 }
 virtual_ipaddress {     #KeepAlived虚拟的IP地址
    10.10.20.130
 }
}
virtual_server 10.10.20.130 3306 {    #配置虚拟服务器IP与访问端口
 delay_loop 6         #健康检查时间
 persistence_timeout 0     #会话保持时间,这里要做测试, 所以设为0, 实际可根
据session有效时间配置
 protocol TCP        #转发协议类型,支持TCP和UDP
 real_server 10.10.20.127 3306{   #配置服务器节点VIP3
 notify_down /usr/local/shell/mariadb.sh
 weight 1        #设置权重,越大权重越高
 TCP_CHECK {        #r状态监测设置
   connect_timeout 10    #超时配置, 单位秒
   retry 3       #重试次数
   delay_before_retry 3     #重试间隔
   connect_port 3306     #连接端口, 和上面保持一致
   }
 }
}

注意里面IP配置正确, 修改完成后重启服务。

创建关闭脚本mariadb.sh

/usr/local/shell/mariadb.sh:

pkill keepalived

加入执行权限:

chmod a+x mariadb.sh

3. 修改Server4节点配置

global_defs {
 router_id vip4      # 机器标识,一般设为hostname,故障发生时,邮件通知会使用
到。
}
vrrp_instance VI_1 {       #vrrp实例定义
 state BACKUP        #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
 interface ens33        #绑定对外访问的网卡
 virtual_router_id 112     #虚拟路由标示,同一个vrrp实例采用唯一标示
 priority 98        #优先级,100代表最大优先级, 数字越大优先级越高
 advert_int 1        #master与backup节点同步检查的时间间隔,单位是秒
 authentication {      #设置验证信息
   auth_type PASS     #有PASS和AH两种
   auth_pass 6666     #验证密码,BACKUP密码须相同
 }
 virtual_ipaddress {     #KeepAlived虚拟的IP地址
    10.10.20.131
 }
}
virtual_server 10.10.20.131 3306 {    #配置虚拟服务器IP与访问端口
 delay_loop 6         #健康检查时间
  persistence_timeout 0     #会话保持时间,这里要做测试, 所以设为0, 实际可根
据session有效时间配置
 protocol TCP        #转发协议类型,支持TCP和UDP
 real_server 10.10.20.128 3306{   #配置服务器节点VIP4
 notify_down /usr/local/shell/mariadb.sh
 weight 1        #设置权重,越大权重越高
 TCP_CHECK {        #r状态监测设置
   connect_timeout 10    #超时配置, 单位秒
   retry 3       #重试次数
   delay_before_retry 3     #重试间隔
   connect_port 3306     #连接端口, 和上面保持一致
   }
 }
}

重启服务,创建关闭脚本mariadb.sh

/usr/local/shell/mariadb.sh:

pkill keepalived

加入执行权限:chmod a+x mariadb.sh

4. 修改Server2节点的keepAlived配置:

global_defs {
 router_id vip2      # 机器标识,一般设为hostname,故障发生时,邮件通知会使用
到。
}
vrrp_instance VI_1 {       #vrrp实例定义
 state BACKUP        #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
 interface ens33        #绑定对外访问的网卡
 virtual_router_id 112     #虚拟路由标示,同一个vrrp实例采用唯一标示
 priority 100        #优先级,100代表最大优先级, 数字越大优先级越高
 advert_int 1        #master与backup节点同步检查的时间间隔,单位是秒
 authentication {      #设置验证信息
   auth_type PASS     #有PASS和AH两种
   auth_pass 6666     #验证密码,BACKUP密码须相同
 }
 virtual_ipaddress {     #KeepAlived虚拟的IP地址
    10.10.20.131
 }
}
virtual_server 10.10.20.131 3306 {    #配置虚拟服务器IP与访问端口
 delay_loop 6         #健康检查时间
 persistence_timeout 0     #会话保持时间,这里要做测试, 所以设为0, 实际可根
据session有效时间配置
 protocol TCP        #转发协议类型,支持TCP和UDP
 real_server 10.10.20.126 3306{   #配置服务器节点VIP1
 notify_down /usr/local/shell/mariadb.sh
 weight 1        #设置权重,越大权重越高
 TCP_CHECK {        #r状态监测设置
   connect_timeout 10    #超时配置, 单位秒
   retry 3       #重试次数
   delay_before_retry 3     #重试间隔
   connect_port 3306     #连接端口, 和上面保持一致
   }
 }
}

修改完后重启Keepalived服务。

5.6 清理数据并验证

  1. 通过应用服务动态扩容接口做调整和验证
  2. 在Server1节点清理数据
  3. 根据取模规则, 保留accountNo为偶数的数据
    delete from t_trade_order where accountNo % 2 != 0
  4. 在Server2节点清理数据

根据取模规则, 保留accountNo为奇数的数据

delete from t_trade_order where accountNo % 2 != 1


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
11月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
9月前
|
缓存 关系型数据库 MySQL
在MySQL中处理高并发和负载峰值的关键技术与策略
采用上述策略和技术时,每个环节都要进行细致的规划和测试,确保数据库系统既能满足高并发的要求,又要保持足够的灵活性来应对各种突发的流量峰值。实施时,合理评估和测试改动对系统性能的影响,避免单一措施可能引起的连锁反应。持续的系统监控和分析将对维护系统稳定性和进行未来规划提供重要信息。
420 15
|
10月前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
11月前
|
存储 关系型数据库 MySQL
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
本文详细介绍了在 MySQL 中创建数据库和表的方法。包括安装 MySQL、用命令行和图形化工具创建数据库、选择数据库、创建表(含数据类型介绍与选择建议、案例分析、最佳实践与注意事项)以及查看数据库和表的内容。文章专业、严谨且具可操作性,对数据管理有实际帮助。
大数据新视界 --面向数据分析师的大数据大厂之 MySQL 基础秘籍:轻松创建数据库与表,踏入大数据殿堂
|
关系型数据库 MySQL 数据安全/隐私保护
大数据新视界--大数据大厂之MySQL 数据库课程设计:数据安全深度剖析与未来展望
本文深入探讨数据库课程设计 MySQL 的数据安全。以医疗、电商、企业案例,详述用户管理、数据加密、备份恢复及网络安全等措施,结合数据安全技术发展趋势,与《大数据新视界 -- 大数据大厂之 MySQL 数据库课程设计》紧密关联,为 MySQL 数据安全提供全面指南。
大数据新视界--大数据大厂之MySQL 数据库课程设计:数据安全深度剖析与未来展望
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
7月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
存储 NoSQL Java
探索Java分布式锁:在高并发环境下的同步访问实现与优化
【6月更文挑战第30天】Java分布式锁在高并发下确保数据一致性,通过Redis的SETNX、ZooKeeper的临时节点、数据库操作等方式实现。优化策略包括锁超时重试、续期、公平性及性能提升,关键在于平衡同步与效率,适应大规模分布式系统的需求。
579 1

推荐镜像

更多