技术交流QQ群:①185473046   ②190706903   ③203744115   网站地图
登录

下次自动登录
现在的位置: 首页Redis>正文
Linux下Redis集群3主3从部署
2023年06月09日 Redis 暂无评论 ⁄ 被围观 2,195次+

操作系统: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从部署完成。

     
» 转载请注明来源:系统运维 » Linux下Redis集群3主3从部署

  系统运维技术交流QQ群:①185473046 系统运维技术交流□Ⅰ ②190706903 系统运维技术交流™Ⅱ ③203744115 系统运维技术交流™Ⅲ

给我留言

您必须 [ 登录 ] 才能发表留言!



Copyright© 2011-2024 系统运维 All rights reserved
版权声明:本站所有文章均为作者原创内容,如需转载,请注明出处及原文链接
陕ICP备11001040号-3