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:创建集群
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


浙公网安备 33010602011771号