redis

启动:
redis-server /data/redis/redis.conf &

基础命令:

字符串
定义一个 key value
127.0.0.1:6379> set k1 v1

查看一个key 值
127.0.0.1:6379> get k1
"v1"

查看一个键的类型
127.0.0.1:6379> set k2 10
OK
127.0.0.1:6379> TYPE k2
string

批量定义、获取键值
127.0.0.1:6379> mset k1 tt k2 yy k3 uu
OK
127.0.0.1:6379> mget k1 k2 k3

  1. "tt"
  2. "yy"
  3. "uu"

RDB持久化:
不要kill -9
shutdown 时,会执行BGSAVE

AOF RDB 文件同时存在,优先读AOF

主从复制:
流程
1.从库发起同步请求
2.主库收到请求后执行bgsave保存当前内存里的数据到磁盘
3.主库将持久化的数据发送给从库的数据目录
4.从库收到主库的持久化数据之后,先清空自己当前内存中的所有数据
5.从库将主库发送过来的持久化文件加载到自己的内存里
局限性:
1.执行主从复制之前,现将数据备份一份
2.建议将主从复制写入到配置文件中
3.在业务低峰期做主从复制,
4.拷贝数据时候会占用带宽
5.不能自动完成主从切换,需要人工介入

哨兵

redis01  192.168.0.51
redis02  192.168.0.52
redis03  192.168.0.53
redis-cli -h 192.168.0.52  shutdown
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
cd /opt/redis_cluster/redis
make && make install
vim /opt/redis_cluster/redis_6379/conf/redis_6379.com
redis普通节点配置文件
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 192.168.0.51
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379

其他两个节点更改bind IP
哨兵配置文件
mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
vim /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 192.168.0.51
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379
sentinel monitor mymaster 192.168.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000

其他两个节点把bind ip  改成自己的ip
启动
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
进入redis
 redis-cli -h 192.168.0.51
redis-cli -h 192.168.0.52
 redis-cli -h 192.168.0.53
建立主从复制
192.168.0.52:6379> SLAVEOF 192.168.0.51 6379
192.168.0.53:6379>  SLAVEOF 192.168.0.51 6379
启动哨兵:
 redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
哨兵工作原理:

集群

DB01 上操作
 mkdir -p /data/redis_cluster/redis_6380
 mkdir -p /data/redis_cluster/redis_6381
 mkdir -p /opt/redis_cluster/redis_6380/{conf,logs,pid}
 mkdir -p /opt/redis_cluster/redis_6381/{conf,logs,pid}

cat >/opt/redis_cluster/redis_6380/conf/redis_6380.conf<<EOF
bind 192.168.0.51
port 6380
daemonize yes
pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_cluster/redis_6380/"
cluster-enabled yes
cluster-config-file nodes_6380.conf
cluster-node-timeout 15000
EOF
cd /opt/redis_cluster/
cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf
sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf 
rsync -avz /opt/redis_cluster/redis_638*  192.168.0.52:/opt/redis_cluster/
rsync -avz /opt/redis_cluster/redis_638*  192.168.0.53:/opt/redis_cluster/
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf

DB02  修改配置文件的bindIP 
find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#52#g"
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf

DB03修改配置文件的bindIP 
find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#53#g"
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf

查看节点上的集群状态
[root@redis01 redis_cluster]# ps -ef |grep redis 
root       2507      1  0 15:36 ?        00:00:01 redis-server 192.168.0.51:6380 [cluster]
root       2509      1  0 15:36 ?        00:00:01 redis-server 192.168.0.51:6381 [cluster]

登录redis-cli -h 192.168.0.51 -p 6380
查看集群节点信息 
192.168.0.51:6380> CLUSTER NODES
b268ccb89f407fb59c8317760a622bb29c481f92 192.168.0.51:6380 myself,master - 0 0 1 connected

添加其他节点到集群
192.168.0.51:6380> CLUSTER MEET 192.168.0.52 6380
OK
192.168.0.51:6380> CLUSTER MEET 192.168.0.53 6380
OK
192.168.0.51:6380> CLUSTER MEET 192.168.0.51 6381
OK
192.168.0.51:6380> CLUSTER MEET 192.168.0.52 6381
OK
192.168.0.51:6380> CLUSTER MEET 192.168.0.53 6381
OK

192.168.0.51:6380> CLUSTER NODES
4190cd752395598714cfb709cb56bf51fd315d3f 192.168.0.53:6380 master - 0 1599898003964 2 connected
e0ce93415280f8ae5fbc37bd35da034b0c97f07a 192.168.0.52:6380 master - 0 1599898004371 0 connected
7dfba04b4e0e956a8c63c88235b4900fe49282e9 192.168.0.53:6381 master - 0 1599898002941 3 connected
b268ccb89f407fb59c8317760a622bb29c481f92 192.168.0.51:6380 myself,master - 0 0 1 connected
5b77253f8acda8ccce6e95a717b67412bd417b35 192.168.0.51:6381 master - 0 1599897999865 5 connected
618ab877a1235c31034fc5b260252b4df90e59b4 192.168.0.52:6381 master - 0 1599898001916 4 connected

查看端口信息,发现多了两个端口
[root@redis01 redis_cluster]# netstat -luntp 
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 192.168.0.51:16380      0.0.0.0:*               LISTEN      2582/redis-server 1 
tcp        0      0 192.168.0.51:16381      0.0.0.0:*               LISTEN      2593/redis-server 1 
tcp        0      0 192.168.0.51:6380       0.0.0.0:*               LISTEN      2582/redis-server 1 
tcp        0      0 192.168.0.51:6381       0.0.0.0:*               LISTEN      2593/redis-server 1 

这是集群的通信端口
在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障灯状态信息,redis 集群采用 Gossip(流言)协议,Gossip 协议工作原理就是节点彼此不断交换信息,一段时间后所有的节点都会知道集群完整信息,这种方式类似流言传播。
通信过程:
1)集群中的每一个节点都会单独开辟一个 Tcp 通道,用于节点之间彼此通信,通信端口在基础端口上家10000.
2)每个节点在固定周期内通过特定规则选择结构节点发送 ping 消息
3)接收到 ping 消息的节点用 pong 消息作为响应。集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以正常通信,最终他们会打成一致的状态,当节点出现故障,新节点加入,主从角色变化等,它能够给不断的ping/pong消息,从而达到同步目的。
通讯消息类型:
Gossip
Gossip 协议职责就是信息交换,信息交换的载体就是节点间彼此发送Gossip 消息。
常见 Gossip 消息分为:ping、 pong、 meet、 fail 等
meet
meet 消息:用于通知新节点加入,消息发送者通知接受者加入到当前集群,meet 消息通信正常完成后,接收节点会加入到集群中并进行ping、 pong 消息交换
ping
ping 消息:集群内交换最频繁的消息,集群内每个节点每秒想多个其他节点发送 ping 消息,用于检测节点是否在线和交换彼此信息。
pong
Pong 消息:当接收到 ping,meet 消息时,作为相应消息回复给发送方确认消息正常通信,节点也可以向集群内广播自身的 pong 消息来通知整个集群对自身状态进行更新。
fail
fail 消息:当节点判定集群内另一个节点下线时,回向集群内广播一个fail 消息,其他节点收到 fail 消息之后把对应节点更新为下线状态。

作者:被运维耽误的厨子
链接:https://www.jianshu.com/p/2f93bb771469
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

分配槽位

集群中一共有16384(0-16383)个槽位,只要有一个槽位有问题或者没有分配整个集群都不能使用
redis-cli -h 192.168.0.51 -p 6380 cluster addslots {0..5461}
redis-cli -h 192.168.0.52 -p 6380 cluster addslots {5462..10922}
 redis-cli -h 192.168.0.53 -p 6380 cluster addslots {10923..16383} 
查看集群状态
192.168.0.51:6380> CLUSTER INFO
cluster_state:ok

构建集群高可用

51的  6381  作为52    6380的从节点
192.168.0.51:6381> 
CLUSTER REPLICATE  91345d27dfc7814e5a450e187bf1d091691fead1 

52    6381  作为53    6380的从节点
192.168.0.52:6381
CLUSTER REPLICATE  b12acd3ee7ce1cd3e19462e8a4ca6dd43a964f79

53   6381 作为51  6380的从节点
192.168.0.53:6381>
CLUSTER REPLICATE  7cd8f4a8d9d135f6238dc8f56d1d4e5d9900b4dd

![图片.png](https://upload-images.jianshu.io/upload_images/24042176-295a85efd8d56491.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

插入数据测试
[root@redis01 ~]# redis-cli -h 192.168.0.51 -p 6380
192.168.0.51:6380> 
192.168.0.51:6380> 
192.168.0.51:6380> set k1 ffff
(error) MOVED 12706 192.168.0.53:6380
192.168.0.51:6380> 

发现报错了,让我们移动到  53上

Redis Cluster ASK路由介绍

在集群模式下,Redis接受任何键相关命令时首先会计算键对应的槽,再根据槽找出所对应的节点
如果节点是自身,则处理键命令;
否则回复MOVED重定向错误,通知客户端请求正确的节点,这个过程称为Mover重定向.

知道了ask路由后,我们使用-c选项批量插入一些数据

 cat set.sh 
#!/bin/bash 

for i in {1..1000}
do

 redis-cli -c -h 192.168.0.51 -p 6380 set k${i} $i
 echo "$i"
done 

模拟故障转移

把redis03主节点停掉,正常情况 redis02上的6381从节点会成为主节点
关闭redis03主节点前的集群状态:


图片.png

图片.png

关闭之后


图片.png
图片.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容