这个博客提供了高可用性(HA)的指导方针在MySQL使用组复制架构和部署建议,基于我们的最佳实践。
每个架构和部署取决于客户需求和应用要求高可用性和使用的估计水平。例如,使用高读或写的应用程序,或者两者都是,需要99.999%的可用性。
在这里,我们给架构和部署建议和技术概述解决方案提供了一个高水平的高可用性和假定的使用读/写应用程序(每秒20 k或多个查询)。
布局
组件
该体系结构是由两个主要的层:
- 连接和分布层
- RDBMS (关系数据库管理系统)层
连接层
连接层组成:
- 应用程序代理重定向机制可以从一个虚拟IP管理keepalive像亚马逊这样的本地服务一个DNS解析服务路线53。它的功能是将流量重定向到积极代理节点。
- 代理连接分布由两个或两个以上的节点。它的作用是将流量重定向到集群复制集团活跃节点。类似ProxySQL代理是一个7级代理,能够执行读/写分裂,这一层还负责重定向将主节点和读取写入副本,和HA防止单点故障
数据层
数据层是由:
- 主节点服务写(或源)——这是会接受的节点和DDL修改写道。数据将被处理后酸范式(原子性、一致性、隔离、耐久性)和复制到所有其他节点。
- 复制节点读请求服务的元素。一些副本节点可以选出主要的主节点故障。复制节点应该能够离开并加入健康的集群而不影响服务。
- 复制机制跨节点分配的变化,这个解决方案是用组复制。组复制是紧耦合的解决方案这意味着数据库集群是基于一个数据集中的方法(单状态的数据,分布式提交)。在这种情况下,数据是一致的在时间节点和复制要求性能高的链接。鉴于此,不提倡地理分布和灾难恢复(DR)不是暗中支持的主组复制机制。
节点特征(CPU /内存/存储)不相关的主要解决方案设计。他们必须反映估计工作负载的解决方案必须覆盖,这是一个个案的识别。
什么是重要的是要记住,所有节点是集群的一部分必须具有相同的特点。如果他们不,集群将不平衡和服务将受到影响。
作为一个通用的迹象,我们建议使用解决方案和至少8芯生产时和16 gb的RAM。
高可用性
我们如何衡量可用性和在什么情况下,它成为“高”的可用性?
一般来说,测量的可用性是通过建立一个测量时间和除以时间是可用的。这个比例会很少是1,等于100%的可用性。在Pe雷竞技下载官网rcona我们不认为一个解决方案是高度可用如果不是至少99%或“两个9”可用。
| 可用性% | 每年停机时间 | 每月停机时间 | 每周停机时间 | 每天停机时间 |
| 99%(“两个9”) | 3.65天 | 7.31小时 | 1.68小时 | 14.40分钟 |
| 99.5%(“五两个9”) | 1.83天 | 3.65小时 | 50.40分钟 | 7.20分钟 |
| 99.9%(“三个9”) | 8.77小时 | 43.83分钟 | 10.08分钟 | 1.44分钟 |
| 99.95%(“三9 5”) | 4.38小时 | 21.92分钟 | 5.04分钟 | 43.20秒 |
| 99.99%(“四9”) | 52.60分钟 | 4.38分钟 | 1.01分钟 | 8.64秒 |
| 99.995% (“4 9 5”) | 26.30分钟 | 2.19分钟 | 30.24秒 | 4.32秒 |
| 99.999%(“五个9”) | 5.26分钟 | 26.30秒 | 6.05秒 | 864.00毫秒 |
高可用性是如何实现的呢?
有三个关键组件的高可用性:
- 基础设施这是物理或虚拟硬件,数据库系统依赖于运行。没有足够的基础设施(VM的、网络等)不能有高可用性。最简单的例子是:有没有办法使单个服务器高可用性。
- 拓扑管理——这是特别相关的软件管理数据库和管理能力在发生故障时保持一致。许多聚类或同步复制解决方案提供此功能的盒子。然而,对于异步复制,这是由额外的软件处理。
- 连接管理——这是特别相关的软件管理网络和连接方面的数据库。集群解决方案通常包连接管理器,但是在异步集群部署高可用性的连接管理器是强制性的。
这个解决方案提供了:
建议的解决方案,基于紧密耦合的数据库集群,提供了一个HA水平99.995%当加上组复制设置group_replication_consistency =后。

故障
如果适当的计划和架构,数据库失败或配置更改,需要重新启动不影响数据库基础结构的稳定性。故障转移是稳定战略不可分割的一部分并调整业务需求与故障转移可用性和运行方法是实现这些目标的关键。下面是三个主要类型的故障转移可以发生在数据库环境。
- 故障转移计划故障转移:故障转移的计划已经提前预定或发生在正则区间。可能有许多原因故障转移包括修补计划,大数据业务,现有基础设施退休,或简单地测试故障转移策略。
- 计划外故障转移:计划外故障是发生在数据库意外无响应或经验的不稳定。这可能还包括紧急变化不属于计划的故障转移节奏或调度参数。计划外故障通常被认为是高风险业务由于高压力和高潜力数据损坏或数据碎片。
- 地区或灾难恢复Failover:计划外故障仍然使用假设附加数据库基础设施是立即和处于可用状态。博士在一个地区或故障转移,我们会做出的假设有一个大型基础设施故障,要求企业将其业务从目前的可用性区域。
- 这个解决方案涵盖了计划内和计划外故障转移。
维护窗口
主要和次要的维护:尽管它可能不明显,并不是所有的维护活动都是平等的,没有相同的依赖关系。最好单独维护要求停机维护或故障转移,可以做而不影响那些重要的稳定性指标。在定义这些维护依赖关系可以有改变在实际维修过程中,允许不同的节奏。
维修没有服务中断:滚动重启和使用适当的版本升级可以涵盖主要和次要的维修没有服务中断。
正常运行时间
当指数据库稳定,正常运行时间是可能的最大的稳定性和指标往往是一个不稳定的数据库环境的最明显的症状。正常运行时间由3个关键组件,与普遍的看法相反,是基于数据库软件时发生了什么不可以将传入的请求而不是保持带请求错误的能力。
恢复时间目标(RTO):这可以归结为一个非常简单的问题”可以业务维持一个数据库停机多久?”。一旦业务与最小可行的目标恢复时间目标,更简单的计划和投资所需的基础设施来满足这一需求。是很重要的承认,而每个人的欲望100%正常运行时间,需要切合实际的期望,结合业务需求,而不是一个技术的欲望。
恢复点目标(RPO):恢复点之间有很大的区别和数据库基础设施的恢复时间。数据库可用,但不是精确的状态,这是当它变得不可用。这就是恢复点。这里我们问的问题是“多少数据可以在一个数据库停机业务失去?”。所有的企业都有自己的需求,值得注意的是,它永远是我们的目标永远维持任何数据丢失。但这是陷害在最糟糕的情况下多少数据可能会丢失和业务继续保持能力。
灾难恢复:而RTO和RPO是伟大的计划外停机或小规模打嗝的基础设施,当我们谈论灾难恢复这是一个重大的大规模停电不是严格为数据库基础设施。如何重新启动操作的业务能力与假设所有资源可用性区域主要是完全不可用?这里的假设是没有可行的恢复时间点或符合业务需求。博士虽然每个场景是基于可用的基础设施、独特的备份策略,技术堆栈,都有一些共同点为任何场景。
这个解决方案有助于提高正常运行时间:
使用此解决方案将帮助您同时显著降低RPO, RTO。鉴于紧密耦合的集群解决方案方法,单个节点的故障不会导致服务中断。
增加节点的数量还将提高集群弹性的公式:
F = (N - 1) / 2
地点:
F -容许失败
N -集群中的节点数量
例子:
在一个5节点集群,F = (5 - 1) / 2 = 2。
集群可以支持2失败。
4个节点的集群,F = (4 - 1) / 2 = 1。
集群可以支持多达失败。
这个解决方案还允许一个更严格的备份策略,将一个节点的备份周期,这将有助于在保持RPO低。正如前面提到的,博士不是覆盖默认的解决方案将需要一个额外的复制设置和控制器。
测量和监控raybet雷竞技竞猜在线官网
确保按计划执行数据库基础结构或最好的,有必要衡量这些指标的具体指标和警报当一些的不符合预期。定期检查这些测量也鼓励促进稳定和理解潜在风险与数据库相关的基础设施。以下是数据库性能测量和监控的三个方面raybet雷竞技竞猜在线官网
测量:了解数据库基础设施执行需要测量多个方面的基础设施。与测量,重要的是要理解样本大小的影响,样品时间,样品类型。
指标:指标指的是数据库的实际部分基础设施被测量。当我们讨论指标,并不是像素越高越好,因为它可以引入无意噪音或允许故障诊断变得过于繁琐。
报警:当一个或多个度量数据库的基础设施不正常或可接受的范围内,应该生成一个警告,这样团队负责数据库的适当部分基础设施可以调查和补救措施
raybet雷竞技竞猜在线官网这个解决方案是由监控:
raybetapp官方下载 都有一个特定的仪表板监控组复制状态和集群状态作为一个整体raybet雷竞技竞猜在线官网。(<一个href="//m.doggingzone.com/doc/percona-monitoring-and-management/2.x/introduction.html">https://www.雷竞技下载官网percona.com/doc/praybet雷竞技竞猜在线官网ercona-monitoring-and-management/2.x/introduction.html一个>)有一个特定的仪表板监控组复制状态,和集群状态作为一个整体。raybet雷竞技竞猜在线官网
如何实现基础设施
在本节中,我们提供一步一步的指示如何实现上面的解决方案。
的元素
以下将使用:
- 1虚拟IP ProxySQL 192.168.4.194故障转移
- 2 ProxySQL节点
- Proxy1 192.168.4.191
- Proxy2 192.168.4.192
- 4 MySQL节点单主要模式
- Gr1一起192.168.4.81——最初的主
- Gr2 192.168.4.82 -副本/故障转移
- Gr3 192.168.4.83 -副本/故障转移
- Gr4“192.168.4.84 -副本/备份
- 港口。所有的港口都必须打开防火墙是否到位AppArmor对或SELinux或任何其他限制。
- Proxysql
- 6033年
- 6032年
- 3306年
- MySQL - GR
- 3306年
- 33060年
- 33061年
- Proxysql
软件安装
首先,你需要安装<一个href="//m.doggingzone.com/software/mysql-database">雷竞技下载官网MySQL Percona分布一个>MySQL- - - - - -雷竞技下载官网based变体,Percona服务器,每个节点上。按照说明在https://www.雷竞技下载官网percona.com/doc/percona-distribution-mysql/8.0/installing.html安装MySQL v8.雷竞技下载官网0 Percona服务器。
配置节点
在什么之前,确保所有节点使用相同的时区和时间:
|
1
2
|
(
根
@
gr1一起
ps8
]
#日期
星期二
8月
18
08年
:
22
:
12
美国东部时间
2020年
|
检查也ntpd服务出现和启用。确保每个节点解析的其他节点名称:
|
1
|
根
@
gr1一起
ps8
]
我在1 2 3 4 #;ping - c 1 gr $我> / dev / null; echo $ ?;完成
|
如果不能够解决,添加的条目设置文件。
一旦服务器实例启动并运行检查Percona MySQL版本在每个节点上:雷竞技下载官网
|
1
2
3
|
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a2d0cdcdd6e2cccdc6c793">(电子邮件保护)一个>)((没有一个)]>\ s
- - - - - - - - - - - - - - -
/ opt/mysql_templates/PS- - - - - -8页/
本
/mysql版本8.0.20- - - - - -11
为
Linux
在
x86_64(雷竞技下载官网Percona
服务器
(GPL),
释放
11日,修订159 f0eb)
|
步骤1
创建一个适当的用户管理:
|
1
2
3
4
5
|
|
根用户退出客户端,登录用户的dba。
一定要有一个好的和独特SERVER_ID值:
|
1
2
3
4
5
6
7
|
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5f3b3d3e1f31303b3a6e">(电子邮件保护)一个>)((没有一个)]>
显示
全球
变量
就像
“server_id”;
+ - - - - - - - - - - - - - - - - - - - - - - - - - +
|Variable_name|
价值
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - +
|server_id|1|
<- - - - - -——不好给出相同的所有节点
+ - - - - - - - - - - - - - - - - - - - - - - - - - +
1
行
在
集
(0.01sec)
|
现在是时候组复制设置添加到实例。
步骤2
停止所有正在运行的节点,然后添加在my . cnf中所做:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29日
30.
31日
32
33
34
35
36
37
38
39
40
41
42
43
44
|
# # # # # # # # # # # # # # # # # # # # #
# + binlog复制设置
# # # # # # # # # # # # # # # # # # # # #
汽车- - - - - -增量- - - - - -增量= 1
汽车- - - - - -增量- - - - - -
抵消
= 1
日志
- - - - - -
本
=<path_to_logs>/binlog
日志
- - - - - -
本
- - - - - -
指数
=binlog。指数
binlog
- - - - - -
校验和
=没有一个
binlog
- - - - - -
格式
=行
binlog
- - - - - -
行
- - - - - -图像=完整的
日志
- - - - - -
奴隶
- - - - - -更新= 1
binlog
- - - - - -
事务
- - - - - -依赖- - - - - -跟踪= WRITESET
执行- - - - - -gtid- - - - - -一致性=真正的
gtid- - - - - -
模式
=在
主
- - - - - -信息- - - - - -
文件
=主info
主
- - - - - -信息- - - - - -存储库=表
relay_log_info_repository=表
继电器- - - - - -
日志
=<path_to_logs>/继电器
同步- - - - - -
binlog
= 1
# # #的奴隶
跳过- - - - - -
奴隶
- - - - - -
开始
奴隶
- - - - - -平行- - - - - -
类型
=LOGICAL_CLOCK
奴隶
- - - - - -平行- - - - - -工人=4
奴隶
- - - - - -
保存
- - - - - -
提交
- - - - - -
订单
=1
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#组复制
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
plugin_load_add=“group_replication.so”
插件- - - - - -
负载
- - - - - -
添加
=“mysql_clone.so”
group_replication_group_name=“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”
<
——不好用的东西会帮助你
来
识别的GR交易
和
从
在哪里
他们
来
从
即
“dc1euz1-aaaa-aaaa-aaaa-aaaaaaaaaaaa”
group_replication_start_on_boot=下
group_replication_local_address=
“192.168.4.81/2/3/4:33061”
<- - -——改变这种匹配每个节点本地IP
group_replication_group_seeds=
“192.168.4.81:33061 192.168.4.82:33061 192.168.4.83:33061 192.168.4.84:33061”
group_replication_bootstrap_group=从
事务
- - - - - -
写
- - - - - -
集
- - - - - -提取=XXHASH64
|
重启所有节点和连接。
步骤3
创建一个用户复制(在所有节点上):
|
1
2
3
4
5
|
集
SQL_LOG_BIN
=0;
冲洗
特权;
集
SQL_LOG_BIN
=1;
|
链接的节点复制通道(在所有节点上):
|
1
|
改变
主
来
MASTER_USER=“复制”,
MASTER_PASSWORD=“replicapw”
为
通道
“group_replication_recovery”;
|
检查当前状态:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
|
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c0a4a2a180aeafa4a5f1">(电子邮件保护)一个>)((没有一个)]>\ uperformance_schema
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d8bcbab998b6b7bcbde9">(电子邮件保护)一个>)(performance_schema)>
显示
表
就像
“% repl %”;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|Tables_in_performance_schema(% repl %)|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|replication_applier_configuration|
|replication_applier_filters|
|replication_applier_global_filters|
|replication_applier_status|
|replication_applier_status_by_coordinator|
|replication_applier_status_by_worker|
|replication_connection_configuration|
|replication_connection_status|
|replication_group_member_stats|
|replication_group_members|
<- - - - - - - - - - - - - - - - - - - - - - - -
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4a2e282b0a24252e2f7b">(电子邮件保护)一个>)(performance_schema)>
选择
*
从
replication_group_members \ G
CHANNEL_NAME:group_replication_applier
MEMBER_ID:
MEMBER_HOST:
MEMBER_PORT:
MEMBER_STATE:
MEMBER_ROLE:离线
MEMBER_VERSION:
1
行
在
集
(0.00sec)
|
在这个阶段,您应该能够开始第一个(主)集群节点。
只有在GR1一起:
|
1
2
3
|
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="40242221002e2f242571">(电子邮件保护)一个>)[没有一个]>
集全球
group_replication_bootstrap_group=
在;
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f5919794b59b9a9190c4">(电子邮件保护)一个>)[没有一个]>
开始
GROUP_REPLICATION;
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4c282e2d0c222328297d">(电子邮件保护)一个>)[没有一个]>
集全球
group_replication_bootstrap_group=要走;
|
然后检查它:
|
1
2
3
4
5
6
7
8
|
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="87e3e5e6c7e9e8e3e2b6">(电子邮件保护)一个>)(没有一个]>
选择
*
从
performance_schema.replication_group_members \ G
CHANNEL_NAME:group_replication_applier
MEMBER_ID:90年a353b8- - - - - -e6dc- - - - - -11 ea- - - - - -98年足总杯- - - - - -08002734 ed50
MEMBER_HOST:gr1一起
MEMBER_PORT:3306年
MEMBER_STATE:在线
MEMBER_ROLE:
主
MEMBER_VERSION:8.0.20
|
一旦主正在运行,连接在第二个节点GR2并开始复制:
|
1
2
|
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a3c7c1c2e3cdccc7c691">(电子邮件保护)一个>)(没有一个]>
开始
GROUP_REPLICATION;
查询好吧,0
行
影响(4.60sec)
|
检查它是否正确注册:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ec888e8dac82838889de">(电子邮件保护)一个>)(performance_schema)>
选择
*
从
replication_group_members \ G
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
CHANNEL_NAME:group_replication_applier
MEMBER_ID:58 ffd118- - - - - -e6dc- - - - - -11 ea- - - - - -8 af8- - - - - -08002734 ed50
MEMBER_HOST:gr2
MEMBER_PORT:3306年
MEMBER_STATE:在线
MEMBER_ROLE:二次
MEMBER_VERSION:8.0.20
* * * * * * * * * * * * * * * * * * * * * * * * * * *2。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
CHANNEL_NAME:group_replication_applier
MEMBER_ID:90年a353b8- - - - - -e6dc- - - - - -11 ea- - - - - -98年足总杯- - - - - -08002734 ed50
MEMBER_HOST:gr1一起
MEMBER_PORT:3306年
MEMBER_STATE:在线
MEMBER_ROLE:
主
MEMBER_VERSION:8.0.20
|
测试复制工作原理:
在GR1一起
|
1
2
3
4
5
6
7
8
9
10
11
|
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="197d7b785977767d7c28">(电子邮件保护)一个>)(performance_schema)>
创建
模式
测试;
查询好吧,1
行
影响(0.76sec)
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fd999f9cbd93929998cc">(电子邮件保护)一个>)(performance_schema)>\ u测试
数据库
改变了
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="17737576577978737226">(电子邮件保护)一个>)(测试)>
创建
表
test1(“id”
int
auto_increment
主键);
查询好吧,0
行
影响(0.32sec)
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d8bcbab998b6b7bcbde9">(电子邮件保护)一个>)(测试)>
插入
成
test1
值(零);
查询好吧,1
行
影响(0.34sec)
|
在GR2
|
1
2
3
4
5
6
7
8
9
|
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7b1f191a3b15141f1e49">(电子邮件保护)一个>)(performance_schema)>
使用
\测试
数据库
改变了
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="eb8f898aab85848f8ed9">(电子邮件保护)一个>)(测试)>
选择
*
从
test1;
+ - - - +
|id|
+ - - - +
|1|
+ - - - +
1
行
在
集
(0.00sec)
|
开始组复制的其他两个节点GR3 GR4“:
|
1
2
|
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="94f0f6f5d4fafbf0f1a7">(电子邮件保护)一个>)(performance_schema)>
开始
GROUP_REPLICATION;
(<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="05616764456b6a616031">(电子邮件保护)一个>)(performance_schema)>
开始
GROUP_REPLICATION;
|
代理设置
步骤1
在我们的解决方案,我们将使用两个ProxySQL节点:
- Proxy1 192.168.4.191
- Proxy2 192.168.4.192
首先,您需要安装ProxySQL节点选择,在我们的例子中两个以上。
按照说明安装软件<一个href="//m.doggingzone.com/blog/2020/04/08/how-to-install-proxysql-from-the-percona-repository/">如何安装ProxySQL Percona库雷竞技下载官网一个>。一旦你已经安装了软件,我们首先需要授权访问ProxySQL监控用户对我们Percona MySQL服务器节点。雷竞技下载官网raybet雷竞技竞猜在线官网
在MySQL创raybet雷竞技竞猜在线官网建监控用户组复制节点:
|
1
2
3
4
|
创建
raybet雷竞技竞猜在线官网
用户
在
MySQL
集团
复制
节点:
格兰特
使用
在
* . *
来
“raybet雷竞技竞猜在线官网监控”@“192.168.4. %”;
格兰特
选择
在
sys . *
来
“raybet雷竞技竞猜在线官网监控”@“192.168.4. %”;
|
然后定义一些基本的变量:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
更新
global_variables
集
Variable_Value =“管理:管理;cluster1: clusterpass”
在哪里
Variable_name =“admin-admin_credentials”;
更新
global_variables
集
variable_value =“cluster1”
在哪里
variable_name =“admin-cluster_username”;
更新
global_variables
集
variable_value =“clusterpass”
在哪里
variable_name =“admin-cluster_password”;
更新
global_variables
集
Variable_Value=0
在哪里
Variable_name =“mysql-hostgroup_manager_verbose”;
更新
global_variables
集
Variable_Value =“真正的”
在哪里
Variable_name =“mysql-query_digests_normalize_digest_text”;
更新
global_variables
集
Variable_Value =“8.0.20”
在哪里
Variable_name =“mysql-server_version”;
更新
global_variables
集
Variable_Value =“use utf8”
在哪里
Variable_name =“mysql-default_charset”;
更新
global_variables
集
Variable_Value=300年
在哪里
Variable_name =“mysql-tcp_keepalive_time”;
更新
global_variables
集
Variable_Value =“真正的”
在哪里
Variable_name =“mysql-use_tcp_keepalive”;
更新
global_variables
集
Variable_Value =“真正的”
在哪里
Variable_name =“mysql-verbose_query_error”;
更新
global_variables
集
Variable_Value =“真正的”
在哪里
Variable_name =“mysql-show_processlist_extended”;
更新
global_variables
集
Variable_Value=50000年
在哪里
Variable_name =“mysql-max_stmts_cache”;
更新
global_variables
集
Variable_Value =“假”
在哪里
Variable_name =“admin-web_enabled”;
更新
global_variables
集
Variable_Value =' 0 '
在哪里
Variable_name =“mysql-set_query_lock_on_hostgroup”;
负载
管理
变量
来
运行,节省管理
变量
来
磁盘;
负载
mysql
变量
来
运行,节省mysql
变量
来
磁盘;
|
用户名和密码需要反映你的标准。上面使用的只是一个例子。然后设置节点集群:
|
1
2
3
|
插入
成
proxysql_servers(主机名,港口、体重、评论)
值(“192.168.4.191”、6032、100、“主”);
插入
成
proxysql_servers(主机名,港口、体重、评论)
值(“192.168.4.192”、6032、100、“二级”);
负载
proxysql服务器
来
运行,节省proxysql服务器
来
磁盘;
|
步骤2
定义用户(s)、服务器和查询规则执行读/写分裂。创建一个或多个有效的用户,例如,如果你有一个用户命名app_gr与密码测试中,访问你的集团集群复制:
|
1
2
|
插入
成
mysql_users(用户名、密码、积极、default_hostgroup default_schema transaction_persistent,评论)
值
(“app_gr”,“测试”,1400,“mysql”,1“应用程序测试用户GR”);
负载
MYSQL用户
来
运行时,保存MYSQL用户
来
磁盘;
|
定义服务器:
|
1
2
3
4
5
6
|
插入
成
mysql_servers(主机名、hostgroup_id港口、重量、max_connections评论)
值
(“192.168.4.81”、400、3306、10000、2000、“GR1一起”);
插入
成
mysql_servers(主机名、hostgroup_id港口、重量、max_connections评论)
值
(“192.168.4.81”、401、3306、100、2000、“GR1一起”);
插入
成
mysql_servers(主机名、hostgroup_id港口、重量、max_connections评论)
值
(“192.168.4.82”、401、3306、10000、2000、“GR2”);
插入
成
mysql_servers(主机名、hostgroup_id港口、重量、max_connections评论)
值
(“192.168.4.83”、401、3306、10000、2000、“GR2”);
插入
成
mysql_servers(主机名、hostgroup_id港口、重量、max_connections评论)
值
(“192.168.4.84”,401,3306,2000,“GR2”);
负载
MYSQL服务器
来
运行时;保存MYSQL服务器
来
磁盘;
|
定义查询规则获得读写分离:
|
1
2
3
|
插入
成
mysql_query_rules(rule_id proxy_port、用户名、destination_hostgroup活跃,重试,match_digest,适用)
值(4040年,6033年,“app_gr”400年,1,3,“^选择。*为UPDATE'1);
插入
成
mysql_query_rules(rule_id proxy_port、用户名、destination_hostgroup活跃,重试,match_digest,多路复用,适用)
值(4042年,6033年,“app_gr”401年,1,3,“* $ ^选择。”,1,1);
负载
MYSQL查询规则
来
运行,节省MYSQL查询规则
来
磁盘;
|
步骤3
一旦我们准备好所有的配置,我们需要有一个特殊的系统模式中的视图Percona服务器节点。雷竞技下载官网视图为服务器版本8以上工作可以在这里找到(https://github.com/雷竞技下载官网Percona-Lab/group_replication_tools/blob/master/GR_sys_view_forProxysql_v1.sql)
在主节点上运行sql的集群复制。
步骤4
现在我们已经准备好启动本机支持集团在ProxySQL复制。我们将使用以下组定义:
作家HG - > 400
读者HG - > 401
BackupWHG - > 402
离线HG - > 9401
|
1
2
3
|
插入
成
mysql_group_replication_hostgroups(backup_writer_hostgroup writer_hostgroup reader_hostgroup,offline_hostgroup,活跃,max_writers writer_is_also_reader max_transactions_behind)
值
(400402401、9401、1100);
负载
MYSQL服务器
来
运行时;保存MYSQL服务器
来
磁盘;
|
一些评论在这里看到完整的参数(参考<一个href="https://proxysql.com/documentation/main-runtime">https://proxysql.com/documentation/main-runtime mysql_group_replication_hostgroups一个>)。我们建议设置的作家总是数1,以及witer_is_also_reader比1获得最可靠的结果。
max_writers: 1
writer_is_also_reader: 1
max_transactions_behind是一个主观的参数,你应该计算的基础上您的需求。如果例如你不能有一个陈旧的阅读,这将是安全的将这个值设置为较低的数字(50)和设置在所有组复制节点:
|
1
|
集全球
group_replication_consistency=
后;
|
如果相反,你没有问题或严格的要求对一些陈旧的阅读,你可以放松和忽视的参数group_replication_consistency设置。我们建议设置group_replication_consistency =后和max_transactions_behind: 100。
代理哈
最后一步是为ProxySQL层启用高可用性。在这种方法中,我们将使用众所周知的keepalive服务。首先,安装keepalive软件使用百胜或apt-get在每个ProxySQL节点:
|
1
2
3
|
Sudo
百胜
安装
- - - - - -
y
keepalive
或
Sudo
恰当的
- - - - - -
得到
安装
- - - - - -
y
keepalive
|
然后修改/etc/keepalived/keepalived。相应的配置文件设置。在我们的例子中:
- Proxy1192.168.4.0/24 dev enp0s9原型内核链接src 192.168.4.191范围
- Proxy2192.168.4.0/24 dev enp0s9原型内核链接src 192.168.4.192范围
- VIP 192.168.4.194
我们想要主Proxy1 Proxy2和故障转移节点。考虑到配置的样子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
|
猫
/
等
/
keepalive
/
keepalive
。
相依
global_defs
{
#
keepalive
过程
标识符
router_id
proxy_HA
}
#
脚本
使用
来
检查
如果
代理
是
运行
vrrp_script
check_proxy
{
脚本
“killall 0 proxysql”
时间间隔
2
重量
2
}
#
虚拟
接口
#
的
优先级
指定
的
订单
在
哪一个
的
分配
接口
来
取
在
在
一个
故障转移
vrrp_instance
VI_01
{
状态
主
接口
enp0s9
virtual_router_id
51
优先级
One hundred.
<
- - -
- - -
- - - - - -
这
需要
来
是
不同的
为
每一个
ProxySQL
节点
,
就像
One hundred.
/
99年
#
的
虚拟
知识产权
地址
共享
之间的
的
两个
负载
平衡器
virtual_ipaddress
{
192.168.4.194
dev
enp0s9
}
track_script
{
check_proxy
}
}
|
一旦完成,keepalive服务开始,从现在开始的贵宾将Proxy1除非服务。
系统日志:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP
sockpool
:
(
ifindex
(
4
)
,
原型
(
112年
)
,
单播
(
0
)
,
fd
(
10
,
11
)
]
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP_Script
(
check_proxy
)
成功
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP_Instance
(
VI_01
)
过渡
来
主
状态
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP_Instance
(
VI_01
)
收到了
广告
与
更高的
优先级
101年
,
我们的
One hundred.
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP_Instance
(
VI_01
)
进入
备份
状态
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP_Instance
(
VI_01
)
改变
有效的
优先级
从
One hundred.
来
102年
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP_Instance
(
VI_01
)
迫使
一个
新
主
选举
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP_Instance
(
VI_01
)
过渡
来
主
状态
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP_Instance
(
VI_01
)
进入
主
状态
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP_Instance
(
VI_01
)
设置
协议
贵宾
。
proxysql1
Keepalived_vrrp
(
17422年
]
:
发送
免费的
ARP
在
enp0s9
为
192.168.4.194
proxysql1
Keepalived_vrrp
(
17422年
]
:
VRRP_Instance
(
VI_01
)
发送
/
排队
免费的
石头剪刀
在
enp0s9
为
192.168.4.194
proxysql1
Keepalived_vrrp
(
17422年
]
:
发送
免费的
ARP
在
enp0s9
为
192.168.4.194
。
。
proxysql1
Keepalived_vrrp
(
17422年
]
:
发送
免费的
ARP
在
enp0s9
为
192.168.4.194
proxysql1
avahi
- - - - - -
守护进程
(
989年
]
:
注册
新
地址
记录
为
192.168.4.194
在
enp0s9
.IPv4
。
|
实施灾难恢复
博士的实现(灾难恢复)网站将遵循相同的方向提供了主要的网站。只有一些通用的规则,应遵循:
- DR站点应该位于不同的地理位置比主网站(几百公里/英里之外)。
- 连接之间的联系的主要网站和DR站点只能使用异步复制(标准MySQL复制设置)。
raybet雷竞技竞猜在线官网监控
只有很少的方法用于监视一组集群复制。raybet雷竞技竞猜在线官网最简单的方法是<一个href="//m.doggingzone.com/software/database-tools/percona-monitoring-and-management">雷竞技下载官网Praybet雷竞技竞猜在线官网ercona监视和管理一个>(版本2.10或更高版本)部署到为你做这些。Percona监视和管理的安装方便查看雷竞技下载官网raybet雷竞技竞猜在线官网快速入门。
雷竞技下载官网Praybet雷竞技竞猜在线官网ercona监视和管理
唯一重要的是要记住,当注册Percona为MySQL节点或MySQL服务器节点,你应该指定雷竞技下载官网replication_set国旗。
|
1
|
即
:
pmm
- - - - - -
管理
添加
mysql
- - -
用户名
=
pmm
- - -
密码
=
pmm
- - -
查询
- - - - - -
源
=
perfschema
- - -
复制
- - - - - -
集
=
gr_test_lab
集团
_rep4
127.0.0.1
:
3306年
|
然后您可以使用组复制仪表板和监控您的集群的细节。raybet雷竞技竞猜在线官网
的部分是:
- 概述(3板)
- 复制延迟细节(3板)
- 事务(8板)
- 冲突
从命令行
从命令行您需要手动查询中的表性能模式:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|replication_applier_configuration|
|replication_applier_filters|
|replication_applier_global_filters|
|replication_applier_status|
|replication_applier_status_by_coordinator|
|replication_applier_status_by_worker|
|replication_connection_configuration|
|replication_connection_status|
|replication_group_member_stats|
|replication_group_members|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
例如,滞后的交易数量的节点:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
|
选择
@last_exec:=
SUBSTRING_INDEX(SUBSTRING_INDEX(@@全球.GTID_EXECUTED,“:”1),“- - -”,1)last_executed;选择
@last_rec:=
SUBSTRING_INDEX(SUBSTRING_INDEX(Received_transaction_set“:”1),“- - -”,1)last_received
从
performance_schema.replication_connection_status
在哪里
Channel_name=
“group_replication_applier”;
选择
(@last_rec- - - - - -@last_exec)
作为
real_lag;
+ - - - - - - - - - - - - - - - - - - +
|last_executed|
+ - - - - - - - - - - - - - - - - - - +
|125624年|
+ - - - - - - - - - - - - - - - - - - +
1
行
在
集,1警告(0.03sec)
+ - - - - - - - - - - - - - - - - - - +
|last_received|
+ - - - - - - - - - - - - - - - - - - +
|125624年|
+ - - - - - - - - - - - - - - - - - - +
1
行
在
集,1警告(0.00sec)
+ - - - - - - - - - - - +
|real_lag|
+ - - - - - - - - - - - +
|0|
+ - - - - - - - - - - - +
1
行
在
集
(0.00sec)
|
或者使用一个更综合查询:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
|
选择
conn_status.channel_name
作为
channel_name,
conn_status.service_state
作为
IO_thread,
applier_status.service_state
作为
SQL_thread,
conn_status.LAST_QUEUED_TRANSACTION
作为
last_queued_transaction,
applier_status.LAST_APPLIED_TRANSACTION
作为
last_applied_transaction,
LAST_APPLIED_TRANSACTION_END_APPLY_TIMESTAMP- - - - - -
LAST_APPLIED_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP
“代表延迟(sec)”,
LAST_QUEUED_TRANSACTION_START_QUEUE_TIMESTAMP- - - - - -
LAST_QUEUED_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP
的运输时间,
LAST_QUEUED_TRANSACTION_END_QUEUE_TIMESTAMP- - - - - -
LAST_QUEUED_TRANSACTION_START_QUEUE_TIMESTAMP
“时间RL”,
LAST_APPLIED_TRANSACTION_END_APPLY_TIMESTAMP- - - - - -
LAST_APPLIED_TRANSACTION_START_APPLY_TIMESTAMP
“申请时间”,
如果(GTID_SUBTRACT(LAST_QUEUED_TRANSACTIONLAST_APPLIED_TRANSACTION)=
”“,“0”
,
腹肌(time_to_sec(如果(time_to_sec(APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP) = 0, 0,timediff(APPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP现在())))))“lag_in_sec”
从
performance_schema.replication_connection_status
作为
conn_status
加入
performance_schema.replication_applier_status_by_worker
作为
applier_status
在
applier_status.channel_name=conn_status.channel_name
命令
lag_in_sec,lag_in_sec
desc\ G
|
这将提供每个灌肠器的信息:
|
1
2
3
4
5
6
7
8
9
10
11
|
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
channel_name:group_replication_applier
IO_thread:
在
SQL_thread:
在
last_queued_transaction:aaaaaaaa- - - - - -aaaa级- - - - - -aaaa级- - - - - -aaaa级- - - - - -aaaaaaaaaaaa: 125624
last_applied_transaction:aaaaaaaa- - - - - -aaaa级- - - - - -aaaa级- - - - - -aaaa级- - - - - -aaaaaaaaaaaa: 125621
代表延迟(秒):3.153038
运输
时间:0.061327
时间
RL:0.001005
应用
时间:0.388680
lag_in_sec:0
|
正如您可以看到的,<一个href="//m.doggingzone.com/software/database-tools/percona-monitoring-and-management">雷竞技下载官网Praybet雷竞技竞猜在线官网ercona监视和管理一个>会给你一个更好的看法的前提下细节。
结论
使用这些步骤和建议,您可以设置数据库基础设施拥有高可用性的基于组复制和使用Percona监视和管理监控基础设施的性能和健康。雷竞技下载官网raybet雷竞技竞猜在线官网
请记住,我们一直致力于使我们的建议更好。因此,这里说明主题的基础上更改和修订尤其是越来越多的采用组复制。这是因为越是GR使用边界情况或偏差识别。这是一个重要的帮助我们完善我们的最佳实践。
雷竞技下载官网MySQL Percona分布是最完整的,稳定的,可伸缩的,和安全,开源MySQL解决方案,提供企业级的数据库环境最关键业务应用程序…和它的免费使用!










在Pe雷竞技下载官网rcona 8.0.22,似乎有一个错误。
例如,有一个单一主集群模式下,创建一个会话s1,执行选择sys.gr_member_in_primary_partition(),然后创建一个会话s2, FTWRL执行,然后执行选择sys.gr_member_in_primary_partition s2(),那么您将得到一个错误:“子查询返回多行”,导致查询系统。gr_member_routing_candidate_status也报告错误,即使s2执行解锁表、s1仍然会报告错误。这导致ProxySQL健康检查失败OFFLINE_HARD和节点
临时解决方案是
创建函数my_server_uuid()返回文本(36)不确定性SQL返回(选择@@global。server_uuid my_id); $ $
创建视图gr_member_routing_candidate_status
选择
IFNULL(选择
如果(MEMBER_STATE =“在线”
和((选择
COUNT (*)
从
performance_schema.replication_group_members
在哪里
MEMBER_STATE ! = > =((选择“在线”)
COUNT (*)
从
performance_schema.replication_group_members) / 2) = 0),
“是的”,
“不”)
从
performance_schema.replication_group_members
加入
performance_schema。复制_集团_member_stats rgms USING (member_id)
在哪里
rgm。MEMBER_ID = my_server_uuid ()),
“不”)为viable_candidate,
如果(选择
(选择
GROUP_CONCAT (performance_schema.global_variables.VARIABLE_VALUE
分隔符“,”)
从
performance_schema.global_variables
在哪里
(performance_schema.global_variables。VARIABLE_NAME (' read_only ', ' super_read_only '))),关闭)
),
“是的”,
read_only '没有'),
IFNULL (sys.gr_applier_queue_length (), 0) transactions_behind,
IFNULL (sys.gr_transactions_to_cert (), 0) transactions_to_cert; $ $
嗨,风扇,
你用SP的版本我在博客或暗示的ProxySQL文档吗?
因为后者不是使用MySQL 8并返回多个行。
一个博客中
https://github.com/雷竞技下载官网Percona-Lab/group_replication_tools/blob/master/GR_sys_view_forProxysql_v1.sql一个>
嗨,马克
你似乎并没有仔细阅读我的描述,我使用你的脚本,但上述问题的原因不是脚本,它应该是一个mysql bug。
在Pe雷竞技下载官网rcona8.0.22可以稳定的繁殖。
https://github.com/雷竞技下载官网Percona-Lab/group_replication_tools/pull/1一个>
粉丝,
我明白你的意思和修改程序来处理可能锁定问题。
顺便说一下是什么原因您使用FTWRL,主要用于MyISAM吗?
我想了解这里的情况。
使用mydumper
另一个错误proxysql2.0.18
https://github.com/sysown/proxysql/issues/3406一个>