redis —主从&&集群(CLUSTER)
REDIS主从配置
为了节省资源,本实验在一台机器进行。即,在一台机器上启动两个端口,模拟两台机器。
机器准备:
[root@adailinux ~]# cp /etc/redis.conf /etc/redis2.conf
[root@adailinux ~]# vim /etc/redis2.conf
port 6380
pidfile /var/run/redis_6380.pid
logfile "/tmp/logs/redis2.log"
dir /data/redis2
# slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379
###指定主服务器IP和端口
# masterauth <master-password>
###如果主服务器设定了密码,需要在从服务器上添加该参数
[root@adailinux ~]# mkdir /data/redis2
启动Redis:
[root@adailinux ~]# redis-server /etc/redis.conf
[root@adailinux ~]# redis-server /etc/redis2.conf
[root@adailinux ~]# ps aux |grep redis
root 2454 0.2 0.4 145244 2356 ? Ssl 17:18 0:00 redis-server 127.0.0.1:6379
root 2459 0.3 0.4 145244 2332 ? Ssl 17:19 0:00 redis-server 127.0.0.1:6380
[root@adailinux ~]# netstat -lntp |grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2454/redis-server 1
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 2459/redis-server 1
启动成功!!!
至此,Redis主从搭建完毕!!!
查看SLAVE上的数据
[root@adailinux ~]# redis-cli -p 6380
127.0.0.1:6380> keys *
1) "list1"
2) "hseta"
3) "set1"
4) "set3"
5) "key2"
6) "k1"
7) "set4"
8) "seta"
9) "k2"
10) "k3"
11) "zseta"
12) "setb"
13) "hash1"
14) "set5"
15) "list2"
16) "mykey"
测试主从
在master上创建数据:
[root@adailinux ~]# redis-cli -p 6379
127.0.0.1:6379> del key
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set test 00001
OK
在slave上查看:
[root@adailinux ~]# redis-cli -p 6380
127.0.0.1:6380> select 1
127.0.0.1:6380[1]> keys *
1) "test"
127.0.0.1:6380[1]> get test
"00001"
注意: Redis主从和mysql主从不一样,Redis主从不用事先同步数据,它会自动同步。因为master上设置有参数“slave-read-only yes”,即该slave为只读数据库!
20.22 REDIS集群介绍
Redis cluster是分布式集群,支持横向扩展,Redis从V3.0版本后才支持集群功能。Redis集群的工作原理类似于磁盘的raid5。
- 多个redis节点网络互联,数据共享
- 所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用
- 不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。
- 支持在线增加、删除节点
- 客户端可以连任何一个主节点进行读写
21.22-21.23 REDIS集群搭建
场景设置
- 两台机器,分别开启三个Redis服务(端口)
- A机器上三个端口:7000、7002、7004,全部为主
- B机器上三个端口:7001、7003、7005,全部为从
- 两台机器上都要编译安装Redis,然后编译并复制三个不同的Redis.conf,分别设置不同的端口号、dir等参数,还需要增加cluster相关参数,然后分别启动6个Redis服务
准备机器
MASTER(IP:192.168.8.131)
[root@adailinux ~]# vim /etc/redis_7000.conf
port 7000
bind 192.168.8.131
daemonize yes
pidfile /var/run/redis_7000.pid
dir /data/redis_data/7000
cluster-enabled yes
##开启cluster功能
cluster-config-file nodes_7000.conf
##该配置文件可以在dir目录下自动生成
cluster-node-timeout 10100
appendonly yes
[root@adailinux ~]# vim /etc/redis_7002.conf
port 7002
bind 192.168.8.131
daemonize yes
pidfile /var/run/redis_7002.pid
dir /data/redis_data/7002
cluster-enabled yes
cluster-config-file nodes_7002.conf
cluster-node-timeout 10100
appendonly yes
[root@adailinux ~]# vim /etc/redis_7004.conf
port 7004
bind 192.168.8.131
daemonize yes
pidfile /var/run/redis_7004.pid
dir /data/redis_data/7004
cluster-enabled yes
cluster-config-file nodes_7004.conf
cluster-node-timeout 10100
appendonly yes
创建各配置文件对应的数据库目录:
[root@adailinux ~]# mkdir /data/redis_data
[root@adailinux ~]# mkdir /data/redis_data/{7000,7002,7004}
依次启动Redis服务7000,7002,7004:
[root@adailinux ~]# redis-server /etc/redis_7000.conf
启动完成后,结果如下:
[root@adailinux ~]# ps aux |grep redis
root 14423 0.6 0.5 145248 2640 ? Ssl 19:35 0:00 redis-server 192.168.8.131:7000 [cluster]
root 14438 3.5 0.5 145248 2636 ? Ssl 19:37 0:00 redis-server 192.168.8.131:7002 [cluster]
root 14443 13.8 0.5 145248 2636 ? Ssl 19:37 0:01 redis-server 192.168.8.131:7004 [cluster]
注: 此处bind应该对应自己服务器的IP。
SLAVE(IP:192.168.8.132)
首先要先安装好Redis,然后执行如下操作:
[root@adailinux ~]# vim /etc/redis_7001.conf
port 7001
bind 192.168.8.132
daemonize yes
pidfile /var/run/redis_7001.pid
dir /data/redis_data/7001
cluster-enabled yes
cluster-config-file nodes_7001.conf
cluster-node-timeout 10100
appendonly yes
[root@adailinux ~]# vim /etc/redis_7003.conf
port 7003
bind 192.168.8.132
daemonize yes
pidfile /var/run/redis_7003.pid
dir /data/redis_data/7003
cluster-enabled yes
cluster-config-file nodes_7003.conf
cluster-node-timeout 10100
appendonly yes
[root@adailinux ~]# vim /etc/redis_7005.conf
port 7005
bind 192.168.8.132
daemonize yes
pidfile /var/run/redis_7005.pid
dir /data/redis_data/7005
cluster-enabled yes
cluster-config-file nodes_7005.conf
cluster-node-timeout 10100
appendonly yes
创建各配置文件对应的数据库目录:
[root@adailinux ~]# mkdir /data/redis_data
[root@adailinux ~]# mkdir /data/redis_data/{7001,7003,7005}
依次启动Redis服务7001,7003,7005:
[root@adailinux ~]# redis-server /etc/redis_7001.conf
启动完成后结果如下:
[root@adailinux ~]# ps aux |grep redis
root 5971 0.2 0.5 145248 2632 ? Ssl 19:41 0:00 redis-server 192.168.8.132:7001 [cluster]
root 5976 0.1 0.5 145248 2636 ? Ssl 19:41 0:00 redis-server 192.168.8.132:7003 [cluster]
root 5981 0.1 0.5 145248 2632 ? Ssl 19:41 0:00 redis-server 192.168.8.132:7005 [cluster]
安装RUBY V2.2(MASTER)
Redis集群需要ruby的支持,需要先安装ruby(Ruby只需在一台机器上运行)。Redis4.0需要使用Ruby2.2,安装方法如下(因为本机自带的是2.0版本的ruby,所以需要使用如下方法把源码包包制作成yum安装包,然后借助yum工具安装ruby2.2——升级ruby版本):
安装yum开发工具组:
[root@adailinux ~]# yum -y groupinstall "Development Tools"
升级库文件:
[root@adailinux ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-devel
[root@adailinux ~]# cd /root/
创建制作rpm包的目录:
[root@adailinux ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
下载Ruby的源码包:
[root@adailinux ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
下载specs文件,用于制作rpm包:
[root@adailinux ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
制作rpm包:
[root@adailinux ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
##此处需要耐心等待…
安装Ruby2.2:
[root@adailinux ~]# yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@adailinux ~]# ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
至此,ruby 2.2安装完毕!
注: 除此方法之外,还可以编译安装ruby。
配置集群
安装Redis配置集群的工具:
[root@adailinux ~]# gem install redis
将命令redis-trib.rb加入环境变量目录下:
[root@adailinux ~]# cp /usr/local/src/redis-4.0.2/src/redis-trib.rb /usr/bin/
[root@adailinux ~]# redis-trib.rb create --replicas 1 192.168.8.131:7000 192.168.8.131:7002 192.168.8.131:7004 192.168.8.132:7001 192.168.8.132:7003 192.168.8.132:7005
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
##注意:redis-trib.rb create --replicas 1 此处的参数“1”
至此,Redis集群配置完成!
21.25 REDIS集群操作
因为Redis集群是分布式结构,所以可以连接任何一个端口。
连接:
[root@adailinux ~]# redis-cli -c -h 192.168.8.131 -p 7000
##-c:=cluster,表示以集群方式连接
创建数据:
192.168.8.131:7000> set cluster1 adaitest
-> Redirected to slot [8483] located at 192.168.8.132:7001
OK
##该操作会被重定向到192.168.8.132:7001
192.168.8.132:7001> set cluster2 adai222
-> Redirected to slot [4416] located at 192.168.8.131:7000
OK
192.168.8.131:7000> set cluster3 adaitest333
OK
192.168.8.131:7000> set cluster4 adai2323
-> Redirected to slot [12678] located at 192.168.8.131:7002
OK
查看数据:
192.168.8.131:7002> get cluster1
-> Redirected to slot [8483] located at 192.168.8.132:7001
"adaitest"
192.168.8.132:7001> get cluster2
-> Redirected to slot [4416] located at 192.168.8.131:7000
"adai222"
192.168.8.131:7000> get cluster3
"adaitest333"
192.168.8.131:7000> get cluster4
-> Redirected to slot [12678] located at 192.168.8.131:7002
"adai2323"
集群相关的操作
查看集群的状态:
[root@adailinux ~]# redis-trib.rb check 192.168.8.131:7000
列出节点:
[root@adailinux ~]# redis-cli -c -h 192.168.8.131 -p 7000
192.168.8.131:7000> cluster nodes
查看集群信息:
192.168.8.131:7000> cluster info
添加节点(执行该操作前先在slave创建redis_7007.conf并启动):
192.168.8.131:7000> cluster meet 192.168.8.132 7007
OK
192.168.8.131:7000> cluster nodes
52e4b3484838be21fcf53b84198e362efd54bd39 192.168.8.132:7007@17007 master - 0 1507035952000 0 connected
##此时7007以master身份存在
再添加一个节点:
192.168.8.131:7000> cluster meet 192.168.8.131 7006
OK
192.168.8.131:7000> cluster nodes
677f27fb209ce45c823126fe38dbcf0b9fc43d93 192.168.8.131:7006@17006 master - 0 1507036137147 0 connected
##同样是以master身份存在
##即,使用以上方式添加的新节点都是以master身份存在!
将当前节点设置为指定节点的从:
先更换到要设置的节点:
[root@adailinux ~]# redis-cli -c -h 192.168.8.131 -p 7006
设定为7007的从:
192.168.8.131:7006> cluster replicate 52e4b3484838be21fcf53b84198e362efd54bd39
OK
查看:
192.168.8.131:7006> cluster nodes
52e4b3484838be21fcf53b84198e362efd54bd39 192.168.8.132:7007@17007 master - 0 1507036429244 7 connected
677f27fb209ce45c823126fe38dbcf0b9fc43d93 192.168.8.131:7006@17006 myself,slave 52e4b3484838be21fcf53b84198e362efd54bd39 0 1507036429000 0 connected
#对比node号,即7006为7007的从。。
移除某节点:
192.168.8.131:7006> cluster forget 52e4b3484838be21fcf53b84198e362efd54bd39
(error) ERR Can't forget my master!
192.168.8.131:7006> cluster forget 677f27fb209ce45c823126fe38dbcf0b9fc43d93
(error) ERR I tried hard but I can't forget myself...
## 即,不能移除master节点和当前所在节点
[root@adailinux ~]# redis-cli -c -h 192.168.8.131 -p 7000
192.168.8.131:7000> cluster forget 677f27fb209ce45c823126fe38dbcf0b9fc43d93
OK
查看:
192.168.8.131:7000> cluster nodes
#此时7006已经不存在了。
保存当前配置:
192.168.8.131:7000> CLUSTER SAVECONFIG
OK
redis —主从&&集群(CLUSTER)的更多相关文章
- 02.Redis主从集群的Sentinel配置
1.集群环境 1.Linux服务器列表 使用4台CentOS Linux服务器搭建环境,其IP地址如下: 192.168.110.100 192.168.110.101 192.168.110.102 ...
- docker搭建redis主从集群和sentinel哨兵集群,springboot客户端连接
花了两天搭建redis主从集群和sentinel哨兵集群,讲一下springboot客户端连接测试情况 redis主从集群 从网上查看说是有两种方式:一种是指定配置文件,一种是不指定配置文件 引用地址 ...
- 一、全新安装搭建redis主从集群
前言· 这里分为三篇文章来写我是如何重新搭建redis主从集群和哨兵集群的及原本服务器上有单redis如何通过升级脚本来实现redis集群.(redis结构:主-从(备)-从(备)) 至于为什么要搭建 ...
- Redis主从集群及哨兵模式
本次实验环境准备用一台服务器模拟3台redis服务器,1主2从 主从集群搭建 第一步:安装Redis 安装Redis,参考前面安装Redis文章,保证单机使用没有问题. 第二步:配置服务器文件 定位到 ...
- Redis主从,集群部署及迁移
工作中有时会遇到需要把原Redis集群下线,迁移到另一个新的Redis集群的需求(如机房迁移,Redis上云等原因).此时原Redis中的数据需要如何操作才可顺利迁移到一个新的Redis集群呢? 本节 ...
- Java代码操作Redis的sentinel和Redis的集群Cluster操作
总共四台机器,crxy99,crxy98分别是主节点和从节点. crxy97和crxy96是两个监控此主从架构的sentinel节点. 看代码: import org.junit.Test; im ...
- Redis 主从集群搭建及哨兵模式配置
最近搭建了redis集群及哨兵模式,为方便以后查看特此记录下来: 1.Redis安装 2.主从架构 2.1 Redis主从架构图 2.2Redis主从结构搭建 Redis集群不用安装多个Redis,只 ...
- redis主从集群搭建及容灾部署(哨兵sentinel)
Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 Redis安装 整体架构 Redis主从结构搭建 Redis容灾部署(哨兵sentinel) Redis常见问题 ...
- 【转】Java代码操作Redis的sentinel和Redis的集群Cluster操作
总共四台机器,crxy99,crxy98分别是主节点和从节点. crxy97和crxy96是两个监控此主从架构的sentinel节点. 直接看代码: 1 import org.junit.Test ...
随机推荐
- 最常用Python开源框架有哪些?
Python开源框架有很多,像Django.Flask.webpy等等,但哪些是最常用到的呢?我们收集了一些Python使用者的宝贵意见,把他们认为最常用的Python开源框架简单的介绍给大家. 一. ...
- PHP编码规范及建议
<h3 align="center">PHP编码规范及建议</h3>### 编码规范- PHP代码文件必须以 <?php 标签开始.```<?p ...
- Apache日志分析_shell命令行
说明: 1.我的日志预先设定好按日生成文件:"CustomLog "|/opt/apache/bin/rotatelogs /opt/apache/logs/www.website ...
- spring问题:java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutPrimitive
问题描述: spring的:java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutPrimitive 解决方案: 缺少jar ...
- C# 内置 DateTime类详解
C# 内置 DateTime类详解 摘抄自微软官方文档,用来方便自己查阅:网址:https://msdn.microsoft.com/zh-cn/library/system.datetime(v=v ...
- MySQL 多版本并发控制(MVCC)
可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁的操作,因此开销会很低.主要实现的是非阻塞的读操作,写操作也只是锁定必要的行.MVCC的实现是通过保存数据在某个时间点的快照来实现的,也 ...
- 苹果内购服务器验证之receipt返回多组in_app思考
最近有部分用户反映,苹果内购充值失败,经过测试总结有几个关键点出现问题 1.app购买成功苹果没有返回票据,属于票据遗漏(取决于苹果服务器的响应状况),只能客户端进行监听刷新等处理 2.app连续购买 ...
- linux_ssh
什么是ssh? 配置文件位置:/etc/ssh/sshd_config 远程登录和为其他网络提供安全的加密数据传输协议,默认端口22,默认协议是SSH2 # 远程终端通过ssh连接服务器管理服务器 # ...
- 我的踩坑之旅-代码不规范引发的“bug”
今早公司上班,老大跟我说有一个服务老是上线,下线,问我啥情况.我回想了下我的项目部署,觉得不可能会出现这个问题呀.然后各种鼓捣,倒腾了一个早上,终于找出了罪魁祸首. 场景:我们的服务部署在亚马逊上.我 ...
- 02_HTML5+CSS详解第三天
WebStorage简单的网页留言板用到的函数有3个1.saveStorage函数使用"new Date().getTime()"语句来获取当前的日期和时间戳,然后使用localS ...