关于数据库:图文结合丨GreatSQL-MGR-ProxySQL集群搭建方案

4次阅读

共计 13230 个字符,预计需要花费 34 分钟才能阅读完成。

前言

ProxySQL

ProxySQL 是基于 MySQL 的一款开源的中间件的产品,是一个灵便的 MySQL 代理层,能够实现读写拆散,反对 Query 路由性能,反对动静指定某个 SQL 进行缓存,反对动静加载(无需重启 ProxySQL 服务),故障切换和一些 SQL 的过滤性能。

GreatSQL MGR

GreatSQL是实用于金融级利用的国内自主开源数据库,具备高性能、高牢靠、高易用性、高平安等多个外围个性,能够作为 MySQL 或 Percona Server 的可选替换,用于线上生产环境,且完全免费并兼容 MySQL 或 Percona Server。

GreatSQL在高牢靠方面的次要晋升是针对 MGR 做了大量的改良和晋升工作,进一步晋升 MGR 的高牢靠等级。包含但不限于以下晋升:

  1. 天文标签,晋升多机房架构数据可靠性。
  2. 读写节点动静 VIP,高可用切换更便捷。
  3. 仲裁节点,用更低的服务器老本实现更高可用。
  4. 疾速单主模式,在单主模式下更快,性能更高。
  5. 智能选主,高可用切换选主机制更正当。
  6. 全新流控算法,使得事务更安稳,防止激烈抖动。
  7. 优化了节点退出、退出时可能导致性能激烈抖动的问题。
  8. 解决磁盘空间爆满时导致 MGR 集群阻塞的问题。
  9. 解决了长事务造成无奈选主的问题。
  10. 优化事务认证队列清理算法,躲避每 60s 抖动问题。
  11. 修复了 recover 过程中长时间期待的问题。

理解更多详细信息能够返回➥https://gitee.com/GreatSQL/GreatSQL-Manual/blob/master/5-enha…

部署环境介绍

部署架构图

GreatSQL MGR 集群实现数据库复制性能及高可用。Proxysql 对应用程序提供拜访,对 MGR 集群进行读写拆散,集群状态检测,实现故障切换。

部署环境配置

部署软件详情

软件名 版本号
GreatSQL 8.0.32-24
ProxySQL 2.5.4-58

部署环境筹备

本次采纳的是单机多实例的部署形式,如何部署单机多实例能够返回➥https://gitee.com/GreatSQL/GreatSQL-Manual/blob/master/6-oper…

IP 端口 角色
172.17.139.77 3306 MGR01
172.17.139.77 3307 MGR02
172.17.139.77 6032、6033 ProxySQL
$ cat /etc/system-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)
$ uname -a
Linux gip 3.10.0-1160.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux

GreatSQL 配置

#mgr settings
loose-plugin_load_add = 'mysql_clone.so'
loose-plugin_load_add = 'group_replication.so'
loose-group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1"
loose-group_replication_group_seeds = '172.17.139.77:33061,172.17.139.77:33071'
loose-group_replication_start_on_boot = ON
loose-group_replication_bootstrap_group = OFF
loose-group_replication_exit_state_action = READ_ONLY
loose-group_replication_flow_control_mode = "DISABLED"
loose-group_replication_single_primary_mode = ON
loose-group_replication_communication_max_message_size = 10M
loose-group_replication_transaction_size_limit = 3G
loose-group_replication_arbitrator = 0
loose-group_replication_single_primary_fast_mode = 0
loose-group_replication_request_time_threshold = 20000
report_host = "172.17.139.77"

MGR01 节点配置如下

[mysqld@mgr01]
datadir=/data/GreatSQL/mgr01
socket=/data/GreatSQL/mgr01/mysql.sock
port=3306
server_id=103306
log-error=/data/GreatSQL/mgr01/error.log
loose-group_replication_local_address= "172.17.139.77:33061"

MGR02 节点配置如下

[mysqld@mgr02]
datadir=/data/GreatSQL/mgr02
socket=/data/GreatSQL/mgr02/mysql.sock
port=3307
server_id=103317
log-error=/data/GreatSQL/mgr02/error.log
loose-group_replication_local_address= "172.17.139.77:33071"

搭建 MGR 集群及 ProxySQL

搭建 GreatSQL MGR 集群

MGR01 实例操作

greatsql> set session sql_log_bin=0;
greatsql> create user 'repl'@'%' identified with mysql_native_password by 'GreatSQL@666';
greatsql> GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO `repl`@`%`;
greatsql> set session sql_log_bin=1;
greatsql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='GreatSQL@666' FOR CHANNEL 'group_replication_recovery';

接下来即可启动 MGR 集群

greatsql> set global group_replication_bootstrap_group=ON;
greatsql> start group_replication;
greatsql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: 2920447e-35bf-11ee-89a5-00163e566da1
               MEMBER_HOST: 172.17.139.77
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: PRIMARY
            MEMBER_VERSION: 8.0.32
MEMBER_COMMUNICATION_STACK: XCom

MGR02 实例操作

greatsql> set session sql_log_bin=0;
greatsql> create user 'repl'@'%' identified with mysql_native_password by 'GreatSQL@666';
greatsql> GRANT BACKUP_ADMIN, REPLICATION SLAVE ON *.* TO `repl`@`%`;
greatsql> set session sql_log_bin=1;
greatsql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='GreatSQL@666' FOR CHANNEL 'group_replication_recovery';
greatsql> start group_replication;
Query OK, 0 rows affected (5.39 sec)

MGR 集群搭建胜利

greatsql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: 8f20696c-3b46-11ee-b59e-00163e566da1
               MEMBER_HOST: 172.17.139.77
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: PRIMARY
            MEMBER_VERSION: 8.0.32
MEMBER_COMMUNICATION_STACK: XCom
*************************** 2. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: 8ff26a55-3b46-11ee-bd70-00163e566da1
               MEMBER_HOST: 172.17.139.77
               MEMBER_PORT: 3307
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: SECONDARY
            MEMBER_VERSION: 8.0.32
MEMBER_COMMUNICATION_STACK: XCom

在 MGR 集群上创立 ProxySQL 所需的账号

# proxysql 的监控账户
greatsql> create user 'monitor'@'%' identified with mysql_native_password by 'Monitor@666';
greatsql> grant all privileges on *.* to 'monitor'@'%' with grant option;
# proxysql 的对外拜访账户
greatsql> create user 'proxysql'@'%' identified with mysql_native_password by 'Proxysql@666';
greatsql> grant all privileges on *.* to 'proxysql'@'%' with grant option;

用户认证的形式须要批改为 mysql_native_password

看看有没有创立胜利

greatsql> select User,Host from mysql.user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| monitor          | %         |
| proxysql         | %         |
| repl             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+

装置 ProxySQL

ProxySQL 文档中有具体的装置教程能够浏览➥https://github.com/sysown/proxysql

RPM 形式和 yum 形式都能够装置的,本文采纳 RPM 形式装置,如果要用 yum 装置须要更换 yum 源

$ cat > /etc/yum.repos.d/proxysql.repo << EOF
[proxysql]
name=ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/centos/\$releasever
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/repo_pub_key
EOF

Red Hat 零碎要把 \$releasever 改为 7

接着间接装置即可

$ yum install proxysql

这里要留神一下,如果 GreatSQL 应用 RPM 形式装置的,会和 ProxySQL 须要的依赖抵触!

RPM 包下载地址:https://github.com/sysown/proxysql/releases/tag/v2.5.4

所以采纳 RPM 的 --nodeps 选项强制装置rpm -ivh proxysql-2.5.4-1-centos7.x86_64.rpm --nodeps

然而启动 systemctl start proxysql.service的时候会报错,须要libgnutls.so.28

这时候再装置 yum install -y gnutls,再次systemctl start proxysql.service 即可启动

启动 ProxySQL

$ systemctl start proxysql
# 查看是否启动胜利
$ systemctl status proxysql

查看下端口是否凋谢

$ netstat -anlp | grep proxysql
tcp  0  0 0.0.0.0:6033  0.0.0.0:*  LISTEN 1009915/proxysql    
tcp  0  0 0.0.0.0:6032  0.0.0.0:*  LISTEN 1009915/proxysql  
  • 6032 是 ProxySQL 的治理端口号
  • 6033 是对外服务的端口号

ProxySQL 的用户名和明码都是默认的 admin

配置 ProxySQL

管理员登录

$ mysql -uadmin -padmin -h 127.0.0.1 -P 6032

能够看到有一些数据库可用,ProxySQL 将 SHOW DATABASE 命令转换为 SQLite3 的等效命令。

greatsql> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.00 sec)

这些数据库作用如下:

  • main:内存配置数据库
    应用此数据库,能够轻松地以主动形式查问和更新 ProxySQL 的配置。应用 LOAD MYSQL USERS FROM MEMORY 和相似命令,存储在此处的配置能够在运行时流传到 ProxySQL 应用的内存数据结构。
  • disk:基于磁盘的 ”main” 镜像。
    在重新启动时,”main” 不会长久存在,并且能够从“磁盘”数据库或配置文件中加载,具体取决于启动标记和磁盘数据库的存在。
  • stats:蕴含从代理的外部性能收集的运行时指标。
    示例度量规范包含每个查问规定匹配的次数,以后运行的查问等。
  • monitor:蕴含与 ProxySQL 连贯的后端服务器相干的监控指标。
    示例度量规范包含连贯到后端服务器或对其进行 ping 操作的最短和最长工夫。
  • myhgm:仅在调试版本中启用

此外,应用这两种类型的用户应用这些默认凭据拜访治理数据库:

  • user:admin / password:admin – 具备对所有表的读写访问权限
  • user:stats / password:stats – 具备对统计表的只读拜访权限。这用于从 ProxySQL 中提取指标,而不会裸露太多的数据库

上述的拜访凭据,可通过变量 admin-admin_credentialsadmin-stats_credentials进行配置。

更多具体的介绍能够返回”老叶茶馆 MySQL-ProxySQL 中间件(一)【微信增加】“”老叶茶馆 MySQL-ProxySQL 中间件(二)【微信增加】“

为配置监控账号

greatsql> set mysql-monitor_username='monitor';
greatsql> set mysql-monitor_password='Monitor@666';

下面这两句是批改变量的形式还能够在 main 库上面用 sql 语句形式批改

greatsql>UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
greatsql>UPDATE global_variables SET variable_value='Monitor@666' WHERE variable_name='mysql-monitor_password';

配置默认组信息

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

这段 SQL 语句是用来配置 MGR 集群的主备和读写拆散的,向 mysql_group_replication_hostgroups 表插入配置

  • writer_hostgroup: 写入主节点的主机组(必须大于 0), 这里设置为 10
  • backup_writer_hostgroup: 备份写入主节点的主机组, 这里是 20。
  • reader_hostgroup: 只读节点的主机组, 这里是 30。
  • offline_hostgroup: 离线节点的主机组, 这里是 40。
  • active: 是否激活该配置,1 示意激活。
  • writer_is_also_reader: 写入主节点是否也能够作为读节点,1 示意能够。

配置对外拜访用户到写组 10 内

greatsql> insert into mysql_users(username,password,default_hostgroup)values('proxysql','Proxysql@666',10);

这个 SQL 代码的作用是将一个 MySQL 服务器节点增加到 ProxySQL 的治理中,以便 ProxySQL 能够依据定义的规定和策略来散发连贯申请,从而实现负载平衡和高可用性。

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

greatsql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)values (10,'172.17.139.77',3306,1,3000,10,'mgr01');
greatsql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)values (30,'172.17.139.77',3306,2,3000,10,'mgr01');
greatsql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment)values (30,'172.17.139.77',3307,2,3000,10,'mgr02');
  • hostgroup_id:指定所属的主机组(Hostgroup),这是 ProxySQL 中用于分组治理的一个概念。在这里,它被设置为 10。
  • hostname:指定 MySQL 服务器的主机名或 IP 地址,这里是 ‘172.17.139.77’。
  • port:指定 MySQL 服务器的端口号,这里是 3306。
  • weight:指定该节点在负载平衡中的权重。权重越高,代表更多的申请会被调配到这个节点。这里设置为 1。
  • max_connections:指定该节点容许的最大连接数。
  • max_replication_lag:指定最大的复制提早(以秒为单位),这是一个连贯到主从复制的节点时的配置。
  • comment:一个可选的正文或形容信息,这里设置为 ‘mgr01’。

这个 SQL 代码的作用是将一个 MySQL 用户增加到 ProxySQL 的治理中,以便 ProxySQL 能够依据定义的用户拜访规定和策略来管制用户对数据库的拜访,包含路由、负载平衡和故障转移等。

配置读写拆散参数,与之相干的有两个表 mysql_query_rulesmysql_query_rules_fast_routing这里大家能够自行配置

其中表 mysql_query_rules_fast_routingmysql_query_rules的扩大,并在当前评估疾速路由策略和属性(仅在 ProxySQL 1.4.7+ 中可用)。

greatsql> insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(1,1,^SELECT.*FORUPDATE$,10,1);
greatsql> insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (2,1,'^select',30,1);
  • active:是否启用这个规定,1 示意启用,0 示意禁用
  • match_pattern 字段就是代表设置规定
  • destination_hostgroup 字段代表默认指定的分组,
  • apply 代表真正执行利用规定

在 ProxySQL 中,rule_id 的排序作用是管制规定的匹配程序。ProxySQL 在解决查问申请时,会依照 rule_id 的升序程序逐个匹配规定,直到找到第一个匹配的规定为止。一旦找到匹配的规定,ProxySQL 将依据该规定的定义来解决查问申请。这种排序的作用是确保规定依照预期的程序进行匹配和利用,以实现准确的查问路由、分流和负载平衡。

在上述例子中,select ... for update 规定,确保其 rule_id 小于一般的 select 规定的 rule_id 是为了确保在匹配时先匹配到 select ... for update 规定,而不是一般的 select 规定。

因为 select ... for update 是一种非凡的查问,它在执行时会波及到锁定操作,可能会影响其余查问的执行。通过让 select ... for updaterule_id 更小,能够确保 ProxySQL 在匹配查问规定时优先思考匹配这个非凡的规定,从而在解决 select ... for update 时可能更准确地利用相应的路由和解决逻辑。

save 使内存数据永恒存储到磁盘,load 使内存数据加载到 runtime 失效:

greatsql> save mysql users to disk;
greatsql> save mysql servers to disk;
greatsql> save mysql query rules to disk;
greatsql> save mysql variables to disk;
greatsql> save admin variables to disk;
greatsql> load mysql users to runtime;
greatsql> load mysql servers to runtime;
greatsql> load mysql query rules to runtime;
greatsql> load mysql variables to runtime;
greatsql> load admin variables to runtime;

加载实现后,能够应用 select * 查问下设置的各表的信息是否有误

验证监控信息 ProxySQL 监控模块的指标都保留在monitor 库的 log 表中,以下是连贯是否失常的监控,对 connect 指标的监控,在后面可能会有很多 connect_error,这是因为没有配置监控信息时的谬误,配置后如果 connect_error 的后果为 NULL 则示意失常

greatsql> select * from monitor.mysql_server_connect_log;
+---------------+------+------------------+-------------------------+---------------+
| hostname      | port | time_start_us    | connect_success_time_us | connect_error |
+---------------+------+------------------+-------------------------+---------------+
| 172.17.139.77 | 3307 | 1692152694528579 | 2347                    | NULL          |
| 172.17.139.77 | 3306 | 1692152695231434 | 3131                    | NULL          |
+---------------+------+------------------+-------------------------+---------------+
#只截取局部

对心跳信息的监控(对 ping 指标的监控)

greatsql> select * from mysql_server_ping_log limit 10;
+---------------+------+------------------+----------------------+------------+
| hostname      | port | time_start_us    | ping_success_time_us | ping_error |
+---------------+------+------------------+----------------------+------------+
| 172.17.139.77 | 3306 | 1692152694511424 | 132                  | NULL       |
| 172.17.139.77 | 3307 | 1692152694511498 | 125                  | NULL       |
+---------------+------+------------------+----------------------+------------+
#只截取局部

测试读写拆散

通过 proxysql 连贯看看读操作,是否路由给了读组

$ mysql -uproxysql -pProxysql@666 -P 6033 -h 172.17.139.77 -e "select @@server_id;"
+-------------+
| @@server_id |
+-------------+
|      103317 |
+-------------+
#能够看到曾经把路由调配给了读组

测试下写操作

greatsql> begin;
Query OK, 0 rows affected (0.00 sec)
greatsql> select User from mysql.user for update;
+------------------+
| User             |
+------------------+
| monitor          |
| proxysql         |
| repl             |
| mysql.infoschema |
| mysql.session    |
| mysql.sys        |
| root             |
+------------------+
7 rows in set (0.00 sec)
greatsql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|      103306 |
+-------------+
1 row in set (0.00 sec)
#能够看到曾经把路由调配给了写组
greatsql> commit;
Query OK, 0 rows affected (0.00 sec)

如果想在 ProxySQL 中查看 SQL 申请路由信息stats_mysql_query_digest

greatsql> select hostgroup,schemaname,username,digest_text,count_star from  stats_mysql_query_digest;
+-----------+--------------------+----------+----------------------------------------+------------+
| hostgroup | schemaname         | username | digest_text                            | count_star |
+-----------+--------------------+----------+----------------------------------------+------------+
| 10        | information_schema | proxysql | commit                                 | 1          |
| 10        | information_schema | proxysql | select User from mysql.user for update | 1          |
| 10        | information_schema | proxysql | select * from beta1 for update         | 2          |
| 10        | information_schema | proxysql | begin                                  | 1          |
| 30        | information_schema | proxysql | select @@server_id                     | 2          |
+-----------+--------------------+----------+----------------------------------------+------------+
#只截取局部
  • count_start 统计 SQL 语句次数,能够剖析哪些 SQL,频繁执行

至此一个 GreatSQL MGR + ProxySQL 集群搭建计划到此部署实现

结尾

尽管 ProxySQL 的功能强大,然而 ProxySQL 毕竟不是官网原生的,在和 MGR 的配合上不如 GreatSQL-MySQL-Router 更顺滑,例如还须要额定创立存储过程以监控 MGR 的变动。此外就是 ProxySQL 的 BUG 其实也挺多的,当然了,如果是业务量不大,或者出于学习、试验用处,选用 ProxySQL 也是能够的。

举荐应用GreatSQL-MySQL-Router,对 GreatSQL MGR 的配合更加丝滑,兼容度更高。

应用 GreatSQL-MySQL-Router 构建 MGR 集群构建读写拆散计划:https://gitee.com/GreatSQL/GreatSQL-Manual/blob/master/6-oper…


Enjoy GreatSQL :)

## 对于 GreatSQL

GreatSQL 是实用于金融级利用的国内自主开源数据库,具备高性能、高牢靠、高易用性、高平安等多个外围个性,能够作为 MySQL 或 Percona Server 的可选替换,用于线上生产环境,且完全免费并兼容 MySQL 或 Percona Server。

相干链接:GreatSQL 社区 Gitee GitHub Bilibili

GreatSQL 社区:

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

技术交换群:

微信:扫码增加 GreatSQL 社区助手 微信好友,发送验证信息 加群

正文完
 0