proxysql集群--mysqlMGR模式
搭建的大致思路:数据库创建监控视图,监控用户(用于proxysql连接mysql查看监控视图),读写用户,
proxysql集群配置监控用户,读写用户,mysql后端信息,读写组信息,配置读写路由规则。
proxysql通过监控视图获取组状态自动分配读写节点
1. 二进制搭建
1.1 mysql数据库操作
1.1.1 创建MGR信息监控视图
mgr主节点上执行下面的sql,同步至其他从节点
ProxySQL 需要通过1.1.2建立的监控账号连接MySQL服务,查询视图获取MGR集群信息。
#查看用户定义函数 show function status\G use sys; drop function IFZERO; drop function LOCATE2; drop function GTID_NORMALIZE; drop function GTID_COUNT; drop function gr_applier_queue_length; drop function gr_member_in_primary_partition; drop view gr_member_routing_candidate_status; DELIMITER $$ CREATE FUNCTION my_id() RETURNS TEXT(36) DETERMINISTIC NO SQL RETURN (SELECT @@global.server_uuid as my_id);$$ 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 NOT IN ('ONLINE', 'RECOVERING')) >= ((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) where member_id=my_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, Count_Transactions_Remote_In_Applier_Queue as transactions_behind, Count_Transactions_in_queue as 'transactions_to_cert' from performance_schema.replication_group_member_stats where member_id=my_id();$$ DELIMITER ;
#查看视图 show tables from sys like 'gr%'; SELECT * FROM sys.gr_member_routing_candidate_status;
如果需要删除就执行下面的语句
/* -- 删除新版 USE sys; drop function my_id; drop function gr_member_in_primary_partition; drop view gr_member_routing_candidate_status; */ /* -- 删除旧版视图(本文档里没有给,是以前的文档的) use sys; drop function IFZERO; drop function LOCATE2; drop function GTID_NORMALIZE; drop function GTID_COUNT; drop function gr_applier_queue_length; drop function gr_member_in_primary_partition; drop view gr_member_routing_candidate_status; */
1.1.2 建立相关账号
建立监控账号和读写账号
# mysql节点需均添加一个监控账号(replication是用来检测主从延迟),主节点添加同步至从节点 # 注意:这里的账号密码要和下面我们在proxysql里面的mysql_variables段的账号密码配置的一样
# ProxySQL 通过此账号连接MySQL服务查询视图,获取后端 MySQL 节点状态 和 MGR集群状态 create user 'proxysql_monitor'@'%' identified by 'iD!^^EjU#Yxr5$p'; GRANT USAGE,process,replication slave,replication client ON *.* TO 'proxysql_monitor'@'%';
#授权查询监控视图权限
GRANT SELECT ON `sys`.* TO `proxysql_monitor`@`%`;
GRANT SELECT ON `performance_schema`.* TO `proxysql_monitor`@`%`;
flush privileges; # mysql节点需均添加业务使用账号,后续配置到proxysql中,主节点添加同步至从节点 create user 'sbuser'@'%' identified by 'iD!^^EjU#Yxr5$p'; GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'sbuser'@'%'; flush privileges;
#建议业务账号建立读写分离2个账号,通过读写账号建立路由规则分配节点
#也可以一个账号通过执行语句的类型建立路由规则分配节点
#create user 'read_only'@'%' identified by 'iD!^^EjU#Yxr5$p';
#GRANT SELECT ON *.* TO 'read_only'@'%';
#flush privileges;
#验证所有节点当前所有用户
select * from mysql.user\G
#查看指定用户权限
show grants for sbuser@'%';
监控数据已在视图生成,正常主节点read_only为no,从节点read_only为yes
1.2 安装proxysql,暂不启动
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 yum install proxysql -y #systemctl enable proxysql.service #systemctl status proxysql.service #先不启用服务,初次启动服务会读取cnf文件并将配置存放在/var/lib/proxysql/proxysql.db中,但后续所有改动都直接存在db中且启动只会依赖db而不再读取cnf。
#所以先配置好cnf后再启动或者将db文件删除再启动,但中间若配置过策略删除db将丢失
1.3 搭建proxysql集群
更改所有proxysql实例的配置文件
# cp /etc/proxysql.cnf /etc/proxysql.cnf.bak # vim /etc/proxysql.cnf admin_variables= { admin_credentials="admin:admin;proxysql:proxysql" #默认的admin账号只能本地连接proxysql,所以新增proxysql账号 mysql_ifaces="0.0.0.0:6032" cluster_username="proxysql" #集群通信的用户名和密码 cluster_password="proxysql" cluster_check_interval_ms=200 cluster_check_status_frequency=100 cluster_mysql_query_rules_save_to_disk=true cluster_mysql_servers_save_to_disk=true cluster_mysql_users_save_to_disk=true cluster_proxysql_servers_save_to_disk=true cluster_mysql_query_rules_diffs_before_sync=3 cluster_mysql_servers_diffs_before_sync=3 cluster_mysql_users_diffs_before_sync=3 cluster_proxysql_servers_diffs_before_sync=3 } mysql_variables= { threads=4 #工作线程数量,默认是4,自动修改 max_connections=10000 #最大连接数 default_query_delay=0 #查询延迟 default_query_timeout=36000000 #查询超时,单位 have_compress=true poll_timeout=2000 interfaces="0.0.0.0:6033" stacksize=1048576 connect_timeout_server=3000
default_schema="information_schema"
server_version="8.0.32" #mysql数据库版本 monitor_username="proxysql_monitor" #配置mysql节点监控用户密码,此用户需要在mysql中创建好,这里配置好用此用户连接mysql monitor_password="iD!^^EjU#Yxr5$p" monitor_history=600000 monitor_connect_interval=60000 monitor_ping_interval=10000 monitor_read_only_interval=1500 monitor_read_only_timeout=500 ping_interval_server_msec=120000 #监控mysql节点健康检查相关 ping_timeout_server=500 commands_stats=true sessions_sort=true connect_retries_on_failure=10 #default_charset='utf8mb4' # 这个参数加上无法启动,只能先不加,有需要等程序启动后再手动修改,步骤参考3.2 #default_collation_connection='utf8mb4_general_ci' # 这个参数加上无法启动,只能先不加,有需要等程序启动后再手动修改 max_allowed_packet=67108864 query_retries_on_failure=0 monitor_connect_timeout=1000 default_max_latency_ms=2000 monitor_replication_lag_interval=500 connect_timeout_server_max=3000 set_query_lock_on_hostgroup=0 } proxysql_servers = ( #定义集群中proxysql节点信息 { hostname="10.80.39.86" port=6032 comment="proxysql-86" }, { hostname="10.80.39.87" port=6032 comment="proxysql-87" },
{
hostname="10.80.39.88"
port=6032
comment="proxysql-88"
} ) # 其余的配置信息保持不动
特别注意:如果存在"proxysql.db"文件(在/var/lib/proxysql目录下),则ProxySQL服务只有在第一次启动时才会去读取proxysql.cnf文件并解析;后面启动就不会读取proxysql.cnf文件了!如果想要让proxysql.cnf文件里的配置在重启proxysql服务后生效(即想要让proxysql重启时读取并解析proxysql.cnf配置文件),则需要先删除/var/lib/proxysql/proxysql.db数据库文件,然后再重启proxysql服务。这样就相当于初始化启动proxysql服务了,会再次生产一个纯净的proxysql.db数据库文件(如果之前配置了proxysql相关路由规则等,则就会被抹掉)。
强烈建议配置确定后写入cnf配置文件中,这样维护简单。用sql维护有点艰难,和mysql语法有差异,还要研究如何插入修改数据。
1.4 启动proxysql
# 集群proxysql节点均启动proxysql进程
systemctl start proxysql
#查看进程使用6032和6033端口,端口6032用于查看、配置ProxySQL;端口为6033,用于接收SQL语句并分配给mysql,相当于用6033端口代理mysql的3306端口
netstat -tnulp |grep proxysql
1.4.1 使用mysql客户端登录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:仅在调试版本中启用
1.4.2 观察proxysql集群状况
mysql> select * from proxysql_servers; mysql> select * from stats_proxysql_servers_metrics; mysql> select hostname,port,comment,Uptime_s,last_check_ms from stats_proxysql_servers_metrics; mysql> select hostname,name,checksum,updated_at from stats_proxysql_servers_checksums;
1.4.3 查看数据库信息
mysql> show tables;
global_variables:各种变量,包括监听的端口、管理账号、是否禁用monitor等,详情可以参考[官方文档](https://github.com/sysown/proxysql/wiki/Global-variables) mysql_*:mysql开头的表就是我们配置要操作的表,具体都是干什么的还是看官方文档吧,介绍的很细 runtime_*:runtime开头的表是运行时读的表,不能通过DML语句修改,我们针对mysql开头的表做完配置修改之后,要执行**load mysql xxx to runtime**以将对应的配置加载到运行时环境 注意:当执行完load语句将配置加载到运行时环境后,还要执行"save mysql xxx from runtime;"将配置存到硬盘上,以便下次重启时加载,如果忘记执行,当重启时本次修改的配置会丢失
1.5 添加后端mysql信息并分配读写组
1.5.1 系统自动分配读写组
在任意一台proyxql的admin控制台执行下面的这些操作(这个新增的配置会在load runtime时候,自动同步到集群其它节点)
#mgr组定义 10800000ms,某节点写延迟超过3小时就剔除该节点,或者使用备写节点 #10:主写入组id; 20:备写入组id; 30:读数据组id; 40:离线组id; writer_is_also_reader1:写节点是否也可以作为读节点,1表示可以 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 , comment) values( 10,20,30,40,1,1,0,10800000,'MGR_MS' ); #这里都配置离线组4,ProxySQL可以通过监控和自动探测机制来确定每个服务器的实际角色(例如读写服务器)并将其移动到相应的Host Group
#但要注意,如果后面master易主了,mysql_servers表不会自动改变,需要将内存数据同步至磁盘才会更新此表数据,runtime_mysql_servers表是运行时读的表也是内存即时数据,会自动改变,系统也是根据此表识别读写组。 INSERT INTO mysql_servers(hostgroup_id,hostname,port,comment) VALUES (40,'10.80.39.86',3306,'mysql1'), (40,'10.80.39.87',3306,'mysql2'), (40,'10.80.39.88',3306,'mysql3');
SELECT * FROM mysql_servers;
select * from runtime_mysql_servers; select * from mysql_group_replication_hostgroups;
LOAD MYSQL SERVERS TO RUNTIME; #将MySQL后端服务器配置信息从mysql_servers表加载到ProxySQL的运行时内存中 SAVE MYSQL SERVERS FROM RUNTIME; #将运行时内存中的mysql后端服务器配置信息保存到磁盘(即proxysql.db文件)。
#SAVE MYSQL SERVERS TO DISK; #此为老命令,被淘汰,亲测从内存写数据到磁盘不好用,数据并未同步
1.5.2 自定义读写组
在任意一台proyxql的admin控制台执行下面的这些操作(这个新增的配置会在load runtime时候,自动同步到集群其它节点)
#mgr组定义--10:主写入组id; 20:备写入组id; 30:读数据组id; 40:离线组id; writer_is_also_reader0:写节点可以作为都节点,0代表不可以 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 , comment) values(10,20,30,40,1,1,0,10800000,'MGR_MS'); #添加后端mysql节点后,proxysql也会根据监控实时动态的将MySQL服务节点移动至对应的分组中。(在此指定了主库写,但是当主库易主后,mysql_servers表不会动态改变,需要将内存数据同步至磁盘才会更新此表数据,
#runtime_mysql_servers表是运行时读的表也是内存即时数据,会自动改变,系统也是根据此表识别读写组。 # 写组1,master mysql节点,权重1 mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(10,'10.80.39.86',3306,1,1000,10,'10-1-master_mysql'); # 读组3,salve mysql节点,权重9 mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(30,'10.80.39.87',3306,9,1000,10,'30-9-slave_mysq2');
mysql> insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(30,'10.80.39.88',3306,9,1000,10,'30-9-slave_mysq3'); # 读组3,master mysql节点,权重1 (当读组,salve mysql节点,权重9发生故障时,由该节点承担读任务,也就是说当读不到从库,回去主库查询) #mysql> #insert into mysql_servers(hostgroup_id,hostname,port,weight,max_connections,max_replication_lag,comment) values(30,'10.80.39.86',3306,1,1000,10,'30-1-master_mysql'); # 加载到runtime,并把配置持久化 mysql> load mysql servers to runtime; mysql> save mysql servers from runtime;
#save mysql servers to disk;此为老命令,被淘汰,亲测从内存写数据到磁盘不好用,数据并未同步 mysql> select * from mysql_servers; mysql> select * from runtime_mysql_servers;
1.5.3 确认监控是否生效
proxysql监控mysql,若生效,则master易主后自动调整读写组
#确定监控是否正常进行
#查看ping后端mysql记录
select * from mysql_server_ping_log;
#查询最近的10次MySQL服务器连接的日志记录
select * from monitor.mysql_server_connect_log order by time_start_us desc limit 10;
#监控和诊断MGR集群,可以了解MGR集群中的主从切换、数据同步、错误和其他重要事件的信息。
select * from mysql_server_group_replication_log order by time_start_us desc limit 10;
#当前在ProxySQL内存中活跃的MySQL后端服务器的详细信息
SELECT * FROM runtime_mysql_servers;
#查看当前mysql所属读写组是否根据监控自动调整。
SELECT * FROM mysql_servers;
#主节点易主后,mysql_servers表中所属组并不会自动改变,需要将内存同步至磁盘才会改变。要看runtime_mysql_servers表
select * from runtime_mysql_servers;
1.6 添加mysql业务账号和读写路由规则
1.6.1 读写用户分离路由规则
#30表示读组 ,10表示写组,数字含义由mysql_group_replication_hostgroups表定义 #添加mysql中已创建的读写分离账号,并分配默认组1和3
#如果没有按照sql类型路由规则,则所有语句都按照用户路由至默认组 INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('read_only','iD!^^EjU#Yxr5$p',30); INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('sbuser','iD!^^EjU#Yxr5$p',10);
LOAD MYSQL USERS TO RUNTIME; SAVE MYSQL USERS FROM RUNTIME;
select * from mysql_users;
1.6.2 根据sql类型路由规则
#添加mysql中已创建的一个读写账号,sql语句默认都路由给default_hostgroup默认组1
mysql> insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values('sbuser','iD!^^EjU#Yxr5$p',1,10,1);
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS FROM RUNTIME;
# 定义sql规则1,所有select语句发送到读组30
mysql> INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT',30,1);
# 定义sql规则2,因为select * from tb for update这样会修改数据,所以单独定义发送到写组1
# active1:启用该规则,apply1:规则应用于所有用户和模式 mysql> INSERT INTO mysql_query_rules(active,match_pattern,destination_hostgroup,apply) VALUES(1,'^SELECT.*FOR UPDATE$',10,1);
#注意:其他没有被规则匹配将会路由至用户默认组(mysql_users表中的default_hostgroup),所以只需配置select到读节点,其他会默认到写节点。
#也可以单独按照insert,update等语句类型配置路由规则
# 加载路由规则到runtime,并把配置持久化 mysql> load mysql query rules to runtime; mysql> save mysql query rules from runtime;
mysql> select * from mysql_query_rules; mysql> select * from runtime_mysql_query_rules;
1.7 测试读写分离及master易主
1.7.1 根据读写用户路由规则测试,master易主后再测试
通过读用户连接proxysql 看看读操作,是否路由给了读组
$ mysql -uread_only -p -P 6033 -h 10.80.39.86 -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 53 | +-------------+ #可以看到已经把路由分配给了读组
测试下写用户
$ mysql -usbuser -p -P 6033 -h 10.80.39.86 -e "select @@server_id;"
+-------------+
| @@server_id |
+-------------+
| 52 |
+-------------+
#可以看到已经把路由分配给了写组
1.7.2 根据sql类型路由规则测试,master易主后再测试
只有一个读写用户,测试读操作
$ mysql -usbuser -p -P 6033 -h 172.17.139.77 -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 53 | +-------------+ #可以看到已经把路由分配给了读组
测试写操作
greatsql> begin; Query OK, 0 rows affected (0.00 sec) greatsql> select User from mysql.user for update; greatsql> select @@server_id; +-------------+ | @@server_id | +-------------+ | 52 | +-------------+ #可以看到已经把路由分配给了写组 greatsql> commit;
1.7.3 查看sql请求路由记录
select hostgroup,schemaname,username,digest_text,count_star from stats_mysql_query_digest;
2. k8s搭建
2.1 数据库操作
与上面1.1操作一致
2.2 创建配置文件
因为proxysql服务只有在首次启动时读取proxysql.cnf文件并写入proxysql.db文件,后续更改配置直接保存在db中且后续重启只依赖db文件不在读取cnf文件,除非db文件被删除才会读cnf文件,但是中间有保存至db的配置就会丢失。
所以按照k8s删除pod的特性,必须要将所有配置写在cnf中或者指定host及pv存储卷。
下面是将所有配置写入cnf中
- 1.创建配置文件 proxysql-cnf.yaml
apiVersion: v1 kind: Service metadata: labels: app: proxysql name: proxysqlcluster namespace: cloud2 spec: clusterIP: None ports: - name: proxysql-admin port: 6032 protocol: TCP targetPort: 6032 selector: app: proxysql sessionAffinity: None type: ClusterIP --- apiVersion: v1 kind: ConfigMap metadata: name: proxysql-cnf namespace: cloud2 data: proxysql.cnf: | datadir="/var/lib/proxysql" # 配置管理账号,即 6032 端口登陆的管理员账号密码。默认账号 admin 无法远程登陆,增加proxysql-admin账号 admin_variables= { admin_credentials="admin:admin;proxysql-admin:Aa123456" mysql_ifaces="0.0.0.0:6032" } #全局配置 mysql_variables= { threads=4 max_connections=2048 default_query_delay=0 default_query_timeout=36000000 have_compress=true poll_timeout=2000 interfaces="0.0.0.0:6033" default_schema="information_schema" stacksize=1048576 #mysql数据库版本 server_version="8.0.30" connect_timeout_server=3000 #mysql中创建i并授权的监控用户密码 monitor_username="proxysql_monitor" monitor_password="Aa.123456" monitor_history=600000 monitor_connect_interval=2000 monitor_ping_interval=2000 monitor_read_only_interval=2000 monitor_read_only_timeout=500 ping_interval_server_msec=120000 ping_timeout_server=500 commands_stats=true sessions_sort=true connect_retries_on_failure=10 } # Mysql地址, hostgroup_id=40设置为离线组,会自动探测节点角色进行分组 mysql_servers = ( { address="192.168.7.52" , port=3306 , hostgroup_id=40 , max_connections=2000 }, { address="192.168.7.53" , port=3306 , hostgroup_id=40 , max_connections=2000 }, { address="192.168.7.54" , port=3306 , hostgroup_id=40 , max_connections=2000 } ) # 所有需要经过proxysql的mysql账号密码都必须在此配置;default_hostgrop值1代表路由到写节点,3代表路由到读节点
mysql_users = ( { username = "test_w", password = "Aa.123456", default_hostgroup = 10, transaction_persistent = 0, active = 1 }, { username = "test_r", password = "Aa.123456", default_hostgroup = 30, transaction_persistent = 0, active = 1 } ) # 定义mgr组 mysql_group_replication_hostgroups = ( { writer_hostgroup=10 backup_writer_hostgroup=20 reader_hostgroup=30 offline_hostgroup=40 active=1 max_writers=1 writer_is_also_reader=0 max_transactions_behind=10800000 } ) #定义proxysql集群 proxysql_servers = ( { hostname = "proxysql-0.proxysqlcluster", port = 6032, weight = 1 }, { hostname = "proxysql-1.proxysqlcluster", port = 6032, weight = 1 }, { hostname = "proxysql-2.proxysqlcluster", port = 6032, weight = 1 } )
- 2.创建StatefulSet文件
apiVersion: v1 kind: Service metadata: annotations: labels: app: proxysql name: proxysql namespace: cloud2 spec: ports: - name: proxysql-mysql port: 6033 protocol: TCP targetPort: 6033 nodePort: 30633 - name: proxysql-admin nodePort: 30632 port: 6032 protocol: TCP targetPort: 6032 selector: app: proxysql type: NodePort --- apiVersion: apps/v1 kind: StatefulSet metadata: name: proxysql labels: app: proxysql namespace: cloud2 spec: replicas: 3 serviceName: proxysqlcluster selector: matchLabels: app: proxysql updateStrategy: type: RollingUpdate template: metadata: labels: app: proxysql spec: restartPolicy: Always nodeSelector: feature: app containers: - image: ccr.ccs.tencentyun.com/zoehuawang/proxysql:2.5.1 imagePullPolicy: IfNotPresent name: proxysql volumeMounts: - name: proxysql-cnf mountPath: /etc/proxysql.cnf subPath: proxysql.cnf ports: - containerPort: 6033 name: proxysql-mysql - containerPort: 6032 name: proxysql-admin volumes: - name: proxysql-cnf configMap: name: proxysql-cnf
2.3 启动proxysql
kubectl apply -f proxysql-cnf.yaml -f proxysql.yaml
登录proxysql查询验证
mysql -hproxysql -P6032 -uproxysql-admin -pAa123456 --prompt 'ProxySQL Admin>'
ProxySQL Admin> select * from monitor.mysql_server_connect_log order by time_start_us desc limit 10; #验证监控是否成功 ProxySQL Admin> select * from mysql_server_group_replication_log order by time_start_us desc limit 10; #查看组状态 ProxySQL Admin> select * from runtime_mysql_servers; #查看mgr状态
proxySQL Admin> select * from global_variables where variable_name='mysql-monitor_username' or variable_name='mysql-monitor_password'; #配置监控账号
#查看监控间隔
proxySQL Admin> SELECT * FROM global_variables WHERE variable_name IN ('mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_read_only_interval');
参考1.7进行验证
mysql -hproxysql -P6033 -u用户名 -p密码;
3. 关于proxysql故障处理
3.1 更改配置后未同步至其他节点
检查是否设置了集群用户名密码,如果不设置的话,该节点将不能检测到其他proxysql的配置变动
-- 查看是否配置 select * from global_variables where variable_name = 'admin-cluster_username';
-- 自行设置集群凭证 update global_variables set variable_value='proxysql' where variable_name='admin-cluster_username'; update global_variables set variable_value='proxysql' where variable_name='admin-cluster_password'; LOAD ADMIN VARIABLES TO RUNTIME; SAVE ADMIN VARIABLES TO DISK;
3.2 cnf中配置default_charset参数会启动失败
cnf中添加此配置会启动失败,只能先不添加,程序启动后再手动修改 mysql_variables= { ...... default_charset='utf8mb4' default_collation_connection='utf8mb4_general_ci' }
这俩变量的值默认是 mysql> select * from global_variables; +----------------------------------------------------------------------+--------------------------------------------+ | variable_name | variable_value | +----------------------------------------------------------------------+--------------------------------------------+ | mysql-default_charset | utf8 | | mysql-default_collation_connection | utf8_general_ci | 启动之前配置文件中先不添加的,等程序启动后,手动修改 set mysql-default_charset='utf8mb4'; set mysql-default_collation_connection='utf8mb4_general_ci'; load mysql variables to runtime; save mysql variables from runtime; mysql> select * from global_variables; +----------------------------------------------------------------------+--------------------------------------------+ | variable_name | variable_value | +----------------------------------------------------------------------+--------------------------------------------+ | mysql-default_charset | utf8mb4 | | mysql-default_collation_connection | utf8mb4_general_ci |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?