Linux学习-基于CentOS7的ProxySQL实现读写分离
一、实验环境
主机:3台,一台ProxySQL(192.168.214.37),两台主从复制,master(192.168.214.17),slave(192.168.214.27)
系统:CentOS7.6
数据库:mariadb-server-5.5.60(光盘yum源)
ProxySQL:proxysql-1.4.16
ProxySQL组成
服务脚本:/etc/init.d/proxysql
配置文件:/etc/proxysql.cnf
主程序:/usr/bin/proxysql
基于SQLITE的数据库文件:/var/lib/proxysql/
启动ProxySQL:service proxysql start启动后会监听两个默认端口
6032:ProxySQL的管理端口
6033:ProxySQL对外提供服务的端口
二、相关步骤
1、实现读写分离前,先实现主从复制,即master(192.168.214.17),slave(192.168.214.27)实现主从复制,实现方法可参照:https://www.cnblogs.com/hovin/p/11990677.html
2、安装ProxySQL,在192.168.214.37这台主机上操作,安装方法有
基于RPM下载安装:https://github.com/sysown/proxysql/releases
基于YUM仓库安装:
cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasevergpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
EOF
[root@centos7- ~]# yum install -y proxysql
3、使用mysql客户端连接到ProxySQL的管理接口6032,默认管理员用户和密码都是admin
[root@centos7- ~]# mysql -uadmin -padmin -P6032 -h127.0.0.
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is
Server version: 5.5. (ProxySQL Admin Module) Copyright (c) , , 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 |
+-----+---------------+-------------------------------------+
| | main | |
| | disk | /var/lib/proxysql/proxysql.db |
| | stats | |
| | monitor | |
| | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
rows in set (0.00 sec)
数据库说明:
main 是默认的”数据库”名,表里存放后端db实例、用户验证、路由规则等信息。表名以 runtime_开头的表示proxysql当前运行的配置内容,不能通过dml语句修改,只能修改对应的不以 runtime_ 开头的(在内存)里的表,然后 LOAD 使其生效,SAVE 使其存到硬盘以供下次重启加载;
disk 是持久化到硬盘的配置,sqlite数据文件
stats 是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间等等
monitor 库存储 monitor 模块收集的信息,主要是对后端db的健康/延迟检查
说明:
在main和monitor数据库中的表, runtime_开头的是运行时的配置,不能修改,只能修改非 runtime_ 表
修改后必须执行LOAD ... TO RUNTIME才能加载到RUNTIME生效
执行save ... to disk 才将配置持久化保存到磁盘,即保存在proxysql.db文件中global_variables 有许多变量可以设置,其中就包括监听的端口、管理账号等
4、向ProxySQL中添加MySQL节点,以下操作不需要 use main 也可成功
MySQL [(none)]> show tables; #显示表
+--------------------------------------------+
| tables |
+--------------------------------------------+
| global_variables |
| mysql_collations |
| mysql_group_replication_hostgroups |
| mysql_query_rules |
| mysql_query_rules_fast_routing |
| mysql_replication_hostgroups |
| mysql_servers |
| 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 |
+--------------------------------------------+
rows in set (0.00 sec) MySQL [(none)]> select * from sqlite_master where name='mysql_servers'\G;
*************************** . row ***************************
type: table
name: mysql_servers
tbl_name: mysql_servers
rootpage:
sql: CREATE TABLE mysql_servers (hostgroup_id INT CHECK (hostgroup_id>=) NOT NULL DEFAULT , hostname VARCHAR NOT NULL , port INT NOT NULL DEFAULT , status VARCHAR CHECK (UPPER(status) IN ('ONLINE','SHUNNED','OFFLINE_SOFT', 'OFFLINE_HARD')) NOT NULL DEFAULT 'ONLINE' , weight INT CHECK (weight >= ) NOT NULL DEFAULT , compression INT CHECK (compression >= AND compression <= ) NOT NULL DEFAULT , max_connections INT CHECK (max_connections >=) NOT NULL DEFAULT , max_replication_lag INT CHECK (max_replication_lag >= AND max_replication_lag <= ) NOT NULL DEFAULT , use_ssl INT CHECK (use_ssl IN(,)) NOT NULL DEFAULT , max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=) NOT NULL DEFAULT , comment VARCHAR NOT NULL DEFAULT '' , PRIMARY KEY (hostgroup_id, hostname, port) )
row in set (0.00 sec) ERROR: No query specified MySQL [(none)]> select * from mysql_servers; #查询节点主机,目前没有
Empty set (0.00 sec) MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(,'192.168.214.17',); #添加主节点
Query OK, row affected (0.00 sec) MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(,'192.168.214.27',); #添加从节点
Query OK, row affected (0.00 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 |
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| | 192.168.214.17 | | ONLINE | | | | | | | |
| | 192.168.214.27 | | ONLINE | | | | | | | |
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
rows in set (0.00 sec) MySQL [(none)]> load mysql servers to runtime; #添加后记得先加载
Query OK, rows affected (0.00 sec) MySQL [(none)]> save mysql servers to disk; #再写入磁盘持久化保存
Query OK, rows affected (0.01 sec)
5、添加监控后端节点的用户;ProxySQL通过每个节点的read_only值来自动调整它们是属于读组还是写组(因此主从配置时从节点配置文件中记得加read_only选项)
1). 在主节点master(192.168.214.17)上执行
MariaDB [(none)]> grant replication client on *.* to monitor@'192.168.214.%' identified by 'monitor';
2). 在ProxySQL(192.168.214.37)上配置监控,同时记得加载到RUNTIME,并保存到disk
MySQL [(none)]> set mysql-monitor_username='monitor';
MySQL [(none)]> set mysql-monitor_password='monitor';
MySQL [(none)]> load mysql variables to runtime;
MySQL [(none)]> save mysql variables to disk;
监控模块的指标保存在monitor库的log表中,查看监控连接是否正常的 (对connect指标的监控):(如果connect_error的结果为NULL则表示正常)
MySQL [(none)]> select * from mysql_server_connect_log;
查看监控心跳信息 (对ping指标的监控): MySQL [(none)]> select * from mysql_server_ping_log;
查看read_only和replication_lag的监控日志:
MySQL [(none)]> select * from mysql_server_read_only_log;
MySQL [(none)]> select * from mysql_server_replication_lag_log;
6、设置分组信息,需要修改的是main库中的mysql_replication_hostgroups表,该表有3个字段:writer_hostgroup,reader_hostgroup,comment, 指定写组的id为10,读组的id为20,记得将mysql_replication_hostgroups表的修改加载到RUNTIME生效,同时保存到磁盘
MySQL [(none)]> insert into mysql_replication_hostgroups values(,,"test");
Query OK, row affected (0.00 sec) MySQL [(none)]> load mysql servers to runtime;
Query OK, rows affected (0.00 sec) MySQL [(none)]> save mysql servers to disk;
Query OK, rows affected (0.01 sec)
Monitor模块监控后端的read_only值,按照read_only的值将节点自动移动到读/写组
MySQL [(none)]> select hostgroup_id,hostname,port,status,weight from mysql_servers;
+--------------+----------------+------+--------+--------+
| hostgroup_id | hostname | port | status | weight |
+--------------+----------------+------+--------+--------+
| | 192.168.214.17 | | ONLINE | |
| | 192.168.214.27 | | ONLINE | |
+--------------+----------------+------+--------+--------+
rows in set (0.00 sec)
7、配置发送SQL语句的用户,在主节点master(192.168.214.17)上创建访问用户
MariaDB [(none)]> grant all on *.* to sqluser@'192.168.214.%' identified by 'centos';
Query OK, rows affected (0.00 sec)
8、在ProxySQL(192.168.214.37)上配置,将用户sqluser添加到mysql_users表中,default_hostgroup默认组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库,同时加载到RUNTIME并保存磁盘
MySQL [(none)]> insert into mysql_users(username,password,default_hostgroup) values('sqluser','centos',);
Query OK, row affected (0.00 sec) MySQL [(none)]> load mysql user to runtime;
Query OK, rows affected (0.00 sec) MySQL [(none)]> save mysql user to disk;
Query OK, rows affected (0.01 sec)
9、使用sqluser用户测试是否能路由到默认的10写组,实现读、写数据
[root@centos7- ~]# mysql -usqluser -pcentos -P6033 -h127.0.0. -e 'select @@server_id'
+-------------+
| @@server_id |
+-------------+
| |
+-------------+
[root@centos7- ~]# mysql -usqluser -pcentos -P6033 -h127.0.0. -e 'create database testdb'
[root@centos7- ~]# mysql -usqluser -pcentos testdb -P6033 -h127.0.0. -e 'create table t(id int)'
10、在proxysql(192.168.214.37)上配置路由规则,实现读写分离,与规则有关的表:mysql_query_rules和mysql_query_rules_fast_routing,后者是前者的扩展表,1.4.7之后支持;插入路由规则:将select语句分离到20的读组,select语句中有一个特殊语句SELECT...FOR UPDATE它会申请写锁,应路由到10的写组,插入后记得加载RUNTIME并保存到磁盘
MySQL [(none)]> insert into mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply)VALUES (,,'^SELECT.*FOR UPDATE$',,),(,,'^SELECT',,);
Query OK, rows affected (0.00 sec) MySQL [(none)]> load mysql query rules to runtime;
Query OK, rows affected (0.00 sec) MySQL [(none)]> save mysql query rules to disk;
Query OK, rows affected (0.01 sec) MySQL [(none)]> select rule_id,active,match_digest,destination_hostgroup,apply from mysql_query_rules;
+---------+--------+----------------------+-----------------------+-------+
| rule_id | active | match_digest | destination_hostgroup | apply |
+---------+--------+----------------------+-----------------------+-------+
| | | ^SELECT.*FOR UPDATE$ | | |
| | | ^SELECT | | |
+---------+--------+----------------------+-----------------------+-------+
rows in set (0.00 sec)
注意:因ProxySQL根据rule_id顺序进行规则匹配,select ... for update规则的rule_id必须要小于普通的select规则的rule_id
11、配置已完成,开始测试
1). 测试读操作是否路由给20的读组
[root@centos7- ~]# mysql -usqluser -pcentos -P6033 -h127.0.0. -e 'select @@server_id'
+-------------+
| @@server_id |
+-------------+
| |
+-------------+
2). 测试写操作,以事务方式进行测试
[root@centos7- ~]# mysql -usqluser -pcentos -P6033 -h127.0.0. -e 'start transaction;select @@server_id;commit;select @@server_id'
+-------------+
| @@server_id |
+-------------+
| |
+-------------+
+-------------+
| @@server_id |
+-------------+
| |
+-------------+
[root@centos7- ~]# mysql -usqluser -pcentos -P6033 -h127.0.0. -e 'insert testdb.t values (1)'
[root@centos7- ~]# mysql -usqluser -pcentos -P6033 -h127.0.0. -e 'select id from testdb.t'
+------+
| id |
+------+
| |
+------+
3). 路由的信息:查询stats库中的stats_mysql_query_digest表
MySQL [(none)]> SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;
+----+----------+------------+----------------------------------+
| hg | sum_time | count_star | digest_text |
+----+----------+------------+----------------------------------+
| | | | select @@server_id |
| | | | create table t(id int) |
| | | | insert testdb.t values (?) |
| | | | select @@server_id |
| | | | start transaction |
| | | | select id from testdb.t |
| | | | create database testdb |
| | | | commit |
| | | | select @@version_comment limit ? |
| | | | select @@version_comment limit ? |
+----+----------+------------+----------------------------------+
rows in set (0.00 sec)
Linux学习-基于CentOS7的ProxySQL实现读写分离的更多相关文章
- Linux学习-基于CentOS7的LAMP环境实现多虚拟主机
一.实验环境 系统:CentOS7.6 主机:两台(一台也可以),一台实现apache+php-fpm (192.168.214.17),一台实现mysql服务器 (192.168.214.27) 软 ...
- Linux学习-基于CentOS7的MariaDB数据库的安装
一.实验环境: 系统:CentOS7.6,关闭了防火墙与SELINUX 数据库版本:mariadb-10.2.25(二进制安装与源码安装) 二.安装方法: 1.yum源安装 (1) 配置yum源,官方 ...
- Linux学习-基于CentOS7的MySQL5.7的GTID复制
一.GTID复制简介 GTID (global transaction id)全局事务标识符,MySQL5.6版本开始支持,GTID复制不像传统的复制方式(导步复制.半同步复制)需要找到binlog和 ...
- Linux学习-基于CentOS7的MariaDB数据库的主从复制
一.MySQL主从复制原理 主从同步过程中主服务器有一个工作线程I/O dump thread,从服务器有两个工作线程I/O thread和SQL thread: 主服务器: dump Thread: ...
- linux下mysql基于mycat做主从复制和读写分离之基础篇
Linux下mysql基于mycat实现主从复制和读写分离1.基础设施 两台虚拟机:172.20.79.232(主) 172.20.79.233(从) 1.1软件设施 mysql5.6.39 , my ...
- 重要参考步骤---ProxySQL实现读写分离
MySQL配置主从同步文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/16295369.html ProxySQL实现读写分离与读负载均衡参考文档:https: ...
- MHA+ProxySQL实现读写分离高可用
最近在研究ProxySQL,觉得还挺不错的,所以就简单的折腾了一下,ProxySQL目前也是Percona在推荐的一个读写分离的中间件.关于详细的介绍可以参考官方文档.https://github.c ...
- 基于 EntityFramework 的数据库主从读写分离服务插件
基于 EntityFramework 的数据库主从读写分离服务插件 1. 版本信息和源码 1.1 版本信息 v1.01 beta(2015-04-07),基于 EF 6.1 开发,支持 EF 6.1 ...
- 基于 EntityFramework 的数据库主从读写分离架构 - 目录
基于 EntityFramework 的数据库主从读写分离架构 回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目 ...
随机推荐
- Vue实现音乐播放器(四):页面入口+header组件的编写
首先下载三个包 babel-runtime对es语法进行转义 fastclick解决移动端点击300毫秒延迟的问题 babel-polyfill对es6 api进行转义 下载了包之后要在main.js ...
- MVC3: 页面向服务传参(view->controller,get,post)
HttpGet HttpPost GetPost 总结比较 ajax get post 1)HttpGet Get是http请求的默认形式.拿MVC官方教程Movie项目举例如下. 编辑页面 Vie ...
- (转) intellij idea部署web项目时的位置(Tomcat)
这篇文章说的比较好: 原文地址:https://blog.csdn.net/zmx729618/article/details/78340566 1.当你项目启动的时候console能看到项目运行的位 ...
- java8 list转Map报错Collectors.toMap :: results in "Non-static method cannot be refernced from static context"
1.问题:java8 list转Map 报错Collectors.toMap :: results in "Non-static method cannot be refernced fro ...
- delphi自定义事件处理
http://www.cnblogs.com/ywangzi/archive/2012/09/06/2673414.html delphi自定义事件处理 为什么我们点击按钮,就会执行按钮的oncl ...
- 16/7/8_PHP-对象的高级特性
对这个理解不太懂或者说 没有一个明确的用法,不知道该怎么使用,说到底还是不懂有什么用.我还是先把只是点复制过来 对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要 ...
- 浅谈vue父子组件之间的传值
前言:本章主要说下父子组件的传值,为商品列表组件之间的传值做一个基础预热.Github:https://github.com/Ewall1106/mall(请选择分支chapter23) 1.父组件向 ...
- Java集合概括总结及集合选用
Collection 1. List ArrayList :Object数组,是一个数组队列,相当于动态数组.它由数组实现,随机访问效率高,随机插入.随机删除效率低. LinkedList :是一个双 ...
- POJ-1064.Cablemaster.(二分法枚举值求最优值)
题目链接 本题大意:给你n个长度为value[ i ]的长木板,让你切割成为等长的k份,问你切割的最大长度是多少. 本题思路:其实很容易可以想到先找到一个上界和一个下界,开始枚举里面的所有长度,取最长 ...
- Mybatis-基本步骤
1.1Mybatis框架概述 Mybatis是基于Java的持久层框架,内部封装了jdbc,使开发者只需关注sql语句本身,而不需要花费精力去处理加载驱动.创建连接.创建Statement等繁杂的过程 ...