在项目初期,我们部署了三个数据库 A、B、C,此时数据库的规模可以满足我们的业务需求。为了将数据做到平均分配,我们在 Service 服务层使用 uid%3 进行取模分片,从而将数据平均分配到三个数据库中。
如图所示:
后期随着用户量的增加,用户产生的数据信息被源源不断的添加到数据库中,最终达到数据库的最佳存储容量。如果此时继续向数据库中新增数据,会导致数据库的 CRUD 等基本操作变慢,进而影响整个服务的响应速度。
这时,我们需要增加新的节点,对数据库进行水平扩容,那么加入新的数据库 D 后,数据库的规模由原来的 3 个变为 4 个。
如图所示:
此时由于分片规则发生了变化(uid%3 变为 uid%4),导致大部分的数据,无法命中原有的数据,需要重新进行分配,要做大量的数据迁移处理。
比如之前 uid 如果是 uid=3 取模 3%3=0, 是分配在 A 库上,新加入 D 库后, uid=3 取模 3%4=3,分配在 D 库上;
新增一个节点, 大概会有 90% 的数据需要迁移, 这样会面临大量的数据压力,并且对服务造成极大的不稳定性。
停止服务之后, 能够保证迁移工作的正常进行, 但是服务停止,伤害用户体验, 并造成了时间压力, 必须在指定的时间内完成迁移。
缺点:在数据的复制过程需要消耗大量的时间,停写时间太长,数据需要先复制,再清理冗余数据
核心是通过日志进行数据库的同步迁移, 主要操作步骤如下:
日志记录不用关注新增了哪些信息,修改的数据格式,只需要记录以上数据信息,这样日志格式是固定的, 这样能保证方案的通用性。
服务升级日志记录功能风险较小:
写和修改接口是少数, 改动点少;
升级只是增加了一些日志,采用异步方式实现, 对业务功能没有太多影响。
整个过程仍然采用旧库进行对外服务。
数据同步工具实现复杂度不高。
只对旧库进行读取操作, 如果同步出现问题, 都可以对新库进行回滚操作。
可以限速或分批迁移执行, 不会有时间压力。
数据迁移完成之后, 并不能切换至新库提供服务。
因为旧库依然对线上提供服务, 库中的数据随时会发生变化, 但这些变化的数据并没有同步到新库中, 旧库和新库数据不一致, 所以不能直接进行切换, 需要将数据同步完整。
研发一个日志迁移工具,把上面迁移数据过程中的差异数据追平,处理步骤:
读取 log 日志,获取具体是哪个库、表和主键发生了变化修改;
把旧库中的主键记录读取出来
根据主键 ID,把新库中的记录替换掉
这样可以最大程度的保障数据的一致性。风险分析:
整个过程, 仍然是旧库对线上提供服务;
日志迁移工具实现的复杂度较低;
任何时间发现问题, 可以重新再来,有充分的容错空间;
可以限速重放处理日志, 处理过程不会因为对线上影响造成时间压力。
但是, 日志增量同步完成之后, 还不能切换到新的数据库。
因为日志增量同步过程中,旧库中可能有数据发生变化, 导致数据不一致,所以需要进一步读取日志, 追平数据记录; 日志增量同步过程随时可能会产生新的数据, 新库与旧库的数据追平也会是一个无限逼近的过程。
但是在极限情况下, 即便通过上面的数据校验处理, 也有可能出现 99.99% 数据一致, 不能保障完全一致,这个时候可以在旧库做一个 readonly 只读功能, 或者将流量屏蔽降级,等待日志增量同步工具完全追平后, 再进行新库的切换。
至此,完成日志方案的迁移扩容处理, 整个过程能够持续对线上提供服务, 只会短暂的影响服务的可用性。
这种方案的弊端,是操作繁琐,需要适配多个同步处理工具,成本较高, 需要制定个性化业务的同步处理, 不具备普遍性,耗费的时间周期也较长。
双写方案可通过 canal 或 mq 做实现。
把 uid%4=0 和 uid%4=2 的数据分别分配到 A 和 A0 主库中
把 uid%4=1 和 uid%4=3 的数据分配到 B 和 B0 主库中
由于之前 uid%2 的数据是分配在 2 个库里面,扩容之后需要分布到 4 个库中,但由于旧数据仍存在(uid%4=0 的节点, 还有一半 uid%4=2 的数据),所以需要对冗余数据做一次清理。
这个清理,并不会影响线上数据的一致性,可以随时随地进行。
扩容前部署架构:
2.1.1 MariaDB 服务安装
- yum -y install wget
- ## 备份CentOS-Base.repo
- 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
-
- 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
-
- [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
-
- 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
-
- mysql -uroot -p654321
-
-
进入 MySQL 服务, 执行以下操作:
- use mysql;
-
- delete from user;
- ## 配置root用户使用密码654321从任何主机都可以连接到mysql服务器
- GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '654321' WITH GRANT OPTION;
-
- FLUSH PRIVILEGES;
-
-
2.1.2 MariaDB 双主同步
- [mysqld]
- server-id = 1
- log-bin=mysql-bin
- relay-log = mysql-relay-bin
- ## 忽略mysql、information_schema库下对表的操作
- replicate-wild-ignore-table=mysql.%
- replicate-wild-ignore-table=information_schema.%
- ## 默认的情况下mysql是关闭的;
- log-slave-updates=on
- ## 复制过程中,有任何错误,直接跳过
- slave-skip-errors=all
- auto-increment-offset=1
- auto-increment-increment=2
- ## binlog的格式:STATEMENT,ROW,MIXED
- binlog_format=mixed
- ## 自动过期清理binlog,默认0天,即不自动清理
- expire_logs_days=10
-
注意, Server1 自增为奇数位:
auto-increment-offset=1 主键自增基数, 从 1 开始。
auto-increment-increment=2 主键自增偏移量,每次为 2。
- [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。
- 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 | | |
- +------------------+----------+--------------+------------------+
-
- MariaDB [(none)]> change master to master_host='192.168.116.141',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000007', master_log_pos=374, master_connect_retry=30;
-
在 Server2 中执行:
- MariaDB [(none)]> change master to master_host='192.168.116.140',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000015', master_log_pos=374, master_connect_retry=30;
- 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_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
- ...
-
Slave_IO_Running 和 Slave_SQL_Running 都是 Yes,说明双主同步配置成功。2.1.3 KeepAlived 安装与高可用配置
- yum -y install keepalived
-
-
- systemctl stop firewalld
- systemctl disable firewalld
-
-
- hostnamectl set-hostname vip1
-
-
Server2 节点:
- hostnamectl set-hostname vip2
-
- global_defs {
- router_id vip1 # 机器标识,和主机名保持一致,运行keepalived服务器的一个标识
- }
- vrrp_instance VI_1 { #vrrp实例定义
- state BACKUP #lvs的状态模式,MASTER代表主, BACKUP代表备份节点
- interface ens33 #绑定对外访问的网卡,vrrp实例绑定的网卡
- 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地址
- 192.168.116.150
- }
- }
- virtual_server 192.168.116.150 3306 { #配置虚拟服务器IP与访问端口
- delay_loop 6 #健康检查时间
- lb_algo rr #负载均衡调度算法, rr代表轮询
- lb_kind DR #负载均衡转发规则 DR/NAT/
- persistence_timeout 0 #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
- protocol TCP #转发协议类型,支持TCP和UDP
- real_server 192.168.116.140 3306 { #配置服务器节点VIP1
- notify_down /usr/local/shell/mariadb.sh #当服务挂掉时, 会执行此脚本,结束keepalived进程
- weight 1 #设置权重,越大权重越高
- TCP_CHECK { #状态监测设置
- connect_timeout 10 #超时配置, 单位秒
- retry 3 #重试次数
- delay_before_retry 3 #重试间隔
- connect_port 3306 #连接端口, 和上面保持一致
- }
- }
-
- }
-
创建关闭脚本 mariadb.sh- pkill keepalived
-
加入执行权限:
- chmod a+x mariadb.sh
-
- global_defs {
- router_id vip2 # 机器标识,和主机名保持一致,运行keepalived服务器的一个标识
- }
- 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地址
- 192.168.116.150
- }
- }
- virtual_server 192.168.116.150 3306 { #配置虚拟服务器IP与访问端口
- delay_loop 6 #健康检查时间
- lb_algo rr #负载均衡调度算法, rr代表轮询, 可以关闭
- lb_kind DR #负载均衡转发规则, 可以关闭
- persistence_timeout 0 #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
- protocol TCP #转发协议类型,支持TCP和UDP
- real_server 192.168.116.141 3306{ #配置服务器节点VIP2
- 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 #连接端口, 和上面保持一致
- }
- }
-
- }
-
和 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 #不主动抢占资源
-
注意:这个配置只能设置在 backup 主机上,而且这个主机优先级要比另外一台高2.1.4 搭建应用服务工程
- // 动态数据源配置实现扩容
- 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);
- }
-
** 扩容部署架构: **
2.2.1 新增数据库 VIP
- global_defs {
- router_id vip2
- }
- 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地址
- 192.168.116.151
- }
- }
- virtual_server 192.168.116.151 3306 { #配置虚拟服务器IP与访问端口
- delay_loop 6 #健康检查时间
- persistence_timeout 0 #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
- protocol TCP #转发协议类型,支持TCP和UDP
- real_server 192.168.116.141 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代表最大优先级, 数字越大优先级越高
-
-
2.2.2 应用服务增加动态数据源
2.2.3 解除原双主同步
mysql -uroot -p654321
- MariaDB [(none)]> stop slave;
-
- MariaDB [(none)]> stop slave;
-
2.2.4 安装 MariaDB 扩容服务器
- [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
-
- service mariadb restart
-
- MariaDB [(none)]> grant replication slave, replication client on *.* to 'replica'@'%' identified by 'replica';
- mysql> flush privileges;
-
- mysqldump -uroot -p654321 --routines --single_transaction --master-data=2 --databases smooth > server1.sql
-
- ...
- --
- -- Position to start replication or point-in-time recovery from
- --
-
- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=17748;
- ...
-
- scp server1.sql root@192.168.116.142:/usr/local/
-
- mysql -uroot -p654321 < /usr/local/server1.sql
-
- MariaDB [(none)]> change master to master_host='192.168.116.140',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000016', master_log_pos=1754, master_connect_retry=30;
- Query OK, 0 rows affected (0.01 sec)
-
- MariaDB [(none)]> start slave;
- Query OK, 0 rows affected (0.00 sec)
-
如果出现问题, 复原主从同步信息:
- MariaDB [(none)]> reset slave;
- Query OK, 0 rows affected (0.01 sec)
-
- 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
-
- 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='192.168.116.142',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000005', master_log_pos=6931, master_connect_retry=30;
-
- MariaDB [(none)]> start slave;
- Query OK, 0 rows affected (0.00 sec)
-
- [mysqld]
- server-id = 4
- 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
-
- service mariadb restart
-
- MariaDB [(none)]> grant replication slave, replication client on *.* to 'replica'@'%' identified by 'replica';
- mysql> flush privileges;
-
- mysqldump -uroot -p654321 --routines --single_transaction --master-data=2 --databases smooth > server2.sql
-
- ...
- --
- -- Position to start replication or point-in-time recovery from
- --
-
- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=4208;
-
- ...
-
- scp server2.sql root@192.168.116.143:/usr/local/
-
- mysql -uroot -p654321 < /usr/local/server2.sql
-
- MariaDB [(none)]> change master to master_host='192.168.116.141',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000007', master_log_pos=3006, master_connect_retry=30;
- Query OK, 0 rows affected (0.01 sec)
-
- MariaDB [(none)]> start slave;
- Query OK, 0 rows affected (0.00 sec)
-
注意, 如果出现问题, 复原主从同步信息:
- MariaDB [(none)]> reset slave;
- Query OK, 0 rows affected (0.01 sec)
-
- 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
-
-
-
- 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='192.168.116.143',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000005', master_log_pos=5787, master_connect_retry=30;
-
- MariaDB [(none)]> start slave;
- Query OK, 0 rows affected (0.00 sec)
-
2.2.5 增加 KeepAlived 服务实现高可用
- 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地址
- 192.168.116.150
- }
- }
- virtual_server 192.168.116.150 3306 { #配置虚拟服务器IP与访问端口
- delay_loop 6 #健康检查时间
- persistence_timeout 0 #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
- protocol TCP #转发协议类型,支持TCP和UDP
- real_server 192.168.116.142 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 配置正确, 修改完成后重启服务。- pkill keepalived
-
加入执行权限:
- chmod a+x mariadb.sh
-
- 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地址
- 192.168.116.151
- }
- }
- virtual_server 192.168.116.151 3306 { #配置虚拟服务器IP与访问端口
- delay_loop 6 #健康检查时间
- persistence_timeout 0 #会话保持时间,这里要做测试, 所以设为0, 实际可根据session有效时间配置
- protocol TCP #转发协议类型,支持TCP和UDP
- real_server 192.168.116.143 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- pkill keepalived
-
给所有的用户组加入执行权限:
- chmod a+x mariadb.sh
-
2.2.6 清理数据并验证
- delete from t_trade_order where accountNo % 2 != 0
-
- delete from t_trade_order where accountNo % 2 != 1
-
在 Server1(192.168.116.140)中执行:
- MariaDB [(none)]> change master to master_host='192.168.116.141',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000005', master_log_pos=3207, master_connect_retry=30;
-
在 Server2(192.168.116.141)中执行:
- MariaDB [(none)]> change master to master_host='192.168.116.140',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000012', master_log_pos=1951, master_connect_retry=30;
-
在 Server3(192.168.116.142)中执行:
- MariaDB [(none)]> change master to master_host='192.168.116.140',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000013', master_log_pos=2781, master_connect_retry=30;
- Query OK, 0 rows affected (0.01 sec)
-
在 Server4(192.168.116.143)中执行:
- MariaDB [(none)]> change master to master_host='192.168.116.141',master_user='replica', master_password='replica', master_port=3306, master_log_file='mysql-bin.000005', master_log_pos=7358, master_connect_retry=30;
- Query OK, 0 rows affected (0.01 sec)
-
Server1: keepalived.conf
vi /etc/keepalived/keepalived.conf
- global_defs {
- router_id vip1
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 111
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 6666
- }
- virtual_ipaddress {
- 192.168.116.150
- }
- }
- virtual_server 192.168.116.150 3306 {
- delay_loop 6
- lb_algo rr
- lb_kind DR // NAT|DR|TUN
- persistence_timeout 0
- protocol TCP
- real_server 192.168.116.140 3306 {
- notify_down /usr/local/shell/mariadb.sh
- weight 1
- TCP_CHECK {
- connect_timeout 10
- retry 3
- delay_before_retry 3
- connect_port 3306
- }
- }
- }
-
Server2:keepalived.conf
vi /etc/keepalived/keepalived.conf
- global_defs {
- router_id vip2
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 111
- priority 98
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 6666
- }
- virtual_ipaddress {
- 192.168.116.150
- }
- }
- virtual_server 192.168.116.150 3306 {
- delay_loop 6
- lb_algo rr
- lb_kind DR
- persistence_timeout 0
- protocol TCP
- real_server 192.168.116.141 3306{
- notify_down /usr/local/shell/mariadb.sh
- weight 1
- TCP_CHECK {
- connect_timeout 10
- retry 3
- delay_before_retry 3
- connect_port 3306
- }
- }
- }
-
Server2:keepalived.conf
vi /etc/keepalived/keepalived.conf
- global_defs {
- router_id vip2
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 112
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 6666
- }
- virtual_ipaddress {
- 192.168.116.151
- }
- }
- virtual_server 192.168.116.151 3306 {
- delay_loop 6
- persistence_timeout 0
- protocol TCP
- real_server 192.168.116.141 3306{
- notify_down /usr/local/shell/mariadb.sh
- weight 1
- TCP_CHECK {
- connect_timeout 10
- retry 3
- delay_before_retry 3
- connect_port 3306
- }
- }
- }
-
Server3: keepalived.conf
vi /etc/keepalived/keepalived.conf
- global_defs {
- router_id vip3
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 111
- priority 98
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 6666
- }
- virtual_ipaddress {
- 192.168.116.150
- }
- }
- virtual_server 192.168.116.150 3306 {
- delay_loop 6
- lb_algo rr
- lb_kind DR
- persistence_timeout 0
- protocol TCP
- real_server 192.168.116.142 3306 {
- notify_down /usr/local/shell/mariadb.sh
- weight 1
- TCP_CHECK {
- connect_timeout 10
- retry 3
- delay_before_retry 3
- connect_port 3306
- }
- }
- }
-
Server4: keepalived.conf
vi /etc/keepalived/keepalived.conf
- global_defs {
- router_id vip4
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 112
- priority 98
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 6666
- }
- virtual_ipaddress {
- 192.168.116.151
- }
- }
- virtual_server 192.168.116.151 3306 {
- delay_loop 6
- lb_algo rr
- lb_kind DR
- persistence_timeout 0
- protocol TCP
- real_server 192.168.116.143 3306{
- notify_down /usr/local/shell/mariadb.sh
- weight 1
- TCP_CHECK {
- connect_timeout 10
- retry 3
- delay_before_retry 3
- connect_port 3306
- }
- }
- }
-