Mycat中间件实现负载均衡

16 篇文章 0 订阅
7 篇文章 0 订阅

mysql/mariadb实现读写分离

一、读写分离的概述

Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。

因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。

二、读写分离工作原理:

基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
在这里插入图片描述

三、为什么要读写分离

面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载

1、 主从只负责各自的写和读,极大程度的缓解X锁和S锁争用

2、 从库可配置myisam引擎,提升查询性能以及节约系统开销

3、 增加冗余,提高可用性

四、读写分离的方式

1.应用程序层实现,网站的程序实现

应用程序层实现指的是在应用程序内部及连接器中实现读写分离

在这里插入图片描述
优点:

A:应用程序内部实现读写分离,安装既可以使用

B:减少一定部署难度

C:访问压力在一定级别以下,性能很好

缺点:

A:架构一旦调整,代码要跟着变

B:难以实现高级应用,如自动分库,分表

C:无法适用大型应用场景

2.中间件层实现

中间件层实现是指在外部中间件程序实现读写分离

常见中间件:Cobar、Mycat、Oneproxy、Kingshard、Vitess、Atlas、MaxScale、MySQL Route

这里我们以mycat来做

五、什么是Mycat

一个彻底开源的,面向企业应用开发的大数据库集群

支持事务、ACID、可以替代MySQL的加强版数据库

一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

一个新颖的数据库中间件产品

在这里插入图片描述

六、服务的安装与配置

下载Mycat-server-xxxx.linux.tar.gz,解压到某个目录下(tar zxf xxxxx -C /usr/local/)

可以创建用户:useradd mycat

加权限:chown -R mycat.mycat /usr/local/mycat

解压之后,里面相应的目录解释:

bin 程序目录,存放了window版本和linux版本,除了提供封装成服务的版本之外,也提供了nowrap的shell脚本命令,方便大家选择和修改,进入到bin目录:

Linux下运行:./mycat console,首先要chmod +x *

注:mycat支持的命令{ console | start | stop | restart | status | dump }

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

lib目录下主要存放mycat依赖的一些jar文件.

日志存放在logs/mycat.log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要,可以调整输出级别为debug,debug级别下,会输出更多的信息,方便排查问题.

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


Mycat 需要安装JDK 1.7 或者以上版本

第一步:下载jdk-8u20-linux-x64.tar.gz文件,在这个官网可以下载 http://www.mycat.io

第二步:新建/usr/java文件夹,将jdk-8u20-linux-x64.tar.gz放到该文件夹中,并解压到当前目录下

第三步:配置环境变量 在/etc/profile底部加入如下内容:

JAVA_HOME=/usr/java/jdk1.8.0_131

PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH

CLASSPATH= J A V A H O M E / j r e / l i b / e x t : JAVA_HOME/jre/lib/ext: JAVAHOME/jre/lib/ext:JAVA_HOME/lib/tools.jar

export PATH JAVA_HOME CLASSPATH

[root@TSL0 ~]# source /etc/profile  #是环境变量生效

七、服务启动与启动设置

MyCAT在Linux中部署启动时,首先需要在Linux系统的环境变量中配置MYCAT_HOME,操作方式如下:

  1. vi /etc/profile,在系统环境变量文件中增加

MYCAT_HOME=/usr/local/mycat PATH= M Y C A T H O M E / b i n : MYCAT_HOME/bin: MYCATHOME/bin:PATH

  1. 执行 source /etc/profile 命令,使环境变量生效。

如果是在多台Linux系统中组建的MyCAT集群,那需要在MyCAT Server所在的服务器上配置对其他ip和主机名的映射,配置方式如下:

vi /etc/hosts

例如:我有3台机器,配置如下:

IP 主机名:

  1. 168.43.215TSL0.cn

  2. 168.43.111TSL1.cn

192.168.43.112 TSL2.cn

编辑完后,保存文件。

(mycat的用户账号和授权信息是在conf/server.xml文件中配置

[root@TSL0 conf]# vim server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <property name="defaultSqlParser">druidparser</property>
        </system>
        <user name="root">
                <property name="password">123456</property>
                <property name="schemas">HA</property>
        </user>
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">HA</property>
                <property name="readOnly">true</property>
        </user>
</mycat:server>

编辑MyCAT的配置文件schema.xml,关于dataHost的配置信息如下:

[root@TSL0 conf]# vim schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="HA" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
        </schema>
        <dataNode name="dn1" dataHost="dthost" database="HA"/>
        <dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="TSL1.cn" url="192.168.43.111:3306" user="mycat" password="123456">
        </writeHost>
        <writeHost host="TSL2.cn" url="192.168.43.112:3306" user="mycat" password="123456" />
        </dataHost>
</mycat:schema>

有两个参数需要注意,balance和 switchType

其中,balance指的负载均衡类型,目前的取值有4种:

  1. balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。

  2. balance=“1”,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。

  3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发。

  4. balance=“3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力

switchType指的是切换的模式,目前的取值也有4种:

  1. switchType=’-1’ 表示不自动切换

  2. switchType=‘1’ 默认值,表示自动切换

  3. switchType=‘2’ 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status

  4. switchType='3’基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%’。

经过以上两个步骤的配置,就可以到/usr/local/mycat/bin 目录下执行:

./mycat start

在主从创建用户

MariaDB [(none)]> grant all on *.* to mycat @'192.168.43.215' identified by '123456';
Query OK, 0 rows affected (0.02 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)

执行查看是否成功[root@TSL0 ~]# tail -f /usr/local/mycat/logs/wrapper.log

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GJmF3Vql-1584946213519)(C:\Users\pc\AppData\Roaming\Typora\typora-user-images\image-20200313004906589.png)]

[root@TSL0 ~]# netstat -anput #查看没有cat端口

image-20200313005039318

这样就开启mycat成功了

八、配置mariadb主从

这里因为之前配置过,就不再配置了,进行查看其状态即可

在主

MariaDB [(none)]> show master status;
±------------------------±---------±-------------±-----------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
±------------------------±---------±-------------±-----------------+
| mysql-bin-master.000002 | 245 | HA | mysql |
±------------------------±---------±-------------±-----------------+
1 row in set (0.00 sec)

在从

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

这里已经🆗

九、测试读写分离

在中间件上

[root@TSL0 ~]# mysql -uroot -p123456 -h 192.168.43.215 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| HA       |
+----------+
MySQL [(none)]> use HA;
MySQL [HA]> insert into haha values(2,'xiaowang');
Query OK, 1 row affected (0.05 sec)

在主从查看

主:

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| HA                 |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.03 sec
MariaDB [(none)]> use HA;
MariaDB [HA]> select * from haha;
+------+----------+
| id   | name     |
+------+----------+
|    1 | xiaogang |
+------+----------+
1 row in set (0.01 sec)
MariaDB [HA]> select *from haha;
+------+----------+
| id   | name     |
+------+----------+
|    1 | xiaogang |
|    2 | xiaowang |
+------+----------+
2 rows in set (0.00 sec)

从:

MariaDB [(none)]> use HA;
MariaDB [HA]> select * from haha;
+------+----------+
| id   | name     |
+------+----------+
|    1 | xiaogang |
|    2 | xiaowang |
+------+----------+
2 rows in set (0.00 sec)

实、模拟故障

1、模拟故障:从服务器挂掉了

[root@TSL2~]# systemctl stop mariadb

在客户端上测试读写

[root@TSL0 ~]# mysql -uroot -p123456 -h 192.168.43.215 -P8066

MariaDB [(none)] use HA;

MariaDB [(none)] select * from haha;

说明读操作的路由切换到master上了,对外没有任何影响!

2、当我们master挂掉后咋样呢

模拟故障:主服务器挂掉了

[root@TSL1 ~]# systemctl stop mariadb

在客户端上测试读写

[root@TSL0 ~]# mysql -uroot -p123456 -h 192.168.43.215 -P8066

MariaDB [(none)] create table t3(id int);

ERROR 1184 (HY000): 拒绝连接 #主数据库停止了,是无法写操作的,但不影响读.

MariaDB [(none)]>use HA;

MariaDB [(none)] >select * from haha;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_44902227

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值