您的位置:首页 > 数据库 > Redis

redis总结集群模式加哨兵模式,理论讲解实践部署

2018-12-27 11:31 766 查看

Redis是一个开源,内存数据结构存储,用作数据库,缓存和消息代理它支持的数据结构有:字符串,哈希,列表,集合,有序集合,位图,超级日志和具有半径查询的地理空间索引.Redis是一个高性能的支持主从同步的键 - 值数据库。


Redis集群设计包括2部分:哈希Slot和节点主从,本篇博文通过3张图来搞明白Redis的集群设计。

节点主从:

主从设计不算什么新鲜玩意,在数据库中我们也经常用主从来做读写分离,直接上图:
图上能看得到的信息:

1, 只有1个Master,可以有N个slaver,而且Slaver也可以有自己的Slaver,由于这种主从的关系决定他们是在配置阶段就要指定他们的上下级关系,而不是Zookeeper那种平行关系是自主推优出来的。

2, 读写分离,Master只负责写和同步数据给Slaver,Slaver承担了被读的任务,所以Slaver的扩容只能提高读效率不能提高写效率。

3, Slaver先将Master那边获取到的信息压入磁盘,再load进内存,client端是从内存中读取信息的,所以Redis是内存数据库。

当一个新的Slaver加入到这个集群时,会主动找Master来拜码头,Master发现新的小弟后将全量数据发送给新的Slaver,数据量越大性能消耗也就越大,所以尽量避免在运行时做Slaver的扩容。

简单总结下主从模式的设计:

优点:读写分离,通过增加Slaver可以提高并发读的能力。

缺点:Master写能力是瓶颈。

虽然理论上对Slaver没有限制但是维护Slaver开销总将会变成瓶颈。

Master的Disk大小也将会成为整个Redis集群存储容量的瓶颈。

哈希Slot:

这个艺名看起来很文艺,但也不是什么新技术,他的真名就叫分表分库,再上一个图:


图上能看到的信息:

1, 对象保存到Redis之前先经过CRC16哈希到一个指定的Node上,例如Object4最终Hash到了Node1上。

2, 每个Node被平均分配了一个Slot段,对应着0-16384,Slot不能重复也不能缺失,否则会导致对象重复存储或无法存储。

3, Node之间也互相监听,一旦有Node退出或者加入,会按照Slot为单位做数据的迁移。例如Node1如果掉线了,0-5640这些Slot将会平均分摊到Node2和Node3上,由于Node2和Node3本身维护的Slot还会在自己身上不会被重新分配,所以迁移过程中不会影响到5641-16384Slot段的使用。

简单总结下哈希Slot的优缺点:

缺点:每个Node承担着互相监听、高并发数据写入、高并发数据读出,工作任务繁重

优点:将Redis的写操作分摊到了多个节点上,提高写的并发能力,扩容简单。
双剑合并:

看到这里大家也就发现了,主从和哈希的设计优缺点正好是相互弥补的,将图一每一套主从对应到图二中的每一个Node,就是Redis集群的终极形态,先Hash分逻辑节点,然后每个逻辑节点内部是主从,如图:

想扩展并发读就添加Slaver,想扩展并发写就添加Master,想扩容也就是添加Master,任何一个Slaver或者几个Master挂了都不会是灾难性的故障。

一、主从
通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。
。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此, Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。

在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库[1] (slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。

主从数据库的配置
master slave
主不用配置,从redis的conf文件加入 slaveof ip port 就可以了
或者从redis启动时 redis-server --port 6380 --slaveof 127.0.0.1 6379
从数据库一般是只读,可以改为可写,但写入的数据很容易被主同步没,所以还是只读就可以。
也可以在运行是使用slaveof ip port命令,停止原来的主,切换成刚刚设置的主 slaveof no one会把自己变成主

复制原理
当从数据库启动时,会向主数据库发送sync命令,主数据库接收到sync后开始在后台报错快照rdb,在保存快照期间受到的命名缓存起来,当快照完成时,主数据库会将快照和缓存的命令一块发送给从。复制初始化结束。
之后,主每受到1个命令就同步发送给从。
当出现断开重连后,2.8之后的版本会将断线期间的命令传给重数据库。增量复制

主从复制是乐观复制,当客户端发送写执行给主,主执行完立即将结果返回客户端,并异步的把命令发送给从,从而不影响性能。也可以设置至少同步给多少个从主才可写。
无硬盘复制:如果硬盘效率低将会影响复制性能,2.8之后可以设置无硬盘复制,repl-diskless-sync yes

二、哨兵
当主数据库遇到异常中断服务后,开发者可以通过手动的方式选择一个从数据库来升格为主数据库,以使得系统能够继续提供服务。然而整个过程相对麻烦且需要人工介入,难以实现自动化。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。
哨兵的作用就是监控redis主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库。

顾名思义,哨兵的作用就是监控Redis系统的运行状况。它的功能包括以下两个。

(1)监控主数据库和从数据库是否正常运行。
(2)主数据库出现故障时自动将从数据库转换为主数据库。

可以用info replication查看主从情况
例子:
1主2从 1哨兵,可以用命令起也可以用配置文件里
可以使用双哨兵,更安全,
redis-server --port 6379
redis-server --port 6380 --slaveof 192.168.0.167 6379
redis-server --port 6381 --slaveof 192.168.0.167 6379

redis-sentinel sentinel.conf
哨兵配置文件
sentinel.conf
sentinel monitor mymaster 192.168.0.167 6379 1

其中mymaster表示要监控的主数据库的名字,可以自己定义一个。这个名字必须仅由大小写字母、数字和“.-_”这 3 个字符组成。后两个参数表示主数据库的地址和端口号,这里我们要监控的是主数据库6379。
注意:

1、使用时不能用127.0.0.1,需要用真实IP,不然java程序通过哨兵会连到java程序所在的机器(127.0.0.1 )

2、配置哨兵监控一个系统时,只需要配置其监控主数据库即可,哨兵会自动发现所有复制该主数据库的从数据库

这样哨兵就能监控主6379和从6380、6381,一旦6379挂掉,哨兵就会在2个从中选择一个作为主,根据优先级选,如果一样就选个id小的,当6379再起来就作为从存在。

主从切换过程:

(1) slave leader升级为master
(2) 其他slave修改为新master的slave
(3) 客户端修改连接
(4) 老的master如果重启成功,变为新master的slave

哨兵监控1主2从,停掉主,哨兵会选出1个从作为主,变成1主1从。然而当我把原来的主再起来,它不会作为从,只是个独立的节点。

如果在新的主刚被选出来时,我把原来的主起来,它就能成为新主的从节点。
如果在新的主选出来过一会再起原来的主,就不能成为新主的从节点
或者在老的主起来后,重启哨兵也能把它变成从,哨兵配置文件里有,哨兵会执行“+convert-to-slave”

这很奇怪,我也没弄明白是怎么回事。

三、集群
搭建环境 CentOS7 , Redis4.01

Redis集群正常工作至少需要3个节点,为了实现高可用,每个 Master 节点要配备至少 1 个 Slave 节点。所以需要部署6个redis。
为了写这篇实战教程,根据我的笔记本性能,只够建3个虚拟机(实际应用需准备6台机器或虚拟机),所有1个虚拟机装了2个redis。

192.168.43.129:7111 ;

192.168.43.130:7112 ;

192.168.43.131:7113 ;

192.168.43.129:7114 ;

192.168.43.130:7115 ;

192.168.43.131:7116 ;

一. 防火墙中打开相应的端口

每个redis需要打开服务端口和集群通讯端口(服务端口+10000)

192.168.43.129

#Master1

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7111 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17111 -j ACCEPT

#Slave1

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7114 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17114 -j ACCEPT

192.168.43.130

#Master2

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7112 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17112 -j ACCEPT

#Slave2

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7115 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17115 -j ACCEPT

192.168.43.131

#Master3

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7113 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17113 -j ACCEPT

#Slave3

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7116 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17116 -j ACCEPT

二. 安装Redis

(1)下载解压安装文件

cd /home/zsg/Downloads

下载或上传最新的redis-4.0.1.tar.gz

解压

tar -zxvf redis-4.0.1.tar.gz

进入解压目录

cd redis-4.0.1

(2)安装redis节点

创建Master安装目录:
mkdir /home/zsg/program/redis-cluster/7111

安装(使用 PREFIX 指定安装目录):
make PREFIX=/home/zsg/program/redis-cluster/7111 install
安装完成后,可以看到/home/zsg/program/redis-cluster/7111 目录下有一个 bin 目录,bin 目录里就是 redis 的命令脚本:

redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server

(3)安装其他redis节点

创建安装目录:
mkdir /home/zsg/program/redis-cluster/7115

make PREFIX=/home/zsg/program/redis-cluster/7115 install

或者直接把已创建节点的bin目录直接拷贝到7115目录下

三. redis配置文件

(1)拷贝 redid.conf 配置文件到各节点配置目录:

192.168.43.129

cd /home/zsg/program/redis-cluster/7111/

mkdir conf #配置文件存放目录

mkdir data #节点数据持久化存放目录

cp /home/zsg/Downloads/redis-4.0.1/redis.conf /home/zsg/program/redis-cluster/7111/conf/redis-7111.conf

另外5个节点类似。

(2)修改配置

vi redis-7111.conf

修改下列值

a) port 7111 #监听端口,默认为 6379 注意:集群通讯端口值默认为此端口值+10000,如17111

b) daemonize yes #yes表示作为守护进程运行
c) pidfile /var/run/redis-7111.pid 如以后台进程运行,则需指定一个 pid, 默认为/var/run/redis.pid

d) databases 1 #可用数据库数,默认值为 16,默认数据库存储在 DB 0号 ID 库中,无特殊需求,建议仅设置一个数据库 databases 1

e) cluster-enabled yes #打开 redis 集群

f) cluster-config-file /home/zsg/program/redis-cluster/7111/conf/nodes.conf #集群配置文件(启动自动生成)

g) cluster-node-timeout 15000 #节点互连超时时间。毫秒

h) cluster-migration-barrier 1 # 数据迁移的副本临界数,这个参数表示的是,一个主节点在拥有多少个好的从节点的时候就要割让一个从节点出来给另一个没有任何从节点的主节点。

i) cluster-require-full-coverage yes #如果某一些 key space 没有被集群中任何节点覆盖,集群将停止接受写入。

j) appendonly yes #启用 aof 持久化方式 ,因为 redis 本身同步数据文件是按上面 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为 no

k) dir /home/zsg/program/redis-cluster/7111/data #节点数据持久化存放目录(建议配置)

l) bind 192.168.43.129 #绑定ip

其他几个个redis的conf文件都类似修改。

四. 启动6个redis

使用如下命令启动这 6 个 Redis 节点实例:
192.168.43.129
/home/zsg/program/redis-cluster/7111/bin/redis-server /home/zsg/program/redis-cluster/7111/conf/redis-7111.conf
/home/zsg/program/redis-cluster/7114/bin/redis-server /home/zsg/program/redis-cluster/7114/conf/redis-7114.conf
192.168.43.130
/home/zsg/program/redis-cluster/7112/bin/redis-server /home/zsg/program/redis-cluster/7112/conf/redis-7112.conf
/home/zsg/program/redis-cluster/7115/bin/redis-server /home/zsg/program/redis-cluster/7115/conf/redis-7115.conf
192.168.43.131
/home/zsg/program/redis-cluster/7113/bin/redis-server /home/zsg/program/redis-cluster/7113/conf/redis-7113.conf
/home/zsg/program/redis-cluster/7116/bin/redis-server /home/zsg/program/redis-cluster/7116/conf/redis-7116.conf

启动之后用 PS 命令查看实例启动情况:
ps -ef | grep redis

zsg 3055 1 0 18:51 ? 00:00:00 /home/zsg/program/redis-cluster/7111/bin/redis-server 127.0.0.1:7111 [cluster]
zsg 3062 1 0 18:51 ? 00:00:00 /home/zsg/program/redis-cluster/7114/bin/redis-server 127.0.0.1:7114 [cluster]

zsg 2971 1 0 18:52 ? 00:00:00 /home/zsg/program/redis-cluster/7112/bin/redis-server 127.0.0.1:7112 [cluster]
zsg 2976 1 0 18:53 ? 00:00:00 /home/zsg/program/redis-cluster/7115/bin/redis-server 127.0.0.1:7115 [cluster]

zsg 3034 1 0 18:54 ? 00:00:00 /home/zsg/program/redis-cluster/7113/bin/redis-server 127.0.0.1:7113 [cluster]
zsg 3039 1 0 18:54 ? 00:00:00 /home/zsg/program/redis-cluster/7116/bin/redis-server 127.0.0.1:7116 [cluster]

注意:启动完毕后,6 个 Redis 实例尚未构成集群。
五. 安装ruby
(1)安装 ruby 和 rubygems(注意:需要 ruby 的版本在 1.8.7 以上)

yum install ruby rubygems

(2)检查 ruby 版本:

ruby -v

ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
(3)gem 安装 redis ruby 接口:

gem install redis

六. 执行 Redis 集群创建命令(只需要在其中一个节点上执行一次则可)

cd /home/zsg/Downloads/redis-4.0.1/src/

cp redis-trib.rb /usr/local/bin/redis-trib

#cd /usr/local/bin/

redis-trib create --replicas 1 192.168.1.114:7114 192.168.1.115:7115 192.168.1.116:7116 192.168.1.111:7111 192.168.1.112:7112 192.168.1.113:7113

(输入 yes 并按下回车确认之后,集群就会将配置应用到各个节点,并连接起(join)各个节点,也就是让各个节点开始互相通讯)
最后一行信息表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。
集群创建过程说明:

(1) 给定 redis-trib 程序的命令是 create , 这表示我们希望创建一个新的集群;
(2) 这里的 --replicas 1 表示每个主节点下有一个从节点;
(3) 之后跟着的其它参数则是实例的地址列表,程序使用这些地址所指示的实例来创建新集群;
总的来说,以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。
接着,redis-trib 会打印出一份预想中的配置给你看,如果你觉得没问题的话(注意核对主从关系是否是你想要的),就可以输入 yes , redis-trib 就会将这份配置应用到集群当中。
七. 集群简单测试
使用 redis-cli 命令进入集群环境
[root@zk-01 bin]# ./redis-cli -c -h 192.168.43.129 -p 7114
192.168.43.129:7114> set abc 123
-> Redirected to slot [7638] located at 192.168.43.130:7112
OK
[zsg@zk-02 bin]$ ./redis-cli -c -h 192.168.43.131 -p 7116
192.168.43.131:7116> get abc
-> Redirected to slot [7638] located at 192.168.43.130:7112
“123”
192.168.43.130:7112> cluster nodes
5c79247450245f1162062c94fada7ab65ae1347d 192.168.43.131:7116@17116 slave 63021ae07a2300cd105f08ffef271f85c6399714 0 1501510141378 6 connected
6ca90f5e468a5ad9f540fabdc8d2ed8c381c9261 192.168.43.129:7111@17111 master - 0 1501510143440 1 connected 0-5460
27a862b84353b92acd8c3cb49fd2582d203dd82b 192.168.43.129:7114@17114 slave b4509ff7ab836d5582d14f3502d7cc3abda892a7 0 1501510140275 4 connected
b4509ff7ab836d5582d14f3502d7cc3abda892a7 192.168.43.130:7112@17112 myself,master - 0 1501510137000 2 connected 5461-10922
63021ae07a2300cd105f08ffef271f85c6399714 192.168.43.131:7113@17113 master - 0 1501510142412 3 connected 10923-16383
1fb7c40d07fdb7a4708e98102c35f2e20128e252 192.168.43.130:7115@17115 slave 6ca90f5e468a5ad9f540fabdc8d2ed8c381c9261 0 1501510139000 5 connected

主从架构 哨兵模式
Redis主从复制,简单三招以及哨兵模式
2018年04月07日 15:29:41 oh_EJiao 阅读数:111更多
个人分类: Redis
版权声明:本文为博主原创文章,如需转载请标明来源。 https://blog.csdn.net/sinat_35821285/article/details/79841448

步骤一:建立三个redis.conf文件(6379,6380,6381),进行端口号,pidfile文件名,logfile文件名,dbfilename的更改
第一个文件6379

第二个文件6380

第三个文件6381

步骤二:我们可以查看一下端口号的信息,一共有三个端口。

刚开始三个都是默认为主机master

主机不用设置,在从机中通过SLAVEOF来设置主机

从机只能读不能写。

关于主从复制我们一般有三招:
【一主二仆】【薪火相传】【反客为主】,下面简单介绍一下。
还有最常用的【哨兵模式】

【一主二仆】当主机SHUTDOWN时,从机不会争夺主机权限,而是等待主机重新连接上。

当从机shutdown时,重新连接时主机关系消失,从机变成了刚开始的默认master.

【薪火相传】
通过slaveof设置80的主机是79,81的主机是80。主机79设置的信息,80和81都可以接收到。

【反客为主】主机宕掉了,从机可以自己上位为master,也可以选择其他上位为mater的从机当主机。

还有一种最常用的模式【哨兵模式】
步骤一:首先建立一个sentinel.conf文件

在文件中配置如下信息

启动哨兵模式

在哨兵模式下,如果主机宕掉了,会自动投票选出新的主机。

主从架构读写分离 哨兵
下载 http://download.redis.io/releases/
Tcl-5.8以上版本下载地址
https://sourceforge.net/projects/tcl/files/

Redis支持一个master服务器对多个slave服务器同步,同步使用发布/订阅机制。
redis-benchmark redis性能测试工具
redis-check-aof AOF文件修复工具
redis-check-rdb RDB文件修复工具
redis-cli redis命令行客户端
redis.conf redis配置文件
redis-sentinal redis集群管理工具
redis-server redis服务进程

1个master对多个slave,还可以进行分层,每个slave下可以再同步slave,扩展成树状结构。
Redis 主从同步设置
Redis默认的端口是6379,我们为了不影响原有Redis,使用新的端口

master 配置 redis_master.conf

port 6300
requirepass 123456
masterauth 123456
daemonize yes
slave1 配置 redis_slave1.conf 设为master的slave
port 6301
slaveof 127.0.0.1 6300
requirepass 123456
masterauth 123456
daemonize yes
slave2 配置 redis_slave2.conf 设为master的slave
port 6302
slaveof 127.0.0.1 6300
requirepass 123456
masterauth 123456
daemonize yes

daemonize 表示后台启动。
requirepass 为主机认证密码。
masterauth 为从机访问主机验证密码,需要与主机的requirepass一致。
因后面需要演示主从切换,因此三组conf的验证密码都一致。

Redis 主从同步测试
依次启动master, slave1, slave2
redis-server redis_master.conf
redis-server redis_slave1.conf
redis-server redis_slave2.conf
执行后查看是否启动成功
ps aux|grep redis
root 1858 Ss 3:55 0:00.01 redis-server *:6302
root 1849 Ss 3:54 0:00.01 redis-server *:6301
root 1842 Ss 3:54 0:00.02 redis-server *:6300
进入master,设置key abc的值为12
redis-cli -p 6300
127.0.0.1:6300> auth 123456
OK
127.0.0.1:6300> set abc 123
OK
127.0.0.1:6300> get abc
“123”
分别进入slave1, slave2检查是否同步数据
slave1:

redis-cli -p 6301
127.0.0.1:6301> auth 123456
OK
127.0.0.1:6301> get abc
“123”
127.0.0.1:6301>
slave2:
redis-cli -p 6302
127.0.0.1:6302> auth 123456
OK
127.0.0.1:6302> get abc
“123”
127.0.0.1:6302>
进入master修改key abc的值为456

127.0.0.1:6300> set abc 456
OK
127.0.0.1:6300> get abc
“456”
检查slave1, slave2是否同步
slave1:

127.0.0.1:6301> get abc
“456”
slave2:

127.0.0.1:6302> get abc
“456”
Redis主从切换
在运行过程中,如果master出现问题,我们可以通过设置,把另一台slave机自动设为master使用。这里主要用到Redis的sentinel功能来实现主从切换。

sentinel1.conf

port 26301
sentinel monitor master 127.0.0.1 6300 2
sentinel auth-pass master 123456
logfile “/tmp/sentinel.log”
daemonize yes
sentinel2.conf

port 26302
sentinel monitor master 127.0.0.1 6300 2
sentinel auth-pass master 123456
logfile “/tmp/sentinel.log”
daemonize yes
sentinel monitor master 127.0.0.1 6300 2 中的 2 表示有2个以上的sentinel服务检测到master失效,才会执行主从切换。

启动两个sentinel进程

redis-server sentinel1.conf --sentinel
redis-server sentinel2.conf --sentinel

ps aux|grep redis
root 2643 Ss 4:28 0:00.02 redis-server *:26302 [sentinel]
root 2636 Ss 4:28 0:00.02 redis-server *:26301 [sentinel]
Redis日志可以看到,启动成功开始监控

Running mode=sentinel, port=26301.
Sentinel ID is 3a23343948cd7f26662ccba1d01b92955311ef52
+monitor master master 127.0.0.1 6300 quorum 2
+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300
+slave slave 127.0.0.1:6302 127.0.0.1 6302 @ master 127.0.0.1 6300

Running mode=sentinel, port=26302.
Sentinel ID is ce0ee2af6b454205a3e475763945f505a10a7d6a
+monitor master master 127.0.0.1 6300 quorum 2
+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300
+slave slave 127.0.0.1:6302 127.0.0.1 6302 @ master 127.0.0.1 6300

+sentinel sentinel 3a23343948cd7f26662ccba1d01b92955311ef52 127.0.0.1 26301 @ master 127.0.0.1 6300
+sentinel sentinel ce0ee2af6b454205a3e475763945f505a10a7d6a 127.0.0.1 26302 @ master 127.0.0.1 6300
终止master,测试主从切换

kill master进程后,sentinel判断master失效,执行主从切换处理。

日志如下:

+failover-state-reconf-slaves master master 127.0.0.1 6300
+slave-reconf-sent slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300
+config-update-from sentinel 3a23343948cd7f26662ccba1d01b92955311ef52 127.0.0.1 26301
+switch-master master 127.0.0.1 6300 127.0.0.1 6302
+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6302
+slave slave 127.0.0.1:6300 127.0.0.1 6300 @ master 127.0.0.1 6302
-odown master master 127.0.0.1 6300
+slave-reconf-inprog slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300
+slave-reconf-done slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300
+failover-end master master 127.0.0.1 6300
+switch-master master 127.0.0.1 6300 127.0.0.1 6302
+convert-to-slave slave 127.0.0.1:6300 127.0.0.1 6300 @ master 127.0.0.1 6302
从日志可以看出,主从切换执行了以下操作:

1.将slave2切换为新的master,redis_slave2.conf 中的 slaveof 127.0.0.1 6300 被自动删除。

2.将redis_slave1.conf的 slaveof 127.0.0.1 6300 自动更新为 slaveof 127.0.0.1 6302,使用slave2作为新的master。

3.原master重启动后,会作为slave使用,redis_master.conf会自动加入slaveof 127.0.0.1 6302。

原master重启后进行主从同步测试

原master更新key abc为888,因为现在已经是slave,所以更新失败。

127.0.0.1:6300> set abc 888
(error) READONLY You can’t write against a read only slave.
1
2
slave2 更新key abc为888

127.0.0.1:6302> set abc 888
OK
127.0.0.1:6302> get abc
“888”
原master,slave1检查是否同步

原master

127.0.0.1:6300> get abc
“888”
slave1

127.0.0.1:6301> get abc
“888”
经检查,主从切换后,slave2作为新的master,其他服务器作为slave,可正常使用。

Redis命令
#开启Redis服务
redis-server
#连接本地Redis数据库
redis-cli
#连接远程Redis数据库
redis-cli -h host -p port
#测试命令结果返回PONG表示正常
ping
#选择数据库,默认有16个数据库编号0-15
select 0

#数据操作
#删除全部数据
flushall

#String字符串操作
#添加/修改键值对
set name zs
set age 19
#添加多个键值对
mset name zs age 10
#根据key获取value
get name
#获取多个value
mget name age
#设置键值对有效期10s
setex name 10 zs
#在value后追加内容
append name ls

#键命令
#查看键对应的value的类型
type name
#查看所有键(支持正则表达式)
keys *
#删除键值对
del name
#设置键值对过期时间
expire name 10
#查看键值对过期时间(负数表示已过期)
ttl name
#查看键是否存在
exists name

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: