Redis 集群搭建
一、演示环境:
在 Ubuntu 23.10 x64 系统中,3 主 3 从 MySQL 架构,主节点独立,从节点共用一台机器。
主机名 | 私有IP | Redis 端口 |
---|---|---|
master1 | 10.104.0.2 | 6001 |
master2 | 10.104.0.3 | 6002 |
master3 | 10.104.0.4 | 6003 |
slave | 10.104.0.5 | 7001、7002、7003 |
二、环境准备:
1 | sudo apt-get install build-essential autoconf automake libtool zlib1g-dev pkg-config libjemalloc-dev |
后续操作均在此路径下进行:/opt
master 操作
1 | cd /opt |
分别主3个 master 节点解压 Redis 压缩包后将文件名都改成redis-7.2.3-master
即可
slvae 操作
1 | cd /opt |
下载然后将解压出来的 Redis 文件夹重命名为 redis-7.2.3-7001
然后再创建两个文件夹:redis-7.2.3-7002``redis-7.2.3-7003
最后得到如下图所示三个文件夹
三、搭建 master
下方的操作需要在三台 master 机器上都依次执行
3.1 目录准备
进入文件夹内:cd /opt/redis-7.2.3-master/
创建 data 和 log:mkdir data log
3.2 构建安装
1 | make distclean |
3.3 修改配置文件
修改 redis.config 配置文件。下方的配置文件可用直接使用,需要修改的配置项有带注释:
这里我三台 master 端口有做相应修改,设备独立的不改也可以
1 | # bind 127.0.0.1 -::1 这个指明,只能在本地(运行的节点)访问redis |
3.4 启动 Redis
命令:redis-server /opt/redis-master/redis.conf
3.5 检查是否启动
输入:netstat -ntpl
查看 Redis 端口是否均已起
这里可能会有小伙伴问,为什么会多一个16003端口?
因为在 Redis 集群模式中,每个节点都有一个唯一的 ID,范围从 0 到 16383。但是,当你在配置文件中指定节点 ID 时,你需要在 ID 上加上 1000。这是因为 Redis 集群模式使用了一个名为集群总线 (cluster bus) 的内部通信机制,而集群总线使用端口号来标识每个节点。集群总线端口号是节点 ID 加上 1000。
这是 Redis 集群模式的一个设计决策,目的是为了避免与其他使用端口号 0 到 16383 的服务冲突。
3.6 连接 Redis
1 | master1:redis-cli -h 10.104.0.2 -p 6001 -a Ye6k5sld4KaO |
3.7 检测状态
连接后输入 PING,正常则返回 PONG 即可
四、搭建 slave
其实 slave 操作和 master 操作类似,需要主要修改配置文件
4.1 目录准备
进入文件夹内:cd /opt/redis-7.2.3-7001/
创建 data 和 log:mkdir data log
4.2 构建安装
1 | make distclean |
4.3 修改配置文件
修改 redis.config 配置文件。下方的配置文件可用直接使用,需要修改的配置项有带注释:
注意:三个 slave 的 port、pidfile、dir、logfile 需要对应修改
1 | # bind 127.0.0.1 -::1 这个指明,只能在本地(运行的节点)访问redis |
4.4 启动 Redis
1 | redis-server /opt/redis-7.2.3-7001/redis.conf |
4.5 检查是否启动
输入:netstat -ntpl
查看三个 Redis 端口是否均已起
4.5 连接 Redis
1 | redis-cli -h 10.104.0.5 -p 7001 -a Ye6k5sld4KaO |
4.7 检测状态
连接任意 Redis 后输入 PING,正常则返回 PONG 即可
五、创建 Redis 集群
节点创建完毕后,各个节点实际上是独立的,并没有组成一个集群,还需要下面的操作。
方法一:一键执行
下面这条命令是指定三主三从,前三个节点是主节点,后三个节点是从节点。
1 | redis-cli --cluster create 127.0.0.1:6001 10.104.0.3:6002 10.104.0.4:6003 10.104.0.5:7001 10.104.0.5:7002 10.104.0.5:7003 --cluster-replicas 1 |
当程序提示: Can I set the above configuration? (type 'yes' to accept)
时,键入 yes 回车,然后集群搭建完毕!
然后连接任意 Redis 后,输入 CLIENT NODES
即可查看集群节点关联关系
数据解析:
1 | 节点 ID: 6d959d3d8e669c9416b4f1dd4e910b05b3357704 |
方法二:指定主从关系
**注意!**当只有 3 台物理节点时,若要指定主从关系以保证高可用,则需要手动操作。
- 创建具有三个主节点的集群,没有从节点。
- 使用添加节点的命令添加从节点,并在添加时指定它们的主节点,建立主从对应关系。
创建主节点
使用命令创建:redis-cli -a Ye6k5sld4KaO --cluster create 10.104.0.2:6001 10.104.0.3:6002 10.104.0.4:6003 --cluster-replicas 0
填写三个主节点对应的 IP、端口和密码即可
增加从节点
命令:redis-cli -a xxx --cluster add-node --cluster-slave --cluster-master-id {id}
- a:密码
- slave:表示添加从节点
- cluster-master-id:要添加到对应的主节点 ID(节点ID获取方法,往上翻一下就有)
- 127.0.0.1:7001:从节点
- 127.0.0.1:6001:原集群中已存在的任意节点
这里我将三个 slave 分别添加至三台 master,命令如下:
1 | redis-cli -a Ye6k5sld4KaO --cluster add-node 10.104.0.5:7001 10.104.0.2:6001 --cluster-slave --cluster-master-id c8e40723b1838dcd9bcc96ec9a258b082eccfd22 |
然后连接任意 Redis 后,输入 CLIENT NODES
即可查看集群节点关联关系
可以发现,我们所有的 从节点 对应的都是我们给他指定的 主节点
动态增删节点
1、增加 master
1 | redis-cli -a Ye6k5sld4KaO --cluster add-node 10.104.0.5:7004 10.104.0.2:6001 |
2、给新的 master 分配哈希槽
节点已加入集群,但没有数据:
- 因为它还没有分配到 hash slots,所以它还没有数据
- 因为它是还没有 hash slots 的主节点,所以它不会参与到从节点升级到主节点的选举中
我们只需要指定任意一个节点,redis 会自动发现其他节点
使用命令:redis-cli -a Ye6k5sld4KaO --cluster reshard 10.104.0.2:6001
可以重新分配哈希槽,执行之后会出现提醒:
1 | How many slots do you want to move (from 1 to 16384)? |
然后开始迁移,每迁移一个key就会输出一个点。待所有迁移完成后,执行下面的指令查看集群是否正常:
1 | redis-cli -a Ye6k5sld4KaO --cluster check 10.104.0.2:6001 |
3、增加 slave
1 | redis-cli --cluster add-node 127.0.0.5:7004 127.0.0.2:6001 --cluster-slave |
该指令与增加主节点语法一致,与添加主节点不同的是,显式指定了是从节点。
这会为该从节点随机分配一个主节点,优先从那些从节点数目最少的主节点中选取,当然这一步也能和上面一样,给他指定 master-id。
4、删除节点
注意,只能删除从节点或者空的主节点
1 | redis-cli -a Ye6k5sld4KaO --cluster del-node 127.0.0.2:6001 {node-id} |
如果想删除有数据的主节点,必须先执行 resharding 把它的数据分配到其他节点后再删除。
六、配置文件解析
1 | ############################## GENERAL(通配)################################## |