精华内容
下载资源
问答
  • mysql读写分离中间件
    2021-01-18 19:13:24

    上边介绍了mysql的主从模型,可以提升数据库服务器的性能,保证数据的完整性和可靠性,但是呢,如果说仅此而已的话,那么master依旧会承担巨大的访问和写操作的压力,以至于我们提升又到达一个新的瓶颈。借此,介绍一个可实行读写分离的MySQL的中间件——ProxySQL,依赖于主从模型之上,可以让用户的访问操作发送到slave上,写操作发送到master,这样我们的master的压力就会得到一定的提升;

    ProxySQL是一个基于C++开发的高性能轻量级产品,是一款强大的mysql的中间件,他可以实现多种方式的读写分离。

    Master IP:172.16.75.4    CentOS 7.5D        server_id:401

    Slave IP:172.16.75.3       CentOS 7.5C         server_id:301

    1.首先,yum安装即可,然后启动,启动端口为6032(我的proxysql安装在了master上);[root@slave2 ~]# ss -tnl

    State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port

    LISTEN     0      50                           *:3306                                     *:*

    LISTEN     0      128                          *:111                                      *:*

    LISTEN     0      128                          *:6032                                     *:*

    LISTEN     0      128                          *:6033                                     *:*

    LISTEN     0      128                          *:6033                                     *:*

    LISTEN     0      128                          *:6033                                     *:*

    LISTEN     0      128                          *:6033                                     *:*

    2.使用mysql客户端工具登录proxysql,用户名和密码都是admin,端口为6032,默认不允许localhost登录,所以要用127.0.0.1IP地址登录;[root@slave2 ~]# mysql -uadmin  -padmin -h127.0.0.1  -P6032

    Welcome to the MariaDB monitor.  Commands end with ; or \g.

    Your MySQL connection id is 2

    Server version: 5.5.30 (ProxySQL Admin Module)

    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    MySQL [(none)]> 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)

    3.主要介绍其中mian库和monitor库;MySQL [(none)]> show tables from main;

    +--------------------------------------------+

    | tables                                     |

    +--------------------------------------------+

    | global_variables                           |

    | mysql_collations                           |

    | mysql_group_replication_hostgroups         |

    | mysql_query_rules                          |

    | mysql_query_rules_fast_routing             |

    | mysql_replication_hostgroups               |

    | mysql_servers                              |  插入监控节点,master节点和slave节点

    | mysql_users                                |

    | proxysql_servers                           |

    | runtime_checksums_values                   |

    | runtime_global_variables                   |

    | runtime_mysql_group_replication_hostgroups |

    | runtime_mysql_query_rules                  |

    | runtime_mysql_query_rules_fast_routing     |

    | runtime_mysql_replication_hostgroups       |

    | runtime_mysql_servers                      |

    | runtime_mysql_users                        |

    | runtime_proxysql_servers                   |

    | runtime_scheduler                          |

    | scheduler                                  |

    +--------------------------------------------+

    20 rows in set (0.00 sec)

    4.在mysql_servers表中有几个重要的属性:

    hostgroup_id:组ID,用于区分master和slave;

    hostname:后端master和slave的IP地址;

    port:后端master和slave的IP端口,默认3306;

    MySQL [main]> insert into mysql_servers (hostgroup_id,hostname,port) values (10,'172.16.75.4',3306),(20,'172.16.75.3',3306);

    Query OK, 2 rows affected (0.02 sec)

    MySQL [main]> load mysql servers to runtime;

    Query OK, 0 rows affected (0.01 sec)

    MySQL [main]> save mysql servers to disk;

    Query OK, 0 rows affected (0.06 sec)

    注意:

    1.设置的master的hostgroup_id为10(写组);

    2.设置的slave的hostgroup_id为20(读组);

    3.每次在proxysql执行完操作之后,需要手动加载至内存上,然后手动保存至磁盘上,表名中的”_”改为空格; mysql_servers à mysql servers

    5.在master上授权一个监控用户,用于监控后端的节点(注意:是master的mysql,不是Proxysql);

    这个用户需要的权限:replication client和replication slaveMariaDB [(none)]> grant replication client,replication slave on *.* to 'monitor'@'%' identified by '123456';

    Query OK, 0 rows affected (0.02 sec)

    6.在proxysql上加入该节点;MySQL [main]> set mysql-monitor_username='monitor';

    Query OK, 1 row affected (0.00 sec)

    MySQL [main]> set mysql-monitor_password='123456';

    Query OK, 1 row affected (0.00 sec)

    MySQL [main]> load mysql variables to runtime;

    Query OK, 0 rows affected (0.00 sec)

    MySQL [main]> save mysql variables to disk;

    Query OK, 95 rows affected (0.03 sec)

    通过查看表mysql_server_ping_log了解后端服务器状态信息;MySQL [main]> select * from mysql_server_ping_log limit 1,10;

    +-------------+------+------------------+----------------------+----------------------------------------------------------------------+

    | hostname    | port | time_start_us    | ping_success_time_us | ping_error                                                           |

    +-------------+------+------------------+----------------------+----------------------------------------------------------------------+

    | 172.16.75.4 | 3306 | 1541505676594192 | 0                    | Access denied for user 'monitor'@'172.16.75.4' (using password: YES) |

    | 172.16.75.3 | 3306 | 1541505686592082 | 0                    | Host '172.16.75.4' is not allowed to connect to this MariaDB server  |

    | 172.16.75.4 | 3306 | 1541505686594872 | 0                    | Access denied for user 'monitor'@'172.16.75.4' (using password: YES) |

    | 172.16.75.3 | 3306 | 1541505696592635 | 0                    | Host '172.16.75.4' is not allowed to connect to this MariaDB server  |

    | 172.16.75.4 | 3306 | 1541505696595442 | 0                    | Access denied for user 'monitor'@'172.16.75.4' (using password: YES) |

    | 172.16.75.3 | 3306 | 1541505706593101 | 0                    | Host '172.16.75.4' is not allowed to connect to this MariaDB server  |

    | 172.16.75.4 | 3306 | 1541505706596427 | 0                    | Access denied for user 'monitor'@'172.16.75.4' (using password: YES) |

    | 172.16.75.3 | 3306 | 1541505716593471 | 0                    | Host '172.16.75.4' is not allowed to connect to this MariaDB server  |

    | 172.16.75.4 | 3306 | 1541505716596416 | 0                    | Access denied for user 'monitor'@'172.16.75.4' (using password: YES) |

    | 172.16.75.3 | 3306 | 1541505726593810 | 0                    | Host '172.16.75.4' is not allowed to connect to this MariaDB server  |

    +-------------+------+------------------+----------------------+----------------------------------------------------------------------+

    10 rows in set (0.00 sec)

    7.对后端定义的服务器的分组进行读组和写组的设定,mysql_replication_hostgroups表中添加定义即可,通过查看monitor库中的mysql_server_read_only_log表查看后端节点是否具有read_only权限;MySQL [main]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) values (10,20);

    Query OK, 1 row affected (0.00 sec)

    MySQL [main]> load mysql servers to runtime;

    Query OK, 0 rows affected (0.00 sec)

    MySQL [main]> save mysql servers to disk;

    Query OK, 0 rows affected (0.03 sec)

    MySQL [main]> select * from monitor.mysql_server_read_only_log limit 3;

    +-------------+------+------------------+-----------------+-----------+-------+

    | hostname    | port | time_start_us    | success_time_us | read_only | error |

    +-------------+------+------------------+-----------------+-----------+-------+

    | 172.16.75.4 | 3306 | 1541506648164762 | 766             | 0         | NULL  |

    | 172.16.75.3 | 3306 | 1541506648162822 | 3585            | 1         | NULL  |

    | 172.16.75.3 | 3306 | 1541506649664049 | 993             | 1         | NULL  |

    +-------------+------+------------------+-----------------+-----------+-------+

    3 rows in set (0.00 sec)

    8.至此,基本配置完毕,我们在后端的master上创建两个用户账户,在proxysql上添加不同的hostgroup_id,完成基于不同用户之间进行读写分离;

    Master mysql:MariaDB [(none)]> grant all on *.* to 'reader'@'%' identified by  '123456';

    Query OK, 0 rows affected (0.01 sec)

    MariaDB [(none)]> grant all on *.* to 'writer'@'%' identified by  '123456';

    Query OK, 0 rows affected (0.00 sec)

    Proxysql:MySQL [main]> insert into mysql_users (username,password,default_hostgroup) values ('reader','123456',20),('writer','123456',10);

    Query OK, 2 rows affected (0.00 sec)

    MySQL [main]> load mysql users to runtime;

    Query OK, 0 rows affected (0.01 sec)

    MySQL [main]> save mysql users to disk;

    Query OK, 0 rows affected (0.03 sec)

    MySQL [main]> select * from mysql_users\G

    *************************** 1. row ***************************

    username: reader

    password: 123456

    active: 1

    use_ssl: 0

    default_hostgroup: 20

    default_schema: NULL

    schema_locked: 0

    transaction_persistent: 1

    fast_forward: 0

    backend: 1

    frontend: 1

    max_connections: 10000

    *************************** 2. row ***************************

    username: writer

    password: 123456

    active: 1

    use_ssl: 0

    default_hostgroup: 10

    default_schema: NULL

    schema_locked: 0

    transaction_persistent: 1

    fast_forward: 0

    backend: 1

    frontend: 1

    max_connections: 10000

    2 rows in set (0.00 sec)

    8.任意一台主机,测试基于用户的读写分离机制;[root@slave2 ~]# mysql -uwriter -h172.16.75.4 -P6033 -p123456 -e 'select @@server_id';

    +-------------+

    | @@server_id |

    +-------------+

    |         401 |

    +-------------+

    [root@slave2 ~]# mysql -ureader -h172.16.75.4 -P6033 -p123456 -e 'select @@server_id';

    +-------------+

    | @@server_id |

    +-------------+

    |         301 |

    +-------------+

    9.基于SQL语句实现读写分离;

    需要在mysql_query_rules表中添加两条正则表达式的规则;MySQL [main]> insert into mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) values (1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);

    Query OK, 2 rows affected (0.00 sec)

    MySQL [main]> load mysql query rules to runtime;

    Query OK, 0 rows affected (0.00 sec)

    MySQL [main]> save mysql query rules to disk;

    Query OK, 0 rows affected (0.02 sec)

    10.任意一台主机测试基于SQL语句读写分离的机制;[root@slave2 ~]# mysql -ureader -h172.16.75.4 -P6033 -p123456 -e 'set @@autocommit=0;\

    start transaction;\

    use hellodb;\

    insert into coc (ID,ClassID,CourseID) values (100,100,100);\

    select @@server_id;\

    commit;'

    +-------------+

    | @@server_id |

    +-------------+

    |         301 |

    +-------------+

    Master中的hellodb数据库进行查看;MariaDB [hellodb]> select * from coc;

    +----+---------+----------+

    | ID | ClassID | CourseID |

    +----+---------+----------+

    |  1 |       1 |        2 |

    |  2 |       1 |        5 |

    |  3 |       2 |        2 |

    |  4 |       2 |        6 |

    |  5 |       3 |        1 |

    |  6 |       3 |        7 |

    |  7 |       4 |        5 |

    |  8 |       4 |        2 |

    |  9 |       5 |        1 |

    | 10 |       5 |        9 |

    | 11 |       6 |        3 |

    | 12 |       6 |        4 |

    | 13 |       7 |        4 |

    | 14 |       7 |        3 |

    +----+---------+----------+

    14 rows in set (0.00 sec)

    MariaDB [hellodb]> select * from coc;

    +-----+---------+----------+

    | ID  | ClassID | CourseID |

    +-----+---------+----------+

    |   1 |       1 |        2 |

    |   2 |       1 |        5 |

    |   3 |       2 |        2 |

    |   4 |       2 |        6 |

    |   5 |       3 |        1 |

    |   6 |       3 |        7 |

    |   7 |       4 |        5 |

    |   8 |       4 |        2 |

    |   9 |       5 |        1 |

    |  10 |       5 |        9 |

    |  11 |       6 |        3 |

    |  12 |       6 |        4 |

    |  13 |       7 |        4 |

    |  14 |       7 |        3 |

    | 100 |     100 |      100 |

    +-----+---------+----------+

    15 rows in set (0.00 sec)

    对于数据库服务器来说,保证查询高效的速度的同时也需要保证不俗的写入操作,因此,读写分离对提升数据库性能来说显得尤为重要,这关系到用户的体验,所以,MySQL的中间件——ProxySQL,就对在生产环境中显得那么必不可少,毕竟提升体验的好东西。

    更多相关内容
  • MySQL读写分离中间件Atlas一、读写分离工具1.set global read_only=1;(这是之前遇到过的一种读写方法 但是用了只读MHA就用不了了)2.AtlasAtlas 类似于lb代理二、Atlas简介​ Atlas是由 Qihoo 360, Web平台部基础架构...

    MySQL读写分离中间件Atlas

    一、读写分离工具

    1.set global read_only=1;

    (这是之前遇到过的一种读写方法 但是用了只读MHA就用不了了)

    2.Atlas

    Atlas 类似于lb代理

    二、Atlas简介

    ​ Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。

    它是在mysql-proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性,对其进行了优化。

    360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。

    下载地址

    https://github.com/Qihoo360/Atlas/releases

    注意:

    1、Atlas只能安装运行在64位的系统上

    2、Centos 5.X安装 Atlas-XX.el5.x86_64.rpm,Centos 6.X安装Atlas-XX.el6.x86_64.rpm。

    3、后端mysql版本应大于5.1,建议使用Mysql 5.6以上

    三、Atlas主要功能

    1.读写分离

    2.从库负载均衡

    3.IP过滤

    4.自动分表

    5.DBA可平滑上下线DB

    6.自动摘除宕机的DB

    四、Atlas相对于官方MySQL-Proxy的优势

    1.将主流程中所有Lua代码用C重写,Lua仅用于管理接口

    2.重写网络模型、线程模型

    3.实现了真正意义上的连接池

    4.优化了锁机制,性能提高数十倍

    五、Atlas安装与配置

    官方提供的Atlas有两种:

    1)Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm

    2)Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm

    这里我们只需要下载普通的即可。

    安装Atlas

    # 1.db04直接拖入下载好的包 rpm下载

    [root@db04 ~]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

    Preparing... ################################# [100%]

    Updating / installing...

    1:Atlas-2.2.1-1 ################################# [100%]

    不需要任何其他的操作 直接rpm

    配置Atlas

    # 1.进入Atlas工具目录

    [root@db04 ~]# cd /usr/local/mysql-proxy/

    [root@db04 /usr/local/mysql-proxy]# ll

    drwxr-xr-x 2 root root 75 Dec 18 11:38 bin

    drwxr-xr-x 2 root root 22 Dec 18 11:43 conf

    drwxr-xr-x 3 root root 331 Dec 18 11:38 lib

    drwxr-xr-x 2 root root 6 Dec 17 2014 log

    # 2.生成密码 (配置文件里需要)

    [root@db04 /usr/local/mysql-proxy]# cd bin

    [root@db04 /usr/local/mysql-proxy/bin]# ll

    -rwxr-xr-x 1 root root 9696 Dec 17 2014 encrypt

    -rwxr-xr-x 1 root root 23564 Dec 17 2014 mysql-proxy

    -rwxr-xr-x 1 root root 1552 Dec 17 2014 mysql-proxyd

    -rw-r--r-- 1 root root 6 Dec 17 2014 VERSION

    [root@db04 /usr/local/mysql-proxy/bin]# ./encrypt 123

    3yb5jEku5h4=

    这就是密码为123的配置密码 密码是什么就写什么 自动生成

    # 3.修改配置

    [root@db04 ~]# vim /usr/local/mysql-proxy/conf/test.cnf

    #管理接口的用户名

    admin-username = user

    #管理接口的密码

    admin-password = pwd

    #Atlas监听的管理接口IP和端口

    admin-address = 0.0.0.0:2345

    #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔

    proxy-backend-addresses = 10.0.0.52:3306 【我主库现在是52】

    #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔

    proxy-read-only-backend-addresses = 10.0.0.51:3306,10.0.0.53:3306,10.0.0.54:3306

    #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!

    pwds = rep:3yb5jEku5h4=,mha:O2jBXONX098=

    #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。

    daemon = true

    #设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。

    keepalive = true

    #工作线程数,对Atlas的性能有很大影响,可根据情况适当设置

    event-threads = 8 【一般根据cpu核心数】

    #日志级别,分为message、warning、critical、error、debug五个级别

    log-level = error

    #日志存放的路径

    log-path = /usr/local/mysql-proxy/log

    #SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF

    sql-log = ON

    #慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志>。

    sql-log-slow = 10

    #实例名称,用于同一台机器上多个Atlas实例间的区分

    instance = test 【一般根据项目名命名实例名称】

    #Atlas监听的工作接口IP和端口

    proxy-address = 0.0.0.0:3307

    【按道理来说是3306 但是端口冲突了 临时改成3307 工作一般配3306 修改你mysql,主从,MHA等端口 】

    【因为以后的程序都是连3306的】

    #分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项

    #tables = person.mt.id.3

    #默认字符集,设置该项后客户端不再需要执行SET NAMES语句

    charset = utf8

    #允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连>接

    #client-ips = 127.0.0.1, 192.168.1

    #Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置

    #lvs-ips = 192.168.1.1

    # 4.启动Atlas

    [root@db04~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start

    OK: MySQL-Proxy of test is started

    # 5.修改项目名称

    [root@db04 ~]# vim /usr/local/mysql-proxy/conf/test.cnf

    instance = msy

    # 6.启动Atlas

    [root@db04 /usr/local/mysql-proxy/conf]# mv test.cnf msy.cnf

    [root@db04~]# /usr/local/mysql-proxy/bin/mysql-proxyd msy start

    # 7.可以多实例配置

    [root@db04 /usr/local/mysql-proxy/conf]# ll

    -rw-r--r-- 1 root root 2819 Dec 18 15:18 test.cnf

    [root@db04 /usr/local/mysql-proxy/conf]# cp test.cnf msy.cnf

    [root@db04 /usr/local/mysql-proxy/conf]# ll

    -rw-r--r-- 1 root root 2819 Dec 18 15:32 msy.cnf

    -rw-r--r-- 1 root root 2819 Dec 18 15:18 test.cnf

    [root@db04 /usr/local/mysql-proxy/conf]# vim msy.cnf

    #实例名称,用于同一台机器上多个Atlas实例间的区分

    instance = msy

    #Atlas监听的工作接口IP和端口

    proxy-address = 0.0.0.0:3308

    #Atlas监听的管理接口IP和端口

    admin-address = 0.0.0.0:6666

    [root@db04 /usr/local/mysql-proxy/conf]#/usr/local/mysql-proxy/bin/mysql-proxyd msy start

    OK: MySQL-Proxy of msy is started

    # 8.查看端口

    [root@db04 /usr/local/mysql-proxy/conf]# netstat -lntp

    Active Internet connections (only servers)

    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

    tcp 0 0 0.0.0.0:2345 0.0.0.0:* LISTEN 3972/mysql-proxy

    tcp 0 0 0.0.0.0:6666 0.0.0.0:* LISTEN 4005/mysql-proxy

    tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 3972/mysql-proxy

    tcp 0 0 0.0.0.0:3308 0.0.0.0:* LISTEN 4005/mysql-proxy

    # 9.db01连接数据库

    [root@db01 ~]# mysql -urep -p123 -h10.0.0.54 -P3307

    mysql>

    【用户名和密码是你在配置文件里加上的 就算root授权 配置里没加 就不能连】

    Atlas管理操作

    # 1.连接Atlas管理接口 用atlas管理用户登录

    [root@db04 ~]# mysql -uuser -ppwd -h127.0.0.1 -P2345

    # 2.查看可用命令帮助

    mysql> show databases;

    ERROR 1105 (07000): use 'SELECT * FROM help' to see the supported commands

    mysql> SELECT * FROM help;

    +----------------------------+---------------------------------------------------------+

    | command | description |

    +----------------------------+---------------------------------------------------------+

    | SELECT * FROM help | shows this help |

    | SELECT * FROM backends | lists the backends and their state |

    | SET OFFLINE $backend_id | offline backend server, $backend_id is backend_ndx's id |

    | SET ONLINE $backend_id | online backend server, ... |

    | ADD MASTER $backend | example: "add master 127.0.0.1:3306", ... |

    | ADD SLAVE $backend | example: "add slave 127.0.0.1:3306", ... |

    | REMOVE BACKEND $backend_id | example: "remove backend 1", ... |

    | SELECT * FROM clients | lists the clients |

    | ADD CLIENT $client | example: "add client 192.168.1.2", ... |

    | REMOVE CLIENT $client | example: "remove client 192.168.1.2", ... |

    | SELECT * FROM pwds | lists the pwds |

    | ADD PWD $pwd | example: "add pwd user:raw_password", ... |

    | ADD ENPWD $pwd | example: "add enpwd user:encrypted_password", ... |

    | REMOVE PWD $pwd | example: "remove pwd user", ... |

    | SAVE CONFIG | save the backends to config file |

    | SELECT VERSION | display the version of Atlas |

    +----------------------------+---------------------------------------------------------+

    mysql> SELECT * FROM help;

    +----------------------------+---------------------------------------------------------+

    | command | description |

    +----------------------------+---------------------------------------------------------+

    | SELECT * FROM help | 查看帮助 |

    | SELECT * FROM backends | 查看后端的数据库 |

    | SET OFFLINE $backend_id | 平滑下线DB,set offline 3; |

    | SET ONLINE $backend_id | 平滑上线DB,set online 3; |

    | ADD MASTER $backend | 添加主库,ADD MASTER 10.0.0.55:3306; |

    | ADD SLAVE $backend | 添加从库,ADD SLAVE 10.0.0.54:3306 |

    | REMOVE BACKEND $backend_id | 摘除后端数据库,REMOVE BACKEND 1; |

    | SELECT * FROM clients | 查看可登录的客户端 |

    | ADD CLIENT $client | 添加客户端, ADD CLIENT 192.168.1.1; |

    | REMOVE CLIENT $client | 删除客户端, REMOVE CLIENT 192.168.1.1; |

    | SELECT * FROM pwds | 查看用户名和密码 |

    | ADD PWD $pwd | 添加用户和密码,ADD PWD root:123; 自动加密 |

    | ADD ENPWD $pwd | 添加用户名和密码,ADD ENPWD zls:O2jBXONX098=; 手动加密 |

    | SELECT VERSION | 查看版本号 |

    +----------------------------+---------------------------------------------------------+

    # 查看后端的数据库

    mysql> SELECT * FROM backends;

    +-------------+----------------+-------+------+

    | backend_ndx | address | state | type |

    +-------------+----------------+-------+------+

    | 1 | 10.0.0.52:3306 | up | rw |

    | 2 | 10.0.0.51:3306 | up | ro |

    | 3 | 10.0.0.53:3306 | up | ro |

    | 4 | 10.0.0.54:3306 | up | ro |

    +-------------+----------------+-------+------+

    # 平滑下线DB

    mysql> SET OFFLINE 3;

    +-------------+----------------+---------+------+

    | backend_ndx | address | state | type |

    +-------------+----------------+---------+------+

    | 3 | 10.0.0.53:3306 | offline | ro |

    +-------------+----------------+---------+------+

    mysql> SELECT * FROM backends;

    +-------------+----------------+---------+------+

    | backend_ndx | address | state | type |

    +-------------+----------------+---------+------+

    | 1 | 10.0.0.52:3306 | up | rw |

    | 2 | 10.0.0.51:3306 | up | ro |

    | 3 | 10.0.0.53:3306 | offline | ro |

    | 4 | 10.0.0.54:3306 | up | ro |

    +-------------+----------------+---------+------+

    DB03:

    mysql> show slave status\G

    *************************** 1. row ***************************

    Slave_IO_State: Waiting for master to send event

    Master_Host: 10.0.0.52

    Master_User: rep

    Master_Port: 3306

    Connect_Retry: 60

    Master_Log_File: mysql-bin.000008

    Read_Master_Log_Pos: 120

    Relay_Log_File: db03-relay-bin.000002

    Relay_Log_Pos: 283

    Relay_Master_Log_File: mysql-bin.000008

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    【主从还是好的 offline只是说Atlas不往db03上分配了】

    # 平滑上线DB

    mysql> SET ONLINE 3;

    +-------------+----------------+---------+------+

    | backend_ndx | address | state | type |

    +-------------+----------------+---------+------+

    | 3 | 10.0.0.53:3306 | unknown | ro |

    +-------------+----------------+---------+------+

    mysql> SELECT * FROM backends;

    +-------------+----------------+-------+------+

    | backend_ndx | address | state | type |

    +-------------+----------------+-------+------+

    | 1 | 10.0.0.52:3306 | up | rw |

    | 2 | 10.0.0.51:3306 | up | ro |

    | 3 | 10.0.0.53:3306 | up | ro |

    | 4 | 10.0.0.54:3306 | up | ro |

    +-------------+----------------+-------+------+

    # 添加主库

    mysql> ADD MASTER 10.0.0.55:3306;

    mysql> SELECT * FROM backends;

    +-------------+----------------+-------+------+

    | backend_ndx | address | state | type |

    +-------------+----------------+-------+------+

    | 1 | 10.0.0.52:3306 | up | rw |

    | 2 | 10.0.0.55:3306 | up | rw |

    | 3 | 10.0.0.53:3306 | up | ro |

    | 4 | 10.0.0.54:3306 | up | ro |

    | 5 | 10.0.0.51:3306 | up | ro |

    +-------------+----------------+-------+------+

    【查看配置文件 有没有加上这个主库】

    mysql> system vim /usr/local/mysql-proxy/conf/test.cnf

    proxy-backend-addresses = 10.0.0.52:3306

    【让他在配置文件里添加上】

    mysql> save config;

    mysql> system vim /usr/local/mysql-proxy/conf/test.cnf

    proxy-backend-addresses=10.0.0.52:3306,10.0.0.55:3306

    # 添加客户端

    mysql> ADD CLIENT 192.168.1.1;

    mysql> save config;

    mysql> system vim /usr/local/mysql-proxy/conf/test.cnf

    client-ips = 127.0.0.1, 192.168.1,192.168.1.1

    # 查看客户端

    mysql> SELECT * FROM clients;

    +-------------+

    | client |

    +-------------+

    | 127.0.0.1 |

    | 192.168.1 |

    | 192.168.1.1 |

    +-------------+

    # 删除客户端

    mysql> REMOVE CLIENT 192.168.1.1;

    mysql> save config;

    mysql> system vim /usr/local/mysql-proxy/conf/test.cnf

    client-ips=127.0.0.1,192.168.1

    mysql> SELECT * FROM clients;

    +-----------+

    | client |

    +-----------+

    | 127.0.0.1 |

    | 192.168.1 |

    +-----------+

    # 查看用户名和密码

    mysql> SELECT * FROM pwds;

    +----------+--------------+

    | username | password |

    +----------+--------------+

    | rep | 3yb5jEku5h4= |

    | mha | O2jBXONX098= |

    +----------+--------------+

    # 添加用户和密码 自动加密

    mysql> ADD PWD root:123;

    mysql> SELECT * FROM pwds;

    +----------+--------------+

    | username | password |

    +----------+--------------+

    | rep | 3yb5jEku5h4= |

    | mha | O2jBXONX098= |

    | root | 3yb5jEku5h4= |

    +----------+--------------+

    # 手动加密

    mysql> ADD ENPWD msy:O2jBXONX098=;

    mysql> SELECT * FROM pwds;

    +----------+--------------+

    | username | password |

    +----------+--------------+

    | rep | 3yb5jEku5h4= |

    | mha | O2jBXONX098= |

    | root | 3yb5jEku5h4= |

    | msy | O2jBXONX098= |

    +----------+--------------+

    # 删除用户

    mysql> remove pwd root;

    mysql> remove pwd msy;

    mysql> SELECT * FROM pwds;

    +----------+--------------+

    | username | password |

    +----------+--------------+

    | rep | 3yb5jEku5h4= |

    | mha | O2jBXONX098= |

    +----------+--------------+

    # 查看版本号

    mysql> SELECT VERSION;

    +---------+

    | version |

    +---------+

    | 2.2.1 |

    +---------+

    生产环境

    # 假设现主库52宕机 54被提升为主库

    ## 查看后端数据库 注意id 会变

    mysql> SELECT * FROM backends;

    +-------------+----------------+-------+------+

    | backend_ndx | address | state | type |

    +-------------+----------------+-------+------+

    | 1 | 10.0.0.52:3306 | up | rw |

    | 2 | 10.0.0.55:3306 | up | rw |

    | 3 | 10.0.0.53:3306 | up | ro |

    | 4 | 10.0.0.54:3306 | up | ro |

    | 5 | 10.0.0.51:3306 | up | ro |

    +-------------+----------------+-------+------+

    ## 52宕机 摘除52

    mysql> REMOVE BACKEND 1;

    mysql> SELECT * FROM backends;

    +-------------+----------------+-------+------+

    | backend_ndx | address | state | type |

    +-------------+----------------+-------+------+

    | 1 | 10.0.0.55:3306 | up | rw |

    | 2 | 10.0.0.53:3306 | up | ro |

    | 3 | 10.0.0.54:3306 | up | ro |

    | 4 | 10.0.0.51:3306 | up | ro |

    +-------------+----------------+-------+------+

    mysql> save config;

    proxy-backend-addresses=10.0.0.55:3306

    ## 54提生为主库 所以要把现在从库的54摘掉 52恢复到从库

    mysql> remove backend 3;

    mysql> add slave 10.0.0.52:3306;

    mysql> save config;

    mysql> system vim /usr/local/mysql-proxy/conf/test.cnf

    ## 添加主库54

    mysql> add master 10.0.0.54:3306;

    mysql> save config;

    mysql> system vim /usr/local/mysql-proxy/conf/test.cnf

    proxy-backend-addresses=10.0.0.55:3306,10.0.0.54:3306

    mysql> SELECT * FROM backends;

    +-------------+----------------+-------+------+

    | backend_ndx | address | state | type |

    +-------------+----------------+-------+------+

    | 1 | 10.0.0.55:3306 | up | rw |

    | 2 | 10.0.0.54:3306 | up | rw |

    | 3 | 10.0.0.51:3306 | up | ro |

    | 4 | 10.0.0.52:3306 | up | ro |

    | 5 | 10.0.0.53:3306 | up | ro |

    +-------------+----------------+-------+------+

    生产用户要求

    # 开发人员申请一个应用用户 app( select update insert) 密码123456,要通过10网段登录

    1. 在主库中,创建用户

    grant select ,update,insert on *.* to app@'10.0.0.%' identified by '123456';

    2. 在atlas中添加生产用户

    /usr/local/mysql-proxy/bin/encrypt 123456 ---->制作加密密码

    vim test.cnf

    pwds = repl:3yb5jEku5h4=,mha:O2jBXONX098=,app:/iZxz+0GRoA=

    3. 重启atlas

    /usr/local/mysql-proxy/bin/mysql-proxyd test restart

    [root@db03 conf]# mysql -uapp -p123456 -h 10.0.0.53 -P 33060

    展开全文
  • 在linux下用于部署读写分离中间件maxscale。它是实现mysql数据库的读写分离
  • mysql实现读写分离的方式mysql 实现读写分离的方式有以下几种:程序修改mysql操作,直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配,需要开发人员协助。amoeba,直接实现读写分离和...

    mysql实现读写分离的方式

    mysql 实现读写分离的方式有以下几种:

    程序修改mysql操作,直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配,需要开发人员协助。

    amoeba,直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案,自己分配账户,和后端数据库权限管理独立,权限处理不够灵活。

    mysql-proxy,直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号,效率低

    mycat中间件

    proxysql中间件(推荐使用)

    ProxySQL简介

    ProxySQL 是一款可以实际用于生产环境的 MySQL 中间件,它有官方版和 percona 版两种。percona版是在官方版的基础上修改的,添加了几个比较实用的工具。生产环境建议用官方版。

    ProxySQL 是用 C++ 语言开发的,虽然也是一个轻量级产品,但性能很好(据测试,能处理千亿级的数据),功能也足够,能满足中间件所需的绝大多数功能,包括:

    最基本的读/写分离,且方式有多种

    可定制基于用户、基于schema、基于语句的规则对SQL语句进行路由。换句话说,规则很灵活。基于schema和与语句级的规则,可以实现简单的sharding(分库分表)

    可缓存查询结果。虽然ProxySQL的缓存策略比较简陋,但实现了基本的缓存功能,绝大多数时候也够用了。此外,作者已经打算实现更丰富的缓存策略

    监控后端节点。ProxySQL可以监控后端节点的多个指标,包括:ProxySQL和后端的心跳信息,后端节点的read-only/read-write,slave和master的数据同步延迟性(replication lag)

    ProxySQL安装

    [root@Lynk ~]# cat <

    [proxysql_repo]

    name= ProxySQL

    baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/7

    gpgcheck=1

    gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key

    EOF

    [root@Lynk ~]# yum -y install proxysql

    ProxySQL的Admin管理接口

    当 ProxySQL 启动后,将监听两个端口:

    admin管理接口,默认端口为6032。该端口用于查看、配置ProxySQL

    接收SQL语句的接口,默认端口为6033,这个接口类似于MySQL的3306端口

    ProxySQL 的 admin 管理接口是一个使用 MySQL 协议的接口,所以,可以直接使用 mysql 客户端、navicat 等工具去连接这个管理接口,其默认的用户名和密码均为 admin

    例如,使用 mysql 客户端去连接 ProxySQL 的管理接口:

    [root@localhost src]# systemctl start proxysql

    [root@localhost src]# mysql -uadmin -padmin -h127.0.0.1 -P6032

    mysql: [Warning] Using a password on the command line interface can be insecure.

    Welcome to the MySQL monitor. Commands end with ; or \g.

    Your MySQL connection id is 1

    Server version: 5.5.30 (ProxySQL Admin Module)

    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its

    affiliates. Other names may be trademarks of their respective

    owners.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    mysql> 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)

    由于 ProxySQL 的配置全部保存在几个自带的库中,所以通过管理接口,可以非常方便地通过发送一些SQL命令去修改 ProxySQL 的配置。 ProxySQL 会解析通过该接口发送的某些对ProxySQL 有效的特定命令,并将其合理转换后发送给内嵌的 SQLite3 数据库引擎去运行

    ProxySQL 的配置几乎都是通过管理接口来操作的,通过 Admin 管理接口,可以在线修改几乎所有的配置并使其生效。只有两个变量的配置是必须重启 ProxySQL 才能生效的,它们是:

    mysql-threads 和 mysql-stacksize

    admin管理接口相关的变量

    admin-admin_credentials

    admin-admin_credentials 变量控制的是admin管理接口的管理员账户。默认的管理员账户和密码为admin:admin,但是这个默认的用户只能在本地使用。如果想要远程连接到ProxySQL,例如用windows上的navicat连接Linux上的ProxySQL管理接口,必须自定义一个管理员账户。

    添加管理员帐户

    #查看当前管理员账户的用户名密码

    mysql> select @@admin-admin_credentials;

    +---------------------------+

    | @@admin-admin_credentials |

    +---------------------------+

    | admin:admin |

    +---------------------------+

    1 row in set (0.00 sec)

    #添加一个用户名为myadmin,密码为lynk123的管理员账户

    mysql> set admin-admin_credentials='admin:admin;myadmin:lynk123';

    Query OK, 1 row affected (0.00 sec)

    #使改变立即生效

    mysql> load admin variables to runtime;

    Query OK, 0 rows affected (0.00 sec)

    #永久化保存所进行的改变

    mysql> save admin variables to disk;

    Query OK, 31 rows affected (0.02 sec)

    #使用我们刚刚添加的管理员登录mysql

    [root@localhost src]# mysql -umyadmin -plynk123 -h127.0.0.1 -P6032

    mysql: [Warning] Using a password on the command line interface can be insecure.

    Welcome to the MySQL monitor. Commands end with ; or \g.

    Your MySQL connection id is 2

    Server version: 5.5.30 (ProxySQL Admin Module)

    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its

    affiliates. Other names may be trademarks of their respective

    owners.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    #所有的配置操作都是在修改main库中对应的表

    mysql> select * from global_variables where variable_name='admin-admin_credentials';

    +-------------------------+-----------------------------+

    | variable_name | variable_value |

    +-------------------------+-----------------------------+

    | admin-admin_credentials | admin:admin;myadmin:lynk123 |

    +-------------------------+-----------------------------+

    1 row in set (0.00 sec)

    必须要区分admin管理接口的用户名和mysql_users中的用户名

    admin管理接口的用户是连接到管理接口(默认端口6032)上用来管理、配置ProxySQL的

    mysql_users表中的用户名是应用程序连接ProxySQL(默认端口6033),以及ProxySQL连接后端MySQL Servers使用的用户。它的作用是发送、路由SQL语句,类似于MySQL Server的3306端口。所以,这个表中的用户必须已经在后端MySQL Server上存在且授权了

    admin管理接口的用户必须不能存在于mysql_users中,这是出于安全的考虑,防止通过admin管理接口用户猜出mysql_users中的用户

    admin-stats_credentials

    admin-stats_credentials 变量控制admin管理接口的普通用户,这个变量中的用户没有超级管理员权限,只能查看monitor库和main库中关于统计的数据,其它库都是不可见的,且没有任何写权限

    默认的普通用户名和密码均为 stats ,与admin一样,它默认也只能用于本地登录,若想让人远程查看则要添加查看的专有用户

    mysql> select @@admin-stats_credentials;

    +---------------------------+

    | @@admin-stats_credentials |

    +---------------------------+

    | stats:stats |

    +---------------------------+

    1 row in set (0.00 sec)

    #添加一个普通用户

    mysql> set admin-stats_credentials='stats:stats;mystats:lynk234';

    Query OK, 1 row affected (0.00 sec)

    mysql> select @@admin-stats_credentials;

    +-----------------------------+

    | @@admin-stats_credentials |

    +-----------------------------+

    | stats:stats;mystats:lynk234 |

    +-----------------------------+

    1 row in set (0.00 sec)

    mysql> load admin variables to runtime;

    Query OK, 0 rows affected (0.00 sec)

    mysql> save admin variables to disk;

    Query OK, 31 rows affected (0.01 sec)

    同样,这个变量中的用户必须不能存在于mysql_users表中

    admin-mysql_ifaces

    admin-mysql_ifaces 变量指定admin接口的监听地址,格式为冒号分隔的hostname:port列表。默认监听在 0.0.0.0:6032

    注意,允许使用UNIX的domain socket进行监听,这样本主机内的应用程序就可以直接被处理。

    例如:

    mysql> SET admin-mysql_ifaces='0.0.0.0:6032;/tmp/proxysql_admin.sock';

    Query OK, 1 row affected (0.00 sec)

    mysql> load admin variables to runtime;

    Query OK, 0 rows affected (0.00 sec)

    mysql> save admin variables to disk;

    Query OK, 31 rows affected (0.04 sec)

    多层配置系统

    proxysql中的库

    使用ProxySQL的Admin管理接口连上ProxySQL,可查看ProxySQL拥有的库

    [root@localhost src]# mysql -umyadmin -plynk123 -h127.0.0.1 -P6032

    ...

    mysql> 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最主要的库,是需要修改配置时使用的库,它其实是一个内存数据库系统。所以,修改main库中的配置后,必须将其持久化到disk上才能永久保存

    disk库是磁盘数据库,该数据库结构和内存数据库完全一致。当持久化内存数据库中的配置时,其实就是写入到disk库中。磁盘数据库的默认路径为 $DATADIR/proxysql.db

    stats库是统计信息库。这个库中的数据一般是在检索其内数据时临时填充的,它保存在内存中。因为没有相关的配置项,所以无需持久化

    monitor库是监控后端MySQL节点相关的库,该库中只有几个log类的表,监控模块收集到的监控信息全都存放到对应的log表中

    stats_history库是1.4.4版新增的库,用于存放历史统计数据。默认路径为 $DATADIR/proxysql_stats.db

    ProxySQL多层配置系统

    ProxySQL 的配置系统非常强大,它能在线修改几乎所有配置(仅有的两个需要重启才能生效的变量为 mysql-threads 和 mysql-stacksize ),并在线生效、持久化保存。这得益于它采用的多层配置系统。

    多层配置系统结构如下:

    +-------------------------+ [1] :将内存数据库中的配置加载到RUNTIME数据结构中

    | RUNTIME | LOAD XXX FROM MEMORY

    +-------------------------+ LOAD XXX TO RUNTIME

    /|\ |

    | | [2] :将RUNTIME数据结构中的配置持久化到内存数据库中

    [1] | [2] | SAVE XXX FROM RUNTIME

    | \|/ SAVE XXX TO MEMORY

    +-------------------------+

    | MEMORY | [3] :将磁盘数据库中的配置加载到内存数据库中

    +-------------------------+ _ LOAD XXX FROM DISK

    /|\ | |\ LOAD XXX TO MEMORY

    | | \

    [3] | [4] | \ [5] [4] :将内存数据库中的配置持久化到磁盘数据库中

    | \|/ \ SAVE XXX FROM MEMORY

    +-------------------------+ +---------------+ SAVE XXX TO DISK

    | DISK | | CONFIG FILE |

    +-------------------------+ +---------------+ [5] :从传统配置文件中读取配置加载到内存数据库中

    LOAD XXX FROM CONFIG

    最底层的是 disk 库和 config file 。这里需要注意,这里的 config file 就是传统的配置文件,默认为 /etc/proxysql.cnf , ProxySQL 启动时,主要是从 disk 库中读取配置加载到内存并最终加载到 runtime 生效,只有极少的几个特定配置内容是从 config file 中加载的,除非是第一次初始化 ProxySQL 运行环境(或者disk库为空)。

    中间层的是 memory ,表示的是内存数据库,其实就是 main 库。通过管理接口修改的所有配置,都保存在内存数据库(main)中。当 ProxySQL 重启或者崩溃时,这个内存数据库中的数据会丢失,所以需要 save 到 disk 库中。

    最上层的是 runtime ,它是 ProxySQL 有关线程运行时读取的数据结构。换句话说,该数据结构中的配置都是已生效的配置。所以,修改了 main 库中的配置后,必须 load 到 runtime 数据结构中才能使其生效。

    在上面的多层配置系统图中,标注了[1]、[2]、[3]、[4]、[5]的序号。每个序号都有两个操作方向from/to,其实只是所站角度不同而已。

    DISK/MEMORY/RUNTIME/CONFIG 可以缩写,只要能识别即可。例如MEMORY可以缩写为MEM,runtime可以缩写为run

    另外,上面的XXX是什么?这表示要加载/保存的是哪类配置。目前的ProxySQL支持以下几种:

    mysql users

    mysql servers

    mysql variables

    mysql query rules

    admin variables

    scheduler

    proxysql_servers:目前ProxySQL集群功能还处于实验阶段,所以该类配置不应该去使用

    这些从main库或disk库中就可以查看到

    MySQL [(none)]> show tables from disk;

    +------------------------------------+

    | tables |

    +------------------------------------+

    | global_variables | # (1)包含两类变量,以amdin-开头的表示admin variables,以mysql-开头的表示mysql variables。修改哪类变量,前文的XXX就代表哪类

    | mysql_collations | # (N)只是一张表,保存的是ProxySQL支持的字符集和排序规则,它是不用修改的

    | mysql_group_replication_hostgroups | # (2)对应mysql servers

    | mysql_query_rules | # (3)对应mysql query rules

    | mysql_query_rules_fast_routing | # (4)对应mysql query rules

    | mysql_replication_hostgroups | # (5)对应mysql servers

    | mysql_servers | # (6)对应mysql servers

    | mysql_users | # (7)对应mysql users

    | proxysql_servers | # (8)是ProxySQL的集群配置表,该功能目前还处于实验阶段。

    | scheduler | # (9)对应scheduler

    +------------------------------------+

    10 rows in set (0.00 sec)

    启动ProxySQL时如何加载配置

    如果 ProxySQL 是刚安装的,或者磁盘数据库文件为空(甚至不存在),或者启动 ProxySQL 时使用了选项 --initial,这几种情况启动 ProxySQL 时,都会从传统配置文件 config file 中读取配置加载到内存数据库,并自动 load 到 runtime 数据结构、save到磁盘数据库,这是初始化 ProxySQL 运行环境的过程。

    如果不是第一次启动 ProxySQL ,由于已经存在磁盘数据库文件,这时 ProxySQL 会从磁盘数据库中读取几乎所有的配置(即使传统配置文件中配置了某项,也不会去解析),但有3项是必须从传统配置文件中读取,它们分别是:

    datadir:ProxySQL启动时,必须从配置文件中确定它的数据目录,因为磁盘数据库文件、日志以及其它一些文件是存放在数据目录下的。如果使用/etc/init.d/proxysql管理ProxySQL,则除了修改/etc/proxysql.cnf的datadir,还需要修改该脚本中的datadir。

    restart_on_missing_heartbeats:MySQL线程丢失多少次心跳,就会杀掉这个线程并重启它。默认值为10。

    execute_on_exit_failure:如果设置了该变量,ProxySQL父进程将在每次ProxySQL崩溃的时候执行已经定义好的脚本。建议使用它来生成一些崩溃时的警告和日志。注意,ProxySQL的重启速度可能只有几毫秒,因此很多其它的监控工具可能无法探测到ProxySQL的一次普通故障,此时可使用该变量

    不同类型的读写分离方案解析

    数据库中间件最基本的功能就是实现读写分离, ProxySQL 当然也支持。而且 ProxySQL 支持的路由规则非常灵活,不仅可以实现最简单的读写分离,还可以将读/写都分散到多个不同的组,以及实现分库 sharding (分表sharding的规则比较难写,但也能实现)。

    本文只描述通过规则制定的语句级读写分离,不讨论通过 ip/port, client, username, schemaname 实现的读写分离。

    下面描述了ProxySQL能实现的常见读写分离类型

    最简单的读写分离

    这种模式的读写分离,严格区分后端的master和slave节点,且slave节点必须设置选项read_only=1

    在ProxySQL上,分两个组,一个写组HG=10,一个读组HG=20。同时在ProxySQL上开启monitor模块的read_only监控功能,让ProxySQL根据监控到的read_only值来自动调整节点放在HG=10(master会放进这个组)还是HG=20(slave会放进这个组)

    这种模式的读写分离是最简单的,只需在mysql_users表中设置用户的默认路由组为写组HG=10,并在mysql_query_rules中加上两条简单的规则(一个select for update,一个select)即可

    这种读写分离模式,在环境较小时能满足绝大多数需求。但是需求复杂、环境较大时,这种模式就太过死板,因为一切都是monitor模块控制的

    多个读组或写组的分离模式

    前面那种读写分离模式,是通过 monitor 模块监控 read_only 来调整的,所以每一个后端集群必须只能分为一个写组,一个读组。

    但如果想要区分不同的 select ,并将不同的 select 路由到不同的节点上。例如有些查询语句的开销非常大,想让它们独占一个节点/组,其它查询共享一个节点/组,怎么实现?

    例如,下面这种模式

    看上去非常简单。但是却能适应各种需求。例如,后端做了分库,对某库的查询要路由到特定的主机组

    至于各个主机组是同一个主从集群(下图左边),还是互相独立的主从集群环境(下图右边),要看具体的需求,不过这种读写分离模式都能应付

    在实现这种模式时,前提是不能开启monitor模块的read_only监控功能,也不要设置mysql_replication_hostgroup 表

    例如,下面的配置实现的是上图左边的结构:写请求路由给HG=10,对test1库的select语句路由给HG=20,其它select路由给HG=30

    mysql_servers:

    +--------------+----------+------+--------+--------+

    | hostgroup_id | hostname | port | status | weight |

    +--------------+----------+------+--------+--------+

    | 10 | host1 | 3306 | ONLINE | 1 |

    | 20 | host2 | 3306 | ONLINE | 1 |

    | 30 | host3 | 3306 | ONLINE | 1 |

    +--------------+----------+------+--------+--------+

    mysql_users:

    +----------+-------------------+

    | username | default_hostgroup |

    +----------+-------------------+

    | root | 10 |

    +----------+-------------------+

    mysql_query_rules:

    +---------+-----------------------+----------------------+

    | rule_id | destination_hostgroup | match_digest |

    +---------+-----------------------+----------------------+

    | 1 | 10 | ^SELECT.*FOR UPDATE$ |

    | 2 | 20 | ^SELECT.*test1\..* |

    | 3 | 30 | ^SELECT |

    +---------+-----------------------+----------------------+

    查看表结构的方式:

    PRAGMA table_info("表名");

    ProxySQL实现读写分离示例

    环境:

    Cnetos7-Lynk-192.168.26.128-mysql主机-proxysql

    Cnetos7-Hyrule-192.168.26.129-mysql从机

    #安装proxySQL

    [root@Lynk ~]# cat <

    [proxysql_repo]

    name= ProxySQL

    baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/7

    gpgcheck=1

    gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key

    EOF

    [root@Lynk ~]# yum -y install proxysql

    #启动proxysql并设置开机自动启动

    #proxysql默认只提供了sysv风格的启动脚本,所以想设置开机自启则需借助于chkconfig工具

    [root@Lynk ~]# systemctl start proxysql

    [root@Lynk ~]# chkconfig proxysql on

    #mysql主库添加proxysql可以增删改查的账号

    mysql> grant all on *.* to 'proxysql'@'127.0.0.1' identified by 'pwproxysql';

    Query OK, 0 rows affected, 1 warning (0.59 sec)

    mysql> flush privileges;

    Query OK, 0 rows affected (0.01 sec)

    #登录进proxy管理

    [root@lynk ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032

    mysql: [Warning] Using a password on the command line interface can be insecure.

    Welcome to the MySQL monitor. Commands end with ; or \g.

    Your MySQL connection id is 1

    Server version: 5.5.30 (ProxySQL Admin Module)

    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its

    affiliates. Other names may be trademarks of their respective

    owners.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    (admin@127.0.0.1:6032) [(none)]> 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 内存配置数据库,表里存放后端db实例、用户验证、路由规则等信息。表名以 runtime开头的表示proxysql当前运行的配置内容,不能通过dml语句修改,只能修改对应的不以 runtime 开头的(在内存)里的表,然后 LOAD 使其生效, SAVE 使其存到硬盘以供下次重启加载

    disk 是持久化到硬盘的配置,sqlite数据文件

    stats 是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间等等

    monitor 库存储 monitor 模块收集的信息,主要是对后端db的健康/延迟检查

    stats_history 统计信息历史库

    Proxysql管理端添加后端连接mysql主从数据库的配置

    (admin@127.0.0.1:6032) [(none)]> show tables from main;

    +--------------------------------------------+

    | tables |

    +--------------------------------------------+

    | global_variables | # ProxySQL的基本配置参数,类似与MySQL

    | mysql_collations | # 配置对MySQL字符集的支持

    | mysql_group_replication_hostgroups | # MGR相关的表,用于实例的读写组自动分配

    | mysql_query_rules | # 路由表

    | mysql_query_rules_fast_routing | # 主从复制相关的表,用于实例的读写组自动分配

    | mysql_replication_hostgroups | # 存储MySQL实例的信息

    | mysql_servers | # 存储MySQL用户

    | mysql_users | # 存储ProxySQL的信息,用于ProxySQL Cluster同步

    | proxysql_servers | # 运行环境的存储校验值

    | runtime_checksums_values |

    | runtime_global_variables |

    | runtime_mysql_group_replication_hostgroups |

    | runtime_mysql_query_rules |

    | runtime_mysql_query_rules_fast_routing |

    | runtime_mysql_replication_hostgroups | # 与上面对应,但是运行环境正在使用的配置

    | runtime_mysql_servers |

    | runtime_mysql_users |

    | runtime_proxysql_servers |

    | runtime_scheduler |

    | scheduler | # 定时任务表

    +--------------------------------------------+

    20 rows in set (0.00 sec)

    runtime_开头的是运行时的配置,这些是不能修改的。要修改 ProxySQL 的配置,需要修改了非 runtime_ 表,修改后必须执行 LOAD ... TO RUNTIME 才能加载到 RUNTIME 生效,执行 save ... to disk 才能将配置持久化保存到磁盘

    下面语句中没有先切换到 main 库也执行成功了,因为 ProxySQL 内部使用的 SQLite3 数据库引擎,和 MySQL 的解析方式是不一样的。即使执行了 USE main 语句也是无任何效果的,但不会报错

    使用 insert 语句添加 mysql 主机到 mysql_servers 表中,其中:hostgroup_id 1 表示写组,2表示读组

    (admin@127.0.0.1:6032) [(none)]> insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(1,'127.0.0.1',3306,1,'Write Group');

    Query OK, 1 row affected (0.01 sec)

    (admin@127.0.0.1:6032) [(none)]> insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(2,'192.168.26.129',3306,1,'Read Group');

    Query OK, 1 row affected (0.00 sec)

    (admin@127.0.0.1:6032) [(none)]> select * from mysql_servers;

    +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+-------------+

    | hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |

    +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+-------------+

    | 1 | 127.0.0.1 | 3306 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | Write Group |

    | 2 | 192.168.26.129 | 3306 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | Read Group |

    +--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+-------------+

    2 rows in set (0.00 sec)

    #加载到RUNTIME,并保存到disk

    (admin@127.0.0.1:6032) [(none)]> load mysql servers to runtime;

    Query OK, 0 rows affected (0.02 sec)

    (admin@127.0.0.1:6032) [(none)]> save mysql servers to disk;

    Query OK, 0 rows affected (0.06 sec)

    在 proxysql 主机的 mysql_users 表中添加刚才在 master 上创建的账号 proxysql,proxysql 客户端需要使用这个账号来访问数据库

    default_hostgroup 默认组设置为写组,也就是1;

    当读写分离的路由规则不符合时,会访问默认组的数据库;

    (admin@127.0.0.1:6032) [(none)]> insert into mysql_users(username,password,default_hostgroup,transaction_persistent)values('proxysql','pwproxysql',1,1);

    Query OK, 1 row affected (0.00 sec)

    (admin@127.0.0.1:6032) [(none)]> select * from mysql_users \G

    *************************** 1. row ***************************

    username: proxysql # 后端mysql实例的用户名

    password: pwproxysql # 后端mysql实例的密码

    active: 1 # active=1表示用户生效,0表示不生效

    use_ssl: 0

    default_hostgroup: 1 # 用户默认登录到哪个hostgroup_id下的实例

    default_schema: NULL # 用户默认登录后端mysql实例时连接的数据库,这个地方为NULL的话,则由全局变量mysql-default_schema决定,默认是information_schema

    schema_locked: 0

    transaction_persistent: 1 # 如果设置为1,连接上ProxySQL的会话后,如果在一个hostgroup上开启了事务,那么后续的sql都继续维持在这个hostgroup上,不论是否会匹配上其它路由规则,直到事务结束。虽然默认是0

    fast_forward: 0 # 忽略查询重写/缓存层,直接把这个用户的请求透传到后端DB。相当于只用它的连接池功能,一般不用,路由规则 .* 就行了

    backend: 1

    frontend: 1

    max_connections: 10000 # 该用户允许的最大连接数

    1 row in set (0.00 sec)

    (admin@127.0.0.1:6032) [(none)]> load mysql users to runtime;

    Query OK, 0 rows affected (0.00 sec)

    (admin@127.0.0.1:6032) [(none)]> save mysql users to disk;

    Query OK, 0 rows affected (0.00 sec)

    在主库添加健康检测的帐号

    (root@localhost:mysql.sock) [(none)]> GRANT SELECT ON *.* TO 'monitor'@'127.0.0.1' IDENTIFIED BY 'monitor';

    Query OK, 0 rows affected, 1 warning (0.07 sec)

    (root@localhost:mysql.sock) [(none)]> flush privileges;

    Query OK, 0 rows affected (0.01 sec)

    在proxysql主机端修改变量设置健康检测的账号

    (admin@127.0.0.1:6032) [(none)]> set mysql-monitor_username='monitor';

    Query OK, 1 row affected (0.01 sec)

    (admin@127.0.0.1:6032) [(none)]> set mysql-monitor_password='monitor';

    Query OK, 1 row affected (0.00 sec)

    (admin@127.0.0.1:6032) [(none)]> load mysql variables to runtime;

    Query OK, 0 rows affected (0.00 sec)

    (admin@127.0.0.1:6032) [(none)]> save mysql variables to disk;

    Query OK, 97 rows affected (0.01 sec)

    添加读写分离的路由规则

    将 select 查询语句全部路由至 hostgroup_id=2 的组(也就是读组)

    但是 select * from tb for update 这样的语句是会修改数据的,所以需要单独定义,将它路由至 hostgroup_id=1 的组(也就是写组)

    其他没有被规则匹配到的组将会被路由至用户默认的组(mysql_users 表中的 default_hostgroup)

    (admin@127.0.0.1:6032) [(none)]> insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(1,1,'^SELECT.*FOR UPDATE$',1,1);

    Query OK, 1 row affected (0.00 sec)

    (admin@127.0.0.1:6032) [(none)]> insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)values(2,1,'^SELECT',2,1);

    Query OK, 1 row affected (0.00 sec)

    (admin@127.0.0.1:6032) [(none)]> select rule_id,active,match_digest,destination_hostgroup,apply from mysql_query_rules;

    +---------+--------+----------------------+-----------------------+-------+

    | rule_id | active | match_digest | destination_hostgroup | apply |

    +---------+--------+----------------------+-----------------------+-------+

    | 1 | 1 | ^SELECT.*FOR UPDATE$ | 1 | 1 |

    | 2 | 1 | ^SELECT | 2 | 1 |

    +---------+--------+----------------------+-----------------------+-------+

    2 rows in set (0.00 sec)

    (admin@127.0.0.1:6032) [(none)]> load mysql query rules to runtime;

    Query OK, 0 rows affected (0.01 sec)

    (admin@127.0.0.1:6032) [(none)]> load admin variables to runtime;

    Query OK, 0 rows affected (0.00 sec)

    (admin@127.0.0.1:6032) [(none)]> save mysql query rules to disk;

    Query OK, 0 rows affected (0.03 sec)

    (admin@127.0.0.1:6032) [(none)]> save admin variables to disk;

    Query OK, 31 rows affected (0.04 sec)

    验证读写分离

    登录用户是刚才我们在 mysql_user 表中创建的用户,端口为6033

    (proxysql@127.0.0.1:6033) [(none)]> show databases;

    +--------------------+

    | Database |

    +--------------------+

    | information_schema |

    | lynk |

    | mysql |

    | performance_schema |

    | sys |

    | zabbix |

    +--------------------+

    6 rows in set (0.01 sec)

    尝试修改数据库和查询

    (proxysql@127.0.0.1:6033) [information_schema]> create database zelda;

    Query OK, 1 row affected (0.00 sec)

    (proxysql@127.0.0.1:6033) [information_schema]> select user,host from mysql.user;

    +---------------+----------------+

    | user | host |

    +---------------+----------------+

    | proxysql | 192.168.26.128 |

    | repl | 192.168.26.129 |

    | mysql.session | localhost |

    | mysql.sys | localhost |

    | root | localhost |

    | zabbix | localhost |

    +---------------+----------------+

    6 rows in set (0.01 sec)

    验证读写分离是否成功

    (admin@127.0.0.1:6032) [(none)]> select * from stats_mysql_query_digest;

    +-----------+--------------------+----------+--------------------+----------------------------------+-------+----------+

    | hostgroup | schemaname | username | digest | digest_text | count_| max_time |

    +-----------+--------------------+----------+--------------------+----------------------------------+-------+----------+

    | 1 | information_schema | proxysql | 0x5E0E58962991A0EB | create database zelda | 2 | 9274 |

    | 2 | information_schema | proxysql | 0x0F02B330C823D739 | select user,host from mysql.user | 6 | 10002613 |

    +-----------+--------------------+----------+--------------------+----------------------------------+-------+----------+

    15 rows in set (0.01 sec)

    从以上 hostgroup 和 digest_text 值来看,所有的写操作都被路由至1组,读操作都被路由至2组,其中1组为写组,2组为读组

    展开全文
  • Atlas是由奇虎360公发的基于MySQL协议的数据库中间件产品,它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了若干Bug,并增加了很多功能特性。目前该产品在360内部得到了广泛应用,覆盖80%以上的MySQL业务...
  • Atlas中间件实现Mysql读写分离

    千次阅读 2022-03-11 10:57:56
    二、实现Mysql读写分离 1、实验环境 2、搭建一主一从配置 3、安装Atlas 一、Atlas介绍 [ˈætləs] Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL...

    目录

    一、Atlas介绍

    二、实现Mysql读写分离

    1、实验环境

    2、搭建一主一从配置

    3、安装Atlas


    一、Atlas介绍

    [ˈætləs]

    Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。

    1、github 源码

    https://github.com/Qihoo360/Atlas

    2、主要功能

    1、读写分离 2、从库负载均衡 3、自动分表 4、IP过滤 5、SQL语句黑白名单 6、DBA可平滑上下线DB 7、自动摘除宕机的DB

    3、使用场景:

           Atlas是一个位于前端应用与后端MySQL数据库之间的中间件,它使得应用程序员无需再关心读写分离、分表等与MySQL相关的细节,可以专注于编写业务逻辑,同时使得DBA的运维工作对前端应用透明,上下线DB前端应用无感知。

    4、安装Atlas之前注意的事项

    • Atlas只能安装运行在64位的系统上
    • Centos 5.X安装 Atlas-XX.el5.x86_64.rpm,Centos 6.X安装Atlas-XX.el6.x86_64.rpm。
    • 后端mysql版本应大于5.1,建议使用Mysql 5.6

    二、实现Mysql读写分离

     

    1、实验环境

    192.168.50.110

    Mysql  master

    192.168.50.111

    Mysql slave

    192.168.50.112

    Proxy:Atlas

    2、搭建一主一从配置

    master配置:

     

    vim /etc/my.cnf
    # 需要同步的日志的数据库
    binlog-do-db= ty 
    #不同步的二进制数据库,如果不设置可以将其注释掉
    binlog-ignore-db=information_schema
    binlog-ignore-db=mysql
    binlog-ignore-db=personalsite
    binlog-ignore-db=test
     
    #以下参数可选:
    #binlog 格式 
    binlog-format=ROW 
    log-bin=mysql-master-bin 
    #slave更新时是否记录到日志中;
    log-slave-updates=true
    #开启半同步,需要另外安装插来支持
     pl_semi_sync_master_enabled=ON

    master授权:

    grant replication slave,super,reload on *.* to slave1@192.168.50.111 identified by '123456';
    flush privileges;

    查看master状态:

    mysql> show master status 
    #在主库上查看已连接的slave主机
    mysql> show slave hosts;
    #查看所有binlog日志 
    mysql> show binary logs;
    #查看所有binlog 事件
    mysql> show binlog events in 'mysql-bin.000003' from 145 \G;

    slave配置:

    vim /etc/my.cnf
     server-id = 2
     log-bin=mysql-slave-bin
     replicate-do-db=ty
     replicate-ignore-db=information_schema
     replicate-ignore-db=mysql
     replicate-ignore-db=personalsite
     replicate-ignore-db=test

    设置slave指向

    mysql>change master to master_host='192.168.50.110',
     master_user='slave1',
     master_password='123456',
     MASTER_AUTO_POSITION = 2887;

    slave相关操作:

    #启动slave
    mysql>start slave;
    mysql>stop slave;
    #查看 slave 状态
    show slave status\G;
    #跳过指定数量错误
    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    #查看 relaylog 事件
    show relaylog events in 'localhost-relay-bin.000019'

    3、安装Atlas

    下载地址:

    https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm 或者
    https://download.csdn.net/download/fd2025/10375544

    安装Atlas

    rpm -i  Atlas-2.2.1.el6.x86_64.rpm
     
    默认安装目录为:/usr/local/mysql-proxy

    编辑Atlas配置文件:

    vim /usr/local/mysql-proxy/test.cnf
    [mysql-proxy]
     
    #带#号的为非必需的配置项目
     
    #管理接口的用户名
    admin-username = root
     
    #管理接口的密码
    admin-password = root
     
    #设置主库和从库的地址,其中主库为写库,从库为读库
    #主库地址:Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
    proxy-backend-addresses = 192.168.50.110:3306
    #设置从库的地址和端口
    proxy-read-only-backend-addresses= 192.168.50.111
     #若配置为主库也分担读请求,并且设置权重为(主:从)=(1:3)
    #proxy-read-only-backend-addresses = 192.168.50.110:3306@1,,192.168.50.111@3
     
    #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的
    #用户名和加密密码!
    pwds = root:/iZxz+0GRoA=
     
    #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
    daemon = true
     
    #设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,
    #设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
    keepalive = true
     
    #工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
    event-threads = 8
     
    #日志级别,分为message、warning、critical、error、debug五个级别
    log-level = message
     
    #日志存放的路径
    log-path = /usr/local/mysql-proxy/log
     
    #SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
    sql-log = ON
     
    #慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。
    #sql-log-slow = 10
     
    #实例名称,用于同一台机器上多个Atlas实例间的区分
    #instance = test
     
    #Atlas监听的工作接口IP和端口,应用程序将连接这个地址,把Atlasd当做mysql-server,此处携程3306端口
    proxy-address = 192.168.50.113:1234
     
    #Atlas监听的管理接口IP和端口
    admin-address = 192.168.50.113:2345
     
    #分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
    #tables = person.mt.id.3
     
    #默认字符集,设置该项后客户端不再需要执行SET NAMES语句
    #charset = utf8
     
    #允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
    #client-ips = 127.0.0.1, 192.168.1
     
    #Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
    #lvs-ips = 192.168.1.1

    启动和关闭Atlas:

    /usr/local/mysql-proxy/bin/mysql-proxyd test start
    /usr/local/mysql-proxy/bin/mysql-proxyd test stop

    检查是否启动成功:

    /usr/local/mysql-proxy/bin/mysql-proxyd test status

    连接Atlas后台:

    mysql -h127.0.0.1 -P2345 -uroot -proot

    强制路由:

    注释的方式强制走主库:
    Alatas: /*master*/ #业务需要

    展开全文
  • Mysql中间件Mycat实现读写分离
  • 因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离MySQL-Proxy/Amoeba)来提升数据库的并发负载能力,这样的方案来进行部署与实施的。基本的原理是让主数据库处理事务性增、改、删...
  • Mycat适用的场景很丰富,以下是几个典型的应用场景单纯的读写分离,此时配置最为简单,支持读写分离,主从切换分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片多租户应用,每个应用一个库,但应用...
  • 为什么要架设读写分离,这里不做多余的说明,想了解具体原理,请百度或者参考其他帖子。在这里只做大概的配置说明,测试中使用三台服务器192.168.136.142 主服务器192.168.136.143 从服务器192.168.136.144 中间...
  • Mycat安装包点这里获取 解压到合适的目录下: 修改conf目录下的server.xml和schema.xml配置文件: ①修改server.xml配置 vim打开server...具体配置方法需要继续研究) 这样中间件mycat就帮助我们实现了MySQL读写分离
  • 关于mysql读写分离架构有很多,百度的话几乎都是用mysql_proxy实现的。由于proxy是基于lua脚本语言实现的,所以网上不少网友表示proxy效率不高,也不稳定,不建议在生产环境使用; amoeba是阿里开发的一款数据库...
  • MySQL读写分离中间件解决

    千次阅读 2018-08-24 19:42:27
    通过中间件,处理读写分离 优点 1、源程序不需要做任何改动,就可以实现读写分离 2、动态添加数据源,不需要重启程序 缺点 1、程序依赖于中间件,会导致切换数据库变得困难 2、由中间件做了中转代理,性能...
  • mycat实现mysql读写分离

    2022-03-30 22:49:39
    Mycat是一个广受好评的数据库中间件,已经在很多产 品上进行使用了。 Mycat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是 一个数据库代理(类似于Mysql Proxy),用MySQL...
  • Mysql主从复制、读写分离+maxscale数据库中间件,出自于Mysql之父的团队,不为更新与优化而忧心。 待续……
  • 3)、改进一下1.1基于操作AbstractRoutingDataSource和自定义注解readOnly之类的,简化自动切换数据源(4)、改进二下1.2支持配置多个从库;使用AbstractRoutingDataSource和自定义注解。(5)、改进三下1.3支持多个...
  • 最近在学习的项目中接触到了MySQL搭建主从数据库实现读写分离的这么一个玩意,又刚好之前写的项目中都没有用过这类技术,都是单体数据库冲锋陷阵,因此在这里记录下学习的过程以及踩的一些小坑。...
  • 2、Mycat 数据库读写分离中间件; 服务首先请求Mycat(虚拟库映射到实际数据库)--》数据库; 3、MQ消息中间件; 。。。。。 注意:各项连接均需关闭Linux防火墙。 二、Mycat alibaba开源,用户操作数据库读写...
  • Mysql 读写分离中间件(Gaea)

    千次阅读 2020-02-04 14:46:42
    传统的MySql读写分离方案是通过在代码中根据SQL语句的类型动态切换数据源来实现的,那么有没有什么中间件可以自动实现读写分离呢?小米开源的数据库中间件Gaea就可以实现,接下来我们将详细讲解如何使用Gaea来实现...
  • MySQL cetus 中间件 读写分离

    千次阅读 2021-01-28 07:30:48
    首先需要确保mysql 的主从同步成功。CentOS 系统可以通过以下命令安装依赖包:yum install cmake gcc glib2-devel flex mysql-devel gperftools-libs zlib-devel -y克隆获取源码:创建编译目录:在源码主目录下创建...
  • mysql中间件proxysql实现mysql读写分离

    千次阅读 2019-03-19 18:30:11
    mysql中间件proxysql实现mysql读写分离1. mysql实现读写分离的方式2. ProxySQL简介3. ProxySQL安装3.1 mysql安装4. ProxySQL的Admin管理接口5. admin管理接口相关的变量5.2 admin-stats_credentials5.3 admin-mysql_...
  • MySQL实现读写分离的两种经典方案

    千次阅读 2021-01-18 19:16:37
    前言如果主库只负责所有的读写操作,而从库只实现备份功能,这样的主从架构看起来性价比似乎不是很高。...实现读写分离,实际上有两种经典方式第一种方式即我们在代码层实现逻辑,对到达的读/写请求进行解析,...
  • 目录前言一、Mycat介绍二、读写分离架构三、Mycat配置3.1 安装JDK3.2 配置Mycat3.3 测试Mycat总结 前言 什么是读写分离?其实所谓的读写分离就是在数据库集群架构中,让主库负责处理写入操作,而从库只负责处理...
  • Linux Mysql中间件Mycat 读写分离 一、Mycat Mycat 适用场景 Mycat 长期路线图 二、Mycat 概括 三、Mycat 实现 Mysql 读写分离 Linux Mysql中间件Mycat 读写分离 一、Mycat Mycat 适用场景 单纯的读写...
  • ----杜绝转载和抄袭,坚持亲自搭建。 基于mycat中间件mysql5.7
  • mycat配置mysql读写分离

    2019-12-21 17:58:01
    mysql5.6主从 配置详解:https://blog.csdn.net/u010772230/article/details/103604978 第一步:配置server.xml 进入mycat,打开server.xml 第二步:配置schema.xml 删除掉schema.xml中无用的信...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,596
精华内容 12,238
关键字:

mysql读写分离中间件

mysql 订阅