当前位置: 首页 > news >正文

MySQL 读写分离介绍及搭建

MySQL读写分离介绍


MySQL读写分离基本原理是让master数据库处理写操作,slave数据库处理读操作。master将写操作的变更同步到各个slave节点。


MySQL读写分离能提高系统性能的原因在于:


  • 物理服务器增加,机器处理能力提升。拿硬件换性能。


  • 主从只负责各自的读和写,极大程度缓解X锁和S锁争用。


  • slave可以配置myiasm引擎,提升查询性能以及节约系统开销。


  • master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步。


  • slave可以单独设置一些参数来提升其读的性能。


  • 增加冗余,提高可用性。


MySQLProxy介绍


下面使用MySQL官方提供的数据库代理层产品MySQLProxy搭建读写分离。
MySQLProxy实际上是在客户端请求与MySQLServer之间建立了一个连接池。所有客户端请求都是发向MySQLProxy,然后经由MySQLProxy进行相应的分析,判断出是读操作还是写操作,分发至对应的MySQLServer上。对于多节点Slave集群,也可以起做到负载均衡的效果。


MySQL读写分离配置


MySQL环境准备


master 192.168.1.5

slave 192.168.1.6

proxy 192.168.1.2

MySQL:5.5.37

MySQL-proxy:mysql-proxy-0.8.4-linux-rhel5-x86-64bit.tar.gz


创建用户并分配权限


mysql> create user libai identified by 'libai';

mysql> grant all on *.* to libai@'192.168.1.%' identified by 'libai';


在配置了MySQL复制,以上操作在master执行会同步到slave节点。


启用MySQL复制


MySQL复制配置请参考这里


先关闭并清除之前的复制。


    mysql> stop slave;

    mysql> reset slave all;


启用新的复制同步。启用之前需要清除日志


mysql> change master to master_host='192.168.1.5',master_user='libai',master_password='libai',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=0;


主库


    # mysql -h localhost -ulibai -plibai

    mysql> create database d;

    mysql> use d;

    mysql> create table t(i int);

    mysql> insert into t values(1);


从库


    mysql> select * from t;

    +------+

    | i    |

    +------+

    |    1 |


启用MySQLProxy代理服务器


代理服务器上创建mysql用户


    # groupadd mysql

    # useradd -g mysql mysql


解压启动mysql-proxy


# ./mysql-proxy --daemon --log-level=debug --user=mysql --keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.1.5:3306" --proxy-read-only-backend-addresses="192.168.1.6:3306" --proxy-lua-script="/root/soft/mysql-proxy/rw-splitting.lua" --plugins=admin --admin-username="admin" --admin-password="admin" --admin-lua-script="/root/soft/mysql-proxy/lib/mysql-proxy/lua/admin.lua"


其中proxy-backend-addresses是master服务器,proxy-read-only-backend-addresses是slave服务器。可以通过./mysql-proxy --help 查看详细说明。


查看启动后进程


    # ps -ef | grep mysql

    root     25721     1  0 11:33 ?        00:00:00 /root/soft/mysql-proxy/libexec/mysql-proxy --daemon --log-level=debug --user=mysql --keepalive --log-file=/var/log/mysql-proxy.log --plugins=proxy --proxy-backend-addresses=192.168.1.5:3306 --proxy-read-only-backend-addresses=192.168.1.6:3306 --proxy-lua-script=/root/soft/mysql-proxy/rw-splitting.lua --plugins=admin --admin-username=admin --admin-password=admin --admin-lua-script=/root/soft/mysql-proxy/lib/mysql-proxy/lua/admin.lua

    mysql    25722 25721  0 11:33 ?        00:00:00 /root/soft/mysql-proxy/libexec/mysql-proxy --daemon --log-level=debug --user=mysql --keepalive --log-file=/var/log/mysql-proxy.log --plugins=proxy --proxy-backend-addresses=192.168.1.5:3306 --proxy-read-only-backend-addresses=192.168.1.6:3306 --proxy-lua-script=/root/soft/mysql-proxy/rw-splitting.lua --plugins=admin --admin-username=admin --admin-password=admin --admin-lua-script=/root/soft/mysql-proxy/lib/mysql-proxy/lua/admin.lua


4040是proxy端口,4041是admin管理端口


    # lsof -i:4040

    COMMAND     PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

    mysql-pro 25722 mysql   10u  IPv4 762429      0t0  TCP *:yo-main (LISTEN)

    # lsof -i:4041

    COMMAND     PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

    mysql-pro 25722 mysql   11u  IPv4 762432      0t0  TCP *:houston (LISTEN)


测试


保证mysqlproxy节点上可执行mysql 。通过复制同步帐号连接proxy


    # mysql -h 192.168.1.2 -ulibai -p --port=4040

    mysql> show databases;

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

    | Database           |

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

    | information_schema |

    | d                  |

    | mysql              |

    | performance_schema |

    | test               |

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


登录admin查看状态


    # mysql -h 192.168.1.2 -u admin -p --port=4041

    mysql> select * from backends;

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

    | backend_ndx | address          | state | type | uuid | connected_clients |

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

    |           1 | 192.168.1.5:3306 | up    | rw   | NULL |                 0 |

    |           2 | 192.168.1.6:3306 | up    | ro   | NULL |                 0 |

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

    2 rows in set (0.00 sec)


可以从以上查询中看到master和slave状态均为up。


1)登录proxy节点,创建数据库dufu,并创建一张表t


    mysql> create database dufu;

    mysql> show databases;

    mysql> use dufu;

    mysql> create table t(id int(10),name varchar(20));

    mysql> show tables;


创建完数据库及表后,主从节点上应该都可以看到


2)关闭同步,分别在master和slave上插入数据


mysql> slave stop;

master


mysql> insert into t values(1,'this_is_master');

slave


mysql> insert into t values(2,'this_is_slave');


3)proxy上查看结果


    mysql> use dufu;

    mysql> select * from t;

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

    | id   | name          |

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

    |    2 | this_is_slave |

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

    1 row in set (0.00 sec)


从结果可以看到数据是从slave上读取的,并没考虑master节点上的数据。


直接从proxy上插入数据


mysql> insert into t values(3,'this_is_proxy');


再次查询


    mysql> select * from t;

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

    | id   | name          |

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

    |    2 | this_is_slave |

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


结果显示查询数据没有变化,因为proxy上执行insert相当于写入到了master上,而查询的数据是从slave上读取的。


master上查询


    mysql> select * from t;

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

    | id   | name           |

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

    |    1 | this_is_master |

    |    3 | this_is_proxy  |

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


启用复制,proxy查询


    mysql> select * from t;

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

    | id   | name           |

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

    |    2 | this_is_slave  |

    |    1 | this_is_master |

    |    3 | this_is_proxy  |

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


说明此时master上的数据同步到了slave,并且在proxy查询到数据是slave数据库的数据。此时,可以看到MySQLProxy实现了分离。

转自:bestvivi 


相关文章:

  • corosync + pacemaker + nfs 构建高可用mysql集群
  • GCC编译器使用
  • EHcache经典配置
  • 基于 lua-resty-upload 实现简单的文件上传服务
  • 面试题系列一之 程序生命周期
  • Linux常用网络命令
  • 静态long类型常量serialVersionUID的作用
  • 用百度输入法的用户体验
  • 代码写累了就画点注释陶冶情操
  • 深入解析Java中的装箱和拆箱
  • SQL SERVER 表最小行的一个纠结问题
  • 利用Android Lost通过互联网或短信远程控制安卓设备
  • http://blog.csdn.net/huang_xw/article/details/7090173
  • Outlook 2013 在邮件里面点击超链接时弹出“组织策略阻止我们为您完成此操作”...
  • Wordpress简单配置
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • DOM的那些事
  • E-HPC支持多队列管理和自动伸缩
  • export和import的用法总结
  • extjs4学习之配置
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JAVA SE 6 GC调优笔记
  • java取消线程实例
  • jquery ajax学习笔记
  • Making An Indicator With Pure CSS
  • python docx文档转html页面
  • SAP云平台里Global Account和Sub Account的关系
  • spring学习第二天
  • vue-cli在webpack的配置文件探究
  • 力扣(LeetCode)357
  • 力扣(LeetCode)965
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 译米田引理
  • linux 淘宝开源监控工具tsar
  • Mac 上flink的安装与启动
  • MyCAT水平分库
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​力扣解法汇总946-验证栈序列
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #1015 : KMP算法
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #预处理和函数的对比以及条件编译
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (七)理解angular中的module和injector,即依赖注入
  • (四)Android布局类型(线性布局LinearLayout)
  • .NET 8.0 中有哪些新的变化?
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .Net7 环境安装配置