mysq通过ProxySQL实现读写分离_weixin_34290352的博客-程序员秘密

技术标签: runtime  后端  数据库  

mysq通过ProxySQL实现读写分离

常见的读写分离应用

    Oracle:mysql-proxy
    qihoo:Atlas
    美团:dbproxy
    网易:cetus
    amoeba
    阿里巴巴:cobar 基于amoeba研发
    Mycat:基于cobar实现
    ProxySQL

ProxySQL:MySQL中间件

  • 版本:
    • 官方版
    • percona版:percona公司基于官方版本用C++语言开发,性能更优
  • 特点:具有中间件所需的绝大多数功能,包括:
    • 多种方式的读/写分离
    • 定制基于用户、基于schema、基于语句的规则对SQL语句进行路由
    • 缓存查询结果
    • 后端节点监控

      官方站点:https://proxysql.com/

ProxySQL安装:

  • 准备:

    • 实现读写分离前,先实现主从复制

      注:slave服务器 配置文件中必须为 read_only=1,ProxySQL通过read_only=1参数,确定哪个是salve服务器

  • 基于YUM仓库安装:

    [ [email protected] ~]# 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/\$releasever
    gpgcheck=1
    gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
    EOF
  • 基于RPM下载安装:https://github.com/sysown/proxysql/releases

  • ProxySQL的组成:

    • 服务脚本:/etc/init.d/proxysql
    • 配置文件:/etc/proxysql.cnf
    • 主程序:/usr/bin/proxysql
    • 基于SQLITE的数据库文件:/var/lib/proxysql/
  • 启动ProxySQL:service proxysql start

    • 启动后会监听两个默认端口:
      • 6032:ProxySQL的管理端口
      • 6033:ProxySQL对外提供服务的端口
  • 使用mysql客户端连接到ProxySQL的管理端口6032,默认管理员用户和密码都是admin

    [ [email protected] ~]# mysql -uadmin -padmin -p6032 -hhost
  • ProxySQL实现读写分离:

    内置了SQLite小型数据库,里面存储了proxysql的设置

    • 内置的数据库说明:
    • main:是默认的数据库名,表里面存放后端db实例,用户验证,路由规则等信息,表名以runtime_开头表示ProxySQL当前运行的配置内容,不能通过dml语句修改,只能修改对应的不以runtime_开头的表,然后LOAD使其生效,save使其保存到硬盘一共下次重启加载
    • disk:是持久化到停盘的配置,sqlite数据文件
    • stats:是ProxySQL运行抓取到的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间、等等
    • monnitor:库存储monitor模块收集的信息,主要是对后端db的健康/延迟检查
      注:监控模块的指标存在log表中
    - 说明:
        1. 在main和monitor数据库中的表,runtime_开头的是运行时的配置,不能修改,只能修改非runtime_表
        2. 修改后必须执行LOAD … TO RUNTIME才能加载到RUNTIME生效
        3. 执行save … to disk 才将配置持久化保存到磁盘,即保存在proxysql.db文件中
        4. global_variables 有许多变量可以设置,其中就包括监听的端口、管理账号等   
        参考: https://github.com/sysown/proxysql/wiki/Global-variables

配置- ProxySQL:

  • 向ProxySQL中的main库中指定mysql节点(不需要使用use main也可以):
    1. 查看指定的表结构:
        select * from sqlite_master where name='mysql_servers'\G 
    2. 添加所有参与主从复制的主机: 
        insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.22.45.131',3306);  
         insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.22.45.132',3306);  
    3. 加载到runtime中使其生效:
        load mysql servers to runtime;
    4. 保存到硬盘中:
        save mysql servers to disk;
    字段说明:  
        hostgroup_id:分组id,用来实现区分读组和写组,后续可通过ProxySQL程序自动判断  
        hostname:主从服务器的地址  
        port:主从服务器监听的端口号
  • master和slave节点操作:
    • 添加监控后端节点的用户,ProxySQL通过每个节点的read_only值来自动调整它们是属于读组还是写组
      • 主从节点创建用户:
        grant replication client on *.* to monitor@'172.22.45.%' identified by 'centos'; #用来实现proxysql连接主从节点
  • ProxySQL上配置监控:

    set mysql-monitor_username='monitor';
    set mysql-monitor_password='centos';
    load mysql variables to runtime;
    save mysql variables to disk;   
    
    查看监控连接是否正常:
        select * from mysql_server_connect_log;
    查看监控心跳信息(对ping指标的监控):
        select * from mysql_server_ping_log;
    查看read_only和replication_lag的监控日志
        select * from mysql_server_read_only_log;
        select * from mysql_server_replication_lag_log;
  • 设置分组信息:
    • 需要修改的是main库中的mysql_replication_hostgroups表,该表有3个字段:writer_hostgroup,reader_hostgroup,comment, 指定写组的id为10,读组的id为20
      insert inot mysql_replication_hostgroups values(10,20,'test');
      load mysql servers to runtime;
      save mysql servers to disk;
      # Monitor模块监控后端的read_only值,按照read_only的值将节点自动移动到读/写组
      查看主从服务器的分组信息:
      select hostgroup_id,hostname,port,status,weight from mysql_servers; 
      +--------------+---------------+------+--------+--------+
      |        hostgroup_id | hostname      | port | status | weight |
      +--------------+---------------+------+--------+--------+
      | 10           | 172.22.45.131 | 3306 | ONLINE | 1      |
      | 20           | 172.22.45.132 | 3306 | ONLINE | 1      |
      +--------------+---------------+------+--------+--------+
  • 配置发送SQL语句的用户:
    • 在master节点上创建访问用户
      grant all on *.* to sqluser@'host' identified by 'centos'; #用来让用户连接proxy使用
    • 在ProxySQL配置,将用户sqluser添加到mysql_users表中, default_hostgroup默认组设置为写组10,当读写分离的路由规则不符合时,会访问默认组的数据库
      insert into mysql_users(username,password,default_hostgroup)values('sqluser','magedu',10);
      load mysql servers to runtime;
      save mysql servers to disk;
    • 测试:目前由于没有设置读写分离的路由规则,则所有的读写语句都到默认的分组10中实现
      mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e 'select @@server_id'
      +-------------+
      | @@server_id |
      +-------------+
      |         131 |
      +-------------+
      mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e 'create database testdb'
      mysql -usqluser -pcentos testdb -P6033 -h127.0.0.1 -e 'create table t(id int)'
  • 配置读写分离的路由规则:

    与规则有关的表:mysql_query_rules和mysql_query_rules_fast_routing,后者是前者的扩展表,1.4.7之后支持
    插入路由规则:将select语句分离到20的读组,select语句中有一个特殊语句SELECT...FOR UPDATE它会申请写锁,应路由到10的写组:

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

    load mysql query rules to runtime;
    save mysql query rules to disk;
    #注意:因ProxySQL根据rule_id顺序进行规则匹配,select ... for update规则的 rule_id必须要小于普通的select规则的rule_id

  • 测试读操作是否路由给20的读组
        mysql -usqluser -pmagedu -P6033 -h127.0.0.1 -e 'select @@server_id'
            +-------------+
            | @@server_id |
            +-------------+
            |         131 |
            +-------------+
  • 测试写操作,以事务方式进行测试
    mysql -usqluser -pcentos -P6033 -h172.22.45.133 -e 'start transaction;select @@server_id;commit;select @@server_id'
        +-------------+
        | @@server_id |
        +-------------+
        |         131 |
        +-------------+
        +-------------+
        | @@server_id |
        +-------------+
        |         132 |
        +-------------+
    mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e 'insert testdb.t values (1)'
    mysql -usqluser -pcentos -P6033 -h127.0.0.1 -e 'select id from testdb.t'
  • 路由的信息:查询stats库中的stats_mysql_query_digest表
    SELECT hostgroup hg,sum_time, count_star, digest_text FROM stats_mysql_query_digest ORDER BY sum_time DESC;

转载于:https://blog.51cto.com/13408885/2392208

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34290352/article/details/91676589

智能推荐

TechEd2013 Shanghai Hol Session PPT Share_weixin_30552811的博客-程序员秘密

上个月去上海参加了TechEd 2013,并且参与了Hands-on-Lab环节,作为讲师引导大家完成《Local DB in WP8》实验的内容。由于实验的内容采用MVVM架构完成,因此内容相对较多,在此将PPT分享给大家。点击此处下载。另外,关于这部分的内容,建议大家去MSDN和Channel9上浏览相关的资源:1. MSDN:How to create a local databas...

倍福TwinSAFE逻辑功能块,TwinCAT3知识库中文汉化工程_twincat3中文语言包_python & TwinCAT的博客-程序员秘密

TwinCAT知识库包括中文汉化工程,和图解工程,旨在为大家提供更好的TwinCAT使用。1前言71.1 文件说明71.1.1目标组71.1.2源于文件71.1.3当前71.1.4产品特征71.1.5免责声明71.1.6商标71.1.7专利71.1.8版权81.1.9交付条件81.2 安全说明81.2.1交付状态81.2.2运营商履行勤勉义务81.2.3注释解释91.2.4文件发布状态102系统说明112.1 TwinSAFE逻辑端子EL69x0/KL

自然语言处理笔记_北京大学 自然语言处理备课笔记_楚轩QK的博客-程序员秘密

NLTK 和jieba官方网址: http://www.nltk.org/python上著名的自然语言处理库,自带语料库,词性分类库,自带分类,分词,等等功能,还有N多的简单版wrapper安装NLTK和jieba:sudo pip install -U nltksudo pip install -U numpysudo pip install jieba下载语料库:import...

程序员是这样炼成的(7)-水滴石穿_火山哥的博客-程序员秘密

        周末跟曾经的一位程序员同事聊天,他说他貌似遇到了技术的瓶颈了,最近一直在刻苦攻读,希望可以突破自己取得进步。有时候想想自己还挺惭愧的,高手们况且都还在不断的努力,自己的日子过的总是有点太安逸。我们总是在清醒的时候,喜欢为自己制定计划,每天要完成多少行代码,多少天要看完一本技术方面的书,但是计划总是没有办法实现,因为我们有一个口头禅叫"没时间"。 编程其实没有捷径可走,虽然你可以

查看Oracle执行计划的几种方法_草原的风的博客-程序员秘密

    查看Oracle执行计划的几种方法一、通过PL/SQL Dev工具   1、直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果。其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。   2、先执行 EXPLAIN PLAN FOR  select * f

随便推点

【NLP】自建维基百科语料库_YWP_2016的博客-程序员秘密

下载维基百科原始语料wikidump 开源语料库(https://dumps.wikimedia.org/zhwiki/) 示例语料:zhwiki-20211220-pages-articles-multistream.xml.bz22.3 GB处理.bz2为文本文件命令行 改预处理文件(1_process.py)路径下:执行python 1_process.py zhwiki-20211220-pages-articles-multistream.xml.bz2 wiki.zh.txt..

使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (二)之地形场景漫游导览制作_大势燎原的博客-程序员秘密

一.综述关于地图或者场景漫游导览的生成方式有两种,一种是以代码记录一组摄像头位置然后使用代码牵引摄像头然后使用差值进行平滑遍历;另外一种就是使用Animation了。至少目前我知道的是这两种方式。二.Animation的使用接下来其实就是如何使用Animation做一个导览动画了,我主要讲解地图导览动画的生成技巧

用例_Iron_Sky的博客-程序员秘密

用例的官方定义是:用例定义了一组用例实例,其中每个用例实例都是系统所执行的一系列操作,这些操作生成特定主角可以观察的值。具体的说,用例是一件事,完成这件事需要一系列的活动,做这件事可以用不同的方法和步骤,可会遇到各种情况,因此这件事就是由很多不同的情况集合构成的,这些情况在UML称为用例场景,一个场景就是用例的实例。  一个系统的功能性是由一些对系统有愿望的主角要做的一些事构成的,当全部主角的

基于Pyecharts v1.0+版本的数据可视化_Bright在努力的博客-程序员秘密

一、Pyecharts 简介Echarts是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,Pyecharts诞生了。Pyecharts最早只适用于工程领域的可视化开发,但是随着其对Jupyter notebook、Jupyter lab等交互式开发工具的支持不断加强,现在也开始被许多数据分析师应用到数据探索中。注:V1.x之前的版本已不再维护,建议直接学习最新V 1

Java SE有几个代码_有没有贵人?求一些能覆盖到javase全部java基础知识点的小项目的源代码?..._weixin_39889597的博客-程序员秘密

展开全部给你个做好了的Java的源程序的记事本32313133353236313431303231363533e4b893e5b19e31333339663935,自己看看就行了的,不怎么难的···import java.awt.*;import java.awt.event.*;import java.io.*;import javax.swing.*;public class MyNotepa...

下一个超越Facebook的社交网络长什么样?_weixin_34304013的博客-程序员秘密

过去10年间最成功的社交网络是这样产生的:我们需要有一个真实的资料页面认识其他人,并且分享自己的生活,于是有了Facebook;我们需要一个代表职业身份的资料页面,描绘自己的职业生涯,于是有了LinkedIn;进入移动互联网时代,写博客交流文字费时费力,我们需要快速即时的沟通,于是有了Twitter;手机摄像头进步了,人们想拍摄更美的照片并且分享给别人,...

推荐文章

热门文章

相关标签