MySQL主从复制与读写分离

一、MySQL读写分离介绍

1、读写分离的目的

数据库负载均衡:

   当数据库请求增多时,单例数据库不能够满足业务需求。需要进行数据库实例的扩容。多台数据库 同时相应请求。也就是说需要对数据库的请求,进行负载均衡

   但是由于数据库服务特殊原因,数据库扩容基本要求为:数据的一致性和完整性。所以要保证多台数据库实例的数据一致性和完整性,以MySQL为例来说,官方提供了主从复制机制。

读写分离:

   数据库的负载均衡不同于其他服务的负载均衡,数据要求一致性。==基于主从复制的基础上,常见的数据库负载均衡使用的是读写分离方式。写入主数据库,读取到从数据库。可以认为数据库读写分离,是一种特殊的负载均衡实现。

2、读写分离常见的实现方式

①业务代码的读写分离

   需要在业务代码中,判断数据操作是读还是写,读连接从数据服务器操作,写连接主数据库服务器操作

   以当前LNMP为例,需要通过PHP代码实现读写分离

②中间件代理方式的读写分离

   在业务代码中,数据库的操作,不直接连接数据库,而是先请求到中间件服务器(代理)

   由代理服务器,判断是读操作去从数据服务器,写操作去主数据服务器

如何选择?

①业务实现读写分离,操作方便,成本低,当前的开发框架基本支持读写分离

②中间件代理服务器,除了能够实现读写分离,还可以作为数据库集群的管理平台

MYSQL主从复制的几种方式

基于 SQL 语句的复制(statement-based replication, SBR);

基于行的复制(row-based replication, RBR);

混合模式复制(mixed-based replication, MBR);

MySQL主从复制作用和原理

一、什么是主从复制?

   主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库

二、主从复制的作用

1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。

2、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O 访问的频率,提高单个机器的I/O性能。

3、读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了 前台速度。

三、主从复制的原理

1.数据库有个bin-log二进制文件,记录了所有sql语句。

2.我们的目标就是把主数据库的bin-log文件的sql语句复制过来。

3.让其在从数据的relay-log重做日志文件中再执行一次这些sql语句即可。

4.下面的主从配置就是围绕这个原理配置

二、MySQL读写分离案列实现

1master配置

①在master服务器授权,slave服务器replication slave权限

slave是通过MySQL连接登录到master上来读取二进制日志的,因此需要在

master上给slave配置权限

mysql > grant replication slave on *.* to 'slave'@'192.168.17.%'identified by '123456';

master服务器打开bin-log日志,并标识server-id

shell > vim /etc/my.cnf

配置文件内容注意重启mysql使配置生效】

[mysqld]

log-bin = mysql-index

server-id = 1

③制作一个完整的备份

如果确认主从的数据库,默认开始数据是一致的,可以不做备份

shell > mysqldump -uroot -p'123456' --all-databases > /root/mysql.sql

④查看master上的bin-log及其position位置

mysql > show master status;

2slave配置

①恢复备份文件

如果slavemaster的数据本身就是相同的,可以不选择备份和导入

②配置server-id,标识服务器

shell > vim /etc/my.cnf

配置文件内容

[mysqld]

server-id=2

由于是克隆获取的MySQL实例,所以auto.conf里记录的UUID一样,需要删除/usr/local/mysql/data/auto.conf文件==,否则主从无法识别互相身份,重启自动生成新的即可】③配置slave replication

mysql > stop slave;

mysql> change master to

master_host='192.168.17.101',master_user='slave1',master_password='123456',maste

r_log_file='mysql-bin.000002',master_log_pos=333;

mysql > start slave;

④启动replication,并检查结果

mysql > show slave status\G;

查看到两个yes,主从复制成功。否则,查看显示最下面信息,通过error信息进行排查问题。

3MyCAT实现读写分离

3.2jdk安装

java 静态编译的编程语言 代码编译成机器码 执行机器码输出结果。

编译jdk javac 编译java代码

运行 jre 编译好的机器码(可以执行文件) java

①下载安装jdk

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

选择下载x64架构.tar.gz

上传mycatjdksoft目录下

shell > tar xvf jdk-8u192-linux-x64.tar.gz

shell > mv jdk1.8.0_192 /usr/local/java

②配置环境变量

#追加环境变量

shell > echo "PATH=/usr/local/java/bin:$PATH" >> /etc/profile

shell > source /etc/profile

#检测java环境变量 如果看到版本信息即为成功

shell > java -version

3.3mycat安装和测试启动

①解压安装MyCAT

shell > tar xvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C

/usr/local

启动mycat

#通过控制台 进行前端启动 可以看到执行过程

shell > /usr/local/mycat/bin/mycat console

读写分离的配置文件:

①查看server.xml

默认server.xml可以不用修改

shell > /usr/local/mycat/conf

shell > vim server.xml

修改server.xml

配置mycat对外的使用用户信息

②修改schema.xml

schema标签里配置nameserver.xml里的虚拟数据库名称,dataNode 填写后面使用的dataNode名称

dataNode标签和dataHost指定配置使用

dataHost标签里配置writeHostreadHost(密码,地址,用户名称)

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

        <!-- 1、TESTDBserver.xml配置文件中的映射的数据库名称要一致 dataNone填写下面的

dataNode名称 -->

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"

dataNode="dn3"></schema>

        <!-- 2、dataNode name和上面的一致 dataHost填写下面的dataHostname名称 database

填写后端真实数据库名称-->

<dataNode name="dn3" dataHost="localhost1" database="tp5shop" />

        <!-- 3、可以配置负载均衡、读写分离算法 暂时可以不用动-->

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"

writeType="0" dbType="mysql" dbDriver="native" switchType="1"

slaveThreshold="100">

                <!-- 对后端数据库服务器 发送的心跳检测 -->

                <heartbeat>select user()</heartbeat>

                <!-- can have multi write hosts -->

                <!-- 4、配置后端真实数据库的相关登录信息 -->

                <writeHost host="hostM1" url="192.168.17.100:3306" user="tp5shop"

password="$Abc3721">

                        <!-- can have multi read hosts -->

                        <readHost host="hostS2" url="192.168.17.105:3306" user="tp5shop"

password="$Abc3721" />

                </writeHost>

                <!-- <writeHost host="hostS1" url="localhost:3316" user="root"

password="123456" />-->

                <!-- <writeHost host="hostM2" url="localhost:3316" user="root"

password="123456"/> -->

        </dataHost>

</mycat:schema>

注意修改第7行,真实数据库的名称

③启动mycat服务

shell > /usr/local/mycat/bin/mycat start

#确认mycat是否真的启动,查看它的端口 9066 8066

shell > netstat -lntp|grep 8066

Tip:如果配置之后,启动mycat,不能够启动

通过查看/usr/local/mycat/logs/wrapper.log

3.5mycat客户端

连接mycat客户端

shell > mysql -h127.0.0.1 -uroot -p123456 -P8066

执行查询命令测试结果

mysql > show databases;

mysql > use TESTDB;

mysql > show tables;

###3.6mycat管理端

连接mycat管理端

shell > mysql -h127.0.0.1 -uroot -p123456 -P9066

执行管理命令查看

mysql > show @@help; //查看管理监控端的所有帮助命令

mysql > show @@heartbeat; //查看服务器状态

测试访问

mycat默认writeHostreadHost,如果writeHost不可用,则readHost也不可用。用两个writeHost,从的writeHost变成可写的了,要在slave服务器上设置readonly

3.6、balance属性和writeType属性

balance 属性

负载均衡类型,目前的取值有 3 种:

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", 所有读请求随机的分发到 writerHost 对应的 readhost 执行,writerHost 不负担

读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType 属性

负载均衡类型,目前的取值有 3 种:

1、writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个

writeHost,重新启动后已切换后的为准.

2、writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐

switchType 属性

-1 表示不自动切换

1 默认值,自动切换

2 基于 MySQL 主从同步的状态决定是否切换

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值