环境
操作系统 CentOS 7
Redis 6.0.8
机器数量 3(x.x.x.173, x.x.x.174, x.x.x.175)
安装Redis
下载地址
https://redis.io/download
安装
cd /opt
mkdir redis
cd /redis
wget https://download.redis.io/releases/redis-6.0.8.tar.gz
tar xzf redis-6.0.8.tar.gz
cd redis-6.0.8/
make
我这里make的时候报了俩错(经测试发现5版本的redis不会有这个错,如果嫌麻烦可以直接用5的)
我们需要更新gcc版本
1.安装scl源
yum install centos-release-scl scl-utils-build
2.列出scl可用源
yum list all --enablerepo='centos-sclo-rh'
3.安装8版本的gcc、gcc-c++、gdb工具链(toolchian)
yum install -y devtoolset-8-toolchain
scl enable devtoolset-8 bash
4.给make增加参数
make MALLOC=libc
重新make并指定目录,我这里指定在了安装目录下
make install PREFIX=/opt/redis/redis-6.0.8
建一个日志文件夹
mkdir logs
对没错单机Redis安装跟上一篇Redis安装及集群搭建(主从/哨兵模式)的安装是一样的,我直接拷贝过来的,如果要搭主从或者哨兵的小伙伴可以去看看。
Cluster集群
规划
Cluster集群最少需要6个节点,3主3从,可以分布在一台或者多台主机上,本例子准备3台机器,每台机器一主一从。端口号每台机器都是6380/6381(这个随意,不冲突就好)
开始
在/opt/redis/redis-6.0.8/redis-6.0.8目录下新建一个cluster目录,然后在cluster下新建两个目录6380/6381分别存放各自的资源文件,进入到6380/6381目录编写redis.conf,后面的两台机器操作一样
# redis.conf文件示例
# 这里注意改成自己的外网ip
bind x.x.x.173 127.0.0.1
port 6380
requirepass 123456
masterauth 123456
daemonize yes
pidfile /opt/redis/redis-6.0.8/cluster/6380/redis_6380.pid
dir /opt/redis/redis-6.0.8/cluster/6380/
logfile "/opt/redis/redis-6.0.8/logs/redis_6380.log"
appendonly yes
appendfsync always
cluster-enabled yes
cluster-node-timeout 5000
cluster-config-file nodes-6380.conf
# 其他配置文件类似,把端口号修改一下就行了
启动6台机器,这里我是分别把几个redis都做成systemctl启动了,linux比较熟的朋友可以弄弄脚本什么的
vim /etc/systemd/system/redis_6380.service
复制粘贴以下内容,注意ExecStart配置成自己的路径
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/opt/redis/redis-6.0.8/bin/redis-server /opt/redis/redis-6.0.8/cluster/6380/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
开机启动
systemctl daemon-reload
systemctl start redis_6380
systemctl enable redis_6380
执行创建集群命令
cd /opt/redis/redis-6.0.8/bin/
./redis-cli --cluster create x.x.x.173:6380 x.x.x.174:6380 x.x.x.175:6380 x.x.x.173:6381 x.x.x.174:6381 x.x.x.175:6381 --cluster-replicas 1 -a 123456
# --cluster-replicas 1 表示主从配置比,1表示的是1:1,前三个是主,后三个是从
# -a 123456就是上面redis.conf中设置的密码
查看集群状态
./redis-cli -c -h x.x.x.173 -p 6380 -a 123456 cluster nodes
-c:表示以集群方式连接惹redis
-h:指定IP地址
-p:指定端口
cluster nodes:查询集群节点信息
cluster info:查询集群状态信息
也可以直接RedisDesktopManager连上后查询。
此时集群就已经搭建好了,服务挂掉后重启就行,因为有node.conf文件的存在。
但是我发现一个问题,因为我是3台机器6个服务(机器多一台机器一个服务请无视~),所以我的期望是每台机器的从redis隶属于那台机器的主redis,但是这种方式好像是随机分配主从的
因为没找到如何在建立集群的时候指定分配哪个从隶属哪个主,只能建完集群手动指定了,具体操作在下面。
常用操作
添加新主节点
./redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
# new_host:new_port为要新添加的主节点IP和端口
# existing_host:existing_port表示的是已存在的最后一个主节点的IP和端口,这个可以从上述的节点信息中查看到,根据slots槽数,7003端口对应的节点槽数是10923-16383,16383表示的是最后的槽数
# --cluster-master-id表示的是最后一个主节点的节点id,表示的是新添加的主节点要在这个节点后面
hash槽重新分配
添加完新节点后,需要对新添加的主节点进行hash槽重新分配,这样该主节点才能存储数据,redis共有16384个槽。
./redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes
# host:port表示的是新添加的那个主节点IP和端口
# --cluster-from node_id表示的是集群第一个主节点的节点id,这个可以现有集群的slots槽数分配看出
# --cluster-to node_id表示的是集群最后一个主节点的节点id,也就是新添加的那个主节点id
# --cluster-slots 500表示的是给新主节点分配多少,此处500表示是分配从0-499个slots槽数,若不加上这个会让手动输入
# --cluster-yes表示的是自动应答为yes,若不加上这个会让手动输入yes,表示同意此次分配
添加新从节点
./redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
# new_host:new_port表示的是要添加的那个从节点的IP和端口
# existing_host:existing_port表示的是要给哪个主节点添加从节点
# --cluster-slave表示的是要添加从节点,否则则是添加主节点了
# --cluster-master-id node_id表示要给哪个主节点添加从节点的该主节点节点id
删除节点
./redis-cli --cluster del-node host:port node_id
# host:port表示的是要删除的那个节点的IP和端口
# node_id表示的是删除的那个节点的节点id
过程中我发现多出了了俩不知道啥用的节点
删也删不掉,最后一顿百度
cluster forget f8b3b97c7dd0def685542b7d07d3dcf7f9c464dc
# 这个命令须在客户端执行,我是在RedisDesktopManager执行的
搞定!
我的问题
回到刚刚说的那个问题,我们可以看到每个服务器的从redis都是指向其它服务器的主redis
首先删除所有6381的从节点
./redis-cli --cluster del-node x.x.x.173:6381 xxxxxxxxxxxxxxxxxxxxx -a 123456
然后在服务器删掉配置文件
cd /opt/redis/redis-6.0.8/cluster/6381/
ls
appendonly.aof dump.rdb nodes-6381.conf redis_6381.pid redis.conf
除了redis.conf全删掉,然后重启6381节点的redis
最后把每个服务器的从节点添加到自己服务器的主节点上面去
./redis-cli --cluster add-node x.x.x.174:6381 x.x.x.174:6380 --cluster-slave --cluster-master-id xxxxxxxxxxxxxxxxxxxxx -a 123456
搞定!
结语
又是感谢各位前辈的一天~~~