proxysql实现mysql读写分离

mysql的动静分离

环境:

主机名IP地址
master192.168.100.33
slave192.168.100.169
proxy192.168.100.116

ProxySQL安装

[root@proxy ~]#  cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
> [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
[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
[root@proxy ~]#  yum -y install proxysql
[root@proxy ~]# systemctl start proxysql
[root@proxy ~]# chkconfig proxysql on

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

(root@localhost:mysql.sock) [(none)]> grant all on *.* to 'proxysql'@'192.168.100.116' identified by 'pwproxysql';
Query OK, 0 rows affected, 1 warning (0.01 sec)

(root@localhost:mysql.sock) [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

\ 当 ProxySQL 启动后,将监听两个端口:
1.admin管理接口,默认端口为6032。该端口用于查看、配置ProxySQL
2.接收SQL语句的接口,默认端口为6033,这个接口类似于MySQL的3306端口

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

[root@proxy ~]# yum -y install mariadb
[root@proxy ~]# export MYSQL_PS1="(\u@\h:\p) [\d]> "  
[root@proxy ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032
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)
MySQL [(none)]> select @@admin-admin_credentials;  //查看当前用户密码
+---------------------------+
| @@admin-admin_credentials |
+---------------------------+
| admin:admin               |
+---------------------------+
1 row in set (0.00 sec)

MySQL [(none)]> set admin-admin_credentials='admin:admin;myadmin:123.com'; //修改管理员用户密码
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> select @@admin-admin_credentials;
+-----------------------------+
| @@admin-admin_credentials   |
+-----------------------------+
| admin:admin;myadmin:123.com |
+-----------------------------+
1 row in set (0.00 sec)
MySQL [(none)]> load admin variables to runtime;        //使修改立即生效
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> save admin variables to disk;              //使修改永久保存到磁盘
Query OK, 31 rows affected (0.03 sec)
  • 使用 insert 语句添加 mysql 主机到 mysql_servers 表中,其中:hostgroup_id 1 表示写组,2表示读组
MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(1,'192.168.100.33',3306,1,'Write Group'); 
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(2,'192.168.100.169',3306,1,'Read Group'); 
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> load mysql servers to runtime;
Query OK, 0 rows affected (0.01 sec)

MySQL [(none)]> save mysql servers to disk;
Query OK, 0 rows affected (0.07 sec)
MySQL [(none)]> select * from mysql_servers;
+--------------+-----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+-------------+
| hostgroup_id | hostname        | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment     |
+--------------+-----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+-------------+
| 1            | 192.168.100.33  | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              | Write Group |
| 2            | 192.168.100.169 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              | Read Group  |
+--------------+-----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+-------------+
2 rows in set (0.00 sec)
  • 在 proxysql 主机的 mysql_users 表中添加刚才在 master 上创建的账号 proxysql,proxysql 客户端需要使用这个账号来访问数据库
    default_hostgroup 默认组设置为写组,也就是1;
    当读写分离的路由规则不符合时,会访问默认组的数据库;
MySQL [(none)]> insert into mysql_users(username,password,default_hostgroup,transaction_persistent)values('proxysql','pwproxysql',1,1);
Query OK, 1 row affected (0.00 sec)

MySQL [(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)
MySQL [(none)]> load mysql users to runtime;
Query OK, 0 rows affected (0.01 sec)

MySQL [(none)]> save mysql users to disk;
Query OK, 0 rows affected (0.01 sec)

添加健康检测的帐号

  • 在mysql的 master 端添加属于proxysql的只读账号
(root@localhost:mysql.sock) [(none)]> GRANT SELECT ON *.* TO 'monitor'@'192.168.100.%' IDENTIFIED BY 'monitor';
Query OK, 0 rows affected, 1 warning (0.00 sec)

(root@localhost:mysql.sock) [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)
  • 在proxysql主机端修改变量设置健康检测的账号
MySQL [(none)]> set mysql-monitor_username='monitor';
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> set mysql-monitor_password='monitor';
Query OK, 1 row affected (0.00 sec)

MySQL [(none)]> load mysql variables to runtime;
Query OK, 0 rows affected (0.00 sec)

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

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

MySQL [(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)
MySQL [(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)
MySQL [(none)]> load mysql query rules to runtime;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> load admin variables to runtime;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> save mysql query rules to disk;
Query OK, 0 rows affected (0.03 sec)

MySQL [(none)]> save admin variables to disk;
Query OK, 31 rows affected (0.01 sec)

验证读写分离

  • 登录 proxysql 客户端
  • 登录用户是刚才我们在 mysql_user 表中创建的用户,端口为6033
[root@proxy ~]# mysql -uproxysql -ppwproxysql -h127.0.0.1 -P6033
(proxysql@127.0.0.1:6033) [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
  • 尝试修改数据库和查询
(proxysql@127.0.0.1:6033) [(none)]> create database dsb;
Query OK, 1 row affected (0.05 sec)

(proxysql@127.0.0.1:6033) [(none)]> create database dxk;
Query OK, 1 row affected (0.00 sec)
(proxysql@127.0.0.1:6033) [(none)]> select user,host from mysql.user;
+---------------+-----------------+
| user          | host            |
+---------------+-----------------+
| proxysql      | 172.16.12.128   |
| dsb           | 192.168.100.%   |
| monitor       | 192.168.100.%   |
| proxysql      | 192.168.100.116 |
| mysql.session | localhost       |
| mysql.sys     | localhost       |
| root          | localhost       |
+---------------+-----------------+
7 rows in set (0.01 sec)

验证读写分离是否成功

[root@proxy ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032
(admin@127.0.0.1:6032) [(none)]> select * from stats_mysql_query_digest;
+-----------+--------------------+----------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+
| hostgroup | schemaname         | username | digest             | digest_text                      | count_star | first_seen | last_seen  | sum_time | min_time | max_time |
+-----------+--------------------+----------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+
| 1         | information_schema | proxysql | 0x59FC1E35EA72A60B | create database dsb              | 1          | 1542877407 | 1542877407 | 54127    | 54127    | 54127    |
| 1         | information_schema | proxysql | 0x61EA62F4E7D2010D | create database dxk              | 1          | 1542877410 | 1542877410 | 2457     | 2457     | 2457     |
| 2         | information_schema | proxysql | 0x0F02B330C823D739 | select user,host from mysql.user | 1          | 1542877428 | 1542877428 | 5046     | 5046     | 5046     |
+-----------+--------------------+----------+--------------------+----------------------------------+------------+------------+------------+----------+----------+----------+
7 rows in set (0.00 sec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值