四时宝库

程序员的知识宝库

Redis集群版(主从、哨兵、集群)(redis 集群 哨兵 区别)

爱编程,爱分享。有梦想一起实现。喜欢的小伙伴点个关注吧!


一 Linux上安装Redis

1.1 安装redis

配置清单
克隆一台linux主机 修改ip地址 hostname 重启
安装gcc-c++ : yum -y install gcc-c++
在home下创建一个redis的文件夹: mkdir /home/redis
移动到这个文件夹下: cd /home/redis
下载redis : wget https://download.redis.io/releases/redis-5.0.9.tar.gz
解压redis: tar -zxvf redis-5.0.9.tar.gz
进入到redis解压目录: cd redis-5.0.9
编译并运行:make && make install PREFIX=/usr/local/redis

1.2 启动运行

移动到redis的安装目录: cd /usr/local/redis
启动redis : ./bin/redis-server
当我们直接这样启动的时候 此时我们当前xshell窗口已经被redis占用,我们使用ctrl+z 此时会停止redis。 


修改守护线程(相当于让redis服务启动的时候 能在后台运行)
将配置文件拷贝到bin目录下:cp /home/redis/redis-5.0.9/redis.conf /usr/local/redis/bin
修改bin下的配置文件: vim /usr/local/redis/bin/redis.conf 
将136行改为 yes 开启守护进程 底行模式 :136 确定

再次启动redis的时候 需要我们用配置文件启动
运行redis: ./bin/redis-server ./bin/redis.conf
客户端连接: ./bin/redis-cli

在连接上redis之后 如果想关闭redis 服务: 
shutdown
shutdown save

ctrl+c 退出连接

ps -ef | grep redis 找到进程号 kill -9 进程号

二 Redis主从

1.1 搭建集群并配置主从

IP地址 服务 角色

192.168.239.160:8001 redis 主 master

192.168.239.161:8003 redis 从 slave

配置清单

克隆一台有redis的linux系统 修改ip地址 修改hostname 重启 xshell连接 

修改主redis配置文件: vim /usr/local/redis/bin/redis.conf 
:69 bind 192.168.239.160 让redis开启远程访问 
:92 port 8001 端口 
:136 daemonize yes 守护进程 


修改从redis配置文件: vim /usr/local/redis/bin/redis.conf 
:69 bind 192.168.239.161 
:92 port 8003 
:136 daemonize yes 
:70 slaveof 192.168.239.160 8001 


启动两台redis服务 
连接redis: ./redis-cli -h 192.168.239.160 -p 8001 -c 
连接redis: ./redis-cli -h 192.168.239.161 -p 8003 -c 


测试主从 在主redis中添加数据 set aaa bbb set bbb cccc 
在从redis中获取数据 get aaa get bbb 
测试读写 在从redis中添加数据 
192.168.239.161:8003> set hahahaha hehehehe 
(error) READONLY You can't write against a read only replica. 

得到结论 从redis 不允许写操作

1.2 redis的主从原理

实现主从复制(Master-Slave Replication)的工作原理:

Slave从节点服务启动并连接到Master之后,它将主动发送一个SYNC命令。

Master服务主节点收到同步命令后将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave从节点服务在接收到数据库文件数据之后将其存盘并加载到内存中。

此后,Master主节点继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。

如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行

主从复制配置:

找到redis的配置文件
第一步:修改从节点的配置文件:slaveof      主节点ip
第二步:如果设置了密码,就要设置:masterauth

1.3 redis主从特点

读写分离,提高效率

数据热备份,提供多个副本

Redis的Replication的特点和缺点:

主节点故障,集群则无法进行工作,可用性比较低,从节点升主节点需要人工手动干预

单点容易造成性能低下

主节点的存储能力受到限制

主节点的写受到限制(只有一个主节点)

全量同步可能会造成毫秒或者秒级的卡顿现象

单点问题压力大,故障之后无法主动切换需要人为操作。即使再加redis也是 一主多从, 主节点一旦挂掉,此时无法正常写操作。

哨兵就是一个监控平台,redis中自带哨兵机制。能实现主从切换。例如 一主两从, 如果主节点宕机,哨兵会重新选举新的主节点。

三 Redis中哨兵机制

3.1 什么是哨兵

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例

3.2 哨兵的作用

A Master状态检测
B 如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave。
C Master-Slave切换后,masterredis.conf、slaveredis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。


3.3 哨兵的流程

1)每个Sentinel(哨兵也可以搭建集群)以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个PING命令。
2)如果一个实例(instance)距离最后一次有效回复PING命令的时间超过 own-after-milliseconds 选项所指定的值,则这个实例会被Sentinel标记为主观下线。
3)如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
4)当有足够数量的Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态,则Master会被标记为客观下线。
5)在一般情况下,每个Sentinel 会以每10秒一次的频率向它已知的所有Master,Slave发送 INFO 命令。
6)当Master被Sentinel标记为客观下线时,Sentinel 向下线的 Master 的所有Slave发送 INFO命令的频率会从10秒一次改为每秒一次。
7)若没有足够数量的Sentinel同意Master已经下线,Master的客观下线状态就会被移除。 若 Master重新向Sentinel 的PING命令返回有效回复,Master的主观下线状态就会被移除。

简单地说\故障切换(failover)*的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观地认为主服务器不可用,这个现象成为*主观下线*。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为*客观下线**。这样对于客户端而言,一切都是透明的。

https://www.cnblogs.com/kevingrace/p/9004460.html

3.4 redis哨兵搭建

克隆一台redis 搭建一主双从 
192.168.239.160:8001 主
192.168.239.161:8003 从
192.168.239.162:8005 从
修改162的redis配置信息: vim /usr/local/redis/bin/redis.conf
:69 bind 192.168.239.162
:92 port 8005
搭建一台sentinel哨兵进程
找到160下的sentinel文件拷贝到bin目录下
cp /home/redis/redis-5.0.9/sentinel.conf /usr/local/redis/bin/ 
修改我们的sentinel配置文件 :
vim /usr/local/redis/bin/sentinel.conf

:17 protected-mode no 默认为yes 不能进行远程连接所以改为no
:26 daemonize yes 开启守护
:84 sentinel monitor mymaster 192.168.239.160 8001 1
:103 sentinel auth-pass mymaster 123

启动redis一主双从集群
启动哨兵:./redis-sentinel sentinel.conf
通过命令连接每一台redis:./redis-cli -h 192.168.239.161 -p 8003 -c 
输入info查看当前主从信息 

# Replication
role:master
connected_slaves:2
slave0:ip=192.168.239.161,port=8003,state=online,offset=14269,lag=0
slave1:ip=192.168.239.162,port=8005,state=online,offset=14269,lag=0


测试:干掉主节点shutdown save 通过info 查看新的主节点
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.239.161,port=8003,state=online,offset=32341,lag=0
slave1:ip=192.168.239.160,port=8001,state=online,offset=32341,lag=0

3.5 redis的进化史

redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来\哨兵**模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式。

在哨兵模式下,还是一主多从,好处是主挂掉了之后不需要手动配置 哨兵会自动主从切换。但是依然存单 单主压力过大问题。

四 Redis的cluster集群模式

4.1 redis集群设计

Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。


其结构特点:
1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。
5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。

\主机名称\ IP地址 \redis版本和角色说明**

redis160 192.168.239.160:8001 redis 5.0.9(?)

redis161 192.168.239.161:8003 redis 5.0.9(?)

redis162 192.168.239.162:8005 redis 5.0.9(?)

redis160 192.168.239.160:8002 redis 5.0.9(?)

redis161 192.168.239.161:8004 redis 5.0.9(?)

redis162 192.168.239.162:8006 redis 5.0.9(?)

搭建三主三从 (一台电脑启动两个redis)


Redis160操作:
在redis目录下创建一个文件夹: mkdir /usr/local/redis/conf
在conf中创建8001 8002两个文件夹分别存放不同端口的配置文件
将配置文件拷贝到conf文件夹下: cp /home/redis/redis-5.0.9/redis.conf /usr/local/redis/conf/8001/

进入到8001修改配置文件:vim /usr/local/redis/conf/8001/redis.conf

:69 bind 192.168.239.160 修改ip地址为当前主机的ip地址
:92 port 8001 修改端口号
:136 daemonize yes 守护进程
:158 pidfile /var/run/redis_8001.pid 当前redis运行的进行id
:699 appendonly yes aof日志开启
:832 cluster-enabled yes 开启集群模式
:840 cluster-config-file nodes-8001.conf 集群配置文件
:846 cluster-node-timeout 15000 超时时间

将当前配置文件拷贝到6388文件夹下:cp /usr/local/redis/conf/8001/redis.conf /usr/local/redis/conf/8002/redis.conf
修改8002配置文件 底行模式 : :%s/8001/8002/g
Redis161操作:
在redis目录下创建一个文件夹: mkdir /usr/local/redis/conf
在conf中创建8003 8004两个文件夹分别存放不同端口的配置文件

[root@redis161 conf]# scp 192.168.239.160:/usr/local/redis/conf/8001/redis.conf /usr/local/redis/conf/8003 
修改配置文件注意 此时要修改ip地址


Redis162操作:同reids161 
scp 192.168.239.160:/usr/local/redis/conf/8001/redis.conf /usr/local/redis/conf/8005 


启动所有的redis 我们统一进入到redis目录: cd /usr/local/redis/
./bin/redis-server conf/8001/redis.conf

[root@redis- redis]# ./bin/redis-server conf/8001/redis.conf 
1727:C 29 Dec 2020 17:15:01.438 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1727:C 29 Dec 2020 17:15:01.438 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=1727, just started
1727:C 29 Dec 2020 17:15:01.438 # Configuration loaded
[root@redis- redis]# ./bin/redis-server conf/8002/redis.conf 
1732:C 29 Dec 2020 17:15:08.104 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1732:C 29 Dec 2020 17:15:08.104 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=1732, just started
1732:C 29 Dec 2020 17:15:08.104 # Configuration loaded


启动redis集群配置,在任意机器中输入
./bin/redis-cli --cluster create 192.168.239.160:8001 192.168.239.160:8002 192.168.239.161:8003 192.168.239.161:8004 192.168.239.162:8005 192.168.239.162:8006 --cluster-replicas 1

注意 -cluster-replicas 1 代表副本的数量 1 六台机器 每个人有一个副本 就是三主三从 如果六台机器 每个人有两个副本 就是 两主四从

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.239.161:8004 to 192.168.239.160:8001
Adding replica 192.168.239.162:8006 to 192.168.239.161:8003
Adding replica 192.168.239.160:8002 to 192.168.239.162:8005
M: 6a79309d782c21aa06adfc9bf374462b090ae13f 192.168.239.160:8001
slots:[0-5460] (5461 slots) master
S: 69bce9ba42c959847cf864e69c088cc557fe0a96 192.168.239.160:8002
replicates ddfd8fe75b195a3508e76ffebd9a39ab8e597b13
M: 3de6074a2f5f512b22be96dfc59b6efcfd184107 192.168.239.161:8003
slots:[5461-10922] (5462 slots) master
S: 39cd007836652c2b8f816f4dcfd146336082e56a 192.168.239.161:8004
replicates 6a79309d782c21aa06adfc9bf374462b090ae13f
M: ddfd8fe75b195a3508e76ffebd9a39ab8e597b13 192.168.239.162:8005
slots:[10923-16383] (5461 slots) master
S: ece09c5682cf47edd28315f6bafb99b9f26df4d4 192.168.239.162:8006
replicates 3de6074a2f5f512b22be96dfc59b6efcfd184107
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 192.168.239.160:8001)
M: 6a79309d782c21aa06adfc9bf374462b090ae13f 192.168.239.160:8001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: ddfd8fe75b195a3508e76ffebd9a39ab8e597b13 192.168.239.162:8005
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 69bce9ba42c959847cf864e69c088cc557fe0a96 192.168.239.160:8002
slots: (0 slots) slave
replicates ddfd8fe75b195a3508e76ffebd9a39ab8e597b13
M: 3de6074a2f5f512b22be96dfc59b6efcfd184107 192.168.239.161:8003
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: ece09c5682cf47edd28315f6bafb99b9f26df4d4 192.168.239.162:8006
slots: (0 slots) slave
replicates 3de6074a2f5f512b22be96dfc59b6efcfd184107
S: 39cd007836652c2b8f816f4dcfd146336082e56a 192.168.239.161:8004
slots: (0 slots) slave
replicates 6a79309d782c21aa06adfc9bf374462b090ae13f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
连接其中一个节点:./bin/redis-cli -h 192.168.239.160 -p 8001 -c
查看节点信息:CLUSTER NODES
查看节点运行信息:CLUSTER INFO

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接