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

MYCAT实现读写分离

实现环境

node01   10.0.0.17   Centos7.9  jdk1.8  mycat中间件   mycat--1.6.7.3   
node01   10.0.0.17   Centos7.9  jdk1.8  master       mysql--5.7.29   
node01   10.0.0.18   Centos7.9  jdk1.8  salve        mysql--5.7.29

实现主从复制

记得serverid要不一样,从节点在配置文件中加上read-only设置,

配置文件中加bind-address = 0.0.0.0,允许外部连接

主节点
mysql> show master logs;
​
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| node01-bin.000001 |       154 |
+-------------------+-----------+
1 row in set (0.00 sec)
​
从节点
mysql> CHANGE MASTER TO-> MASTER_HOST='10.0.0.17',-> MASTER_USER='repluser',-> MASTER_PASSWORD='123456',-> MASTER_PORT=3306,-> MASTER_LOG_FILE='node01-bin.000001', MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
​
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
​
mysql>  show slave status\G
​
测试
主节点
mysql> use db1;
Database changed
mysql> CREATE TABLE stu (-> id int UNSIGNED AUTO_INCREMENT PRIMARY KEY,-> name VARCHAR(20) NOT NULL,-> age tinyint UNSIGNED,-> gender ENUM('M','F') default 'M'-> )ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)
​
mysql>  insert into stu(name,age)values('tom',10);
Query OK, 1 row affected (0.00 sec)
​
从节点
mysql> show databases like '%db1%';
+------------------+
| Database (%db1%) |
+------------------+
| db1              |
+------------------+
1 row in set (0.00 sec)
​
mysql> select * from db1.stu;
+----+------+------+--------+
| id | name | age  | gender |
+----+------+------+--------+
|  1 | tom  |   10 | M      |
+----+------+------+--------+
1 row in set (0.00 sec)
​
#在master节点上创建账号并授权,该帐号会被同步到 slave 节点
mysql> create user 'mycat'@'10.0.0.%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL ON db1.* TO 'mycat'@'10.0.0.%';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
​

Mycat安装

使用mycat中间件搭建读写分离,那么应访问的是mycat中间件,再由mycat访问主从服务器。须jjdk环境为1.7以上,

解压文件并创建用户授权目录
[root@node01 data]# tar zxf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz -C /usr/local/
root@node01 mycat]#useradd mycat
[root@node01 mycat]#echo "mycat:123456" | chpasswd
[root@node01 mycat]#chown -R mycat:mycat /usr/local/mycat/
[root@node01 mycat]#ll /usr/local/mycat/
total 12
drwxr-xr-x 2 mycat mycat  190 Nov  5 11:17 bin
drwxrwxrwx 2 mycat mycat    6 Jul 18  2019 catlet
drwxrwxrwx 4 mycat mycat 4096 Nov  5 11:17 conf
drwxr-xr-x 2 mycat mycat 4096 Nov  5 11:17 lib
drwxrwxrwx 2 mycat mycat    6 Sep  9  2019 logs
-rwxrwxrwx 1 mycat mycat  227 Sep 27  2019 version.txt

conf目录下存放了配置文件,其中server.xml是Mycat服务器参数调整和用户授权的配置文件,schema.xml是逻辑库、表和分片定义的配置文件,rule.xml是分片规则的配置文件。另外分片规则的一些具体参数信息单独作为一个文件,也是存放在这个目录下。配置文件修改后,需要重启Mycat或者通过9066端口reload

Linux下部署安装MySQL,默认不忽略表名大小写,需要手动到/etc/my.cnf下配置lower_case_table_names=1,使Linux环境下MySQL忽略表名大小写,否则使用MyCAT的时候会提示找不到表的错误!

修改配置文件

添加环境变量并加载

[root@node01 ~]#cat /etc/profile.d/mycat.sh
#!/bin/bash
MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH
[root@node01 ~]#source /etc/profile.d/mycat.sh

配置mycat本身的用户信息server.xml文件

[root@node01 ~]#vim /usr/local/mycat/conf/server.xml
//直接拉到最后修改<user>部分,设置访问mycat的用户信息,以及其能够访问的逻辑库<user name="mycat" defaultAccount="true">  //设置用户名。如果存在defaultAccount="true",则表示在不指定用户的情况下,默认以该用户访问mycat。<property name="password">123456</property><property name="schemas">db1</property>//能够访问的逻辑库(虚拟库),逻辑库需要在同目录下的schema.xml定义<property name="defaultSchema">db1</property> //<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
​
​<!-- 表级 DML 权限设置 --><!--            <privileges check="false"><schema name="lala" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges>           --></user>
​

配置schema.xml文件

[root@node01 ~]#vim /usr/local/mycat/conf/schema.xml<schema name="db1" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>/*name是逻辑库名;*checkSQLschema默认为false,含义为是否去掉表名前的逻辑库名,只能去除当前定义的逻辑库名;*sqlMaxLimit是隐式limit,如果查询没有定义limit,则自动加上limit;*dataNode指定所属的数据节点,也就是常说的数据分片。*/<dataNode name="dn1" dataHost="dthost" database="db1" />//dataNote标签用于定义数据节点。name是数据节点名称;dataHost指定所属数据库实例;database指定数据库实例上的实际数据库名(要和真实数据库一样的名字)。<dataHost name="dthost" maxCon="1000" minCon="10" balance="3"writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
/*dataHost标签用于定义数据库实例。*name数据库实例名称;*maxCon指定每个读写实例连接池的最大连接;*minCon指定每个读写实例连接池的最小连接,初始化连接池的大小*balance负载均衡类型。0表示不开启读写分离,所有读操作(select查询)都发送到当前writeHost上。1表示全部的readHost和备用writeHost都参与读操作(select查询)的负载均衡。2表示读操作随机在writeHost和readHost上发布。3表示所有读操作随机分发到当前writeHost对应的readHost上执行,writeHost不用执行。*writeType负载均衡类型。0表示所有写操作发送到配置的第一个writeHost,挂了后切换到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件dnindex.properties中。1表示所有写操作都随机发送到配置的writeHost,mycat1.5以后已经废弃。*switchType切换类型。-1表示不自动切换。1表示自动切换,默认值。2表示基于Mysql主从同步状态决定是否切换,心跳语句为show slave status。3表示基于MySQL galary cluster的切换机制(适合集群),心跳语句为show status like 'wsrep%'。*dbType指定后端连接的数据库类型,支持二进制的mysql协议,以及其他使用JDBC连接的数据库,例如mongodb、oracle、spark等;*dbDriver指定后端数据库使用的驱动,可选值JDBC和native,其中native对应二进制的mysql协议,即mysql和maridb,其余都使用JDBC;*switchType请看下发说明*slaveThreshold slave服务器读的安全边界,如果Seconds_Behind_Master大于这个值,这台slave服务器会被临时剔除,以免被读。*/<heartbeat>select user()</heartbeat>//heartbeat标签用于定义心跳语句,用语句执行成功与否来判断数据库的可用性<!-- can have multi write hosts --><writeHost host="node01" url="10.0.0.17:3306" user="mycat" password="123456"></writeHost><readHost="node02" url="10.0.0.18:3306" user="mycat" password="123456"/></writeHost></dataHost>
/*writeHost和readHost标签都指定数据库的相关配置,用于实例化后端连接池。writeHost定义写实例,readHost定义读实例。如果使用readHost标签,请使用writeHost标签将readHost标签包裹。

启动

启动测试Mycat,并设置开机自启

[root@node01 conf]#mycat start
Starting Mycat-server...
[root@node01 conf]#mycat status
Mycat-server is running (30231).
​
[root@node01 conf]#mysql -umycat -p123456 -P 8066
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| MYCATDB            |
| db1                |
+--------------------+
3 rows in set (0.00 sec)
​
mysql> use db1;
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> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| stu           |
+---------------+
1 row in set (0.00 sec)
​

测试,开启通用日志,general_log SHOW VARIABLES LIKE 'general_log_file';查看日志地址

MyCAT进行查询,

[root@node01 mysql]#mysql -umycat -p123456 -h10.0.0.17 -P8066
mysql> select * from db1.stu;
+----+-------+------+--------+
| id | name  | age  | gender |
+----+-------+------+--------+
|  1 | tom   |   10 | M      |
|  2 | jerry |   20 | F      |
|  3 | lisan |   15 | F      |
+----+-------+------+--------+
3 rows in set (0.03 sec)
mysql> insert into db1.stu(name,age,gender)values('liwu',16,'F');
Query OK, 1 row affected (0.00 sec)
​
查看slave的日志
[root@node02 mysql]#cat node02.log| grep db1
2024-11-05T10:11:28.297825Z    31 Query select * from db1.stu
​
查看master的日志
[root@node01 mysql]#cat node01.log| grep db1
2024-11-05T10:14:32.359028Z    84 Query insert into db1.stu(name,age,gender)values('liwu',16,'F')
​

成功实现读写分离


http://www.mrgr.cn/news/67576.html

相关文章:

  • 【微服务】Docker 容器化
  • 基于SSM+VUE儿童接种疫苗预约管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解
  • vue实战学习(1)(Vue概述、Vue学习方向)
  • 第三百一十四节 Java线程教程 - Java当前线程
  • Linux APT 教程:从入门到精通
  • 引入最新fluwx2.5.4的时候报错
  • 城镇住房保障:SpringBoot系统维护与升级
  • OA项目 python + vue3
  • yum下载时出现报错 Couldn‘t read a file:// file for file:///mnt/repodata/repomd.xml
  • 通用型蜂鸣器驱动函数
  • QCustomPlot添加自定义的图例,实现隐藏、删除功能(二)
  • qt QColumnView详解
  • java动态代理
  • 22.04Ubuntu---ROS2使用rclcpp编写节点
  • 积极助力信创工作,爱加密荣获麒麟系统优秀合作伙伴
  • EFI和UEFI的起源及Romstage和Ramstage有什么区别?
  • Certimate:又发现了一款不错的自动化SSL证书管理工具,它能让你的网站随时保持https安全状态,抓紧收藏起来吧
  • Windows系统中Oracle VM VirtualBox的安装
  • 探索魁北克:IT精英的理想移民地
  • 书生第四期实训营基础岛——L1G5000 XTuner 微调个人小助手认知
  • 《重学Java设计模式》之 工厂方法模式
  • 以梧桐数据库为例分析分组排序并取每组第二大数值对应的用户的SQL实现
  • C#的IDisposable 接口和析构函数
  • JS保留两位小数
  • 我们来学mysql -- EXPLAIN之ID(原理篇)
  • idea-git 远程仓库代码回滚,本地仓库代码回滚,删除未加入git的文件