From 051619f5a2d3895a03d166a461982e139ffed723 Mon Sep 17 00:00:00 2001 From: heibaiying <2806718453@qq.com> Date: Thu, 18 Jul 2019 17:55:02 +0800 Subject: [PATCH] =?UTF-8?q?redis=E9=9B=86=E7=BE=A4=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +- ...作.md => Elasticsearch_7_基本操作.md} | 0 notes/Redis_哨兵模式.md | 146 +++- notes/Redis_数据类型和常用命令.md | 161 ++++ notes/Redis_集群模式.md | 174 ++++- .../installation/MongoDB单机环境搭建.md | 171 +++-- .../RabbitMQ单机环境搭建.md | 353 +++++---- .../《Redis开发与运维》读书笔记.md | 726 ------------------ pictures/redis-cluster-create.png | Bin 0 -> 26635 bytes pictures/redis-cluster-nodes.png | Bin 0 -> 27992 bytes pictures/redis-cluster-nodes2.png | Bin 0 -> 27443 bytes pictures/redis-cluster-ps-ef.png | Bin 0 -> 12132 bytes pictures/redis-info-replication.png | Bin 0 -> 17228 bytes pictures/redis-sentinel-infomation.png | Bin 0 -> 10059 bytes pictures/redis-sentinel-ps-ef.png | Bin 0 -> 14708 bytes pictures/redis-集群架构.png | Bin 0 -> 24092 bytes pictures/redis主从复制.png | Bin 0 -> 7873 bytes pictures/redis哨兵模式.png | Bin 0 -> 26318 bytes pictures/redis节点通讯.png | Bin 0 -> 26915 bytes 19 files changed, 739 insertions(+), 1004 deletions(-) rename notes/{Elasticsearch_7.x_基本操作.md => Elasticsearch_7_基本操作.md} (100%) create mode 100644 notes/Redis_数据类型和常用命令.md delete mode 100644 notes/《Redis开发与运维》读书笔记.md create mode 100644 pictures/redis-cluster-create.png create mode 100644 pictures/redis-cluster-nodes.png create mode 100644 pictures/redis-cluster-nodes2.png create mode 100644 pictures/redis-cluster-ps-ef.png create mode 100644 pictures/redis-info-replication.png create mode 100644 pictures/redis-sentinel-infomation.png create mode 100644 pictures/redis-sentinel-ps-ef.png create mode 100644 pictures/redis-集群架构.png create mode 100644 pictures/redis主从复制.png create mode 100644 pictures/redis哨兵模式.png create mode 100644 pictures/redis节点通讯.png diff --git a/README.md b/README.md index 546ba14..75ea087 100644 --- a/README.md +++ b/README.md @@ -46,11 +46,11 @@ TODO + redis 简介及基本数据结构 + redis 管道模式详解 -+ redis AOF 和 RDB 持久化策略原理 -+ redis 哨兵模式 -+ reids 集群模式 ++ [Redis AOF 和 RDB 持久化策略原理](https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/Redis_持久化.md) ++ [Redis 哨兵模式](https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/Redis_哨兵模式.md) ++ [Reids 集群模式](https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/Redis_集群模式.md) + 缓存击穿、缓存雪崩的解决方案 -+ redis 管理客户端cachecloud ++ redis 管理客户端 cachecloud #### 4.MongoDB @@ -63,7 +63,7 @@ TODO ## 📟 操作系统 -linux 核心概念、常用命令 +[Linux 常用 Shell 命令](https://github.com/heibaiying/Full-Stack-Notes/blob/master/notes/Linux常用Shell命令.md) @@ -86,7 +86,7 @@ linux 核心概念、常用命令 #### 2.spring Boot + spring 自动装配原理 -+ 理解SpringApplication ++ 理解 SpringApplication + Web MVC REST + WebFlux 核心 + ...... diff --git a/notes/Elasticsearch_7.x_基本操作.md b/notes/Elasticsearch_7_基本操作.md similarity index 100% rename from notes/Elasticsearch_7.x_基本操作.md rename to notes/Elasticsearch_7_基本操作.md diff --git a/notes/Redis_哨兵模式.md b/notes/Redis_哨兵模式.md index 8295011..8951df7 100644 --- a/notes/Redis_哨兵模式.md +++ b/notes/Redis_哨兵模式.md @@ -1,17 +1,32 @@ # Redis Sentinel + + ## 一、复制 -为了解决单点问题,保证数据的安全性,Redis 提供了复制机制,用于满足故障恢复和负载均衡等需求。通过复制机制,Redis 可以通过多个副本保证数据的安全性,从而提供高可用的基础,Redis 的哨兵模式和集群模式都是在复制机制的基础上实现高可用的。 +为了解决单点问题,保证数据的安全性,Redis 提供了复制机制,用于满足故障恢复和负载均衡等需求。通过复制机制,Redis 可以通过多个副本保证数据的安全性,从而提供高可用的基础,Redis 的哨兵和集群模式都是在复制基础上实现高可用的。 ### 1.1 建立复制关系 想要对两个 Redis 节点建立主从复制关系,可以通过以下三种方式来实现: -- 在从节点的配置文件中配置 `slaveof{masterHost}{masterPort}` 选项; -- 在从节点启动时候加入 `--slaveof{masterHost}{masterPort }`参数; -- 直接在从节点的交互式命令行中执行 `slaveof{masterHost}{masterPort}` 命令。 +- 在从节点的配置文件中配置 `slaveof {masterHost} {masterPort}` 选项; +- 在从节点启动时候加入 `--slaveof {masterHost} {masterPort}` 参数; +- 直接在从节点上执行 `slaveof {masterHost} {masterPort}` 命令。 +
主从节点复制关系建立后,可以使用 `info replication` 命令查看相关的复制状态。需要注意的是每个从节点只能有一个主节点,但主节点可以同时拥有多个从节点,复制行为是单向的,只能由主节点复制到从节点,因此从节点默认都是只读模式,即 `slave-read-only` 的值默认为`yes`。 ### 1.2 断开复制关系 @@ -26,11 +41,7 @@ slaveof{newMasterIp} {newMasterPort} 需要注意的是,当你从一个主节点切换到另外一个主节点时,该从节点上的原有的数据会被完全清除,然后再执行复制操作,从而保证该从节点上的数据和新主节点上的数据相同。 -### 1.3 复制机制原理 - - - -### 1.4 复制机制缺陷 +### 1.3 复制机制缺陷 复制机制最主要的缺陷在于,一旦主节点出现故障,从节点无法自动晋升为主节点,需要通过手动切换来实现,这样无法达到故障的快速转移,因此也不能实现高可用。基于这个原因,就产生了哨兵模式。 @@ -40,17 +51,16 @@ slaveof{newMasterIp} {newMasterPort} 哨兵模式的主要作用在于它能够自动完成故障发现和故障转移,并通知客户端,从而实现高可用。哨兵模式通常由一组 Sentinel 节点和一组(或多组)主从复制节点组成,架构如下: -![下载](C:\Users\ciic\Desktop\下载.png) - +
### 2.1 架构说明 #### 1. Sentinel 与 Redis Node -Redis Sentinel 就是一个特殊的 Redis 节点。在哨兵模式创建时,需要通过配置指定 Sentinel 与 Redis Master Node 之间的关系,然后 Sentinel 会从主节点上获取所有从节点的信息,之后 Sentinel 会定时向主节点和从节点发送`info`命令获取其拓扑结构和状态信息。 +Redis Sentinel 是一个特殊的 Redis 节点。在哨兵模式创建时,需要通过配置指定 Sentinel 与 Redis Master Node 之间的关系,然后 Sentinel 会从主节点上获取所有从节点的信息,之后 Sentinel 会定时向主节点和从节点发送`info`命令获取其拓扑结构和状态信息。 #### 2. Sentinel 与 Sentinel -基于 Redis 的发布订阅功能, 每个 Sentinel 节点会向主节点的 `__sentinel__: hello` 频道上发送该 Sentinel 节点对于主节点的判断以及当前 Sentinel 节点的信息 ,同时每个 Sentinel 节点也会订阅该频道, 来获取其他 Sentinel 节点的信息以及它们对主节点的判断。 +基于 Redis 的发布订阅功能, 每个 Sentinel 节点会向主节点的 `__sentinel__:hello` 频道上发送该 Sentinel 节点对于主节点的判断以及当前 Sentinel 节点的信息 ,同时每个 Sentinel 节点也会订阅该频道, 来获取其他 Sentinel 节点的信息以及它们对主节点的判断。 #### 3. 心跳机制 @@ -58,13 +68,11 @@ Redis Sentinel 就是一个特殊的 Redis 节点。在哨兵模式创建时, ### 2.2 故障转移原理 - 每个 Sentinel 都会定时进行心跳检查,当发现某个主节点出现心跳检测超时的情况时,此时认为该主节点已经不可用,这种判定称为主观下线。 +每个 Sentinel 都会定时进行心跳检查,当发现某个主节点出现心跳检测超时的情况时,此时认为该主节点已经不可用,这种判定称为主观下线。之后该 Sentinel 节点会通过 `sentinel ismaster-down-by-addr` 命令向其他 Sentinel 节点询问对主节点的判断, 当 quorum 个 Sentinel 节点都认为该节点故障时,则执行客观下线,即认为该节点已经不可用。这也同时解释了为什么必须需要一组 Sentinel 节点,因为单个 Sentinel 节点很容易对故障状态做出误判。 -之后该 Sentinel 节点会通过 `sentinel ismaster-down-by-addr` 命令向其他 Sentinel 节点询问对主节点的判断, 当 quorum 个 Sentinel 节点都认为该节点故障时,则执行客观下线,即认为该节点已经不可用。这也同时解释了为什么必须需要一组 Sentinel 节点,因为单个 Sentinel 节点很容易对故障状态做出误判。这里 quorum 的值是我们在哨兵模式搭建时指定的,后文会有说明,通常为 `Sentinel节点总数/2+1`,即半数以上节点做出主观下线判断就可以执行客观下线。 +> 这里 quorum 的值是我们在哨兵模式搭建时指定的,后文会有说明,通常为 `Sentinel节点总数/2+1`,即半数以上节点做出主观下线判断就可以执行客观下线。 -因为故障转移的工作只需要一个 Sentinel 节点来完成,所以 Sentinel 节点之间会再做一次选举工作, 基于 Raft 算法选出一个 Sentinel 领导者来进行故障转移的工作。 - -被选举出的 Sentinel 领导者就开始进行故障转移, 具体步骤如下: +因为故障转移的工作只需要一个 Sentinel 节点来完成,所以 Sentinel 节点之间会再做一次选举工作, 基于 Raft 算法选出一个 Sentinel 领导者来进行故障转移的工作。 被选举出的 Sentinel 领导者进行故障转移的具体步骤如下: 1. 在从节点列表中选出一个节点作为新的主节点,选择方法如下: @@ -80,7 +88,107 @@ Redis Sentinel 就是一个特殊的 Redis 节点。在哨兵模式创建时, ## 三、哨兵模式搭建 -## 四、客户端连接 +下面演示在单机上搭建哨兵模式,多机搭建步骤亦同。需要注意的是在实际生产环境中,为了保证高可用,Sentinel 节点需要尽量部署在不同主机上,同时为了保证正常选举,至少需要 3个 Sentinel 节点。 + +### 3.1 配置复制集 + +拷贝三份 `redis.conf`,分别命名为 redis-6379.conf ,redis-6380.conf ,redis-6381.conf ,需要修改的配置项如下: + +```shell +# redis-6379.conf +port 6379 +daemonize yes #以守护进程的方式启动 +pidfile /var/run/redis_6379.pid #当Redis以守护进程方式运行时,Redis会把pid写入该文件 +logfile 6379.log +dbfilename dump-6379.rdb +dir /home/redis/data/ +# redis-6380.conf +port 6380 +daemonize yes +pidfile /var/run/redis_6380.pid +logfile 6380.log +dbfilename dump-6380.rdb +dir /home/redis/data/ +slaveof 127.0.0.1 6379 +# redis-6381.conf +port 6381 +daemonize yes +pidfile /var/run/redis_6381.pid +logfile 6381.log +dbfilename dump-6381.rdb +dir /home/redis/data/ +slaveof 127.0.0.1 6379 +``` + +### 3.2 配置Sentinel + +拷贝三份 `sentinel.conf` ,分别命名为 sentinel-26379.conf ,sentinel-26380.conf ,sentinel-26381.conf ,配置如下: + +```shell +# sentinel-26379.conf +port 26379 +daemonize yes +logfile 26379.log +dir /home/redis/data/ +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-26380.conf +port 26380 +daemonize yes +logfile 26380.log +dir /home/redis/data/ +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-26381.conf +port 26381 +daemonize yes +logfile 26381.log +dir /home/redis/data/ +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 +``` + +### 3.3 启动集群 + +分别启动三个 Redis 节点,命令如下: + +```shell +redis-server redis-6379.conf +redis-server redis-6380.conf +redis-server redis-6381.conf +``` + +分别启动三个Sentinel节点,命令如下: + +```shell +redis-sentinel sentinel-26379.conf +redis-sentinel sentinel-26380.conf +redis-sentinel sentinel-26381.conf +``` + +使用 `ps -ef | grep redis` 命令查看进程,此时输出应该如下: + +
+可以使用 `info replication` 命令查看 Redis 复制集的状态,此时输出如下。可以看到 6379 节点为 master 节点,并且有两个从节点,分别为 slave0 和 slave1,对应的端口为 6380 和 6381。 + +
+可以使用 `info Sentinel` 命令查看任意 Sentinel 节点的状态,从最后一句输出可以看到 Sentinel 节点已经感知到 6379 的 master 节点,并且也知道它有两个 slaves 节点;同时 Sentinel 节点彼此之间也感知到,共有 3 个 Sentinel 节点。 + +
+ + +## 参考资料 + +1. 付磊,张益军 . 《Redis 开发与运维》. 机械工业出版社 . 2017-3-1 +2. 官方文档:[Redis Sentinel Documentation](https://redis.io/topics/sentinel) \ No newline at end of file diff --git a/notes/Redis_数据类型和常用命令.md b/notes/Redis_数据类型和常用命令.md new file mode 100644 index 0000000..ba4fc2f --- /dev/null +++ b/notes/Redis_数据类型和常用命令.md @@ -0,0 +1,161 @@ +# Redis 基础 + +## 一、数据类型 + +Redis 5 支持以下多种数据类型: + +- 二进制安全字符串。 +- Lists (列表):根据插入顺序排序的字符串元素的集合。 +- Sets (集):未排序的不重复的字符串元素的集合。 +- Sorted Sets (排序集):类似于集,但每个字符串元素与被称为分数的值相关,元素总是按其分数排序。 +- Hashes (散列) :由字段 (Field) 和值都是字符串组成的映射的集合。 +- Bit Arrays (也称 bitmaps 位图) :Bitmaps 本身不是一种数据结构, 实际上它就是字符串,但是它可以对字符串的位进行操作,所以在 Redis 官方的分类当中将其单独归为一类; +- HyperLogLogs:实际类型为字符串类型 ,它是一种基数算法, 通过 HyperLogLog 可以利用极小的内存空间完成独立总数的统计。 +- Streams (流) :Stream是 Redis 5.0 引入的一种新数据类型,用于在生产者和消费者之间建立数据通道。 + +## 二、常用命令 + +### 2.1 字符串 + +| 作用 | 命令格式 | 参数或示例 | +| -------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 设置值 | set key value \[ex seconds]\[px milliseconds][nx\|xx] setnx setex | ex seconds:为键设置秒级过期时间;
px milliseconds:为键设置毫秒级过期时间;
nx: 键不存在时才可以添加成功;
xx: 键存在时才可以修改成功。 | +| 获取值 | get key | 如果获取的键不存在 ,则返回 nil | +| 批量设置 | mset key value [key value ...] | mset a 1 b 2 c 3 d 4 | +| 批量获取值 | mget key [key ...] | mget a b c d | +| 计数 | incr key
decr key
incrby key increment(指定数值自增)
decrby key decrement(指定数值自减)
incrbyfloat key increment (浮点数自增) | 值是整数时返回自增或自减后的结果;
值不是整数时返回错误;
键不存在时自动创建,并按照初始值为 0 进行自增或自减。 | +| 追加值 | append key value | 向字符串尾部追加值。 | +| 字符串长度 | strlen key | 获取字符串长度,中文占用三个字节 | +| 设置并返回原值 | getset key value | | +| 设置指定位置的字符串 | setrange key offeset value | | +| 获取部分字符串 | getrange key start end | | + +### 2.3 哈希 + +| 作用 | 格式 | 参数或示例 | +| ---------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 设置值 | hset key field value | hset user:1 name tom
hset user:1 age 12 | +| 获取值 | hget key field | hget user:1 name | +| 删除 field | hdel key field [field ...] | | +| 计算 field 个数 | hlen key | | +| 批量设置或获取 | hmget key field [field]
hmset key field value [field value...] | hmset user:1 name mike age 12 city tianjin
hmget user:1 name city | +| 判断 field 是否存在 | hexists key field | | +| 获取所有 field | hkeys key | | +| 获取所有 value | hvals key | | +| 获取所有的 filed-value | hgetall key | 如果哈希元素个数比较多可能会阻塞Redis,此时可以使用 hscan 渐进式遍历 | +| 计数 | hincrby key field
hincrbyfloat key field | | + +### 2.4 列表 + +| 作用 | 格式 | 参数或示例 | +| -------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 增 | 左侧插入:lpush key value [value ...]
右侧插入:rpush key value [value ...]
某个指定元素前后插入:linsert key before\|after pivot value | | +| 查 | 获取指定范围内的元素列表:lrange key start end
获取列表指定索引下标的元素:lindex key index
获取列表指定长度:llen key | lrange listkey 0 -1 | +| 删 | 从列表左侧弹出元素:lpop key
从列表右侧弹出元素:rpop key
删除指定元素:lrem key count value
截取列表:ltrim key start end | count>0:从左到右, 删除最多 count 个元素。
count<0:从右到左, 删除最多 -count 个元素。
count=0: 删除所有 | +| 改 | 修改指定下标的元素:lset key index newValue | | +| 阻塞操作 | blpop key [key ...] timeout
brpop key [key ...] timeout | key[key...]: 多个列表的键。 timeout: 阻塞时间\|等待时间(单位秒) | + + + +### 2.5 集合 + +集合(set) 类型也是用来保存多个的字符串元素, 但和列表类型不一样的是, 集合中的元素是无序的, 不允许有重复元素,不能通过下标获取元素。 + +| 作用 | 格式 | 参数或示例 | +| -------------------- | ------------------------------ | ----------------------------------------- | +| 添加元素 | sadd key element [element ...] | 返回结果为添加成功的元素个数 | +| 删除元素 | srem key element [element ...] | 返回结果为成功删除的元素个数 | +| 计算元素个数 | scard key | | +| 判断元素是否在集合中 | sismember key element | | +| 随机返回 | srandmember key [count] | 随机从集合返回指定个数元素,count 默认为1 | +| 从集合随机弹出元素 | spop key | srandmember 不会从集合中删除元素,spop 会 | +| 获取集合中所有元素 | smembers key | 可用 sscan 代替 | + +**集合间操作**: + +| 作用 | 格式 | +| ---------------------------- | ------------------------------------------------------------ | +| 求多个集合的交集 | sinter key [key ...] | +| 求多个集合的并集 | suinon key [key ...] | +| 求多个集合的差集 | sdiff key [key ...] | +| 将交集、并集、差集的结果保存 | sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...] | + +### 2.6 有序集合 + +有序集合中的元素可以排序。它给每个元素设置一个分数(score) 作为排序的依据。 + +| 作用 | 格式 | 参数或示例 | +| ------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 添加成员 | zadd key score member [score member ...] | nx: member 不存在时才可设置成功, 用于添加;
xx: member 存在时可以设置成功, 用于更新;
ch: 返回此次操作后, 有序集合内元素和分数发生变化的个数;
incr:对 score 做增加, 相当于下面的 zincrby。 | +| 计算成员个数 | zcard key | | +| 计算某个成员的分数 | zscore key member | | +| 计算某个成员的排名 | zrank key member zrevrank key member | zrank是从分数从低到高返回排名, zrevrank 反之。 | +| 删除成员 | zrem key member [member ...] | | +| 增加成员分数 | zincrby key increment member | zincrby user:ranking 9 tom | +| 返回指定排名范围的成员 | zrange key start end [withscores]
zrevrange key start end [withscores] | zrange是从低到高返回, zrevrange 反之。 | +| 返回指定分数范围内的成员 | zrangebyscore key min max \[withscores][limit offset count]
zrevrangebyscore key max min \[withscores][limit offset count] | 其中 zrangebyscore 按照分数从低到高返回, zrevrangebyscore 反之;
[limit offset count] 选项用于限制输出的起始位置和个数;
min 和 max 代表最小和最大值,支持开闭区间, 也可以使用 -inf 和+inf 代表无限小和无限大。 | +| 删除指定排名内的升序元素 | zremrangerank key start end | | +| 删除指定分数范围的成员 | zremrangebyscore key min max | | + +**集合间操作**: + +| 作用 | 格式 | +| ---- | ------------------------------------------------------------ | +| 交集 | zinterstore destination numkeys key \[key ...] [weights weight [weight ...]] \[aggregate sum\|min\|max] | +| 并集 | zunionstore destination numkeys key \[key ...] [weights weight [weight ...]] \[aggregate sum\|min\|max] | + +- destination: 交集计算的结果保存到这个键。 +- numkeys: 需要做交集计算键的个数。 +- key[key...]: 需要做交集计算的键。 +- weights weight[weight...]: 每个键的权重, 在做交集计算时, 每个键中的每个 member 会将自己分数乘以这个权重, 每个键的权重默认是1。 +- aggregate sum|min|max: 计算成员交集后, 分值可以按照sum(和) 、min(最小值) 、 max(最大值) 做汇总, 默认值是 sum。 + +### 2.7 全局命令 + +1. 查看所有键: keys \* +2. 查看键总数:dbsize +3. 检查键是否存在:exists key +4. 删除键:del key [key ...] +5. 键过期:expire key seconds ,使用 ttl 命令可以查看键剩余的过期时间, 它有以下三种返回值: + - 大于等于0的整数: 键剩余的过期时间。 + - -1: 键未设置过期时间。 + - -2: 键不存在 +6. 查看键的数据类型:type key + +### 2.8 键过期 + +可以使用以下命令完成设置键的过期时间: + +- expire key seconds: 键在 seconds 秒后过期; +- expireat key timestamp: 键在秒级时间戳 timestamp 后过期; +- pexpire key milliseconds: 键在 milliseconds 毫秒后过期; +- pexpireat key milliseconds-timestamp:键在毫秒级时间戳 timestamp 后过期。 + +注意事项: + +- 如果 expire key 的键不存在, 返回结果为 0; +- 如果设置过期时间为负值, 键会立即被删除, 此时等价于 del 命令; +- persist key 命令可以将键的过期时间清除,使键变成永久的; +- 需要特别注意对于字符串类型键, 执行 set 命令会清除掉已有的过期时间; +- Redis 不支持对二级数据结构的内部元素设置过期时间, 例如不能对列表内的某个元素设置过期时间; +- setex 命令是 set+expire 的组合, 它是一个原子操作。 + +### 2.9 渐进式键遍历 + +使用 keys 命令遍历键可能会带来阻塞的风险,因为 Redis 提供了渐进式键遍历命令 scan ,使用格式如下: + +```shell +scan cursor [match pattern] [count number] +``` + +- cursor:游标,第一次遍历从 0 开始, 每次遍历完都会返回当前游标的值, 直到游标值为 0, 表示遍历结束。 +- match patternr:可选参数, 它的作用的是匹配特定模式的键; +- count numberr:可选参数, 它的作用是表明每次要遍历的键个数, 默认值是 10。 + +### 2.10 数据库管理 + +1.切换数据库:select dbIndex + +2.清除数据库:flushdb/flushall,flushdb只清除当前数据库, flushall会清除所有数据库。 + + diff --git a/notes/Redis_集群模式.md b/notes/Redis_集群模式.md index 86cf060..631ba40 100644 --- a/notes/Redis_集群模式.md +++ b/notes/Redis_集群模式.md @@ -1,5 +1,22 @@ # Redis Cluster + + ## 一、集群模式介绍 Redis Cluster 是 Redis 官方提供的分布式实现,在 Redis 3.0 版本正式推出,通过集群模式可以扩展单机的性能瓶颈,同时也可以通过横向扩展来实现扩容。此外,Redis 集群模式还提供了副本迁移机制,用于保证数据的安全和提高集群的容错能力,从而实现高可用。 @@ -12,15 +29,19 @@ Redis Cluster 采用虚拟槽进行分区,槽是集群内数据管理和迁移 HASH_SLOT = CRC16(key) mod 16384 ``` +假设现在有一个 6 个节点的集群,分别有 3 个 Master 点和 3 个 Slave 节点,槽会尽量均匀的分布在所有 Master 节点上。数据经过散列后存储在指定的 Master 节点上,之后 Slave 节点会进行对应的复制操作。这里再次说明一下槽只是一个虚拟的概念,并不是数据存放的实际载体。 + +
### 1.2 节点通讯 在 Redis 分布式架构中,每个节点都存储有整个集群所有节点的元数据信息,这是通过 P2P 的 Gossip 协议来实现的。集群中的每个节点都会单独开辟一个 TCP 通道,用于节点之间彼此通信,通信端口号在基础端口上加 10000;每个节点定期通过特定的规则选择部分节点发送 ping 消息,接收到 ping 信息的节点用 pong 消息作为响应,通过一段时间的彼此通信,最终所有节点都会达到一致的状态,每个节点都会知道整个集群全部节点的状态信息,从而到达集群状态同步的目的。 +
### 1.3 请求路由 #### 1. 请求重定向 -在集群模式下,Redis接收到命令时会先计算键对应的槽,然后根据槽找出对应的目标节点,如果目标节点就是此时所在的节点,则直接处理命令,否则返回 MOVED 重定向消息给客户端,通知客户端去正确的节点上执行操作。 +在集群模式下,Redis接收到命令时会先计算键对应的槽,然后根据槽找出对应的目标节点,如果目标节点就是此时所在的节点,则直接进行处理,否则返回 MOVED 重定向消息给客户端,通知客户端去正确的节点上执行操作。 #### 2. Smart 客户端 @@ -32,10 +53,157 @@ Redis 的大多数客户端都采用 Smart 客户端支持集群协议, Smart ASK 重定向与 MOVED 重定向的区别在于:收到 ASK 重定向时说明集群正在进行数据迁移, 客户端无法知道什么时候迁移完成,因此只是临时性的重定向, 客户端不会更新映射缓存。 但是 MOVED 重定向说明键对应的槽已经明确迁移到新的节点, 因此需要更新映射缓存。 -### 1.4 故障转移 +### 1.4 故障发现 +由于 Redis 集群的节点间都保持着定时通讯,某个节点向另外一个节点发送 ping 消息,如果正常接受到 pong 消息,此时会更新与该节点最后一次的通讯时间记录,如果之后无法正常接受到 pong 消息,并且判断当前时间与最后一次通讯的时间超过 `cluster-node-timeout` ,此时会对该节点做出主观下线的判断。 +当做出主观下线判断后,节点会把这个判断在集群内传播,通过 Gossip 消息传播, 集群内节点不断收集到故障节点的下线报告。 当半数以上持有槽的主节点都标记某个节点是主观下线时, 触发客观下线流程。 这里需要注意的是只有持有槽主节点才有权利做出主观下线的判断,因为集群模式下只有处理槽的主节点才负责读写请求和维护槽等关键信息, 而从节点只进行主节点数据和状态信息的复制。 + +### 1.5 故障恢复 + +#### 1. 资格检查 + +每个从节点都要检查最后与主节点断线时间, 判断是否有资格替换故障的主节点。 如果从节点与主节点断线时间超过 `cluster-node-time*cluster-slave-validity-factor`,则当前从节点不具备故障转移资格。 这两个参数可以在 `redis.conf` 中进行修改,默认值分别为 15000 和 10。 + +#### 2. 准备选举 + +当从节点符合故障转移资格后, 更新触发故障选举的时间, 只有到达该时间后才能执行后续流程。在这一过程中,Redis 会比较每个符合资格的从节点的复制偏移量,然后让复制偏移量大(即数据更加完整)的节点优先发起选举。 + +#### 3. 选举投票 + +从节点每次发起投票时都会自增集群的全局配置纪元,全局配置纪元是一个只增不减的整数。之后会在集群内广播选举消息,只有持有槽的主节点才会处理故障选举消息,并且每个持有槽的主节点在一个配置纪元内只有唯一的一张选票。假设集群内有 N 个持有槽的主节点,当某个从节点获得 N/2+1 张选票则代表选举成功。如果在开始投票之后的 `cluster-node-timeout*2` 时间内没有从节点获取足够数量的投票, 则本次选举作废,从节点会对配置纪元自增并发起下一轮投票, 直到选举成功为止。 + +#### 4. 替换主节点 + +当从节点收集到足够的选票之后,就会触发替换主节点操作: + ++ 当前从节点取消复制变为主节点。 ++ 执行 clusterDelSlot 操作撤销原主节点负责的槽, 并执行 clusterAddSlot 把这些槽委派给自己。 ++ 向集群广播自己的 pong 消息,通知集群内的其他节点自己已经成为新的主节点。 ## 二、集群模式搭建 -## 三、客户端连接 \ No newline at end of file +### 2.1 节点配置 + +拷贝6份 `redis.conf`,分别命名为 `redis-6479.conf` ~ `redis-6484.conf`,需要修改的配置项如下: + +```shell +# redis-6479.conf +port 6479 +# 以守护进程的方式启动 +daemonize yes +# 当Redis以守护进程方式运行时,Redis会把pid写入该文件 +pidfile /var/run/redis_6479.pid +logfile 6479.log +dbfilename dump-6479.rdb +dir /home/redis/data/ +# 开启集群模式 +cluster-enabled yes +# 节点超时时间,单位毫秒 +cluster-node-timeout 15000 +# 集群内部配置文件 +cluster-config-file nodes-6479.conf + + +# redis-6480.conf +port 6480 +daemonize yes +pidfile /var/run/redis_6480.pid +logfile 6480.log +dbfilename dump-6480.rdb +dir /home/redis/data/ +cluster-enabled yes +cluster-node-timeout 15000 +cluster-config-file nodes-6480.conf + +..... 其他配置类似,修改所有用到端口号的地方 +``` + +### 2.2 启动集群 + +启动所有 Redis 节点,启动后使用 `ps -ef | grep redis` 查看进程,输出应如下: + +
+接着需要使用以下命令创建集群,集群节点之间会开始进行通讯,并完成槽的分配: + +```shell +redis-cli --cluster create 127.0.0.1:6479 127.0.0.1:6480 127.0.0.1:6481 \ +127.0.0.1:6482 127.0.0.1:6483 127.0.0.1:6484 --cluster-replicas 1 +``` + +执行后输出如下:M 开头的表示持有槽的主节点,S 开头的表示从节点,每个节点都有一个唯一的 ID。最后一句输出表示所有的槽都已经分配到主节点上,此时代表集群搭建成功。 + +
+### 2.3 集群完整性校验 + +集群完整性指所有的槽都分配到存活的主节点上, 只要16384个槽中有一个没有分配给节点则表示集群不完整。 可以使用以下命令进行检测, check 命令只需要给出集群中任意一个节点的地址就可以完成整个集群的检查工作。 + +```shell +redis-cli --cluster check 127.0.0.1:6479 +``` + +### 2.4 关于版本差异的说明 + +如果你使用的是 Redis 5,可以和上面的示例一样,直接使用嵌入到 redis-cli 中的 Redis Cluster 命令来创建和管理集群。 + +如果你使用的是 Redis 3 或 4,则需要使用 redis-trib.rb 工具,此时需要预先准备 Ruby 环境和安装 redis gem。 + + + +## 三、集群伸缩 + +Redis 集群提供了灵活的节点扩容和缩容方案,可以在不影响集群对外服务的情况下,进行动态伸缩。 + +### 3.1 集群扩容 + +这里准备两个新的节点 6485 和 6486,配置和其他节点一致,配置完成后进行启动。集群扩容的命令为 `add-node`,第一个参数为需要加入的新节点,第二个参数为集群中任意节点,用于发现集群。 + +```shell +redis-cli --cluster add-node 127.0.0.1:6485 127.0.0.1:6479 +``` + +成功加入集群后,可以使用 `cluster nodes` 命令查看集群情况。不做任何特殊指定,默认加入集群的节点都是主节点,但是集群并不会为分配任何槽。如下图所示,其他 master 节点后面都有对应的槽的位置信息,但新加入的 6485 节点则没有,由于没有负责的槽,所以该节点此时不能进行任何读写操作。 + +```shell +redis-cli -h 127.0.0.1 -p 6479 cluster nodes +``` + +
+想要让新加入的节点能够进行读写操作,可以使用 `reshard` 命令为其分配槽,这里我们将其他三个主节点上的槽迁移一部分到 6485 节点上,这里一共迁移 4096 个槽,即 16384 除以 4 。 `cluster-from ` 用于指明槽的源节点,可以为多个,`cluster-to` 为槽的目标节点,`cluster-slots` 为需要迁移的槽的总数。 + +```shell +redis-cli --cluster reshard 127.0.0.1:6479 \ +--cluster-from fd35b17ace0f15314ed3b3d4f8ff4da08e11b89d,ebd0425db25b8bcf843fee9826755848e23a895a,98a175734db4a106ae676dc403f39b2783640789 \ +--cluster-to 819f867afd1da1acfb1a528d3efa91cffb02ba97 \ +--cluster-slots 4096 --cluster-yes +``` + +迁移后,再次使用 `cluster nodes` 命令可以查看到此时 6485 上已经有其他三个主节点上迁移过来的槽。 + +
+为保证高可用,可以为新加入的主节点添加从节点,命令如下。`add-node` 接收两个参数,第一个为需要添加的从节点,第二个参数为集群内任意节点,用于发现集群。`cluster-master-id` 参数用于指明作为哪个主节点的从节点,如果不加这个参数,则自动分配给从节点较少的主节点。 + +```shell +redis-cli --cluster add-node 127.0.0.1:6486 127.0.0.1:6479 --cluster-slave \ +--cluster-master-id 819f867afd1da1acfb1a528d3efa91cffb02ba97 +``` + +### 3.2 集群缩容 + +集群缩容的命令如下:第一个参数为集群内任意节点,用于发现集群;第二个参数为需要删除的节点。 + +``` +redis-cli --cluster del-node 127.0.0.1:6479 `` +``` + +需要注意的是待删除的主节点上必须为空,如果不为空则需要将它上面的槽和数据迁移到其他节点上,和扩容时一样,可以使用`reshard`命令来完成数据迁移。 + + + +## 参考资料 + +1. 付磊,张益军 . 《Redis 开发与运维》. 机械工业出版社 . 2017-3-1 +2. 官方文档:[Redis cluster tutorial](https://redis.io/topics/cluster-tutorial) + + + diff --git a/notes/installation/MongoDB单机环境搭建.md b/notes/installation/MongoDB单机环境搭建.md index 6024960..1f4ac8a 100644 --- a/notes/installation/MongoDB单机环境搭建.md +++ b/notes/installation/MongoDB单机环境搭建.md @@ -1,84 +1,91 @@ -# MongoDB 单机版本环境搭建 - -## 一、下载并解压 - -下载地址为: https://www.mongodb.com/download-center/community ,选择所需版本的 MongoDB 后进行下载: - -![mongodb-version-select](D:\Full-Stack-Notes\pictures\mongodb-version-select.png) - -这里我下载的版本为 `4.0.10` , 安装环境为 `RHEL 7.0`,下载后进行解压: - -```shell - tar -zxvf mongodb-linux-x86_64-rhel70-4.0.10.tgz -C /usr/app -``` - -## 二、配置环境变量 - -配置环境变量: - -```shell -vi /etc/profile -``` - - - -```shell -export MONGODB_HOME=/usr/app/mongodb-linux-x86_64-rhel70-4.0.10/ -export PATH=${MONGODB_HOME}/bin:$PATH -``` - -使得配置的环境变量立即生效: - -```shell -source /etc/profile -``` - -## 三、修改配置 - -MongoDB 默认存放数据的目录为 `/var/lib/mongo` ,默认存放日志的目录为 `/var/log/mongodb`,采用 TGZ 安装包进行安装时,程序不会自动创建这两个目录,需要预先手动创建。同时由于 `/var/` 下只能存放临时文件,所以这里我们使用其他目录进行存储,命令如下: - -```shell -mkdir -p /home/mongodb/data -mkdir -p /home/mongodb/log -``` - -修改配置,采用 TGZ 安装包进行安装时,程序不会自动创建配置文件,需要手动创建: - -``` -vim /etc/mongod.conf -``` - -在配置文件中增加如下配置,这里的配置采用的是 YAML 的格式: - -```shell -systemLog: - destination: file - path: "/home/mongodb/log/mongod.log" - logAppend: true -storage: - dbPath: "/home/mongodb/data" -net: - port: 27017 - # 如果不修改绑定IP,默认只能在本机访问数据库服务 - bindIp: 0.0.0.0 -``` - -> MongoDB 的所有配置项可以参考其官方文档:[Configuration File Options](https://docs.mongodb.com/manual/reference/configuration-options/) - -## 四、启动服务 - -由于已经配置过环境变量,这里直接启动即可,命令如下: - -```shell -mongod -f /etc/mongod.conf -``` - -## 五、连接服务 - -这里直接使用 mongo shell 进行连接,mongo shell 默认就是连接到本地的 `27017` 端口,所以直接启动即可: - -```shell -mongo -``` +# MongoDB 单机版本环境搭建 + +## 一、下载并解压 + +下载地址为: https://www.mongodb.com/download-center/community ,选择所需版本的 MongoDB 后进行下载: + +
+ +这里我下载的版本为 `4.0.10` , 安装环境为 `RHEL 7.0`,下载后进行解压: + +```shell + tar -zxvf mongodb-linux-x86_64-rhel70-4.0.10.tgz -C /usr/app +``` + +## 二、配置环境变量 + +配置环境变量: + +```shell +vi /etc/profile +``` + + + +```shell +export MONGODB_HOME=/usr/app/mongodb-linux-x86_64-rhel70-4.0.10/ +export PATH=${MONGODB_HOME}/bin:$PATH +``` + +使得配置的环境变量立即生效: + +```shell +source /etc/profile +``` + +## 三、修改配置 + +MongoDB 默认存放数据的目录为 `/var/lib/mongo` ,默认存放日志的目录为 `/var/log/mongodb`,采用 TGZ 安装包进行安装时,程序不会自动创建这两个目录,需要预先手动创建。同时由于 `/var/` 下只能存放临时文件,所以这里我们使用其他目录进行存储,命令如下: + +```shell +mkdir -p /home/mongodb/data +mkdir -p /home/mongodb/log +``` + +修改配置,采用 TGZ 安装包进行安装时,程序不会自动创建配置文件,需要手动创建: + +``` +vim /etc/mongod.conf +``` + +在配置文件中增加如下配置,这里的配置采用的是 YAML 的格式: + +```shell +systemLog: + destination: file + path: "/home/mongodb/log/mongod.log" + logAppend: true +storage: + dbPath: "/home/mongodb/data" +net: + port: 27017 + # 如果不修改绑定IP,默认只能在本机访问数据库服务 + bindIp: 0.0.0.0 +``` + +> MongoDB 的所有配置项可以参考其官方文档:[Configuration File Options](https://docs.mongodb.com/manual/reference/configuration-options/) + +## 四、启动服务 + +由于已经配置过环境变量,这里直接启动即可,命令如下: + +```shell +mongod -f /etc/mongod.conf +``` + +## 五、连接服务 + +这里直接使用 mongo shell 进行连接,mongo shell 默认就是连接到本地的 `27017` 端口,所以直接启动即可: + +```shell +mongo +``` + 成功进入交互式命令行则代表启动成功。 \ No newline at end of file diff --git a/notes/installation/RabbitMQ单机环境搭建.md b/notes/installation/RabbitMQ单机环境搭建.md index a166910..81fe1e5 100644 --- a/notes/installation/RabbitMQ单机环境搭建.md +++ b/notes/installation/RabbitMQ单机环境搭建.md @@ -1,169 +1,186 @@ -# RabbitMQ 单机环境搭建 +# RabbitMQ 单机环境搭建 + -## 一、前置条件 - -RabbitMQ 由 Erlang 语言所编写,所以在安装 RabbitMQ 前需要安装 Erlang 。两者的版本兼容关系如下。本篇文章选用的 RabbitMQ 版本为 3.7.15 , Erlang 版本为 22.0 。 - -| RabbitMQ version | Minimum required Erlang/OTP | Maximum supported Erlang/OTP | -| :----------------------------------------------------------- | :-------------------------- | :--------------------------- | -| 3.7.15 | 20.3.x | 22.0.x | -| 3.7.7 ~ 3.7.14 | 20.3.x | 21.3.x | -| 3.7.0 ~ 3.7.6 | 19.3 | 20.3.x | - -> 表格来源:https://www.rabbitmq.com/which-erlang.html - - - -## 二、Erlang 安装 - -### 2.1 下载并解压 - -Erlang 源码包下载地址:http://erlang.org/download/ ,下载后进行解压: - -```shell -# 下载 -wget http://erlang.org/download/otp_src_22.0.tar.gz -# 解压 -tar -zxvf otp_src_22.0.tar.gz -``` - -### 2.2 编译和安装 - -Erlang 的编译过程中使用到了 `ncurses-devel` 库,需要预先安装: - -``` -yum install ncurses-devel -``` - -进入解压后的根目录: - -```shell -# 配置安装目录 -./configure --prefix=/usr/app/erlang -# 编译 -make -# 安装 -make install -``` - -### 2.3 验证安装结果 - -进入安装目录的 bin 目录下,执行 `erl`命令,出现对应的版本号信息则代表安装成功: - -```shell -[root@hadoop001 bin]# ./erl -Erlang/OTP 22 [erts-10.4] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] -Eshell V10.4 (abort with ^G) -``` - -### 2.4 配置环境变量 - -```she -vim /etc/profile -``` - -配置环境变量: - -```shell -export ERLANG_HOME=/usr/app/erlang -export PATH=$PATH:$ERLANG_HOME/bin -``` - -使得配置的环境变量立即生效: - -```shell -source /etc/profile -``` - - - -## 三、RabbitMQ 安装 - -### 3.1 下载并解压 - -从 RabbitMQ 的 GitHub 仓库进行下载,地址为:https://github.com/rabbitmq/rabbitmq-server/releases/ : - -```shell -# 下载 -wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.15/rabbitmq-server-generic-unix-3.7.15.tar.xz -# 解压 -tar -Jxf rabbitmq-server-generic-unix-3.7.15.tar.xz - -``` - -### 3.2 配置环境变量 - -```she -vim /etc/profile -``` - -配置环境变量: - -```shell -export RABBITMQ_HOME=/usr/app/rabbitmq_server-3.7.15 -export PATH=$PATH:$RABBITMQ_HOME/sbin -``` - -使得配置的环境变量立即生效: - -```shell -source /etc/profile -``` - -### 3.3 启动 RabbitMQ 服务 - -以后台守护进程的方式启动 RabbitMQ ,命令如下: - -```shell -rabbitmq-server start -detached -``` - -### 3.4 查看服务状态 - -```shell -rabbitmqctl status -``` - - - -## 四、Web UI界面 - -### 4.1 启动 Web UI - -想要使用 RabbitMQ 的 Web UI 界面,需要启动管理插件,命令如下: - -```shell -rabbitmq-plugins enable rabbitmq_management -``` - -访问端口为 `15672`。默认的用户名和密码都是 `guest` 。如果你所用浏览器和 RabbitMQ 服务不在同一台主机上,此时应该无法登录,并出现下面的提示 : - -![RabbitMQ-访问限制](D:\Full-Stack-Notes\pictures\RabbitMQ-访问限制.png) - -之所以会出现这个提示,是因为出于安全考虑,RabbitMQ 只允许在本机使用默认的`guest`用户名登录。想要在其他主机上登录,可以使用自定义的账户。 - -### 4.2 新增账户 - -新增用户,用户名和密码都是 root : - -```sh -rabbitmqctl add_user root root -``` - -赋予用户在默认的名为 `/` 的 Virtual Host 上的所有权限: - -```shell -rabbitmqctl set_permissions -p / root '.*' '.*' '.*' -``` - -设置用户的角色为管理员: - -``` -rabbitmqctl set_user_tags root administrator -``` - -### 4.3 使用新账户登录 - -登录后可以查看到RabbitMQ 和 Erlang 的版本号,以及对应的账户信息: - -![rabbitmq-管控台](D:\Full-Stack-Notes\pictures\rabbitmq-管控台.png) \ No newline at end of file +## 一、前置条件 + +RabbitMQ 由 Erlang 语言所编写,所以在安装 RabbitMQ 前需要安装 Erlang 。两者的版本兼容关系如下。本篇文章选用的 RabbitMQ 版本为 3.7.15 , Erlang 版本为 22.0 。 + +| RabbitMQ version | Minimum required Erlang/OTP | Maximum supported Erlang/OTP | +| :----------------------------------------------------------- | :-------------------------- | :--------------------------- | +| 3.7.15 | 20.3.x | 22.0.x | +| 3.7.7 ~ 3.7.14 | 20.3.x | 21.3.x | +| 3.7.0 ~ 3.7.6 | 19.3 | 20.3.x | + +> 表格来源:https://www.rabbitmq.com/which-erlang.html + + + +## 二、Erlang 安装 + +### 2.1 下载并解压 + +Erlang 源码包下载地址:http://erlang.org/download/ ,下载后进行解压: + +```shell +# 下载 +wget http://erlang.org/download/otp_src_22.0.tar.gz +# 解压 +tar -zxvf otp_src_22.0.tar.gz +``` + +### 2.2 编译和安装 + +Erlang 的编译过程中使用到了 `ncurses-devel` 库,需要预先安装: + +``` +yum install ncurses-devel +``` + +进入解压后的根目录: + +```shell +# 配置安装目录 +./configure --prefix=/usr/app/erlang +# 编译 +make +# 安装 +make install +``` + +### 2.3 验证安装结果 + +进入安装目录的 bin 目录下,执行 `erl`命令,出现对应的版本号信息则代表安装成功: + +```shell +[root@hadoop001 bin]# ./erl +Erlang/OTP 22 [erts-10.4] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] +Eshell V10.4 (abort with ^G) +``` + +### 2.4 配置环境变量 + +```she +vim /etc/profile +``` + +配置环境变量: + +```shell +export ERLANG_HOME=/usr/app/erlang +export PATH=$PATH:$ERLANG_HOME/bin +``` + +使得配置的环境变量立即生效: + +```shell +source /etc/profile +``` + + + +## 三、RabbitMQ 安装 + +### 3.1 下载并解压 + +从 RabbitMQ 的 GitHub 仓库进行下载,地址为:https://github.com/rabbitmq/rabbitmq-server/releases/ : + +```shell +# 下载 +wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.15/rabbitmq-server-generic-unix-3.7.15.tar.xz +# 解压 +tar -Jxf rabbitmq-server-generic-unix-3.7.15.tar.xz + +``` + +### 3.2 配置环境变量 + +```she +vim /etc/profile +``` + +配置环境变量: + +```shell +export RABBITMQ_HOME=/usr/app/rabbitmq_server-3.7.15 +export PATH=$PATH:$RABBITMQ_HOME/sbin +``` + +使得配置的环境变量立即生效: + +```shell +source /etc/profile +``` + +### 3.3 启动 RabbitMQ 服务 + +以后台守护进程的方式启动 RabbitMQ ,命令如下: + +```shell +rabbitmq-server start -detached +``` + +### 3.4 查看服务状态 + +```shell +rabbitmqctl status +``` + + + +## 四、Web UI界面 + +### 4.1 启动 Web UI + +想要使用 RabbitMQ 的 Web UI 界面,需要启动管理插件,命令如下: + +```shell +rabbitmq-plugins enable rabbitmq_management +``` + +访问端口为 `15672`。默认的用户名和密码都是 `guest` 。如果你所用浏览器和 RabbitMQ 服务不在同一台主机上,此时应该无法登录,并出现下面的提示 : + +
+ +之所以会出现这个提示,是因为出于安全考虑,RabbitMQ 只允许在本机使用默认的`guest`用户名登录。想要在其他主机上登录,可以使用自定义的账户。 + +### 4.2 新增账户 + +新增用户,用户名和密码都是 root : + +```sh +rabbitmqctl add_user root root +``` + +赋予用户在默认的名为 `/` 的 Virtual Host 上的所有权限: + +```shell +rabbitmqctl set_permissions -p / root '.*' '.*' '.*' +``` + +设置用户的角色为管理员: + +``` +rabbitmqctl set_user_tags root administrator +``` + +### 4.3 使用新账户登录 + +登录后可以查看到RabbitMQ 和 Erlang 的版本号,以及对应的账户信息: + +
\ No newline at end of file diff --git a/notes/《Redis开发与运维》读书笔记.md b/notes/《Redis开发与运维》读书笔记.md deleted file mode 100644 index 514938f..0000000 --- a/notes/《Redis开发与运维》读书笔记.md +++ /dev/null @@ -1,726 +0,0 @@ -# 《Redis开发与运维》读书笔记 - -## 目录
-第二章 API的理解与使用
-    2.1 预备
-        2.1.1 全局命令
-        2.1.2 数据结构和内部编码
-        2.1.3 单线程架构
-    2.2 字符串
-    2.3 哈希
-    2.4 列表
-    2.5 集合
-    2.6 有序集合
-    2.7 键管理
-        2.7.1 单个键管理
-            1.键重命名
-            2. 随机返回键
-            3.键过期
-        2.7.2 键遍历
-            1. 全量键遍历
-            2. 渐进式遍历
-        2.7.3 数据库管理
-            1.切换数据库
-            2.flushdb/flushall
-第三章 小功能 大用处
-    3.1 慢查询分析
-        3.1.1 慢查询的两个配置参数
-    3.2 redis shell
-        3.2.1 redis-cli
-        3.2.2 redis-server
-        3.2.3 redis-benchmark
-    3.3 Pipeline
-    3.4 事务与Lua
-    3.5 Bitmaps
-    3.6 HyperLogLog
-    3.7 发布订阅
-    3.8 GEO
-第四章 客户端
-    4.4 客户端管理
-        4.4.1 客户端API
-        4.4.2 客户端相关配置
-        4.4.3 客户端统计片段
-第五章 持久化
-    5.1 RDB
-    5.2 AOF
-第六章 复制
-    6.1 配置
-        6.1.1 建立复制
-        6.1.2 断开复制
-        6.1.3 传输延迟
-第十章 集群
-    10.1 数据分区
-    10.2 搭建集群
-    10.4 集群扩容
-        10.4.2 扩容集群
-        10.4.3 收缩集群
-附:[CacheCloud GitHub](https://github.com/sohutv/cachecloud)
-## 正文
- - -## 第二章 API的理解与使用 - -### 2.1 预备 - -#### 2.1.1 全局命令 - -1. 查看所有键: **keys \*** - -2. 查看键总数:**dbsize** - -3. 检查键是否存在:**exists key** - -4. 删除键:**del key [key ...]** 支持删除多个键 - -5. 键过期:**expire key seconds** - - ttl命令会返回键的剩余过期时间, 它有3种返回值: - - - 大于等于0的整数: 键剩余的过期时间。 - - -1: 键没设置过期时间。 - - -2: 键不存在 - -6. 键的数据结构 **type key** - -#### 2.1.2 数据结构和内部编码 - -type命令实际返回的就是当前键的数据结构类型, 它们分别是:**string**(字符串) 、 **hash**(哈希) 、 **list**(列表) 、 **set**(集合) 、 **zset**(有序集合) - -#### 2.1.3 单线程架构 - -1. 纯内存访问, Redis将所有数据放在内存中, 内存的响应时长大约为100纳秒, 这是Redis达到每秒万级别访问的重要基础。 -2. 非阻塞I/O, Redis使用epoll作为I/O多路复用技术的实现, 再加上Redis自身的事件处理模型将epoll中的连接、 读写、 关闭都转换为事件, 不在网络I/O上浪费过多的时间, 如图2-6所示。 -3. 单线程避免了线程切换和竞态产生的消耗。 - -### 2.2 字符串 - -| 作用 | 格式 | 参数或示例 | -| ---------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -| 设置值 | set key value \[ex seconds]\[px milliseconds][nx\|xx] setnx setex | ex seconds: 为键设置秒级过期时间。
px milliseconds: 为键设置毫秒级过期时间。
nx: 键必须不存在, 才可以设置成功, 用于添加。
xx: 与nx相反, 键必须存在, 才可以设置成功, 用于更新。 | -| 获取值 | get key | r如果获取的键不存在 ,则返回nil(空) | -| 批量设置 | mset key value [key value ...] | mset a 1 b 2 c 3 d 4 | -| 批量获取值 | mget key [key ...] | mget a b c d | -| 计数 | incr key decr key incrby key increment(指定数值自增)
decrby key decrement(指定数值自减)
incrbyfloat key increment (浮点数自增) | 值不是整数, 返回错误。 值是整数, 返回自增或自减后的结果。
键不存在,创建键,并按照值为0自增或自减, 返回结果为1。 | -| 追加值 | append key value | 向字符串的默认追加值 | -| 字符串长度 | strlen key | 获取字符串长度,中文占用三个字节 | -| 设置并返回原值 | getset key value | | -| 设置指定位置的租字符串 | setrange key offeset value | | -| 获取部分字符串 | getrange key start end | | - -### 2.3 哈希 - -| 作用 | 格式 | 参数或示例 | -| ------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -| 设置值 | hset key field value | hset user:1 name tom
hset user:1 age 12 | -| 获取值 | hget key field | hget user:1 name | -| 删除field | hdel key field [field ...] | | -| 计算field个数 | hlen key | | -| 批量设置或获取field-value | hmget key field [field]
hmset key field value [field value...] | hmset user:1 name mike age 12 city tianjin
hmget user:1 name city | -| 判断field是否存在 | hexists key field | | -| 获取所有field | hkeys key | | -| 获取所有value | hvals key | | -| 获取所有的filed-value | hgetall key | 如果哈希元素个数比较多, 会存在阻塞Redis的可能。
获取全部 可以使用hscan命令, 该命令会渐进式遍历哈希类型 | -| 计数 | hincrby key field
hincrbyfloat key field | | - -### 2.4 列表 - -| 作用 | 格式 | 参数或示例 | -| -------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -| 增 | 左侧插入:lpush key value [value ...]
右侧插入:rpush key value [value ...]
某个指定元素前后插入:linsert key before\|after pivot value | | -| 查 | 获取指定范围内的元素列表:lrange key start end
获取列表指定索引下标的元素:lindex key index
获取列表指定长度:llen key | lrange listkey 0 -1 | -| 删 | 从列表左侧弹出元素:lpop key
从列表右侧弹出元素:rpop key
删除指定元素:lrem key count value
截取列表:ltrim key start end | count>0, 从左到右, 删除最多count个元素。
count<0, 从右到左, 删除最多count绝对值个元素。
count=0, 删除所有 | -| 改 | 修改指定索引下标的元素:lset key index newValue | | -| 阻塞操作 | blpop key [key ...] timeout
brpop key [key ...] timeout | key[key...]: 多个列表的键。 timeout: 阻塞时间\|等待时间(单位: 秒) | - - - -### 2.5 集合 - -集合(set) 类型也是用来保存多个的字符串元素, 但和列表类型不一样的是, **集合中不允许有重复元素**, 并且集合中的元素是无序的, **不能通过索引下标获取元素**。 - -**集合内操作**: - -| 作用 | 格式 | 参数或示例 | -| -------------------- | ------------------------------ | ----------------------------------------- | -| 添加元素 | sadd key element [element ...] | 返回结果为添加成功的元素个数 | -| 删除元素 | srem key element [element ...] | 返回结果为成功删除的元素个数 | -| 计算元素个数 | scard key | | -| 判断元素是否在集合中 | sismember key element | | -| 随机返回 | srandmember key [count] | 随机从集合返回指定个数元素,count 默认为1 | -| 从集合随机弹出元素 | spop key | srandmember 不会从集合中删除元素,spop 会 | -| 获取集合中所有元素 | smembers key | 可用sscan 代替 | - -**集合间操作**: - -| 作用 | 格式 | -| ---------------------------- | ------------------------------------------------------------ | -| 求多个集合的交集 | sinter key [key ...] | -| 求多个集合的并集 | suinon key [key ...] | -| 求多个集合的差集 | sdiff key [key ...] | -| 将交集、并集、差集的结果保存 | sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...] | - -### 2.6 有序集合 - -有序集合中的元素可以排序。 但是它和列表使用索引下标作为排序依据不同的是, 它给每个元素设置一个分数(score) 作为排序的依据。 - -**集合内操作**: - -| 作用 | 格式 | 参数或示例 | -| ------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| 添加成员 | zadd key score member [score member ...] | nx: member必须不存在, 才可设置成功, 用于添加。
xx: member必须存在, 才可以设置成功, 用于更新。
ch: 返回此次操作后, 有序集合元素和分数发生变化的个数
incr: 对score做增加, 相当于后面介绍的zincrby。 | -| 计算成员个数 | zcard key | | -| 计算某个成员的分数 | zscore key member | | -| 计算某个成员的排名 | zrank key member zrevrank key member | zrank是从分数从低到高返回排名, zrevrank反之。 | -| 删除成员 | zrem key member [member ...] | | -| 增加成员分数 | zincrby key increment member | zincrby user:ranking 9 tom | -| 返回指定排名范围的成员 | zrange key start end [withscores] zrange key start end [withscores] | zrange是从低到高返回, zrevrange反之。 | -| 返回指定分数范围内的成员 | zrangebyscore key min max \[withscores][limit offset count]
zrevrangebyscore key max min \[withscores][limit offset count] | 其中zrangebyscore按照分数从低到高返回, zrevrangebyscore反之。 [limit offset count]选项可以限制输出的起始位置和个数: 同时min和max还支持开区间(小括号) 和闭区间(中括号) , -inf和+inf分别代表无限小和无限大 | -| 删除指定排名内的升序元素 | zremrangerank key start end | | -| 删除指定分数范围的成员 | zremrangebyscore key min max | | - -**集合间操作**: - -| 作用 | 格式 | -| ---- | ------------------------------------------------------------ | -| 交集 | zinterstore destination numkeys key \[key ...] [weights weight [weight ...]] \[aggregate sum\|min\|max] | -| 并集 | zunionstore destination numkeys key \[key ...] [weights weight [weight ...]] \[aggregate sum\|min\|max] | - -- destination: 交集计算结果保存到这个键。 -- numkeys: 需要做交集计算键的个数。 -- key[key...]: 需要做交集计算的键。 -- weights weight[weight...]: 每个键的权重, 在做交集计算时, 每个键中的每个member会将自己分数乘以这个权重, 每个键的权重默认是1。 -- aggregate sum|min|max: 计算成员交集后, 分值可以按照sum(和) 、min(最小值) 、 max(最大值) 做汇总, 默认值是sum。 - -### 2.7 键管理 - -#### 2.7.1 单个键管理 - -##### 1.键重命名 - -**rename key newkey** - - 为了防止被强行rename, Redis提供了renamenx命令, 确保只有newKey不存在时候才被覆盖。 - -##### 2. 随机返回键 - - **random key** - -##### 3.键过期 - -- expire key seconds: 键在seconds秒后过期。 -- expireat key timestamp: 键在秒级时间戳timestamp后过期。 -- pexpire key milliseconds: 键在milliseconds毫秒后过期。 -- pexpireat key milliseconds-timestamp键在毫秒级时间戳timestamp后过期 - -注意: - -1. 如果expire key的键不存在, 返回结果为0 -2. 如果设置过期时间为负值, 键会立即被删除, 犹如使用del命令一样 -3. persist key t命令可以将键的过期时间清除 -4. 对于字符串类型键, 执行set命令会去掉过期时间, 这个问题很容易在开发中被忽视 -5. Redis不支持二级数据结构(例如哈希、 列表) 内部元素的过期功能, 例如不能对列表类型的一个元素做过期时间设置 -6. setex命令作为set+expire的组合, 不但是原子执行, 同时减少了一次网络通讯的时间 - -#### 2.7.2 键遍历 - -##### 1. 全量键遍历 - -**keys pattern** - -##### 2. 渐进式遍历 - -scan cursor \[match pattern] \[count number] - -- cursor是必需参数, 实际上cursor是一个游标, 第一次遍历从0开始, 每次scan遍历完都会返回当前游标的值, 直到游标值为0, 表示遍历结束。 -- match pattern是可选参数, 它的作用的是做模式的匹配, 这点和keys的模式匹配很像。 -- count number是可选参数, 它的作用是表明每次要遍历的键个数, 默认值是10, 此参数可以适当增大。 - -#### 2.7.3 数据库管理 - -##### 1.切换数据库 - -**select dbIndex** - -##### 2.flushdb/flushall - -flushdb/flushall命令用于清除数据库, 两者的区别的是flushdb只清除当前数据库, flushall会清除所有数据库。 - - - -## 第三章 小功能 大用处 - -### 3.1 慢查询分析 - -#### 3.1.1 慢查询的两个配置参数 - -```shell -# 设置慢查询阈值 耗时高于阈值的操作将被记录 -config set slowlog-log-slower-than 20000 -# 设置慢查询维护日志的记录长度 -config set slowlog-max-len 1000 -# 将配置持久化到本地配置文件 -config rewrite - -# 获取慢查询日志 -slowlog get [n] -# 获取慢查询日志当前的长度 -slowlog len -# 慢查询日志重置 -slowlog reset -``` - - - -### 3.2 redis shell - -#### 3.2.1 redis-cli - -```shell -# 1. -r (repeat)选项代表将执行多次命令 -redis-cli -r 3 ping - -# 2. -i (interval) 选项代表每隔几秒执行一次命令 -redis-cli -r 5 -i 1 ping - -# 3. -x 选项代表从标准输入(stdin)读取数据作为redis-cli 的最后一个参数 -echo "world" | redis-cli -x set hello - -# 4. --salve 选项是把当前客户端模拟成当前Redis节点的从节点,可以用来获取当前Redis节点的更新操作 -redis-cli --salve - -# 5. --stat 选项可以实时获取Redis的重要统计信息 -redis-cli --stat - -# --no-raw 选项要求命令的返回结果必须是原始的格式 -# --raw 返回格式化之后的结果 -$ redis-cli set hello "你好" -$ redis-cli get hello - "\xe4\xbd\xa0\xe5\xa5\xbd" -$redis-cli --no-raw get hello - "\xe4\xbd\xa0\xe5\xa5\xbd" -$redis-cli --raw get hello - 你好 -``` - -#### 3.2.2 redis-server - -```shell -# --test-memory 选项用来检测当前操作系统能否稳定地分配指定容量给Redis -redis-server --test-memory 1024 -``` - -#### 3.2.3 redis-benchmark - -```shell -# 1. -c (client) 选项代表客户端的并发数量(默认是50) -# 2. -n (num)选项代表客户端请求总量(默认是100000) -redis-benchmark -c 100 -n 20000 代表100个客户端同时请求Redis,一共执行20000次 - -# 3.-q 选项仅仅显示 redis-benchmark 的 requests per second 信息 -redis-benchmark -c 100 -n 20000 -g - -# 4.-r 执行 redis-benchmark 的时候插入更多随机的键 -redis-benchmark -c 100 -n 20000 -r 10000 -# -r 选项会在key,count键上加一个12位的后缀,-r 10000 代表只对后四位做随机处理(-r 不是随机数的个数) - -# 5.-P选项代表每个请求pipeline的数据量(默认为1) - -# 6.-k -# -k 选项代表客户端是否使用keepalive,1为使用,0为不使用,默认值为 1。 - -# 7.-t 选项可以对指定命令进行基准测试 -redis-benchmark -t get,set -q - -# 8.--csv 选项会将结果按照csv格式输出,便于后续处理 -``` - - - -### 3.3 Pipeline - -原生批量命令与Pipeline对比 : - -- 原生批量命令是原子的, Pipeline是非原子的。 -- 原生批量命令是一个命令对应多个key, Pipeline支持多个命令。 -- 原生批量命令是Redis服务端支持实现的, 而Pipeline需要服务端和客户端的共同实现。 - - - -### 3.4 事务与Lua - -1. **multi**命令代表事务开始, **exec**命令代表事务结束 ,如果要停止事务的执行, 可以使用**discard**命令代替exec命令即可。 -2. **Redis并不支持回滚功能** 。 -3. 有些应用场景需要在事务之前, 确保事务中的key没有被其他客户端修改过, 才执行事务, 否则不执行(类似乐观锁) , Redis提供了**watch**命令来解决这类问题 。 - - - -### 3.5 Bitmaps - -```shell -# 1.设置值 -setbit key offset value - -# 2.获取值 -getbit key offset - -# 3.获取BitMaps指定范围值为1的个数 -bitcount [start][end] - -# 4.Bitmaps 间的运算 -bitop op destkey key[key...] -# op 可以为 and (交集)、or(并集)、not(非)、xor(异或)操作 - -# 计算Bitmaps中第一个值为targetBit的偏移量 -bitpos key tartgetBit [start] [end] -``` - -### 3.6 HyperLogLog - -通过HyperLogLog可以利用极小的内存空间完成独立总数的统计 。 - -```shell -# 1.添加 -pfadd key element [element …] - -# 2.计算独立用户数 -pfcount key [key …] - -# 3.合并 -pfmerge destkey sourcekey [sourcekey ...] -``` - -### 3.7 发布订阅 - -```shell -# 1. 发布消息 -publish channel message - -# 2.订阅消息 -subscribe channel [channel ...] - -# 3.取消订阅 -unsubscribe [channel [channel ...]] - -# 4.按照模式订阅和取消订阅 -psubscribe pattern [pattern...] -punsubscribe [pattern [pattern ...]] - -# 查看活跃的频道(指当前频道至少有一个订阅者) -pubsub channels [pattern] - -# 查看频道订阅数 -pubsub numsub [channel ...] - -# 查看模式订阅数 -pubsub numpat -``` - -### 3.8 GEO - -``` -# 1.增加地理位置信息 -geoadd key longitude latitude member [longitude latitude member ...] -geoadd cities:locations 116.28 39.55 beijing - -# 2.获取地理位置信息 -geopos key member [member ...] -geopos cities:locations tianjin - -# 删除地理位置信息 -zrem key member -``` - - - -## 第四章 客户端 - -### 4.4 客户端管理 - -#### 4.4.1 客户端API - -**1.client list** - -```shell -127.0.0.1:6379> client list -id=1610 addr=10.0.2.2:58879 fd=9 name= age=2169 idle=1590 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=scan -id=1612 addr=10.0.2.2:59560 fd=10 name=heibairuiwen age=1642 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client -``` - -| 参数 | 含义 | -| --------- | ------------------------------------------------------------ | -| id | 客户端连接id | -| addr | 客户端连接IP和端口 | -| fd | socket 的文件描述符 | -| name | 客户端连接名
client setName 设置当前客户端名字;
client getName 获取当前客户端名字 | -| age | 客户端连接存活时间 | -| idle | 客户端连接空闲时间 | -| flags | 客户端类型类型标识 | -| db | 当前客户端正在使用的数据库索引下标 | -| sub/psub | 当前客户端订阅的频道或者模式 | -| multi | 当前事务中已执行命令个数 | -| qbuf | 输入缓冲区总容量
输入缓冲区会根据内容动态调整,但大小不能超过1G | -| qbuf-free | 输入缓冲区剩余容量 | -| obl | 输出固定缓冲区的长度 | -| oll | 输出动态缓冲区列表长度 | -| omem | 固定缓冲区和动态缓冲区使用的容量。输出缓冲区的容量控制:
client-output-buffer-limit \ \ \ \
\: 客户端类型分为三种。normal: 普通客户端;slave: slave客户端, 用于复制;pubsub: 发布订阅客户端。
\: 如果客户端使用的输出缓冲区大于\, 客户端会被立即关闭。
\和\: 如果客户端使用的输出缓冲区超过了\并且持续了\秒, 客户端会被立即关闭。
示例:client-output-buffer-limit normal 20mb 10mb 120 | -| events | 文件描述符事作件(r/w): r 和 w 分别代表客户端套接字可读和可写 | -| cmd | 当前客户端最后一次执行的命令,不包含参数 | -**2.客户端的限制maxclients和timeout** - -Redis提供了maxclients参数来限制最大客户端连接数, 一旦连接数超过maxclients, 新的连接将被拒绝。 maxclients默认值是10000, 可以通过info clients来查询当前Redis的连接数。 - -可以通过config set maxclients对最大客户端连接数进行动态设置。 - -**3.client kill** - -client kill ip:port 此命令用于杀掉指定IP地址和端口的客户端。 - -**4.client pause** - -client pause timeout(毫秒) client pause命令用于阻塞客户端timeout毫秒数, 在此期间客户端连接将被阻塞。 - -**5.monitor** - -monitor命令用于监控Redis正在执行的命令。monitor命令能够监听其他客户端正在执行的命令, 并记录了详细的时间戳。 - -#### 4.4.2 客户端相关配置 - -1. **timeout**: 检测客户端空闲连接的超时时间, 一旦idle时间达到了timeout, 客户端将会被关闭, 如果设置为0就不进行检测。 -2. **tcp-keepalive**: 检测TCP连接活性的周期, 默认值为0, 也就是不进行检测, 如果需要设置, 建议为60, 那么Redis会每隔60秒对它创建的TCP连接进行活性检测, 防止大量死连接占用系统资源。 -3. **tcp-backlog**: TCP三次握手后, 会将接受的连接放入队列中, tcpbacklog就是队列的大小, 它在Redis中的默认值是511。 - -#### 4.4.3 客户端统计片段 - -**info clients** - -1. **connected_clients**: 代表当前Redis节点的客户端连接数, 需要重点监控, 一旦超过maxclients, 新的客户端连接将被拒绝。 -2. **client_longest_output_list**: 当前所有输出缓冲区中队列对象个数的最大值。 -3. **client_biggest_input_buf**: 当前所有输入缓冲区中占用的最大容量。 -4. **blocked_clients**: 正在执行阻塞命令(例如blpop、 brpop、brpoplpush) 的客户端个数。 - - - -## 第五章 持久化 - -### 5.1 RDB - -RDB 持久化是把当前进程数据生成快照保存到硬盘的过程。触发RBD持久化的过程分为手动触发和自动触发。 - -**手动触发**: - -```shell -# 手动触发(阻塞) -save -# 手动触发(非阻塞) -bgsave -``` - -**自动触发**: - -1. 使用save相关配置, 如“save m n”。 表示m秒内数据集存在n次修改时, 自动触发bgsave。 -2. 如果从节点执行全量复制操作, 主节点自动执行bgsave生成RDB文件并发送给从节点。 -3. 执行debug reload命令重新加载Redis时, 也会自动触发save操作。 -4. 默认情况下执行shutdown命令时, 如果没有开启AOF持久化功能则自动执行bgsave。 - -**保存**: - - RDB文件保存在dir配置指定的目录下, 文件名通过**dbfilename**配置指定。 可以通过执行**config set dir{newDir}**和**config setdbfilename{newFileName}**运行期动态执行, 当下次运行时RDB文件会保存到新目录。 - -**缺点**: - -无法做到实时持久化/秒级持久化,重量级操作,频繁执行成本高 - -### 5.2 AOF - -AOF 持久化以独立日志的方式记录每次写命令,重启时在重新执行AOF文件中的命令达到恢复数据的目的。 - -1. 开启AOF功能需要设置配置: **appendonly yes**, 默认不开启。 -2. AOF文件名通过**appendfilename**配置设置, 默认文件名是appendonly.aof。 -3. 保存路径同RDB持久化方式一致, 通过dir配置指定。 - -**1. AOF缓冲区同步文件策略**: - -| 可配置值 | 说明 | -| -------------- | ------------------------------------------------------------ | -| always | 命令写入aof_buf后调用系统fsyn操作同步到AOF文件,fsync 完成后线程返回 | -| everysec(常用) | 每秒执行一次 | -| no | 同步由操作系统控制 | - -**2. AOF重写过程**: - -**手动触发**:直接调用**bgrewriteaof**命令 - -**自动触发**:根据**auto-aof-rewrite-min-size**和**auto-aof-rewrite-percentage**参数确定自动触发时机。 - -- auto-aof-rewrite-min-size: 表示运行AOF重写时文件最小体积, 默认为64MB。 -- auto-aof-rewrite-percentage: 代表当前AOF文件空间(aof_current_size) 和上一次重写后AOF文件空间(aof_base_size) 的比值。 - -**3. 错误修复** - -对于错误格式的AOF文件, 先进行备份, 然后采用**redis-check-aof--fix**命令进行修复, 修复后使用diff-u对比数据的差异, 找出丢失的数据, 有些可以人工修改补全。 - - - -## 第六章 复制 - -### 6.1 配置 - -#### 6.1.1 建立复制 - -三种方式: - -1. 在配置文件中加入slaveof {masterHost} {masterPort}随Redis启动生效。 -2. 在redis-server启动命令后加入--slaveof {masterHost} {masterPort}生效。 -3. 直接使用命令: slaveof {masterHost} {masterPort}生效。 - -```shell -127.0.0.1:6380>slaveof 127.0.0.1 6379 -``` - -#### 6.1.2 断开复制 - -在从节点执行**slaveof no one**来断开与主节点复制关系。 从节点断开复制后**并不会抛弃原有数据**, 只是无法再获取主节点上的数 -据变化。 - -通过slaveof命令还可以实现切主操作, 所谓切主是指把当前从节点对主节点的复制切换到另一个主节点。 执行slaveof{newMasterIp} {newMasterPort}命令即可。**会清除原有数据**。 - -注:**默认情况下, 从节点使用slave-read-only=yes配置为只读模式**。 - -#### 6.1.3 传输延迟 - -Redis为我们提供了**repl-disable-tcp-nodelay**参数用于控制是否关闭TCP_NODELAY, 默认关闭, 说明如下: - -- 当关闭时, 主节点产生的命令数据无论大小都会及时地发送给从节点, 这样主从之间延迟会变小, 但增加了网络带宽的消耗。 适用于主从之间的网络环境良好的场景, 如同机架或同机房部署。 -- 当开启时, 主节点会合并较小的TCP数据包从而节省带宽。 默认发送时间间隔取决于Linux的内核, 一般默认为40毫秒。 这种配置节省了带宽但增大主从之间的延迟。 适用于主从网络环境复杂或带宽紧张的场景, 如跨机房部署。 - - - -## 第十章 集群 - -### 10.1 数据分区 - -Redis Cluser采用虚拟槽分区, 所有的键根据哈希函数映射到0~16383整数槽内, 计算公式: slot=CRC16(key) &16383。 每一个节点负责维护一部分槽以及槽所映射的键值数据。 - -### 10.2 搭建集群 - -**用redis-trib.rb搭建集群** : - -**1.Ruby环境准备** - -```shell -# 安装Ruby: -wget https:// cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz -tar xvf ruby-2.3.1.tar.gz -cd ruby-2.3.1 -./configure -prefix=/usr/local/ruby -make -make install -cd /usr/local/ruby -sudo cp bin/ruby /usr/local/bin -sudo cp bin/gem /usr/local/bin - -# 安装rubygem redis依赖: -wget http:// rubygems.org/downloads/redis-3.3.0.gem -gem install -l redis-3.3.0.gem -gem list --check redis gem - -# 安装redis-trib.rb: -sudo cp /{redis_home}/src/redis-trib.rb /usr/local/bin - -# 执行确认 -# redis-trib.rb -``` - -**2.节点配置** - -```shell -#节点端口 -port 6379 -# 开启集群模式 -cluster-enabled yes -# 节点超时时间, 单位毫秒 -cluster-node-timeout 15000 -# 集群内部配置文件 -cluster-config-file "nodes-6379.conf" -``` - -```shell -redis-server conf/redis-6481.conf -redis-server conf/redis-6482.conf -redis-server conf/redis-6483.conf -redis-server conf/redis-6484.conf -redis-server conf/redis-6485.conf -redis-server conf/redis-6486.conf -``` - -**3.创建集群** - -```shell -redis-trib.rb create --replicas 1 127.0.0.1:6481 127.0.0.1:6482 127.0.0.1:6483 -127.0.0.1:6484 127.0.0.1:6485 127.0.0.1:6486 -``` - ---replicas参数指定集群中每个主节点配备几个从节点, 这里设置为1。 - -**4.集群完整性检查** - -集群完整性指所有的槽都分配到存活的主节点上, 只要16384个槽中有一个没有分配给节点则表示集群不完整。 可以使用redis-trib.rb check命令检测之前创建的两个集群是否成功, check命令只需要给出集群中任意一个节点地址就可以完成整个集群的检查工作 . - -```shell -redis-trib.rb check 127.0.0.1:6379 -redis-trib.rb check 127.0.0.1:6481 -``` - -### 10.4 集群扩容 - -#### 10.4.2 扩容集群 - -**步骤:** - -```shell -# 准备新的节点 -redis-server conf/redis-6385.conf -redis-server conf/redis-6386.conf - -# 加入集群 -redis-trib.rb add-node 127.0.0.1:6385 127.0.0.1:6379 -redis-trib.rb add-node 127.0.0.1:6386 127.0.0.1:6379 - -# 槽重新分片 -redis-trib.rb reshard 127.0.0.1:6379 - -#要把节点6386作为6385的从节点, 从而保证整个集群的高可用。 -127.0.0.1:6386>cluster replicate 1a205dd8b2819a00dd1e8b6be40a8e2abe77b756 - -#查看情况验证 -cluster nodes -``` - -槽重新分片: - -```shell -redis-trib.rb reshard host:port --from --to --slots --yes --timeout - --pipeline -``` - -参数说明: - -- host: port: 必传参数, 集群内任意节点地址, 用来获取整个集群信息。 -- --from: 制定源节点的id, 如果有多个源节点, 使用逗号分隔, 如果是all源节点变为集群内所有主节点, 在迁移过程中提示用户输入。 -- --to: 需要迁移的目标节点的id, 目标节点只能填写一个, 在迁移过程中提示用户输入。 -- --slots: 需要迁移槽的总数量, 在迁移过程中提示用户输入。 -- --yes: 当打印出reshard执行计划时, 是否需要用户输入yes确认后再执行reshard。 -- --timeout: 控制每次migrate操作的超时时间, 默认为60000毫秒。 - -#### 10.4.3 收缩集群 - -下线节点: - -```shell -redistrib.rb del-node{host: port}{downNodeId} -``` - - - -## 附:[CacheCloud GitHub](https://github.com/sohutv/cachecloud) - diff --git a/pictures/redis-cluster-create.png b/pictures/redis-cluster-create.png new file mode 100644 index 0000000000000000000000000000000000000000..04e242df1e9e92a078543fe0cd72fc0667be0f1c GIT binary patch literal 26635 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 rI+Cp@0`^S!v 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 Au>b%7 literal 0 HcmV?d00001 diff --git a/pictures/redis-cluster-nodes.png b/pictures/redis-cluster-nodes.png new file mode 100644 index 0000000000000000000000000000000000000000..f67bae93738b3a548c23664189748946f4fc5183 GIT binary patch literal 27992 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 literal 0 HcmV?d00001 diff --git a/pictures/redis-cluster-nodes2.png b/pictures/redis-cluster-nodes2.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac55499567190d7305e2a7fb2a7fd4eadf4bc05 GIT binary patch literal 27443 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

r<#&_|x;I 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 WK<~pN=z&)vRwqs$FEPJx_rCx^x=!-| literal 0 HcmV?d00001 diff --git a/pictures/redis-cluster-ps-ef.png b/pictures/redis-cluster-ps-ef.png new file mode 100644 index 0000000000000000000000000000000000000000..e41f6c27b5613f9b34a866e8d3a2c3a5a39d8119 GIT binary patch literal 12132 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 IcWfa42i4(_)Bpeg literal 0 HcmV?d00001 diff --git a/pictures/redis-info-replication.png b/pictures/redis-info-replication.png new file mode 100644 index 0000000000000000000000000000000000000000..1c241c83fcb24c3807592f7be698da77c902c71b GIT binary patch literal 17228 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 K>NToQqW>S$O)H52 literal 0 HcmV?d00001 diff --git a/pictures/redis-sentinel-infomation.png b/pictures/redis-sentinel-infomation.png new file mode 100644 index 0000000000000000000000000000000000000000..720d9b4f498e0967b51727574082e652695c59e0 GIT binary patch literal 10059 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 literal 0 HcmV?d00001 diff --git a/pictures/redis-sentinel-ps-ef.png b/pictures/redis-sentinel-ps-ef.png new file mode 100644 index 0000000000000000000000000000000000000000..3552c8248b5db6ca60bb5850e9c67b131bfb82e3 GIT binary patch literal 14708 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


jSbnoNWFudx0>qZv<4&R@ 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 LdQ|by^7X$1^$jau literal 0 HcmV?d00001 diff --git a/pictures/redis主从复制.png b/pictures/redis主从复制.png new file mode 100644 index 0000000000000000000000000000000000000000..081851857252269590d7e498d11451f2a98d72a1 GIT binary patch literal 7873 zcmc(k2UJtdx9Eck2uQEen}9S?q(e}O6se*}2Z<1Y&}&2pf)wdR=|KT0Lg)}cnslW~ zNg@!W2>~KqIw3dS@80*`|K9b!_kZu*weGBS$~rS=_MUV0o;|aFuT6|}XsJ1=0RRB4 zp03sd0Dufly8nKef^;?qcjb{TR9?E4z5oDS&!2+^wuPUWr?X$+6CWpl znTLzl6JI|kTlSGz0D#wAPwVc(pxljFsNdvrTmO#2B~eMeuzSMybZV!3G14YBDGjr*?J_h$!ozMH%5xJG6kJScx=XlueCD)644f|gVMqGcF|AY*10 z1mw8MCrf21@=DnF7R@`1Qm&?R=-k{EbpG(CY=?WE-9D-Kg>^6RtE#pNT}#l{*N;g| z+O^p+HV9S%g+xCDo$o(XCA?Vi;*g)Gc9Irtc;9|RV)ZWK|zY^7TQ``R~}Ty z#>8-Za3EFO)a?`(6m&GHilC$qSoO}?-uB|A(+O-Su_pC6U12eXz~ZcPW}9PUn;64yFMznLY0{} zs68q->-@U`{zJ$AlqSUq_tMgyl31Sk3T6n>OOz2jK@@AEcS#r-Qa}|YA>OCD=8Tn zIJ~ni4PA5uk4iu_sGkm9X*(EqqkR=GqQ~xnI4(&CZM=PKmmlZ}Uxg%vH_)!Ft^HhH z9&7aEOP7Wly*Rsig>w>v8D{$IQT1f@Q;4KBGBP~;f;qyXvn!G&WL9!bI6;nx@l83SLV*0j%Nv*sF#hK^TN*VYzZl_LcIP_shh?3+F( zoXVk%!bzIaDj2U$)DhQFG=hRyqPkJZM1Muf$hgHGjMI&$@b69Xl?=IGKEZVmw$Zd=cuRW~(f3pAootaMdFL?PimCDM! zw2?R;UGp1n3B&nihd=-pdbTy$kMYR!c?{P}IN6L`|dHD^N&4o4Gp>NYpWP7|ZTz7!OlO|)g>KgQ?xxyLt zU7Tmm=eORoa|UZMHtEC7S@p%Z2WjkSdkFbfmW`MwdMBvd90Zc! zbnx$90QCtnWqc2_c<{J&6IceRl?0$4nj`G))IlJKz1j-%4P=e*&6I0D(9HGgV$-?( z62$5L=$72uR~p()OMG|YFL|_Y8VJ5@Rj7qxDP%GyO{vXYa>7yUi98G4hr2npqXPsx z$?I`Z4R!|v_?es#A9#r-LTPWBYWBM#do)n#bB??U?)(rMztty2PJbhRdSsU}*1E&h z`c|})ce!P9by!a7goR^7ID+=4v@So{moEpeK;sRYCi_g8EFZl0xH&a%22OE%9E{7% zq-w3OR5|R2r)@cT`6PQ2JD@(ctd;4WZy%Zb;uyMOTpgP$IotXZ#CHEOpa|)Rtbg8^ z*pL;em?Md48?Xr7(3kEA;Tg1-F07|SaILdP?8u`Ht6Sxe1G?l~xXYDEq1Tbh)h`is9{rv8SlE(h4IE%WVH(y~u^^`6%CGTNl z%9-?J#ga@`yOD+!>6|4xl*mF(jabSG*xyW7-!6QZ0{QET4~S;=hN!4FG%#TK%>zw; z)XuxIGHdu15y=3DrO*v{Tx%n6xgqdi&$Jz0xICvp4An}AT`rzG%d`Y(er}JB_B_f= zaw8jA+*C+yF7S3p-|ZUS+BFVs}`ty2W{urN0)+8X%JozHZ+!e$T4T z{>$70yB9GEyulG6{gqFaUyP#iu@yrtAg*J>(7-0~ajBt7Ta+gc3S$` zZl)K8KpuxqH!*&w91>=ohev0&-sYk{s2yD3@7sriv#iQ^=mIwOKX|$~l$`TG@`&AA zHg6N~xjs*r?n9;=f?v<|vXRx;s0YUew+M|maF_su3Cd}6!FtyH>|mz2(zuKTTZ^x)V~>6{sxOa8ocK5F!HZp%rmIl(-av&g7qjTv z7dQbgwiBsD{yx;4cGejArgbAaP=Q3da{1Iy4S8V^-OBu-Gu_{AIe8MQKE2PED(^mvK z^|@VkYLtBBH{FyTxFTPj_!JVPXu%muwV&@9r06YFk!%Z?x}T*Az3$NKN>2U0v52^H zV3T98I}U-cm_EE@k(MPdz|Bq9)m`Njx?cXYgf+R%?^ard{A?vI@dwr6&fd>Qk~Me7 z%388o%e40%;Cw5<)&%SNv6&8CnZ(W=n&RY7`|jhr_%N$j^i$ux?4%g@nI;=H?T!!R zlx#*J;5N;cO2!(MCI{z=B{K8wymHmr6&~m1(s|>n4r?axn6o~tS*d#GgJNYr{ne*o$W`L9 zbU_1)Ds298VcwB2ed8n90EVr0iu_gYt+iAnW#B-eFZ6fcLJxfdKwA9yyRT5(^BM2tBP+)$Y0Vp_1^h4b_M{5S~tFJaDC@=*4uh=!m4_H^zi(-u}mI?M>iGkV?B#) z224LMQ3<-^>Jht#Ol9$KZT)x|kzwG9Y=1>w{?#%U`$+6ul_15+J0Cu3DnYg&nu)#AHzdVL1@mlH;xI%j|cWzweW^A8;#X69a zt_>n=riOb%59Zs(mRj`cSkpJ#*Z0T>74ey9_jMdPQdV0Wqd-eBw2|MwEDW_fmV%2Y zr_#aix5nN55>R|viSwy@>W+IW$~HL%siwTzy;g^EsOqoYLzjz&w=&(EJWdAsb*@)I zpt!M{`nzF4ney(!#uYOWaOGWl+d)M91P62niiM`W8wlJ`3AJ(^tRp^M@ul6G`~;)= zwtfF+ytDsO3Ea@H#f{#JiiQ*y4}2x4Xv`Ax-_=H9oXbwDJ6|8ms!(qyPlYj&s{IXk~eX;?r&2pGFQ!m-GQEFIw?{aV7sI6 zB$~2P2sA68BSMuQcso%~j}49RzPm;S9Esck#eF%RoOtz7s9BO_-tAynA%5wi>S-G6 zo8n{{7m!=!I)OSyVIt(Fu?`|MpYOV?qZeO&Xm3Apsy}K2K*&-8Y0WqV1D6w<-7NDg zjgAAK#CQ0y_-+|E9yCRfuYcUPL0^H(zpgJCSt`iS8+}meIhE7=R@>JeJcT^)BnQ4| z8sBSF79W%llW;pSn>f1DR#&h;%on2ZeDS70N+k`+n-l15yK`j2zOsmMqW3ZKG$%G0dY!q$Z+LJ-%rKS1QVU_$PF<$%WDvSvftp9 zp_Du>S_viW_VCS0&+9kbZlO81OubA^pHwe7<|bMYv{s#jvQGTS+;aV2ocrXRT4xp9 zOI5Ae$Zp*~h6IvbSr~a+*VMZ=Y!B9#|0CnOYV8sM7$IViT{_nic)CE?>+lHU>)`3}XVdn^0%Q4G2AsaYjk3#jhu5PawlDM=sL&iy)XV2s7+ zen3~>b~NJY?a2#CB<;0Vbw!K==I+gT`Ek7E_U+TxZxIp@uH2ezeTfHbWdI|6E)U1jfF$Np5N0l5 z!Rhjao5IG2HqQut?B%;ya1bIR;n}T`!lNs~8% z6Wnk4kGKwyRVU|8dWjmcEGz*mNoVgx&MOXOXp7=xhJ^#zBifLOph4mq^Rfg5GGEc zmBXR;p_V+}7{ev$8xhiepIt0UdpDcy%M|)%S z79eyxO%L&6GrB$`5EODO z?3}1dd%yd+8pcA3K$)iKG5lpqOEqbJigxJxvZ-l9?eF5l1?$o(>X$2Zg#NQ~eJ^e+ zTRirDnfJRFNSPkx_i)dWHK18>YflXb^9oB*?GBPqPz4fqT`m@#6K`^l}F)?M{c40c4 z4YbcG2{+bKxY1D6;%Uc3#g;8^6s|Gx5pge`qcet4C{rBi(g16KbmgIpsK1K~p4y4Q#Z)1wlN5`2K za+ZgHS1B?oQ4X2g?!Q;Z;(67wtv%b`c6Djol9jEQg1p%2WpDS$&aDmiMZnit5a-2S z^v3EPb9)U@A-YWmOqKh)vplEVY&}^)kn8K^!I=N-3S?{1|THqx;lB;*>zl9 z#p}SMeIAXC_WYeXAj40u!%=hGDqYcA%VzV(W5`Bz5YhihIaS?#^--J}*BzcEzO5+{ z3a$|2?d$q~n)5d9_*S0ToY&W4F~ba0&pF*3W5ZEfs2ajC#C&tdUqve%-j|)3Z`OG} zbfR{T=Pc?4Mj($kfwMWm_$pwMh@ zhr_MgFv{=lRVA?BYc?TZjhqR)yF4vu$djqP;3Gs+)Ovend%NjA0}``)qolpZ_qJu4yv)W}?W=~E z1^%T@Slu(IK+8tM9iF$>qJxg}4eW^1GbcPx)sB_-V5dqsac-p)rIqRMNpM!?QBC$O~U&FD5SW$UW;6@qclPn4$@8ROTq zAVT-dvDe13jVHOyBg8Sj1acD{n3DIQMr1|If?&Ivg{_gv69a%5VRoO=kbS4ca>1&B zicvD>dF4U7q&1~=w9HPQi>l&`?Dcd!z->;2`eBXy9$<6I@>CX|GT7v_$bevve==65 zHw2N3HfOy`{DD8#c3gg(lprL}q9GJ5dm5X+sjW|6D>eEQr~N#+FPo#l4ME25w|I&7 z$c6E+b-gF6EwV&5DrM63qj+o_m$Pf419ob-gZ1gzszBIj;ZEhO(;fTR1Nl~!H@?y? zx9&b)1w`@MW0y!P91Qe4Gz<*erO$H*#~iNF!7p8TeJaxy6!Cd+{d8ayY#`4+z zZ07ih9i)K)zyJF6$Z(7d4N;zMpo=}CN|0NN1zx)*`f0zSft2G{wwibdc5A7ftwc`2 zUde2{)U#=R!s7`&em?W%4b|D>0IK^Cxu)Gci`(VPv$O*7`tZ+&AS~?N&V+A}H$i^a z)}hhe0o}``I%s*B=HlZxGWGMnjfkSzTl-(dq@;=pm~nl7DP0;Z&p znO%iD(a1Oei+Y_JVu}yc(D52ANP$@VYIdv6`V;@6Ch}@_G8E{%OHYne($6EZK6z2o z4=cm_Mi;2qcl+la`5bNqm`+wh=3Wl9-bfKB2lBTqi>|HKs3KeQ=5CzF><4%JiG7yK zJNu%ET+f>7L~s0SzE-83VCD{^>p4G(@5_Gtqc8gaxAGi?!C(UYBH{4v%5t8yuh2s# zW@fT4Uz^*^W`3)&M^lTJUb?(?-_JmO8d!s>hIk4VP%=#&geSNTB$+xAM+llkGK=Vw zl^lm+1L$i|f7$VT1idm3qNM8_Qh;nZDX$4|d@1v1=p{KB;pvh2=ro=%9!s>;Z6AL0 zmxByus!&e1@!Wrl82?IW{zG#1pG7I}fppP@-P-VvR6nhDU`8crKiX6dm2NT|el@Ew zKhv=WNiiIjZw#MxbETkNpZU0^fB#kv9s6h){&Jw%+;>`R)_+6q};BaaSPgLfMb0}RRF@GqNh#T5Ilz!lN!BbJCr6*i&Ru`BLR*RFrz9pKxA|}phCnNZ?!?(2eY!eM&gu5D(=}l! zqvNcoDu#rfbX8UxCZA3nVLGY-@VUi+AN=Mn6h;!uu45{czBJSY4G z8OC#gp(MKS4>a%pU@PlRjWhUQS5V1x2B5T~(~v;xK>}U)k#pB+#Xm5u>`{d)EqeXG znp)uJJ0p0q<)u|sxud(sY&X`@H%`j_0WN9~_KDM#&pcb&*70~17KCkAHw z7W^mZ7yyR(i(CAEK*s+JS^j(;mD??bkNuoP!tZ?ei#dMm=&T^o)RIC8x}LR{5C5W$ kWg8#=4xs#BdJBSfgr5O=+D2NH8V=$A0to?H7ytkO literal 0 HcmV?d00001 diff --git a/pictures/redis哨兵模式.png b/pictures/redis哨兵模式.png new file mode 100644 index 0000000000000000000000000000000000000000..a422e2b72d97fa4426e0a87f997b0e3db2f14f4c GIT binary patch literal 26318 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 literal 0 HcmV?d00001 diff --git a/pictures/redis节点通讯.png b/pictures/redis节点通讯.png new file mode 100644 index 0000000000000000000000000000000000000000..c2c0022b6f8d6bdd77f281667fea8f75223fe62b GIT binary patch literal 26915 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