Redis-Cluster集群构建

一、集群的工作原理及优缺点

img

	一台主服务器,多台从服务器,一个哨兵服务器。主服务器将所有数据推送到从服务器上,哨兵把用户的请求推送到主从服务器上(如果是写推送到主,如果是读推送到从)。

# 缺点:
	主从切换过程中会丢数据
   Redis只能单点写,不能水平扩容

	将集群看做客户端的状态(持久化端),每个主服务器有一个从服务器,从服务器只用作数据备份,数据会分散到主服务器,每个主服务器数据是一致的,

Redis3.0版本的集群化,有多个master和slave节点,每一个slave的唯一作用就是为master提供(高可靠性),每一个master存储的数据是不一致的,
(1)由多个Redis服务器组成的分布式网络服务集群;
(2)集群之中有多个Master主节点,每一个主节点都可读可写;
(3)节点之间会互相通信,两两相连;
(4)Redis集群无中心节点。

二、主机规划

主机 内网 IP 地址 端口 用途
centos1.com 192.168.66.11 6378/6379 存储数据/主节点备份
centos2.com 192.168.66.12 6378/6379 存储数据/主节点备份
centos3.com 192.168.66.13 6378/6379 存储数据/主节点备份

三、部署 Redis

1、安装Redis和所需要的软件包

$ yum -y install gcc* tcl lrzsz  # 下载 redis 
¥ cd /server/tools && wget http://download.redis.io/releases/redis- 3.2.12.tar.gz # 解压并进入 src 目录 
$ tar xf redis-3.2.12.tar.gz && cd redis-3.2.12 make && make PREFIX=/usr/local/redis install
 	redis-server:Redis 服务端的启动程序
 	redis-cli:Redis 客户端程序,也可以用 telnet 根据其纯文本协议来操作Redis缓存 	 redis-benchmark:Redis 性能测试工具,测试 Redis 在当前系统下的读写性能
 	redis-check-aof:数据修复
 	redis-check-dump:检查导出工具

四、启动 Redis 服务

1、启动前优化内存分配策略

$ echo 'vm.overcommit_memory=1' >>/etc/sysctl.conf && sysctl -p 
# Overcommit_Memory 参数可选值含义: 
# 0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,     内存申请允许;否则,内存申请失败,并把错误返回给应用进程 
# 1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何 
# 2 表示内核允许分配超过所有物理内存和交换空间总和的内存

2、启动 redis-server(做软链接即可,不用启动服务)

$ ln -s /usr/local/redis/bin/* /usr/local/bin # 启动服务 
#redis-server /usr/local/redis/conf/redis.conf & # 测试服务 
#redis-cli

五、构建 Redis-Cluster 集群

Redis Cluster 集群正常工作至少需要 3 个主节点,同时为了保证数据的高可用性,加入了主从模式。因此至少创建 6 个节点,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点默认情况下只负责从 Master 拉取数据进行备份。当这个主节点挂掉后,集群就会通过下线检测的方式,由从节点中选举一个节点来充当主节点,实现故障转移,从而保证集群正常运行

1、创建存放多个实例的目录

# 以单台主机为例,创建存放多个实例的目录 
$ mkdir -p /data/{6378,6379} 
$ cp -a redis.conf /data/6378/

2、配置redis.conf文件

$ cd /data/6378/ # 配置 6378 端口实例 
$ vim redis.conf    
	61 bind 0.0.0.0 #绑定地址      
	80 protected-mode no #禁用保护模式(避免影响主从复制      
	84 port 6378 #指定端口    
	128 daemonize yes #后台运行    
	150 pidfile /data/6378/redis_6378.pid     
	158 loglevel notice #日志等级      
	163 logfile "/data/6378/redis_6378.log"      
	237 dbfilename dump.rdb       
	247 dir /data/6378 #当前数据目录      
	593 appendonly yes #开启预写入日志     
	721 cluster-enabled yes #开启cluster模式,取消注释    
	729 cluster-config-file nodes-6378.conf #取消注释 
	#记录集群信息,cluster集群自动维护,不用手动更新、创建    
	735 cluster-node-timeout 5000 #取消注释 
	#节点超时时间,目标节点超过指定时间没响应,就标记为FAIL或PFAIL(可能宕机   
 1)  拷贝 Redis 配置文件,修改得到 6379 实例
$ cd /data/6378 
$ cp -a redis.conf ../6379 
$ cd ../6379/ 
$ vim redis.conf    将配置文件中的所有6378改为6379
2)将redis发送到其他两台服务器上
$ scp -r /usr/local/redis root@192.168.190.112:/usr/local/ 
$ scp -r /usr/local/redis root@192.168.190.113:/usr/local/ 
$ scp -r /data root@192.168.190.112:/ 
$ scp -r /data root@192.168.190.113:/
3)112机器配置
$ ln -s /usr/local/redis/bin/* /usr/local/bin 
$ cd /data/6378 
$ cd /data/6379 若111启动过会生成一些文件,此时要删掉所有只有下redis.conf文件
4)113机器配置
$ ln -s /usr/local/redis/bin/* /usr/local/bin 
$ cd /data/6378 
$ cd /data/6379 若111启动过会生成一些文件,此时要删掉所有只有下redis.conf文件

3、将3台服务器分别启动 Redis 并查看进程是否存在

# 启动 Redis 进程 
$ redis-server /data/6378/redis.conf 
$ redis-server /data/6379/redis.conf  
# 查看进程是否存在 
$ ps -ef|grep redis  
	root    2350    1  0 11:07 ?   00:00:01 redis-server *:6378 [cluster]  	   root    2399    1  0 11:21 ?   00:00:00 redis-server *:6379 [cluster]

4、创建 Redis Cluster 集群

$ yum install ruby rubygems -y  
# 使用国内源移除官方的源 
$ gem sources --add http://mirrors.aliyun.com/rubygems/ --remove http://rubygems.org/  
# 检查源 
$ gem sources -l  *** CURRENT SOURCES ***  http://mirrors.aliyun.com/rubygems/  
# 安装依赖软件 
$ gem install redis -v 3.3.3  
# 创建一个包含三个主节点和三个从节点的集群 
$ cp /root/redis-3.2.12/src/redis-trib.rb /usr/local/redis/bin/  #
$ /usr/local/redis/bin/redis-trib.rb create --replicas 1 192.168.190.111:6378 192.168.190.111:6379 192.168.190.112:6378 192.168.190.112:6379 192.168.190.113:6378 192.168.190.113:6379 
- create:创建一个新的集群 
- replicas:每个主节点创建一个从节

5、连接集群进行测试

# 连接任一节点进行数据管理 
$ redis-cli -c -p 6378 # -c 集群化连接 没有设密码可以不指定-p   192.168.66.11:6378> set msg 'oldboy' -> Redirected to slot [6257] located at 172.16.1.57:6378 OK 192.168.66.11:6378> get msg "oldboy" 
# 查看 key 对应的 
$ slot cluster keyslot key  
# 查看 slot 和节点的对应关系 
$ cluster slots

六、Redis Cluster 集群测试

1、第 四 台集安装 MySQL 数据库进行协同测试

# 安装 mysql 数据库 
$ yum -y install mysql mysql-server 
$ service mysqld start $ mysqladmin -uroot password 123 
$ mysql -uroot -p123 mysql> grant all on *.* to 'root'@'%' identified by '123'; 
# 创建数据模板进行测试 
$ mysql> use test mysql> create table stu( sid smallint(8), sname varchar(20), address varchar(20), primary key(sid)); # 插入数据 mysql> insert into stu values(1,'qq','湖南长沙'),(2,'ww','河南洛阳'), (3,'ee','北京市'),(4,' rr','广州市'),(5,'tt','上海市');  # 查询数据 mysql> select * from stu;

2、将表信息导入至数据库

$ vim hmset_data.sh 
#!/bin/bash IP=$数据库 IP 地址 
script='/server/scripts' 
if [ ! -d $script ];then   
	mkdir -p $script 
fi  
#从数据库获取学生表信息,调用 concat() 函数,拼接 redis-cli 客户端命令 
# redis-cli -c -p 6378 hmset stu_1 sid 1 sname 汪洋 address 湖南长沙 cd $script && \ /usr/bin/ssh $IP "mysql -uroot -p123456 -e 'select concat(\"hmset stu_\",sid, \" sid \",sid,\" sname \",sname,\" address \",address) from test.stu;'"|grep -v '^concat'|awk '{print "redis-cli -c -p 6378",$0}' >db.cmd  

#判断上一条命令执行是否成功 
if [ $? -ne 0 ];then   
	echo 'USAGE: Please check the Data or IP.'   
	exit 1 
fi  
#执行命令,并将结果写入到缓存中 
$ cat db.cmd|while read line 
do   
	$line 
done

3、检查缓存结果

$ redis-trib.rb info 127.0.0.1:6378 [
$ redis-cli -c --raw -p 6378 hmget stu_9 sid sname

七、集群管理

1、故障转移

# 查询 192.168.66.11 主机上的主节点( 6378 端口实例)数据 
$ redis-cli -c -h 
192.168.66.11 -p 6378 192.168.66.11:6378> keys *   
	1) "stu_5"   
	2) "stu_1"   
# 查询学生 stu_5 的姓名 
$ redis-cli -c --raw -p 6378 hget stu_5 sname  
# 停止服务进行测试 
$ redis-cli -c -h 192.168.66.11 -p 6378 shutdown  
# 检查集群节点状态 
$ redis-cli -c -p 6378 cluster nodes 
# 再次检索 stu_5 学生信息,可以正常查询
$ redis-cli -c --raw -p 6378 127.0.0.1:6378> hgetall stu_5 
# 删除失效节点 
$ redis-trib.rb del-node 192.168.10.220:6385'9c240333476469e8e2c8e80b089c48f389827265'

2、添加节点

$ redis-trib.rb add-node new_host:new_port existing_host:existing_port --slave --master-id <arg>   
	--slave:以从节点身份加入集群   
	--master-id:主节点号  
	new_host:new_port:新增节点的地址  
	existing_host:existing_port:集群中任意一个节点的地址   
# 重置死亡节点 
$ rm -f 6378/* 
$ redis-server 6378-redis.conf 
$ redis-trib.rb add-node --slave --master-id 90fc1e298bdfb55e35a9dae7137684c6217dc6ff 192.168.66.11:6378 192.168.66.11:6379  # 检查节点状态 
$ redis-cli -c -p 6378 cluster nodes  
# 移除 noaddr 节点 
$ redis-cli -c -p 6378 CLUSTER FORGET node-id

八、使用 Python 进行连接 Redis-Cluster 测试

1、安装 Python3.0 支持

# 下载 python3.5.5 版本 
$ wget https://www.python.org/ftp/python/3.5.5/Python-3.5.5.tgz  
# 源码安装 
$ yum -y install lrzsz gcc gcc-c++ openssl openssl-dever pcre pcre-dever zlib zlib-dever 
$ tar -xf Python-3.5.5.tgz 
$ cd Python-3.5.5/ 
$ ./configure $ make && make install # 检查安装环境,这里使用 python3 命令,而不是 python 命令 
$ python3 
Python 3.5.5 (default, Apr 14 2019, 11:13:51) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux 
Type "help", "copyright", "credits" or "license" for more information.
>>> exit() 
# 检查安装环境,这里使用 python3 命令,而不是 python 命令

2、安装 Redis-py 驱动

# 下载源码包 
$ wget https://github.com/andymccurdy/redis-py/archive/2.10.6.tar.gz 
# 解压 
$ tar xf redis-py-2.10.6.tar.gz 
# 切换到包目录下 
$ cd redis-py-2.10.6/ 
# 安装驱动 
$ python3 setup.py install 
# 导入 redis 包,没有报错,驱动安装成功 
$ python3  
Python 3.5.5 (default, Apr 14 2019, 11:13:51)  
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux  
Type "help", "copyright", "credits" or "license" for more information.  
>>> import redis 
>>>  
>>>

3、安装 Redis-py-cluster 驱动程序

#下载源码包 
$ https://github.com/Grokzen/redis-py-cluster/archive/1.3.6.tar.gz 
# 解压 
$ tar xf redis-py-cluster-1.3.6.tar.gz 
# 切换到包目录下 
$ cd redis-py-cluster-1.3.6 
# 安装驱动 
$ python3 setup.py install

4、使用代码测试

#! /usr/bin/env python3 
from rediscluster import StrictRedisCluster 
#构建所有的节点 
startup_nodes = [    
	{"host":"192.168.66.11", "port":6378},# 主    
	{"host":"192.168.66.11", "port":6379},# 6378的从数据
	{"host":"192.168.66.12", "port":6378},# 主    
	{"host":"192.168.66.12", "port":6379},# 6378的从数据库
	{"host":"192.168.66.13", "port":6378},# 主    
	{"host":"192.168.66.13", "port":6379} # 6378的从数据库 
] 
#构建StrictRedisCluster对象 
redis_store= StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True) 
# 设置key键为name、money; value值为 '老鹰'、'10亿' 
redis_store.set('name', 'zhangsan') redis_store.set('money', '100000') 
# 获取键为name,money 
print("My name is: ", redis_store.get('name')) 
print("I have money: ", redis_store.get('money'))

5、查看是否能否读出脚本输出内容

$ chmod a+x redis-cluster.py 
$ python3 redis-cluster.py    
	My name is:  zhangsan    
	I have money:  100000

6、用111机器查看健名name是否输出结果

get name    
	-> Redirected to slot [1807] located at 192.168.190.113:6378    
	"zhangsan"

7、114脚本修改,并执行命令查看读取效

$ vim redis-cluster.py    
	redis_store.set('name', 'zhangsan') #注释掉    
	redis_store.set('money', '100000')  #注释掉 
while 2>1 >do >python3 redis-cluster.py >date >sleep ls >done 

8、在113机器上将6378关闭,查看114读取状

$ ps aux | grep redis kill -9 26546

9、添加节

$ redis-trib.rb add-node new_host:new_port existing_host:existing_port --slave --master-id <arg>   
	--slave:以从节点身份加入集群   
	--master-id:主节点号  
	new_host:new_port:新增节点的地址  
	existing_host:existing_port:集群中任意一个节点的地址   
# 重置死亡节点 
$ rm -f 6378/* 
$ redis-server 6378-redis.conf 
$ /usr/local/redis/bin/redis-trib.rb add-node --slave --master-id 90fc1e298bdfb55e35a9dae7137684c6217dc6ff 192.168.66.11:6378 192.168.66.11:6379 # 检查节点状态 
$ redis-cli -c -p 6378 cluster nodes  
# 移除 noaddr 节点 
$ redis-cli -c -p 6378 CLUSTER FORGET node-id
posted @ 2020-04-22 20:57  候你已久  阅读(65)  评论(0)    收藏  举报