目录

  • 1 停机方案
  • 2 停写方案
  • 3 平滑扩容之双写方案(中小型数据)
  • 4 平滑扩容之2N方案大数据量问题解决
    • 4.1 扩容问题
    • 4.2 解决方案
    • 4.3 双主架构思想
    • 4.4 环境部署
      • 4.4.1 MariaDB服务安装
      • 4.4.2 MariaDB双主同步
      • 4.4.3 KeepAlived安装与高可用配置
      • 4.4.4 搭建应用服务工程
  • 5 数据库秒级平滑2N扩容实践
    • 5.1 新增数据库VIP
    • 5.2 应用服务增加动态数据源
    • 5.3 解除原双主同步
    • 5.4 安装MariaDB扩容服务器
    • 5.5 增加KeepAlived服务实现高可用
    • 5.6 清理数据并验证

1 停机方案

  1. 发布公告
  2. 停止服务
  3. 离线数据迁移(拆分,重新分配数据)
  4. 数据校验
  5. 更改配置
  6. 恢复服务
  7. 回滚预案

2 停写方案

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

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

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

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

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

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

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

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

4.1 扩容问题

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

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

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

4.2 解决方案

  1. 先把A0和B0升级为新的主库节点,如此,由2个分库变为4个分库。同时在上层的分片配置,做好映射,规则如下:
  • uid%4=0的和uid%4=2的数据分别分配到A和A0主库中
  • uid%4=1的和uid%4=3的数据分别分配到B和B0主库中

  1. 由于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;
  1. 处理完成后,为保证数据高可用,需要再次为现有主库增加一个从库

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

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服务安装

  1. 切换阿里云镜像服务(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
  1. 配置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
  1. 执行安装
    yum -y install mariadb mariadb-server MariaDB-client MariaDB-common

  2. 如果之前已经安装, 需要先删除(如果之前没有安装, 可以忽略此步骤)
    停止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
  1. 初始化配置
systemctl  start mariadb
mysql_secure_installation
  1. 开启用户远程连接权限
    将连接用户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双主同步

  1. 在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 |       |         |
+------------------+----------+--------------+------------------+
  1. 配置主从同步信息
    在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;
  1. 开启双主同步
    在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 eventMaster_Host: 10.10.20.126Master_User: replicaMaster_Port: 3306Connect_Retry: 30Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 663Relay_Log_File: mysql-relay-bin.000002Relay_Log_Pos: 555Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: YesSlave_SQL_Running: Yes
...

在Server2查询同步信息:

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

Slave_IO_Running和Slave_SQL_Running 都是Yes,说明双主同步配置成功。

4.4.3 KeepAlived安装与高可用配置

  1. 在Server1与Server2两台节点安装keepalived:
    yum -y install keepalived
    2.关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  1. 设置主机名称:
    Server1节点:hostnamectl set-hostname vip1
    Server2节点:hostnamectl set-hostname vip2
  2. Server1节点配置
    /etc/keepalived/keepalived.conf:
global_defs {router_id vip1      # 机器标识,和主机名保持一致
}
vrrp_instance VI_1 {       #vrrp实例定义state BACKUP        #lvs的状态模式,MASTER代表主, BACKUP代表备份节点interface ens33        #绑定对外访问的网卡virtual_router_id 111     #虚拟路由标示,同一个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.130}
}
virtual_server 10.10.20.130 3306 {    #配置虚拟服务器IP与访问端口delay_loop 6         #健康检查时间lb_algo rr          #负载均衡调度算法, rr代表轮询lb_kind DR          #负载均衡转发规则persistence_timeout 0     #会话保持时间,这里要做测试, 所以设为0, 实际可根
据session有效时间配置protocol TCP        #转发协议类型,支持TCP和UDPreal_server 10.10.20.125 3306 {   #配置服务器节点VIP1  notify_down /usr/local/shell/mariadb.sh #当服务挂掉时, 会执行此脚本,结束
keepalived进程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

5.Server2节点配置:

global_defs {router_id vip2      # 机器标识,和主机名保持一致
}
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         #健康检查时间lb_algo rr          #负载均衡调度算法, rr代表轮询, 可以关闭lb_kind DR          #负载均衡转发规则, 可以关闭persistence_timeout 0     #会话保持时间,这里要做测试, 所以设为0, 实际可根
据session有效时间配置protocol TCP        #转发协议类型,支持TCP和UDPreal_server 10.10.20.126 3306{   #配置服务器节点VIP2notify_down /usr/local/shell/mariadb.sh #当服务挂掉时, 会执行此脚本,结束
keepalived进程weight 1        #设置权重,越大权重越高TCP_CHECK {        #r状态监测设置connect_timeout 10    #超时配置, 单位秒retry 3       #重试次数delay_before_retry 3     #重试间隔connect_port 3306     #连接端口, 和上面保持一致}}
}

和Server1的差异项:

router_id vip2  # 机器标识,和主机名保持一致
priority 98        #优先级,100代表最大优先级, 数字越大优先级越高
real_server 10.10.20.126 3306  #配置服务器节点VIP2

注意, 两台节点都设为BACKUP

virtual_router_id 111     #同一个vrrp实例采用唯一标示
state BACKUP

如果不想重启后, 争夺备用节点的VIP, 可以设置此项
nopreempt #不主动抢占资源
6. 验证高可用
停止主节点MariaDB服务, 验证是否自动切换。

4.4.4 搭建应用服务工程

  1. ShardingJDBC的集成配置
  2. ShardingJDBC数据源的动态切换实现
  3. 验证应用服务动态扩容
  1. 配置两个数据源,分别指向Server1和Server2
  2. 分片只配置一个数据源
  3. 动态增加另一个数据源
  4. 动态扩容的验证
  5. 动态扩容的复原验证(模拟节点异常, 实现复原单节点数据源)
  6. 采用动态数据源配置实现扩容(扩容实践中改造)
// 动态数据源配置实现扩容
Properties properties = loadPropertiesFile("datasource1.properties");
try {log.info("load datasource config url: " + properties.get("url"));DruidDataSource druidDataSource = (DruidDataSource)
DruidDataSourceFactory.createDataSource(properties);druidDataSource.setRemoveAbandoned(true);druidDataSource.setRemoveAbandonedTimeout(600);druidDataSource.setLogAbandoned(true);// 设置数据源错误重连时间druidDataSource.setTimeBetweenConnectErrorMillis(60000);druidDataSource.init();OrchestrationShardingDataSource dataSource =
SpringContextUtil.getBean("tradeSystemDataSource",
OrchestrationShardingDataSource.class);Map<String, DataSource> dataSourceMap =
dataSource.getDataSource().getDataSourceMap();dataSourceMap.put(DatasourceEnum.DATASOURCE_2.getValue(),
druidDataSource);Map<String, DataSourceConfiguration> dataSourceConfigMap = new
HashMap<String, DataSourceConfiguration>();for(String key : dataSourceMap.keySet()) {dataSourceConfigMap.put(key,
DataSourceConfiguration.getDataSourceConfiguration(dataSourceMap.get(key)));}String result =
SHARDING_RULE_TABLE_ORDER.replace(SHARDING_RULE_DATASOURCE, newRule);replaceActualDataNodes(result);SHARDING_RULE_DATASOURCE = newRule;dataSource.renew(new DataSourceChangedEvent("/" + DruidSystemDataSourceConfiguration.DYNAMIC_SHARDING +
"/config/schema/logic_db/datasource",dataSourceConfigMap));return;
} catch (Exception e) {log.error(e.getMessage(), e);
}
  1. 注意事项
    Sharding JDBC, Mycat, Drds 等产品都是分布式数据库中间件, 相比直接的数据源操作, 会存在一些
    限制, Sharding JDBC在使用时, 要注意以下问题:
    有限支持子查询
    不支持HAVING
    不支持OR,UNION 和 UNION ALL
    不支持特殊INSERT
    每条INSERT语句只能插入一条数据,不支持VALUES后有多行数据的语句
    不支持DISTINCT聚合
    不支持dual虚拟表查询
    不支持SELECT LAST_INSERT_ID(), 不支持自增序列
    不支持CASE WHEN

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和UDPreal_server 10.10.20.126 3306{   #配置服务器节点VIP1notify_down /usr/local/shell/mariadb.shweight 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,实现新的双主同步
  1. 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;
...
  1. 将备份的server1.sql通过scp命令拷贝至Server3节点。scp server1.sql root@10.10.20.127:/usr/local/
  2. 将数据还原至Server3节点:mysql -uroot -p654321 < /usr/local/server1.sql
  3. 配置主从同步信息

根据上面的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 eventMaster_Host: 10.10.20.125Master_User: replicaMaster_Port: 3306Connect_Retry: 30Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 11174Relay_Log_File: mysql-relay-bin.000002Relay_Log_Pos: 1746Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: YesSlave_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的双主同步
  1. 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;
...
  1. 将备份的server2.sql通过scp命令拷贝至Server4节点。scp server2.sql root@10.10.20.128:/usr/local/

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

  3. 配置主从同步信息
    根据上面的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 eventMaster_Host: 10.10.20.125Master_User: replicaMaster_Port: 3306Connect_Retry: 30Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 11174Relay_Log_File: mysql-relay-bin.000002Relay_Log_Pos: 1746Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: YesSlave_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和UDPreal_server 10.10.20.127 3306{   #配置服务器节点VIP3notify_down /usr/local/shell/mariadb.shweight 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和UDPreal_server 10.10.20.128 3306{   #配置服务器节点VIP4notify_down /usr/local/shell/mariadb.shweight 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和UDPreal_server 10.10.20.126 3306{   #配置服务器节点VIP1notify_down /usr/local/shell/mariadb.shweight 1        #设置权重,越大权重越高TCP_CHECK {        #r状态监测设置connect_timeout 10    #超时配置, 单位秒retry 3       #重试次数delay_before_retry 3     #重试间隔connect_port 3306     #连接端口, 和上面保持一致}}
}

修改完后重启Keepalived服务。

5.6 清理数据并验证

  1. 通过应用服务动态扩容接口做调整和验证

  2. 在Server1节点清理数据
    根据取模规则, 保留accountNo为偶数的数据
    delete from t_trade_order where accountNo % 2 != 0

  3. 在Server2节点清理数据
    根据取模规则, 保留accountNo为奇数的数据
    delete from t_trade_order where accountNo % 2 != 1

Mysql数据库平滑扩容解决高并发和大数据量问题相关推荐

  1. LVS解决高并发,大数据量

    LVS的全称Linux vitual system,是由目前阿里巴巴的著名工程师章文嵩博士开发的一款开源软件.LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务 ...

  2. 冷热分离和直接使用大数据库_用读写分离与分表分库解决高访问量和大数据量...

    原标题:用读写分离与分表分库解决高访问量和大数据量 一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数.处理能力都有限.当单表的数据量达到1000W或100G以后,由于查询维度 ...

  3. 高并发的大数据量查询导致系统频繁死机

    我们的大数据量查询是数据库分页的, 但是导出和打印功能是基于全部数据的. 系统投入使用后,对于导出和打印功能的使用远远要高于我们的预期. 而我们的系统的硬件设备是有限的 不能再升级了. 抓取内存大对象 ...

  4. 高并发高可用处理大数据量

    教学大纲: 教学内容 大型互联网三大问题-高并发,高可用,大数据量 第一天内容如下: 1:什么是高并发? 2:为什么要解决高并发 3:画图分析:1) 多用户访问单台App服务器及数据库时,性能分析,瓶 ...

  5. Web网站架构演变—高并发、大数据

    转 Web网站架构演变-高并发.大数据 2018年07月25日 17:27:22 gis_morningsun 阅读数:599 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可 ...

  6. 高并发-----高并发和大数据的处理

    随着网络的普遍,我们的生活慢慢被信息所包围.我们做web开发的,遇到高并发和大数据的情况很正常,那么我们需要怎么做才能解决这些问题? 高并发的解决方案 说到高并发,我们遇到的高并发是如何产生的呢?大家 ...

  7. 高并发-------------高并发和大数据的处理

    随着网络的普遍,我们的生活慢慢被信息所包围.我们做web开发的,遇到高并发和大数据的情况很正常,那么我们需要怎么做才能解决这些问题? 高并发的解决方案 说到高并发,我们遇到的高并发是如何产生的呢?大家 ...

  8. 如何掌握java多线程,高并发,大数据方面的技能?

    https://www.zhihu.com/question/27575123 如何掌握java多线程,高并发,大数据方面的技能? 因为想进入互联网公司,然后发现互联网类型的公司问的主要问题都离不开这 ...

  9. mysql乐观锁 秒杀_使用数据库乐观锁解决高并发秒杀问题,以及如何模拟高并发的场景,CyclicBarrier和CountDownLatch类的用法...

    数据库:mysql 数据库的乐观锁:一般通过数据表加version来实现,相对于悲观锁的话,更能省数据库性能,废话不多说,直接看代码 第一步: 建立数据库表: CREATE TABLE `skill_ ...

最新文章

  1. WPS 2019 更新版(8392)发布,搭配优麒麟 19.04 运行更奇妙!
  2. 我的matlab5个车牌_顶帽_底帽_边缘_腐蚀
  3. android之descendantFocusability用法简析
  4. 数字图像处理matlab实验对图像复原,数字图像处理实验07图像的复原处理
  5. 在计算机网络系统的远程通信中,在计算机网络系统的远程通信中,通常采用的传输技术是...
  6. 如何启用×××服务器端的IPsec功能
  7. vuex , 简单入(liao)门(jie)
  8. 射频前端行业信息汇总
  9. Ubuntu状态栏显示网速,内存利用率等信息——sysmonitor
  10. 学习日记day16 ps
  11. 海德上位机软件学习总结(NetScada5.0)
  12. (JAVA)错误:Type mismatch: cannot convert from double to float ,这是什么意思?如何解决?
  13. 历代诗词咏宁夏注释1----常星景: 六盘
  14. VAE与后验分布、先验分布
  15. Win11系统保护怎么关闭?Win11系统保护关闭方法
  16. Java使用阿里邮箱生成excle邮件附件发送
  17. 使用IDEA过程中电脑蓝屏重启后,无法启动Maven项目
  18. USB3.0接口传输速度慢
  19. 【Java语言基础】1.3 Java补充知识
  20. 申请163电子邮箱,163邮箱格式是么样的?

热门文章

  1. MacBook Air连接2K屏开启HiDPI
  2. 【安全狐】Nmap,Masscan扫描软件 安装教程和基本使用
  3. 第0节 主流股票数据源框架横向对比
  4. Macosx 系统port安装 opencv
  5. yyf的HTMLCSS学习历程
  6. 专业阿香婆卸载工具(ashampoo unInstaller 9中文版) v9.00.10
  7. 集五福又开始了,汇总了一下今年集五福的所有方法!还有福字!
  8. 贝克曼库尔特Beckman Coulter全自动血液生化分析仪AU5800双工通讯开发
  9. 软件项目管理韩万江版课后习题答案
  10. 怎样找到项目打包后的文件