接着主从复制继续往下讲,这个项目中我是使用proxysql做读写分离的中间件,之前是使用mycat.老实说mycat属于比较重量级的中间件,1.0还好到了2.0配置变得很复杂而且文档不是很齐全,我看着比较吃力.所以我就选择了proxysql作为读写分离的中间件,相比mycat 它更加轻量级、配置简单、更改配置的时候不用重启就能生效。

快捷安装命令

还是是喜欢一键脚本安装比较省力气。其他安装方法请看 https://gitee.com/mirrors/proxysql#red-hat--centos

  1. cat <<EOF | tee /etc/yum.repos.d/proxysql.repo[proxysql_repo]name= ProxySQL YUM repositorybaseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.0.x/centos/\$releasevergpgcheck=1gpgkey=https://repo.proxysql.com/ProxySQL/repo_pub_key EOF 
     

然后执行

  1. yum install proxysql #安装默认
  2. yum install proxysql-version #安装指定版本 二选一
  3. systemctl enable proxysql #添加到开机启动
  4. systemctl start proxysql #启动服务

开始配置

proxysql客户端:6033端口 代理mysql服务的端口 也就是应用连接使用的

proxysql管理端:6032端口 管理proxysql配置的端口  只能本地登录

登录管理端

  1. mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt='Admin> ' --default-auth=mysql_native_password

proxysql的管理端和mysql的客户类似 可以使用 show tables;查询表如下图:

主要用到

mysql_servers        表是用来存储数据库实例信息

mysql_user            表是用来存储数据库实例账号信息

mysql_query_rules  路由规则表

添加数据库实例

  1. insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(1,'172.16.102.7',3306,1,'master');#添加数据库实例master
  2.  
  3. insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(2,'172.16.102.8',3306,1,'slave1');#添加数据库实例slave1
  4.  
  5. insert into mysql_servers(hostgroup_id,hostname,port,weight,comment) values(2,'172.16.102.9',3306,1,'slave2');#添加数据库实例slave2
  1. hostgroup_id mysql_servers表的主键 很重要路由规则和账号表都有用到
  1. hostname mysql数据库实例的ip

       port mysql数据库实例的端口

     weight 负载权重 数字越大承受的请求越多
  1. comment 备注

查询添加结果

  1. select * from mysql_servers; #和sql语句语法一致

如下图:

添加客户端连接账号

  1. insert into mysql_users(username,password,default_hostgroup,transaction_persistent)values('proxysql','jishuzhai',1,1);
  1. username mysql 实例的账号
  1. password mysql 实例的密码 意味着所有mysql实例需要创建相同的账号密码。
  1. default_hostgroup mysql_servers表的hostgroup_id进行关联 这里设置为1 意味着所有请求默认到hostgroup_id1的这组实例然后在根据路由规则进行分发
  1. transaction_persistent 开启事物支持 默认 0 关闭 这里设置为1开启。

查询添加结果

  1. select * from mysql_users;

如下图:

添加路由规则

  1. insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE$',1,1), (2,1,'^SELECT',2,1)

rule_id                          路由编号

active                           是否启用路由

match_digest                路由匹配规则 支持正则

destination_hostgroup    路由目标 也就数据库实例组

apply                           1 匹配目标后直接转发

   路由策略  所有请求到 default_hostgroup 设置的默认数据库实例组 然后根据路由规则把查询请求分发到hostgroup_id为2的数据库实例组

   查询添加结果

  1. select rule_id,active,match_digest,destination_hostgroup,log,apply from mysql_query_rules;

如下图:

      规则1:查询更新结果的语句匹配搭配到hostgrouo_id 为1的实例组 也就是写的实例组 

      规则2: 匹配所有查询路由到hostgroup_id 为 2的实例组  也就是读的实例组

      注意 proxysql的匹配规则是从路由编号 1开始的 所以这两条规则顺序不能颠倒 否则查询更新结果的语句永远不会路由到写的实例 因为查询包含查询更新结果。 

添加监控账号

所谓监控账号就是用来监控数据库实例状态的账号,这里我和上面使用了同一个账号,可以分开 但是要在所有实例上都要创建。

  1. set mysql-monitor_username='proxysql';
  2. set mysql-monitor_password='jishuzhai';

查看监控情况

  1. SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;

结果如下图:

如果 connect_error 不为null 说明配置 监控账号失败 请检查监控账号是否正确

设置数据库版本和语法兼容

  1. set mysql-server_version='8.0.21'; #设置数据库版本 如果不设置使用druid连接的时候会出现问题
  2. set mysql-set_query_lock_on_hostgroup=0; # 设置语法兼容 如果不配置使用数据库连接工具比如说navicat 连接执行一些特殊查询比如说select @@version 就会提示语法不兼容

加载到配置到内存

  1. load mysql users to runtime;
  2. load mysql servers to runtime;
  3. load mysql query rules to runtime;
  4. load mysql variables to runtime;
  5. load admin variables to runtime;

写入配置到硬盘

  1. save mysql users to disk;
  2. save mysql servers to disk;
  3. save mysql query rules to disk;
  4. save mysql variables to disk;
  5. save admin variables to disk;

建议每次修改完配置都执行一遍

接下来关闭从数据库的数据复制 在所有从数据库 执行

  1. stop slave # 接着上篇 关闭主从复制

登录到proxysql 客户端 可以使用数据库连接工具登录也可以使用mysql客户端登录

mysql -uproxysql -pjishuzhai -h127.0.0.1 -P6033 --default-auth=mysql_native_password

  1. show databaases; #登录后执行 显示所有数据

出现如下图:

出现这个结果说明配置成功了。

测试读写分离路由规则

  1.添加一条数据 然后查询看结果

  1. INSERT INTO `test` VALUES (4, 'master4');

如下图:

我添加了一条数据成功了 但是查询看不到结果 然后我们单独登录master数据 也就是hostgroup_id 为 1的数据实例查看 结果如下图:

结果有五条数据 说明读写分离是配置成功了

 现在我们在做一个实验 更换主数据库 把从数据库 slave1 设置为主数据库

登录proxysql 管理端

  1. mysql -uadmin -padmin -h127.0.0.1 -P6032 --prompt='Admin> ' --default-auth=mysql_native_password

1.更新mysql_servers 表 将master 的 hostgroup_id 更新为 2, 将slave1 的hostgroup_id 更新为3

2.更新mysql_users 表 将 default_hostgroup 更新为3

3.更新mysql_query_rules 表 将 destination_hostgroup 更新为 3

4.然后加载到内存中

  1. update mysql_servers set hostgroup_id = 2 where comment = 'master';
  2.  
  3. update mysql_servers set hostgroup_id = 3 where comment = 'slave1';
  4.  
  5. update mysql_users set default_hostgroup = 3;
  6.  
  7. update mysql_query_rules set destination_hostgroup = 3 where rule_id =1;

  8. load mysql users to runtime;
  9. load mysql servers to runtime;
  10. load mysql query rules to runtime;
  11. save mysql users to disk;
  12. save mysql servers to disk;
  13. save mysql query rules to disk;

登录客户端测试 结果如下图:

插入 slave6 插入成功了 但是查询的结果一个是5条记录 一个是4条记录 分别对应之前master数据 和 slave2 数据库

登录到我们刚才设置为主库的slave1数据库实例插入 结果如下图:

Slave6 这条记录在slave1的实例上 说明我们切换主数据库成功了

做这个实验是想说明 proxysql的主数据库 是通过 mysql_user 用户表 和mysql_query_rules 路由规则表结合配置的。

开发中注意的事项:

proxysql 关于一主多从数据库的配置实验结果

1.transaction_persistent必须设置为1

2.必须开启事物

3.更新或修改方法在前 查询会路由到主库

4.如果查询方法在前 更新方法在后那么查询将路由到从库 出现脏读。

我针对查询方法在前 更新方法在后这种情况单独写一个更新操作的方法并且封装为静态方法  在查询之前先调用一次更新操作 然后在查询 在更新 如下图:

Centos8.3、proxysql2.0读写分离实战记录的更多相关文章

  1. Amoeba-mysql读写分离实战

    Amoeba-mysql读写分离实战 Amoeba用途有很多,这里看标题我们就先说读写分离,因为我也只会这个.Amoeba定义为国内的,开源的.目前(2015年10月20日)我们用amoeba2.2版 ...

  2. ProxySQL+Mysql实现数据库读写分离实战

    ProxySQL介绍 ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.具有以下特性:http://www.proxysql.com/ 1.连接池,而且是multiplexing 2 ...

  3. 构建高性能web之路------mysql读写分离实战(转)

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

  4. mysql读写分离实战

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

  5. Windows环境下Mysql 5.7读写分离简单记录

    一.目的 本文记录了在Windows环境中,mysql数据库读写分离配置过程. 二.准备: Master机器:Windows 10 虚拟机,IP:192.168.3.32 Slave机器:Window ...

  6. SpringBoot + MyBatis + MySQL 读写分离实战

    1. 引言 读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做.因此,一般来讲,读写分离有两种实现方式.第一种是依靠 ...

  7. 构建高性能web之路------mysql读写分离实战

    http://blog.csdn.net/cutesource/article/details/5710645 http://www.jb51.net/article/38953.htm http:/ ...

  8. ProxySQL实现Mysql读写分离 - 部署手册

    ProxySQL是一个高性能的MySQL中间件,拥有强大的规则引擎.ProxySQL是用C++语言开发的,也是percona推的一款中间件,虽然也是一个轻量级产品,但性能很好(据测试,能处理千亿级的数 ...

  9. Windows环境下Mysql 5.7读写分离之使用mysql-proxy练习篇

    本文使用mysql-proxy软件,结合mysql读写分离,实现实战练习. 前期准备: 三台机器: 代理机,IP:192.168.3.33 mysql Master,IP:192.168.3.32 m ...

随机推荐

  1. 【一】kubernetes学习笔记-Pod概念

    一.Pod 控制器类型 Pod概念 当一个 Pod 创建后,Pause 容器就会随着 Pod 启动,只要是有 Pod,Pause 容器就要被启动. 在同一个 Pod 里面的容器不能出现端口冲突,否则这 ...

  2. class的大小

    3个问题: sizeof一个空类是多大?为什么?编译器为什么这么做? 在这个类中添加一个virtual函数后再sizeof,这时是多大?为什么? 将这个类再virtual继承一个其它的空类,这是多大? ...

  3. C# 搞桌面UI适配国产麒麟Linux+龙芯遇到的一些坑

    由于一些国企有国产化的需求,所以搞了C#适配银河麒麟,适配了X64和龙芯MIPS版本 1. 在银河麒麟的龙芯版本中 pipe2 不能使用,x64版本上却可以用.  pipe2 用来做自定义消息的,搞U ...

  4. 风变编程(Python自学笔记)第11关-杀死那只“机”生虫

    1.Debug:为程序排除错误. 2.SyntaxError:语法错误. 3.append()函数是列表的一个方法,要用句点.调用,且append()每次只能接受一个参数. 4.解决思路不清的两个工具 ...

  5. Java Arrays.sort()重写comparator方法

    先看一下接口 Arrays.sort(T[],Comparator<? super T> c); comparator要重写compare方法 compare方法大概长这样,返回值> ...

  6. Spring5学习 (核心)

    Spring5 官方文档:https://docs.spring.io/spring/docs/5.3.0-SNAPSHOT/spring-framework-reference/index.html ...

  7. 【Java】Jackson解析xml的坑

    为了获取xml数据,在spring mvc中针对 @ResponseBody配置了jackson. 刚用的时候内心是狂喜的,终于不用自己解析了----  but----------还是有坑的-- 坑一 ...

  8. 【转】Jquery 使用Ajax获取后台返回的Json数据后,页面处理

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Python中PyQuery库的使用

    pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,我个人写过的一些抓取网页数据的脚本就是用它来解析html获取数据的. 它的官方文档地址是:http://packages ...

  10. MySQL中InnoDB存储引擎的实现和运行原理

    InnoDB 存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表. InnoDB 体系架构 InnoDB 主要包括了: 内存池.后台线程以及存储文 ...