centos7搭建Redis-Cluster集群

centos7搭建Redis-Cluster集群

首先介绍下redis的各种集群方式:
redis有三种集群方式:主从复制,哨兵模式和集群
1.主从复制:
redis最简单的一种集群方式
优点:
主机会自动将数据同步到从机,可以进行读写分离
从库负责读,主库负责写入
采用异步复制
可以一主多从
对于主库和从库来说都是非阻塞的,也就是说在进行主从复制的过程中,双反都可以进行自己的独立操作
缺点:
不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
较难支持在线扩容,当写入并发量足够大时会出现并发瓶颈。

模型:
centos7搭建Redis-Cluster集群_第1张图片

2.哨兵模式
哨兵的含义就是监控Redis系统的运行状态,并做相应的响应
它的功能包括以下两个。
(1)监控主服务器和从服务器是否正常运行。
(2)主服务器出现故障时自动将从服务器转换为主服务器。

优点:
哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
主从可以自动切换,系统更健壮,可用性更高。
缺点:
同样是较难支持在线扩容
centos7搭建Redis-Cluster集群_第2张图片
3.Redis-Cluster集群
特点:
edis-cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
集群之中有多个Master主节点,每一个主节点都可读可写。
节点之间会互相通信,两两相连。
采用分片策略,避免内存浪费
客户端与redis节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
采用主备节点.
说明:
redis的cluster也是依赖选举算法来保证集群的高可用,所以类似zookeeper一样,一般是奇数个节点(可以允许N/2以下的节点失效),再考虑到每个节点做Master-Slave互为备份,所以一个redis cluster集群最少也得6个节点.
centos7搭建Redis-Cluster集群_第3张图片

三者相比较Redis-Cluster集群是最好的选择
安装环境
注意:本人用的是虚拟机搭建的
准备工作:
三台服务器(这个不限,可以一台,可以多台)
内网IP
192.168.56.02
192.168.56.03
192.168.56.04
需要软件和依赖
注意:很多安装说明要求按照ruby,理由是上redis-trib.rb是基于ruby完成的 。
但事实上如果是5.0一下版本确实需要安装 5.0以后就不用了,redis-trib.rb在5.0以后已集成在redis的源码src目录下,用不着按照ruby。

redis: redis-6.0.9.tar.gz
安装
下面一部分是每台服务器上都这么安装

//安装环境依赖
yum install openssl  gcc gcc-c++  -y
安装redis
cd /usr/local/src
下载wget
wget https://download.redis.io/releases/redis-6.0.9.tar.gz
解压文件
tar -zxvf redis-6.0.9.tar.gz
安装redis
 cd redis-6.0.9/
 //编译安装
 //PREFIX redis安装位置
 make PREFIX=/usr/local/redis install

//生成配置文件(注意这三个配置文件是redis的节点,如果想要更多的节点就继续加)
mkdir -p /usr/local/redis/conf/7000 /usr/local/redis/conf/7001 /usr/local/redis/conf/7002

日志存放位置
mkdir -p /usr/local/redis/logs/7000 /usr/local/redis/logs/7001 /usr/local/redis/logs/7002
数据存放位置
mkdir -p /usr/local/redis/data/7000 /usr/local/redis/data/7001 /usr/local/redis/data/7002

//拷贝配置文件
cp /usr/local/src/redis-6.0.9/redis.conf /usr/local/redis/conf/7000/
cp /usr/local/src/redis-6.0.9/redis.conf /usr/local/redis/conf/7001/
cp /usr/local/src/redis-6.0.9/redis.conf /usr/local/redis/conf/7002/

修改redis.conf

cd /usr/local/redis/conf/7000
vi redis.conf
修改下面值
daemonize yes #后台启动
port 7000 #修改端口号,从70007002
cluster-enabled yes #开启cluster,去掉注释
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
//持久化配置
appendonly yes/
//pid位置
pidfile /var/run/redis_7000.pid
//日志位置
logfile "/usr/local/redis/logs/7000/redis.log"
//数据存放位置
dir /usr/local/redis/data/7000
//redis 密码设置,每个节点的密码必须一致
masterauth 123456 连接主节点密码
requirepass qwerty  各个节点访问密码
(允许访问的ip)
bind 172.0.0.1 192.168.56.2 192.168.56.3 192.168.56.4
 protected-mode no 允许其他IP访问

启动各个节点

cd /usr/local/redis
//按配置文件启动
./bin/redis-server /usr/local/redis/conf/7002/redis.conf

在这里插入图片描述
查看进程:

ps -ef| grep redis

可以看到所有节点全部启动
在这里插入图片描述
但这种启动非常麻烦,可以写一个启动脚本一次全部启动
创建redis-cluster集群:

touch /etc/rc.d/init.d/redis-cluster

启动脚本

vi /etc/rc.d/init.d/redis-cluster
#!/bin/sh
# chkconfig:   2345 90 10
# description:  Redis is a persistent key-value database

# 相关配置项,应该根据实际环境信息进行改动,包括for循环中的PIDFILECONF
REDISPORT=(7000 7001 7002)
#redis服务端位置
EXEC=/usr/local/redis/bin/redis-server
#redis客户端位置
CLIEXEC=/usr/local/redis/bin/redis-cli
# redis集群密码,如未设置密码,该配置项可去除,redis集群关闭指令也需要做相应修改
PASSWD=qwerty
for((i=0;i<${#REDISPORT[@]};i++)) do
    PIDFILE=/var/run/redis_${REDISPORT[i]}.pid # 进程守护文件
    CONF=/usr/local/redis/conf/${REDISPORT[i]}/redis.conf # redis节点配置文件

    case "$1" in
        start)
            if [ -f $PIDFILE ]
            then
                    echo "$PIDFILE exists, process is already running or crashed"
            else
                    echo "Starting Redis cluster server ${REDISPORT[i]} ..."
                    #不输出启动信息:nohup $EXEC $CONF > /dev/null 2>&1 &
                    $EXEC $CONF 2>/dev/nul
                    sleep 1
                    if [ -f $PIDFILE ]
                    then
                            echo "Redis cluster ${REDISPORT[i]} startup succeeded!"
                    else
                            echo "ERROR: Redis cluster ${REDISPORT[i]} startup failed!"
                    fi
            fi
            ;;
        stop)
            if [ ! -f $PIDFILE ]
            then
                    echo "$PIDFILE does not exist, process is not running"
            else
                    PID=$(cat $PIDFILE)
                    echo "Stopping Redis cluster ${REDISPORT[i]} ..."
                    # 如果redis集群未设置密码,关闭指令改为:$CLIEXEC -p ${REDISPORT[i]} shutdown
                    $CLIEXEC -p ${REDISPORT[i]}  -a ${PASSWD} shutdown > /dev/null 2>&1 &
                    while [ -x /proc/${PID} ]
                    do
                        echo "Waiting for Redis cluster ${REDISPORT[i]} to shutdown ..."
                        sleep 1
                    done
                    echo "Redis cluster ${REDISPORT[i]} stopped!"
            fi
            ;;
        *)
            echo "Please use start or stop as first argument"
            ;;
    esac

done

赋予脚本权限:

chmod +x /etc/rc.d/init.d/redis-cluster
chkconfig --add redis-cluster   # 注册为系统服务
chkconfig redis-cluster on  # 开机自启动
service redis-cluster stop  # 关闭 redis 集群
service redis-cluster start  # 启动 redis 集群

redis客户端位置设置软连接:

ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis-cli

开放3台主机的端口

firewall-cmd  --add-port=7000/tcp --permanent
firewall-cmd  --add-port=7001/tcp --permanent
firewall-cmd  --add-port=7002/tcp --permanent
firewall-cmd --reload

执行创建集群命令(只在一台服务器上创建)

//cluster create 表示创建集群
//cluster-replicas  参数表示为每个主节点创建几个个从节点,其他参数是实例的地址集合
//-a qwerty 是密码

redis-cli  --cluster create  192.168.56.2:7000 192.168.56.2:7001 192.168.56.2:7002  192.168.56.3:7000 192.168.56.3:7001 192.168.56.3:7002 192.168.56.4:7000 192.168.56.4:7001 192.168.56.4:7002 --cluster-replicas 2 -a qwerty

centos7搭建Redis-Cluster集群_第4张图片

查看集群是否创建成功:

redis-cli -c -p 7000
auth qwerty
cluster nodes
查看集群中哈希槽的数量
cluster slots

至此集群搭建完成。

增加新节点:(增加的是主节点)
步骤:1增加主节点
2.重新分配哈希槽
3.增加从节点

(第一个ip:port 为需要添加的节点ip和端口,第二个ip:port为当前集群中的节点和端口(当前集群下任意一个节点的IP和端口))


redis-cli --cluster add-node 192.168.56.2:7003 172.26.237.83:7000 -a qwerty

重新分配哈希槽

redis-cli --cluster reshard  192.168.56.2:7003 -a qwerty
//输入要分配多少个哈希槽(数量)?比如我要分配1000个哈希槽 分配哈希槽最好是根据主节点的数量控制(16384/n)
输入ID 就是 192.168.56.2:7003对应的id
//选择需要分配的哈希槽来源,输入all(从哪些主节点抽取槽到新节点中:all为所有主节点,done:指定节点,在这里我们输入all,按enter继续:)

添加从节点

cluster-master-id :主节点id
redis-cli --cluster add-node --cluster-slave --cluster-master-id db10a9d5c1662d9e3cee21c5776f2e9709f76619 192.168.56.2:7004 192.168.56.2:7003

redis-cli --cluster add-node --cluster-slave --cluster-master-id db10a9d5c1662d9e3cee21c5776f2e9709f76619 192.168.56.2:7005 192.168.56.2:7003

删除节点
先删除从节点,然后将主节点的哈希槽转移出去,然后在删除主节点

删除从节点(03ccad2ba5dd1e062464bc7590400441fafb63f2:主节点的)
redis-cli del-node 192.168.56.2:7005 '03ccad2ba5dd1e062464bc7590400441fafb63f2'  -a qwerty
转移主节点哈希槽
redis-cli reshard 192.168.56.2:7003
//删除主节点(03ccad2ba5dd1e062464bc7590400441fafb63f2主节点)
redis-cli del-node 192.168.56.2:7003   '03ccad2ba5dd1e062464bc7590400441fafb63f2'  -a qwerty

你可能感兴趣的:(负载均衡)