MySQL的主从复制和读写分离

一 简介

原始的项目架构是将项目和数据库的服务放在一台服务器上,那时,访问量达不到的上限,不足以让数据库或者服务宕机,客户端的请求直接访问到某一台服务器上,并由具体的服务器软件解析请求,定位到指定的项目资源,再由项目资源访问数据库,获取对应的数据,返回给服务器软件,再做出相应的业务,并响应到客户端.
在这里插入图片描述后来,随着网络的发展,开始的项目架构已经不能满足现有的需求,所有,项目架构开始发生变化.服务器中存在有数据库服务器,.现在的架构,将数据库服务器分离出去了,成为了一个完整的服务,只是完成数据的服务.这种的架构能提高用户的访问量

随着技术的发展,但是在今天,分类的架构已经不能完成现在的需求,架构继续发生着变化,变的成熟,变得复杂,变得庞大,在实际的生产环境中,由单台的数据库服务器不能满足现在的需求了.为了解决这一个问题,我们使用集群,就可以很好的解决这一问题.

通过增加数据库的数量,来达到减轻单台数据库的访问压力,这些数据库要进行统一管理,数据统一…这一系列的问题.为了同步数据,就采用了主从复制的方式来解决.这样以来从数据库只能用来读数据,不能用来写数据,因为,从数据库没有同步到主数据.如果有一个请求在从数据中添加了一条数据,另一个请求在主数据库中读,是没有的,因为主数据是不会去复制从数据库中数据的.

为了解决这一问题,使用了数据库中间件来解决这一问题.中间件可以来识别你的操作是读还是写,如果是写的操作的话,还是只能访问一台数据库,这一台数据库是不能解决实际的问题的,所有要把主数据库建立一个集群.这样就能减轻主数据库的压力.

下面就是数据的主从复制.读写分离.
在这里插入图片描述

二 主从复制

我们先搭建主从复制.采用mysql数据库来实现主从复制

搭建前的准备:

准备三台服务器,
	master		主数据库
	slave1		从数据
	slave2		从数据
三台服务器上安装mysql数据库.
关闭防火墙,如果不关闭防火墙,需要开放端口,mysql的默认端口是3306,需要开放端口

这里我选择虚拟机来实现

克隆三台安装了mysql的虚拟机,系统是centos7,安装了mysqlcentos中在/etc目录下,会有一个my.cnf文件,需要我们添加一些参数,进行配置:

1. 添加配置

注意:这些配置要配置到socket的配置下面,负责会出现一些问题

这个是主数据库的配置, 建议修改之前先复制一份该文件,做好备份
在这里插入图片描述
参数解析:

server-id				是唯一标识,不要重复就好了
bog-bin=mysql-bin		mysql的日志文件名
log-slave				根据主数据库的日志来更新从数据库的数据

从数据库的配置,也是在/etc/my.cnf文件修改,添加如下配置
在这里插入图片描述
注意:这个配置也要配置在socket下面,避免一些错误
配置好了两个从数据库.

将三台服务器的数据库进行重启:

systemctl restart mysqld

如果在这里重启数据一直卡,说明你刚刚配置的信息错误,或者配置位置错误.

进入数据库:

执行命令

show VARIABLES like 'server_id';

在这里插入图片描述
如果可以查询出你刚刚配置的id出来,就证明你的配置成功了.检查你的两个从数据库是否配置成功.

2. 配置监听

查看主数据库的日志

在主数据库中执行:

show master status;

在这里插入图片描述
这两个参数在从数据库中要使用到

登陆到两个从数据库中:

执行:

change master to 
master_host='192.168.64.200',
master_user='root',
master_password='1234',
master_log_file='mysql-bin.000001',
master_log_pos=627;

参数解析:

master_host    		主数据库的IP
master_user    		主数据库的用户名
master_password		主数据的密码
master_log_file		主数据库的日志名
master_log_pos		主数据库据的日志开始行数

在这里插入图片描述
开启主从复制:

命令:

start slave;		开启主从复制
stop slave;			停止主从复制
show slave status;	查看主从复制的状态

在这里插入图片描述
这里可以发现存在一个错误:
在这里插入图片描述
错误信息告诉我们,mysqlUUID重复了.我们需要将mysqlUUID的值修改成不一样就好了

为什么会报错;原因其实很简单,因为我们的虚拟机是克隆的,里面的mysql也是克隆的,所有里面的配置信息都是一样的.

解决方案:

先退出从数据库,把按照的mysql数据库唯一标识的文件删除了,让它重新生成一个就好了.

执行命令:

find / -name "auto.cnf"
rm -rf /var/lib/mysql/auto.cnf

在这里插入图片描述
在重新启动mysql就好了,只有重启才会生成这个文件.

systemctl restart mysqld

重新进入数据库中,启动主从复制,在查看状态

执行命令:

start slave;
show slave status;

在这里插入图片描述
这样就配置好了一个了,另一个一样配置

在win10的系统上进行访问数据库吧.

三 读写分离

基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。
MYCAT背后有一支强大的技术团队,其参与者都是5年以上资深软件工程师、架构师、DBA等,优秀的技术团队保证了MYCAT的产品质量。
MYCAT并不依托于任何一个商业公司,因此不像某些开源项目,将一些重要的特性封闭在其商业产品中,使得开源项目成了一个摆设。

1. 安装mycat

将虚拟机上的mycat解压;

命令:

tar -zxvf mycat.tar.gz

解压完成后,到/etc/profile文件中进行环境变量的配置

export MYCAT_HOME=/usr/mycat
export PATH=$MYCAT_HOME/bin:$PATH

在这里插入图片描述
配置完成后,重新加载profile文件

source /etc/profile

验证mycat是否安装成功
在这里插入图片描述

2. mycat配置

mycat的安装目中进行配置

schema.xml中的<schema>标签中内容全部删除,配置下面的内容

配置Mycat的逻辑库

定义MyCat的逻辑库 
		name: 逻辑库的名字  dataNode:配置真实的数据节点
<schema name="test_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="testNode"></schema>

配置数据节点

定义MyCat的数据节点 
name:对应schema中dataNode属性   dataHost:配置执行sql的数据库服务器   databse:操作的真实数据库
<dataNode name="testNode" dataHost="dtHost" database="test" />

配置数据库主机

配置数据主机,sql的数据库服务器
		name:与dataNode中的dataHost对应
<dataHost name="dtHost" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">

....
</dataHost>

在配置主机中配置心跳检测

<heartbeat>select user()</heartbeat>

在配置主机中配置主从节点

配置主节点以及从节点   从节点需要配置在主节点中
<writeHost host="hostM1" url="192.168.28.4:3306" user="root" password="root">
	<readHost host="hostS1" url="192.168.28.5:3306" user="root" password="root" />
	<readHost host="hostS2" url="192.168.28.6:3306" user="root" password="root" />
</writeHost>

总体配置

<!-- 定义MyCat的逻辑库  
		name: 逻辑库的名字
		dataNode:配置真实的数据节点
-->   
<schema name="test_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="testNode"></schema>

	<!-- 定义MyCat的数据节点 
		name:对应schema中dataNode属性
		dataHost:配置执行sql的数据库服务器
		databse:操作的真实数据库
	-->
    <dataNode name="testNode" dataHost="dtHost" database="test" />

	<!-- 配置数据主机,sql的数据库服务器
		name:与dataNode中的dataHost对应
	-->
   <dataHost name="dtHost" maxCon="1000" minCon="10" balance="1"
                writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
        <!--
            心跳检测
        -->
         <heartbeat>select user()</heartbeat>
                <!-- 
                	配置主节点以及从节点
                	从节点需要配置在主节点中
                -->
        <writeHost host="hostM1" url="192.168.28.4:3306" user="root"
                        password="root">
                <!-- can have multi read hosts -->
            <readHost host="hostS1" url="192.168.28.5:3306" user="root" password="root" />
            <readHost host="hostS2" url="192.168.28.6:3306" user="root" password="root" />
        </writeHost>
   </dataHost>

修改server.xml文件, 同样是在conf文件夹中

<system>
	<!-- 这里配置的都是一些系统属性,可以自己查看mycat文-->
    <property name="defaultSqlParser">druidparser</property>
    <property name="charset">utf8</property>
</system>
<user name="root">
     <property name="password">root</property>
     <property name="schemas">test_schema</property>
</user>

3. 测试

编写程序:

配置数据库连接:

在这里插入图片描述
参数说明:

username		是你的mycat的用户名
password		是你的mycat的密码
url				是你的mycat的连接地址,mycat的端口默认是8066
					后面是mycat配置的逻辑库
type			是你使用的数据库连接池
driver			数据库的驱动
进行测试:

在这里插入图片描述

发布了7 篇原创文章 · 获赞 9 · 访问量 1454

猜你喜欢

转载自blog.csdn.net/weixin_44134972/article/details/103430754