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 -ADatabase 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. MYSQL+MYCAT读写分离实战

    ****1.实战MYSQL+MYCAT读写分离实战,实现MYSQL数据库1主2从架构.**2.写出MYSQL 1主2从架构部署过程和MYCAT实战全部过程,将所有部署过程写出来和划出架构图. 1.配置 ...

  2. Mycat 读写分离实战

    Mycat读写分离实战 一.主从复制搭建 1.实验环境 搭建一主一从的部署架构,master(主库)运行在阿里云服务器 47.108.136.201,slave(从库)运行在 IP 地址为 12.16 ...

  3. mycat读写分离配置

    为什么使用MyCat         如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求.这个 ...

  4. Mycat 读写分离、主从切换、分库分表的操作记录

    Mycat 读写分离.主从切换.分库分表的操作记录 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等 ...

  5. Mycat读写分离、主从切换、分库分表的操作记录 https://www.cnblogs.com/kevingrace/p/9365840.html

    [此篇文章写得不错] 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问 ...

  6. 运维之道 | Mysql主从复制+mycat读写分离

    运维之道 | Mysql主从复制 + Mycat读写分离 1.什么是读写分离 读写分离,基本的原理是让主数据库处理事务性增.删.改操作(INSERT.UPDATE.DROP),而从数据库处理SELEC ...

  7. 读写分离 mysql_详解MySQL实现主从复制过程及mycat读写分离步骤

    一.什么是主从复制 将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做):从而使得从数据库的数据与主数据库保持一致. 二.主从复制的作用 1. ...

  8. mysql读写分离实战

    一个完整的MySQL读写分离环境包括以下几个部分: 应用程序client database proxy database集群 在本次实战中,应用程序client基于c3p0连接后端的database ...

  9. mysql主从和mycat读写分离的安装及验证

    目录 一.背景介绍 二.安装mysql数据库(主从机器都需要先这样安装) 三.主从机配置 1.主服务器进行如下操作 2.从服务器进行如下操作 四.代理服务器安装和配置mycat读写分离 五.主从复制. ...

最新文章

  1. 自动图片轮播php源码,js图片自动轮播代码分享(js图片轮播)
  2. 桩筏有限元中的弹性板计算_永清县打桩机租赁钢板桩租赁怎么联系?
  3. ERROR 2384 — [ main] o.s.boot.SpringApplication : Application run failed
  4. web前端警惕:意料之外的全局变量声明
  5. Android笔记 android 7.0 动态申请权限
  6. 如何迁移home目录
  7. [C++面试题]之冒泡排序
  8. 由php nginx 出现 500错误的启示
  9. mysql sum没法使用,mysql – 使用SUM()而不对结果进行分组
  10. 网页设计\网页制作常用软件大全
  11. [渝粤教育] 武汉大学 自然科学经典导引 参考 资料
  12. 万维网联盟:已完成对HTML5的规范开发
  13. MySQL备份的几种常用方法与恢复步骤
  14. CodeForces - 1389E E. Calendar Ambiguity(数学)
  15. OpenCV基础应用20例
  16. 计算机图形物理知识,计算机图形学:虚拟和现实世界的融合
  17. 广告业务系统 之 数据中转站 —— “日志中心-实时服务监控”
  18. hive-jdbc 的大坑
  19. “好歌曲”进“主打之争” 刘欢原创大碟打头阵
  20. (搬运)强化学习的最好benchmarks:最终列表

热门文章

  1. windows10飞行模式怎么关
  2. python binlog还原sql或者恢复数据
  3. 为了云计算,“思华”不再沉默
  4. 西安邮电大学计算机课程表,西安邮电大学2013-2014-01学期课程表(45页)-原创力文档...
  5. linux smartctl 命令,在Linux中使用Smartctl监控磁盘性能的方法
  6. vs2022无法启动调试控制台
  7. 上市公司股吧帖子爬取
  8. vscode python flake8 报错怎么办
  9. DELL电脑内测更新绿屏解决方法
  10. 【LMKD】 二 PSI 压力失速信息