Redis主从服务

案例描述

知识点:

(1)了解Redis主从服务。

(2)了解Redis主从复制的原理。

(3)了解Redis主从复制的实现步骤。

(4)了解Redis主从服务的优缺点。

技能点:

(1)掌握Redis服务的安装。

(2)掌握Redis主从服务的配置。

(3)掌握Redis主从服务的验证。

案例准备

1.规划节点

使用CentOS7.5镜像创建云主机,云主机类型使用1VCPU/2 GB内存/20 GB硬盘。节点规划见表1-1。

表1-1 节点规划

IP

主机名

节点

192.168.200.21

redis1

Redis主节点

192.168.200.22

redis2

Redis从节点

2. 基础环境准备

(1)配置主机名

redis1节点配置主机名:

[root@localhost ~]# hostnamectl set-hostname redis1

//退出并重新连接虚拟机

[root@redis ~]# hostnamectl

   Static hostname: redis1

         Icon name: computer-vm

           Chassis: vm

        Machine ID: 1924e95064844f2ca7d9aad6ae89d2a3

           Boot ID: 95e368304c784e24be52eafc6ff28605

    Virtualization: vmware

  Operating System: CentOS Linux 7 (Core)

       CPE OS Name: cpe:/o:centos:centos:7

            Kernel: Linux 3.10.0-327.el7.x86_64

      Architecture: x86-64

redis2节点配置主机名:

[root@localhost ~]# hostnamectl set-hostname redis2

//退出并重新连接虚拟机

[root@redis2 ~]# hostnamectl

   Static hostname: redis2

         Icon name: computer-vm

           Chassis: vm

        Machine ID: 1924e95064844f2ca7d9aad6ae89d2a3

           Boot ID: 6eb6dfa52dd5483b9f0d31722af15a76

    Virtualization: vmware

  Operating System: CentOS Linux 7 (Core)

       CPE OS Name: cpe:/o:centos:centos:7

            Kernel: Linux 3.10.0-327.el7.x86_64

      Architecture: x86-64

(2)关闭防火墙与SELinux

两个节点关闭SELinux服务与防火墙服务,命令如下:

# setenforce 0

# systemctl stop firewalld

至此,基础环境已全部准备完毕。

案例实施

实验1 Redis服务介绍

(1)Redis简介

Remote Dictionary Server(Redis)远程字典服务器是完全开源免费的,用C语言编写的,遵守BSD开源协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库,它也通常被称为数据结构服务器,因为值(value)可以是字符串(String),哈希(Map),列表(list), 集合(sets)和有序集合(sorted sets)等类型。

与传统数据库不同的是Redis的数据是存在内存中的,所以存写速度非常快,因此Redis被广泛应用于缓存方向。Redis为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。

Redis与其他key-value缓存产品有以下三个特点:

① Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

② Redis有丰富的数据类型,Redis不仅仅支持简单的key-value类型的数据,同时还提供Strings、Lists、Hashes、Sets及Ordered Sets等数据结构的存储。

③ Redis支持数据的备份,即master-slave模式的数据备份。

(2)Redis使用场景

Redis使用场景,查询出的数据保存到Redis中,下次查询的时候直接从Redis中拿到数据。不用和数据库进行交互。用户访问Redis缓存如图1-1和图1-2所示。

 

图1-1 用户访问Redis缓存1

 

图1-2用户访问Redis缓存2

什么数据会存到Redis数据库中?主要是热点数据,不会经常改变的,一般是常量。比如登录验证的Cookie,购物车,历史浏览记录。(只要具有一定时间的生命周期)比如首页的商品信息,一般不会变。比如秒杀的商品信息,一般也不会变。比如地图的经纬度信息,一般也不会变。

用户的关注列表,粉丝列表,消息列表等功能都可以用Redis的List结构来实现。Redis可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能(Set 类似与列表,但可自动排重的)。

Redis不但提供了无需集合(Sets),还很体贴的提供了有序集合(Sorted Sets),因此,各种排行榜数据基本上都会使用Redis提供的Sorted Sets来实现。

(3)Redis的优势

① 性能极高——Redis能读的速度是110000次/s,写的速度是81000次/s 。

② 丰富的数据类型——Redis支持二进制案例的Strings、Lists、Hashes、Sets 及Ordered Sets数据类型操作。

③ 原子性——Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。

④ 丰富的特性——Redis还支持publish/subscribe、通知、key过期等特性。

(4)为什么要使用Redis

有memcached使用经验的读者可能知道,用户只能用APPEND命令将数据添加到已有字符串的末尾。memcached的文档中声明,可以用APPEND命令来管理元素列表。用户可以将元素追加到一个字符串的末尾,并将那个字符串当作列表来使用。但随后如何删除这些元素呢?memcached采用的办法是通过黑名单(blacklist)来隐藏列表里面的元素,从而避免对元素执行读取、更新、写入(包括在一次数据库查询之后执行的memcached写入)等操作。相反地,Redis的LIST和SET允许用户直接添加或者删除元素。

使用Redis而不是memcached来解决问题,不仅可以让代码变得更简短、更易懂、更易维护,而且还可以使代码的运行速度更快(因为用户不需要通过读取数据库来更新数据)。除此之外,在其他许多情况下,Redis的效率和易用性也比关系数据库要好得多。

数据库的一个常见用法是存储长期的报告数据,并将这些报告数据用作固定时间范围内的聚合数据(aggregates)。收集聚合数据的常见做法是:先将各个行插入一个报告表里面,之后再通过扫描这些行来收集聚合数据,并根据收集到的聚合数据来更新聚合表中已有的那些行。之所以使用插入行的方式来存储,是因为对于大部分数据库来说,插入行操作的执行速度非常快(插入行只会在硬盘文件末尾进行写入)。不过,对表里面的行进行更新却是一个速度相当慢的操作,因为这种更新除了会引起一次随机读(random read)之外,还可能会引起一次随机写(random write)。而在Redis里面,用户可以直接使用原子的(atomic)INCR命令及其变种来计算聚合数据,并且因为Redis将数据存储在内存里面,而且发送给Redis的命令请求并不需要经过典型的查询分析器(parser)或者查询优化器(optimizer)进行处理,所以对Redis存储的数据执行随机写的速度总是非常迅速的。

使用 Redis 而不是关系数据库或者其他硬盘存储数据库,可以避免写入不必要的临时数据,也免去了对临时数据进行扫描或者删除的麻烦,并最终改善程序的性能。

实验2 Redis主从服务介绍

(1)什么是主从复制

和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。

(2)什么是全量同步

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

① 从服务器连接主服务器,发送SYNC命令;

② 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;

③ 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;

④ 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;

⑤ 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;

⑥ 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令。

完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。

(3)什么是增量同步

Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。

增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

(4)主从同步策略

Redis主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave在任何时候都可以发起全量同步。Redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

注意:

如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。

Redis主从复制的配置十分简单,它可以使从服务器是主服务器的完全拷贝。需要清除Redis主从复制的几点重要内容:

① Redis使用异步复制。但从Redis 2.8开始,从服务器会周期性的应答从复制流中处理的数据量。

② 一个主服务器可以有多个从服务器。

③ 从服务器也可以接受其他从服务器的连接。除了多个从服务器连接到一个主服务器之外,多个从服务器也可以连接到一个从服务器上,形成一个树状结构。

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

⑤ 主从复制也不阻塞从服务器端。当从服务器进行初始同步时,它使用旧版本的数据来应对查询请求,假设你在redis.conf配置文件是这么配置的。否则的话,你可以配置当复制流关闭时让从服务器给客户端返回一个错误。但是,当初始同步完成后,需要删除旧的数据集和加载新的数据集,在这个短暂的时间内,从服务器会阻塞连接进来的请求。

⑥ 主从复制可以用来增强扩展性,使用多个从服务器来处理只读的请求(比如,繁重的排序操作可以放到从服务器去做),也可以简单的用来做数据冗余。

⑦ 使用主从复制可以为主服务器免除把数据写入磁盘的消耗:在主服务器的redis.conf文件中配置“避免保存”(注释掉所有“保存”命令),然后连接一个配置为“进行保存”的从服务器即可。但是这个配置要确保主服务器不会自动重启。

实验3 Redis主从服务案例实现

(1)Redis服务安装

可以使用iaas的源或者gpmall-repo的源来安装redis服务,两种方式安装redis的小版本略有区别,不影响案例的整体操作。

上传gpmall.zip文件到/root目录

redis1节点:

[root@redis1 ~]# yum install -y unzip

 

解压zip

[root@redis1 ~]# unzip gpmall.zip

 

配置gpmall  yum源

[root@redis1 ~]# vi /etc/yum.repos.d/local.repo

[centos]

name=centos

baseurl=file:///opt/centos

gpgcheck=0

enabled=1

[gpmall]

name=gpmall

baseurl=file:///root/gpmall

gpgcheck=0

enabled=1

[root@redis1 gpmall]# yum repolist

gpmall                 gpmall                     179



[root@redis1 ~]# yum install redis -y

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

Resolving Dependencies

...

...

Installed:

  redis.x86_64 0:3.2.12-2.el7                                                                



Dependency Installed:

  jemalloc.x86_64 0:3.6.0-1.el7                                                              



Complete!

[root@redis1 ~]# rpm -qa|grep redis            //查看Redis版本

redis-3.2.12-2.el7.x86_64

 

 

 

redis2节点:

[root@redis1 ~]# yum install -y unzip

 

解压zip

[root@redis1 ~]# unzip gpmall.zip

 

配置gpmall  yum源

[root@redis1 ~]# vi /etc/yum.repos.d/local.repo

[centos]

name=centos

baseurl=file:///opt/centos

gpgcheck=0

enabled=1

[gpmall]

name=gpmall

baseurl=file:///root/gpmall

gpgcheck=0

enabled=1

[root@redis1 gpmall]# yum repolist

gpmall                 gpmall                     179



[root@redis2 ~]# yum install redis -y

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

Resolving Dependencies

...

...

Installed:

  redis.x86_64 0:3.2.12-2.el7                                                                



Dependency Installed:

  jemalloc.x86_64 0:3.6.0-1.el7                                                              



Complete!

[root@redis2 ~]# rpm -qa|grep redis            //查看Redis版本

redis-3.2.12-2.el7.x86_64

 

两个节点均安装redis。

(2)Redis主从服务配置

redis1主节点:

修改redis1节点的配置文件/etc/redis.conf如下:

#第一处修改

# bind 127.0.0.1                     //找到bind 127.0.0.1这行并注释掉

#第二处修改

protected-mode yes                   //修改前

protected-mode no                   //修改后,外部网络可以访问

#第三处修改

daemonize no                        //修改前

daemonize yes                       //修改后,开启守护进程

#第四处修改

# requirepass foobared                 //找到该行

requirepass "123456"                   //在下方添加设置访问密码

#第五处修改,设定主库密码与当前库密码同步,保证从库能够提升为主库

masterauth "123456"

#第六处修改,打开AOF持久化支持

appendonly yes

至此,redis1主服务器配置完毕,重启服务,命令如下:

[root@redis1 ~]# systemctl restart redis

redis2从节点:

修改redis2节点的配置文件/etc/redis.conf如下:

#第一处修改

# bind 127.0.0.1                     //找到bind 127.0.0.1这行并注释掉

#第二处修改

protected-mode yes                   //修改前

protected-mode no                   //修改后,外部网络可以访问

#第三处修改

daemonize no                        //修改前

daemonize yes                       //修改后,开启守护进程

#第四处修改

# requirepass foobared                 //找到该行

requirepass "123456"                   //在下方添加设置访问密码

#第五处修改

# replicaof<masterip> <masterport>       //找到该行

replicaof192.168.200.21 6379          //在下方添加访问的主节点IP与端口

#第六处修改

# masterauth <master-password>        //找到该行

masterauth "123456"                   //在下方添加访问主节点密码

#第七出修改,打开AOF持久化支持

appendonly yes

至此,redis2主服务器配置完毕,重启服务,命令如下:

[root@redis2 ~]# systemctl restart redis

(3)主从信息查询

先在主节点redis1中登录redis-cli并输入密码,查看主从复制的信息,命令如下:

[root@redis1 ~]# redis-cli

127.0.0.1:6379> auth 123456

OK

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:1

slave0:ip=192.168.200.22,port=6379,state=online,offset=1,lag=1

master_repl_offset:1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:2

repl_backlog_histlen:0

127.0.0.1:6379>

可以看到该节点为master节点,并有一个从节点已连接。

转到redis2节点,同样登录redis-cli并输入密码,查看主从复制的信息,命令如下:

[root@redis2 ~]# redis-cli

127.0.0.1:6379> auth 123456

OK

127.0.0.1:6379> info replication

# Replication

role:slave

master_host:192.168.200.21

master_port:6379

master_link_status:up

master_last_io_seconds_ago:10

master_sync_in_progress:0

slave_repl_offset:15

slave_priority:100

slave_read_only:1

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

127.0.0.1:6379>

可以查看到该节点为从节点,连接的主节点IP为192.168.200.21。

(4)主从验证

在redis1节点,设置一个name,命令如下:

[root@redis1 ~]# redis-cli

127.0.0.1:6379> set name xiandian

OK

设置name成功。

到redis2节点,使用get命令获取name,命令如下:

[root@redis2 ~]# redis-cli

127.0.0.1:6379> get name

"xiandian"

可以看到获取name成功,验证Redis主从服务成功。

 

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐