前言:前面的三篇文章基本讲解了一些MGR的基础运维工作,MGR在数据库层是高可用的集群,但是对于应用来说并不是,我们需要有一个中间件能够自动探测到挂掉的节点,并能够让应用连接到新节点,我们今天以ProxySQL为例来讲解如何配置MGR+ProxySQL实现应用高可用。

一、ProxySQL安装

ProxySQL的安装及其简单,可以直接下载rpm包进行安装,ProxySQL官网

  1. wget https://github.com/sysown/proxysql/releases/download/v1.4.9/proxysql-1.4.9-1-centos7.x86_64.rpm

直接安装可能会报错,需要安装几个依赖

  1. yum install -y perl-DBD-MySQL perl-DBI

安装完依赖以后直接安装rpm包即可

  1. [root@xucl src]# rpm -ivh proxysql-1.4.9-1-centos7.x86_64.rpm
  2. Preparing... ################################# [100%]
  3. package proxysql-1.4.9-1.x86_64 is already installed

那我这里已经装好了

二、ProxySQL配置文件

ProxySQL配置文件目录在/etc/proxysql.cnf,我们用默认配置即可,简单撸一下配置文件

  1. [root@xucl src]# cat /etc/proxysql.cnf |grep -v "#"|grep -v "^$"
  2. datadir="/var/lib/proxysql"
  3. admin_variables=
  4. {
  5. admin_credentials="admin:admin"
  6. mysql_ifaces="0.0.0.0:6032"
  7. }
  8. mysql_variables=
  9. {
  10. threads=4
  11. max_connections=2048
  12. default_query_delay=0
  13. default_query_timeout=36000000
  14. have_compress=true
  15. poll_timeout=2000
  16. interfaces="0.0.0.0:6033"
  17. default_schema="information_schema"
  18. stacksize=1048576
  19. server_version="5.5.30"
  20. connect_timeout_server=3000
  21. monitor_username="monitor"
  22. monitor_password="monitor"
  23. monitor_history=600000
  24. monitor_connect_interval=60000
  25. monitor_ping_interval=10000
  26. monitor_read_only_interval=1500
  27. monitor_read_only_timeout=500
  28. ping_interval_server_msec=120000
  29. ping_timeout_server=500
  30. commands_stats=true
  31. sessions_sort=true
  32. connect_retries_on_failure=10
  33. }
  34. mysql_servers =
  35. (
  36. )
  37. mysql_users:
  38. (
  39. )
  40. mysql_query_rules:
  41. (
  42. )
  43. scheduler=
  44. (
  45. )
  46. mysql_replication_hostgroups=
  47. (
  48. )
  • datadir:数据存放目录

  • admin_variables:管理变量,包含管理用户密码及绑定的ip和端口

  • mysql_variables:运行变量,包含监听端口、监控用户名密码、监控频率、最大连接数等等

  • mysql_servers、mysql_users、mysql_query_rules、scheduler、mysql_replication_hostgroups等可以先不管,我们到命令行下进行修改

三、启动ProxySQL并配置MGR

ProxySQL启动很简单,直接

  1. [root@xucl src]# service proxysql start
  2. Starting ProxySQL: DONE!

登录到ProxySQL

  1. [root@xucl src]# mysql -h127.0.0.1 -uadmin -padmin -P6032
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 1
  5. Server version: 5.5.30 (ProxySQL Admin Module)
  6. Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. admin@127.0.0.1 [(none)]>

配置mysql_server

  1. admin@127.0.0.1 [main]>show create table mysql_servers\G
  2. *************************** 1. row ***************************
  3. table: mysql_servers
  4. Create Table: CREATE TABLE mysql_servers (
  5. hostgroup_id INT CHECK (hostgroup_id>=0) NOT NULL DEFAULT 0,
  6. hostname VARCHAR NOT NULL,
  7. port INT NOT NULL DEFAULT 3306,
  8. status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE',
  9. weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1,
  10. compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0,
  11. max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000,
  12. max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0,
  13. use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0,
  14. max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0,
  15. comment VARCHAR NOT NULL DEFAULT '',
  16. PRIMARY KEY (hostgroup_id, hostname, port) )
  17. 1 row in set (0.00 sec)
  18. admin@127.0.0.1 [main]>insert into mysql_servers(hostgroup_id,hostname,port) values(2,'172.16.230.158',3306),(2,'172.16.230.158',3307),(2,'172.16.230.158',3308);
  19. Query OK, 3 rows affected (0.00 sec)
  20. admin@127.0.0.1 [main]>save mysql servers to disk;
  21. Query OK, 0 rows affected (0.03 sec)
  22. admin@127.0.0.1 [main]>load mysql servers to runtime;
  23. Query OK, 0 rows affected (0.00 sec)
  24. admin@127.0.0.1 [main]>select * from mysql_servers;
  25. +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
  26. | hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
  27. +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
  28. | 2 | 172.16.230.158 | 3306 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
  29. | 2 | 172.16.230.158 | 3307 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
  30. | 2 | 172.16.230.158 | 3308 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
  31. +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
  32. 3 rows in set (0.00 sec)

配置user

  1. admin@127.0.0.1 [main]>insert into mysql_users(username,password,default_hostgroup,default_schema) values('xucl','xuclxucl',2,'xucl');
  2. Query OK, 1 row affected (0.00 sec)
  3. admin@127.0.0.1 [main]>save mysql users to disk;
  4. Query OK, 0 rows affected (0.02 sec)
  5. admin@127.0.0.1 [main]>load mysql users to runtime;
  6. Query OK, 0 rows affected (0.00 sec)
  7. admin@127.0.0.1 [(none)]>select * from mysql_users;
  8. +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
  9. | username | password | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections |
  10. +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
  11. | xucl | xuclxucl | 1 | 0 | 2 | xucl | 0 | 1 | 0 | 1 | 1 | 10000 |
  12. +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+
  13. 1 row in set (0.00 sec)

创建mgr状态检查函数和视图
git下载相应的脚本,在主节点上创建

  1. root@localhost [(none)]>source /usr/local/src/mysql_gr_routing_check-master/addition_to_sys.sql
  2. Database changed
  3. Query OK, 0 rows affected (0.00 sec)
  4. Query OK, 0 rows affected (0.01 sec)
  5. Query OK, 0 rows affected (0.00 sec)
  6. Query OK, 0 rows affected (0.00 sec)
  7. Query OK, 0 rows affected (0.00 sec)
  8. Query OK, 0 rows affected (0.00 sec)
  9. Query OK, 0 rows affected (0.01 sec)

设置monitor账号密码(也可以用默认的账号monitor,需要再mgr集群中创建)

  1. admin@127.0.0.1 [main]>UPDATE global_variables SET variable_value='xucl' WHERE variable_name='mysql-monitor_username';
  2. Query OK, 1 row affected (0.00 sec)
  3. admin@127.0.0.1 [main]>UPDATE global_variables SET variable_value='xuclxucl' WHERE variable_name='mysql-monitor_password';
  4. Query OK, 1 row affected (0.00 sec)
  5. admin@127.0.0.1 [main]>LOAD MYSQL VARIABLES TO RUNTIME;
  6. Query OK, 0 rows affected (0.00 sec)
  7. admin@127.0.0.1 [main]>SAVE MYSQL VARIABLES TO DISK;
  8. Query OK, 95 rows affected (0.01 sec)

设置group_replication_hostgrous

  1. admin@127.0.0.1 [main]>insert into mysql_group_replication_hostgroups (writer_hostgroup,backup_writer_hostgroup,
  2. -> reader_hostgroup, offline_hostgroup,active,max_writers,writer_is_also_reader,max_transactions_behind)
  3. -> values (2,4,3,1,1,1,0,100);
  4. Query OK, 1 row affected (0.00 sec)
  5. admin@127.0.0.1 [main]>save mysql servers to disk;
  6. Query OK, 0 rows affected (0.03 sec)
  7. admin@127.0.0.1 [main]>load mysql servers to runtime;
  8. Query OK, 0 rows affected (0.01 sec)

定义如下:

  • writer_hostgroup:写节点groupid为2

  • backup_writer_hostgroup:备选写节点groupid为4

  • reader_hostgroup:只读节点groupid为3

  • offline_hostgroup:offline节点状态为1

查看成员状态

  1. root@localhost [sys]>select * from gr_member_routing_candidate_status;
  2. +------------------+-----------+---------------------+----------------------+
  3. | viable_candidate | read_only | transactions_behind | transactions_to_cert |
  4. +------------------+-----------+---------------------+----------------------+
  5. | YES | YES | 0 | 0 |
  6. +------------------+-----------+---------------------+----------------------+
  7. 1 row in set (0.00 sec)

查看成员组状态

  1. admin@127.0.0.1 [(none)]>select hostgroup_id, hostname, port, status from runtime_mysql_servers;
  2. +--------------+----------------+------+--------+
  3. | hostgroup_id | hostname | port | status |
  4. +--------------+----------------+------+--------+
  5. | 2 | 172.16.230.158 | 3306 | ONLINE |
  6. | 3 | 172.16.230.158 | 3307 | ONLINE |
  7. | 4 | 172.16.230.158 | 3308 | ONLINE |
  8. +--------------+----------------+------+--------+
  9. 3 rows in set (0.00 sec)

从上面看到,只有3306端口对应的实例是可写的,其他两个实例为可读实例

查看监控log

  1. admin@127.0.0.1 [main]>select * from mysql_server_group_replication_log order by time_start_us desc limit 5;
  2. +----------------+------+------------------+-----------------+------------------+-----------+---------------------+-------+
  3. | hostname | port | time_start_us | success_time_us | viable_candidate | read_only | transactions_behind | error |
  4. +----------------+------+------------------+-----------------+------------------+-----------+---------------------+-------+
  5. | 172.16.230.158 | 3308 | 1528259591720722 | 1567 | YES | YES | 0 | NULL |
  6. | 172.16.230.158 | 3307 | 1528259591719236 | 1425 | YES | YES | 0 | NULL |
  7. | 172.16.230.158 | 3306 | 1528259591717542 | 3117 | YES | NO | 0 | NULL |
  8. | 172.16.230.158 | 3308 | 1528259586720722 | 1417 | YES | YES | 0 | NULL |
  9. | 172.16.230.158 | 3307 | 1528259586719211 | 2930 | YES | YES | 0 | NULL |
  10. +----------------+------+------------------+-----------------+------------------+-----------+---------------------+-------+
  11. 5 rows in set (0.00 sec)

可以看到监控正常

四、连接测试

  1. xucl@127.0.0.1 [(none)]>select @@port;
  2. +--------+
  3. | @@port |
  4. +--------+
  5. | 3306 |
  6. +--------+
  7. 1 row in set (0.00 sec)

可以看到连接到默认的组2上,也就是3306端口所在的实例了

五、宕机测试

在3306节点实例停止group replication

  1. root@localhost [(none)]>stop group_replication;
  2. Query OK, 0 rows affected (9.54 sec)

再次查看成员状态

  1. admin@127.0.0.1 [(none)]>select * from runtime_mysql_servers;
  2. +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
  3. | hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
  4. +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
  5. | 2 | 172.16.230.158 | 3308 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
  6. | 1 | 172.16.230.158 | 3306 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
  7. | 3 | 172.16.230.158 | 3307 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
  8. +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
  9. 3 rows in set (0.00 sec)

可以看到3308的实例作为写节点了
连接测试一下

  1. xucl@127.0.0.1 [(none)]>select @@port;
  2. +--------+
  3. | @@port |
  4. +--------+
  5. | 3308 |
  6. +--------+
  7. 1 row in set (0.00 sec)

ProxySQL已经自动帮我们完成了节点切换,并且速度还是非常快的