文章目录
读写分离
**在数据库集群架构中,让主库负责处理写入操作,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。**当然,主数据库另外一个功能就是负责将数据变更同步到从库中,也就是写操作。
读写分离的好处
- 分摊服务器压力,提高机器的系统处理效率。
- 在写入不变,大大分摊了读取,提高了系统性能。另外,当读取被分摊后,又间接提高了写入的性能。所以,总体性能提高了。
- 增加冗余,提高服务可用性,当一台数据库服务器宕机后可以调整另外一台从库以最快速度恢复服务。
Mycat 数据库中间件
Mycat 是一个开源的数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的数据库系统。 那么 Mycat 是什么?Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服 务是实现对主从数据库的读写分离、读的负载均衡。
**常见的数据库中间件:
MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。
读写分离布置条件
步骤;准备一台新的主机放到master的前面做代理
方法;’192.168.246.133 mysql-mycat 解析
方法;并将三台机器互做本地解析,而且已经做好主从复制,最少是主从复制 这里仔细检测
步骤;关闭防火墙 修改主机名
[root@mycat-server ~]# systemctl stop firewalld
[root@mycat-server ~]# setenforce 0
步骤;安装之前需要下载 俩个包 一个是 中间件 jdk mycat
我这里是选择上传到服务器
步骤:进行解压 改下名字 配置环境变量
方法;tar xzf jdk-8u221-linux-x64.tar.gz -C /usr/local/ 解压到这个目录下
方法;tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/ 俩个都解压
方法;[root@mycat ~]# cd /usr/local/ 进到这个目录下
方法;[root@mycat local]# mv jdk1.8.0_221/ java 把文件改个名字
设置环境变量
方法1;[root@mycat local]# vim /etc/profile #添加如下内容,
JAVA_HOME=/usr/local/java #指定java安装目录
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
[root@mycat local]# source /etc/profile 重点 一定要刷新一下
方法2;# vim /etc/profile #添加如下内容
PATH=/usr/local/java/bin:$PATH 添加这个
[root@mycat local]# source /etc/profile 重点 一定要刷新一下
配置mycat
认识配置文件
MyCAT 目前主要通过配置文件的方式来定义逻辑库和相关配置:
/usr/local/mycat/conf/server.xml #定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。
/usr/local/mycat/conf/schema.xml #定义逻辑库,表、分片节点等内容。
步骤;配置server.xml 就是一个虚拟用户
方法;下面的用户和密码是应用程序连接到 MyCat 使用的,可以自定义配置**
方法;而其中的schemas 配置项所对应的值是逻辑数据库的名字,也可以自定义,但是这个名字需要和后面 schema.xml 文件中配置的一致。
[root@mycat ~]# cd /usr/local/mycat/conf/ 先进入这个目录下
[root@mycat conf]# vim server.xml
配置schema.xml 这里面要仔细要删除的东西多 直接看下面成图
以下是配置文件中的每个部分的配置块儿
逻辑库和分表设置
<schema name=“testdb” // 逻辑库名称,与server.xml的一致
checkSQLschema=“false” // 不检查sql
sqlMaxLimit=“100” // 最大连接数
dataNode=“dn1”> // 数据节点名称
数据节点
<dataNode name=“dn1” // 此数据节点的名称
dataHost=“localhost1” // 主机组虚拟的
database=“testdb” /> // 真实的数据库名称
主机组
<dataHost name=“localhost1” // 主机组
maxCon=“1000” minCon=“10” // 连接
balance=“0” // 负载均衡
writeType=“0” // 写模式配置
dbType=“mysql” dbDriver=“native” // 数据库配置
switchType=“1” slaveThreshold=“100”>
读写配置
下面代码是 配置的ab复制适合一主一从
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="rng" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="t1" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="192.168.150.175:3306" user="mycat" password="Qf@123456">
<readHost host="slave" url="192.168.150.176:3306" user="mycat" password="Qf@123456" />
</writeHost>
</dataHost>
</mycat:schema>
以下是组合为完整的配置文件,适用于一主二从的架构 ,就比上面多了一个读 配置好入下图
细节提示 真实存在的表 要在主节点数据库里面真实存在 没有记得去创建
步骤; 在真实的 主节点 master 数据库上给用户授权
grant all on t1.* to mycat@'%' identified by 'Qf@123456';
mysql> grant all on testdb.* to mycat@’%’ identified by ‘Qf@456789’; 创建用户 课件上的
mysql> flush privileges;
步骤;创建完 在其他从节点上面 测试一下能不能登录
步骤;启动Mycat 启动之前需要调整JVM
方法;在wrapper.conf中添加
方法;[root@mycat mycat]# cd /usr/local/mycat/conf
方法;[root@mycat conf]# vim wrapper.conf #在设置JVM哪里添加如下内容
wrapper.startup.timeout=300 //超时时间300秒
wrapper.ping.timeout=120 搜索这个 找到添加上面的那个
启动: /usr/local/mycat/bin/mycat start #需要稍微等待一会
Starting Mycat-server…
[root@mycat ~]# jps #查看mycat是否启动
13377 WrapperSimpleApp 出现这个说明启动成功 等一会
13431 Jps
[root@mycat ~]# netstat -lntp | grep java 查看端口号
测试 mycat 用一开始创建的虚拟用户登录
将master当做mycat的客户端
[root@mysql-master ~]# mysql -mingqing -h mysql-mycat -p’mingqing@123’ -P 8066
报错解决方法
如果在show table报错:
mysql> show tables;
ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0
解决方式:
登录master服务将mycat的登录修改为%
mysql> update user set Host = ‘%’ where User = ‘mycat’ and Host = ‘localhost’;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
或者在授权用户mycat权限为*.*