操作系统:CentOS-7.x
Redis版本:5.0.14
服务器ip:192.168.21.100、192.168.21.101、192.168.21.128
部署说明:使用3台服务器,每台服务器启动2个redis服务,总共6个节点,3主3从组成redis集群
IP地址 端口 角色
192.168.21.100 6379 redis-master
192.168.21.100 6380 redis-slave
192.168.21.101 6379 redis-master
192.168.21.101 6380 redis-slave
192.168.21.128 6379 redis-master
192.168.21.128 6380 redis-slave
Redis集群模式下端口说明:
在Redis集群模式下,每个Redis实例需要绑定两个端口:
一个用于节点间的通信(cluster bus):6379,6380
另一个用于客户端访问的集群端口(cluster client)16379,16380
集群端口:
1、集群端口是普通端口+10000(10000是固定值,无法改变),如6379节点的集群端口为16379,6380节点的集群端口为16380
2、集群端口只用于节点之间的通信,如搭建集群、增减节点等操作时节点间的通信
3、客户端连接数据库还是要用普通通讯端口如6379,不要使用客户端连接集群接口16379
安装部署Redis集群
在所有服务器上操作
1、防火墙配置
开启tcp6379,16379,6380,16380端口
CentOS 7.x默认使用的是firewall作为防火墙,这里改为iptables防火墙。
1.1、关闭firewall:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
systemctl mask firewalld
systemctl stop firewalld
yum remove firewalld
1.2、安装iptables防火墙
yum install iptables-services #安装
vi /etc/sysconfig/iptables #编辑防火墙配置文件
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 16379 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6380 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 16380 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
:wq! #保存退出
systemctl restart iptables.service #最后重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动
/usr/libexec/iptables/iptables.init restart #重启防火墙
2、关闭SELINUX
vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
setenforce 0 #使配置立即生效
3、调整内核参数
vi /etc/sysctl.conf
vm.overcommit_memory = 1 #设置为1,使redis在低内存下能正常运行
:wq! #保存退出
sysctl -p #设置立即生效
4、下载安装包
下载地址:https://download.redis.io/releases/redis-5.0.14.tar.gz
上传安装包到服务器/data/soft目录
5、安装Redis
5.1服务器需要有编译环境,如果没有需要安装
gcc -v #查看版本
yum install gcc gcc-c++ #安装gcc
5.2创建Redis相关工作目录
mkdir -p /data/server/redis-cluster/{data/{redis_6379,redis_6380},conf,log}
目录说明:
/data/server/redis-cluster/ #安装目录
/data/server/redis-cluster/data #数据存放目录
/data/server/redis-cluster/conf #文件存放目录
/data/server/redis-cluster/log #日志目录
5.3编译安装Redis
cd /data/soft
tar -zxvf redis-5.0.14.tar.gz
cd redis-5.0.14
make
make install PREFIX=/data/server/redis-cluster
5.4、添加Redis服务到环境变量
vi /etc/profile
#set redis environment
export REDIS_HOME=/data/server/redis-cluster
export PATH=$PATH:$REDIS_HOME/bin
:wq! #保存退出
source /etc/profile #使配置立即生效
6、配置redis
6.1拷贝redis配置文件
cp /data/soft/redis-5.0.14/redis.conf /data/server/redis-cluster/conf/redis_6379.conf
cp /data/soft/redis-5.0.14/redis.conf /data/server/redis-cluster/conf/redis_6380.conf
6.2修改redis配置文件
2个redis服务的配置文件就只有端口和配置文件路径不同,其他都一样
6.2.1修改redis-master配置文件
vi /data/server/redis-cluster/conf/redis_6379.conf
port 6379 #修改redis监听端口
bind 0.0.0.0 #表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
daemonize yes #允许redis后台运行
pidfile /data/server/redis-cluster/redis_6379.pid #pid存放路径
logfile "/data/server/redis-cluster/log/redis_6379.log" #设置日志存放路径
dir /data/server/redis-cluster/data/redis_6379 #数据目录
cluster-enabled yes #开启集群
cluster-config-file /data/server/redis-cluster/conf/nodes_6379.conf
#集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息
#这个文件并不需要手动配置,这个配置文件有Redis生成并更新
cluster-node-timeout 15000
#节点互连超时的阀值。集群节点超时毫秒数,默认15秒
appendonly yes
#Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,
#每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
requirepass 123456 #设置redis密码
masterauth 123456 #主从同步master的密码,如果没有设置redis密码,则无需配置此密码
maxmemory 10GB #一般线上生产环境,Redis 的内存尽量不要超过 10g,超过 10g 可能会有问题。
:wq! #保存退出
6.2.2修改redis-slave配置文件
vi /data/server/redis-cluster/conf/redis_6380.conf
#修改redis配置文件
port 6380
bind 0.0.0.0
daemonize yes
pidfile /data/server/redis-cluster/redis_6380.pid
logfile "/data/server/redis-cluster/log/redis_6380.log"
dir /data/server/redis-cluster/data/redis_6380
cluster-enabled yes
cluster-config-file /data/server/redis-cluster/conf/nodes_6380.conf
cluster-node-timeout 15000
appendonly yes
requirepass 123456
masterauth 123456
:wq! #保存退出
7、启动Redis
7.1集群内每台服务器分别启动两个redis
/data/server/redis-cluster/bin/redis-server /data/server/redis-cluster/conf/redis_6379.conf
/data/server/redis-cluster/bin/redis-server /data/server/redis-cluster/conf/redis_6380.conf
验证是否启动成功
ps -ef | grep redis
查看版本
/data/server/redis-cluster/bin/redis-cli --version
/data/server/redis-cluster/bin/redis-server --version
#强制关闭redis
ps -ef | grep redis | grep -v grep |awk '{print $2}' | xargs kill -9
7.2创建redis启动脚本
7.2.1创建redis-master启动脚本
vi /data/server/redis-cluster/redis_6379.sh
#!/bin/bash
#应用名称
APP_NAME=redis-cluster
#Redis端口
REDISPORT=6379
#Redis安装目录
DIR=/data/server/redis-cluster
#Redis进程文件
PIDFILE=/data/server/redis-cluster/redis_6379.pid
#Redis配置文件
CONF="/data/server/redis-cluster/conf/redis_6379.conf"
#Redis密码
AUTH='123456'
#使用说明,用来提示输入参数
usage() {
echo "Usage: ./redis.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist() {
if [ -f $PIDFILE ]
then
pid=$(cat $PIDFILE)
else pid=
fi
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
echo "Starting Redis server..."
$DIR/bin/redis-server $CONF
fi
}
#停止方法
stop() {
is_exist
if [ $? -eq "0" ]; then
$DIR/bin/redis-cli -p $REDISPORT -a $AUTH shutdown 2>/dev/null
sleep 2
while [ -x $PIDFILE ]
do
echo "Waiting for Redis to shutdown..."
sleep 1
done
echo "Redis stopped"
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is not running."
fi
}
#重启
restart() {
stop
sleep 2
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
:wq! #保存退出
#添加执行权限
chmod +x /data/server/redis-cluster/redis_6379.sh
sh /data/server/redis-cluster/redis_6379.sh start #启动redis
7.2.2创建redis-slave启动脚本
vi /data/server/redis-cluster/redis_6380.sh
#!/bin/bash
#应用名称
APP_NAME=redis-cluster
#Redis端口
REDISPORT=6380
#Redis安装目录
DIR=/data/server/redis-cluster
#Redis进程文件
PIDFILE=/data/server/redis-cluster/redis_6380.pid
#Redis配置文件
CONF="/data/server/redis-cluster/conf/redis_6380.conf"
#Redis密码
AUTH='123456'
#使用说明,用来提示输入参数
usage() {
echo "Usage: ./redis.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist() {
if [ -f $PIDFILE ]
then
pid=$(cat $PIDFILE)
else pid=
fi
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
echo "Starting Redis server..."
$DIR/bin/redis-server $CONF
fi
}
#停止方法
stop() {
is_exist
if [ $? -eq "0" ]; then
$DIR/bin/redis-cli -p $REDISPORT -a $AUTH shutdown 2>/dev/null
sleep 2
while [ -x $PIDFILE ]
do
echo "Waiting for Redis to shutdown..."
sleep 1
done
echo "Redis stopped"
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status() {
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is not running."
fi
}
#重启
restart() {
stop
sleep 2
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
:wq! #保存退出
#添加执行权限
chmod +x /data/server/redis-cluster/redis_6380.sh
sh /data/server/redis-cluster/redis_6380.sh start #启动redis
8、创建Redis集群
注意:redis5.0以上使用redis-cli创建集群,不用再安装ruby
默认情况下,redis会自动分配主节点、从节点、以及主节点对应的从节点
--cluster-replicas 1 #表示每个主节点带1个从节点
-a 123456 #Redis的登录密码
8.1自动创建集群命令
#一般使用自动创建集群命令即可
#只在其中一个节点执行创建命令
/data/server/redis-cluster/bin/redis-cli -a 123456 --cluster create 192.168.21.100:6379 192.168.21.101:6379 192.168.21.128:6379 192.168.21.100:6380 192.168.21.101:6380 192.168.21.128:6380 --cluster-replicas 1
#redis询问是否接收这样的分配结果,输入yes即可
#出现如下提示说明redis集群创建成功
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
8.2手动创建redis集群,6节点,构成3主3从集群模式
#指定每台服务器上redis的6379端口定为主节点,先创建主节点
/data/server/redis-cluster/bin/redis-cli -a 123456 --cluster create 192.168.21.100:6379 192.168.21.101:6379 192.168.21.128:6379
#输入yes表示接受分配结果
>>> Performing Cluster Check (using node 192.168.21.100:6379)
M: 0c55eea9e4236aff1cee9236632551a2737790ce 192.168.21.100:6379
slots:[0-5460] (5461 slots) master
M: b7620027a53293516ffe6c056a0b4ebd9db5b808 192.168.21.128:6379
slots:[10923-16383] (5461 slots) master
M: 2e914ba6a911025e938a0851b30198564ed56509 192.168.21.101:6379
slots:[5461-10922] (5462 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#为每个master节点添加slave节点
#slave节点 --cluster add-node 192.168.21.101:6380
#master节点 192.168.21.100:6379
#--cluster-master-id参数指定该salve节点对应的master节点的id
#master节点192.168.21.100:6379对应的slave节点192.168.21.101:6380
/data/server/redis-cluster/bin/redis-cli -a 123456 --cluster add-node 192.168.21.101:6380 192.168.21.100:6379 --cluster-slave --cluster-master-id 0c55eea9e4236aff1cee9236632551a2737790ce
#master节点192.168.21.101:6379对应的slave节点192.168.21.128:6380
/data/server/redis-cluster/bin/redis-cli -a 123456 --cluster add-node 192.168.21.128:6380 192.168.21.101:6379 --cluster-slave --cluster-master-id 2e914ba6a911025e938a0851b30198564ed56509
#master节点192.168.21.128:6379对应的slave节点192.168.21.100:6380
/data/server/redis-cluster/bin/redis-cli -a 123456 --cluster add-node 192.168.21.100:6380 192.168.21.128:6379 --cluster-slave --cluster-master-id b7620027a53293516ffe6c056a0b4ebd9db5b808
8.3检查集群是否创建成功
在任意节点上指定节点的ip端口执行即可完成集群状态检查:
/data/server/redis-cluster/bin/redis-cli --cluster check 192.168.21.100:6379 -a 123456
#查看集群内主从关系:
/data/server/redis-cluster/bin/redis-cli -a 123456 -h 192.168.21.100 -p 6379 -c cluster slots | xargs -n8 | awk '{print $3":"$4"->"$6":"$7}' | sort -nk2 -t ':' | uniq
8.4进入redis控制台
/data/server/redis-cluster/bin/redis-cli -a 123456 -h 192.168.21.101 -p 6379 -c
cluster info #查看集群信息
cluster nodes #查看集群节点列表
9、进行数据验证操作
在任意节点执行,插入数据:
/data/server/redis-cluster/bin/redis-cli -a 123456 -h 192.168.21.100 -p 6379 -c
192.168.21.100:6379> set mykey "test redis-cluster"
在其他节点,查询数据
/data/server/redis-cluster/bin/redis-cli -a 123456 -h 192.168.21.101 -p 6379 -c
192.168.21.101:6379> get mykey
/data/server/redis-cluster/bin/redis-cli -a 123456 -h 192.168.21.128 -p 6379 -c
192.168.21.128:6379> get mykey
10、验证集群故障转移
使用3台服务器,每台服务器启动2个redis服务,总共6个节点,3主3从组成redis集群,最多允许1台服务器挂掉
现在我们关闭其中一台服务器192.168.21.100的redis服务
sh /data/server/redis-cluster/redis_6379.sh stop
sh /data/server/redis-cluster/redis_6380.sh stop
进入redis控制台
/data/server/redis-cluster/bin/redis-cli -a 123456 -h 192.168.21.101 -p 6379 -c
cluster info #查看集群信息
cluster nodes #查看集群节点列表
192.168.21.101:6379> set mykey "test redis-cluster failover"
192.168.21.101:6379> get mykey
#查看集群内主从关系:
/data/server/redis-cluster/bin/redis-cli -a 123456 -h 192.168.21.128 -p 6379 -c cluster slots | xargs -n8 | awk '{print $3":"$4"->"$6":"$7}' | sort -nk2 -t ':' | uniq
#再次启动192.168.21.100的redis服务
sh /data/server/redis-cluster/redis_6379.sh start
sh /data/server/redis-cluster/redis_6380.sh start
#查看集群内主从关系:
/data/server/redis-cluster/bin/redis-cli -a 123456 -h 192.168.21.128 -p 6379 -c cluster slots | xargs -n8 | awk '{print $3":"$4"->"$6":"$7}' | sort -nk2 -t ':' | uniq
进入redis控制台
/data/server/redis-cluster/bin/redis-cli -a 123456 -h 192.168.21.101 -p 6379 -c
192.168.21.100:6379> get mykey
#在Redis从节点写入数据,会自动把数据写入到对应的主节点上面
11、如果需要重新创建Redis集群需要删掉下列目录文件
1、先停止每个节点上的redis实例
sh /data/server/redis-cluster/redis_6379.sh stop
sh /data/server/redis-cluster/redis_6380.sh stop
2、删除集群配置文件
rm -rf /data/server/redis-cluster/conf/nodes_6379.conf
rm -rf /data/server/redis-cluster/conf/nodes_6380.conf
3、清空各个节点每个实例的数据目录
rm -rf /data/server/redis-cluster/data/redis_6379/*
rm -rf /data/server/redis-cluster/data/redis_6380/*
4、启动每个节点上的redis实例
sh /data/server/redis-cluster/redis_6379.sh start
sh /data/server/redis-cluster/redis_6380.sh start
5、再次重新创建redis集群,只在其中一个节点执行
/data/server/redis-cluster/bin/redis-cli -a 123456 --cluster create 192.168.21.100:6379 192.168.21.101:6379 192.168.21.128:6379 192.168.21.100:6380 192.168.21.101:6380 192.168.21.128:6380 --cluster-replicas 1
至此,Linux下Redis集群3主3从部署完成。