Redis群集

目录

关系数据库与非关系型数据库

★★Redis简介

★★Redis安装部署

★★Redis配置参数

★★Redis命令工具

redis-cli命令行工具

redis-benchmark测试工具

★★Redis常用命令

key相关命令

多数据库常用命令

★★Redis群集

Redis群集部署

1. 安装Redis并修改配置文件

2. 使用脚本创建群集

3. 查看群集状态

4. 测试群集


关系数据库与非关系型数据库

  • 关系型数据库

一个结构化的数据库,创建在关系模型基础上,一般面向于记录

包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等

  • 非关系型数据库

除了主流的关系型数据库以外的数据库,都认为是非关系型的

包括Redis、MongBD、Hbase、CouhDB等

  • 非关系型数据库产生背景

High performance——对数据库高并发读写需求

Huge Storage——对海量数据高效存储与访问需求

High Scalability && High Availability——对数据库高可扩展性与高可用性需求

Redis简介

        Redis是一个开源的、使用C语言编写、支持网络、可基于内存亦可支持持久化的日志型、key-value(键值对)数据库,是目前分布式结构中不可或缺的一环。

Redis的优点

  1. 具有极高的数据读写速度,读取数据的速度最高可达到110000次/s,数据写入速度最高可达到81000次/s。

  2. 支持丰富的数据类型,不仅仅支持简单的key-value数据类型,还支持Strings、Lists、Hashes、Sets及Ordered Sets等数据类型操作。

  3. 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

  4. 原子性,Redis所有操作都是原子性的。

  5. 支持数据备份,即master-salve模式的数据备份。

Redis安装部署

Redis官网Redis

[root@localhost ~]# mount /dev/cdrom /media
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]# tar zxf /media/redis-3.2.9.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/redis-3.2.9/
[root@localhost redis-3.2.9]# make && make install

        安装过程中,若要更改默认的安装路径,可以使用以下命令安装操作。

make PREFIX=安装路径 install

        make install 只是安装了二进制文件到系统中,并没有启动脚本和配置文件。通过使用install_server.sh脚本文件可以设置Redis服务所需要的相关配置文件。当脚本运行完毕,Redis服务就已经启动成功,默认侦听端口为6379。(执行后确认消息按回车下一步)

[root@localhost redis-3.2.9]# cd /usr/src/redis-3.2.9/utils/
[root@localhost utils]# ./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server
​
Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] 
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf                       //设置默认配置文件
Log file       : /var/log/redis_6379.log                    //设置日志文件
Data dir       : /var/lib/redis/6379                        //设置数据目录
Executable     : /usr/local/bin/redis-server                //执行命令
Cli Executable : /usr/local/bin/redis-cli                   //客户端命令
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@localhost utils]# netstat -anpt | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      7504redis-server 1

        安装完成后,可通过Redis的服务控制脚本/etc/init.d/redis_6379来对Redis服务进行控制。

[root@localhost ~]# /etc/init.d/redis_6379 stop                 //关闭服务
Stopping ...
Redis stopped
[root@localhost ~]# /etc/init.d/redis_6379 start                //启动服务
Starting Redis server...
[root@localhost ~]# /etc/init.d/redis_6379 restart              //重启服务
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@localhost ~]# /etc/init.d/redis_6379 status               //查看运行状态
Redis is running (7581)

Redis配置参数

        Redis主配置文件为/etc/redis/6379.conf,由注释行与设置行两部分组成。

[root@localhost ~]# vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.1.10             //监听的主机地址(配置时添加本机地址可以远程访问)
port 6379                               //端口
daemonize yes                           //启用守护进程
pidfile /var/run/redis_6379.pid         //指定PID文件
loglevel notice                         //日志级别
logfile /var/log/redis_6379.log         //指定日志文件
[root@localhost ~]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...

Redis命令工具

        Redis软件提供了多个命令工具,当Redis安装时,所包含的软件工具会同时被安装到系统中,在系统中可以直接使用。这些命令工具的作用如下所示。

  1. redis-server:用于启动Redis的工具。

  2. redis-benchmark:用于检测Redis在本机的运行效率。

  3. redis-check-aof:修复AOF持久化文件。

  4. redis-check-rdb:修复RDB持久化文件。

  5. redis-cli:Redis命令行工具。

  6. redis-setinel:redis-server文件的软连链接。

redis-cli命令行工具

        Redis数据库系统也是一个典型的C/S架构的应用,要访问Redis数据库需要使用专门的客户端软件(redis-cli)。

[root@localhost ~]# redis-cli               //连接本机的Redis数据库
127.0.0.1:6379> ping                        //检测Redis服务是否启动
PONG
127.0.0.1:6379> 

        在进行数据库连接操作时,可以通过选项来指定远程主机上的Redis数据库,-h指定远程主机、-p指定Redis服务的端口号,-a指定密码,执行exit或quit命令退出原来的Shell环境。

[root@localhost ~]# redis-cli -h 192.168.1.10 -p 6379
192.168.1.10:6379> info
# Server
redis_version:3.2.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:44ee4c7b13835271
......//省略部分内容
192.168.1.10:6379> exit
[root@localhost ~]# 

        在数据库操作环境中,使用help命令可以获取命令类型的帮助。

  1. help @:获取group中的命令列表。
  2. help :获得某个命令的帮助。
  3. help :获取可能帮助的主题列表。

具体操作如下:

[root@localhost ~]# redis-cli
127.0.0.1:6379> help @list                              //查看所有与list数据类型相关的命令
​
  BLPOP key [key ...] timeout
  summary: Remove and get the first element in a list, or block until one is available
  since: 2.0.0
​
  BRPOP key [key ...] timeout
  summary: Remove and get the last element in a list, or block until one is available
  since: 2.0.0
  ......//省略部分内容
127.0.0.1:6379> help set                                //查看set命令的命令帮助
​
  SET key value [EX seconds] [PX milliseconds] [NX|XX]
  summary: Set the string value of a key
  since: 1.0.0
  group: string

redis-benchmark测试工具

        redis-benchmark是官方自带的redis性能测试工具,可以有效地测试redis服务的性能。基本的测试语法为redis-benchmark [选项] [选项参数]。

-h:指定服务器主机名
-p:指定服务器端口
-s:指定服务器socket
-c:指定并发连接数
-n:指定请求数
-d:以字节(B)的形式指定SET/GET值的数据大小
-k:1=keep alive 0=reconnect
-r:SET/GET/INCR使用随机key,SADD使用随机值
-P(大写):通过管道传输请求
-q:强制退出redis,仅显示query/sec值
--csv:以CSV格式输出
-l:生成循环,永久执行测试
-t:仅运行以逗号分隔的测试命令列表
  •   结合上述选项,可以针对某台redis服务器进行性能检测,例如执行下面命令即可向IP地址为192.168.1.10、端口为6379的Redis服务器发送100隔并发连接与100000个请求测试性能。
[root@localhost ~]# redis-benchmark -h 192.168.1.10 -p 6379 -c 100 -n 10000
......//省略部分内容
9775.17 requests per second
​
====== MSET (10 keys) ======
  10000 requests completed in 0.14 seconds
  100 parallel clients
  3 bytes payload
  keep alive: 1
​
87.86% <= 1 milliseconds
98.75% <= 2 milliseconds
100.00% <= 3 milliseconds
74074.07 requests per second
  • 执行下面命令测试存取大小为100B的数据包性能。
[root@localhost ~]# redis-benchmark -h 192.168.1.10 -p 6379 -q -d 100
PING_INLINE: 82850.04 requests per second
PING_BULK: 79744.82 requests per second
SET: 78616.35 requests per second
GET: 78492.93 requests per second
INCR: 80840.74 requests per second
LPUSH: 78003.12 requests per second
RPUSH: 77881.62 requests per second
LPOP: 80000.00 requests per second
RPOP: 79365.08 requests per second
SADD: 79554.50 requests per second
SPOP: 78864.35 requests per second
LPUSH (needed to benchmark LRANGE): 79681.27 requests per second
LRANGE_100 (first 100 elements): 36062.03 requests per second
LRANGE_300 (first 300 elements): 12918.23 requests per second
LRANGE_500 (first 450 elements): 7885.19 requests per second
LRANGE_600 (first 600 elements): 5531.89 requests per second
MSET (10 keys): 77399.38 requests per second

执行下面命令测试本机上redis服务在进行set与lpush操作时的性能。

[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q
SET: 85470.09 requests per second
LPUSH: 90826.52 requests per second

Redis常用命令

set:存放数据,基本的命令格式为[set 键 值]

get:获取数据,基本的命令格式为[get 键]

例如,在当前数据库下存放一个key为666,value为777的数据,执行get 666 命令即可查看刚才存放的数据。

[root@localhost ~]# redis-cli 
127.0.0.1:6379> set 666 777
OK
127.0.0.1:6379> get 666
"777"

key相关命令

  • keys

获取符合规则的键值列表

127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> set k2 2
OK
127.0.0.1:6379> set k3 3
OK
127.0.0.1:6379> set v1 4
OK
127.0.0.1:6379> set v5 5
OK
127.0.0.1:6379> keys *                  //查看当前数据库中所有键
1) "teacher"
2) "k1"
3) "k2"
4) "v1"
5) "v5"
6) "k3"
127.0.0.1:6379> set v22 5
OK
127.0.0.1:6379> keys v*                 //查看当前数据库中以v开头的数据
1) "v22"
2) "v1"
3) "v5"
127.0.0.1:6379> keys v?                 //查看对当前数据库中以v开头后面包含任意一位的数据
1) "v1"
2) "v5"
127.0.0.1:6379> keys v??                //查看对当前数据库中以v开头后面包含任意两位的数据
1) "v22"
  • exists

使用exists命令可以判断键值是否存在

127.0.0.1:6379> exists teacher              //判断teacher键是否存在
(integer) 1                                 //”1“表示teacher键存在
127.0.0.1:6379> exists tea
(integer) 0                                 //表示tea键不存在
  • del

使用del命令可以删除当前数据库的指定key

127.0.0.1:6379> keys *              //查看所有键
1) "teacher"
2) "v22"
3) "k1"
4) "k2"
5) "v1"
6) "v5"
7) "k3"
127.0.0.1:6379> del v5              //删除数据v5
(integer) 1
127.0.0.1:6379> get v5
(nil)
  • type

获取key对应的value值类型

127.0.0.1:6379> type k1
string
  • rename

        对已有的key进行重命名,命令格式为rename 源key 目标key。无论目标key是否存在都会进行重命名,且源key的值会覆盖目标key的值。在实际使用过程中,建议先用exists命令查看key是否存在,再执行命令避免覆盖重要数据。

127.0.0.1:6379> keys v*
1) "v22"
2) "v1"
127.0.0.1:6379> rename v22 v2
OK
127.0.0.1:6379> keys v*
1) "v2"
2) "v1"
127.0.0.1:6379> get v1
"4"
127.0.0.1:6379> get v2
"5"
127.0.0.1:6379> rename v1 v2
OK
127.0.0.1:6379> get v1
(nil)
127.0.0.1:6379> get v2
"4"
  • renamenx

对已有可以进行重命名,并检测新名是否存在,重命名时,如果目标key存在则不进行重命名。

127.0.0.1:6379> keys *
1) "v2"
2) "teacher"
3) "k1"
4) "k2"
5) "k3"
127.0.0.1:6379> get teacher
"zhou"
127.0.0.1:6379> get v2
"4"
127.0.0.1:6379> renamenx v2 teacher
(integer) 0
127.0.0.1:6379> keys *
1) "v2"
2) "teacher"
3) "k1"
4) "k2"
5) "k3"
127.0.0.1:6379> get teacher
"zhou"
127.0.0.1:6379> get v2
"4"
  • dbsize

查看当前数据库中的key的数目

127.0.0.1:6379> dbsize
(integer) 5

多数据库常用命令

  • 多数据库切换

        Redis支持多数据库,Redis在没有任何改动的情况下默认包含16个数据库,数据库名称是用数字0~15来依次命名的。默认使用的序号为“0”的数据库(注意看端口号后的中括号)。

127.0.0.1:6379> select 10               //切换至序号为10的数据库
OK
127.0.0.1:6379[10]> select 15               //切换至序号为15的数据库
OK
127.0.0.1:6379[15]> select 0                //切换至序号为0的数据库
OK
  • 多数据库间移动数据

        Redis的多数据库在一定程度上是相对独立的。例如,在数据库0上面存放的k1的数据,在其他的1~15库中是无法看到的。

127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get k1
(nil)

        Redis数据库提供了一个move命令,用于多数据库中的移动。基本语法为”move 键 库序号“ 。

127.0.0.1:6379[1]> select 0             //切换至目标数据库0
OK
127.0.0.1:6379> get k1                  //查看目标数据是否存在
"100"
127.0.0.1:6379> move k1 1               //将数据库0中k1移动到数据库1中
(integer) 1
127.0.0.1:6379> select 1                //切换到数据库1
OK
127.0.0.1:6379[1]> get k1               //查看被移动数据
"100"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get k1                  //在数据库0中无法查看k1的值
(nil)
  • 清除数据库内数据

        Redis数据库的整库数据删除主要分为两个部分:清空当前数据库的数据,使用FLUSHDB命令实现;清空所有数据库的数据,使用FLUSHALL命令实现。但是,数据清空比较危险,生产环境下不建议使用。

Redis群集

  • Redis集群架构

        Redis Cluster采用虚拟槽分区,将所有的数据根据算法映射到0~16384整数槽内 Redis Cluster是一个无中心的结构 每个节点都保存数据和整个集群的状态

  • 集群角色

Master:Master之间分配slots Slave:Slave向它指定的Master同步数据

  • 集群节点使用的TCP端口

6379端口用于客户端的连接 16379端口用于群集总线

  • Redis-cluster选举

        如果集群任意master挂掉,且当前master没有slave,则集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态 如果集群中超过半数以上master挂掉,无论是否有slave,集群都进入fail状态

Redis群集部署

        使用六台服务器搭建Redis群集,其中三台为MASTER,三台为SLAVE。六台服务器地址为:192.168.1.10/24~192.168.1.60/24,步骤如下。

1. 安装Redis并修改配置文件

        六台服务器上都安装Redis,安装前面的步骤安装即可,只有IP地址不同,其他配置都一样,然后修改配置文件。

[root@localhost ~]# vim /etc/redis/6379.conf 
port 6379
bind 192.168.1.10                               //本机地址
daemonize yes
logfile /var/log/redis_6379.log
........................下方配置取消注释”#“
cluster-enabled yes                             //启动群集
cluster-config-file nodes-6379.conf             //群集配置文件
cluster-node-timeout 15000
cluster-require-full-coverage no                //yes改为no

        实验环境中,六台服务器每台都需要配置,只需要单独修改一下IP地址即可,所以可以用scp命令来复制文件。

[root@localhost ~]# scp [email protected]:/etc/redis/6379.conf /etc/redis/

        修改六台服务器后,在每台上重启redis服务,并查看6379和16379端口是否已经正常开启。

[root@localhost ~]# /etc/init.d/redis_6379 restart 
Stopping ...
Redis stopped
Starting Redis server...
[root@localhost ~]# netstat -anpt | grep 6379
tcp        0      0 192.168.1.60:6379       0.0.0.0:*               LISTEN      9659/redis-server 1 
tcp        0      0 192.168.1.60:16379      0.0.0.0:*               LISTEN      9659/redis-server 1 
tcp        0      0 127.0.0.1:6379          127.0.0.1:34070         TIME_WAIT   

2. 使用脚本创建群集

        创建群集要用到ruby的一个脚本,在创建群集前,需要先安装ruby的运行环境和ruby的Redis客户端。gem命令是提前下载的redis-3.2.0.gem软件包直接上传即可使用。

注意:该操作在其中一台服务器上操作即可。

[root@localhost ~]# yum -y install ruby rubygems                    //系统盘
[root@localhost ~]# eject
[root@localhost ~]# mount /dev/cdrom /media                         //挂载redis-3.2.0.gem软件包
mount: /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# cd /media
[root@localhost media]# gem install redis --version 3.2.0
Successfully installed redis-3.2.0
Parsing documentation for redis-3.2.0
Installing ri documentation for redis-3.2.0
1 gem installed

使用脚本文件创建群集

[root@localhost redis-3.2.9]# cd /usr/src/redis-3.2.9/src/
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.1.10:6379 192.168.1.20:6379 192.168.1.30:6379 192.168.1.40:6379 192.168.1.50:6379 192.168.1.60:6379
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.10:6379
192.168.1.20:6379
192.168.1.30:6379
Adding replica 192.168.1.40:6379 to 192.168.1.10:6379
Adding replica 192.168.1.50:6379 to 192.168.1.20:6379
Adding replica 192.168.1.60:6379 to 192.168.1.30:6379
M: 72e6931ff577f22800bb8e3f0d35e092f6c23c27 192.168.1.10:6379
   slots:0-5460 (5461 slots) master
M: 8f539176e1ff7d4597b6e40e60e469c2ffe992b3 192.168.1.20:6379
   slots:5461-10922 (5462 slots) master
M: 99914bbfc283c482407025ec929f4928650b5f4a 192.168.1.30:6379
   slots:10923-16383 (5461 slots) master
S: 8df39adffccf37618650eec0661f0606676f0f14 192.168.1.40:6379
   replicates 72e6931ff577f22800bb8e3f0d35e092f6c23c27
S: a81e45bef554a8802d2aa7fa278d7ad1961450ba 192.168.1.50:6379
   replicates 8f539176e1ff7d4597b6e40e60e469c2ffe992b3
S: e34893118da9241290146d44a388080e0b5d0b2e 192.168.1.60:6379
   replicates 99914bbfc283c482407025ec929f4928650b5f4a
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 192.168.1.10:6379)
M: 72e6931ff577f22800bb8e3f0d35e092f6c23c27 192.168.1.10:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 8f539176e1ff7d4597b6e40e60e469c2ffe992b3 192.168.1.20:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: a81e45bef554a8802d2aa7fa278d7ad1961450ba 192.168.1.50:6379
   slots: (0 slots) slave
   replicates 8f539176e1ff7d4597b6e40e60e469c2ffe992b3
M: 99914bbfc283c482407025ec929f4928650b5f4a 192.168.1.30:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: e34893118da9241290146d44a388080e0b5d0b2e 192.168.1.60:6379
   slots: (0 slots) slave
   replicates 99914bbfc283c482407025ec929f4928650b5f4a
S: 8df39adffccf37618650eec0661f0606676f0f14 192.168.1.40:6379
   slots: (0 slots) slave
   replicates 72e6931ff577f22800bb8e3f0d35e092f6c23c27
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.                                               //创建完成

3. 查看群集状态

        M:主,S:从;从ID号可以看到三主三从服务器,1.10服务器的从为1.40,1.20的从服务器为1.50,1.30的从服务器为1.60。

[root@localhost src]# ./redis-trib.rb check 192.168.1.10:6379
>>> Performing Cluster Check (using node 192.168.1.10:6379)
M: 72e6931ff577f22800bb8e3f0d35e092f6c23c27 192.168.1.10:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 8f539176e1ff7d4597b6e40e60e469c2ffe992b3 192.168.1.20:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: a81e45bef554a8802d2aa7fa278d7ad1961450ba 192.168.1.50:6379
   slots: (0 slots) slave
   replicates 8f539176e1ff7d4597b6e40e60e469c2ffe992b3
M: 99914bbfc283c482407025ec929f4928650b5f4a 192.168.1.30:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: e34893118da9241290146d44a388080e0b5d0b2e 192.168.1.60:6379
   slots: (0 slots) slave
   replicates 99914bbfc283c482407025ec929f4928650b5f4a
S: 8df39adffccf37618650eec0661f0606676f0f14 192.168.1.40:6379
   slots: (0 slots) slave
   replicates 72e6931ff577f22800bb8e3f0d35e092f6c23c27
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

4. 测试群集

        登录Redis群集,设置键值测试。需要跟“-c”参数来激活群集模式。

[root@localhost ~]# redis-cli -h 192.168.1.20 -p 6379 -c
192.168.1.20:6379> set centos 7
-> Redirected to slot [467] located at 192.168.1.10:6379
OK
192.168.1.10:6379> get centos
"7"

        创建好群集以后,可以看到,当创建键值时,重定向到其他的服务器上,是按照slot分配的。

你可能感兴趣的:(群集,数据库,redis,java)