1、环境
系统
两台centos7.9 虚拟机
[root@redis-m-151 redis7]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
软件
redis架构
用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master、3 salve 环境。
2、安装过程
1. 下载并解压
cd /root/software #sdg
wget http://download.redis.io/releases/redis-7.0.0.tar.gz
tar -zxvf redis-7.0.0.tar.gz
2. 编译安装
cd redis-7.0.0 make && make install
3. 将 redis-trib.rb 复制到 /usr/local/bin 目录下
cd src
cp redis-trib.rb /usr/local/bin/
4. 创建 Redis 节点
a.创建配置文件目录并拷贝文件
在/root/redis7目录下创建 redis_cluster 目录;
在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中
[root@redis-m-151 redis7]# mkdir redis_cluster
[root@redis-m-151 redis_cluster]# mkdir 7000 7001 7002
[root@redis-m-151 redis_cluster]# ls
7000 7001 7002
[root@redis-m-151 redis_cluster]# cp ../redis.conf 7000/
[root@redis-m-151 redis_cluster]# cp ../redis.conf 7001/
[root@redis-m-151 redis_cluster]# cp ../redis.conf 7002/
b.修改这三个配置文件
# 修改如下内容
port 7000 //端口7000,7002,7003
# bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释 # 去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
192.168.8.154操作
:::info
操作重复以上三步,只是把目录改为7003、7004、7005,对应的配置文件也按照这个规则修改即可
实际操作过程中,修改一个配置文件,将其复制到其余目录即可,然后替换端口号
:::
[root@redis-s-154 redis_cluster]# sed -i 's/7000/7003/g' 7003/redis.conf
[root@redis-s-154 redis_cluster]# sed -i 's/7000/7004/g' 7004/redis.conf
[root@redis-s-154 redis_cluster]# sed -i 's/7000/7005/g' 7005/redis.conf
5. 启动各个节点
redis-server redis_cluster/7000/redis.conf
redis-server redis_cluster/7001/redis.conf
redis-server redis_cluster/7002/redis.conf
redis-server redis_cluster/7003/redis.conf
redis-server redis_cluster/7004/redis.conf
redis-server redis_cluster/7005/redis.conf
redis-server redis_cluster/7003/redis.conf && redis-server redis_cluster/7004/redis.conf && redis-server redis_cluster/7005/redis.conf
redis-server redis_cluster/7000/redis.conf && redis-server redis_cluster/7001/redis.conf && redis-server redis_cluster/7002/redis.conf
6. 检查 redis 启动情况
ps -ef | grep redis
netstat -tlnp | grep redis
192.168.8.151操作
192.168.8.154操作
7.创建集群
Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第三步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。
redis-trib.rb create --replicas 1 192.168.8.151:7000 192.168.8.151:7001 192.168.8.151:7002 192.168.8.154:7003 192.168.8.154:7004 192.168.8.154:7005
:::info
前三个 ip:port 为第一台机器的节点,剩下三个为第二台机器。
—replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。
:::
:::danger
报错
/usr/bin/env: ruby: No such file or directory
这个工具是用 ruby 实现的,所以需要安装 ruby。
solve:
安装命令如下:
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
:::
gem install redis
错误代码:ERROR: Error installing redis-4.2.1.gem:redis requires Ruby version >= 2.4.0.
首先我们查看当前的ruby的版本
ruby -v
发现为2.0版本。所以需要升级到2.4以上版本
安装新的ruby
curl -L get.rvm.io | bash -s stable
报错:
没有公钥
安装提示信息,有三种解决办法
这里使用下面这种:
curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
重新安装
curl -L get.rvm.io | bash -s stable 可能会执行失败,需要多试试几次
find / -name rvm -print #如果未找到重新执行上面步骤
source /usr/local/rvm/scripts/rvm
rvm list known
rvm remove 2.0.0
rvm install 2.7.0
再运行 redis-trib.rb 命令,会出现如下提示:
[root@redis-m-151 ~]# redis-trib.rb create --replicas 1 192.168.8.151:7000 192.168.8.151:7001 192.168.8.151:7002 192.168.8.154:7003 192.168.8.154:7004 192.168.8.154:7005
WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead.
All commands and features belonging to redis-trib.rb have been moved
to redis-cli.
In order to use them you should call redis-cli with the --cluster
option followed by the subcommand name, arguments and options.
Use the following syntax:
redis-cli --cluster SUBCOMMAND [ARGUMENTS] [OPTIONS]
Example:
redis-cli --cluster create 192.168.8.151:7000 192.168.8.151:7001 192.168.8.151:7002 192.168.8.154:7003 192.168.8.154:7004 192.168.8.154:7005 --cluster-replicas 1
To get help about all subcommands, type:
redis-cli --cluster help
redis-cli --cluster create 192.168.8.151:7000 192.168.8.151:7001 192.168.8.151:7002 192.168.8.154:7003 192.168.8.154:7004 192.168.8.154:7005 --cluster-replicas 1
[ERR] Node 192.168.8.151:7000 DENIED Redis is running in protected mode because protected mode is enabled and no password is set for the default user. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions:
1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent.
2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server.
3) If you started the server manually just for testing, restart it with the '--protected-mode no' option.
4) Setup a an authentication password for the default user. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
#翻译
[ERR]节点192.168.8.151:7000 DENIED Redis运行在保护模式中,因为启动了保护模式且默认用户未设置密码。 在此模式下,只接受loopback接口的连接。 如果你想从外部电脑连接到Redis,你可以采用以下解决方案之一:
1)只要禁用保护模式发送命令'CONFIG SET protected-mode no'从环回接口连接到服务器正在运行的同一主机的Redis,但要确保Redis不是公开从互联网访问,如果你这样做。 使用CONFIG REWRITE使此更改永久生效。
2)或者你可以通过编辑Redis的配置文件来禁用保护模式,然后将保护模式选项设置为“no”,然后重新启动服务器。
3)如果你只是为了测试而手动启动服务器,用“--protected-mode no”选项重新启动它。
4)为默认用户设置认证密码。 注意:为了让服务器开始接受来自外部的连接,您只需要执行上述一项操作。
解决:
逐个配置文件执行
sed -i 's/protected-mode yes/protected-mode no/g' redis_cluster/7002/redis.conf
再运行 redis-trib.rb 命令,会出现如下提示:
:::info
输入 yes 即可,然后出现如下内容,说明安装成功。
:::
:::info 如果部署节点使用不同的IP地址,redis-trib.rb会尽可能保证主从节点不分配在同一机器下,因此会重新排序节点列表顺序。节点列表顺序用于确定主从角色,先主节点之后是从节点。创建过程中首先会给出主从节点角色分配的计划,当我们同意这份计划之后输入yes,redis-trib.rb开始执行节点握手和槽分配操作。 :::
8. 集群验证
在第一台机器上连接集群的7002端口的节点,在另外一台连接7005节点,连接方式为 redis-cli -h 192.168.8.151 -c -p 7002 ,加参数 -C 可连接到集群,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略。
# 在7003节点执行命令 set hello world ,执行结果如下:
192.168.8.154:7003> set hello rain
-> Redirected to slot [866] located at 192.168.8.151:7000
OK
192.168.8.151:7000>
# 然后在另外一台7002端口,查看 key 为 hello 的内容, get hello ,执行结果如下:
192.168.8.151:7002> get hello
-> Redirected to slot [866] located at 192.168.8.151:7000
"rain"
192.168.8.151:7000>
说明集群运作正常。 :::success Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。
需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。 :::
9、验证集群的完整性
:::info
集群完整性指所有的槽都分配到存活的主节点上,只要16384个槽中有一个没有分配给节点则表示集群不完整。可以使用redis-trib.rb check命令检测之前创建的集群是否成功,check命令只需要给出集群中任意一个节点地址就可以完成整个集群的检查工作,命令如下:
redis-cli —cluster check 127.0.0.1:7000
:::
10、验证hash分配是否均匀
1.首先插入1000条数据
[root@redis-m-151 redis7]# for i in {1..1000}
do
redis-cli -c -h 192.168.8.151 -p 7000 set key_${i} value_${i}
done
OK
2.查看每个节点的数据量
[root@redis-m-151 redis7]# redis-cli -c -h 192.168.8.151 -p 7000 dbsize
(integer) 335
[root@redis-m-151 redis7]# redis-cli -c -h 192.168.8.151 -p 7001 dbsize
(integer) 330
[root@redis-m-151 redis7]# redis-cli -c -h 192.168.8.151 -p 7002 dbsize
(integer) 337
[root@redis-m-151 redis7]# redis-cli -c -h 192.168.8.154 -p 7003 dbsize
(integer) 337
[root@redis-m-151 redis7]# redis-cli -c -h 192.168.8.154 -p 7004 dbsize
(integer) 330
[root@redis-m-151 redis7]# redis-cli -c -h 192.168.8.154 -p 7005 dbsize
(integer) 335
11、查看集群分配的误差值
[root@redis-s-154 redis7]# redis-cli --cluster rebalance 192.168.8.154:7003
>>> Performing Cluster Check (using node 192.168.8.154:7003)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.00% threshold.