-
准备
centos7
xshell
redis-5.0.6.tar.gz -
通过xshell上传redis-5.0.6.tar.gz到/usr/local/
-
解压tar -xzvf redis-5.0.6.tar.gz
-
改名mv redis-5.0.6 redis-cluster
-
进入解压后的目录进行编译
cd redis-cluster/
make
make install -
防火墙放开6379、6380、6381、6382、6383、6384端口
如果提示FirewallD is not running,那么按照上面操作启动firewalld.service
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态: systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.servicefirewall-cmd --zone=public --add-port=6379/tcp --permanent
firewall-cmd --zone=public --add-port=6380/tcp --permanent
firewall-cmd --zone=public --add-port=6381/tcp --permanent
firewall-cmd --zone=public --add-port=6382/tcp --permanent
firewall-cmd --zone=public --add-port=6383/tcp --permanent
firewall-cmd --zone=public --add-port=6384/tcp --permanent
firewall-cmd --reloadfirewall-cmd --zone=public --list-ports # 查看放开的端口列表
-
配置redis—[注意目录和文件的读写权限,chmod 666]
/etc/redis-cluster 存放redis的配置文件
cd /etc/
mkdir redis-cluster
cd /usr/local/redis-cluster/
cp redis.conf /etc/redis-cluster/redis_6379.conf/var/redis-cluster 存放redis的持久化文件、日志文件
cd /var/
mkdir redis-cluster
cd redis-cluster
mkdir nodes -
修改配置文件
cd /etc/redis-cluster/
vim redis_6379.conf修改项:
bind 192.168.78.169 # 具体ip,客户端才能远程访问
protected-mode no # yes只能通过本地localhost访问,no可以通过ip远程访问
port 6379 # 端口
requirepass 123456 # 密码,masre、slave必须设置成一样
daemonize yes # yes后台守护进程运行
logfile redis_log_6379.log # 日志文件
pidfile /var/run/redis-cluster/redis_6379.pid # pid保存文件
dir /var/redis-cluster # 持久化文件存放位置
dbfilename dump_6379.rdb # rdb快照持久化文件
save “” # 禁止rdb持久化
appendonly no # 禁止aof持久化
appendfsync everysec # aof持久频率
appendfilename "appendonly_6379.aof" # aof持久化文件
maxmemory 512m # 最大内存
maxmemory-policy volatile-ttl # 当前内存超过maxmemory时淘汰策略
masterauth 123456 # master变成新master的slave时所需密码
cluster-enabled yes # 开启redis-cluster集群
cluster-config-file nodes/nodes_6379.conf # redis-cluster集群中每个节点的配置文件,只能由 redis写,不能手动修改
cluster-node-timeout 15000 # redis-cluster集群每个节点互相ping的超时时间
另外复制5份:
cp redis_6379.conf redis_6380.conf
cp redis_6379.conf redis_6381.conf
cp redis_6379.conf redis_6382.conf
cp redis_6379.conf redis_6383.conf
cp redis_6379.conf redis_6384.conf
vim redis_6380.conf
修改6379为6380
vim redis_6381.conf
修改6379为6381
依次类推
-
启动redis
cd /usr/local/redis-cluster/src/
./redis-server /etc/redis-cluster/redis_6379.conf
./redis-server /etc/redis-cluster/redis_6380.conf
./redis-server /etc/redis-cluster/redis_6381.conf
./redis-server /etc/redis-cluster/redis_6382.conf
./redis-server /etc/redis-cluster/redis_6383.conf
./redis-server /etc/redis-cluster/redis_6384.conf关闭redis (也可以使用ps -ef | grep redis和kill 进程id、killall 进程名称)
cd /usr/local/redis-cluster/src/
./redis-cli -h 192.168.78.169 -p 6379 -a 123456 shutdown
./redis-cli -h 192.168.78.169 -p 6380 -a 123456 shutdown
./redis-cli -h 192.168.78.169 -p 6381 -a 123456 shutdown
…启动、关闭脚本(脚本内容把上面命令copy一遍就可以了)
/root/redis-cluster/redis_start_6379.sh
/root/redis-cluster/redis_start_6380.sh
/root/redis-cluster/redis_start_6381.sh
…/root/redis-cluster/redis_stop_6379.sh
/root/redis-cluster/redis_stop_6380.sh
/root/redis-cluster/redis_stop_6381.sh
…执行.sh脚本
./redis_start_6379.sh
./redis_start_6380.sh
./redis_start_6381.sh./redis_stop_6379.sh
./redis_stop_6380.sh
./redis_stop_6381.sh
注意:如果使用tab键无法自动填充时,考虑当前用户对.sh脚本无执行权限,
查看权限:ls -l,修改权限:chmod 744 redis*(支持通配符*) -
创建集群
./redis-cli --cluster create 192.168.78.169:6379 192.168.78.169:6380 192.168.78.169:6381 192.168.78.169:6382 192.168.78.169:6383 192.168.78.169:6384 --cluster-replicas 1
此时创建了3主3从集群,主从关系使用cluster nodes命令查看
–cluster-replicas 1:表示集群主节点的备份数,主从模式注意:redis5之前版本是用redis-trib.rb
连接任一redis节点查看集群状态:
cd /usr/local/redis-cluster/src/
./redis-cli -h 192.168.78.169 -p 6379 -a 123456
使用redis-cli 插入数据时需要注意,如果key计算的槽不在当前redis实例下会报错!
注意:主节点可以进行读写操作,从节点只能进行读操作!
当一个主节点6379节点挂掉时,会自动切换到从节点6384上
当6379重启后会变成6384的从节点!
扩展:
1、redis-cluster介绍:http://www.redis.cn/topics/cluster-tutorial.html
2、官方推荐最大的redis master节点数量为1000,哈希槽数量16384
为什么是16384?
原因是因为需要把所有的槽放到心跳包里面便于让节点知道当前的全部信息。16348=16k,用bitmap来压缩心跳包的话,就相当于使用2810=2KB大小的心跳包。而如果用crc16算法(redis使用这个而不是用哈希一致性算法)来确定哈希槽的分配。他的最大值是是2的16次方。用上面的算法换算需要8KB的心跳包来传输,作者自己认为这样不划算。而一个redis节点一般不会有超过1000个master(这个是作者自己说的),用16k来划分是比较合适的。