实现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

 

posted @ 2020-09-10 01:08  闲云野鹤cs  阅读(238)  评论(0编辑  收藏  举报