您现在的位置是:网站首页> 编程资料编程资料

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

2023-05-26 925人已围观

简介 详解Mysql数据库平滑扩容解决高并发和大数据量问题_Mysql_

1 停机方案

  • 发布公告
  • 停止服务
  • 离线数据迁移(拆分,重新分配数据)
  • 数据校验
  • 更改配置
  • 恢复服务
  • 回滚预案

2 停写方案

  • 支持读写分离
  • 升级公告
  • 中断写操作,隔离写数据源(或拦截返回统一提示)
  • 数据同步处理
  • 数据校验
  • 更改配置
  • 恢复写操作
  • 数据清理
  • 回滚预案

3 平滑扩容之双写方案(中小型数据)

请添加图片描述

双写方案可通过canal或mq做实现。

  • 增加新库
  • 数据迁移:避免增量影响, 先断开主从,再导入(耗时较长), 同步完成并做校验
  • 增量同步:监听Canal,并开启主从同步
  • 切换新库
  • 修复切换异常数据(canal未同步但已切换至新库的请求), 通过定制程序读取异常日志做处理

为什么不通过MariaDB Galera集群直接扩充新的服务器节点去实现扩容?

  • Galera集群是多主同步,扩充的节点提升的是并发吞吐能力,数据瓶颈问题未解决。
    通过路由中间件MyCat,Sharding JDBC等, 直接扩充新的节点是否可性?
  • 原数据需要重新分配, 比如取模分片。

总结:
这种方案就是水平扩容,提高了并发量,但是实际大数据量的瓶颈没有解决.

4 平滑扩容之2N方案大数据量问题解决

4.1 扩容问题

项目初期,部署了数据库A及其从机A0,B及其从节点B0,为将数据平均分配,在service层,使用uid%2取模分片(可采用sharding JDBC),将数据分配到对应的数据库。如下图

在这里插入图片描述

随着用户量的增大,用户产生的数据量最终达到数据库的最佳存储容量,需要进行扩容,否则CRUD操作会变慢,影响服务的响应速度。

如何平滑的扩容,保证业务的连续性和高可用,对业务影响最小?

4.2 解决方案

先把A0和B0升级为新的主库节点,如此,由2个分库变为4个分库。同时在上层的分片配置,做好映射,规则如下:

  • uid%4=0的和uid%4=2的数据分别分配到A和A0主库中
  • uid%4=1的和uid%4=3的数据分别分配到B和B0主库中

在这里插入图片描述

由于A和A0库的数据相同,B和B0库的数据相同,此时无需数据迁移,只需调整分片配置即可,可通过配置中心更新,不需要重启。

在这里插入图片描述

3. 扩容之后旧数据有冗余,需要对冗余数据做清理

-- 针对A,去除%4!=0的 delete from user.userinfo where uid % 4 != 0; -- 针对A0,去除%4!=2的 delete from user.userinfo where uid % 4 != 2; -- 针对B,去除%4!=1的 delete from user.userinfo where uid % 4 != 1; -- 针对B0,去除%4!=3的 delete from user.userinfo where uid % 4 != 3; 

处理完成后,为保证数据高可用,需要再次为现有主库增加一个从库

在这里插入图片描述

以下为双主架构进行水平扩容,下图为现在的架构

请添加图片描述

4.3 双主架构思想

1.两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用;

2.masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;

3.两台主库之间做高可用,可以采用keepalived等方案(使用VIP对外提供服务);

4.所有提供服务的从服务器与masterB进行主从同步(双主多从);

5.建议采用高可用策略的时候,masterA或masterB均不因宕机恢复后而抢占VIP(非抢占模式);

这样做可以在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压力;

但是也有几个不足的地方:

1.masterB可能会一直处于空闲状态(可以用它当从库,负责部分查询);

2.主库后面提供服务的从库要等masterB先同步完了数据后才能去masterB上去同步数据,这样可能会造成一定程度的同步延时;

4.4 环境部署

4.4.1 MariaDB服务安装 切换阿里云镜像服务(YUM安装过慢可以切换)

yum -y install wget mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo yum clean all yum makecache 

配置YUM源

vi /etc/yum.repos.d/mariadb-10.2.repo 

增加以下内容:

[mariadb] name = MariaDB baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 

执行安装

yum -y install mariadb mariadb-server MariaDB-client MariaDB-common

如果之前已经安装, 需要先删除(如果之前没有安装, 可以忽略此步骤)
停止Mariadb服务

[root@localhost yum.repos.d]# ps -ef | grep mysql root 1954 1 0 Oct04 ? 00:05:43 /usr/sbin/mysqld -- wsrep-new-cluster --user=root root 89521 81403 0 07:40 pts/0 00:00:00 grep --color=auto mysql [root@localhost yum.repos.d]# kill 1954 

卸载Mariadb服务

yum -y remove Maria*

删除数据与配置:

rm -rf /var/lib/mysql/* rm -rf /etc/my.cnf.d/ rm -rf /etc/my.cnf 

初始化配置

systemctl start mariadb mysql_secure_installation 

开启用户远程连接权限
将连接用户root开启远程连接权限;

mysql -uroot -p654321 

进入MySQL服务, 执行以下操作:

use mysql; delete from user; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '654321' WITH GRANT OPTION; FLUSH PRIVILEGES; 

4.4.2 MariaDB双主同步

在Server1增加配置:

在/etc/my.cnf中添加以下配置:

[mysqld] server-id = 1 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=1 auto-increment-increment=2 binlog_format=mixed expire_logs_days=10 

注意, Server1自增为奇数位:
auto-increment-offset=1 主键自增基数, 从1开始。
auto-increment-increment=2 主键自增偏移量,每次为2。
2. 在Server2增加配置:
修改/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 

Server2自增为偶数位:
auto-increment-offset=2 主键自增基数, 从2开始。
auto-increment-increment=2 主键自增偏移量,每次为2。
配置修改完成后, 重启数据库。
3. 同步授权配置
在Server1创建replica用于主从同步的用户:

MariaDB [(none)]> grant replication slave, replication client on *.* to 'replica'@'%' identified by 'replica'; mysql> flush privileges; 

查询日志文件与偏移量,开启同步时需使用:

MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 663 | | | +------------------+----------+--------------+------------------+ 

同样, 在Server2创建replica用于主从同步的用户:

MariaDB [(none)]> grant replication slave, replication client on *.* to 'replica'@'%' identified by 'replica'; mysql> flush privileges; 

查询日志文件与偏移量:

MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 663 | | | +------------------+----------+--------------+------------------+ 

配置主从同步信息
在Server1中执行:

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.000001', master_log_pos=663, master_connect_retry=30; 

在Server2中执行:

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.000001', master_log_pos=663, master_connect_retry=30; 

开启双主同步
在Server1和Server2中分别执行:

MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.00 sec) 

在Server1查询同步信息:

MariaDB [(none)]> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.10.20.126 Master_User: replica Master_Port: 3306 Connect_Retry: 30 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 663 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 555 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes ... 

在Server2查询同步信息:

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_F
                
                

-六神源码网