ProxySQL集群

实验环境信息 MySQL主从信息

IP 1 角色
188.188.0.68 Node1
188.188.0.69 Node2
188.188.0.70 Node3

ProxySQL服务节点

IP 1 角色
188.188.0.68 节点68
188.188.0.71 节点71

ProxySQL版本: 2.0.3-29-g00f26d5

一、ProxySQL服务安装

在多个服务器上安装相同版本的ProxySQL服务;并在各个节点启动服务。 安装方式参考官网或<01_ProxySQL安装.txt>

二、设置集群内节点信息

!!!在各节点分别执行以下操作!!!

1)登录ProxySQL点 登录各个节点,设置通一的用户名、密码:

mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt 'Admin> '

2)设置服务器信息

Admin> SELECT * FROM proxysql_servers;
Empty set (0.00 sec)

Admin> INSERT INTO proxysql_servers(hostname,port,weight,comment) VALUES ('188.188.0.68',6032,1,'节点68'),('188.188.0.71',6032,1,'节点71');
Query OK, 2 rows affected (0.00 sec)

Admin> SELECT * FROM proxysql_servers;
+--------------+------+--------+----------+
| hostname     | port | weight | comment  |
+--------------+------+--------+----------+
| 188.188.0.68 | 6032 | 1      | 节点68   |
| 188.188.0.71 | 6032 | 1      | 节点71   |
+--------------+------+--------+----------+
2 rows in set (0.00 sec)

3)配置生效

Admin> LOAD PROXYSQL SERVERS TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

Admin> SELECT * FROM runtime_proxysql_servers;
+--------------+------+--------+----------+
| hostname     | port | weight | comment  |
+--------------+------+--------+----------+
| 188.188.0.71 | 6032 | 1      | 节点71   |
| 188.188.0.68 | 6032 | 1      | 节点68   |
+--------------+------+--------+----------+
2 rows in set (0.00 sec)

三、设置集群节点间数据同步用户

!!!在各节点分别执行以下操作!!!

1)查看原始值

Admin> SHOW VARIABLES LIKE 'admin-cluster_username';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| admin-cluster_username |       |
+------------------------+-------+
1 row in set (0.00 sec)

Admin> SHOW VARIABLES LIKE 'admin-cluster_password';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| admin-cluster_password |       |
+------------------------+-------+
1 row in set (0.00 sec)

Admin> SHOW VARIABLES LIKE 'admin_admin_credentials';
+-------------------------+-------------+
| Variable_name           | Value       |
+-------------------------+-------------+
| admin-admin_credentials | admin:admin |
+-------------------------+-------------+
1 row in set (0.00 sec)

注意,对同步使用的username/password也应该出现在admin-admin_credentials中,否则连接将失败。

2)指定特定值

Admin> SET admin-cluster_username = 'cluser';
Query OK, 1 row affected (0.00 sec)

Admin> SET admin-cluster_password = '654987';
Query OK, 1 row affected (0.00 sec)

Admin> UPDATE global_variables SET variable_value='admin:admin;cluser:654987' WHERE variable_name='admin-admin_credentials';
Query OK, 1 row affected (0.01 sec)

注意:不同用户间用分号(;)分隔。账号不需要提前建立,直接用就好。

3)查看结果

Admin> SHOW VARIABLES LIKE 'admin-cluster_username';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| admin-cluster_username | cluser |
+------------------------+--------+
1 row in set (0.00 sec)

Admin> SHOW VARIABLES LIKE 'admin-cluster_password';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| admin-cluster_password | 654987 |
+------------------------+--------+
1 row in set (0.00 sec)

Admin> SHOW VARIABLES LIKE 'admin_admin_credentials' ;
+-------------------------+---------------------------+
| Variable_name           | Value                     |
+-------------------------+---------------------------+
| admin-admin_credentials | admin:admin;cluser:654987 |
+-------------------------+---------------------------+
1 row in set (0.00 sec)

4)使配置生效

Admin> LOAD ADMIN VARIABLES TO RUNTIME ;
Query OK, 0 rows affected (0.00 sec)

四、在各节点查看集群状态

!!!在各节点分别执行以下操作!!!

1)查看ProxySQL集群节点校验和

Admin> SELECT * FROM stats.stats_proxysql_servers_checksums ;
+--------------+------+-------------------+---------+------------+--------------------+------------+------------+------------+
| hostname     | port | name              | version | epoch      | checksum           | changed_at | updated_at | diff_check |
+--------------+------+-------------------+---------+------------+--------------------+------------+------------+------------+
| 188.188.0.71 | 6032 | admin_variables   | 0       | 0          |                    | 0          | 1558360976 | 0          |
| 188.188.0.71 | 6032 | mysql_query_rules | 9       | 1558251408 | 0x0000000000000000 | 1558360877 | 1558360976 | 0          |
| 188.188.0.71 | 6032 | mysql_servers     | 671     | 1558360886 | 0xA98C8BA3A59F15B6 | 1558360877 | 1558360976 | 100        |
| 188.188.0.71 | 6032 | mysql_users       | 8       | 1558251284 | 0xFE7A30305853A000 | 1558360877 | 1558360976 | 0          |
| 188.188.0.71 | 6032 | mysql_variables   | 0       | 0          |                    | 0          | 1558360976 | 0          |
| 188.188.0.71 | 6032 | proxysql_servers  | 2       | 1558359750 | 0x93A30F7C7F6EE496 | 1558360877 | 1558360976 | 0          |
| 188.188.0.68 | 6032 | admin_variables   | 0       | 0          |                    | 0          | 1558360975 | 0          |
| 188.188.0.68 | 6032 | mysql_query_rules | 1       | 1558357984 | 0x0000000000000000 | 1558359728 | 1558360975 | 0          |
| 188.188.0.68 | 6032 | mysql_servers     | 3       | 1558360886 | 0x624AF2D0247C16D3 | 1558360880 | 1558360975 | 0          |
| 188.188.0.68 | 6032 | mysql_users       | 2       | 1558360880 | 0xFE7A30305853A000 | 1558360880 | 1558360975 | 0          |
| 188.188.0.68 | 6032 | mysql_variables   | 0       | 0          |                    | 0          | 1558360975 | 0          |
| 188.188.0.68 | 6032 | proxysql_servers  | 2       | 1558359728 | 0x93A30F7C7F6EE496 | 1558359728 | 1558360975 | 0          |
+--------------+------+-------------------+---------+------------+--------------------+------------+------------+------------+
12 rows in set (0.00 sec)

注意: A)如果该表中的记录都为0,那么很有可能是同步失败了。需要去查看错误日志来判断具体问题。 B)对于admin_variables和mysql_variables的参数配置是不会同步的,这需要手动的在各个节点上分别设置;

2)查看ProxySQL集群节点间全局状态信息同步状况

Admin> SELECT * FROM stats.stats_proxysql_servers_metrics ;
+--------------+------+--------+----------+------------------+----------+---------------+---------+------------------------------+----------------------------+
| hostname     | port | weight | comment  | response_time_ms | Uptime_s | last_check_ms | Queries | Client_Connections_connected | Client_Connections_created |
+--------------+------+--------+----------+------------------+----------+---------------+---------+------------------------------+----------------------------+
| 188.188.0.71 | 6032 | 1      | 节点71   | 3                | 641614   | 4021          | 172     | 0                            | 87                         |
| 188.188.0.68 | 6032 | 1      | 节点68   | 3                | 3023     | 2442          | 0       | 0                            | 0                          |
+--------------+------+--------+----------+------------------+----------+---------------+---------+------------------------------+----------------------------+
2 rows in set (0.00 sec)

到这里,基础的集群设置已经完毕,再次基础上可以对集群进行参数优化;以及加入后端MySQL服务器进行使用!!!

  • 》》》》压测篇《《《《

一、后端为MGR多主模式

可以对MGR多主压测,但要注意: 由于ProxySQL监控主从状态是靠在后端MySQL上建立一个sys.gr_member_routing_candidate_status的状态视图,而对该视图的查询实际上是对多个系统表查询结果的汇总。因此,在MySQL繁忙时访问该视图会导致监控程序获取信息超时而失败,继而误判主机状态而修改runtime_mysql_servers的状态,导致连接后端MGR线程断开。所以,压测时最好将该视图用一个同名表代替,并在里面写死服务器状态,这样就不会在监控程序访问时获取内容超时异常,也就不会杀死后端连接线程。

对Proxy SQL压测时,如果后端使用了MGR多主模式,则压测可以参考以下思路: 由于MGR在对大事务支持和事务冲突检测上的限制和不足,导致对MGR直接并行压测是不可能的。Oracle官方的Multi-Primary Mode测试是在每个结点上,对不同的测试库进行压测,即这样可以避免了工具无法并行压测的问题,同时,这样也减少了冲突的可能性。切记,Multi-Primary Mode一定要避免热点数据冲突的场景。

例如MGR集群中有3个节点,分别为A、B、C;那么,压测时需要建立至少3个库;这样每个tpcc压测都使用1个线程来测试一个库,并且同时启动多个tpcc来测试。 可以这样测试: A节点:

./tpcc_start -h188.188.0.68 -P3306 -uroot -p '123456' -d tpcc1 -w 5 -c 1 -r 10 -l 30 -i 10 -f tpcc_mysql.log -t tpcc_mysql.rtx
.....

B节点:

./tpcc_start -h188.188.0.69 -P3306 -uroot -p '123456' -d tpcc2 -w 5 -c 1 -r 10 -l 30 -i 10 -f tpcc_mysql.log -t tpcc_mysql.rtx
.....
C节点:
./tpcc_start -h188.188.0.70 -P3306 -uroot -p '123456' -d tpcc3 -w 5 -c 1 -r 10 -l 30 -i 10 -f tpcc_mysql.log -t tpcc_mysql.rtx
.....

不过对Multi-Primary Mode压测并不会有一个很好的结果,因为热点太过集中,会导致提交失败很多,或许反而会导致了性能的下降。

如果用sysbench压测,也是一样的思路,只能使用多库+单线程+多测试终端运行的方式。

二、后端为MGR单主模式

可以直接用多线程压测PROXYSQL,就像压测普通MySQL一样。但要注意:后端MySQL上建立的sys.gr_member_routing_candidate_status视图,参考上面多主压测说明内容。

~ ~ 完毕!