zoukankan      html  css  js  c++  java
  • MySQL Server Configuration

    Configuring Backend MySQL Servers in ProxySQL

    ProxySQL主要是通过mysql_servers来配置MySQL servers,有时候可能会用到mysql_replication_hostgroups

    备注:在读下面内容之前,确保理解multi-layer configuration system,或者看我前面的文章

    注意:

    • 更新mysql_servers 和mysql_replication_hostgroups表后,如果不执行LOAD MYSQL SERVERS TO RUNTIME,当前配置并不会生效
    • 如果不执行SAVE MYSQL SERVERS TO DISK,当前配置并不会被持久化,服务重启后数据将丢失

    多层配置系统略过,详细内容参考multi-layer configuration system

    Adding a new server

    要添加一个后台MySQL server,insert一条新纪录到mysql_servers表即可,这张表部分列都带有默认值

    下面的操作是新增一个MySQL server,除hostname外其他都采用默认值

     1 Admin> SELECT * FROM mysql_servers;
     2 Empty set (0.00 sec)
     3 
     4 Admin> INSERT INTO mysql_servers (hostname) VALUES ('172.16.0.1');
     5 Query OK, 1 row affected (0.00 sec)
     6 
     7 Admin> SELECT * FROM mysql_serversG
     8 *************************** 1. row ***************************
     9        hostgroup_id: 0
    10            hostname: 172.16.0.1
    11                port: 3306
    12              status: ONLINE
    13              weight: 1
    14         compression: 0
    15     max_connections: 1000
    16 max_replication_lag: 0
    17             use_ssl: 0
    18      max_latency_ms: 0
    19             comment:
    20 1 row in set (0.00 sec)
    View Code

    Adding new servers to a hostgroup

     1 Admin> SELECT hostgroup_id,hostname FROM mysql_servers;
     2 +--------------+------------+
     3 | hostgroup_id | hostname   |
     4 +--------------+------------+
     5 | 0            | 172.16.0.1 |
     6 +--------------+------------+
     7 1 row in set (0.00 sec)
     8 
     9 Admin> INSERT INTO mysql_servers (hostgroup_id, hostname) VALUES (1, '172.16.0.2'), (1,'172.16.0.3');
    10 Query OK, 2 rows affected (0.00 sec)
    11 
    12 Admin> SELECT hostgroup_id,hostname FROM mysql_servers;
    13 +--------------+------------+
    14 | hostgroup_id | hostname   |
    15 +--------------+------------+
    16 | 0            | 172.16.0.1 |
    17 | 1            | 172.16.0.2 |
    18 | 1            | 172.16.0.3 |
    19 +--------------+------------+
    20 3 rows in set (0.00 sec)
    View Code

    Limiting the number of connections to a backend

     1 Admin> SELECT hostgroup_id,hostname,max_connections FROM mysql_servers;
     2 +--------------+------------+-----------------+
     3 | hostgroup_id | hostname   | max_connections |
     4 +--------------+------------+-----------------+
     5 | 0            | 172.16.0.1 | 1000            |
     6 | 1            | 172.16.0.2 | 1000            |
     7 | 1            | 172.16.0.3 | 1000            |
     8 +--------------+------------+-----------------+
     9 3 rows in set (0.00 sec)
    10 
    11 Admin> UPDATE mysql_servers SET max_connections=10 WHERE hostname='172.16.0.2';
    12 Query OK, 1 row affected (0.00 sec)
    13 
    14 Admin> SELECT hostgroup_id,hostname,max_connections FROM mysql_servers;
    15 +--------------+------------+-----------------+
    16 | hostgroup_id | hostname   | max_connections |
    17 +--------------+------------+-----------------+
    18 | 0            | 172.16.0.1 | 1000            |
    19 | 1            | 172.16.0.2 | 10              |
    20 | 1            | 172.16.0.3 | 1000            |
    21 +--------------+------------+-----------------+
    22 3 rows in set (0.00 sec)
    View Code

    Prioritizing traffic by changing the weight of a backend

    只有在同一个hostgroup内的server才互相区分权重

     1 Admin> SELECT hostgroup_id,hostname,weight FROM mysql_servers;
     2 +--------------+------------+--------+
     3 | hostgroup_id | hostname   | weight |
     4 +--------------+------------+--------+
     5 | 0            | 172.16.0.1 | 1      |
     6 | 1            | 172.16.0.2 | 1      |
     7 | 1            | 172.16.0.3 | 1      |
     8 +--------------+------------+--------+
     9 3 rows in set (0.00 sec)
    10 
    11 Admin> UPDATE mysql_servers SET weight=1000 WHERE hostname NOT IN ('172.16.0.2', '172.16.0.1') AND hostgroup_id=1;
    12 Query OK, 1 row affected (0.00 sec)
    13 
    14 Admin> SELECT hostgroup_id,hostname,weight FROM mysql_servers;
    15 +--------------+------------+--------+
    16 | hostgroup_id | hostname   | weight |
    17 +--------------+------------+--------+
    18 | 0            | 172.16.0.1 | 1      |
    19 | 1            | 172.16.0.2 | 1      |
    20 | 1            | 172.16.0.3 | 1000   |
    21 +--------------+------------+--------+
    22 3 rows in set (0.00 sec)
    View Code

    Using SSL connections for a specific backend

    下面是一个配置SSL连接的例子,不过不是一个完整的全局配置,详细完整的配置参考here

    1 Admin> SELECT hostgroup_id,hostname,use_ssl FROM mysql_servers;
    2 +--------------+------------+---------+
    3 | hostgroup_id | hostname   | use_ssl |
    4 +--------------+------------+---------+
    5 | 0            | 172.16.0.1 | 1       |
    6 | 1            | 172.16.0.2 | 0       |
    7 | 1            | 172.16.0.3 | 0       |
    8 +--------------+------------+---------+
    9 3 rows in set (0.00 sec)
    View Code

    Automatically shunning slaves with replication lag

    如果max_replication_lag设置成非零值,监控模块将会监控后台mysql server的复制延迟

     1 Admin> SELECT hostgroup_id,hostname,max_replication_lag FROM mysql_servers;
     2 +--------------+------------+---------------------+
     3 | hostgroup_id | hostname   | max_replication_lag |
     4 +--------------+------------+---------------------+
     5 | 0            | 172.16.0.1 | 0                   |
     6 | 1            | 172.16.0.2 | 0                   |
     7 | 1            | 172.16.0.3 | 0                   |
     8 +--------------+------------+---------------------+
     9 3 rows in set (0.00 sec)
    10 
    11 Admin> UPDATE mysql_servers SET max_replication_lag=30 WHERE hostname='172.16.0.3';
    12 Query OK, 1 row affected (0.00 sec)
    13 
    14 Admin> SELECT hostgroup_id,hostname,max_replication_lag FROM mysql_servers;
    15 +--------------+------------+---------------------+
    16 | hostgroup_id | hostname   | max_replication_lag |
    17 +--------------+------------+---------------------+
    18 | 0            | 172.16.0.1 | 0                   |
    19 | 1            | 172.16.0.2 | 0                   |
    20 | 1            | 172.16.0.3 | 30                  |
    21 +--------------+------------+---------------------+
    22 3 rows in set (0.00 sec)
    View Code

    就上面的这个配置,如果复制延迟超过30秒,连接将不再被路由到172.16.0.3,如果max_replication_lag设置成0(SET max_replication_lag=0),那么监控模块将不再检查延迟,详见mysql-monitor_slave_lag_when_null

    Adding a server to two different hostgroups

    mysql_servers表的主键被定义成PRIMARY KEY (hostgroup_id, hostname, port),也就是说同一个后台的MySQL  sever可以有两个不同的hostgroups,其实在很多场景会用到这种配置。

    比如,在一个一主两从的复制结构中,如果从库不可用了(挂了,或者延迟太高),那么读就可以路由到master。

    看下面的例子

     1 Admin> SELECT hostgroup_id,hostname,weight,max_replication_lag FROM mysql_servers;
     2 +--------------+------------+--------+---------------------+
     3 | hostgroup_id | hostname   | weight | max_replication_lag |
     4 +--------------+------------+--------+---------------------+
     5 | 0            | 172.16.0.1 | 1      | 0                   |
     6 | 1            | 172.16.0.2 | 1      | 0                   |
     7 | 1            | 172.16.0.3 | 1000   | 30                  |
     8 +--------------+------------+--------+---------------------+
     9 3 rows in set (0.00 sec)
    10 
    11 Admin> INSERT INTO mysql_servers(hostgroup_id,hostname) VALUES (1,'172.16.0.1');
    12 Query OK, 1 row affected (0.00 sec)
    13 
    14 Admin> SELECT hostgroup_id,hostname,weight,max_replication_lag FROM mysql_servers;
    15 +--------------+------------+--------+---------------------+
    16 | hostgroup_id | hostname   | weight | max_replication_lag |
    17 +--------------+------------+--------+---------------------+
    18 | 0            | 172.16.0.1 | 1      | 0                   |
    19 | 1            | 172.16.0.2 | 1      | 0                   |
    20 | 1            | 172.16.0.3 | 1000   | 30                  |
    21 | 1            | 172.16.0.1 | 1      | 0                   |
    22 +--------------+------------+--------+---------------------+
    23 4 rows in set (0.00 sec)
    24 
    25 Admin> UPDATE mysql_servers SET max_replication_lag=30, weight=1000;
    26 Query OK, 4 rows affected (0.00 sec)
    27 
    28 Admin> UPDATE mysql_servers SET weight=1 WHERE hostname='172.16.0.1' AND hostgroup_id=1;
    29 Query OK, 1 row affected (0.00 sec)
    30 
    31 Admin> SELECT hostgroup_id,hostname,weight,max_replication_lag FROM mysql_servers;
    32 +--------------+------------+--------+---------------------+
    33 | hostgroup_id | hostname   | weight | max_replication_lag |
    34 +--------------+------------+--------+---------------------+
    35 | 0            | 172.16.0.1 | 1000   | 30                  |
    36 | 1            | 172.16.0.2 | 1000   | 30                  |
    37 | 1            | 172.16.0.3 | 1000   | 30                  |
    38 | 1            | 172.16.0.1 | 1      | 30                  |
    39 +--------------+------------+--------+---------------------+
    40 4 rows in set (0.00 sec)
    View Code

    在上面的例子,我们将HG1组配置成读,那么99.95%的连接负载将会路由到172.16.0.2 和172.16.0.3,0.05%的被路由到172.16.0.1.如果172.16.0.2 and 172.16.0.3都不可用了,那么所有的连接都会被路由到172.16.0.1

    注意:max_replication_lag只是对slaves有用,如果没有从库,监控将不会监控延迟

    mysql_servers.compression设置成非零值即可启用压缩传输,注意只有这个配置被加载到runtime后才被初始化的连接才会拥有压缩传输的特性

     1 Admin> SELECT hostgroup_id,hostname,compression FROM mysql_servers;
     2 +--------------+------------+-------------+
     3 | hostgroup_id | hostname   | compression |
     4 +--------------+------------+-------------+
     5 | 0            | 172.16.0.1 | 0           |
     6 | 1            | 172.16.0.2 | 0           |
     7 | 1            | 172.16.0.3 | 0           |
     8 | 1            | 172.16.0.1 | 0           |
     9 +--------------+------------+-------------+
    10 4 rows in set (0.00 sec)
    11 
    12 Admin> UPDATE mysql_servers SET compression=1 WHERE hostname='172.16.0.2' AND hostgroup_id=1;
    13 Query OK, 1 row affected (0.00 sec)
    14 
    15 Admin> SELECT hostgroup_id,hostname,compression FROM mysql_servers;
    16 +--------------+------------+-------------+
    17 | hostgroup_id | hostname   | compression |
    18 +--------------+------------+-------------+
    19 | 0            | 172.16.0.1 | 0           |
    20 | 1            | 172.16.0.2 | 1           |
    21 | 1            | 172.16.0.3 | 0           |
    22 | 1            | 172.16.0.1 | 0           |
    23 +--------------+------------+-------------+
    24 4 rows in set (0.00 sec)
    View Code

    Gracefully disabling a backend server

    将status设置成OFFLINE_SOFT能让后台server优雅的停用掉,这意味着当前活跃的事务和连接任然有效,只是新的连接将不会被路由到这个节点

     1 Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
     2 +--------------+------------+--------+
     3 | hostgroup_id | hostname   | status |
     4 +--------------+------------+--------+
     5 | 0            | 172.16.0.1 | ONLINE |
     6 | 1            | 172.16.0.2 | ONLINE |
     7 | 1            | 172.16.0.3 | ONLINE |
     8 | 1            | 172.16.0.1 | ONLINE |
     9 +--------------+------------+--------+
    10 4 rows in set (0.00 sec)
    11 
    12 Admin> UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE hostname='172.16.0.2';
    13 Query OK, 1 row affected (0.00 sec)
    14 
    15 Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
    16 +--------------+------------+--------------+
    17 | hostgroup_id | hostname   | status       |
    18 +--------------+------------+--------------+
    19 | 0            | 172.16.0.1 | ONLINE       |
    20 | 1            | 172.16.0.2 | OFFLINE_SOFT |
    21 | 1            | 172.16.0.3 | ONLINE       |
    22 | 1            | 172.16.0.1 | ONLINE       |
    23 +--------------+------------+--------------+
    24 4 rows in set (0.00 sec)
    View Code

    Immediately disabling a backend server

    将mysql_serves表中对应记录的status字段值设置成OFFLINE_HARD即可,这时包括当前连接也会立即断开

     1 Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
     2 +--------------+------------+--------------+
     3 | hostgroup_id | hostname   | status       |
     4 +--------------+------------+--------------+
     5 | 0            | 172.16.0.1 | ONLINE       |
     6 | 1            | 172.16.0.2 | OFFLINE_SOFT |
     7 | 1            | 172.16.0.3 | ONLINE       |
     8 | 1            | 172.16.0.1 | ONLINE       |
     9 +--------------+------------+--------------+
    10 4 rows in set (0.00 sec)
    11 
    12 Admin> UPDATE mysql_servers SET status='OFFLINE_HARD' WHERE hostname='172.16.0.1' AND hostgroup_id=1;
    13 Query OK, 1 row affected (0.00 sec)
    14 
    15 Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
    16 +--------------+------------+--------------+
    17 | hostgroup_id | hostname   | status       |
    18 +--------------+------------+--------------+
    19 | 0            | 172.16.0.1 | ONLINE       |
    20 | 1            | 172.16.0.2 | OFFLINE_SOFT |
    21 | 1            | 172.16.0.3 | ONLINE       |
    22 | 1            | 172.16.0.1 | OFFLINE_HARD |
    23 +--------------+------------+--------------+
    24 4 rows in set (0.00 sec)
    View Code

    Re-enabling an offline / disabled backend server

    将status改为ONLINE即可

     1 Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
     2 +--------------+------------+--------------+
     3 | hostgroup_id | hostname   | status       |
     4 +--------------+------------+--------------+
     5 | 0            | 172.16.0.1 | ONLINE       |
     6 | 1            | 172.16.0.2 | OFFLINE_SOFT |
     7 | 1            | 172.16.0.3 | ONLINE       |
     8 | 1            | 172.16.0.1 | OFFLINE_HARD |
     9 +--------------+------------+--------------+
    10 4 rows in set (0.00 sec)
    11 
    12 Admin> UPDATE mysql_servers SET status='ONLINE' WHERE status NOT IN ('ONLINE');
    13 Query OK, 2 rows affected (0.00 sec)
    14 
    15 Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
    16 +--------------+------------+--------+
    17 | hostgroup_id | hostname   | status |
    18 +--------------+------------+--------+
    19 | 0            | 172.16.0.1 | ONLINE |
    20 | 1            | 172.16.0.2 | ONLINE |
    21 | 1            | 172.16.0.3 | ONLINE |
    22 | 1            | 172.16.0.1 | ONLINE |
    23 +--------------+------------+--------+
    24 4 rows in set (0.00 sec)
    View Code

    Removing a backend server

    将mysql_servers中对应记录delete掉即可

     1 Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
     2 +--------------+------------+--------+
     3 | hostgroup_id | hostname   | status |
     4 +--------------+------------+--------+
     5 | 0            | 172.16.0.1 | ONLINE |
     6 | 1            | 172.16.0.2 | ONLINE |
     7 | 1            | 172.16.0.3 | ONLINE |
     8 | 1            | 172.16.0.1 | ONLINE |
     9 +--------------+------------+--------+
    10 4 rows in set (0.00 sec)
    11 
    12 Admin> DELETE FROM mysql_servers WHERE hostgroup_id=1 AND hostname IN ('172.16.0.1','172.16.0.2');
    13 Query OK, 2 rows affected (0.00 sec)
    14 
    15 Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
    16 +--------------+------------+--------+
    17 | hostgroup_id | hostname   | status |
    18 +--------------+------------+--------+
    19 | 0            | 172.16.0.1 | ONLINE |
    20 | 1            | 172.16.0.3 | ONLINE |
    21 +--------------+------------+--------+
    22 2 rows in set (0.00 sec)
    View Code

    delete和set OFFLINE_HARD实质上一样的,当执行了LOAD MYSQL SERVERS TO RUNTIME后,Hostgroup_Manager将会发现后台有服务被delete掉了并且内部会将他标记为OFFLINE_HARD。

    参考文档

  • 相关阅读:
    Android 编程下 Eclipse 恢复被删除的文件
    Android 编程下背景图片适配工具类
    Android 编程下 Managing Your App's Memory
    Android 编程下代码之(QQ消息列表滑动删除)
    Android 编程下 Canvas and Drawables
    Android 编程下 AlarmManager
    Android 编程下去除 ListView 上下边界蓝色或黄色阴影
    Java 编程下字符串的 16 位、32位 MD5 加密
    C#枚举类型和int类型相互转换
    MVC和普通三层架构的区别
  • 原文地址:https://www.cnblogs.com/geek-ace/p/9555315.html
Copyright © 2011-2022 走看看