本文演示
ProxySQL代理PXC(Percona XtraDB Cluster)的方法 , 不涉及原理 , 纯配置过程 , 所以如有不懂之处 , 请先掌握相关理论。

ProxySQL要代理PXC , 需要使用ProxySQL额外提供的脚本/usr/share/proxysql/tools/proxysql_galera_checker.sh做健康检查并动态调整 , 通过Scheduler来调用实现。ProxySQL v2.0版本将原生支持Galera并增加相关表mysql_galera_hostgroups , 到时就无需借用第三方脚本。

实验环境 :

Node

HostName

IP_address

Node1

proxysql

192.168.100.21

Node2

pxc1

192.168.100.32

Node3

pxc2

192.168.100.33

Node4

pxc3

192.168.100.34

1. 配置PXC

  1. 安装percona xtradb cluster

    3个节点上(pxc1、pxc2、pxc3)都操作 :

    提供yum源 :

    [percona]
    name=percona_repo
    baseurl = https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
    enabled = 1
    gpgcheck = 0

    安装

    yum install Percona-XtraDB-Cluster-client-57
  1. 提供配置文件

    第一个节点(pxc1)配置文件/etc/my.cnf:

    [mysqld]
    server-id=100               # 各节点不同
    datadir=/data
    socket=/data/mysql.sock
    log-error=/data/error.log
    pid-file=/data/mysqld.pid
    log-bin=/data/master-bin
    log_slave_updates
    ​
    wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
    wsrep_cluster_name=pxc-cluster
    wsrep_cluster_address=gcomm://192.168.100.32,192.168.100.33,192.168.100.34
    wsrep_node_name=pxc1                # 各节点不同
    wsrep_node_address=192.168.100.32   # 各节点不同
    wsrep_sst_method=xtrabackup-v2
    wsrep_sst_auth=sstuser:P@ssword1!
    pxc_strict_mode=ENFORCING
    binlog_format=ROW
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2

    第二个节点(pxc2)配置文件

    [mysqld]
    server-id=110               # 各节点不同
    datadir=/data
    socket=/data/mysql.sock
    log-error=/data/error.log
    pid-file=/data/mysqld.pid
    log-bin=/data/master-bin
    log_slave_updates
    ​
    wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
    wsrep_cluster_name=pxc-cluster
    wsrep_cluster_address=gcomm://192.168.100.32,192.168.100.33,192.168.100.34
    wsrep_node_name=pxc2                # 各节点不同
    wsrep_node_address=192.168.100.33   # 各节点不同
    wsrep_sst_method=xtrabackup-v2
    wsrep_sst_auth=sstuser:P@ssword1!
    pxc_strict_mode=ENFORCING
    binlog_format=ROW
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2

    第三个节点(pxc3)配置文件

    [mysqld]
    server-id=120               # 各节点不同
    datadir=/data
    socket=/data/mysql.sock
    log-error=/data/error.log
    pid-file=/data/mysqld.pid
    log-bin=/data/master-bin
    log_slave_updates
    ​
    wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
    wsrep_cluster_name=pxc-cluster
    wsrep_cluster_address=gcomm://192.168.100.32,192.168.100.33,192.168.100.34
    wsrep_node_name=pxc3                # 各节点不同
    wsrep_node_address=192.168.100.34   # 各节点不同
    wsrep_sst_method=xtrabackup-v2
    wsrep_sst_auth=sstuser:P@ssword1!
    pxc_strict_mode=ENFORCING
    binlog_format=ROW
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2

  1. 引导PXC集群

    在第一个MySQL节点上(pxc1)以bootstrap形式启动MySQL:

    /etc/init.d/mysql bootstrap-pxc
    # 或
    systemctl start mysql@bootstrap.service

    查看引导状态:

    mysql@pxc1> show status like 'wsrep%';
    +----------------------------+--------------------------------------+
    | Variable_name              | Value                                |
    +----------------------------+--------------------------------------+
    | wsrep_local_state_uuid     | c2883338-834d-11e2-0800-03c9c68e41ec |
    | ...                        | ...                                  |
    | wsrep_local_state          | 4                                    |
    | wsrep_local_state_comment  | Synced                               |
    | ...                        | ...                                  |
    | wsrep_cluster_size         | 1                                    |
    | wsrep_cluster_status       | Primary                              |
    | wsrep_connected            | ON                                   |
    | ...                        | ...                                  |
    | wsrep_ready                | ON                                   |
    +----------------------------+--------------------------------------+

    正确引导了第一个节点后 , 在第一个节点上创建SST的认证用户 , 注意这个用户名和密码需要和前面配置文件指定的一致。

    create user 'sstuser'@localhost identified by 'P@ssword1!';
    grant reload,lock tables,process,replication client on *.* to 'sstuser'@localhost;
    flush privileges;

  1. 加入第二、第三个节点

    直接启动mysqld服务即可。

    在第二、三个节点(pxc2pxc3)上执行 :

    /etc/init.d/mysql start
    #### 或
    systemctl start mysql

2. 配置ProxySQL

以下过程均在proxysql节点(Node1)上操作 , 除非已显式指明。

  1. 安装ProxySQL和MySQL客户端

    提供ProxySQLyum源 :

    cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
    [proxysql_repo]
    name= ProxySQL
    baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
    gpgcheck=0
    enabled=1
    ​
    [percona]
    name=percona_repo
    baseurl = https://mirrors.tuna.tsinghua.edu.cn/percona/release/\$releasever/RPMS/\$basearch
    enabled = 1
    gpgcheck = 0
    EOF

    然后安装。这里的Percona-XtraDB-Cluster-57只是为了提供mysql客户端 , 也可以装其他的 , 例如官方的mysql

    yum -y install proxysql Percona-XtraDB-Cluster-57

    启动ProxySQL , 并用mysql客户端连接ProxySQL的管理接口 :

    service proxysql start
    mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt 'admin> '

  1. 添加pxcProxySQLmysql_servers

    insert into mysql_servers(hostgroup_id,hostname,port) values
    (10,'192.168.100.32',3306),
    (10,'192.168.100.33',3306),
    (10,'192.168.100.34',3306);
    ​
    load mysql servers to runtime;
    save mysql servers to disk;

  1. 创建监控用户 , 并设置监控用户凭据

    pxc上执行(pxc1pxc2pxc3任意一个)创建监控用户 , 如果不监控replication lag , 只需usage权限即可 , 如果监控replication lag , 则需要replication client权限。这里直接授予replication client权限。

    create user monitor@'192.168.100.%' identified by 'P@ssword1!';
    grant replication client on *.* to monitor@'192.168.100.%';

    回到ProxySQL节点上配置监控用户凭据。

    set mysql-monitor_username='monitor';
    set mysql-monitor_password='P@ssword1!';
    ​
    load mysql variables to runtime;
    save mysql variables to disk;

    注意 , 不要监控PXCread_only , 也不要配置mysql_replication_hostgroup。因为目前版本的ProxySQL不支持指定Galera集群中哪些节点作为读 , 哪些节点作为写节点。在未来的ProxySQL 2.0版本 , 将会添加mysql_galera_hostgroups表 , 可以指定集群中的读写节点 , 让ProxySQLGalera的支持更丰富、具体 , 该表的意义和作用 , 见mysql_galera_hostgroups

    所以 , 目前版本的ProxySQL+PXC , 无法将读、写操作分离到同一个组中的不同节点上。但是可以保证同一个事务内的语句全都路由到同一个组中的同一个节点(ProxySQL在某些情况下会自动禁用multiplexing功能)。

  1. 设置ProxySQL连接后端PXC的用户 , 即配置 mysql_users

    pxc上执行(pxc1pxc2、pxc3任意一个)创建连接用户 , 这里假设ProxySQL全都使用root用户连接PXC , 以及接受appSQL请求。

    create user root@'192.168.100.%' identified by 'P@ssword1!'
    grant all on *.* to root@'192.168.100.%';

    然后回到ProxySQL , 配置mysql_users表 , 将刚才的用户添加到该表中。

    insert into mysql_users(username,password,default_hostgroup,transaction_persistent) 
    values('root','P@ssword1!',10,1);
    load mysql users to runtime;
    save mysql users to disk;

  1. 添加Galera支持

    ProxySQL不原生支持Galera特性 , 只是把它当作普通的MySQL , 要保证Galera的合理运行 , 只能通过任务调度模块(scheduler)来调度外部脚本做Galera的健康检查 , 并根据检查结果动态修改ProxySQL的配置。

    ProxySQL自身已带Galera集群的健康检查脚本 , 路径为/usr/share/proxysql/tools/proxysql_galera_checker.sh。可以自己打开这个shell脚本看看 , 并不复杂。注意这个脚本 , 能自动配置ProxySQL标记某个MySQL节点offline_soft , 并将重新上线的节点加回ProxySQL中。

    ProxySQL中创建一个scheduler , 用于调用这个脚本 :

    INSERT INTO scheduler(id,interval_ms,filename,arg1,arg2,arg3,arg4) VALUES
    (1,'10000','/var/lib/proxysql/proxysql_galera_checker.sh','127.0.0.1','6032','10',
    '/tmp/proxysql_galera_checker.log');
    ​
    LOAD SCHEDULER TO RUNTIME;
    SAVE SCHEDULER TO DISK;

    id : 调度任务的id interval_ms : 执行脚本的时间间隔 , 也就是检查Galera集群的时间间隔 , 单位毫秒 filename : 该调度任务所要调度的文件名 arg1 : 指定ProxySQLadmin管理接口监听地址 arg2 : admin管理接口端口 arg3 : 指定待检查的组hostgroup_id , 脚本会从检查这个组中所有节点的"wsrep_local_state"值 , 并根据值来自动重新配置ProxySQL arg4 : 指定脚本运行过程中产生的数据保存路径。默认值为/dev/null

    需要注意 , 上述是ProxySQL官方提供的脚本 , percona提供的ProxySQLGalera检查脚本和ProxySQL官方提供的不一样 , 具体用法以及参数可打开脚本查看。

    对于scheduler模块来说 , scheduler表最多允许接受5个参数位。

  1. 测试

    上述配置完成后 , 可以进行读、写测试 , 并测试是否会按预期移除、加回故障节点。


参考链接

MySQL中间件之ProxySQL(14) : ProxySQL+PXC - 骏马金龙 - 博客园

熊熊