32:NoSQL--Redis,32nosql--redis
NoSQL—Redis
- NoSQL—Redis
- Redis简介
- 安装Redis
- Redis 持久化
- Redis持久化说明:
- Redis持久化相关参数,
- Redis 的数据类型
- 1:String
- 2:List
- 3:set 集合
- 4:Sort set 有序列表
- 5:Hash
- Redis常用操作
- string相关操作:
- list相关操作
- sets集合相关操作
- stored sets 有序集合相关操作
- hash 常用操作
- Redis常用操作(键值)
- Redis常用操作(服务)
- Redis安全设置
- Redis慢查询日志
- 安装php-redis扩展模块
- PHP使用redis存储session
- 修改php配置连接redis的配置
- 测试效果
- Redis集群
- Redis集群简介
- 搭建Redis集群
- 安装ruby2.2,以及redis和ruby相关的工具
- Redis集群的配置与操作
Redis简介
Redis和Memcached类似,也属于k-v数据存储
Redis官网:redis.io
支持更多value类型,除了和string外,还支持hash、lists(链表)、sets(集合)和sorted sets(有序集合)
redis使用了两种文件格式:全量数据(RDB)和增量请求(aof)。
全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载。
增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,这种类似于mysql binlog。
redis的存储分为内存存储、磁盘存储和log文件三部分
安装Redis
# 下载最新稳定版安装包
cd /usr/local/src/
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
# 编译安装redis,redis的编译安装无需进行configure,直接make && make install即可
cd redis-4.0.11
make && make install
# 复制redis.conf配置文件 到/etc 目录下
cp redis.conf /etc/redis.conf
# 编辑/etc/redis.conf 文件 修改如下几项配置
daemonize no 修改为 daemonize yes #启动后台模式
logfile "/var/log/redis.log" #指定日志文件
dir /data/redis_data/ #指定RDB和AOF文件的存放目录
appendonly no 修改为 appendonly yes #开启AOF增量请求
# 创建 RDB 和 AOF 文件的存放目录
mkdir /data/redis_data
# 修改内核参数,
echo 'net.core.somaxconn = 1024' >> /etc/sysctl.conf
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
sysctl -p
#启动redis-server
redis-server /etc/redis.conf
# 查看 redis 日志文件
cat /var/log/redis.log
24548:C 23 Aug 23:32:21.154 # Can't chdir to '/data/redis_data/': No such file or directory
24604:C 23 Aug 23:33:23.108 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24604:C 23 Aug 23:33:23.108 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=24604, just started
24604:C 23 Aug 23:33:23.108 # Configuration loaded
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 4.0.11 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 24605
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
24605:M 23 Aug 23:33:23.110 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
24605:M 23 Aug 23:33:23.110 # Server initialized
24605:M 23 Aug 23:33:23.110 * Ready to accept connections
Redis 持久化
Redis持久化说明:
Redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)
RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上
AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来
在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话
则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高
如果没有数据持久化的需求,也完全可以关闭RDB和AOF方式
这样的话,redis将变成一个纯内存数据库,就像memcache一样。
Redis持久化相关参数,
就是/etc/redis.conf配置文件中的一些参数
save 900 1 #表示每15分钟且至少有1个key改变,就触发一次持久化
save 300 10 #表示每5分钟且至少有10个key改变,就触发一次持久化
save 60 10000 #表示每60秒至少有10000个key改变,就触发一次持久化
save "" #这样可以禁用rdb持久化
appendonly yes #如果是yes,则开启aof持久化
appendfilename "appendonly.aof" #指定aof文件名字
appendfsync everysec #指定fsync()调用模式,有三种:
#no:不调用fsync,处理速度最快
#always:每次写都会调用fsync,第二种数据最安全,但性能会差一些
#everysec:每秒钟调用一次fsync,安全高效,默认的调用模式。
Redis 的数据类型
1:String
# string为最简单的类型,与Memcached一样的类型,一个key对应一个value,
# 其支持的操作与Memcached的操作类似,它的功能更丰富。设置可以存二进制的对象。
# 使用redis-cli命令进入redis的命令行模式,设置一个值为字符串类型的key
# 示例:
[root@www redis-4.0.11]# redis-cli
127.0.0.1:6379> set mykey "String test"
OK
127.0.0.1:6379> get mykey
"String test"
# 一次添加多个key
127.0.0.1:6379> mset name1 "zhangsan0" name2 "lisi" name3 "wangwu"
OK
127.0.0.1:6379> mget name1 name2 name3
1) "zhangsan0"
2) "lisi"
3) "wangwu"
2:List
# list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。
# 操作中key理解为链表的名字。
# 使用 list 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。
# list 的另一个应用就是消息队列,可以利用 list 的 push操作,将任务存在 list 中,
# 然后工作线程再用pop操作将任务取出进行执行。
# 示例:
[root@www redis-4.0.11]# redis-cli
# lpush 给列表中添加元素
127.0.0.1:6379> LPUSH list1 "a"
(integer) 1
127.0.0.1:6379> LPUSH list1 "b"
(integer) 2
127.0.0.1:6379> LPUSH list1 "c"
(integer) 3
# 提取list中一个范围的元素,0表示第一个元素, -1表示最后一个元素
127.0.0.1:6379> LRANGE list1 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> LRANGE list1 0 1
1) "c"
2) "b"
127.0.0.1:6379> LRANGE list1 0 0
1) "b"
# pop操作提取list中最后一个元素
127.0.0.1:6379> LPOP list1
"c"
3:set 集合
# set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。
# 操作中key理解为集合的名字。
# 比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。
# 因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,
# 那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,
# 对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
# set示例:
# sadd 给集合添加元素,集合中所有元素都是唯一的,不会存在相同的元素
127.0.0.1:6379> LRANGE list1 0 0
1) "b"
127.0.0.1:6379> SADD set1 "a"
(integer) 1
127.0.0.1:6379> SADD set1 "a"
(integer) 0
127.0.0.1:6379> SADD set1 "b"
(integer) 1
127.0.0.1:6379> SADD set1 "b"
(integer) 0
127.0.0.1:6379> SADD set1 "c"
(integer) 1
# 获取一个集合的所有元素
127.0.0.1:6379> SMEMBERS set1
1)
3) "c"
# 删除元素
127.0.0.1:6379> SREM set1 c
# 再添加一个集合
127.0.0.1:6379> SADD set2 a d b 2
# 求两个集合的交集,取两个集合相同的部分
127.0.0.1:6379> SINTER set1 set2
1) "b"
2) "a"
# 求两个集合的并集,列出两个集合中所有的元素,并去除重复的
127.0.0.1:6379> SUNION set1 set2
1) "c"
2) "d"
3) "b"
4) "2"
5) "1"
6) "a"
# 求两个集合的差集,列出第一个集合中不存在于第二个集合中的元素。
127.0.0.1:6379> SADD set1 f
(integer) 1
127.0.0.1:6379> SDIFF set1 set2
1) "f"
4:Sort set 有序列表
# sorted set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按 score 进行有序排列,
# 比如一个存储全班同学成绩的 Sorted Sets,
# 其集合 value 可以是同学的学号,而 score 就可以是其考试得分,
# 这样在数据插入集合的时候,就已经进行了天然的排序。
# 示例
127.0.0.1:6379> ZADD set3 1 a
127.0.0.1:6379> ZADD set3 3 c
127.0.0.1:6379> ZADD set3 2 b
127.0.0.1:6379> ZADD set3 5 f
127.0.0.1:6379> ZADD set3 6 d
127.0.0.1:6379> ZRANGE set3 0 -1
1) "a"
2) "b"
3) "c"
4) "f"
5) "d"
# 倒序
127.0.0.1:6379> ZREVRANGE set3 0 -1
1) "d"
2) "f"
3) "c"
4) "b"
5) "a"
5:Hash
# 在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,
# 在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。
# 示例:
# 给一个hash添加信息
127.0.0.1:6379> hset hash1 name long
(integer) 1
# 获取 一个hash中指定的信息
127.0.0.1:6379> hget hash1 name
"long"
127.0.0.1:6379> hset hash1 age 28
(integer) 1
127.0.0.1:6379> hset hash1 job it
(integer) 1
# 获取一个hash中全部信息,奇数行为key,偶数行为value
127.0.0.1:6379> HGETALL hash1
1) "name"
2) "long"
3) "age"
4) "28"
5) "job"
6) "it"
Redis常用操作
string相关操作:
127.0.0.1:6379> set key1 test #添加键值对
OK
127.0.0.1:6379> get key1 #获取指定键的值
"test"
127.0.0.1:6379> set key1 12345 #添加键值对时,如果已经存在相同的键,会覆盖掉这个键的值
OK
127.0.0.1:6379> get key1
"12345"
127.0.0.1:6379> SETNX key1 abc #setnx会检测键名是否已经存在,如果存在则返回0,不会覆盖原有的值
(integer) 0
127.0.0.1:6379> SETNX key2 def #如果键名不存在,才可以正常添加键值对
127.0.0.1:6379> set key3 fdsa
OK
127.0.0.1:6379> setex key3 abcd
127.0.0.1:6379> setex key3 20 abcd #给key3设置过期时间为20s,值为abcd,若key已经存在,会覆盖新的值
OK
127.0.0.1:6379> get key3
"abcd"
127.0.0.1:6379> mset k1 a k2 b k3 c #批量添加多个键值对
OK
127.0.0.1:6379> mget k1 k2 k3 #批量获取多个键的值
1) "a"
2) "b"
3) "c"
list相关操作
lpush lista a
lpush lista b
lrange lista 0 -1
127.0.0.1:6379> lpush lista a # 从最左边插入一个元素 a
(integer) 1
127.0.0.1:6379> lpush lista b # 从最左边插入一个元素 b
(integer) 2
127.0.0.1:6379> lrange lista 0 -1 #获取列表的全部元素,0代表列表的第一个元素,-1代表最后一个元素
1) "b"
2) "a"
127.0.0.1:6379> lpop lista # 从左侧取出第一个元素,取出的元素就会从列表中删除。
"b"
127.0.0.1:6379> rpush lista 1 #从右侧加入一个元素
(integer) 2
127.0.0.1:6379> rpop lista # 从右侧取出第一个元素
"1"
127.0.0.1:6379> LRANGE lista 0 -1 # 最后lista列表只剩一个 a 了
1) "a"
127.0.0.1:6379> linsert lista before b c # 在lista列表中从左到右第一个值是b的元素的左边添加一个元素 c
127.0.0.1:6379> LRANGE lista 0 -1
1) "a"
2) "c"
3) "b"
4) "b"
5) "b"
127.0.0.1:6379> lset lista 4 bbb # 把lista的第5个元素修改为bbb
OK
127.0.0.1:6379> lindex lista 4 # 查看lista的第5个元素
"bbb"
127.0.0.1:6379> LLEN lista #查看lista中有几个元素
(integer) 5
sets集合相关操作
sadd seta aaa # 向集合seta中放入元素
smembers seta # 查看集合中的所有元素
srem seta aaa # 删除元素
spop seta # 随机取出一个元素,删除
sdiff seta setb # 求差集,以seta为标准
sdiffstore setc seta setb # 求差集并且存储,存储到了setc里
sinter seta setb # 求交集
sinterstore setd seta setb # 将交集存储setd
sunion seta setb # 求并集
sunionstore sete seta setb # 求并集并存储到sete
sismember seta aaa # 判断一个元素是否属于一个集合
srandmember seta # 随机取出一个元素,但不删除
stored sets 有序集合相关操作
zadd zseta 11 123 # 创建有序集合
zrange zseta 0 -1 # 显示所有元素,按顺序显示
zrange zseta 0 -1 withscores # 可以带上分值
zrem zseta 222 # 删除指定元素
zrank zseta 222 # 返回元素的索引值,索引值从0开始,按score正向排序
zrevrank zseta 222 # 同上,不同的是,按score反序排序
zrevrange zseta 0 -1 # 反序显示所有元素,并带分值
zcard zseta # 返回集合中所有元素的个数
zcount zseta 1 10 # 返回分值范围1-10的元素个数
zrangebyscore zseta 1 10 # 返回分值范围1-10的元素
zremrangebyrank zseta 0 2 # 删除索引范围0-2的元素,按score正向排序
zremrangebyscore zseta 1 10 # 删除分值范围1-10的元素
hash 常用操作
hset user1 name long # 建立hash
hset user1 age 28 # 对指定hash添加信息
hset user1 job it
hgetall user1 # 查看指定hash的所有信息
hmset user2 name long age 30 job it # 批量建立键值对
hmget user2
hmget user2 name age job # 查看指定filed
hdel user2 job # 删除指定filed
hkeys user2 # 打印所有的key
hvals user2 # 打印所有的values
hlen user2 # 查看hash有几个filed
Redis常用操作(键值)
keys * # 取出所有key
keys my* # 模糊匹配
exists name # 有name键 返回1 ,否则返回0;
del key1 # 删除一个key //成功返回1 ,否则返回0;
EXPIRE key1 100 # 设置key1 100s后过期
ttl key # 查看键 还有多长时间过期,单位是s,
# 当 key 不存在时,返回 -2 。
# 当 key 存在但没有设置剩余生存时间时,返回 -1 。
# 否则,返回 key 的剩余生存时间。
select 0 # 代表选择当前数据库,默认进入0 数据库
move age 1 # 把age 移动到 1 数据库
persist key1 # 取消key1的过期时间
randomkey # 随机返回一个key
rename oldname newname # 重命名key
type key1 # 返回键的类型
Redis常用操作(服务)
dbsize # 返回当前数据库中key的数目
info # 返回redis数据库状态信息
flushdb # 清空当前数据库中所有的键
flushall # 清空所有数据库中的所有的key
bgsave # 保存数据到 rdb文件中,在后台运行
save # 作用同上,但是在前台运行
config get * # 获取所有配置参数
config get dir # 获取配置参数
config set dir # 更改配置参数
数据恢复: 首先定义或者确定dir目录和dbfilename,然后把备份的rdb文件放到dir目录下面,重启redis服务即可恢复数据
Redis安全设置
# 1:设置监听ip, 可以是多个ip,用空格分隔
bind 127.0.0.1 192.168.1.1
#:2:设置监听端口
port :9999
# 设置了监听的 ip 和端口后需要使用 -p 选项指定端口 -h 选项指定 ip 进行连接
redis-cli -h 127.0.0.1 -p 9999
# 3:设置密码,如果配置没有找到这个设置,直接添加一行即可。
requirepass testpasswd
# 使用密码登录,这时这时使用redis-cli也可以直接登录,但是不能使用任何命令。
redis-cli -a 'testpasswd'
# 4:将config命令改名
rename-command CONFIG sysset
# 5:禁掉config命令
rename-command CONFIG ""
修改完重启redis-server
killall redis-server
redis-server /etc/redis.conf
Redis慢查询日志
# 编辑配置文件/etc/redis.conf
# 针对慢查询日志,可以设置两个参数,一个是执行时长,单位是微秒,
# 另一个是慢查询日志的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除。
# 下面是默认的设置, 可以根据需求进行更改,修改后需要重启redis-server
slowlog-log-slower-than 10000 # 单位微秒,表示慢于10000微秒则记录日志
slowlog-max-len 128 # 定义日志长度,表示最多存128条
# 关于慢查询的操作
slowlog get # 列出所有的慢查询日志
slowlog get 2 # 只列出最新的2条
slowlog len # 查看慢查询日志条数
安装php-redis扩展模块
# 下载模块安装包
cd /usr/local/src
wget http://pecl.php.net/get/redis-4.1.1.tgz
# 解压安装包
tar -zxf redis-4.1.1.tgz
# 安装模块
cd redis-4.1.1/
/usr/local/php-fpm/bin/phpize
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make -j4 && make install
# 修改/usr/local/php-fpm/etc/php.ini,添加一行配置
extension="redis.so"
# 重启php-fpm服务
/etc/init.d/php-fpm reload
# 检查是否正常加载redis模块
/usr/local/php-fpm/sbin/php-fpm -m | grep redis
PHP使用redis存储session
修改php配置连接redis的配置
# vim /usr/local/php-fpm/etc/php.ini //更改或增加 ,其中127.0.0.1::6379 需要填写自己的ip和端口
session.save_handler = "redis"
session.save_path = "tcp://127.0.0.1:6379"
# 或者apache虚拟主机配置文件中也可以这样配置:
php_value session.save_handler " redis"
php_value session.save_path " tcp://127.0.0.1:6379"
# 或者php-fpm配置文件对应的pool中增加:
php_value[session.save_handler] = redis
php_value[session.save_path] = " tcp://127.0.0.1:6379 "
# 修改完重启php-fpm服务
/etc/init.d/php-fpm reload
测试效果
# 为了方便测试,需要取消redis的密码验证
# 编写测试文件,放入站点的根目录
vim /data/wwwroot/www/s.php #内容如下
<?php
session_start();
if (!isset($_SESSION['TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION['TEST3'] = time();
print $_SESSION['TEST'];
print "<br><br>";
print $_SESSION['TEST3'];
print "<br><br>";
print session_id();
?>
# 访问这个测试页
curl https://blog.deaoza.cn/s.php # 得到以下结果
1535205356<br><br>1535205356<br><br>5nrph3d01621fih60p8rvubti3
# 命令行连接redis,也可以查看到该key以及对应的值
127.0.0.1:9999> keys *
1) "PHPREDIS_SESSION:627lf2655i2akdokifd3srf0m1"
# 如果想用php连接redis cluster,需要使用predis扩展
# 安装方法类似phpredis,predis扩展地址https://github.com/nrk/predis
Redis集群
Redis集群简介
# 多个redis节点网络互联,数据共享
# 所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用
# 不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。
# 支持在线增加、删除节点
# 客户端可以连任何一个主节点进行读写
搭建Redis集群
实验环境
# 两台机器,分别开启三个Redis服务(端口)
# 都需要关闭防火墙,和selinux
# A机器上三个端口7000,7002,7004,全部为主
# B机器上三个端口7001,7003,7005,全部为从
# 两台机器上都要编译安装redis,创建3个不同的redis.conf,
# 分别设置不同的端口号、dir等参数,还需要增加cluster相关参数,然后分别启动6个redis服务
配置文件内容,需要更改相关的ip和端口,dir等参数
port 7000
bind 192.168.133.130
daemonize yes
pidfile /var/run/redis_7000.pid
dir /data/redis_data/7000
cluster-enabled yes
cluster-config-file nodes_7000.conf
cluster-node-timeout 10100
appendonly yes
A机器
[root@redis-1 redis-4.0.11]# redis-server /etc/redis_7000.conf
4987:C 26 Aug 00:55:52.541 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4987:C 26 Aug 00:55:52.541 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=4987, just started
4987:C 26 Aug 00:55:52.541 # Configuration loaded
[root@redis-1 redis-4.0.11]# redis-server /etc/redis_7002.conf
4992:C 26 Aug 00:55:55.893 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4992:C 26 Aug 00:55:55.893 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=4992, just started
4992:C 26 Aug 00:55:55.893 # Configuration loaded
[root@redis-1 redis-4.0.11]# redis-server /etc/redis_7004.conf
4997:C 26 Aug 00:56:00.378 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4997:C 26 Aug 00:56:00.378 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=4997, just started
4997:C 26 Aug 00:56:00.378 # Configuration loaded
[root@redis-1 redis-4.0.11]# netstat -lntup | grep redis
tcp 0 0 10.1.1.101:17004 0.0.0.0:* LISTEN 4998/redis-server 1
tcp 0 0 10.1.1.101:7000 0.0.0.0:* LISTEN 4988/redis-server 1
tcp 0 0 10.1.1.101:7002 0.0.0.0:* LISTEN 4993/redis-server 1
tcp 0 0 10.1.1.101:7004 0.0.0.0:* LISTEN 4998/redis-server 1
tcp 0 0 10.1.1.101:17000 0.0.0.0:* LISTEN 4988/redis-server 1
tcp 0 0 10.1.1.101:17002 0.0.0.0:* LISTEN 4993/redis-server 1
B机器
[root@redis-2 redis-4.0.11]# redis-server /etc/redis_7001.conf
1649:C 26 Aug 01:03:38.602 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1649:C 26 Aug 01:03:38.602 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1649, just started
1649:C 26 Aug 01:03:38.602 # Configuration loaded
[root@redis-2 redis-4.0.11]# redis-server /etc/redis_7003.conf
1655:C 26 Aug 01:03:44.460 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1655:C 26 Aug 01:03:44.460 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1655, just started
1655:C 26 Aug 01:03:44.460 # Configuration loaded
[root@redis-2 redis-4.0.11]# redis-server /etc/redis_7005.conf
1660:C 26 Aug 01:03:47.537 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1660:C 26 Aug 01:03:47.537 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1660, just started
1660:C 26 Aug 01:03:47.537 # Configuration loaded
[root@redis-2 redis-4.0.11]# netstat -lntup | grep redis
tcp 0 0 10.1.1.102:17003 0.0.0.0:* LISTEN 1656/redis-server 1
tcp 0 0 10.1.1.102:17005 0.0.0.0:* LISTEN 1661/redis-server 1
tcp 0 0 10.1.1.102:7001 0.0.0.0:* LISTEN 1650/redis-server 1
tcp 0 0 10.1.1.102:7003 0.0.0.0:* LISTEN 1656/redis-server 1
tcp 0 0 10.1.1.102:7005 0.0.0.0:* LISTEN 1661/redis-server 1
tcp 0 0 10.1.1.102:17001 0.0.0.0:* LISTEN 1650/redis-server 1
安装ruby2.2,以及redis和ruby相关的工具
# 安装ruby2.2 (只需要一台机器上安装即可)
# 1:安装开发工具包组
yum -y groupinstall "Development Tools"
# 2:安装依赖包
yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
# 将ruby的源码包制作为rpm包
cd /root/
mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
# 安装ruby的rpm包
yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
# 安装redis和ruby相关的工具
gem install redis
Redis集群的配置与操作
将redis的ruby脚本复制到 /usr/bin 目录下 方便使用
cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
使用脚本配置集群
redis-trib.rb create --replicas 1 \
10.1.1.101:7000 10.1.1.101:7002 10.1.1.101:7004 \
10.1.1.102:7001 10.1.1.102:7003 10.1.1.102:7005
配置结果
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
10.1.1.101:7000
10.1.1.102:7001
10.1.1.101:7002
Adding replica 10.1.1.102:7005 to 10.1.1.101:7000
Adding replica 10.1.1.101:7004 to 10.1.1.102:7001
Adding replica 10.1.1.102:7003 to 10.1.1.101:7002
M: 0c05636295617ca837d9f82b05ae8cb7d02782b6 10.1.1.101:7000
slots:0-5460 (5461 slots) master
M: 616fa8f789d5d29770711aac2acbad3cd6bfe8ff 10.1.1.101:7002
slots:10923-16383 (5461 slots) master
S: 1a1ee287fa6c214e9194ed83020a65384e767158 10.1.1.101:7004
replicates 9ef9e6dd4da6b2c3668ecee514d597ae6972474e
M: 9ef9e6dd4da6b2c3668ecee514d597ae6972474e 10.1.1.102:7001
slots:5461-10922 (5462 slots) master
S: a9e99ff2d515bd62e7d31f99db6fb885f7cd1048 10.1.1.102:7003
replicates 616fa8f789d5d29770711aac2acbad3cd6bfe8ff
S: 9221d062bd0f2afba7b2ffa054a49e2d52c8a204 10.1.1.102:7005
replicates 0c05636295617ca837d9f82b05ae8cb7d02782b6
Can I set the above configuration? (type 'yes' to accept): yes # 输入yes 表示同意这个集群方案
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 10.1.1.101:7000)
M: 0c05636295617ca837d9f82b05ae8cb7d02782b6 10.1.1.101:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 9221d062bd0f2afba7b2ffa054a49e2d52c8a204 10.1.1.102:7005
slots: (0 slots) slave
replicates 0c05636295617ca837d9f82b05ae8cb7d02782b6
S: a9e99ff2d515bd62e7d31f99db6fb885f7cd1048 10.1.1.102:7003
slots: (0 slots) slave
replicates 616fa8f789d5d29770711aac2acbad3cd6bfe8ff
M: 616fa8f789d5d29770711aac2acbad3cd6bfe8ff 10.1.1.101:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 1a1ee287fa6c214e9194ed83020a65384e767158 10.1.1.101:7004
slots: (0 slots) slave
replicates 9ef9e6dd4da6b2c3668ecee514d597ae6972474e
M: 9ef9e6dd4da6b2c3668ecee514d597ae6972474e 10.1.1.102:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. # 最后输出两行绿色的OK,代表集群已经搭建成功了
以集群的方式登录
# 以集群的方式登录需要用到 -c 选项,否则就相当于操作单机的redis
# 任意一个节点都可以创建key,或者查看key
redis-cli -c -h 10.1.1.101 -p 7000
检测集群状态
[root@redis-1 ~]# redis-trib.rb check 10.1.1.101:7000
>>> Performing Cluster Check (using node 10.1.1.101:7000)
M: 0c05636295617ca837d9f82b05ae8cb7d02782b6 10.1.1.101:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 9221d062bd0f2afba7b2ffa054a49e2d52c8a204 10.1.1.102:7005
slots: (0 slots) slave
replicates 0c05636295617ca837d9f82b05ae8cb7d02782b6
S: a9e99ff2d515bd62e7d31f99db6fb885f7cd1048 10.1.1.102:7003
slots: (0 slots) slave
replicates 616fa8f789d5d29770711aac2acbad3cd6bfe8ff
M: 616fa8f789d5d29770711aac2acbad3cd6bfe8ff 10.1.1.101:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 1a1ee287fa6c214e9194ed83020a65384e767158 10.1.1.101:7004
slots: (0 slots) slave
replicates 9ef9e6dd4da6b2c3668ecee514d597ae6972474e
M: 9ef9e6dd4da6b2c3668ecee514d597ae6972474e 10.1.1.102:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
查看所有节点
[root@redis-1 ~]# redis-cli -c -h 10.1.1.101 -p 7000
10.1.1.101:7000> CLUSTER NODES
0c05636295617ca837d9f82b05ae8cb7d02782b6 10.1.1.101:7000@17000 myself,master - 0 1535218510000 1 connected 0-5460
9221d062bd0f2afba7b2ffa054a49e2d52c8a204 10.1.1.102:7005@17005 slave 0c05636295617ca837d9f82b05ae8cb7d02782b6 0 1535218509000 6 connected
a9e99ff2d515bd62e7d31f99db6fb885f7cd1048 10.1.1.102:7003@17003 slave 616fa8f789d5d29770711aac2acbad3cd6bfe8ff 0 1535218509000 5 connected
616fa8f789d5d29770711aac2acbad3cd6bfe8ff 10.1.1.101:7002@17002 master - 0 1535218510776 2 connected 10923-16383
1a1ee287fa6c214e9194ed83020a65384e767158 10.1.1.101:7004@17004 slave 9ef9e6dd4da6b2c3668ecee514d597ae6972474e 0 1535218509000 4 connected
9ef9e6dd4da6b2c3668ecee514d597ae6972474e 10.1.1.102:7001@17001 master - 0 1535218509771 4 connected 5461-10922
查看集群信息
10.1.1.101:7000> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:269
cluster_stats_messages_pong_sent:271
cluster_stats_messages_sent:540
cluster_stats_messages_ping_received:266
cluster_stats_messages_pong_received:269
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:540
移除某个节点
# 例如需要移除10.1.1.101:7004这个节点,
# 需要先找到节点的node:1a1ee287fa6c214e9194ed83020a65384e767158
10.1.1.101:7000> CLUSTER FORGET 1a1ee287fa6c214e9194ed83020a65384e767158
OK
# 最后查看10.1.1.101:7004这个节点就不存在了
10.1.1.101:7000> CLUSTER NODES
0c05636295617ca837d9f82b05ae8cb7d02782b6 10.1.1.101:7000@17000 myself,master - 0 1535219285000 1 connected 0-5460
9221d062bd0f2afba7b2ffa054a49e2d52c8a204 10.1.1.102:7005@17005 slave 0c05636295617ca837d9f82b05ae8cb7d02782b6 0 1535219287985 6 connected
a9e99ff2d515bd62e7d31f99db6fb885f7cd1048 10.1.1.102:7003@17003 slave 616fa8f789d5d29770711aac2acbad3cd6bfe8ff 0 1535219287000 5 connected
616fa8f789d5d29770711aac2acbad3cd6bfe8ff 10.1.1.101:7002@17002 master - 0 1535219286000 2 connected 10923-16383
9ef9e6dd4da6b2c3668ecee514d597ae6972474e 10.1.1.102:7001@17001 master - 0 1535219287000 4 connected 5461-10922
添加节点
# 将刚才移除的10.1.1.101:7004这个节点再添加进来
10.1.1.101:7000> CLUSTER MEET 10.1.1.101 7004
OK
10.1.1.101:7000> CLUSTER NODES
0c05636295617ca837d9f82b05ae8cb7d02782b6 10.1.1.101:7000@17000 myself,master - 0 1535219523000 1 connected 0-5460
9221d062bd0f2afba7b2ffa054a49e2d52c8a204 10.1.1.102:7005@17005 slave 0c05636295617ca837d9f82b05ae8cb7d02782b6 0 1535219525642 6 connected
1a1ee287fa6c214e9194ed83020a65384e767158 10.1.1.101:7004@17004 slave 9ef9e6dd4da6b2c3668ecee514d597ae6972474e 0 1535219525000 4 connected
a9e99ff2d515bd62e7d31f99db6fb885f7cd1048 10.1.1.102:7003@17003 slave 616fa8f789d5d29770711aac2acbad3cd6bfe8ff 0 1535219523628 5 connected
616fa8f789d5d29770711aac2acbad3cd6bfe8ff 10.1.1.101:7002@17002 master - 0 1535219524000 2 connected 10923-16383
9ef9e6dd4da6b2c3668ecee514d597ae6972474e 10.1.1.102:7001@17001 master - 0 1535219526650 4 connected 5461-10922
将当前节点设置为指定节点的从
# 在两台机器上分别再添加一个配置文件,启动一个节点
# 10.1.1.101机器添加操作
cp /etc/redis_7000.conf /etc/redis_7006.conf
sed -i "s/7000/7006/g" /etc/redis_7006.conf
mkdir -p /data/redis_data/7006
redis-server /etc/redis_7006.conf
# 10.1.1.102机器的添加操作
cp /etc/redis_7001.conf /etc/redis_7007.conf
sed -i "s/7001/7007/g" /etc/redis_7007.conf
mkdir -p /data/redis_data/7007
redis-server /etc/redis_7007.conf
# 连接到redis添加这两个节点
10.1.1.101:7000> CLUSTER MEET 10.1.1.101 7006
OK
10.1.1.101:7000> CLUSTER MEET 10.1.1.102 7007
OK
# 查看节点,发现添加的两个节点都是master
10.1.1.101:7000> CLUSTER NODES
0801b7ba3fca546fc000594976bc586b0a828cb5 10.1.1.102:7007@17007 master - 0 1535220583058 7 connected
a9f29205162ee4b13d50edee875d4ce72710cbfd 10.1.1.101:7006@17006 master - 0 1535220581000 0 connected
0c05636295617ca837d9f82b05ae8cb7d02782b6 10.1.1.101:7000@17000 myself,master - 0 1535220580000 1 connected 0-5460
9221d062bd0f2afba7b2ffa054a49e2d52c8a204 10.1.1.102:7005@17005 slave 0c05636295617ca837d9f82b05ae8cb7d02782b6 0 1535220582052 6 connected
1a1ee287fa6c214e9194ed83020a65384e767158 10.1.1.101:7004@17004 slave 9ef9e6dd4da6b2c3668ecee514d597ae6972474e 0 1535220580038 4 connected
a9e99ff2d515bd62e7d31f99db6fb885f7cd1048 10.1.1.102:7003@17003 slave 616fa8f789d5d29770711aac2acbad3cd6bfe8ff 0 1535220582053 5 connected
616fa8f789d5d29770711aac2acbad3cd6bfe8ff 10.1.1.101:7002@17002 master - 0 1535220581000 2 connected 10923-16383
9ef9e6dd4da6b2c3668ecee514d597ae6972474e 10.1.1.102:7001@17001 master - 0 1535220581046 4 connected 5461-10922
# 需要登录到需要设置为从的节点,将当前节点设置为指定节点的从
# 例如登录到10.1.1.102:7007 ,将10.1.1.102:7007这个节点设置为10.1.1.101:7006节点的从
# 找到10.1.1.101:7006节点的node:a9f29205162ee4b13d50edee875d4ce72710cbfd
# 设置主从
[root@redis-1 ~]# redis-cli -c -h 10.1.1.102 -p 7007
10.1.1.102:7007> CLUSTER REPLICATE a9f29205162ee4b13d50edee875d4ce72710cbfd
OK
# 再查看节点信息
10.1.1.102:7007> CLUSTER NODES
616fa8f789d5d29770711aac2acbad3cd6bfe8ff 10.1.1.101:7002@17002 master - 0 1535220914081 2 connected 10923-16383
1a1ee287fa6c214e9194ed83020a65384e767158 10.1.1.101:7004@17004 slave 9ef9e6dd4da6b2c3668ecee514d597ae6972474e 0 1535220914081 4 connected
a9e99ff2d515bd62e7d31f99db6fb885f7cd1048 10.1.1.102:7003@17003 slave 616fa8f789d5d29770711aac2acbad3cd6bfe8ff 0 1535220913074 2 connected
9221d062bd0f2afba7b2ffa054a49e2d52c8a204 10.1.1.102:7005@17005 slave 0c05636295617ca837d9f82b05ae8cb7d02782b6 0 1535220916095 1 connected
# 从下面两行行就可以看出来7007是7006的从了
a9f29205162ee4b13d50edee875d4ce72710cbfd 10.1.1.101:7006@17006 master - 0 1535220914000 0 connected
0801b7ba3fca546fc000594976bc586b0a828cb5 10.1.1.102:7007@17007 myself,slave a9f29205162ee4b13d50edee875d4ce72710cbfd 0 1535220913000 7 connected
0c05636295617ca837d9f82b05ae8cb7d02782b6 10.1.1.101:7000@17000 master - 0 1535220913000 1 connected 0-5460
9ef9e6dd4da6b2c3668ecee514d597ae6972474e 10.1.1.102:7001@17001 master - 0 1535220915088 4 connected 5461-10922
# 保存配置文件,保存后会在每个节点的dir目录下生成一个 .conf 结尾的配置文件
10.1.1.102:7007> CLUSTER SAVECONFIG
OK
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。