-
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:47PostgreSQL11.2 中文文档 chm版; PostgreSQL是世界上最强大的开源数据库, 堪比商业版的Oracle, -
mysql主从复制原理详解图
2018-03-21 11:29:47详细的结构分解,可以快速了解mysql主从复制的原理和对主从更清晰的了解。 -
MySQL主从复制原理 _ 异步复制 _ 半同步复制 _ GTID复制.pdf
2021-09-13 16:02:59MySQL主从复制原理 _ 异步复制 _ 半同步复制 _ 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等语句删除,那么从看库的备份功能也就失效了。主从机制实现原理
- master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志时间,binary log events);
- slave将master的binary log events拷贝到它的中继日志(relay log);
- slave重做中继日志中的事件,将改变反映到它自己的库中。
开始搭建主从复制
主服务器配置
开始修改配置文件
.
修改配置文件/etc/my.cnf
,在[mysqld]
配置下增加两项配置:server-id=1
,log-bin=mysql-bin
。- server-id=1: 是服务器的唯一标示(主从服务器之间必须不同)。
- log-bin=mysql-bin: 启用二进制日志,并指定日志名称为mysql-bin。
- 保存退出后重启服务:
systemctl restart mysql
开始创建授权复制用户
# 创建复制用户 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;
检查主从复制是否成功的关键在于:
这两项都是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 复制原理与实践应用详解
2020-09-08 22:10:00主要介绍了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)
- 主库的更新操作写入binlog二进制日志中(主库需要打开binlog开关)
- master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器
- 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线程接收的事件写入中继日志 - 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半同步复制原理及问题排查
2020-09-10 05:05:35主要介绍了Mysql半同步复制原理及问题排查 的相关资料,需要的朋友可以参考下 -
MySQL主从复制原理
2022-01-19 14:44:02本文来详细说下Mysql主从复制原理。 文章目录概述 概述 -
一文搞懂MYSQL主从复制原理
2020-12-04 14:11:261、什么是主从复制? 概念 主从复制是用来建立一个和 主数据库完全一样的数据库环境称为从数据库;主数据库一般是准实时的业务数据库。 2、主从复制作用 我们来思考如果在企业网站中,后端MYSQL数据库只有一台时候,... -
Mysql主从复制&半同步复制原理.pdf
2021-09-13 16:02:59Mysql主从复制&半同步复制原理 -
MySQL 主从复制原理与实践详解
2020-09-08 21:10:09主要介绍了MySQL 主从复制原理与实践,结合实例形式分析了MySQL 主从复制基本概念、原理、实现方法与相关注意事项,需要的朋友可以参考下 -
linux运维学习笔记:MySQL主从复制原理和实战.pdf
2021-08-18 00:18:31linux运维学习笔记:MySQL主从复制原理和实战 -
数据库的主从复制原理(超级详细)
2021-03-31 09:19:41MySQL 主从复制是指数据可以从一个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
2022-05-31 14:34:35Linux运维-运维课程d6-MySQL主从复制架构-03-MySQL复制原理.mp4 -
Mysql主从复制原理
2019-06-04 16:09:58wfr=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:18Postgresql9开始支持流复制(stream replication),作为pg原生的复制技术,有着很好的性能。本文从几个方面全面介绍pg的流复制技术。 主从部署 Postgresql主从部署比较简单,首先你需要安装好主从两个实例,然后... -
ibm DB2 Q复制原理
2012-06-27 11:26:50ibm DB2 Q复制原理ppt,祥细解说. -
PostgreSQL-10.0-逻辑复制原理与最佳实践
2018-08-19 21:25:43PostgreSQL-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从库的接受确认信号,那么就会自动切换... -
postgresql流复制原理、流复制和逻辑复制的区别
2019-07-19 15:21:11流复制的原理: 物理复制也叫流复制,流复制的原理是主库把预写WAL文件发送给备库,备库接收WAL文件后,根据这些WAL文件进行重放。 复制的原理: 逻辑复制也是基于WAL文件,在逻辑复制中把主库称为源端库,备库称为... -
redis主从复制原理和介绍
2018-07-08 15:40:20一、单机的问题:1、机器故障:导致redis不可用2、容量瓶颈:容量不能水平扩展3、OPS瓶颈:一台机器的网络带宽总是有限的,如果能够分配到多台机器,可以有效解决QPS问题二、主从复制的作用1、数据副本:多一份数据... -
MySQL主从复制原理,超级详细的总结,看完全通了
2021-01-19 05:16:03主从复制的方式主从复制分为:异步复制,半同步复制和全同步复制异步复制: 是MySQL默认的复制模式,主库在执行完客户端提交的事务之后会立刻将结果返回给客户端,并不关心从库接收的结果,这样就会导致当主数据库... -
MySQL主从复制原理、半同步操作步骤及原理
2017-12-04 16:31:24MySQL主从复制原理、半同步操作步骤及原理 标签(空格分隔): mysql 1.1 企业Linux运维场景数据同步方案 1.1.1 文件级别的异机同步方案 1、scp/sftp/nc 命令可以实现远程数据同步。 2、搭建ftp/...