15-2:高可用架构的读写分离

  1. 介绍
ProxySQL是基于MySQL的一款开源的中间件的产品,是一个灵活的MySQL代理层,可以实现读写分离,支持 Query路由功能,支持动态指定某个SQL进行缓存,支持动态加载配置信息(无需重启 ProxySQL 服务),支持故障切换和SQL的过滤功能。 
相关 ProxySQL 的网站:
https://www.proxysql.com/
https://github.com/sysown/proxysql/wiki

  1. 基本架构

略.

  1. 安装ProxySQL
# 下载proxySQL
https://proxysql.com/
https://github.com/sysown/proxysql/releases

# 安装proxySQL 
[root@db03 ~]# rpm -ivh proxysql-2.0.10-1-centos7.x86_64.rpm 
[root@db03 ~]# systemctl start proxysql
[root@db03 ~]# netstat -tulnp
tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      2115/proxysql       
tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      2115/proxysql   


 
[root@db03 ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032
  1. ProxySQL中管理结构自带系统库
在ProxySQL,6032端口共五个库: main、disk、stats 、monitor、stats_history 
main: 内存配置数据库,即 memory ,表里存放后端 db 实例,用户验证,路由规则等信息。 Main 库中有如下信息
	main 库中有如下信息:
	
	mysql_servers: 后端可以连接 MySQL 服务器的列表 
	mysql_users:   配置后端数据库的账号和监控的账号。 
	mysql_query_rules: 指定 Query 路由到后端不同服务器的规则列表。
	mysql_replication_hostgroups : 节点分组配置信息
注: 表名以 runtime_开头的表示ProxySQL 当前运行的配置内容,不能直接修改。不带runtime_是下文图中Mem相关的配置。
disk :
	持久化的磁盘的配置 
stats: 
	统计信息的汇总 
monitor:
	监控的收集信息,比如数据库的健康状态等 
stats_history: 
	ProxySQL 收集的有关其内部功能的历史指标

  1. ProxySQL管理接口的多层配置关系
整套配置系统分为三层:
顶层   RUNTIME 
中间层 MEMORY  (主要修改的配置表)
持久层 DISK 和 CFG FILE 

RUNTIME : 
	代表 ProxySQL 当前正在使用的配置,无法直接修改此配置,必须要从下一层 (MEM层)“load” 进来。 
MEMORY: 
	MEMORY 层上面连接 RUNTIME 层,下面disk持久层。这层可以在线操作 ProxySQL 配置,随便修改,不会影响生产环境。确认正常之后在加载达到RUNTIME和持久化的磁盘上。修改方法: insert、update、delete、select。
DISK和CONFIG FILE:
	持久化配置信息。重启时,可以从磁盘快速加载回来。
  1. 在不同层次间移动配置

LOAD xxxx TO RUNTIME;
SAVE xxxx TO DISK;

为了将配置持久化到磁盘或者应用到 runtime,在管理接口下有一系列管理命令来实现它们。
1. user相关配置
##  MEM 加载到runtime
LOAD MYSQL USERS TO RUNTIME;

##  runtime 保存至 MEM
SAVE MYSQL USERS TO MEMORY;

## disk 加载到 MEM
LOAD MYSQL USERS FROM DISK;

## MEM  到 disk 
SAVE MYSQL USERS TO DISK;

## CFG 到 MEM
LOAD MYSQL USERS FROM CONFIG
=============================
2. server 相关配置
##  MEM 加载到runtime
LOAD MYSQL SERVERS TO RUNTIME;

##  runtime 保存至 MEM
SAVE MYSQL SERVERS TO MEMORY;

## disk 加载到 MEM
LOAD MYSQL SERVERS FROM DISK;

## MEM  到 disk 
SAVE MYSQL SERVERS TO DISK;

## CFG 到 MEM
LOAD MYSQL SERVERS FROM CONFIG
===============================
3. mysql query rules配置 
##  MEM 加载到runtime
LOAD MYSQL QUERY RULES TO RUNTIME;

##  runtime 保存至 MEM
SAVE MYSQL QUERY RULES TO MEMORY;

## disk 加载到 MEM
LOAD MYSQL QUERY RULES FROM DISK;

## MEM  到 disk 
SAVE MYSQL QUERY RULES TO DISK;

## CFG 到 MEM
LOAD MYSQL QUERY RULES FROM CONFIG

=================================
4. MySQL variables配置
##  MEM 加载到runtime
LOAD MYSQL VARIABLES TO RUNTIME;

##  runtime 保存至 MEM
SAVE MYSQL VARIABLES TO MEMORY;

## disk 加载到 MEM
LOAD MYSQL VARIABLES FROM DISK;

## MEM  到 disk 
SAVE MYSQL VARIABLES TO DISK;

## CFG 到 MEM
LOAD MYSQL VARIABLES FROM CONFIG


总结: 
日常配置其实大部分时间在MEM配置,然后load到RUNTIME,然后SAVE到DIsk。cfg很少使用。
例如 : 
load xxx to runtime;
save xxx to disk;

注意:
	只有load到 runtime 状态时才会验证配置。在保MEM或disk时,都不会发生任何警告或错误。当load到 runtime 时,如果出现错误,将恢复为之前保存得状态,这时可以去检查错误日志。  
  1. ProxySQL应用——基于SQL的读写分离

7.0. 从库设定read_only参数

set global read_only=1;
set global super_read_only=1;

7.1. 在mysql_replication_hostgroup表中,配置读写组编号

[root@db03 ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032
insert into
mysql_replication_hostgroups
(writer_hostgroup, reader_hostgroup, comment)
values (10,20,‘proxy’);

load mysql servers to runtime;
save mysql servers to disk;

db03 [main]>select * from mysql_replication_hostgroups\G
*************************** 1. row ***************************
writer_hostgroup: 10
reader_hostgroup: 20
check_type: read_only
comment: proxy
1 row in set (0.00 sec)
说明:
ProxySQL 会根据server 的read_only 的取值将服务器进行分组。 read_only=0 的server,master被分到编号为10的写组,read_only=1 的server,slave则被分到编号20的读组。所以需要将从库设置:
set global read_only=1;

7.2. 创建监控用户,并开启监控

主库创建监控用户

create user monitor@’%’ identified with mysql_native_password by ‘123’;
grant replication client on . to monitor@’%’;

proxySQL修改variables表

set mysql-monitor_username=‘monitor’;
set mysql-monitor_password=‘123’;

扫描二维码关注公众号,回复: 13114461 查看本文章

或者 :
UPDATE global_variables SET variable_value=‘monitor’
WHERE variable_name=‘mysql-monitor_username’;
UPDATE global_variables SET variable_value=‘123’
WHERE variable_name=‘mysql-monitor_password’;

load mysql variables to runtime;
save mysql variables to disk;

7.3. 添加主机到ProxySQL
insert into mysql_servers(hostgroup_id,hostname,port) values (10,‘10.0.0.51’,3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,‘10.0.0.52’,3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,‘10.0.0.53’,3306);

load mysql servers to runtime;
save mysql servers to disk;

查询监控日志

db03 [(none)]>select * from mysql_server_connect_log;
db03 [(none)]>select * from mysql_server_ping_log;
db03 [(none)]>select * from mysql_server_read_only_log;
db03 [(none)]>select * from mysql_server_replication_lag_log;

4.配置应用用户

主库

create user root@’%’ identified with mysql_native_password by ‘123’;
grant all on . to root@’%’;

proxysql

insert into mysql_users(username,password,default_hostgroup) values(‘root’,‘123’,10);

load mysql users to runtime;
save mysql users to disk;

早期版本,需要开启事务持续化。
update mysql_users set transaction_persistent=1 where username=‘root’;
load mysql users to runtime;
save mysql users to disk;

  1. 实用的读写规则
    insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (1,1,’^select.*for update$’,10,1);
    insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (2,1,’^select’,20,1);
    load mysql query rules to runtime;
    save mysql query rules to disk;

注: select … for update规则的rule_id必须要小于普通的select规则的rule_id,ProxySQL是根据rule_id的顺序进行规则匹配。

  1. 测试读写分离
    [root@db03 ~]# mysql -uroot -p123 -P 6033 -h 127.0.0.1 -e “begin;select @@server_id;commit”

[root@db03 ~]# mysql -uroot -p123 -P 6033 -h 127.0.0.1 -e “select @@server_id;”
db03 [(none)]>select * from stats_mysql_query_digest\G


8.  ProxySQL应用扩展——花式路由规则(了解)

  1. 基于端口的路由

修改ProxySQL监听SQL流量的端口号,监听多端口上。

set mysql-interfaces=‘0.0.0.0:6033;0.0.0.0:6034’;
save mysql variables to disk;

重启生效

systemctl restart proxysql

设定路由规则

delete from mysql_query_rules; # 为了测试,先清空已有规则

insert into mysql_query_rules(rule_id,active,proxy_port,destination_hostgroup,apply)
values(1,1,6033,10,1), (2,1,6034,20,1);

load mysql query rules to runtime;
save mysql query rules to disk;

说明:
除了基于端口进行分离,还可以基于监听地址(修改字段proxy_addr即可),也可以基于客户端地址(修改字段client_addr字段即可)。

  1. 基于用户的路由
    nsert into mysql_users(username,password,default_hostgroup)
    values(‘writer’,‘123’,10),(‘reader’,‘123’,20);
    load mysql users to runtime;
    save mysql users to disk;

delete from mysql_query_rules; # 为了测试,先清空已有规则

insert into mysql_query_rules(rule_id,active,username,destination_hostgroup,apply)
values(1,1,‘writer’,10,1),(2,1,‘reader’,20,1);

load mysql query rules to runtime;
save mysql query rules to disk;

猜你喜欢

转载自blog.csdn.net/xiaoleinb/article/details/112196629