精华内容
下载资源
问答
  • 2021-01-10 23:26:24

    一、什么是Redis主从复制

    1、主从复制的架构:

    Redis Replication是一种 master-slave 模式的复制机制,这种机制使得 slave 节点可以成为与 master 节点完全相同的副本,可以采用一主多从或者级联结构。架构如下:

    主从复制的配置要点:

    (1)配从库不配主,从库配置:slaveof 主库IP 主库端口

    (2)查看redis的配置信息:info replication

    2、Redis为什么需要主从复制?

    使用Redis主从复制的原因主要是单台Redis节点存在以下的局限性:

    (1)Redis虽然读写的速度都很快,单节点的Redis能够支撑QPS大概在5w左右,如果上千万的用户访问,Redis就承载不了,成为了高并发的瓶颈。

    (2)单节点的Redis不能保证高可用,当Redis因为某些原因意外宕机时,会导致缓存不可用

    (3)CPU的利用率上,单台Redis实例只能利用单个核心,这单个核心在面临海量数据的存取和管理工作时压力会非常大。

    3、主从复制的好处:

    (1)数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

    (2)故障恢复:如果master宕掉了,使用哨兵模式,可以提升一个 slave 作为新的 master,进而实现故障转移,实现高可用

    (3)负载均衡:可以轻易地实现横向扩展,实现读写分离,一个 master 用于写,多个 slave 用于分摊读的压力,从而实现高并发;

    4、主从复制的缺点:

    由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave服务器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重

     

    二、主从复制的原理

    从总体上来说,Redis主从复制的策略就是:当主从服务器刚建立连接的时候,进行全量同步;全量复制结束后,进行增量复制。当然,如果有需要,slave 在任何时候都可以发起全量同步。

    1、主从全量复制的流程:

    Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份,具体步骤如下:

    (1)slave服务器连接到master服务器,便开始进行数据同步,发送psync命令(Redis2.8之前是sync命令)

    (2)master服务器收到psync命令之后,开始执行bgsave命令生成RDB快照文件并使用缓存区记录此后执行的所有写命令

    • 如果master收到了多个slave并发连接请求,它只会进行一次持久化,而不是每个连接都执行一次,然后再把这一份持久化的数据发送给多个并发连接的slave。
    • 如果RDB复制时间超过60秒(repl-timeout),那么slave服务器就会认为复制失败,可以适当调节大这个参数

    (3)master服务器bgsave执行完之后,就会向所有Slava服务器发送快照文件,并在发送期间继续在缓冲区内记录被执行的写命令

    client-output-buffer-limit slave 256MB 64MB 60,如果在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败

    (4)slave服务器收到RDB快照文件后,会将接收到的数据写入磁盘,然后清空所有旧数据,在从本地磁盘载入收到的快照到内存中,同时基于旧的数据版本对外提供服务。

    (5)master服务器发送完RDB快照文件之后,便开始向slave服务器发送缓冲区中的写命令

    (6)slave服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

    (7)如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF

    2、增量复制:

    Redis的增量复制是指在初始化的全量复制并开始正常工作之后,master服务器将发生的写操作同步到slave服务器的过程,增量复制的过程主要是master服务器每执行一个写命令就会向slave服务器发送相同的写命令,slave服务器接收并执行收到的写命令。

    3、断点续传:

    3.1、什么是断点续传:

    当master-slave网络连接断掉后,slave重新连接master时,会触发全量复制,但是从2.8版本开始,slave与master能够在网络连接断开重连后,只从中断处继续进行复制,而不必重新同步,这就是所谓的断点续传。

    断电续传这个新特性使用psync命令,旧的实现中使用sync命令。Redis2.8版本可以检测出它所连接的服务器是否支持PSYNC命令,不支持的话使用SYNC命令。master服务器收到slave发送的psync命令后,会根据自身的情况做出对应的处理,可能是FULLRESYNC runid offset触发全量复制,也可能是CONTINUE触发增量复制

    命令格式:psync runid offset

    3.2、工作原理:

    (1)master服务器在内存缓冲区中给每个slave服务器都维护了一份同步备份日志(in-memory backlog),缓存最近一段时间的数据,默认大小1m,如果超过这个大小就会清理掉。

    (2)同时,master 和 slave 服务器都维护了一个复制偏移量(replication offset)和 master线程ID(master run id),每个slave服务器在跟master服务器进行同步时都会携带master run id 和 最后一次同步的复制偏移量offset,通过offset可以知道主从之间的数据不一致的情况。

    (3)当连接断开时,slave服务器会重新连接上master服务器,然后请求继续复制。假如主从服务器的两个master run id相同,并且指定的偏移量offset在同步备份日志中还有效,复制就会从上次中断的点开始继续。如果其中一个条件不满足,就会进行完全重新同步,因为主运行id不保存在磁盘中,如果从服务器重启的话就只能进行完全同步了。

    master服务器维护的offset是存储在backlog中,msater就是根据slave发送的offset来从backlog中获取数据的

    (4)在部分同步过程中,master会将本地记录的同步备份日志中记录的指令依次发送给slave服务器从而达到数据一致。

    4、无磁盘化复制:

    在前面全量复制的过程中,master会将数据保存在磁盘的rdb文件中然后发送给slave服务器,但如果master上的磁盘空间有限或者是使用比较低速的磁盘,这种操作会给master服务器带来较大的压力,那怎么办呢?在Redis2.8之后,可以通过无盘复制来达到目的,由master直接开启一个socket,在内存中创建RDB文件,再将rdb文件发送给slave服务器,不使用磁盘作为中间存储。(无盘复制一般应用在磁盘空间有限但是网络状态良好的情况下)

    repl-diskless-sync :是否开启无磁盘复制
    repl-diskless-sync-delay:等待一定时长再开始复制,因为要等更多slave重新连接过来

     

    三、主从复制的其他问题

    1、主从复制的特点:

    (1)Redis使用异步复制,每次接收到写命令之后,先在内部写入数据,然后异步发送给slave服务器。但从Redis 2.8开始,从服务器会周期性的应答从复制流中处理的数据量。

    (2)Redis主从复制不阻塞master服务器。也就是说当若干个从服务器在进行初始同步时,主服务器仍然可以处理外界请求。

    (3)主从复制不阻塞slave服务器。当master服务器进行初始同步时,slave服务器返回的是以前旧版本的数据,如果你不想这样,那么在启动redis配置文件中进行设置,那么从redis在同步过程中来自外界的查询请求都会返回错误给客户端;

    虽然说主从复制过程中对于从redis是非阻塞的,它会用旧的数据集来提供服务,但是当初始同步完成后,需删除旧数据集和加载新的数据集,在这个短暂时间内,从服务器会阻塞连接进来的请求,对于大数据集,加载到内存的时间也是比较多的

    (4)主从复制提高了redis服务的扩展性,避免单个redis服务器的读写访问压力过大的问题,同时也可以给为数据备份及冗余提供一种解决方案;

    (5)使用主从复制可以为master服务器免除把数据写入磁盘的消耗,可以配置让master服务器不再将数据持久化到磁盘,而是通过连接让一个配置的slave类型的Redis服务器及时将相关数据持久化到磁盘。不过这种做法存在master类型的Redis服务器一旦重启,因为此时master服务器不进行持久化,所以数据为空,这时候通过主从同步可能导致slave类型的Redis服务器上的数据也被清空,所以这个配置要确保主服务器不会自动重启(详见第2点的“master开启持久化对主从架构的安全意义”)

    2、master开启持久化对主从架构的安全意义:

    使用主从架构,必须开启master服务器的持久化机制,不建议用slave服务器作为master服务器的数据热备。当不能这么做时,比如考虑到延迟的问题,应该将master服务器配置为避免自动重启。否则,在关闭master服务器持久化机制并开始自动重启的情况下,会造成主从服务器数据被清空的情况。也就是master的持久化关闭,可能在master宕机重启的时候数据是空的(RDB和AOF都关闭了),此时就会将空数据复制到slave ,导致slave服务器的数据也丢了。

    为了更好的理解这个问题,看下面这个失败的例子,其中主服务器和从服务器中数据库都被删除了:

    设置节点A为主服务器,关闭持久化,节点B和C从节点A复制数据。这时出现了一个崩溃,但Redis具有自动重启系统,重启了进程,因为关闭了持久化,节点重启后只有一个空的数据集。节点B和C从节点A进行复制,现在节点A是空的,所以节点B和C上的复制数据也会被删除。当在高可用系统中使用Redis Sentinel,关闭了主服务器的持久化,并且允许自动重启,这种情况是很危险的。比如主服务器可能在很短的时间就完成了重启,以至于Sentinel都无法检测到这次失败,那么上面说的这种失败的情况就发生了。

    3、过期key的处理:

    对于slave服务器上过期键的处理,主要是有master服务器负责。如果master过期了一个key,则由master服务器负责键的过期删除处理,然后将相关删除命令以数据同步的方式同步给slave服务器,slave服务器根据删除命令删除本地的key。

     

    四、Redis的高可用:

    前面说过,通过主从复制,如果master服务器宕机了,可以提升一个slave服务器作为新的master服务器,实现故障的转移,实现高可用。也就是说,当master宕掉之后,可以手动执行“SLAVEOF no one”命令,重新选择一台服务器作为master服务器。但是呢,我们总不能保证每次master宕掉之后,都可以及时察觉并手动执行该命令,这时就可以使用“哨兵模式sentinel”,哨兵模式其实就是“SLAVEOF no one”命令的自动版,能够后台监控master是否故障,如果故障了,则根据投票数自动将slave转换为master,如果之前的master重启回来,不会造成双master冲突,因为原本的master会变成slave。

     配置步骤:

    (1)在自定义的/myredis目录下新建sentinel.conf文件(名字绝不能错)。

    (2)配置哨兵,在配置文件中写: sentinel monitor 被监控数据库名字 127.0.0.1 6379 1

    最后的数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机。

    (3)启动哨兵:redis-sentinel /myredis/sentinel.conf

    有关Redis哨兵模式的原理:可以参考这篇文章:Redis哨兵机制原理详解

     

    更多相关内容
  • PostgreSQL流复制原理

    2020-11-29 13:55:47
    PostgreSQL11.2 中文文档 chm版; PostgreSQL是世界上最强大的开源数据库, 堪比商业版的Oracle,
  • 详细的结构分解,可以快速了解mysql主从复制原理和对主从更清晰的了解。
  • MySQL主从复制原理 _ 异步复制 _ 半同步复制 _ GTID复制
  • 主从复制原理

    千次阅读 多人点赞 2020-12-20 16:01:14
    主从复制原理 MySQL数据库的主从复制方案,是其自带的功能,并且 主从复制并不是复制磁盘上的数据库文件,而是通过binlog 日志复制到需要同步的从服务器上。 MySQL数据库支持单向、双向、链式级联等不同业务场景的...

    主从复制原理

    MySQL数据库的主从复制方案,是其自带的功能,并且 主从复制并不是复制磁盘上的数据库文件,而是通过binlog 日志复制到需要同步的从服务器上。

    MySQL数据库支持单向、双向、链式级联等不同业务场景的复制。在复制的过程中,一台服务器当主服务器(Master),接收来自用户的内容更新,而一个或多个其它的服务器来当从服务器(Slaver),接收来自Master上binlog文件的的日志内容,解析出SQL,重新更新到Slave,使得主从服务器的数据达到一致。

    主从复制的逻辑有以下几种:

    一主一从:单向主从同步模式,只能在Master端写入数据
    一主多从:单向主从同步模式,只能在Master端写入数据

    在这里插入图片描述

    主主同步:此架构可以在Master1或Master2进行数据写入,或者两端同时写入(需特殊配置)

    在这里插入图片描述

    在生产环境中,MySQL主从复制都是异步的复制方式,既不是严格的实时复制,但是给用户的体验都是实时的。
    .
    MySQL主从复制集群功能使得MySQL数据库支持大规模高并发读写成为可能,并有效的保护了服务器宕机的数据备份。

    利用复制功能,当Master服务器出现问题时,我们可以人工的切换到从服务器继续提供服务,此时服务器的数据和宕机时的数据几乎完全一致。
    .
    服务功能也可用作数据备份,但是如果人为的执行drop、delete等语句删除,那么从看库的备份功能也就失效了。

    主从机制实现原理

    image-20201220154539252

    1. master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志时间,binary log events);
    2. slave将master的binary log events拷贝到它的中继日志(relay log);
    3. slave重做中继日志中的事件,将改变反映到它自己的库中。

    开始搭建主从复制

    主服务器配置

    开始修改配置文件
    .
    修改配置文件/etc/my.cnf,在[mysqld]配置下增加两项配置:server-id=1log-bin=mysql-bin

    • server-id=1: 是服务器的唯一标示(主从服务器之间必须不同)。
    • log-bin=mysql-bin: 启用二进制日志,并指定日志名称为mysql-bin。
    • 保存退出后重启服务:systemctl restart mysql

    image-20201220154852695

    开始创建授权复制用户

    # 创建复制用户
    MariaDB [(none)]> create user '用户名' identified by '密码';
    Query OK, 0 rows affected (0.01 sec)
    
    # 授权复制用户
    MariaDB [(none)]> grant replication slave on *.* to '用户名;
    Query OK, 0 rows affected (0.00 sec)
    
    # 刷新授权表,使其立即生效
    MariaDB [(none)]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    

    开始备份数据

    # 锁表
    MariaDB [(none)]> flush table with read lock;
    Query OK, 0 rows affected (0.00 sec)
    
    # 打开新窗口,导出所有数据并传至从服务器
    [root@master ~]# mysqldump -uroot -p --all-databases > all_db.sql
    [root@master ~]# scp all_db.sql 192.168.43.71:/root/    
    #ip地址是从服务器的地址 把all_db.sql文件复制到从服务器root文件夹下
    
    # 查看二进制日志文件和当前的位置并记录
    # File是二进制日志文件名,Position是日志的当前位置
    # 强调:记住File与Position的值,从服务器中会用到
    MariaDB [(none)]> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |      567 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    
    # 解锁
    # 这一步骤应在主从服务器均配置完毕,可实现数据同步后,再解锁
    MariaDB [(none)]> unlock tables;
    Query OK, 0 rows affected (0.00 sec)
    

    从服务器配置

    开始修改配置文件
    .
    修改配置文件/etc/my.cnf,在[mysqld]配置下增加此配置:server-id=2

    • server-id=2: 是服务器的唯一标示(主从服务器之间必须不同)。
    • 这里与主服务器不一样,不可开启bin-log
    • 保存退出后重启服务:systemctl restart mysql

    导入主库传过来的备份文件

    [root@slave ~]# mysql -uroot -p < all_db.sql
    

    开始配置复制参数

    # 查询从库信息
    MariaDB [(none)]> show variables like 'server_id';
    MariaDB [(none)]> show variables like 'log_bin';
    
    # 配置复制参数
    MariaDB [(none)]> change master to
        -> master_host='192.168.43.149',  # 指定主库的ip
        -> master_user='tom',  # 指定主库创建远程用户名
        -> master_password='user@tom',  # 指定主库创建远程用户密码
        -> master_log_file='mysql-bin.000001',  # 指定二进制日志文件
        -> master_log_pos=567;  # 指定二进制日志的当前位置
    Query OK, 0 rows affected (0.02 sec)
    
    # 启动从库同步
    MariaDB [(none)]> start slave;
    
    # 检查复制状态,详见下图
    MariaDB [(none)]> show slave status\G;
    

    检查主从复制是否成功的关键在于:

    image-20201220155702638

    这两项都是yes,说明主从复制配置成功。

    附:

    此时还未配置从库的只读模式,只需在从服务器的配置文件中的[mysqld]配置下增加read-only=true,并且在从服务器上创建普通用户,使用普通用户主从同步即可达到只读的效果。

    注意一个坑:如果使用root用户,则无法达到只读的效果,超级用户root不受只读限制。

    展开全文
  • MySQL主从复制原理(原理+实操)

    千次阅读 2020-11-18 17:21:03
    主从复制简介 在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的整体服务性能,一般都会采用「主从复制」。 比如:在复杂的业务系统中,有一句sql执行后导致锁表,并且这条sql的的执行时间有比较长,那么此...

    1、MySQL主从复制原理(原理+实操)

    主从复制简介

    在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的整体服务性能,一般都会采用「主从复制」。

    比如:在复杂的业务系统中,有一句sql执行后导致锁表,并且这条sql的的执行时间有比较长,那么此sql执行的期间导致服务不可用,这样就会严重影响用户的体验度。

    主从复制中分为「主服务器(master)「和」从服务器(slave)」,「主服务器负责写,而从服务器负责读」,Mysql的主从复制的过程是一个「异步的过程」。

    这样读写分离的过程能够是整体的服务性能提高,即使写操作时间比较长,也不影响读操作的进行。

    主从复制的原理

    首先放一张Mysql主从复制的原理图,总的来说Mysql的主从复制原理还是比较好理解的,原理非常的简单。
    在这里插入图片描述
    Mysql的主从复制中主要有三个线程:master(binlog dump thread)、slave(I/O thread 、SQL thread),Master一条线程和Slave中的两条线程。

    master(binlog dump thread)主要负责Master库中有数据更新的时候,会按照binlog格式,将更新的事件类型写入到主库的binlog文件中。

    并且,Master会创建log dump线程通知Slave主库中存在数据更新,这就是为什么主库的binlog日志一定要开启的原因。

    I/O thread线程在Slave中创建,该线程用于请求Master,Master会返回binlog的名称以及当前数据更新的位置、binlog文件位置的副本。

    然后,将binlog保存在 「relay log(中继日志)」 中,中继日志也是记录数据更新的信息。

    SQL线程也是在Slave中创建的,当Slave检测到中继日志有更新,就会将更新的内容同步到Slave数据库中,这样就保证了主从的数据的同步。

    以上就是主从复制的过程,当然,主从复制的过程有不同的策略方式进行数据的同步,主要包含以下几种:

    1、「同步策略」:Master会等待所有的Slave都回应后才会提交,这个主从的同步的性能会严重的影响。
    2、「半同步策略」:Master至少会等待一个Slave回应后提交。
    3、「异步策略」:Master不用等待Slave回应就可以提交。
    4、「延迟策略」:Slave要落后于Master指定的时间。
    对于不同的业务需求,有不同的策略方案,但是一般都会采用最终一致性,不会要求强一致性,毕竟强一致性会严重影响性能。

    主从搭建

    下面我们就来实操搭建主从,使用的是两台centos7并且安装的是Mysql 8来搭建主从,有一台centos 7然后直接克隆就行了。

    (1)首先检查centos 7里面的Mysql安装包和依赖包:

    rpm -qa |grep mysql
    

    执行后,在我本机上的显示如下:
    在这里插入图片描述
    (2)接着可以删除上面的安装包和依赖包:

    sudo yum remove mysql*
    

    (3)继续检查一下是否存在Mariadb,若是存在直接删除Mariadb

    // 检查是否存在Mariadb
    rpm -qa |grep mariadb
    // 删除Mariadb
    sudo rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
    

    (4)然后,就是删除Mysql的配置文件,可以使用下面的命令查找Msqyl配置文件的路径:

    sudo find / -name mysql
    

    在我本机上的显示的Mysql配置文件的路径如下:
    在这里插入图片描述
    (5)然后,通过下面的命令,将他们逐一删除:

    sudo rm -rf /usr/lib64/mysql
    ......
    

    (6)接着就开始安装Mysql 8了,使用wget命令下载Mysql 8的repo源,并且执行安装:

    wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm
    sudo yum -y install mysql80-community-release-el7-3.noarch.rpm
    

    安装完后会在/etc/yum.repos.d/目录下生成下面的两个文件,说明安装成功了:

    mysql-community.repo
    mysql-community-source.repo
    

    在这里插入图片描述
    (7)安装完Mysql8后,接着来更新一下yum源,并且查看yum仓库中的Mysql:

    // 更新yum源
    yum clean all
    yum makecache
    // 查看yum仓库中的Mysql
    yum list | grep mysql
    

    (8)可以查看到仓库中存在mysql-community-server.x86_64,直接安装就行了:

    sudo yum -y install mysql-community-server
    

    (9)接着启动Mysql,并检查Mysql的状态:

    // 启动Mysql
    systemctl start  mysqld.service
    // 检查Mysql的状态
    systemctl status mysqld
    

    确保查看Mysql的状态是active(running),表示正在运行,并且配置一下Mysql开机启动:

    systemctl enable mysqld
    

    在这里插入图片描述
    (10)因为Mysql是新安装的,所以要修改一下初始密码,先查看一下初始密码:

    grep "password" /var/log/mysqld.log
    

    你可能找出来有多个,可能是你之前安装卸载后的文件没有删干净,这里你就直接看时间,时间对应你现在的时间,就是你的初始密码:
    在这里插入图片描述
    (11)然后使用初始密码,登陆数据库,并且修改密码:

    mysql -uroot -p
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'LDCldc@123095;
    

    (12)此时在创建一个可以用于给两一台centos连接的用户,默认的root用户只有本机才能连接:

    // 创建连接用户
    create user 'test'@'%' identified by 'LDCldc-2020';
    // 并且把防火墙给关了,或者配置一下3306端口
    systemctl stop firewalld.service;
    // 设置防火墙开机自动关闭
    systemctl disable firewalld.service;
    

    (13)测试:到这里就Mysql的安装教程就就讲完了,可以测试一下,两台centos是否可以ping通:

    ping 192.168.163.156
    

    在这里插入图片描述
    我这里的两台机是可以互通的,Master:192.168.163.156,Slave:192.168.163.155,并且Slave使用下面的命令可以登陆到Master的Mysql:

    mysql -u[user] -p[密码] -h[远程主机ip]
    

    确保了这两项测试成功后,就可以进行下面的主从搭建了。

    (14)我这里使用的使用两台centos 7的vmware的ip分别是192.168.163.155(Slave)和192.168.163.156(Master)作为测试,首先在192.168.163.156(Master)中创建一个测试库test:

    // 创建测试库
    create database test default character set utf8mb4 collate utf8mb4_general_ci;
    // 并且授权
    grant all privileges on test.* to 'test'@'%';
    

    (15)然后编辑Master中的my.cnf文件,此文件位于/etc/my.cnf,执行下面的sql,并添加下面的信息:

    sudo vi /etc/my.cnf
    
    ==========以下是配置文件中的信息=============
    # 配置编码为utf8
    character_set_server=utf8mb4
    init_connect='SET NAMES utf8mb4'
    
    # 配置要给Slave同步的数据库
    binlog-do-db=test
    # 不用给Slave同步的数据库,一般是Mysql自带的数据库就不用给Slave同步了
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=sys
    # 自动清理30天前的log文件
    expire_logs_days=30
    # 启用二进制日志
    log-bin=mysql-bin
    # Master的id,这个要唯一,唯一是值,在主从中唯一
    server-id=3
    

    (16)配置完后重启Mysql服务,并查看Mysql的log_bin日志是否启动成功:

    systemctl restart mysqld
    # 查看log_bin日志是否启动成功
    show variables like '%log_bin%';
    

    在这里插入图片描述
    (17)接着查看Master的状态:

    show master status;
    

    在这里插入图片描述
    这两个数据File和Position要记住,后面配置Slave的时候要使用到这两个数据。

    (18)最后登陆Master的数据库,并创建一个用户用于同步数据:

    create user 'backup'@'%' IDENTIFIED BY 'LDCldc-2020';
    grant file on *.* to 'backup'@'%';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%';
    

    到这里Master的配置就配置完了,后面就进行Slave的配置。

    (19)在Slave中同样要创建test数据库,并且授权给test用户:

    # 创建同步数据的test数据库
    create database test default character set utf8mb4 collate utf8mb4_general_ci;
    # 授权
    grant all privileges on test.* to 'test'@'%';
    

    (20)接着编辑Slave中my.cnf文件,同样是在/etc/my.cnf路径下,加入如下配置:

    # 配置从服务器的ID,唯一的
    server-id=4
    #加上以下参数可以避免更新不及时,SLAVE 重启后导致的主从复制出错。
    read_only = 1
    master_info_repository=TABLE
    relay_log_info_repository=TABLE
    

    (21)并且重启Slave中的Mysql服务:

    show slave status\G
    

    在这里插入图片描述
    当看到Slave_IO_Running和Slave_SQL_Running都是yes的时候,这表示主从配置成功。

    「Slave_IO_Running也就是Slave中的IO线程用于请求Master,Slave_SQL_Running时sql线程将中继日志中更新日志同步到Slave数据库中。」

    但是,有时候Slave_IO_Running会为no,而Slave_SQL_Running为yes,这时候需要检查一下原因,因为我自己初次搭建的时候,也是出现这个问题。

    首先看重启一下Slave的MySQL服务:systemctl restart mysqld,然后执行:

    stop slave;
    start slave;
    

    这样就能够使Slave_IO_Running和Slave_SQL_Running显示都是yes了。

    (24)最后就是测试了,测试使用的是之前创建的test库,Master是用来写的,在Master的test库中随机创建一个表,你会发现Slave也会有这个表,插入数据也一样,都会被同步到Slave中。

    主从面试

    1、Mysql主从有什么优点?为什么要选择主从?

    1、高性能方面:主从复制通过水平扩展的方式,解决了原来单点故障的问题,并且原来的并发都集中到了一台Mysql服务器中,现在将单点负载分散到了多台机器上,实现读写分离,不会因为写操作过长锁表而导致读服务不能进行的问题,提高了服务器的整体性能。

    2、可靠性方面:主从在对外提供服务的时候,若是主库挂了,会有通过主从切换,选择其中的一台Slave作为Master;若是Slave挂了,还有其它的Slave提供读服务,提高了系统的可靠性和稳定性。

    若是主从复制,达到了写性能的瓶颈,你是怎么解决的呢?

    主从模式对于写少读多的场景确实非常大的优势,但是总会写操作达到瓶颈的时候,导致性能提不上去。

    这时候可以在设计上进行解决采用分库分表的形式,对于业务数据比较大的数据库可以采用分表,使得数据表的存储的数据量达到一个合理的状态。

    也可以采用分库,按照业务进行划分,这样对于单点的写,就会分成多点的写,性能方面也就会大大提高。

    主从复制的过程有数据延迟怎么办?导致Slave被读取到的数据并不是最新数据。

    主从复制有不同的复制策略,对于不同的场景的适应性也不同,对于数据的实时性要求很高,要求强一致性,可以采用同步复制策略,但是这样就会性能就会大打折扣。

    若是主从复制采用异步复制,要求数据最终一致性,性能方面也会好很多。只能说,对于数据延迟的解决方案没有最好的方案,就看你的业务场景中哪种方案使比较适合的。

    2、linux下实现MySQL主从复制(Master-Slave)

    网站发展到一定程度应用服务器和数据库服务器分离,然后单台服务器满足不了生产需要就要做集群处理。特别是现在数据极其重要以及重视用户体验的年代,无论是在安全性,高可用性以及高并发等各个方面,我们都要做到万无一失。一直没时间整理,今天抽空整理了一下mysql主从复制从而实现读写分离,提升服务性能。

    一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程。

    如下图所示:
    在这里插入图片描述
    一、环境
    主机:
    master操作系统:centos 6.5
    IP:192.168.1.190 (内网IP,实际情况为外网IP)
    MySQL版本:5.1.73
    从机:
    slave操作系统:centos 6.5
    IP:192.168.1.180 (内网IP,实际情况为外网IP)
    MySQL版本:5.1.73

    二、配置

    配置主服务器(master)

    1、编辑数据库配置文件my.cnf,一般在/etc/目录下。

    #vi /etc/my.cnf
    在[mysqld]的下面加入下面代码:

    log-bin=mysql-bin
    server-id=190
    innodb_flush_log_at_trx_commit=1
    sync_binlog=1
    binlog-do-db=itstyle
    binlog_ignore_db=mysql
    

    server-id=190中的190可以任定义,只要是唯一的就行。
    binlog-do-db=itstyle是表示只备份itstyle。
    binlog_ignore_db=mysql表示忽略备份mysql。
    不加binlog-do-db和binlog_ignore_db,那就表示备份全部数据库。

    2、然后重启MySQL:

    #service mysqld restart
    

    3、登录MySQL服务器。

    #mysql -uroot -p
    

    在主服务器新建一个用户赋予“REPLICATION SLAVE”的权限。你不需要再赋予其它的权限。在下面的命,192.168.1.180是从服务器的IP,123456 是用户密码,这里可以自行修改。

    mysql>CREATE USER 'mysqlcopy'@ '192.168.1.180' IDENTIFIED BY '123456';
    mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'192.168.1.180' IDENTIFIED BY '123456';
    

    你可以查看用户是否创建成功。

    mysql>use mysql
    mysql>select * from user;
    

    如果存在mysqlcopy用户,则说明成功。

    配置从服务器(slave)

    1、编辑配置文件my.cnf,在[mysqld]下面加入:

    server-id=180
    

    2可以自己定义,只要保证唯一的就行。

    2、保存文件并重启mysqld。

    #service mysqld restart
    

    3、登录mysql服务器,执行以下命令。

    mysql>CHANGE MASTER TO
    MASTER_HOST='192.168.1.190',
    MASTER_USER='mysqlcopy',
    MASTER_PASSWORD='123456',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=98,
    MASTER_CONNECT_RETRY=10;
    MASTER_HOST:主服务器的IP。
    MASTER_USER:配置主服务器时建立的用户名
    MASTER_PASSWORD:用户密码
    MASTER_PORT:主服务器mysql端口,如果未曾修改,默认即可。
    

    注意 MASTER_LOG_FILE 文件名称一致,不然导致 Slave_IO_Running: NO

    4、启动slave进程。

    mysql>START SLAVE;
    mysql>show slave status\G;
    

    如果Slave_IO_Running、Slave_SQL_Running状态为Yes则表明设置成功。

    显示如下:

    *************************** 1. row ***************************
                 Slave_IO_State: Waiting for master to send event
                    Master_Host: 192.168.1.222
                    Master_User: repl
                    Master_Port: 3306
                  Connect_Retry: 60
                Master_Log_File: log.000003
            Read_Master_Log_Pos: 98
                Relay_Log_File: mysqld-relay-bin.000002
                  Relay_Log_Pos: 229
          Relay_Master_Log_File: log.000003
     
              Slave_IO_Running: Yes
              Slave_SQL_Running: Yes
    
    
                Replicate_Do_DB:
            Replicate_Ignore_DB:
             Replicate_Do_Table:
         Replicate_Ignore_Table:
        Replicate_Wild_Do_Table:
    Replicate_Wild_Ignore_Table:
                     Last_Errno: 0
                     Last_Error:
                   Skip_Counter: 0
            Exec_Master_Log_Pos: 98
                Relay_Log_Space: 229
                Until_Condition: None
                 Until_Log_File:
                  Until_Log_Pos: 0
             Master_SSL_Allowed: No
             Master_SSL_CA_File:
             Master_SSL_CA_Path:
                Master_SSL_Cert:
              Master_SSL_Cipher:
                 Master_SSL_Key:
          Seconds_Behind_Master: 0
    1 row in set (0.00 sec)
    

    显示红色那两行,说明配置成功。

    5、查看mysql的日志,一般在/var/log/目录下的mysqld.log,如果启动成功,你应该会看到类似下面的日志。

    [root@localhost ~]# vi /etc/my.cnf
    
    091104 8:42:02 [Note] Slave I/O thread: connected to master ‘root@X.X.X.X:3306?, replication started in log ‘mysql-bin.000001? at position 98
    

    现在主服务器和从服务器已经配置好了。另外你可能需要设置主服务器的数据库二进制日志的过期时间,可以在配置文件中使用参数expire_logs_days来设定。

    可能出现问题
    一、 无法连接主服务器
    1.查看配置文件:
    skip-networking #注释掉 因为它是屏蔽掉一切TCP/IP连接
    bind-address = 127.0.0.1 #它和上一个选项是异曲同工,要想远程连接,也得注释掉

    2.如果以上工作都做过还是出现:
    ERROR 2003 (HY000): Can’t connect to MySQL server on ‘...’ (113),那就得考虑防火墙的问题了,关掉防火墙/etc/rc.d/init.d/iptables stop

    二、Slave_IO_Running: No
    其实就是无法连接主服务器导致的,当然还有其他问题。

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    参考链接 :

    MySQL主从复制原理(原理+实操) : https://mp.weixin.qq.com/s/3UpNwEmCYcn0yvlPRklsXw

    linux下实现MySQL主从复制(Master-Slave) : https://mp.weixin.qq.com/s/_mATubcJFOvAXkPzDLpnvw

    展开全文
  • 主要介绍了mysql 复制原理与实践应用,结合实例形式详细分析了MySQL数据库复制功能的原理、操作技巧与相关注意事项,需要的朋友可以参考下
  • MySQL 主从复制原理

    千次阅读 2022-03-30 11:27:54
    主从复制概念 读写分离概念 主库介绍 从库介绍 主从复制流程 主从复制效果展示

    在实际生产环境中,如果对MySQL数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是不能满足实际需求的,一般要通过数据库集群的主从复制机制来同步数据,再通过读写分离来提升数据库的并发负载能力

    主从复制概念

    主库对外提供数据的增删改查服务,主库中涉及到数据的修改都会写binlog

    从库用来数据的同步和备份,从库通过专门的线程从主库里面的binlog(二进制日志),把主库里跟数据、权限、表结构相关的修改同步到从库里面,相当于就是主库的所有修改通过主从复制机制体现在从库上

    好处是做数据备份以后,通过MySQL中间件mycat,可以实现容灾

    容灾:如果主库挂了,由中间件代理mycat自动把服务的请求映射到从库,由从库继续对外提供服务,体现出了高可用性(后端的服务允许一定的异常发生,但是后端的架构服务要可以容错,把这些异常的错误处理掉,并对外重新提供正常的服务)

    读写分离概念

    可以支持更大的并发,提高后端并发能力和高可用容灾,基于主从复制技术实现。我们读操作多,写操作少,主库专门处理写请求,数据的更新会记录在binlog,然后通过binlog同步到从库,客户端读数据的请求最终会转发到从库上(一主多从)

    在这里插入图片描述

    上图中的binlog,即使没有主从复制,也是会写binlog,只不过主从复制就是通过binlog来复制的

    主库介绍

    主库master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器

    从库介绍

    从库专门有一个I/O线程,专门读取接收主库发过来的binlog的内容,并写到中继日志relay log,中继日志充当缓冲区,并不是把主库的binlog读过来直接执行,这样 master 就不必等待 slave 执行完成才发送下一个事件

    写relay log的缺点就是:主库的binlog的内容可能很多,而从库接收到binlog的内容执行起来比较慢,导致从库的更新速度和主库相差越来越大

    从库还会启一个SQL线程,专门从中继日志读取相应的操作,所有的SQL都执行一遍,这样就实现了从库内容和主库内容的同步

    主从复制流程

    两个log:binlog(master)、relay log(slave),三个thread:dump(master)、IO(slave)、SQL(slave)

    1. 主库的更新操作写入binlog二进制日志中(主库需要打开binlog开关)
    2. master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器
    3. slave机器执行START SLAVE命令会在从服务器创建一个IO线程,接收master的binary log复制到其中继日志(处于内存中,读写快)。 首先slave开始一个工作线程(I/O线程),I/O线程会主动连接master ,然后主库会开启dump线程,dump线程从master的binlog中读取事件并发送给slave的I/O线程,如果dump线程已经跟上master(主库上的dump线程已经把binlog的内容发完了,而且主库上binlog没有产生更多的内容),dump线程会睡眠并等待binlog产生新的事件,slave的I/O线程接收的事件写入中继日志
    4. slave的SQL线程处理该过程的最后一步,SQL线程从relay log中读取事件,并执行其中的事件更新slave的数据,使其与master的数据同步。只要SQL线程与I/O线程保持一致,中继日志通常会位于os缓存中,所以中继日志的开销很小

    主从复制效果展示

    我们把linux作为一个主库,Win10上的MySQL Server作为从库

    在这里插入图片描述
    主从复制是单向同步,master的更改往slave同步。配置好主从复制的时候,两个库的数据可能是不一样的,从配置好主从复制开始,主库所有的更改都会同步到从库

    master创建mytest数据库
    在这里插入图片描述
    查看slave,发现mytest同步过来了
    在这里插入图片描述
    master创建user表,slave也同步了user表
    在这里插入图片描述
    现在linux端的MySQL(master)删除mytest库

    在这里插入图片描述
    此时slave的mytest也不存在了

    查看master当前环境下的工作线程

    show processlist

    在这里插入图片描述
    查看slave当前环境下的工作线程

    在这里插入图片描述

    展开全文
  • 主要介绍了Mysql半同步复制原理及问题排查 的相关资料,需要的朋友可以参考下
  • MySQL主从复制原理

    千次阅读 2022-01-19 14:44:02
    本文来详细说下Mysql主从复制原理。 文章目录概述 概述
  • 一文搞懂MYSQL主从复制原理

    千次阅读 2020-12-04 14:11:26
    1、什么是主从复制? 概念 主从复制是用来建立一个和 主数据库完全一样的数据库环境称为从数据库;主数据库一般是准实时的业务数据库。 2、主从复制作用 我们来思考如果在企业网站中,后端MYSQL数据库只有一台时候,...
  • Mysql主从复制&半同步复制原理
  • 主要介绍了MySQL 主从复制原理与实践,结合实例形式分析了MySQL 主从复制基本概念、原理、实现方法与相关注意事项,需要的朋友可以参考下
  • linux运维学习笔记:MySQL主从复制原理和实战
  • MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以...
  • Redis主从复制原理以及常见问题

    千次阅读 多人点赞 2020-06-02 10:40:34
    相信很多小伙伴都已经配置过主从复制,但是对于redis主从复制的工作流程和常见问题很多都没有深入的了解。咔咔这次用时俩天时间给大家整理一份redis主从复制的全部知识点。 主从复制(一)什么是redis主从复制?...
  • mysql主从复制原理

    千次阅读 2019-10-28 08:41:50
    主从复制原理,简言之,就三步曲,如下: 主数据库有个bin-log二进制文件,纪录了所有增删改Sql语句。(binlog线程) 从数据库把主数据库的bin-log文件的sql语句复制过来。(io线程) 从数据库的relay-log重做...
  • Linux运维-运维课程d6-MySQL主从复制架构-03-MySQL复制原理.mp4
  • Mysql主从复制原理

    千次阅读 2019-06-04 16:09:58
    wfr=spider&for=pc 概要 MySQL Replication (MySQL 主从复制) 是...为什么要主从复制以及它的实现原理是什么? MySQL 主从复制概念MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多...
  • 10.Redis主从复制原理(高频面试题)

    万次阅读 2021-08-10 14:20:41
    主从复制 如果 Redis 的读写请求量很大,那么单个 Redis 实例很有可能承担不了这么大的请求量,如何提高Redis的性能呢?我们可以部署多个副本节点,业务采用读写分离的方式,把读请求分担到多个副本节点上,提高访问...
  • PostgreSQL主从流复制原理及搭建

    千次阅读 2019-08-12 13:12:18
    Postgresql9开始支持流复制(stream replication),作为pg原生的复制技术,有着很好的性能。本文从几个方面全面介绍pg的流复制技术。 主从部署 Postgresql主从部署比较简单,首先你需要安装好主从两个实例,然后...
  • ibm DB2 Q复制原理

    2012-06-27 11:26:50
    ibm DB2 Q复制原理ppt,祥细解说.
  • PostgreSQL-10.0-逻辑复制原理与最佳实践 PostgreSQL 从2010年发布的9.0开始支持流式物理复制,备库可以作为只读库打开,提供给用户使用。
  • Mysql主从复制&半同步复制原理

    千次阅读 2018-08-18 23:36:35
    一、Mysql主从复制原理 MySQL主从复制实则是一个异步复制的过程。经历了三个线程:主库和从库上的I/O线程,SQL线程。 MySQL的主从复制,实际上Slave端获取到Master端binlog日志(记录了SQL数据操作,增删添,...
  • MySQL半同步复制原理配置与介绍

    万次阅读 2017-04-06 19:21:52
    半同步复制的工作原理就是当slave从库IO_Thread线程将binlog日志接收完毕之后,要给master主库一个确认,如果 rpl_semi_sync_master_timeout=10000 (10秒)超过10秒未收到slave从库的接受确认信号,那么就会自动切换...
  • 复制原理: 物理复制也叫流复制,流复制原理是主库把预写WAL文件发送给备库,备库接收WAL文件后,根据这些WAL文件进行重放。 复制原理: 逻辑复制也是基于WAL文件,在逻辑复制中把主库称为源端库,备库称为...
  • redis主从复制原理和介绍

    千次阅读 2018-07-08 15:40:20
    一、单机的问题:1、机器故障:导致redis不可用2、容量瓶颈:容量不能水平扩展3、OPS瓶颈:一台机器的网络带宽总是有限的,如果能够分配到多台机器,可以有效解决QPS问题二、主从复制的作用1、数据副本:多一份数据...
  • 主从复制的方式主从复制分为:异步复制,半同步复制和全同步复制异步复制: 是MySQL默认的复制模式,主库在执行完客户端提交的事务之后会立刻将结果返回给客户端,并不关心从库接收的结果,这样就会导致当主数据库...
  • MySQL主从复制原理、半同步操作步骤及原理 标签(空格分隔): mysql 1.1 企业Linux运维场景数据同步方案 1.1.1 文件级别的异机同步方案 1、scp/sftp/nc 命令可以实现远程数据同步。  2、搭建ftp/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 526,522
精华内容 210,608
关键字:

复制原理