前言
ProxySQL
ProxySQL 是基于 MySQL 的一款开源的中间件的产品,是一个灵便的 MySQL 代理层,能够实现读写拆散,反对 Query 路由性能,反对动静指定某个 SQL 进行缓存,反对动静加载(无需重启 ProxySQL 服务),故障切换和一些 SQL 的过滤性能。
GreatSQL MGR
GreatSQL
是实用于金融级利用的国内自主开源数据库,具备高性能、高牢靠、高易用性、高平安等多个外围个性,能够作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。
GreatSQL
在高牢靠方面的次要晋升是针对MGR做了大量的改良和晋升工作,进一步晋升MGR的高牢靠等级。包含但不限于以下晋升:
天文标签
,晋升多机房架构数据可靠性。读写节点动静VIP
,高可用切换更便捷。仲裁节点
,用更低的服务器老本实现更高可用。疾速单主模式
,在单主模式下更快,性能更高。智能选主
,高可用切换选主机制更正当。全新流控算法
,使得事务更安稳,防止激烈抖动。- 优化了节点退出、退出时可能导致性能激烈抖动的问题。
- 解决磁盘空间爆满时导致MGR集群阻塞的问题。
- 解决了长事务造成无奈选主的问题。
- 优化事务认证队列清理算法,躲避每60s抖动问题。
- 修复了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-releaseRed Hat Enterprise Linux Server release 7.9 (Maipo)$ uname -aLinux 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 settingsloose-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 = ONloose-group_replication_bootstrap_group = OFFloose-group_replication_exit_state_action = READ_ONLYloose-group_replication_flow_control_mode = "DISABLED"loose-group_replication_single_primary_mode = ONloose-group_replication_communication_max_message_size = 10Mloose-group_replication_transaction_size_limit = 3Gloose-group_replication_arbitrator = 0loose-group_replication_single_primary_fast_mode = 0loose-group_replication_request_time_threshold = 20000report_host = "172.17.139.77"
MGR01节点配置如下
[mysqld@mgr01]datadir=/data/GreatSQL/mgr01socket=/data/GreatSQL/mgr01/mysql.sockport=3306server_id=103306log-error=/data/GreatSQL/mgr01/error.logloose-group_replication_local_address= "172.17.139.77:33061"
MGR02节点配置如下
[mysqld@mgr02]datadir=/data/GreatSQL/mgr02socket=/data/GreatSQL/mgr02/mysql.sockport=3307server_id=103317log-error=/data/GreatSQL/mgr02/error.logloose-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.32MEMBER_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.32MEMBER_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.32MEMBER_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 repositorybaseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/centos/\$releasevergpgcheck=1gpgkey=https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/repo_pub_keyEOF
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 proxysqltcp 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_credentials
和admin-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),这里设置为10backup_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_rules
和mysql_query_rules_fast_routing
这里大家能够自行配置
其中表mysql_query_rules_fast_routing
是mysql_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 update
的rule_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社区助手
微信好友,发送验证信息加群
。