首页 > 数据库 >MyCAT实现数据库读写分离

MyCAT实现数据库读写分离

时间:2022-11-21 19:35:12浏览次数:27  
标签:java local 读写 mycat usr MyCAT root 数据库

官方网站:http://www.mycat.io/

======================================================
Mycat数据库中间件对于前端应用程序连接时会提供一套用户名和密码以及一个虚拟数据库名,这个虚拟数据库名可以是后端真实数据库中存在的,也可以是不存在的。最终前端应用程序要操作后端的真实数据库,连接的是mycat的虚拟数据库,由mycat连接真实数据库。mycat软件是用java编写的,所以需要java的运行环境,运行环境为jdk。


环境描述 :
192.168.122.105 node01 master
192.168.122.121 node01 master
192.168.122.137 node02 slave
192.168.122.103 mycat

准备工作:
关闭防火墙、selinux、同步时间,设置主机名,解析主机名

一、部署node01和node02的主从复制(略)

二、部署MyCAT

部署jdk环境
1、卸载系统自带jdk
[root@mycat ~]# rpm -qa | grep -E 'gcj|jdk'
[root@mycat ~]# rpm -e --nodeps java-1.8.0-openjdk-headless java-1.8.0-openjdk java-1.7.0-openjdk java-1.7.0-openjdk-headless

2、安装mycat运行环境——jdk
[root@mycat ~]# tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local //1.8..0_91版本
[root@mycat ~]# ln -s /usr/local/jdk1.8.0_91 /usr/local/java

[root@mycat ~]# vim /etc/profile
export JAVA__HOME=/usr/local/java
export PATH=$PATH:$JAVA__HOME/bin
[root@mycat ~]# source /etc/profile

[root@mycat ~]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

部署mycat
1、安装并启动MyCAT
[root@mycat ~]# useradd mycat
[root@mycat ~]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@mycat ~]# chown -R mycat.mycat /usr/local/mycat/

[root@mycat ~]# vim /etc/profile
export MYCAT_HOME=/usr/local/mycat
[root@mycat ~]# source /etc/profile

[root@mycat mycat]# ll
总用量 16
drwxr-xr-x 2 root root 4096 8月 1 17:11 bin
drwxrwxrwx 2 root root 6 3月 1 2016 catlet
drwxrwxrwx 4 root root 4096 8月 1 17:11 conf
drwxr-xr-x 2 root root 4096 8月 1 17:11 lib
drwxrwxrwx 2 root root 6 10月 28 2016 logs
-rwxrwxrwx 1 root root 217 10月 28 2016 version.txt
注释:
conf:java写的配置文件大多以xml为结尾
conf/schema.xml:虚拟数据库对应后端真实数据的ip和真正数据库的名字
conf/server.xml:mycat呈现给应用程序的虚拟库名、连接的用户名和密码
logs/wrapper.log:mycat的日志文件

[root@mycat ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@mycat ~]# netstat -antp | grep -E "8066|9066"
tcp6 0 0 :::9066 :::* LISTEN 3181/java
tcp6 0 0 :::8066 :::* LISTEN 3181/java

8066端口:应用程序以及开发人员写代码连接的都是mycat8066端口

2、配置MyCAT实现读写分离
[root@mycat mycat]# cp conf/server.xml{,.bak}
[root@mycat mycat]# cp conf/schema.xml{,.bak}

[root@mycat ~]# vim /usr/local/mycat/conf/server.xml
提供应用程序连接mycat使用的虚拟用户名和密码以及虚拟库名,多余的用户名行需要删掉,80行左右
<user name="admin">
<property name="password">redhat</property>
<property name="schemas">game</property>
</user>

[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml
定义虚拟数据库,虚拟数据库关联数据节点,数据节点中定义真实数据库的名字;同时dataNode还需要关联数据主机,数据主机中分别定义了真正后端数据库的端口号和ip以及连接数据库的用户名和密码
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="">http://io.mycat/">
scheme name:虚拟数据库名,和方才写的名字一样
<schema name="game" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
多个数据库,复制上两行修改库名即可,
虚拟数据库要关联dataNode,定义真实数据库的名字和ip信息
<dataNode name="dn1" dataHost="localhost1" database="game" />
balance="1",表示开启读写分离
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat> //mycat检测后端服务器是否存活的方法
<!-- can have multi write hosts -->
下面定义写主机和读主机,mycat连接master做写操作,连接slave做读操作
<writeHost host="hostM1" url="192.168.122.105:3306" user="mycatuser" password="Www.1.com">
自定义主机名,修改url为ip:3306,修改连接主机的用户名和密码,需要在主机上创建
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.1.137:3306" user="mycatuser" password="Www.1.com" />
</writeHost>
<writeHost host="hostM2" url="192.168.122.121:3306" user="mycatuser"
password="Www.1.com">
<!-- can have multi read hosts -->
<readHost host="hostS3" url="192.168.1.137:3306" user="mycatuser" password="Www.1.com" />
</writeHost>
</dataHost>
</mycat:schema>


sever.xml文件中定义schema_name
schema.xml文件中定义dataNode,一个dataNata对应一个dataHost,一个dtaHost对应一个database


[root@mycat ~]# cat /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="">http://io.mycat/">

<schema name="game" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="game" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.122.105:3306" user="mycatuser"
password="Www.1.com">
<readHost host="hostS2" url="192.168.1.137:3306" user="mycatuser" password="Www.1.com" />
</writeHost>

<writeHost host="hostM2" url="192.168.122.121:3306" user="mycatuser"
password="Www.1.com">
<readHost host="hostS3" url="192.168.1.137:3306" user="mycatuser" password="Www.1.com" />
</writeHost>
</dataHost>
</mycat:schema>
[root@mycat ~]#

balance 属性
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。
2. balance="1", 全部的 readHost 与 stand by writeHost备用写主机参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2
互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
4. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
5. balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType 属性
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准.
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。


在后端任意数据库创建允许mycat连接的用户(主从会自动同步)
mysql> GRANT all ON *.* TO "mycatuser"@"%" IDENTIFIED BY "Www.1.com";
mysql> FLUSH PRIVILEGES;


[root@mycat ~]# /usr/local/mycat/bin/mycat restart
[root@mycat ~]# netstat -antp | grep -E "8066|9066"
tcp6 0 0 :::9066 :::* LISTEN 3873/java
tcp6 0 0 :::8066 :::* LISTEN 3873/java


测试读写分离
[root@node02 ~]# mysql -u admin -p -h 192.168.122.103 -P 8066
Enter password: redhat
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)
mysql> show databases; //查看到虚拟数据库game库

mysql> use game;
mysql> show tables; //看到的表是实际数据库中真实的表

mysql> insert into account values(1,"haha"); //在表中插入数据,在从服务器上查看数据









标签:java,local,读写,mycat,usr,MyCAT,root,数据库
From: https://www.cnblogs.com/xgsh/p/16912939.html

相关文章

  • DM8数据库模式对象管理
    管理模式模式与用户之间的关系:模式定义:模式是一个特定的对象集合,在概念上可将其看作是包含表、视图、索引等若干对象的对象集模式对象:表、视图、约束、索引、序列、触......
  • Linux系统静默安装oracle数据库
    Linux系统静默安装oracle数据库 一.安装准备1.建立用户及组groupaddoinstallgroupadddbagroupaddoperuseradd-goinstall-Gdba,operoraclepasswdoracle2......
  • mybatis查询结果封装javabean属性时属性名与数据库字段不同都能封装????
    问题现象:通过mybatis查询数据库中的表记录,封装成javaBean,本来属性名和字段名不相同的情况下,属性最后应该注入null的,结果能够正常注入。javaBean:publicclassEmplo......
  • Mysql数据库连接失败SSLException: Unsupported record version Unknown-0.0
    问题描述:mysql版本:5.7.27jdk版本:1.8.0_201tomcat日志中报错,显示连接数据库失败,报错信息如下:Thelastpacketsuccessfullyreceivedfromtheserverwas152millisecon......
  • 业务单表读写缓慢如何优化?
    查询分离其实就是利用了非关系数据库的高性能,但是不足之处也很明显:当主数据量越来越多,写操作缓慢;这种问题如何破局?可见任何一种优化方案都不是最终的银弹,只有不断的优化演变......
  • #littlefs原理分析#[五]文件读写
    作者:蒋卫峰李涛前言上一篇文章介绍了littlefs中的目录操作,这一篇文章则将介绍littlefs中的文件读写操作。本文会根据文件的存储类型进行介绍,即inline文件和outline文件,......
  • ACCESS数据库学习(1)VBA连接ACCESS数据库
    2022年11月21日10:09:52说明:vba连接access首先要在vba中添加引用,点击工具->引用->MicrosoftActiveXDataObjects6.1LibraryVBA与数据库的连接需要通过ADO组件来实现。......
  • SQL Server 还原数据库
    1、备份要还原的数据库   选择要备份的数据库,右键单击,任务——备份。2、备份完成后,将数据库还原3、新建一个空的数据库,比如Gsy_TestNew,将备份的数据库还原到这个......
  • 操作数据库
    1.进入数据库mysql-uroot-p2.查看数据库结构showdatabases;3.切换数据库use数据库名称;4.查看表结构desc表名;5.查询数据select*from表;这个会横......
  • Linux自动备份MySql数据库
    1.创建备份数据库文件的根目录:#mysql备份文件目录cd/data/db/mysql2.创建各个数据库的备份文件目录  3.编写shell脚本3.1 在usr/sbin目录下分别创建数据......