redis集群

redis集群安装配置

 

redis4集群部署

 

三台服务器共6个节点,一台机器两个节点,创建出3 master、3 salve 环境。

redis 采用 redis-4.0.1 版本。

node1:192.168.0.1

node2:192.168.0.2

node3:192.168.0.3

 

 

安装过程

 

1. 下载并解压

复制代码
cd /usr/local/src/

wget http://download.redis.io/releases/redis-4.0.1.tar.gz

tar xf redis-4.0.1.tar.gz

cp -ra redis-4.0.1 /usr/local/

cd /usr/local/

mv  redis-4.0.1 redis
复制代码

 

 

2. 编译安装

复制代码
指定安装目录到:

cd /usr/local/redis

make && make install PREFIX=/usr/local/redis

echo "export PATH=$PATH:/usr/local/redis/bin" >> /etc/profile

source /etc/profile

echo $PATH
复制代码

 

 

3:创建配制节点

复制代码
node1服务器:

# mkdir -p /usr/local/redis/redis_cluster/7000

# mkdir -p /usr/local/redis/redis_cluster/7001

 

# cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7000

# cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7001

 

node2服务器:

# mkdir -p /usr/local/redis/redis_cluster/7002

# mkdir -p /usr/local/redis/redis_cluster/7003

 

# cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7002

# cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7003

 

node3服务器:

# mkdir -p /usr/local/redis/redis_cluster/7004

# mkdir -p /usr/local/redis/redis_cluster/7005

 

# cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7004

# cp /usr/local/redis/redis.conf /usr/local/redis/redis_cluster/7005

 
复制代码

 

 

 

4:修改redis.conf

复制代码
最好复制配置文件修改对应的配置项即可,不要删除默认配置

切记:不能设置密码,否则集群启动时会连接不上

 

port  7000                                //端口根据对应的文件夹去配制端口 7000,7001,7002,7003,7004,7005      

bind 本机ip                               //根据本机所在的IP或hostname去配制 node1 node2 node3

daemonize    yes                          //redis后台运行

pidfile  /var/run/redis_7000.pid          //pidfile文件对应7000,7001,7002,7003,7004,7005

cluster-enabled  yes                      //开启集群  把注释#去掉

cluster-config-file  nodes_7000.conf      //集群的配置  配置文件首次启动自动生成 7000,7001,7002,7003,7004,7005

cluster-node-timeout  15000               //请求超时  默认15秒,可自行设置

appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志

 
复制代码

 

 

5:复制src目录中的redis-trib.rb 到/usr/local/redis/bin目录

# cp  /usr/local/redis/src/redis-trib.rb /usr/local/redis/bin

 

 

6:node1安装ruby环境

复制代码
去官网下载:http://www.ruby-lang.org/en/downloads/  

最新的版本为2.4.1,但是此版本会有告警,建议使用2.3.4版本

将ruby源码包上传至/usr/local/src目录

cd /usr/local/src

wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.4.tar.gz

tar -zxvf ruby-2.3.4.tar.gz

cd ruby-2.3.4

./configure --prefix=/usr/local/ruby

make && make install

echo "export PATH=$PATH:/usr/local/ruby/bin"  >>  /etc/profile

source /etc/profile

echo $PATH

ruby -v

cd /usr/local/ruby/

wget https://rubygems.org/gems/redis/versions/4.0.0.rc1

wget https://rubygems.org/downloads/redis-4.0.0.rc1.gem

gem install -l ./redis-4.0.0.rc1.gem

 
复制代码

 

 

 

 

7:启动各个节点

复制代码
node1服务器:

/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7000/redis.conf &

/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7001/redis.conf &

 

node2服务器:

/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7002/redis.conf &

/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7003/redis.conf &

 

node3服务器:

/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7004/redis.conf &

/usr/local/redis/bin/redis-server /usr/local/redis/redis_cluster/7005/redis.conf &

 
复制代码

 

 

8:检查各节点是否启动

复制代码
查看进程

ps -ef | grep redis

 

查看端口

netstat -tnlp | grep redis
复制代码

 

 

9:创建集群

复制代码
 
 
  1.确保机器之前端口都通,建议开通所有端口
 
  2.开始创建集群
node1:

cd /usr/local/redis/bin/

./redis-trib.rb create --replicas 1 192.168.0.1:7000 192.168.0.1:7001 192.168.0.2:7002 192.168.0.2:7003 192.168.0.3:7004 192.168.0.3:7005

按提示输入 yes即可 ./redis-trib.rb 报错:/usr/local/rvm/gems/ruby-2.4.2/gems/redis-4.0.1/lib/redis/client.rb:119:in `call' 错误提示是 slot插槽被占用了(这是 搭建集群前时,以前redis的旧数据和配置信息没有清理干净。) 解决方案是 用redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了。 然后重新执行群集脚本命令: cd /usr/local/redis/bin/ ./redis-trib.rb create --replicas 1 192.168.0.1:7000 192.168.0.1:7001 192.168.0.2:7002 192.168.0.2:7003 192.168.0.3:7004 192.168.0.3:7005
复制代码

 

 

10:验证集群

复制代码
每台服务器的连接参数,-c必不可少

 

redis-cli -h node1 -p 7000 -c

192.168.0.1:7000> set hello world

192.168.0.1:7000> get hello

"world"

 

redis-cli -h node2 -p 7002 -c

192.168.0.2:7002> get hello

-> Redirected to slot [866] located at 192.168.0.1:7000

"world"

 

redis-cli -h node3 -p 7004 -c

192.168.0.3:7004> get hello

-> Redirected to slot [866] located at 192.168.0.1:7000

"world"

 
复制代码

 

 

集群状态查看:

复制代码
1.redis-trib.rb check 192.168.0.2:7002

 

2.#/usr/local/redis/bin/redis-cli -c -h 10.32.51.210 -p 7000

10.32.51.210:7000> cluster nodes

 
复制代码

 

说明集群运作正常。

简单说一下原理

 

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

 

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。

 

Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。

 

需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

 

 

集群操作脚本

  cd  /opt/shell/

#!/bin/bash
basePath=$(cd `dirname $0`; pwd)
cipFile='./cIpPort.txt'
redisCli=`which redis-cli`
#redisCli='/usr/local/redis_cluster/bin/redis-cli'
host=`ps -ef|grep redis |grep cluster |awk '{print $(NF-1)}'|grep : |head -1|awk -F : '{print $1}'`
port=`ps -ef|grep redis |grep cluster |awk '{print $(NF-1)}'|grep : |head -1|awk -F : '{print $2}'`

cd $basePath
$redisCli -h $host -p $port -c cluster nodes|grep master|awk '{print $2}'|awk -F @ '{print $1}' > $cipFile
sed -i 's/^/-h /g' $cipFile && sed -i 's/:/ -p /g' $cipFile

function lookRedis(){
$redisCli -h $host -p $port -c cluster nodes
rm -f $cipFile
}


function flushRedis(){
    echo -n -e "\033[31m请再次确认,此操作会清空redis!(Y/N):\033[0m"
    read yorn
    if [ $yorn = "Y" ] || [ $yorn = "y" ]; then
        cat $cipFile | while read ciport
        do
            echo "$ciport" && $redisCli -c $ciport flushall && sleep 1 && echo -e "\033[32m--flushall redis succeed!--\033[0m"
        done
    fi
    rm -f $cipFile
}

function delKey(){
echo -n -e "\033[31m请输入要删除的key:\033[0m"
read searchkey

echo -n -e "\033[31m是否要先查询此key(Y/N):\033[0m"
read searchFlag

if [ $searchFlag = "Y" ] || [ $searchFlag = "y" ]; then
    cat $cipFile | while read ciport
    do
    echo -e "\033[32m========结果如下:\033[0m"
        echo "$ciport" && $redisCli -c $ciport keys $searchkey
    done
fi

echo -n -e "\033[31m确定删除(Y/N):\033[0m" 
read runCommand
if [ $runCommand = "Y" ] || [ $runCommand = "y" ]; then
    cat $cipFile | while read ciport
    do
    echo -e "\033[32m========结果如下:\033[0m"
    echo "$ciport"
        $redisCli -c $ciport keys $searchkey | xargs -i $redisCli -c $ciport  del {}
    done
    echo "完成"
fi

rm -f $cipFile
}

function getKey(){
echo -n -e "\033[31m请输入要取值的key:\033[0m"
read searchkey

echo -n -e "\033[31m是否要先查询此key(Y/N):\033[0m"
read searchFlag

if [ $searchFlag = "Y" ] || [ $searchFlag = "y" ]; then
    cat $cipFile | while read ciport
    do
    echo -e "\033[32m========结果如下:\033[0m"
        echo "$ciport" && $redisCli -c $ciport keys $searchkey
    done
fi

echo -n -e "\033[31m确定get(Y/N):\033[0m" 
read runCommand
if [ $runCommand = "Y" ] || [ $runCommand = "y" ]; then
    cat $cipFile | while read ciport
    do
    echo -e "\033[32m========结果如下:\033[0m"
    echo "$ciport"
        $redisCli -c $ciport keys $searchkey | xargs -i $redisCli -c $ciport  get {}
    done
    echo "完成"
fi

rm -f $cipFile
}

cat << EOF
+--------Redis-------------+
|1、 查看redis集群信息     |
|2、 清空redis集群         |
|3、 del key值             |
|4、 get key值             |
===========================|
|[Q|q|quit] to quit        |
+--------------------------+
EOF

read -p "----------------------------------------------请选择你要执行的选项编号-------------------------------------------: " choice

case $choice in
    1)
      lookRedis
      ;;
    2)
      flushRedis
      ;;
    3)
      delKey
      ;;
    4)
      getKey
      ;;
    Q|q|quit)
      exit
      ;;
    *)
      echo "程序异常退出,Please: select one number(1|2|3)"
      exit
      ;;
esac

 

 

 

posted @ 2020-11-17 11:55  扶我起来写代码  阅读(94)  评论(0)    收藏  举报