ProxySQL+MGR+读写分离(完结)

前置条件:完成MGR部署

MGR部署参考:MGR单主部署

此外需要将MGR的从节点设置read_only=1


架构

ProxySQL:172.17.100.101

MGR单主:172.17.100.101

MGR双从:172.17.100.103

                    172.17.100.104

部署ProxySQL

#下载安装最新的proxy1.4.x版本

(本段摘抄自骏马金龙博客:http://www.cnblogs.com/f-ck-need-u/p/9278818.html)

cat <<EOF | tee /etc/yum.repos.d/proxysql.repo

[proxysql_repo]

name= ProxySQL

baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever

gpgcheck=1

gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key

EOF

yum install -y proxysql

ProxySQL的多层配置结构逻辑

proxysql的操作,分成三层

最顶层为runtime层,数据加载到这一层后可以实现执行;

中间层为内存层,也就是各种表内容的写入;

最底层为disk层,也就是把数据写到磁盘保存;

根据吴总的推荐,proxy的操作最好是首先在内存层的个表中写入数据,确认数据无误后,写入到disk层进行存储,存储完毕后加载到runtime层用于实现;

不过网上的文档很多是直接加载到runtime,然后再存储到disk中,个人觉得吴总的方法更严谨一点(然而我做实验的时候因为是测试库的关系,实际上也是先执行的load→_→)



实际搭建配置ProxySQL+MGR+读写分离过程

#相关账号已经存在于MySQL正式库中

monitor为前端监控账号

run为后端程序账号

权限给的不是很严谨,为了保障实验顺利,给的都是all privileges;实际工作中,监控端账号只需要给select权限即可

#之前已经部署过proxysql,这里需要干掉老的proxysql,重新部署一次

删除proxysql的配置和路径

#yum安装proxysql

#配置/etc/proxysql.cnf

#启动proxysql并用admin登陆(6032端口)

#配置监控账号

set mysql-monitor_username='monitor';

set mysql-monitor_password='beacon';

这里配置的监控账号密码与proxysql.cnf里面配置的一致

#配置默认组信息

insert into mysql_group_replication_hostgroups(writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,offline_hostgroup,active) values(10,20,30,40,1);

组ID含义如下

写组:10

备写组:20

读组:30

离线组(不可用):40

#配置用户(主要是添加程序端的这个用户,也就是run,将其设置到写组10里面)

insert into mysql_users(username,password,default_hostgroup) values('run','beacon',10);

#配置后端节点信息

主节点定义为写组10,从节点定义为只读组30

insert into mysql_servers(hostgroup_id,hostname,port,comment) values(10,'172.17.100.101',3306,'write');

insert into mysql_servers(hostgroup_id,hostname,port,comment) values(30,'172.17.100.103',3306,'read');

insert into mysql_servers(hostgroup_id,hostname,port,comment) values(30,'172.17.100.104',3306,'read');

#配置读写分离参数

insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(1,1,'^SELECT.*FOR UPDATE$',10,1);

insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(2,1,'^SELECT',30,1);

select rule_id,active,match_digest,destination_hostgroup,apply from mysql_query_rules;

#保存到磁盘并load到runtime

综上,我们一共操作了5张表

mysql_users

mysql_servers

mysql_query_rules

global_variables

mysql_group_replication_hostgroups

前面4张都需要执行save和load操作

save是使内存数据永久存储到磁盘,load使内存数据加载到runtime生效

save mysql users to disk;

save mysql servers to disk;

save mysql query rules to disk;

save mysql variables to disk;

save admin variables to disk;

load mysql users to runtime;

load mysql servers to runtime;

load mysql query rules to runtime;

load mysql variables to runtime;

load admin variables to runtime;

#用程序端账号并使用6033端口登陆,执行show databases可以得出结果,证明状态通畅


验证ProxySQL相关功能

测试部分说法约定

监控端:使用admin用户登陆6032端口

程序端:使用run用户登陆6033端口

节点端:使用root用户在本地登陆


#在MySQL库添加一个监控脚本:addition_to_sys.sql

脚本内容如下


USE sys;

DELIMITER $$

CREATE FUNCTION IFZERO(a INT, b INT)

RETURNS INT

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

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

RETURNS INT

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

CREATE FUNCTION GTID_NORMALIZE(g TEXT(10000))

RETURNS TEXT(10000)

DETERMINISTICRETURN 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( (SELECTReceived_transaction_set FROM performance_schema.replication_connection_statusWHERE 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(*) FROMperformance_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 JOINperformance_schema.replication_group_member_stats USING(member_id));END$$

CREATE VIEW gr_member_routing_candidate_status AS SELECTsys.gr_member_in_primary_partition() as viable_candidate,IF( (SELECT (SELECT GROUP_CONCAT(variable_value) FROMperformance_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 ;


相关监控设置

#节点端通过系统视图sys.gr_member_routing_candidate_status进行监控

select * from sys.gr_member_routing_candidate_status;

主节点

从节点

#监控端的监控如下

select hostname,port,viable_candidate,read_only,transactions_behind,error

from mysql_server_group_replication_log

order by time_start_us desc

limit 6;


读写分离测试

#程序端进行操作

#监控端观察路由状态

select hostgroup,digest_text from stats_mysql_query_digest;

                                                                                                                                                                                                  读写分离测试成功!


故障转移测试

#直接关闭主节点

#监控端执行查询

发现主节点101已经被踢出,从节点104已经变为可写状态,意味着104被自动提升为主节点

原主节点101属组已经变更为40,状态变更为shunned,证实该节点不可用

从节点104属组由30变更为10

程序端执行DML操作,并不会受到影响

重启节点101

需要手动在101上启动group_replication

101被proxysql识别,重新加入监控,变更为从节点

                                                                                                                                                                                                    故障转移测试成功!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 转载本文需注明出处:微信公众号EAWorld,违者必究。 本文目录: 一、企业应用的部署发展 二、普元容器云与De...
    72a1f772fe47阅读 911评论 0 3
  • 最近再看阮一峰的一篇博客提到了一本书《Software Architecture Patterns》(PDF),写...
    卓_然阅读 7,752评论 0 22
  • 风夹着雨吹干了额头的细汗 吹醒了昨日的梦魇 雨声催眠了蝉鸣 凌晨的夜 只有这嘀嗒的雨声 发呆的心 静止的魂 被雨声...
    静若青莲阅读 2,204评论 49 62
  • 心有余悸的我,独自坐在回家的公交车上,回想起今天看电影的过程,真是一波三折呀! 今天这场电影是我期...
    行路难_阅读 1,111评论 0 18