Redis-Cluster集群构建
一、集群的工作原理及优缺点
一台主服务器,多台从服务器,一个哨兵服务器。主服务器将所有数据推送到从服务器上,哨兵把用户的请求推送到主从服务器上(如果是写推送到主,如果是读推送到从)。
# 缺点:
主从切换过程中会丢数据
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
注:本文为博主查阅多方资料整理而成,如有侵权请留言联系博主删除。
学习新东西,不要忘记复习旧知识,这样你才能更好!