一、Redis单机安装
1、安装gcc依赖
Redis是C语言编写的,编译需要GCC。
Redis6.x.x版本支持了多线程,需要gcc的版本大于4.9,但是CentOS7的默认版本是4.8.5。
升级gcc版本:
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++
devtoolset-9-binutils
scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
确认gcc的版本(在同一个窗口中!):
gcc -v
2、下载解压文件
下载地址:https://redis.io/download/#redis-downloads
解压文件
[root@localhost src]# tar -xzf redis-6.0.16.tar.gz
2、修改redis.config文件
daemonize yes //更改为后台启动
#bind 127.0.0.1 //注释
protected-mode no //允许外部网络直接访问
4、启动redis
如果src没有redis-server,在redis目录执行make指令
[root@localhost src]# ./redis-server ../redis.conf //启动服务
[root@localhost src]# ./redis-cli //进入客户端
二、Redis主从安装
1、修改redis.config文件
daemonize yes //更改为后台启动
#bind 127.0.0.1 //注释
protected-mode no //允许外部网络直接访问
replicaof 192.168.8.129 6379 //添加是哪台机器的从节点 主节点IP 主节点端口
2、启动redis
如果src没有redis-server,在redis目录执行make指令
[root@localhost src]# ./redis-server ../redis.conf //启动服务
[root@localhost src]# ./redis-cli //进入客户端
查看是否配置了主节点配置
127.0.0.1:6379> config get replicaof
1) "replicaof"
2) "192.168.8.129 6379"
查看从节点信息
127.0.0.1:6379> info replication
# Replication
role:slave //角色
master_host:192.168.8.129 //主节点IP
master_port:6379 //主节点端口
master_link_status:up //连接状态 up是正常同步连接状态 down表
示复制端口
master_last_io_seconds_ago:1 //主库多少秒没有发送数据到从库 0-
10
master_sync_in_progress:0 //是否正在跟主服务同步
slave_repl_offset:163 //从节点偏移量
slave_priority:100 //选举时成为主节点的优先级 越大优先级越高 0
不会成为主节点
slave_read_only:1 //是否为只读从库
connected_slaves:0 //连接的从库实例
master_replid:04f4969ab63ce124e870fa1e4920942a5b3448e7
//master启动时生成的40位16进制的随机字符串,用来标识master节点
master_replid2:0000000000000000000000000000000000000000
//slave切换master之后,会生成了自己的master标识,之前的master节
点的标识存到了master_replid2的位置
master_repl_offset:163 //已写入偏移量
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576 //复制积压的缓存区大小
repl_backlog_first_byte_offset:1
repl_backlog_histlen:163
3、查看主节点信息
127.0.0.1:6379> info replication
# Replication
role:master //角色
connected_slaves:1 //从节点数量
slave0:ip=192.168.8.127,port=6379,state=online,offset=7889
9,lag=1 //从节点的信息 状态 偏移量
master_replid:04f4969ab63ce124e870fa1e4920942a5b3448e7
//# master启动时生成的40位16进制的随机字符串,用来标识master节点
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:78899 //mater已写入的偏移量
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576 //缓冲区大小
repl_backlog_first_byte_offset:1
repl_backlog_histlen:78899 //缓冲区的数据已有大小(是个环形,跟
RedoLog一样会覆盖)
4、运行时变成主的从库
解除主从关系
127.0.0.1:6379> slaveof no one
OK
添加从节点
127.0.0.1:6379> slaveof 192.168.8.129 6379
OK
三、 Redis哨兵安装
1、修改sentinel.cfg文件
配置文件跟redis.cfg一个路径,都在redis根目录,如果要监控多套主服务,配置多个即可
port 26379 //sentinel服务端口
daemonize yes //是否后台启动
//sentinel monitor <master-group-name> <ip> <port> <quorum>
sentinel monitor mymaster 192.168.8.129 6379 2
//mymaster主服务的名称 192.168.8.129 6379 master的ip与端口 quornum 认为master不可用的sentinel数量
sentinel down-after-milliseconds mymaster 30000 //30s后联系不到 认为关闭
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
2、启动sentinel服务
[root@localhost src]# ./redis-sentinel ../sentinel.conf
//启动sentinel服务
3、连接sentinel服务
[root@localhost src]# ./redis-cli -p 26379
127.0.0.1:26379>
4、查看master的信息
127.0.0.1:26379> sentinel master mymaster //mymaster为自定义的名称
1) "name"
2) "mymaster"
3) "ip"
4) "192.168.8.129"
5) "port"
6) "6379"
7) "runid"
8) "75fb165dd59b82d1154d11939a0b9a45211bf68a"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "256"
19) "last-ping-reply"
20) "256"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "5553"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "156216"
29) "config-epoch"
30) "0"
31) "num-slaves" //从节点数量
32) "2"
33) "num-other-sentinels" //其他的哨兵数量
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
5、sentinel查询主库地址
1.连接sentinel客户端
[root@localhost src]# ./redis-cli -p 26379
2.查询主库地址
127.0.0.1:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.8.128"
2) "6379"
6、sentinel主要指令
该SENTINEL命令是 Sentinel 的主要 API。以下是其子命令的列表(在适用的情况下注明了最小版本):
- SENTINEL CONFIG GET ( >= 6.2 ) 获取全局 Sentinel 配置参数的当前值。指定的名称可以是通配符,类似于 Redis CONFIG GET 命令。
- SENTINEL CONFIG SET ( >= 6.2 ) 设置全局Sentinel 配置参数的值。
- SENTINEL CKQUORUM 检查当前的 Sentinel 配置是否能够达到故障转移主服务器所需的法定人数,以及授权故障转移所需的多数。此命令应用于监控系统以检查 Sentinel 部署是否正常。
- SENTINEL FLUSHCONFIG强制 Sentinel 在磁盘上重写其配置,包括当前 Sentinel 状态。通常,Sentinel 会在每次状态发生变化时重写配置(在重启后保留在磁盘上的状态子集的上下文中)。然而,有时配置文件可能会因为操作错误、磁盘故障、软件包升级脚本或配置管理器而丢失。在这些情况下,强制 Sentinel 重写配置文件的方法很方便。即使先前的配置文件完全丢失,此命令也有效。
- SENTINEL FAILOVER 强制进行故障转移,就好像主服务器不可访问一样,并且无需征求其他 Sentinel 的同意(但是将发布新版本的配置,以便其他 Sentinel 更新其配置)。
- SENTINEL GET-MASTER-ADDR-BY-NAME 返回具有该名称的主机的 ip 和端口号。如果此主服务器正在进行故障转移或成功终止,它将返回提升副本的地址和端口。
- SENTINEL INFO-CACHE ( )从主服务器和副本服务器>= 3.2 返回缓存的输出。INFO
- SENTINEL IS-MASTER-DOWN-BY-ADDR从当前 Sentinel 的角度检查ip:port 指定的主服务器是否已关闭。该命令主要供内部使用。
- SENTINEL MASTER 显示指定主站的状态和信息。
- SENTINEL MASTERS显示受监控的主控列表及其状态。
- SENTINEL MONITOR启动 Sentinel 的监控。有关详细信息,请参阅运行时重新配置 Sentinel部分。
- SENTINEL MYID ( >= 6.2 ) 返回 Sentinel 实例的 ID。
- SENTINEL PENDING-SCRIPTS此命令返回有关未决脚本的信息。
- SENTINEL REMOVE停止 Sentinel 的监控。有关详细信息,请参阅在运行时重新配置 Sentinel部分。
- SENTINEL REPLICAS ( >= 5.0 ) 显示此主服务器的副本列表及其状态。
- SENTINEL SENTINELS 显示该 master 的哨兵实例列表及其状态。
- SENTINEL SET设置 Sentinel 的监控配置。有关详细信息,请参阅在运行时重新配置 Sentinel部分。
- SENTINEL SIMULATE-FAILURE (crash-after-election|crashafter-promotion|help)( >= 3.2 ) 此命令模拟不同的 Sentinel 崩溃场景。
- SENTINEL RESET 此命令将重置所有具有匹配名称的主机。模式参数是一个全局样式的模式。重置过程会清除 master 中的任何先前状态(包括正在进行的故障转移),并删除已发现并与 master关联的每个副本和哨兵。
7、出于连接管理和管理目的,Sentinel 支持以下 Redis 命令子集:
- ACL ( >= 6.2 ) 此命令管理 Sentinel 访问控制列表。有关详细信息,请参阅ACL文档页面和Sentinel 访问控制列表身份验证。
- AUTH ( >= 5.0.1 ) 验证客户端连接。有关详细信息,请参阅AUTH命令和使用身份验证配置 Sentinel 实例部分。
- CLIENT此命令管理客户端连接。有关更多信息,请参阅其子命令页面。
- COMMAND ( >= 6.2 ) 此命令返回有关命令的信息。有关详细信息,请参阅该COMMAND命令及其各种子命令。
- HELLO ( >= 6.0 ) 切换连接的协议。有关详细信息,请参阅HELLO命令。
- INFO返回有关 Sentinel 服务器的信息和统计信息。有关更多信息,请参阅INFO命令。
- PING这个命令只返回 PONG。
- ROLE此命令返回字符串“sentinel”和受监控的主机列表。有关详细信
息,请参阅ROLE命令。 - SHUTDOWN关闭 Sentinel 实例。
8、模拟主服务器挂掉
- 模拟主服务器关闭 192.168.8.129
[root@localhost src]# ./redis-cli
127.0.0.1:6379> info replication // 查看
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.8.127,port=6379,state=online,offset=232310,lag=0
slave1:ip=192.168.8.128,port=6379,state=online,offset=232310,lag=1
master_replid:d1274cc57aa3a2f1fed3068a429b972d6268453d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:232310
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:232310
127.0.0.1:6379> shutdown //执行服务关闭
- 我们再查看另外的2个实例的信息(由于切换需要时间,所以不会马上变更)192.168.8.128的信息,我们发现128升级为主了。
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.8.127,port=6379,state=online,offset=278214,lag=1
master_replid:b32f0f1140789e7d0e30c88e717730cbd93dd3d8
master_replid2:d1274cc57aa3a2f1fed3068a429b972d6268453d
master_repl_offset:278355
second_repl_offset:233876
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:278355
192.168.8.127的信息,我们发现127变成了128的主
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.8.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:274802
slave_priority:100
slave_read_only:0
connected_slaves:0
master_replid:b32f0f1140789e7d0e30c88e717730cbd93dd3d8
master_replid2:d1274cc57aa3a2f1fed3068a429b972d6268453d
master_repl_offset:274802
second_repl_offset:233876
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:274802
我们基于Sentinel就能实现主从的自动切换。
四、RedisCluster集群安装
1、安装
RedisCluster至少得三主三从 6个节点
6节点分别以127、128、129 3台机器的 6380、6381端口
2、复制原有安装文件,把原有文件改成6380
cp -r redis-6.0.16 redis-6.0.16-6381
mv redis-6.0.16 redis-6.0.16-6380
3、更改redis.config配置文件
#bind 127.0.0.1
protected-mode no
daemonize yes
cluster-enabled yes 开启集群
cluster-config-file nodes-6380.conf //不同的端口实例不同 比如6381就是nodes-6381.conf
pidfile /var/run/redis_6380.pid //不同的端口实例不同 比如6381就是redis_6381.pid
4、开启Cluster集群
[root@localhost src]# ./redis-cli --cluster create 192.168.8.129:6380 192.168.8.129:6381 192.168.8.128:6381 192.168.8.128:6380 192.168.8.127:6380 192.168.8.127:6381 --cluster-replicas 1
如果报非空,删除相关节点的数据,以及cluster-config-file配置的文件
5、查看集群信息
127.0.0.1:6380> cluster nodes
ed1d6852839ea0f4eccb3231d9230a701a079783
192.168.8.129:6380@16380 myself,master - 0 1657818165000 1
connected 0-5460
e1b44fb5617b3c835238ca8a9bdbc86aa2dcec72
192.168.8.128:6381@16381 master - 0 1657818166000 3
connected 5461-10922
f639ac4eee5d79f82e27d7a5b038eeff9d6a4ca8
192.168.8.127:6381@16381 slave
e1b44fb5617b3c835238ca8a9bdbc86aa2dcec72 0 1657818165784 3
connected
8df23b5a556a32c4b65d228250f6cbddb18bfaf4
192.168.8.128:6380@16380 slave
ed1d6852839ea0f4eccb3231d9230a701a079783 0 1657818166788 1
connecte
abe5ae19378385e1c8f9fb7c93a702343947e216
192.168.8.127:6380@16380 master - 0 1657818162000 5
connected 10923-1638
4d0fcb91f0afa7eaf6cba415249fe6f8baa4c2e8
192.168.8.129:6381@16381 slave
abe5ae19378385e1c8f9fb7c93a702343947e216 0 1657818167791 5
connected
6、模拟服务器宕机
- 模拟129的6380宕机,我们发现129:6380的slave 128:6380自动升为
主。
127.0.0.1:6380> cluster nodes
4d0fcb91f0afa7eaf6cba415249fe6f8baa4c2e8
192.168.8.129:6381@16381 slave
abe5ae19378385e1c8f9fb7c93a702343947e216 0 1657819837000 5
connecte
abe5ae19378385e1c8f9fb7c93a702343947e216
192.168.8.127:6380@16380 master - 0 1657819833000 5
connected 10923-16383
f639ac4eee5d79f82e27d7a5b038eeff9d6a4ca8
192.168.8.127:6381@16381 slave
e1b44fb5617b3c835238ca8a9bdbc86aa2dcec72 0 1657819836183 3
connecte
ed1d6852839ea0f4eccb3231d9230a701a079783
192.168.8.129:6380@16380 master,fail - 1657819132867
1657819129000 1 disconnected
8df23b5a556a32c4b65d228250f6cbddb18bfaf4
192.168.8.128:6380@16380 myself,master - 0 1657819835000 7
connected 0-5460
e1b44fb5617b3c835238ca8a9bdbc86aa2dcec72
192.168.8.128:6381@16381 master - 0 1657819837187 3
connected 5461-10922
所以,cluster可以进行自动故障转移
7、添加节点(集群扩容)
我现在添加一个节点 192.168.8.137:6380实例,我希望加到cluster集群
在随便现有的clusternode节点中执行:
第一个参数是要添加的节点,第二个参数为已有的cluster集群随机一个节
点
./redis-cli --cluster add-node 192.168.8.137:6380 192.168.8.128:6380
8、查看nodes节点
127.0.0.1:6381> cluster nodes
e1b44fb5617b3c835238ca8a9bdbc86aa2dcec72
192.168.8.128:6381@16381 myself,master - 0 1657903080000 3
connected 5461-10922
abe5ae19378385e1c8f9fb7c93a702343947e216
192.168.8.127:6380@16380 master - 0 1657903081336 5
connected 10923-1638
4d0fcb91f0afa7eaf6cba415249fe6f8baa4c2e8
192.168.8.129:6381@16381 slave
abe5ae19378385e1c8f9fb7c93a702343947e216 0 1657903081000 5
connected
8df23b5a556a32c4b65d228250f6cbddb18bfaf4
192.168.8.128:6380@16380 master - 0 1657903082000 7
connected 0-5460
f639ac4eee5d79f82e27d7a5b038eeff9d6a4ca8
192.168.8.127:6381@16381 slave
e1b44fb5617b3c835238ca8a9bdbc86aa2dcec72 0 1657903079000 3
connected
143bb59351740be6087766df8af135d22679c7f9
192.168.8.137:6380@16380 master - 0 1657903082339 0
connecte
ed1d6852839ea0f4eccb3231d9230a701a079783
192.168.8.129:6380@16380 slave
8df23b5a556a32c4b65d228250f6cbddb18bfaf4 0 1657903080333 7
connected
我们发现,137的6380节点已经到了cluster集群。但是是没有分配虚拟槽的,所以要进行槽的分配
9、Cluster其他指令
官网地址:https://redis.io/commands/?group=cluster集群相关命令(需要进入客户端)
- cluster info :打印集群的信息
- cluster nodes :列出集群当前已知的所有节点(node),以及这些节点的相关信息。
- cluster meet :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
- cluster forget <node_id> :从集群中移除 node_id 指定的节点(保证空槽道)。
- cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
- cluster saveconfig :将节点的配置文件保存到硬盘里面。
10、槽slot命令
- cluster addslots [slot …] :将一个或多个槽(slot)指派(assign)给当前节点。
- cluster delslots [slot …] :移除一个或多个槽对当前节点的指派。
- cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。cluster setslot node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
- cluster setslot migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
- cluster setslot importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
- cluster setslot stable :取消对槽 slot 的导入(import)或者迁移(migrate)。
11、键命令
- cluster keyslot :计算键 key 应该被放置在哪个槽上。
- cluster countkeysinslot :返回槽 slot 目前包含的键值对数量。
- cluster getkeysinslot :返回 count 个 slot 槽中的键
12、数据迁移
12.1 扩容
扩容(添加新节点)过程中,数据迁移的主要步骤包含以下几个部分:
12.1.1、启动新节点
启动新的 Redis 实例作为集群的节点:
redis-cli --cluster add-node 127.0.0.1:6380 127.0.0.1:6379
12.1.2、将新节点加入集群
使用 redis-cli 命令将新的节点加入现有集群:
redis-cli --cluster add-node 127.0.0.1:6380 127.0.0.1:6379
12.1.3、重新分配槽(resharding)
使用 redis-cli 工具重新分配哈希槽,这会触发槽和数据的迁移:
redis-cli --cluster reshard 127.0.0.1:6379
交互过程中,指定将一定数量的哈希槽从现有节点迁移到新节点。
12.1.4、迁移数据:
redis-cli 自动处理哈希槽的迁移,并在后台进行数据的移动。此迁移是渐进式的,不会中断服务。
12.2 缩容
缩容(移除节点)过程中,数据迁移的主要步骤包含以下几个部分:
12.2.1、触发哈希槽转移:
首先,确定需要移除的节点ID,获取节点信息:
redis-cli --cluster nodes 127.0.0.1:6379
12.2.2、移动哈希槽到其他节点:
使用 redis-cli 工具将指定节点的槽迁移到其他节点:
redis-cli --cluster reshard 127.0.0.1:6379 --slots SLOT_NUMBER --from NODE_ID_TO_REMOVE --to TARGET_NODE_ID
12.2.3、关闭并移除节点:
当所有哈希槽和数据迁移完成后,安全地关闭并移除节点:
redis-cli --cluster del-node 127.0.0.1:6379 NODE_ID_TO_REMOVE