(三)、MySQL读写分离-MyCat

(三)、MySQL读写分离-MyCat,第1张

(三)、MySQL读写分离-MyCat 12. MySQL读写分离-MyCat 12.1、MySQL读写分离概述

我们为什么要实现mysql的读写分离呢?

​ 随着还联网的高速发展,上网的人越来也多,人们的查询和存储的数据也越来越多,查询和写入大量的集中在一台服务器上,使得单体数据库服务器无法承受。所以人们想到了,讲读取数据和写入数据分开 *** 作,这样就可以大大的减轻主库的压力。

​ 因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-

Proxy/Amoeba)来提升数据库的并发负载能力 这样的方案来进行部署与实施的

我们在上一节通过主从复制实现了多台mysql的数据共享,这一节我们将通过mycat实现读写分离。

读写分离的原理

主库只负责处理事务,增加(insert into)、删除(delete)、修改(update)从库中负责查询的 *** 作(select)通过主从复制,将主库执行的事务同步到从库中,使之保持一致

读写分离的优势

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

主从只负责各自的写和读,极大程度的缓解X锁和S锁争用从库可配置myisam引擎,提升查询性能以及节约系统开销增加冗余,提高可用性 12.2、实现方式

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

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

B:减少一定部署难度

C:性能很好

缺点:

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

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

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

使用中间件实现

优点:

A:架构设计更灵活

B:可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控

C:可以依靠些技术手段提高mysql性能,

D:对业务代码的影响小,同时也安全

缺点:

需要一定的开发运维团队的支持

12.3、部署读写分离 实验环境

一主两从

主机名IP系统版本角色mycat192.168.116.101CentOS 7Mycat/NTPmysqlmaster192.168.116.20CentOS 7Mastermysqlslave1192.168.116.3CentOS 7Slavemysqlslave2192.168.116.2CentOS 7Slave 实验步骤 1、建立同步时间

在Mycat上配置NTP服务,为其他三台mysql服务器提供时间服务

配置好本地yum源

安装NTP

 [root@mycat ~]# yum -y install ntp

配置NTP

 [root@mycat ~]# vim /etc/ntp.conf

添加如下两行

 server 127.127.1.0  
 fudge 127.127.1.0 stratum 8

启动NTP服务

 [root@mycat ~]# systemctl enable ntpd //设置为开机自启
 [root@mycat ~]# systemctl start ntpd //开启ntp服务

在其它三台服务器上连接NTP校对同步时间

分别在其他三台服务器上输入以下两条命令

 # yum -y install ntpdate
 # /usr/sbin/ntpdate 192.168.116.101  //这里是NTP服务器的ip地址
2、配置主从复制

1)主服务mysqlmaster的配置:

创建实验数据库并插入数据

 mysql> create database HA;
 mysql> use HA;
 mysql> create table T1(id int,name varchar(20));
 mysql> insert into T1 values(1,'Tom1');

创建主从复制授权用户,允许slave连接主机

 mysql> grant replication slave on *.* to 'slave'@'192.168.116.%' identified by "123";
 mysql> flush privileges; //刷新权限

配置my.cnf

[root@mysqlmaster~ ]# vim/etc/my.cnf

添加以下内容

 [mysqld]
 …………    //省略部分内容
 server-id=1
 log-bin=/data/mysql/log/mysql-bin-master
 binlog-do-db=HA
 sync-binlog=1
 binlog-format=mixed

重启mysql

[root@mysqlmaster~ ]# /etc/init.d/mysqld restart

查看master状态信息:

 mysql> show master status; #显示主服务器的当前binlog文件及事件位置

导出数据库

复制前要保证同步的数据库一致

 [root@mysqlmaster ~]# mysqldump  -uroot -p123 HA >HA.sql

将导出的数据库传给从服务器

 [root@mysqlmaster ~]# scp HA.sql root@192.168.116.2:~
 [root@mysqlmaster1 ~]# scp HA.sql root@192.168.116.3:~

2)从服务器配置

1、mysqlslave1 配置

导入数据库,和主数据库服务器保持一致

 [root@mysqlslave1 ~]# mysql -uroot -p123 -e 'create database HA;'
 [root@mysqlslave1 ~]# mysql -uroot -p123 HA  

从服务器mysqlslave1修改配置文件

 [root@mysqlslave1 ~]# vim /etc/my.cnf

添加如下内容

 [mysqld]
 …………    //省略部分内容
 server-id=2
 relay-log=/data/mysql/log/relay-log-bin
 relay-log-index=/data/mysql/log/slave-relay-bin.index
 replicate-do-db=HA   

重启Mysql服务

 [root@mysqlslave1 ~]# /etc/init.d/mysqld restart

进入从数据库进行授权

 mysql>change master to master_host='192.168.116.20',
 	   master_user='slave',master_password='123',
 	   master_log_file='mysql-bin-master.000001',master_log_pos=154;

查看状态

 mysql> start slave;
 mysql> show slave statusG;

2、mysqlslave2

配置参考mysqlsalve1

注意:在mysqlslave2配置文件中 server-id 不能与其他数据库相同 之前已将讲过

3、配值mycat

MyCAT有提供编译好的安装包,支持windows、Linux、Mac、Solaris等系统上安装与运行。
官方下载主页http://www.mycat.io

安装mycat

上传mycat、jdk软件包到mycat服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mua3lF30-1644028922172)(C:Users77259AppDataRoamingTyporatypora-user-images1629282309108.png)]

解压安装包

 [root@mycat ~]# tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local/

进入解压的mycat查看目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9C3Eztj0-1644028922173)(C:Users77259AppDataRoamingTyporatypora-user-images1629282442541.png)]

目录解释

bin:maycat命令、启动、重启、停止等
例如: ./mycat console
mycat支持的命令{ console | start | stop | restart | status | dump }conf目录:存放配置文件lib:主要存放mycat依赖的一些jar文件,mycat是java开发的。logs:日志文件,包括Mycat启动的日志和运行的日志。 配置java环境

解压jdk

 [root@mycat ~]# tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/

配置JDK环境变量

 [root@mycat-node ~]# vim /etc/profile 

在文件最后加入以下内容

 JAVA_HOME=/usr/local/jdk1.8.0_171 
 PATH=$JAVA_HOME/bin:$PATH
 CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar 
 export PATH JAVA_HOME CLASSPATH

使环境变量生效

 [root@mycat ~]# source /etc/profile

查看java环境

 [root@mycat ~]# java -version

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0CKqxNR-1644028922173)(C:Users77259AppDataRoamingTyporatypora-user-images1629282889633.png)]

修改mycat配置文件

配置mycat环境变量

 [root@mycat ~]# ln -s /usr/local/mycat/bin/*  /usr/local/bin/

配置mycat用户账号和授权信息

 [root@mycat conf]# cd /usr/local/mycat/conf/
 [root@mycat conf]# cp server.xml server.xml.bak	//将源文件备份一份,安全
 [root@mycat ~]# vim server.xml

server.xml文件其实跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等。

        #name:连接mycat的账号
        
                123456  #连接mycat的密码
                HA   
                #这里的HA指的是mycat的逻辑数据库名称,可以自定义。这个在schema.xml中会配置,
                #要与之保持一致

                
                
        

	#设置只读账号
        
                123456
                HA
                true
        

这里的 HA 只的是逻辑数据库名

并不是真正的数据库

mycat会在 schema.xml中配置关于逻辑数据库对应的真实数据库,并同时实现读写分离

修改schema.xml配置文件

[root@mycat ~]# cd /usr/local/mycat/conf/
[root@mycat conf]# cp schema.xml schema.xml.bak
[root@mycat ~] # vim schema.xml




        
        
        
        
                select user()
                
                
                
        

截图如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnobUF8u-1644028922174)(C:Users77259AppDataRoamingTyporatypora-user-images1629283799975.png)]

注意:格式不要有错误否则会初始化异常,无法启动

参数说明

schema:

一个schema标签对代表一个逻辑库

其中:

​ Name:逻辑数据库名,与server.xml中的schema对应

​ sqlMaxLimit: select 时默认的limit,避免查询全表

​ dataNode=‘dn1’ 分库的时候用到,不分也可以。

dataNode:

name:指定逻辑数据节点名称,与schema中的dataNode一致。

dataHost:对应< dataHost >的name

database:真正要使用的数据库名称。

dataHost:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YfIUv8bs-1644028922174)(C:Users77259AppDataRoamingTyporatypora-user-images1629284198468.png)]

balance:指的负载均衡类型,目前的取值有4种
balance=“0”, 不开启读写分离机制,所有读 *** 作都发送到当前可用的writeHost上。
balance=“1”,全部的readHost与stand by writeHost(备主)参与select语句的负载均衡,
balance=“2”,所有读 *** 作都随机的在writeHost、readhost上分发。

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

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

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

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

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

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

writeType:表示写模式
writeType=“0”,所有的 *** 作发送到配置的第一个writehost

​ writeType=“1”,随机发送到配置的所有writehost

​ writeType=“2”,不执行写 *** 作

其他参数说明:

maxCon:指定物理主机服务最大支持1000个连接;

minCon:指定物理主机服务最小保持10个连接;

heartbeat:这个标签内指明用于和后端数据库进行心跳检查的语句

这里的schema.xml的配置还有之中方式


	
	

这样的话当writeHost对用的服务器宕机的话 它下面的readHost主机也不能使用了

授权

给所有的mysql服务器授权root,因为在使用mycat连接数数据库时使用的是root用户

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7DMSvTw-1644028922175)(C:Users77259AppDataRoamingTyporatypora-user-images1629285043662.png)]

进每个Mysql服务器中进行以下 *** 作

 mysql> grant all on *.* to root@'192.168.116.%' identified by '123'; 
 mysql>flush privileges;

启动mycat

 [root@mycat ~]# mycat console
# 如果失败那一定是配置文件的错误。
# 可能是格式错误,或者信息配置错误

检测端口8806

 [root@mycat ~]# netstat -antup | grep 8066
4、登录测试

使用一个有数据库的客户端进行登录测试

使用mycatroot账号登录

此账户可以进行增删改查

 [root@client ~]# mysql -u mycatroot -p123456 -h 192.168.116.10 -P 8066
  mysql> show databases;

使用mycatreadonly账户登录

此账户只可以进行查看的 *** 作

 [root@client ~]# mysql -u mycatreadonly -p123456 -h 192.168.116.10 -P 8066

使用不同账户登录,自己进行以下select delete update *** 作就明白了

5、模拟故障

将主库或从库停止然后通过客户端进行登录在进行select delete update *** 作 检测

是格式错误,或者信息配置错误

检测端口8806

```bash
 [root@mycat ~]# netstat -antup | grep 8066
4、登录测试

使用一个有数据库的客户端进行登录测试

使用mycatroot账号登录

此账户可以进行增删改查

 [root@client ~]# mysql -u mycatroot -p123456 -h 192.168.116.10 -P 8066
  mysql> show databases;

使用mycatreadonly账户登录

此账户只可以进行查看的 *** 作

 [root@client ~]# mysql -u mycatreadonly -p123456 -h 192.168.116.10 -P 8066

使用不同账户登录,自己进行以下select delete update *** 作就明白了

5、模拟故障

将主库或从库停止然后通过客户端进行登录在进行select delete update *** 作 检测

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5722356.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存