一、缓存:缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的作用,比如 CPU 的一级、二级缓存是保存了 CPU 最近经常访问的数据,内存是保存 CPU 经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的 raid 卡有也缓存,都是为了起到加速 CPU 访问硬盘数据的目的一因为 CPU 的速度太快了,CPU 需要的数据硬盘往往不能在短时间内满足 CPU 的需求,因此 CPU 缓存、内存、Raid 卡以及硬盘缓存就在一定程度上满足了 CPU 的数据需求,即 CPU 从缓存读取数据可以大幅提高 CPU 的工作效率。
buffer:buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存在写入磁盘,buffer 一般用于写缓冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到离自己最近的地方,以提高写入速度,CPU 会把数据线写到内存的磁盘缓冲区,然后就认为数据已经写入完成。当服务器突然断电就会丢失部分数据。
cache:缓存也叫读缓存,一般用于读操作,CPU 读文件从内存读,如果内存没有就先从硬盘读到内存再读到 CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取。
cache 的特性:
自动过期:给缓存的数据加上有效时间,超出时间后自动过期删除
过期时间:强制过期,源网站更新图片后 CDN 是不会更新的,需要强制是图片缓存过期
命中率:即缓存的读取命中率。
CDN:内容分发网络(Content Delivery Network),通过将服务内容分发至全网加速节点,利用全球调度系统使用户能够就近获取,有效降低访问延迟,提升服务可用性,
优势:CDN 第一降低机房的使用带宽,因为很多资源通过 CDN 就直接返回用户了,第二解决不同运营商之间的互联,因为可以让联通的网络访问联通让电信的网络访问电信,起到加速用户访问的目的, 第三:解决用户访问的地域问题,就近返回用户资源。

Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第1张图片

Redis:官网地址:https://redis.io/

Redis和Memcached是非关系型数据库也称为NoSQL数据库,MySQL、Mariadb、SQL Server、PostgreSQL、Oracle 数据库属于关系型数据(RDBMS, Relational Database Management System).redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value database),是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的还有memcache,但相比 memcache,redis 还提供了易扩展、高性能、具备数据持久性等功能。Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛,目前 redis 在 DB-Engine 月排行榜https://db-engines.com/en/ranking 中一直比较靠前,而且一直是键值型存储类的首位。

redis 典型应用场景:

Session 共享:常见于 web 集群中的 Tomcat 或者 PHP 中多 web 服务器 session 共享
消息队列:ELK 的日志缓存、部分业务的订阅发布系统
计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
缓存:数据查询、电商网站商品信息、新闻内容
微博/微信社交场合:共同好友、点赞评论等

Redis 安装及使用:官方下载地址:http://download.redis.io/releases/

准备工作:在172.18.9.150主机编译安装:
一、 cd /usr/local/src/ tar xvf redis -4.0.14.tar.gz ll --> total 1708
drwxrwxr-x. 6 root root 4096 Mar 19 00:23 redis-4.0.14
-rw-r--r--. 1 root root 1740967 Mar 28 2019 redis-4.0.14.tar.gz
二、 cd redis-4.0.14 make PREFIX=/apps/redis install
[root@150 src]#ll /apps/redis/ total 0 drwxr-xr-x. 2 root root 134 Mar 27 21:42 bin
[root@150 redis-4.0.14]#ll /apps/redis/bin/
total 21888
-rwxr-xr-x. 1 root root 2452176 Mar 27 21:42 redis-benchmark redis自带的压缩工具,可以模拟并发数
-rwxr-xr-x. 1 root root 5777752 Mar 27 21:42 redis-check-aof
-rwxr-xr-x. 1 root root 5777752 Mar 27 21:42 redis-check-rdb
-rwxr-xr-x. 1 root root 2618208 Mar 27 21:42 redis-cli
lrwxrwxrwx. 1 root root 12 Mar 27 21:42 redis-sentinel -> redis-server 哨兵机制(软连接)
-rwxr-xr-x. 1 root root 5777752 Mar 27 21:42 redis-server
三、[root@150 redis-4.0.14]#ll total 312 -rw-rw-r--. 1 root root 58766 Mar 19 00:23 redis.conf
[root@150 redis-4.0.14]#mkdir /apps/redis/etc
[root@150 redis-4.0.14]#cp redis.conf /apps/redis/etc/ 把redis.conf 拷贝至新建文件做配置文件
四、[root@150 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf 二进制启动方式
50475:C 27 Mar 21:58:08.108 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
50475:C 27 Mar 21:58:08.108 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=50475, just started
Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第2张图片
五、需要修改的配置参数如图:
Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第3张图片

[root@150 redis-4.0.14]#vim /etc/sysctl.conf net.core.somaxconn = 512 vm.overcommit_memory = 1
[root@150 redis-4.0.14]#sysctl -p net.core.somaxconn = 512 vm.overcommit_memory = 1
再次重启:[root@150 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
50607:C 27 Mar 22:07:30.778 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
50607:C 27 Mar 22:07:30.778 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=50607, just started
Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第4张图片
六、开启大页内存动态分配,需要关闭让 redis 负责内存管理:[root@150 redis-4.0.14]#echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@150 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
50689:C 27 Mar 22:14:54.060 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
50689:C 27 Mar 22:14:54.060 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=50689, just started
50689:C 27 Mar 22:14:54.060 # Configuration loaded
50689:M 27 Mar 22:14:54.062 Increased maximum number of open files to 10032 (it was originally set to 1024).
Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第5张图片
七、[root@150 redis-4.0.14]#vim /etc/rc.d/rc.local echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@150 redis-4.0.14]#chmod a+x /etc/rc.d/rc.local 给该文件要加上x权限。
八、[root@150 redis-4.0.14]#reboot 重启使其生效。
九、[root@centos7 ~]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
7977:C 28 Mar 08:57:56.284 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7977:C 28 Mar 08:57:56.284 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=7977, just started
7977:C 28 Mar 08:57:56.284 # Configuration loaded
7977:M 28 Mar 08:57:56.286
Increased maximum number of open files to 10032 (it was originally set to 1024).
Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第6张图片
十、[root@centos7 ~]#scp /etc/sysctl.conf 172.18.9.100/200/110:/etc/
[root@centos7 ~]#scp /etc/rc.d/rc.local 172.18.9.100/200/110:/etc/rc.d/
[root@centos7 ~]#chmod a+x /etc/rc.d/rc.local (100\110\200\150)
十一、[root@centos7 ~]#mkdir /apps/redis/{logs,data,run} -pv
mkdir: created directory ‘/apps/redis/logs’
mkdir: created directory ‘/apps/redis/data’
mkdir: created directory ‘/apps/redis/run’
十二、[root@centos7 ~]#groupadd -g 1001 redis && useradd -u 1001 -g 1001 redis -s
[root@centos7 ~]#id redis uid=1001(redis) gid=1001(redis) groups=1001(redis)
[root@centos7 ~]#chown redis.redis /apps/redis/ -R 这一步务必完成。
十三、[root@centos7 ~]#su redis
[redis@centos7 root]$ll /apps/ total 0 drwxr-xr-x. 7 redis redis 63 Mar 28 09:20 redis
[redis@centos7 root]$cd /apps/redis/ 此时,我们是以普通用户身份登录的redis。
[redis@centos7 redis]$ll
total 0
drwxr-xr-x. 2 redis redis 134 Mar 27 21:42 bin
drwxr-xr-x. 2 redis redis 6 Mar 28 09:20 data
drwxr-xr-x. 2 redis redis 24 Mar 27 22:07 etc
drwxr-xr-x. 2 redis redis 6 Mar 28 09:20 logs
drwxr-xr-x. 2 redis redis 6 Mar 28 09:20 run
十四、我们用普通用户身份启动redis,会有6379的端口开启,系系统默认行为。
[redis@centos7 redis]$/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
8676:C 28 Mar 09:41:42.609 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8676:C 28 Mar 09:41:42.609 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=8676, just started
8676:C 28 Mar 09:41:42.609 # Configuration loaded
8676:M 28 Mar 09:41:42.612 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
8676:M 28 Mar 09:41:42.613 # Server can't set maximum open files to 10032 because of OS error: Operation not permitted.
8676:M 28 Mar 09:41:42.613 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第7张图片
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:6379 :
十五、设置软连接,这样我们就可以全局执行redis命令了:
[root@centos7 ~]#ln -sv /apps/redis/bin/ /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
十六、[redis@centos7 redis]$ vim etc/redis.conf bind 0.0.0.0
[redis@centos7 redis]$ /apps/redis/bin/redis-server /apps/redis/etc/redis.conf 重启。
[root@centos7 ~]#ss -ntl 6379的端口就会指向任意IP。
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511
:6379 :
十七、[redis@centos7 redis]$ vim etc/redis.conf
one:logfile "/apps/redis/logs/redis-6379.log" 日志路径 two:stop-writes-on-bgsave-error no #快照出错时是否禁止redis写入操作
/apps/redis/bin/redis-server /apps/redis/etc/redis.conf 重启服务
十八、vim /apps/redis/etc/redis.conf
one:dbfilename redis_6379.rdb two:dir /apps/redis/data 这两处做修改。(dump文件是6379端口下的文件,数据放/data/下)
十九、重启:查看端口:
[root@centos7 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:6379 :

Redis的配置文件

主要配置项:
bind 0.0.0.0 #监听地址,可以用空格隔开后多个监听 IP
pidfile /var/run/redis_6379.pid #pid 文件路径
stop-writes-on-bgsave-error no #快照出错时是否禁止 redis 写入操作
dir ./ #快照文件保存路径  我们定义在dir /apps/redis/data
appendfilename "appendonly.aof" #AOF 文件名
appendfsync everysec #aof 持久化策略的配置,no 表示不执行 fsync,由操作系统保证数据同步到磁盘,always 表示每次写入都执行 fsync,以保证数据同步到磁盘,everysec 表示每秒执行一次 fsync,可能会导致丢失这 1s 数据。
cluster-require-full-coverage no #集群槽位覆盖,如果一个主库宕机且没有备库就会出现集群槽位不全,那么 yes 情况下 redis 集群槽位验证不全就不再对外提供服务,而 no 则可以继续使用但是会出现查询数据查不到的情况(因为有数据丢失)。
redis 虽然是一个内存级别的缓存程序,即 redis 是使用内存进行数据的缓存的,但是其可以将内存的数据按一定的策略保存到硬盘上,从而实现数据持久保存的目的,redis 支持两种不同方式的数据持久化保存机制,分别是 RDB 和 AOF
RDB:基于时间的快照,只保留当前最新的一次快照,特点是执行速度比较快,缺点是可能会丢失从上次快照到当前快照未完成之间的数据。RDB 实现的具体过程 Redis 从主进程先 fork 出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如 dump.rdb.temp,当数据保存完成之后再将上一次保存的 RDB 文件替换掉,然后关闭子进程,这样可以保存每一次做 RDB 快照的时候保存的数据都是完整的,因为直接替换 RDB文件的时候可能会出现突然断电等问题而导致 RDB 文件还没有保存完整就突然关机停止保存而导致数据丢失的情况,可以手动将每次生成的 RDB 文件进程备份,这样可以最大化保存历史数据.
优点:-RDB 快照保存了某个时间点的数据,可以通过脚本执行 bgsave(非阻塞)或者 save(阻塞)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本。-可以最大化 o 的性能,因为父进程在保存 RDB 文件的时候唯一要做的是 fork 出一个子进程,然后的操作都会有这个子进程操作,父进程无需任何的 IO 操作,RDB 在大量数据比如几个 G 的数据,恢复的速度比 AOF 的快。
缺点:-不能时时的保存数据,会丢失自上一次执行 RDB 备份到当前的内存数据。  -数据量非常大的时候,从父进程 fork 的时候需要一点时间,可能是毫秒或者秒。
AOF:按照操作顺序依次将操作添加到指定的日志文件当中,特点是数据安全性相对较高,缺点是即使有些操作是重复的也会全部记录。
优缺点:1、AOF 的文件大小要大于 RDB 格式的文件     2、根据所使用的 fsync 策略(fsync 是同步内存中 redis 所有已经修改的文件到存储设备),默认是appendfsync everysec 即每秒执行一次 fsync
redis的数据类型:
1、字符串(string):redis 中所有的 key 的类型都是字符串。
2、列表(list):列表是一个双向可读写的管道,其头部是左侧尾部是右侧,一个列表最多可以包含 2^32-1 个元素即4294967295 个元素
3、集合(set):Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
4、sorted set(有序集合):Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个 double(双精度浮点型)类型的分数,redis 正是通过分数来为集合中的成员进行从小到大的排序,序集合的成员是唯一的,但分数(score)却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1), 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储 40 多亿个成员)。
5、哈希(hash):hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,Redis 中每个 hash 可以存储 232 - 1 键值对(40 多亿)。
消息队列:

在生产者消费者(Producer/Consumer)模式下,上层应用接收到的外部请求后开始处理其当前步骤的操作,在执行完成后将已经完成的操作发送至指定的频道(channel)当中,并由其下层的应用监听该频道并继续下一步的操作,如果其处理完成后没有下一步的操作就直接返回数据给外部请求,如果还有下一步的操作就再将任务发布到另外一个频道,由另外一个消费者继续监听和处理生产者消费者模式下,多个消费者同时监听一个队里,但是一个消息只能被最先抢到消息的消费者消费,即消息任务是一次性读取和处理,此模式在分布式业务架构中非常常用,比较常用的软件还有RabbitMQ、Kafka、RocketMQ、ActiveMQ 等
Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第8张图片

生产者发布消息:(需要2台同ip主机,一台发布,一台监听)

[root@centos7 ~]#redis-cli
127.0.0.1:6379> LPUSH channel1 msg1 生成一个队列(列表)
(integer) 1
127.0.0.1:6379> LPUSH channel1 msg2
(integer) 2
127.0.0.1:6379> LPUSH channel1 msg3
(integer) 3
去监听:[root@centos7 data]#redis-cli
127.0.0.1:6379> LRANGE channel1 0 -1
1) "msg3"
2) "msg2"
3) "msg1" 此时,3条消息没有被处理,我们去执行命令,让消费者把消息拿出来。
127.0.0.1:6379> RPOP channel1
"msg1"
127.0.0.1:6379> RPOP channel1
"msg2"
127.0.0.1:6379> RPOP channel1
"msg3"
在发布者订阅者模式下,发布者将消息发布到指定的 channel 里面,凡是监听该 channel 的消费者
都会收到同样的一份消息,这种模式类似于是收音机模式,即凡是收听某个频道的听众都会收到主持
人发布的相同的消息内容。 此模式常用语群聊天、群通知、群公告等场景。
Subscriber:订阅者 Publisher:发布者 Channel:频道
Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第9张图片

订阅者监听频道:

127.0.0.1:6379> SUBSCRIBE channel1 创建一个频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
现在我们去创建2个频道:
127.0.0.1:6379> PUBLISH channel1 test1
(integer) 1
127.0.0.1:6379> PUBLISH channel1 test2
(integer) 1
在订阅者监听频道即可立即同步:
127.0.0.1:6379> SUBSCRIBE channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "test1"
1) "message"
2) "channel1"
3) "test2"

多频道监听:

127.0.0.1:6379> PUBLISH channel1 test1
(integer) 1
127.0.0.1:6379> PUBLISH channel2 test2
(integer) 1
127.0.0.1:6379> PUBLISH channel3 test3
(integer) 0
此时去订阅者频道查看:由于没有监听channel3,所以3的消息收不到:
[root@centos7 data]#redis-cli
127.0.0.1:6379> SUBSCRIBE channel1 channel2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "subscribe"
2) "channel2"
3) (integer) 2
1) "message"
2) "channel1"
3) "test1"
1) "message"
2) "channel2"
3) "test2"

redis 其他命令:

:CONFIG:config 命令用于查看当前 redis 配置、以及不重启更改 redis 配置等
127.0.0.1:6379> CONFIG set maxmemory 8589934592 更改最大内存
OK
127.0.0.1:6379> CONFIG get maxmemory
1) "maxmemory"
2) "8589934592"
127.0.0.1:6379> CONFIG set timeout 600 更改超时时长
OK
127.0.0.1:6379> CONFIG get timeout
1) "timeout"
2) "600"

配置 reids 主从:

Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第10张图片
Redis Slave 也要开启持久化并设置和 master 同样的连接密码,因为后期 slave 会有提升为 master 的可能,Slave 端切换 master 同步后会丢失之前的所有数据。
一旦某个 Slave 成为一个 master 的 slave,Redis Slave 服务会清空当前 redis 服务器上的所有数据并将master 的数据导入到自己的内存,但是断开同步关系后不会删除当前已经同步过的数据。

实验:配置redis主从:

准备环境:2台主机必须统一版本:200:master,150:slave
一、将150主机编译好的redisscp到200主机,统一版本:[root@150 src]#ll
total 1708
drwxrwxr-x. 6 root root    4096 Mar 27 22:17 redis-4.0.14
-rw-r--r--. 1 root root 1740967 Mar 28 08:04 redis-4.0.14.tar.gz
[root@150 src]#scp redis-4.0.14.tar.gz 172.18.9.200:/usr/local/src/
[email protected]'s password:
redis-4.0.14.tar.gz                                                    100% 1700KB
二、在200主机:[root@200 apps]#make PREFIX=/apps/redis install  make编译安装
[root@200 redis-4.0.14]#cd /apps/
[root@200 apps]#ll
total 0
drwxr-xr-x. 3 root root 17 Mar 28 16:10 redis
[root@200 apps]#rm -rf redis/  将生成的redis删除,把150主机的拷贝过来:
三、将150主机安装编译好的redis打包拷贝至200:[root@150 src]#cd /apps/
[root@150 apps]#ll
total 0
drwxr-xr-x. 7 redis redis 79 Mar 28 10:08 redis
[root@150 apps]#tar czf redis.tar.gz ./*

[root@150 apps]#scp redis.tar.gz 172.18.9.200:/apps/
[email protected]'s password:
redis.tar.gz                                                                    100% 7645KB  26.2MB/s   00:00  

四、200主机接收到做处理:[root@200 apps]#tar xf redis.tar.gz
[root@200 apps]#ll
total 7648
drwxr-xr-x. 7 1001 1001      79 Mar 28 10:08 redis
-rw-r--r--. 1 root root 7828073 Mar 28 16:17 redis.tar.gz

在200主机创建软连接:[root@200 apps]#ln -sv /apps/redis/bin/* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’

vim /apps/redis/etc/redis.conf         bind   0.0.0.0 (让它监听所有的IP)
[root@200 apps]#ps -ef |grep redis
root       8720   7748  0 17:18 pts/1    00:00:04 /apps/redis/bin/redis-server *:6379
root       9161   7748  0 17:56 pts/1    00:00:00 redis-cli -h 172.18.9.200
root       9180   7288  0 17:58 pts/0    00:00:00 grep --color=auto redis
[root@200 apps]#kill -9 8720
五、修改配置文件bind,并重启:[root@200 apps]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
[root@200 apps]#ss -ntl
State      Recv-Q Send-Q                          Local Address:Port                                         Peer Address:Port              
LISTEN     0      511                                         *:6379                                                    *:*                  
在200master上加上密码:
172.18.9.200:6379> CONFIG SET requirepass 123gxy
OK
[root@200 src]#redis-cli -h 172.18.9.200 -a 123gxy
172.18.9.200:6379>

六、在150主机slave上修改配置文件:[root@150 ~]#vim /apps/redis/etc/redis.conf
################################# REPLICATION #################################
slaveof 172.18.9.200 6379
masterauth 123gxy
[root@150 ~]#ps -ef |grep redis
root      13830      1  0 19:42 ?        00:00:02 /apps/redis/bin/redis-server 0.0.0.0:6379
root      13896  13679  0 19:48 pts/0    00:00:00 redis-cli -h 172.18.9.200 -a 123gxy
root      13970  13730  0 19:54 pts/1    00:00:00 grep --color=auto redis
[root@150 ~]#kill -9 13830
七、重启redis并查看:[root@150 ~]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
[root@150 ~]#redis-cli -h 172.18.9.200 -a 123gxy
172.18.9.200:6379>info
#Replication
role:master
connected_slaves:1
slave0:ip=172.18.9.150,port=6379,state=online,offset=728,lag=1   此时,说明主从已经成功。
master_replid:5c575544ee6d8fb74eed78df0645e16640705e79  这是正在连接的master的ID.
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:728
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:728

我们也可以在172.18.9.150slave上查看信息:
[root@150 ~]#redis-cli -h 172.18.9.150
172.18.9.150:6379> info
#Replication
role:slave
master_host:172.18.9.200
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:1106
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:5c575544ee6d8fb74eed78df0645e16640705e79     此ID就是masterID。
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1106
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1106
本实验结束。
主从复制过程:
Redis 支持主从复制分为全量同步和增量同步,首次同步是全量同步,主从同步可以让从服务器从主服务器备份数据,而且从服务器还可与有从服务器,即另外一台 redis 服务器可以从一台从服务器进行数据同步,redis 的主从同步是非阻塞的,其收到从服务器的 sync(2.8 版本之前是 PSYNC)命令会fork 一个子进程在后台执行 bgsave 命令,并将新写入的数据写入到一个缓冲区里面,bgsave 执行完成之后并生成的将 RDB 文件发送给客户端,客户端将收到后的 RDB 文件载入自己的内存,然后主 redis将缓冲区的内容在全部发送给从 redis,之后的同步从服务器会发送一个 offset 的位置(等同于 MySQL的 binlog 的位置)给主服务器,主服务器检查后位置没有错误将此位置之后的数据包括写在缓冲区的积压数据发送给 redis 从服务器,从服务器将主服务器发送的挤压数据写入内存,这样一次完整的数据同步,再之后再同步的时候从服务器只要发送当前的 offset 位 置给主服务器,然后主服务器根据响应的位置将之后的数据发送给从服务器保存到其内存即可。Redis 全量复制一般发生在 Slave 初始化阶段,这时 Slave 需要将 Master 上的所有数据都复制一份。
具体步骤如下:
1)从服务器连接主服务器,发送 SYNC 命令;
2)主服务器接收到 SYNC 命名后,开始执行 BGSAVE 命令生成 RDB 快照文件并使用缓冲区记录此后执行的所有写命令;
3)主服务器 BGSAVE 执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
7)后期同步会先发送自己 slave_repl_offset 位置,只同步新增加的数据,不再全量同步。

Sentinel(哨兵):

Sentinel 进程是用于监控 redis 集群中 Master 主服务器工作的状态,在 Master 主服务器发生故障的
时候,可以实现 Master 和 Slave 服务器的切换,保证系统的高可用,其已经被集成在 redis2.6+的版本
中,Redis 的哨兵模式到了 2.8 版本之后就稳定了下来。一般在生产环境也建议使用 Redis 的 2.8 版本
的以后版本。哨兵(Sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,
这些进程使用流言协议(gossipprotocols)来接收关于 Master 主服务器是否下线的信息,并使用投票协
议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个 Slave 作为新的 Master。每个哨兵
(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave 定时发送消息,以确认对方是否”活”着,如果
发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已掉线,也就是所谓的”主观认
为宕机” ,英文名称:Subjective Down,简称 SDOWN。有主观宕机,肯定就有客观宕机。当“哨兵
群”中的多数 Sentinel 进程在对 Master 主服务器做出 SDOWN 的判断,并且通过 SENTINEL is-masterdown-by-addr 命令互相交流之后,得出的 Master Server 下线判断,这种方式就是“客观宕机”,英文
名称是:Objectively Down, 简称 ODOWN。通过一定的 vote 算法,从剩下的 slave 从服务器节点中,
选一台提升为 Master 服务器节点,然后自动修改相关配置,并开启故障转移(failover)。
Sentinel 机制可以解决 master 和 slave 角色的切换问题.

使用三台服务器部署一主两从,并基于sentinel实现redis 主从自动切换
准备环境:200做master,100/150做slave,好处:1、保证当slav发生宕机,还会有一个可用,2、当200宕机时,slave中还有主有从。
一、在100主机配置redis:
vim  /apps/redis/etc/redis.conf
bind 0.0.0.0
################################# REPLICATION #################################
slaveof 172.18.9.200 6379
masterauth 123gxy
[root@100 redis]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf
[root@100 redis]#ss -ntl
State       Recv-Q Send-Q                       Local Address:Port                             Peer Address:Port              
LISTEN      0      128                                     *:6379                                   *:*                           
[root@100 redis]#ln -sv /apps/redis/bin/* /usr/bin/  创建软连接:
/apps/redis/bin/* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
二、开启200/150主机,并查看端口,此时在200master上查看info:
127.0.0.1:6379>info
# Replication
role:master
connected_slaves:2  2个slave:100/150.
slave0:ip=172.18.9.150,port=6379,state=online,offset=8316,lag=0
slave1:ip=172.18.9.100,port=6379,state=online,offset=8316,lag=1
master_replid:5c575544ee6d8fb74eed78df0645e16640705e79  200master主机的ID。
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:8316
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:8316
三、编辑配置文件sentinel.conf: 哨兵可以不和redis服务器部署在一起:这是模板:[root@150 redis-4.0.14]#grep -v "#" /usr/local/src/redis-4.0.14/sentinel.conf
port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

在200master主机配置哨兵文件:[root@200 ~]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.200
port 26379
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir  "/apps/redis/data"                                                                                     
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.200 6379 2
sentinel auth-pass mymaster 123gxy
在150slave的哨兵文件:[root@150 ~]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.150
port 26379
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir  "/apps/redis/data"                                                                                     
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.200 6379 2
sentinel auth-pass mymaster 123gxy在100slave的哨兵文件:[root@100 ~]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.100   监听地址
port 26379          监听端口
daemonize yes       以守护进程运行
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir  "/apps/redis/data"                                                                                     
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.200 6379 2  此行最重要
sentinel auth-pass mymaster 123gxy四、在三台主机啥那个启动该文件服务:[root@200 ~]#redis-sentinel  /apps/redis/etc/sentinel.conf查看三台主机的日志:  [root@200 ~]#tail -f /apps/redis/logs/sentinel_26379.log
14161:X 28 Mar 21:58:03.456 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=14161, just started
14161:X 28 Mar 21:58:03.456 # Configuration loaded
14162:X 28 Mar 21:58:03.460 * Increased maximum number of open files to 10032 (it was originally set to 1024).
14162:X 28 Mar 21:58:03.463 * Running mode=sentinel, port=26379.
14162:X 28 Mar 21:58:03.466 # Sentinel ID is ed67a02807302d0cb768cd214f10e87b85a1428f
14162:X 28 Mar 21:58:03.466 # +monitor master mymaster 172.18.9.200 6379 quorum 2
14162:X 28 Mar 21:58:03.468 * +slave slave 172.18.9.150:6379 172.18.9.150 6379 @ mymaster 172.18.9.200 6379
14162:X 28 Mar 21:58:03.468 * +slave slave 172.18.9.100:6379 172.18.9.100 6379 @ mymaster 172.18.9.200 6379
14162:X 28 Mar 21:58:04.081 * +sentinel sentinel b86489b5bf21cec43fcca110c6b84c0ee5cf95eb 172.18.9.100 26379 @ mymaster 172.18.9.200 6379
14162:X 28 Mar 21:58:04.095 * +sentinel sentinel f08c40b048f632b0f70f84d30c5f82ddcbeca5a9 172.18.9.150 26379 @ mymaster 172.18.9.200 6379
上述文字清楚的阐述了三台master/slave的关系。五、把200master主机强行宕机:[root@200 src]#ps -ef |grep redis
root      12583      1  0 19:41 ?        00:00:19 /apps/redis/bin/redis-server 0.0.0.0:6379
root      14162      1  0 21:58 ?        00:00:03 redis-sentinel 172.18.9.200:26379 [sentinel]
root      14242  12483  0 22:01 pts/1    00:00:00 tail -f /apps/redis/logs/sentinel_26379.log
root      14291  12430  0 22:06 pts/0    00:00:00 grep --color=auto redis
[root@200 src]#kill -9 12583
六、去新master150主机看info信息:
# Replication
role:master
connected_slaves:1
slave:ip=172.18.9.100,port=6379,state=online,offset=728,lag=1   此时新的slave为172.18.9.100主机,自动生成。
master_replid:69ae79e2ceba8aa9523996c216a946aaa3767808
master_replid2:5c575544ee6d8fb74eed78df0645e16640705e79
master_repl_offset:177021
second_repl_offset:126083
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:177021
七、再次看200主机的日志:[root@200 src]#vim /apps/redis/etc/sentinel.conf
bind 172.18.9.200
port 26379
daemonize yes
pidfile "/apps/redis/run/redis-sentinel.pid"
logfile "/apps/redis/logs/sentinel_26379.log"
dir "/apps/redis/data"                                                                                     
sentinel myid ed67a02807302d0cb768cd214f10e87b85a1428f
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.18.9.100 6379 2
# Generated by CONFIG REWRITE
sentinel auth-pass mymaster 123gxy
sentinel config-epoch mymaster 2
sentinel leader-epoch mymaster 3
sentinel known-slave mymaster 172.18.9.150 6379
sentinel known-slave mymaster 172.18.9.200 6379
sentinel known-sentinel mymaster 172.18.9.150 26379 f08c40b048f632b0f70f84d30c5f82ddcbeca5a9
sentinel known-sentinel mymaster 172.18.9.100 26379 b86489b5bf21cec43fcca110c6b84c0ee5cf95eb
sentinel current-epoch 3   标注内容为日志自动生成的信息。
以上实验就是基于哨兵机制完成的,当master宕机,其中一台从服务器会自动提升为master主机.

我们从现在开始所有的实验均在OpenStack公有云平台创建的虚拟机操作,实例信息如下:
Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第11张图片
此时我重新制作了redis主从,环境是基于redis软件包均来自于其他已经编译安装好的主机拷贝而来的源码包,软件包等素材:
redis主从同步:
准备环境:172.20.102.99做master,172.20.102.213做slave;
一、先从别的主机把编译安装好的redis打包拷贝过来:
[root@150 apps]#ll
total 0 drwxr-xr-x. 7 redis redis 79 Mar 28 10:08 redis
[root@150 apps]#tar czf redis.tar.gz ./
[root@150 apps]#scp redis.tar.gz 172.20.102.99:/apps/
[email protected]'s password:
redis.tar.gz 100% 7645KB 26.2MB/s 00:00
99主机接收到做处理:[root@99 apps]#tar xf redis.tar.gz
[root@99 apps]#ll
total 7648
drwxr-xr-x. 7 1001 1001 79 Mar 28 10:08 redis
-rw-r--r--. 1 root root 7828073 Mar 28 16:17 redis.tar.gz
在99主机创建软连接:[root@99 apps]#ln -sv /apps/redis/bin/
/usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
[root@99 apps]#ps -ef |grep redis
root 8720 7748 0 17:18 pts/1 00:00:04 /apps/redis/bin/redis-server :6379
root 9161 7748 0 17:56 pts/1 00:00:00 redis-cli -h 172.18.9.200
root 9180 7288 0 17:58 pts/0 00:00:00 grep --color=auto redis
[root@99 apps]#kill -9 8720
二、修改配置文件bind,并重启:
vim /apps/redis/etc/redis.conf
bind 0.0.0.0 (让它监听所有的IP)
################################## SECURITY ###################################
requirepass 123gxy 给99master加上密码
[root@99 apps]#redis-server /apps/redis/etc/redis.conf
[root@99 apps]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511
:6379 : [root@99 apps]#redis-cli -h 172.20.102.99 -a 123gxy
172.20.102.99:6379>
三、172.20.102.213slave主机同理完成上述步骤。
四、可以在master/slave主机分别查看info信息:
172.20.102.99:6379> info
#Replication
role:master
connected_slaves:1
slave0:ip=172.20.102.213,port=6379,state=online,offset=2604,lag=1
master_replid:9c5a2ea94b2bb360996ff027d91e84b9c8e0a8e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2604
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2604
172.20.102.213:6379> info
#Replication
role:slave
master_host:172.20.102.99
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:2772
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:9c5a2ea94b2bb360996ff027d91e84b9c8e0a8e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2772
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2772
到此,主从同步已实现。

实验:实现6节点的redis cluster集群,并测试实现master宕机后 slave角色切换为master成功

Redis主从同步、三台服务器部署,基于sentinel实现redis主从切换、redis集群实验_第12张图片
准备环境:共使用2台主机,1、每个redis 弄得节点采用相同的硬件配置,相同的密码,
2、每个节点必须开启的参数cluster-enabled yes #必须开启集群状态,开启后redis进程会有cluster显示;cluster-config-file nodes-6380.conf #此文件有redis cluster 集群自动创建和维护,不需要任何手动操作,
3、所有redis服务器必须没有任何数据,
4、先启动为单机redis且没有任何key value
在做实验之前,99主机时master状态:
一、mkdir /apps/redis/{logs,data,run} -pv
[root@99 data]#cd /apps/redis/etc/
[root@99 etc]#ll
total 184
-rw-r--r-- 1 root root 58842 Apr 2 15:44 redis_6379.conf
-rw-r--r-- 1 root root 58843 Apr 2 15:15 redis_6380.conf
-rw-r--r-- 1 root root 58843 Apr 2 15:23 redis_6381.conf
把上述三个文件的端口及(准备环境2)统一配置,并将[root@99 etc]#redis-cli -h 172.20.102.99 -a 123gxy
172.20.102.99:6379> keys
(empty list or set)
[root@99 data]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128
:6379 :
LISTEN 0 128 :6380 :
LISTEN 0 128
:6381 :
LISTEN 0 128 :111 :
LISTEN 0 128
:22 :
LISTEN 0 128 :16379 :
LISTEN 0 128
:16380 :
LISTEN 0 128 :16381 :
LISTEN 0 128 :::111 ::

LISTEN 0 128 :::22 :::
[root@99 data]#ps -ef |grep redis
root 12572 1 2 15:36 ? 00:00:12 redis-server 0.0.0.0:6380 [cluster]
root 12577 1 2 15:36 ? 00:00:12 redis-server 0.0.0.0:6381 [cluster]
root 12600 1 3 15:44 ? 00:00:00 redis-server 0.0.0.0:6379 [cluster]
root 12606 12455 0 15:45 pts/1 00:00:00 grep --color=auto redis
此时,99主机的集群已建好。
二、172.20.102.213主机同理修改配置,ss -ntl 的效果同上。
三、Redis 3 和 4 版本:需要使用到集群管理工具 redis-trib.rb,这个工具是 redis 官方推出的管理 redis 集群的工具,集成在redis 的源码 src 目录下,是基于 redis 提供的集群命令封装成简单、便捷、实用的操作工具,需要先搭建ruby环境,默认yum安装版本较低,需编译安装ruby 注意:我们使用两台主机做实验,但是只在一台主机上编译安装ruby即可。
1、wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.6.tar.gz
2、tar xf ruby-2.2.6.tar.gz / cd ruby-2.2.6/
3、./configure / make -j 4 / make install
4、ln -sv /usr/local/src/ruby-2.2.6/bin/gem /usr/bin/
ln -sv /usr/local/src/ruby-2.2.6/ruby /usr/bin/
5、yum install rubygems / 6、 gem install redis
我要在150主机上:[root@centos7 src]#scp /usr/local/src/redis-4.0.14.tar.gz 172.20.102.99:/usr/local/src 才能在99主机显示出源码包
7、[root@host-172-20-102-99 src]#ln -s /usr/local/src/redis-4.0.14/src/redis-trib.rb /usr/bin/
四、创建集群 Cluster:
8、[root@host-172-20-102-99 ~]#redis-trib.rb create --replicas 1 172.20.102.99:6379 172.20.102.99:6380 172.20.102.99:6381 172.20.102.106:6379 172.20.102.106:6380 172.20.102.106:6381

Creating cluster
[ERR] Sorry, can't connect to node 172.20.102.99:6379
这时,把下面的删除ruby/gem 包删除,root@host-172-20-102-99 src]#find / -name ruby
/usr/bin/ruby
/usr/lib/gems/ruby
/usr/lib64/ruby
/usr/lib64/gems/ruby
/usr/share/ruby
/usr/local/bin/ruby
/usr/local/include/ruby-2.2.0/ruby
/usr/local/include/ruby-2.2.0/x86_64-linux/ruby
/usr/local/lib/ruby
/usr/local/share/doc/ruby
/usr/local/src/ruby-2.2.6/include/ruby
/usr/local/src/ruby-2.2.6/test/ruby
/usr/local/src/ruby-2.2.6/.ext/include/x86_64-linux/ruby
/usr/local/src/ruby-2.2.6/.ext/include/ruby
/usr/local/src/ruby-2.2.6/ruby
[root@host-172-20-102-99 src]#rm -fr /usr/local/bin/ruby
[root@host-172-20-102-99 src]#rm -fr /usr/local/bin/gem
我们去官网下载2.5.4版本:官网:https://cache.ruby-lang.org/pub/ruby/
./configure / make -j 4 / make install 操作步骤同上。
我在把编译好的redis包拷贝过来时没有及时清除数据,导致一直创建失败,我们先把进程kill掉,再把/apps/redis/data/ 下的数据rm rf *清除,再开启redis服务,即可create集群,如下:

8、[root@host-172-20-102-99 data]#redis-trib.rb create --replicas 1 172.20.102.99:6379 172.20.102.99:6380 172.20.102.99:6381 172.20.102.106:6379 172.20.102.106:6380 172.20.102.106:6381

Creating cluster
Performing hash slots allocation on 6 nodes...
Using 3 masters:
172.20.102.99:6379
172.20.102.106:6379
172.20.102.99:6380
Adding replica 172.20.102.106:6381 to 172.20.102.99:6379
Adding replica 172.20.102.99:6381 to 172.20.102.106:6379
Adding replica 172.20.102.106:6380 to 172.20.102.99:6380
M: 8725a9685bf6c52dd3263194f4ad7da6c6c24baa 172.20.102.99:6379
slots:0-5460 (5461 slots) master
M: 7042631de5447102acca741fc2b59ee6d9cca515 172.20.102.99:6380
slots:10923-16383 (5461 slots) master
S: 3c8b10b610cdceead21ec7595577553e2c91f9a1 172.20.102.99:6381
replicates 26591095c161256cba647303f1e670a7235a681e
M: 26591095c161256cba647303f1e670a7235a681e 172.20.102.106:6379
slots:5461-10922 (5462 slots) master
S: b3ae2163ef2768a9e30849c5489b3f1b472a7c9a 172.20.102.106:6380
replicates 7042631de5447102acca741fc2b59ee6d9cca515
S: 748b5de0c7a29232e533e589cdc9667013d50f56 172.20.102.106:6381
replicates 8725a9685bf6c52dd3263194f4ad7da6c6c24baa
Can I set the above configuration? (type 'yes' to accept): yes
Nodes configuration updated
Assign a different config epoch to each node
Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join......
Performing Cluster Check (using node 172.20.102.99:6379)
M: 8725a9685bf6c52dd3263194f4ad7da6c6c24baa 172.20.102.99:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 3c8b10b610cdceead21ec7595577553e2c91f9a1 172.20.102.99:6381
slots: (0 slots) slave
replicates 26591095c161256cba647303f1e670a7235a681e
S: b3ae2163ef2768a9e30849c5489b3f1b472a7c9a 172.20.102.106:6380
slots: (0 slots) slave
replicates 7042631de5447102acca741fc2b59ee6d9cca515
S: 748b5de0c7a29232e533e589cdc9667013d50f56 172.20.102.106:6381
slots: (0 slots) slave
replicates 8725a9685bf6c52dd3263194f4ad7da6c6c24baa
M: 7042631de5447102acca741fc2b59ee6d9cca515 172.20.102.99:6380
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: 26591095c161256cba647303f1e670a7235a681e 172.20.102.106:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
Check for open slots...
Check slots coverage...
[OK] All 16384 slots covered.

9、[root@host-172-20-102-99 ~]#redis-trib.rb check 172.20.102.99:6379

Performing Cluster Check (using node 172.20.102.99:6379)
M: f76c3a3c86715300192d41cf581e3923be041d80 172.20.102.99:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 8c51f6eba48c2e89b97b7f89b09130dfa157c25b 172.20.102.99:6380
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: 62926b03972c5fd04dc9ef26e61219abdfc806f9 172.20.102.106:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: fa9c3ca0053bbb6ecf932caf672ab92e3a0c4e1a 172.20.102.99:6381
slots: (0 slots) slave
replicates 62926b03972c5fd04dc9ef26e61219abdfc806f9
S: 865f310d0cf5e085e04fb45cfa03f036d58dd6cc 172.20.102.106:6380
slots: (0 slots) slave
replicates 8c51f6eba48c2e89b97b7f89b09130dfa157c25b
S: 22f1ec81b6286d371ab0a4b80296dd3595b64b0a 172.20.102.106:6381
slots: (0 slots) slave
replicates f76c3a3c86715300192d41cf581e3923be041d80
[OK] All nodes agree about slots configuration.
Check for open slots...
Check slots coverage...
[OK] All 16384 slots covered.

10、[root@host-172-20-102-99 ~]#redis-trib.rb info 172.20.102.99:6379
172.20.102.99:6379 (f76c3a3c...) -> 0 keys | 5461 slots | 1 slaves.
172.20.102.99:6380 (8c51f6eb...) -> 0 keys | 5461 slots | 1 slaves.
172.20.102.106:6379 (62926b03...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

11、由于未设置 masterauth 认证密码, 所以主从未建立起来, 但是集群已经运行,所以需要在每个 slave控制台使用 config set 设置 masterauth 密码,或者写在每个 redis 配置文件中,最好是在控制点设置密码之后再写入配置文件当中
[root@host-172-20-102-99 data]#redis-cli -h 172.20.102.99 -p 6381 -a 123gxy
Warning: Using a password with '-a' option on the command line interface may not be safe.
172.20.102.99:6381> CONFIG SET masterauth 123gxy
OK
[root@host-172-20-102-106 ~]#redis-cli -h 172.20.102.106 -p 6380 -a 123gxy
Warning: Using a password with '-a' option on the command line interface may not be safe.
172.20.102.106:6380> CONFIG SET masterauth 123gxy
OK
[root@host-172-20-102-99 data]#redis-cli -h 172.20.102.99 -p 6380 -a 123gxy
Warning: Using a password with '-a' option on the command line interface may not be safe.
172.20.102.99:6380> CONFIG SET masterauth 123gxy
OK
在此处,我出现的问题是,主从一直无法实现连接,这时,要把三主三从的redis.conf文件中的“requirepass”打开!才能实现主从连接。
12、我们去查看slave主机的info信息:
[root@host-172-20-102-106 redis]#redis-cli -h 172.20.102.99 -p 6381 -a 123gxy
#Replication
role:slave
master_host:172.20.102.106
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:154
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c0970c4698e60710fc9c0b98da3e354b328b5b29
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:154
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:154
[root@host-172-20-102-106 redis]#redis-cli -h 172.20.102.106 -p 6381 -a 123gxy
#Replication
role:slave
master_host:172.20.102.99
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:770
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f0add08804cda3e766b8a9cb83c5b2491403db94
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:770
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:225
repl_backlog_histlen:546
[root@host-172-20-102-106 redis]#redis-cli -h 172.20.102.106 -p 6380 -a 123gxy
#Replication
#Replication
role:slave
master_host:172.20.102.99
master_port:6380
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:840
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1cf7e013cf37d0e97f1f9c0e59bf3581ad864746
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:840
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:211
repl_backlog_histlen:630

13、验证集群状态:[root@host-172-20-102-106 redis]#redis-cli -h 172.20.102.99 -p 6379 -a 123gxy
172.20.102.99:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:3214
cluster_stats_messages_pong_sent:964
cluster_stats_messages_fail_sent:4
cluster_stats_messages_sent:4182
cluster_stats_messages_ping_received:964
cluster_stats_messages_pong_received:939
cluster_stats_messages_fail_received:3
cluster_stats_messages_received:1906
14、集群维护之模拟master宕机:A: 测试在 master 写入数据,并在其对应的 slave 验证数据:
[root@host-172-20-102-99 etc]#redis-cli -h 172.20.102.99 -p 6379 -a 123gxy
172.20.102.99:6379> SET key2 value2
OK
172.20.102.99:6379> get key2
"value2"
SLAVE验证数据:
[root@host-172-20-102-106 redis]#redis-cli -h 172.20.102.106 -p 6381 -a 123gxy
172.20.102.106:6381> keys *
1) "key2"
15、redis 的mastr被kill后,slave自动升为master,原master在重新启动后变为slave。不需要手动干预
至此,redis集群实验全部剧终。