mysql 中间件 意义,MYSQL 中间件 为什么选择 PROXYSQL VS INNODB CLUSTER

5dc18d1e9eb7d74f9f6eeb6fe55f8899.png

没有磨难,怎么能得到心灵的平静,吃过苦,才懂得甜的味道,Just waitting .

5a3df497592ef64931d5428cb526fa82.png

实际上proxysql 本身支持的MYSQL的高可用方式中,早早就支持了MGR的方式了,之前是写过PROXYSQL 支持 MYSQL 5.7 高可用的方式,使用了有也有很长一段时间,很稳定。有同学反映,在搭建MYSQL8.019时,照方抓药发现问题无法解决。下面先将安装的流程来一边,在说到底为什么,老方法不行了。

首先常规安装完proxysql 的安装包后,进行相关的配置与上一篇有部分是不一致的。

三台MYSQL 8.019

10.5.1.100

10.5.1.101

10.5.1.102

登陆到proxysql

mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

将三台机器录入到 mysql_servers 中

INSERT INTO mysql_servers (hostname,hostgroup_id,port,weight) VALUES ('192.168.198.102',600,3306,1000);

INSERT INTO mysql_servers (hostname,hostgroup_id,port,weight) VALUES ('192.168.198.101',602,3306,1000);

INSERT INTO mysql_servers (hostname,hostgroup_id,port,weight) VALUES ('192.168.198.100',602,3306,1000);

这里主要和mysql_group_replication_hostgroups,中的

writer_hostgroup

backup_writer_hostgroup

reader_hostgroup

offline_hostgroup

四个参数有关,其中由于MGR 本身存在可以有多主的情况, 虽然 proxysql 也支持,但这里不会讨论,仅仅会讨论单主的情况。

writer hostgroup  组  同一个时刻只能有一台机器

backup_writer_hostgroup 在有多主的情况下有用,这里暂不讨论

reader_hostgroup   只读组

offline_hostgroup   服务器已经不再组内,或失联

所以在录入 mysql_group_replication_hostgroups

insert into mysql_group_replication_hostgroups

(writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,offline_hostgroup,active,max_writers,writer_is_also_reader,max_transactions_behind) values (600,601,602,603,1,1,1,0);

这里需要注意几点

1  这里write_hostgroup, backup_write_hostgroup , reader_hostgroup, offline_hostgroup 必须是不同的,否则是无法进行数据插入的。

2  max_writers  默认为1  ,在同一个时刻只能有一个写库

3  writer_is_also_reader ,读写操作在一起

4  max_transactions_behind  与MGR 本身的事务一致性设置有关

最后还需要设置monitor账户,以及访问mysql的账号即可(具体就不赘述,可以参考上一篇)

通过预设的账号登陆到PROXYSQL 中

b543544cb34a64c36003fc08e0c48a59.png

登陆后可以进行相关的DDL 以及查询操作

00d5e098f3417f214fabb45af1fae221.png

我们进行下一步的测试

1  我们停止掉MGR 中的写库primary , 测试系统是否可以进行切换

停止 192.168.198.101 primary

6397dc1c781f3e7b379bdc4a1a0c4396.png

2  我们继续通过 6033 端口进行写操作

不断继续插入数据,查看是否有失败的情况,结果 在主节点进行切换期间,写操作失败

8f0a9de4a57bebe6e82bde8854b664f5.png

3  写操作后续是否能正常工作 结果可以

具体PROXYSQL 是如何对MGR 节点进行判断的

c413be1b7f214af0cf8fa2ba7814569e.png

根据查看相关日志,默认的情况55秒进行一次连接判断测试,每台服务器4-5秒一次查询当前的服务器的情况。

679115f9bb8566b8b7f355e1026927a2.png

实际上判断每台服务器的语句判断的有三个值, 服务器是否还在这个集群中,服务器是不是read_only 还有 transaction_behind 的值等。

49a2e536dc05e118856b54a8d1156407.png

其他的服务器的 viable_candidate 的值就会变为 NO

其实这里要讨论的一个关键的问题,就是在MYSQL 5.7中通过proxysql 来行切换是没有问题,但换到 8.019 系统就无法进行正常的切换和使用。主要的问题就在于下面的这段,下面的脚本是需要在MYSQL 的sys库来生成的,目的就是提供查询值,来让proxysql判断MYSQL 节点是否在正常工作。

USE sys;

DELIMITER $$

CREATE FUNCTION IFZERO(a INT, b INT)

RETURNS INT

DETERMINISTIC

RETURN IF(a = 0, b, a)$$

CREATE FUNCTION LOCATE2(needle TEXT(10000), haystack TEXT(10000), offset INT)

RETURNS INT

DETERMINISTIC

RETURN IFZERO(LOCATE(needle, haystack, offset), LENGTH(haystack) + 1)$$

CREATE FUNCTION GTID_NORMALIZE(g TEXT(10000))

RETURNS TEXT(10000)

DETERMINISTIC

RETURN GTID_SUBTRACT(g, '')$$

CREATE FUNCTION GTID_COUNT(gtid_set TEXT(10000))

RETURNS INT

DETERMINISTIC

BEGIN

DECLARE result BIGINT DEFAULT 0;

DECLARE colon_pos INT;

DECLARE next_dash_pos INT;

DECLARE next_colon_pos INT;

DECLARE next_comma_pos INT;

SET gtid_set = GTID_NORMALIZE(gtid_set);

SET colon_pos = LOCATE2(':', gtid_set, 1);

WHILE colon_pos != LENGTH(gtid_set) + 1 DO

SET next_dash_pos = LOCATE2('-', gtid_set, colon_pos + 1);

SET next_colon_pos = LOCATE2(':', gtid_set, colon_pos + 1);

SET next_comma_pos = LOCATE2(',', gtid_set, colon_pos + 1);

IF next_dash_pos < next_colon_pos AND next_dash_pos < next_comma_pos THEN

SET result = result +

SUBSTR(gtid_set, next_dash_pos + 1,

LEAST(next_colon_pos, next_comma_pos) - (next_dash_pos + 1)) -

SUBSTR(gtid_set, colon_pos + 1, next_dash_pos - (colon_pos + 1)) + 1;

ELSE

SET result = result + 1;

END IF;

SET colon_pos = next_colon_pos;

END WHILE;

RETURN result;

END$$

CREATE FUNCTION gr_applier_queue_length()

RETURNS INT

DETERMINISTIC

BEGIN

RETURN (SELECT sys.gtid_count( GTID_SUBTRACT( (SELECT

Received_transaction_set FROM performance_schema.replication_connection_status

WHERE Channel_name = 'group_replication_applier' ), (SELECT

@@global.GTID_EXECUTED) )));

END$$

CREATE FUNCTION gr_member_in_primary_partition()

RETURNS VARCHAR(3)

DETERMINISTIC

BEGIN

RETURN (SELECT IF( MEMBER_STATE='ONLINE' AND ((SELECT COUNT(*) FROM

performance_schema.replication_group_members WHERE MEMBER_STATE != 'ONLINE') >=

((SELECT COUNT(*) FROM performance_schema.replication_group_members)/2) = 0),

'YES', 'NO' ) FROM performance_schema.replication_group_members JOIN

performance_schema.replication_group_member_stats USING(member_id));

END$$

CREATE VIEW gr_member_routing_candidate_status AS SELECT

sys.gr_member_in_primary_partition() as viable_candidate,

IF( (SELECT (SELECT GROUP_CONCAT(variable_value) FROM

performance_schema.global_variables WHERE variable_name IN ('read_only',

'super_read_only')) != 'OFF,OFF'), 'YES', 'NO') as read_only,

sys.gr_applier_queue_length() as transactions_behind, Count_Transactions_in_queue as 'transactions_to_cert' from performance_schema.replication_group_member_stats;$$

DELIMITER ;

变化点在加粗的位置,添加了过滤本机的信息,弥补MYSQL5.7 的系统表与MYSQL8.109之间的不同。

USE sys;

DELIMITER $$

CREATE FUNCTION gr_member_in_primary_partition()

RETURNS VARCHAR(3)

DETERMINISTIC

BEGIN

RETURN (SELECT IF( MEMBER_STATE='ONLINE' AND ((SELECT COUNT(*) FROM

performance_schema.replication_group_members

WHERE MEMBER_STATE != 'ONLINE') >=

((SELECT COUNT(*) FROM performance_schema.replication_group_members)/2) = 0),

'YES', 'NO' ) FROM performance_schema.replication_group_members JOIN

performance_schema.replication_group_member_stats rgms USING(member_id)

WHERE rgms.MEMBER_ID=@@SERVER_UUID);

END$$

CREATE VIEW gr_member_routing_candidate_status AS SELECT

sys.gr_member_in_primary_partition() as viable_candidate,

IF( (SELECT (SELECT GROUP_CONCAT(variable_value) FROM

performance_schema.global_variables

WHERE variable_name IN ('read_only',

'super_read_only')) != 'OFF,OFF'), 'YES', 'NO') as read_only,

sys.gr_applier_queue_length() as transactions_behind,

Count_Transactions_in_queue as 'transactions_to_cert'

from performance_schema.replication_group_member_stats rgms

where rgms.MEMBER_ID=(select gv.VARIABLE_VALUE

from `performance_schema`.global_variables gv

where gv.VARIABLE_NAME='server_uuid');$$

DELIMITER ;

38508571720a595957290c573a7d5763.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值