实现redis Cluseter高可用分片集群
1、安装Redis
wget http://download.redis.io/releases/redis-3.2.12.tar.gz
tar xf redis-3.2.12.tar.gz && mv redis-3.2.12 redis
cd redis && make
2、启动redis-server
redis-server & #默认端口6379
[root@centos74-redis ~]# lsof -i:6379
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 12062 root 4u IPv6 26452 0t0 TCP *:6379 (LISTEN)
redis-ser 12062 root 5u IPv4 26453 0t0 TCP *:6379 (LISTEN)
3、客户端连接测试
#交互式简单存取数据
[root@centos74-redis ~]# redis-cli
127.0.0.1:6379> set name ren
OK
127.0.0.1:6379> get name
"ren"
127.0.0.1:6379>
#非交互式简单存取数据:类似mysql -e参数
[root@centos74-redis ~]# redis-cli set name cheng
OK
[root@centos74-redis ~]# redis-cli get name
"cheng"
[root@centos74-redis ~]#
#删除数据
[root@centos74-redis ~]# redis-cli del name
(integer) 1
[root@centos74-redis ~]# redis-cli get name
(nil)
[root@centos74-redis ~]# redis-cli
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
4、安装redis-trib.rb需要的依赖环境
#安装Ruby环境
yum install ruby rubygems –y
#使用国内源
gem sources --add http://mirrors.aliyun.com/rubygems/ --remove https://rubygems.org/
#检查源
gem sources -l
*** CURRENT SOURCES ***
http://mirrors.aliyun.com/rubygems/
#安装依赖软件
gem install redis -v 3.3.3
5、创建存放多个实例的目录
(以单台主机为例)
7000-70005六台机器,三台机器为主,三台为从
[root@centos74-redis ~]# mkdir -p /data/700{0..5}
cat >> /data/7000/redis.conf << 'EOF' port 7000 daemonize yes pidfile /data/7000/redis.pid logfile /data/7000/redis.log loglevel notice dir /data/7000 dbfilename dump.rdb protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF
#配置7001实例
#拷贝redis.conf配置文件
cp /data/{7000,7001}/redis.conf
sed -i 's#7000#7001#g' /data/7001/redis.conf
#配置7002实例(同理配置7003-7005)
#拷贝redis.conf配置文件
cp /data/{7000,7002}/redis.conf
sed -i 's#7000#7002#g' /data/7002/redis.conf
#启动实例
redis-server /data/7000/redis.conf
redis-server /data/7001/redis.conf
redis-server /data/7002/redis.conf
redis-server /data/7003/redis.conf
redis-server /data/7004/redis.conf
redis-server /data/7005/redis.conf
6、创建集群
1)创建一个包含三个主节点和三个从节点的集群
#创建集群
[root@centos74-redis ~]# redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
主:7000—7003从
主:7001—7004从
主:7002—7005从
命令参数的含义:
选项 create 表示希望创建一个新的集群。
选项 --replicas 1 表示希望集群中的每个主节点创建一个从节点。
之后跟着的多个host:port参数,则是实例的地址列表,希望程序使用这些地址所指示的实例来创建新集群。
2)redis-trib 会打印出一份预想中的配置,如果没问题就可以输入 yes ,redis-trib 就会将这份配置应用到集群当中
3)输入yes并回车确认之后,集群将会配置应用到各个节点, 并连接各个节点,让节点之间开始互相通讯
4)创建成功则输出如下信息
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
5)集群状态
[root@centos74-redis ~]# redis-cli -p 7000 cluster nodes | grep master
[root@centos74-redis ~]# redis-cli -p 7000 cluster nodes | grep slave
6)测试集群
#连接任一节点进行数据管理
[root@centos74-redis ~]# redis-cli -c -p 7000
7、模拟测试:实现热点数据缓存
1)创建学生表,并插入数据
[root@centos74-redis ~]# mysql -uroot -pRcs551552?
#创建stu学生表
mysql> use rencs1;
Database changed
mysql> create table stu(sid smallint(8) unsigned zerofill not null auto_increment comment 'sid',sname varchar(20) not null default '' comment 'sname',address varchar(20) not null default '' comment 'address',primary key(sid));
Query OK, 0 rows affected (0.04 sec)
#插入数据
mysql> insert into stu values(null,'rencs','xian'),(null,'rencs1','heze'),(null,'rencs2','shanghai'),(null,'rencs3','beijign'),(null,'rencs4','dalian');
Query OK, 5 rows affected (0.02 sec)
Records: 5 Duplicates: 0 Warnings: 0
拼接字段
select concat("hmset stu_",sid," sid ",sid," sname ",sname," address ",address) As stuName from rencs1.stu
用as为拼接的列起名字stuName
2)将stu表中数据导入到redis数据库中
#从数据库获取学生表信息,调用concat()函数,拼接redis-cli客户端命令
#redis-cli -c -p 7000 hmset stu_00000001 sid 00000001 sname rencs address xian
mysql -uroot -pRcs551552? -e 'select concat("hmset stu_",sid," sid ",sid," sname ",sname," address ",address) from rencs1.stu;'|grep -v '^concat'|awk '{print "redis-cli -c -p 7000",$0}' >stu.sh
#执行命令,并将结果写入到缓存中
3)检查缓存结果
#查看集群信息,保证每个master主库都有一个从库
[root@centos74-redis ~]# redis-trib.rb info 127.0.0.1:7000
127.0.0.1:7000 (d1aaad69...) -> 3 keys | 5461 slots | 1 slaves.
127.0.0.1:7001 (3707b7c2...) -> 3 keys | 5462 slots | 1 slaves.
127.0.0.1:7002 (0cd882ea...) -> 1 keys | 5461 slots | 1 slaves.
[OK] 7 keys in 3 masters.
0.00 keys per slot on average.
#获取键值信息,在redis中存储中文
[root@centos74-redis ~]# redis-cli -c --raw -p 7000 hmget stu_00000001 sid sname address
8、集群管理
8.1故障转移
1)查询7000(7003从)、7001(7004从)、7002(从)主节点的数据
[root@centos74-redis ~]# redis-cli -c -h 127.0.0.1 -p 7000
[root@centos74-redis ~]# redis-cli -c --raw -p 7000 hmget stu_00000005 sname address
[root@centos74-redis ~]# redis-cli -c -h 127.0.0.1 -p 7001
[root@centos74-redis ~]# redis-cli -c --raw -p 7000 hmget stu_00000002 sname address
[root@centos74-redis ~]# redis-cli -c -h 127.0.0.1 -p 7002
[root@centos74-redis ~]# redis-cli -c --raw -p 7000 hmget stu_00000003 sname address
2)停止7001服务,看7001的从7004是不是会自动升到从
[root@centos74-redis ~]# redis-cli -c -h 127.0.0.1 -p 7001 shutdown
[root@centos74-redis ~]# ps -elf | grep [7]00*
3)检查集群节点状态
[root@centos74-redis ~]# redis-cli -c -p 7000 cluster nodes
[root@centos74-redis ~]# redis-cli -c -p 7000 cluster nodes
可以看到7001的主节点显示fail状态,原来的7001的从节点(7004实例),自动提升为master。
4)再次检索stu_00000002学生信息,可以正常查询
7001已经停了,查7004还是正常就OK
[root@centos74-redis ~]# redis-cli -c --raw -p 7004
127.0.0.1:7004> hgetall stu_00000002
重新开启7001,会自动作为7004的从:
[root@centos74-redis ~]# redis-server /data/7001/redis.conf
[root@centos74-redis ~]# ps -elf | grep [7]00*
[root@centos74-redis ~]# redis-cli -c -p 7000 cluster nodes