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                         |
复制代码

 

posted @   阿锋888  阅读(357)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示