jjzjj

MySQL MyCAT 读写分离实战

程序猿十五 2023-03-28 原文

1.MySQL读写分离概念:

MYSQL读写分离的原理其实就是让Master数据库处理事务性增、删除、修改、更新操作(CREATE、 INSERT、UPDATE、DELETE),而让Slave数据库处理SELECT操作,MYSQL读写分离前提是基于 MYSQL主从复制,这样可以保证在Master上修改数据,Slave同步之后,WEB应用可以读取到Slave端 的数据。

1.1读写分离实现方式:
实现MYSQL读写分离可以基于第三方插件,也可以通过开发修改代码实现,具体实现的读写分离的常见 方式有如下四种:

Amoeba 读 写 分 离 ; MySQL-Proxy读写分离;

Mycat读写分离;

基于程序读写分离(效率很高,实施难度大,开发改代码);

Amoeba 是阿里08年开源的以MySQL为底层数据存储,并对WEB、APP应用提供MySQL协议接口的proxy。它集中地响应WEB应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上 执行,基于此可以实现负载均衡、读写分离、高可用性等需求。

Mysql-Proxy是MySQL官方提供的mysql中间件服务,支持无数客户端连接,同时后端可连接若干台Mysql-Server服务器,MYSQL-Proxy自身基于MySQL协议,连接MYSQL-Proxy的客户端无需修改任何 设置, 跟正常连接MYSQL Server没有区别,无需修改程序代码。

Mycat是基于阿里12年开源的cobar开发的一个数据库中间件,在架构体系中是位于数据库和应用层之 间的一个组件,并且对于应用层是透明的,它可实现读写分离,分库分表。

2.基于mysql-proxy实现读写分离:

proxy: 192.168.75.133 master: 192.168.75.134 slave: 192.168.75.135

2.1工作原理图解:

2.2配置proxy:

proxy可以选择和mysql部署在同一台服务器,也可以选择单独部署在另一台独立服务器。

# 下载mysql-proxy: wget http://mirrors.163.com/mysql/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux- el6-x86-64bit.tar.gz # 解压: tar xf mysql-proxy-0.8.4-linux-el6-x86-64bit.tar.gz mv mysql-proxy-0.8.4-linux-el6-x86-64bit /usr/local/mysql-proxy # 配置环境变量: [root@node3 src]# echo "export PATH=/usr/local/mysql-proxy/bin:$PATH" > /etc/profile.d/mysql-proxy.sh [root@node3 src]# . /etc/profile.d/mysql-proxy.sh # 启动MYSQL-Proxy中间件: [root@node3 src]# useradd -r mysql-proxy [root@node3 src]# mysql-proxy --daemon --log-level=debug --user=mysql-proxy -- keepalive --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend- addresses="192.168.75.134:3306" --proxy-read-only-backend- addresses="192.168.75.135:3306" --proxy-lua-script="/usr/local/mysql- proxy/share/doc/mysql-proxy/rw-splitting.lua" --plugins=admin --admin- username="admin" --admin-password="admin" --admin-lua-script="/usr/local/mysql- proxy/lib/mysql-proxy/lua/admin.lua" # 查看端口/日志: [root@node3 src]# netstat -ntlp |grep 40 tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 1348/mysql-proxy tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 1348/mysql-proxy

2.3启动的相关参数:

# Mysql-Proxy的相关参数详解如下: --help-all :获取全部帮助信息; --proxy-address=host:port :代理服务监听的地址和端口,默认为4040; --admin-address=host:port :管理模块监听的地址和端口,默认为4041; --proxy-backend-addresses=host:port :后端mysql服务器的地址和端口; --proxy-read-only-backend-addresses=host:port :后端只读mysql服务器的地址和端口; --proxy-lua-script=file_name :完成mysql代理功能的Lua脚本; --daemon :以守护进程模式启动mysql-proxy; --keepalive :在mysql-proxy崩溃时尝试重启之; --log-file=/path/to/log_file_name :日志文件名称; --log-level=level :日志级别; --log-use-syslog :基于syslog记录日志; --plugins=plugin :在mysql-proxy启动时加载的插件; --user=user_name :运行mysql-proxy进程的用户; --defaults-file=/path/to/conf_file_name :默认使用的配置文件路径,其配置段使用[mysql- proxy]标识; --proxy-skip-profiling :禁用profile; --pid-file=/path/to/pid_file_name :进程文件名;

2.4启动master/slave

systemctl start mariadb

2.5查看读写分离状态:

基于4041端口MySQL-Proxy查看读写分离状态,登录4041管理端口

2.5授权proxy:

grant all on *.* to "mysql-proxy"@"192.168.75.133" identified by "123456";

2.6通过代理创建数据:

通过4040代理端口插入数据,该sql语句会走master,于是可以激活master状态:

mysql -h192.168.75.133 -umysql-proxy -p123456 -P4040 -e "create database lutixia charset utf8;" 在4041管理端口,再次查看:

2.7通过代理查询数据:

# 先在从库选择lutixia数据库(因为主从关系,在主库创建的lutixia会同步至从库),创建表格,并插入数据: MariaDB [(none)]> use lutixia Database changed MariaDB [lutixia]> create table t1( id int, name varchar(20) ); Query OK, 0 rows affected (0.00 sec) MariaDB [lutixia]> insert t1 values(1,"xiaoming"); Query OK, 1 row affected (0.00 sec) 通过4040代理端口查询数据,该sql语句会走slave,于是可以激活slave状态:

# 多执行几次! [root@node4 ~]# mysql -h192.168.75.133 -umysql-proxy -p123456 -P4040 -e "select * from lutixia.t1;" +------+----------+ | id | name | +------+----------+ | 1 | xiaoming | +------+----------+ 在4041管理端口,再次查看:

mysql> select * from backends; +-------------+---------------------+-------+------+------+-------------------+ | backend_ndx | address | state | type | uuid | connected_clients | +-------------+---------------------+-------+------+------+-------------------+ | 1 | 192.168.75.134:3306 | up | rw | NULL | 0 | | 2 | 192.168.75.135:3306 | up | ro | NULL | 0 | +-------------+---------------------+-------+------+------+-------------------+ 2 rows in set (0.00 sec)

3.基于Mycat实现读写分离:

Mycat基于阿里开源的Cobar产品而研发 , 一个彻底开源的,面向企业应用开发的大数据库集群 , 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 ,MYCAT并不依托于任何一个商业公司, 永不收费,永不闭源 !

mycat:192.168.75.133 master:192.168.75.134 slave:192.168.75.135

3.1安装mycat:

# 下载mycat: wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042- linux.tar.gz # 解压: tar xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /usr/local/ # 安装java-jdk: yum install java-1.8.0-openjdk -y # 配置mycat环境变量: echo "export PATH=/usr/local/mycat/bin:$PATH" > /etc/profile.d/mycat.sh . /etc/profile.d/mycat.sh

3.2授权mycat:

# 在主库执行授权信息,从库会自动同步: grant all on *.* to "mycat-proxy"@"192.168.75.133" identified by "123456";

3.3配置mycat:

# 配置server.xml # 默认管理用户,可读可写: <user name="mycat" defaultAccount="true"> <property name="password">123456</property> <property name="schemas">lutixiadb</property> ... </user> # 只读用户: <user name="user"> <property name="password">user</property> <property name="schemas">lutixiadb</property> <property name="readOnly">true</property> </user> # 配置schema.xml # 设置逻辑库以及数据库节点 <schema name="lutixiadb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> # 配置数据库节点对应的后端真实的数据库: <dataNode name="dn1" dataHost="localhost1" database="students" /> # 配置读写库以及均衡: <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.75.134:3306" user="mycat- proxy" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS1" url="192.168.75.135:3306" user="mycat-proxy" password="123456" /> </writeHost> </dataHost>

3.3启动mycat:

mycat start

3.4连接测试:

mysql -umycat -p123456 -P8066 -h127.0.0.1 MySQL [(none)]> show databases; +-----------+ | DATABASE | +-----------+ | lutixiadb | +-----------+ 1 row in set (0.00 sec) # 可以在后端主库创建一个表,继续查询表测试: MySQL [(none)]> use lutixiadb; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MySQL [lutixiadb]> show tables; +--------------------+ | Tables_in_students | +--------------------+ | t1 | +--------------------+ 1 row in set (0.01 sec) # 在从库插入数据,继续查询: MySQL [lutixiadb]> select * from t1; +------+----------+ | id | name | +------+----------+ | 1 | xiaowang | +------+----------+ 1 rows in set (0.00 sec) 在主库查不到数据,通过代理可以查到,即可验证读写分离成功。

3.5报错解决:

MySQL [lutixiadb]> show tables; ERROR 1184 (HY000): Invalid DataSource:0 可能是后端节点出现了问题,也有可能是代理端无法连上后端节点导致: 可以先在代理端直接用授权用户名和密码登录后端数据库测试连接问题: [root@node3 conf]# mysql -umycat-proxy -h192.168.75.134 -p123456 ERROR 1129 (HY000): Host 'node3' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' # 可以看到因为多次错误,代理端服务器被锁定了,所以也会出现上面的报错: 在后端主库执行如下命令: mysqladmin flush-hosts 再次测试,一般问题就能解决。

有关MySQL MyCAT 读写分离实战的更多相关文章

  1. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  2. 你真正了解什么是接口测试么?接口实战一“篇”入魂 - 2

    最近在工作中,看到一些新手测试同学,对接口测试存在很多疑问,甚至包括一些从事软件测试3,5年的同学,在聊到接口时,也是一知半解;今天借着这个机会,对接口测试做个实战教学,顺便总结一下经验,分享给大家。计划拆分成4个模块跟大家做一个分享,(接口测试、接口基础知识、接口自动化、接口进阶)感兴趣的小伙伴记得关注,希望对你的日常工作和求职面试,带来一些帮助。注:文章较长有5000多字,希望小伙伴们认真看完,当然有些内容对小白同学不是太友好,如果你需要详细了解其中的一些概念或者名词,请在文章之后留言,后续我将针对大家的疑问,整理输出一些大家感兴趣的文章。随着开发模式的迭代更新,前后端分离已不是新的概念,

  3. 企业大数据发展面临问题之存算分离技术思考 - 2

    文章目录概述背景为何要存算分离优势**应用场景**存算分离产品技术流派华为JuiceFSHashDataXSKY概述背景Hadoop一出生就是奔存算一体设计,当时设计思想就是存储不动而计算(code也即是代码程序)动,负责调度Yarn会把计算任务尽量发到要处理数据所在的实例上,这也是与传统集中式存储最大的不同。为何当时Hadoop设计存算一体的耦合?要知道2006年服务器带宽只有100Mb/s~1Gb/s,但是HDD也即是磁盘吞吐量有50MB/s,这样带宽远远不够传输数据,网络瓶颈尤为明显,无奈之举只好把计算任务发到数据所在的位置。众观历史常言道天下分久必合合久必分,随着云计算技术的发展,数据

  4. ruby - 在未安装 Excel 的服务器上使用 Ruby 读写 Excel 文件 - 2

    我需要在一台没有安装Excel的Linux服务器上读写(->转换)Excel文件。对于Python,存在http://www.python-excel.org/.Ruby有类似的东西吗?可能不需要处理最新的Office格式。只需旧的xls文件就足够了。 最佳答案 我同意Gonzih的观点,并且我经常使用roo。它允许我使用模板文件进行读取、写入和写入。该项目在他们的site上有很好的记录。.我总是使用类似的东西:input=Excel.new(path)output=Array.newinput.default_sheet=inpu

  5. ruby - 使用符号读写 Sinatra 参数,例如参数[:id] - 2

    我的表单通过POST接收数据。当我执行putsparams时,我可以看到:{"id"=>"123","id2"=>"456"}现在是命令:putsparams['id']#=>123putsparams[:id]#=>123params['id']='999'putsparams#=>{"id"=>"999","id2"=>"456"}但是当我这样做的时候:params[:id]='888'putsparams我明白了{"id"=>"999","id2"=>"456",:id=>"888"}在IRB中它工作正常:params#=>{"id2"=>"2","id"=>"1"}params

  6. FIFO实战学习-同步FIFO/异步FIFO-格雷码 - 2

    目录FIFO一.自定义同步FIFO1.1代码设计1.2Testbech1.3行为仿真***学习位宽计算函数$clog2()***$clog2()系统函数使用,可以不关注***分布式资源或者BLOCKBRAM二.异步FIFO2.1在FIFO判满的时候有两种方式:2.2异步FIFO为什么要使用格雷码2.2.1介绍格雷码2.2.2格雷码在异步FIFO中的应用2.2.2格雷码判满2.4二进制与格雷码之间的转换2.4.1二进制码转换为格雷码的方法2.4.2格雷码转换为二进制码的方法2.3实现框图2.5实现及仿真代码2.6仿真图验证2.7结论FIFO  这篇更多的是记录FIFO学习,参考了众多优秀的文章,

  7. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  8. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序 - 2

    一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024

  9. SpringCloud入门实战(七)-Hystrix入门简介 - 2

    📝学技术、更要掌握学习的方法,一起学习,让进步发生👩🏻作者:一只IT攻城狮。💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。❤️《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo:源码地址👉🏻SpringCloud入门实战系列不迷路👈🏻:SpringCloud入门实战(一)什么是SpringCloud?SpringCloud入门实战

  10. ruby - 我可以使用 RSpec 模拟标准输入/标准输出来测试控制台读写吗? - 2

    我的Ruby程序从stdin读取行并使用puts打印到stdout(终端)。我可以使用RSpec来测试读写吗?我可以像在stdin中编写的那样向我的程序注入(inject)一个字符串,同时检查输出吗?line=STDIN.read.chomp.split另外,我在一个循环中进行读取和写入,直到line[0]被“退出”。我可以在循环运行时进行测试,还是应该调用subject.read_in和subject.write_out? 最佳答案 您可以使用模拟并通过在and_return()方法中列出多个值来多次调用该方法。这些将按照给定的顺

随机推荐