mycat+mysql主从搭建手册

本文中加入了大量的原理的内容的解释及详细说明,这里特殊说明下。有的小伙伴可能会说,为啥要加?凭啥要加?直接干不就完了吗!!其实不然,在很多大企业里,领导都会很看重原理类的东西,如果你原理懂,那在业务上就很好去做。所以以后的文章里我尽量都加入一些原理类的解释内容!!!

一、Mycat简介

1. Mycat是什么?

从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL协议的Server,前端用户可以把它看做是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生(Native)协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分库分表,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

Mycat发展到目前版本,已经不在是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NOSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在Mycat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅度降低开发难度,提升开发速度,在测试阶段,可以将一表定义为任何一种Mycat支持的存储方式,比如MySQL的MyASM表、内存表、或者MongoDB、LeveIDB以及号称是世界上最快的内存数据库MemSQL上。

为了更方便大家了解mycat的原理:(盗了两个个图哈!!

Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

在这里插入图片描述
在这里插入图片描述

二. 、应用场景

 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换。
 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片。
 多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化。
 报表系统,借助于Mycat的分表能力,处理大规模报表的统计。
 代替Hbase,分析大数据。
 询的记录需要在3秒内查询出来结果, 除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择。

三、mysql概念

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

mysql主从原理:从库生成两个线程,一个I/O线程,一个SQL线程;i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致。

主从原理图:
在这里插入图片描述

四、环境介绍

1. 硬件介绍

主机名 IP 角色 cpu 内存 硬盘
master1 192.168.0.1 主节点1 4C 8G 50G
slave1 192.168.0.2 从节点1 4C 8G 50G

2. 软件介绍

操作系统 centos7.4 x64
内核版本 3.10.0-693.2.2.el7.x86_64
mycat节点jdk版本 1.8.0
mysql版本 mysql 5.6.27

五、mysql主从搭建配置

1. 安装mysql依赖包

yum -y install make gcc-c++ cmake bison-devel  ncurses-devel  perl 

2. 下载mysql源码包并上传至服务器相应路径

通过ftp工具上传mysql安装包(5.6版本)至相应服务器/usr/local/src目录下(实际请安装路径请以项目规划为主!!!)。

3. 安装mysql

(解压并进入安装文件夹)

tar zxvf mysql-5.6.27.tar.gz
cd mysql-5.6.27
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make && make install

4. 创建mysql用户和组

groupadd mysql
useradd -g mysql mysql

5. 修改权限

chown -R mysql:mysql /usr/local/mysql

6. 初始化配置

cd /usr/local/mysql
scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

7. 启动mysql

cp support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start

8. 配置用户环境变量

vi /etc/profile

找到PATH内容添加如下内容:

;/usr/local/mysql/bin:$PATH

使环境变量生效

source /etc/profile

9. 修改数据库密码

mysql;
SET PASSWORD = PASSWORD('Skyfans_666');

六、主从配置

1. 配置master

编辑master配置文件

vi /usr/local/mysql/my.cnf

添加或修改如下内容:

log-bin=mysql-bin
server-id=1
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql

重启mysql并登陆

service mysql restart
mysql

授权并查看状态

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Skyfans_666';
mysql> FLUSH PRIVILEGES;
mysql> show master status;

配置完毕查看结果:
在这里插入图片描述

2. 配置slave

编辑slave配置文件

vi /usr/local/mysql/my.cnf

添加或修改如下内容:

log-bin=mysql-bin
server-id=2
relay-log=mysql-relay   #启用中继日志文件
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
#replicate-do-db=sky
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60

重启mysql并登陆

service mysql restart
mysql

停止并配置slave

mysql> stop slave;
mysql> change master to master_host='192.168.0.1',master_user='root',master_password='Skyfans_666',master_log_file='mysql-bin.000001', master_log_pos=394;

启动并验证:

mysql> start slave;
mysql> show slave status;
mysql> show slave status \G;

在这里插入图片描述

遇到报错:
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
在这里插入图片描述
解决方法:

删除slave节点auto.cnf文件,并重启mysql服务。

七、配置mycat

1. 上传mycat和jdk1.8安装包

通过ftp工具上传mycat和jdk1.8安装包至/application目录。

mkdir /application/
cd /application/

2. 安装配置jdk(略)

可参考地址:https://blog.csdn.net/xzm5708796/article/details/83268136

3. 解压mycat并配置环境变量

tar -xzvf Mycat-web-linux.tar.gz
echo "export PATH=/application/mycat/bin:$PATH">>/etc/profile
source  /etc/profile

4. 创建用户

举例:在master1上创建两个数据库用户,rep用户用来写入,rep_r用来读。

mysql -uroot -pSkyfans_666

注意:生产环境要尽量减小权限!

mysql> CREATE USER 'rep'@'%' IDENTIFIED BY '123456';
mysql> CREATE USER 'rep_r'@'%' IDENTIFIED BY '123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'rep'@'localhost' IDENTIFIED BY '123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'rep_r'@'localhost' IDENTIFIED BY '123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'rep'@'%' IDENTIFIED BY '123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'rep_r'@'%' IDENTIFIED BY '123456';
mysql> flush privileges;

5. 修改server.xml文件

cd /application/mycat/conf/
vi server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
<!-- <property name="processorBufferChunk">40960</property> -->
	<!-- 
	<property name="processors">1</property> 
	<property name="processorExecutor">32</property> 
-->
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
		<!-- 
<property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
<property name="mutiNodePatchSize">100</property> 亿级数量排序批量
			<property name="processors">32</property> <property name="processorExecutor">32</property> 
			<property name="serverPort">8066</property> <property name="managerPort">9066</property> 
			<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
</system>
<user name="rep">
<property name="password">123456</property>
<property name="schemas">sky</property>
</user>

<user name="rep_r">
<property name="password">123456</property>
<property name="schemas">sky</property>
<property name="readOnly">true</property>
</user>

</mycat:server>
<!--#注:配置写入用户和数据库,这里配置的数据库名为sky,生产环境根据实际情况配置,多个库用逗号隔开。-->
</system>
<user name="rep">
<property name="password">123456</property>
<property name="schemas">sky</property>
</user>
<!--#下面配置只读用户和数据库。-->
<user name="rep_r">
<property name="password">123456</property>
<property name="schemas">sky</property>
<property name="readOnly">true</property>
</user>

6. 修改schema.xml文件

vi schema.xml

注意:当多个从节点时,需配置多个读写内容信息

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >

<schema name="sky" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<!-- auto sharding by id (long) -->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />

		<!-- global table is auto cloned to all defined data nodes ,so can join 
with any table whose sharding node is in the same data node -->
<table name="company" primaryKey="ID" dataNode="dn3,dn2,dn1" rule="mod-long"/>
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!-- random sharding using mod sharind rule -->
<table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3"
rule="mod-long" />
		<!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global" 
			needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3" 
rule="mod-long" /> -->
<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id"
parentKey="id">
<childTable name="order_items" joinKey="order_id"
parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
parentKey="id" />
</table>
		<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate" 
/> -->
</schema>

<dataNode name="dn1" dataHost="localhost1" database="sky" />


	 <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /> 

<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.0.1:3306" user="rep"
                        password="123456">   -------配置写入操作主节点

<readHost host="hostS1" url="192.168.0.2:3306" user="rep_r" password="123456" /> -----配置只读操作节点

</writeHost>

</mycat:schema>

说明:

Balance:
1、balance=0  不开启读写分离机制,所有读操作都发送到当前可用的writehost了 .
2、balance=1  全部的readhost与stand by writeHost 参与select语句的负载均衡。简单的说,双主双从模式(M1àS1,M2àS2,并且M1和M2互为主备),正常情况下,M1,S1,S2都参与select语句的复杂均衡。
3、balance=2  所有读操作都随机的在readhost和writehost上分发
writeType :
负载均衡类型,目前的取值有3种:
1、writeType=”0″, 所有写操作发送到配置的第一个writeHost。
2、writeType=”1″,所有写操作都随机的发送到配置的writeHost。
3、writeType=”2″,不执行写操作。
switchType :
1、switchType=-1 表示不自动切换
2、switchType=1 默认值,自动切换
3、switchType=2 基于MySQL 主从同步的状态决定是否切换

7. 启动mycat

mycat start
cd /application/mycat/logs/;cat wrapper.log

看到如下内容证明启动成功
在这里插入图片描述

八、验证

我们采用第三方工具的方式进行连接验证

1. 使用navicat连接mycat

测试只读用户
在这里插入图片描述

测试写入用户
在这里插入图片描述

发布了304 篇原创文章 · 获赞 101 · 访问量 18万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览