欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

详解NoSQL之Redis配置与Redis群集搭建(三主三从)

程序员文章站 2022-07-06 12:37:59
...

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

关系型数据库
	一个结构化的数据库,创建在关系模型基础上
	一般面向于记录
	包括:Oracle、MySQL、SQL Server、Microsoft Access、DB2等
非关系型数据库
	除了主流的关系型数据库外的数据库,都认为是非关系型
	包括:Redis、MongBD、Hbase、CouhDB等

2.非关系型数据库产生背景

High performance——对数据库高并发读写需求
Hug——Storage——对海量数据高效存储与访问需求
High Scalability && High Availability——对数据库高可扩展性与高可用性需求

3.Redis简介

Redis基于内存运行并支持持久化
采用key-value(键值对)的存储形式
优点
	具有极高的数据读写速度
	支持丰富的数据类型
	支持数据的持久化
	原子性
	支持数据备份

4.Redis安装部署

操作步骤
详解NoSQL之Redis配置与Redis群集搭建(三主三从)

安装环境
yum -y install gcc gcc-c++ make
编译安装
tar zxvf redis-5.0.10.tar.gz -C /opt/
cd /opt/redis-5.0.10/
make
make PREFIX=/usr/local/redis install
优化
ln -s /usr/local/redis/bin/* /usr/local/bin/
cd utils/
启动服务
./install_server.sh
netstat -anpt | grep redis
进入redis中
redis-cli -h 127.0.0.1 -p 6379

在redis中的操作

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> type name
string
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists na
(integer) 0
127.0.0.1:6379> rename name ns		#重命名
OK
127.0.0.1:6379> keys *
1) "ns"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> keys *
1) "ns"
127.0.0.1:6379> quit

添加用户

vim /etc/redis/6379.conf
在bind 127.0.0.1后加入192.168.100.13
bind 127.0.0.1 192.168.100.13
重启服务
/etc/init.d/redis_6379 restart
redis-cli -h 192.168.100.13 -p 6379


/etc/init.d/redis_6379 stop			#停止
/etc/init.d/redis_6379 start		#开始
/etc/init.d/redis_6379 restart		#重启
/etc/init.d/redis_6379 status		#状态

5.Redis 数据类型

Redis支持五种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)及zset(sorted set:有序集合)

1.String(字符串)

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

string类型是二进制安全的。redis的string可以包含任何数据。比如jpg图片或者序列化的对象。

string类型是redis最基本的数据类型,string类型的值最大能存储512MB。

示例:

192.168.100.13:6379> set name zhangsan
OK
192.168.100.13:6379> get name
"zhangsan"

2.Hash(哈希字典)

Redis hash是一个键值(key=>value)对集合

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象

每个hash可以存储2的32次方-1键值对

//作用场景:

键值对集合,即编程语言中的Map类型

适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值

示例:

192.168.100.13:6379> hmset stu name lisi age 18 sex 男
OK
192.168.100.13:6379> hget stu name
"lisi"
192.168.100.13:6379> hget stu age
"18"
192.168.100.13:6379> hget stu sex
"\xe7\x94\xb7"

//--raw		解决中文乱码问题
[aaa@qq.com utils]# redis-cli -h 192.168.100.13 -p 6379 --raw
192.168.100.13:6379> hget stu sex
男

3.List(列表)

Redis列表是简单的字符串列表,安照插入顺序排序,可以重复。可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储2的32次方-1元素。

//作用场景:

增删快,提供了操作某一段元素的API

最新消息排行等功能(比如朋友圈的时间线)或者小心队列

192.168.100.13:6379> lpush hobby play
1
192.168.100.13:6379> lpush hobby read
2
192.168.100.13:6379> lpush hobby sport
3
192.168.100.13:6379> lrange hobby 0 10
sport
read
play

4.Set(集合)

Redis的Set是string类型的无序集合

集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)

//作用场景:

1.共同好友 2.利用唯一性,统计访问网站的所有独立IP

3.好友推荐时,根据tag求交集,大于某个阈值就可以推荐

sadd命令

添加一个string元素带key对应的set集合中,成功返回1,如果元素已经在集合中放回0

示例:

192.168.100.13:6379> sadd color red green yellow
3
192.168.100.13:6379> smembers color
green
yellow
red
192.168.100.13:6379> sadd color red
0

5.zset(sorted set:有序集合)

Reis zset和set一样也是string类型元素的集合,且不允许重复的成员

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序

zset的成员是唯一的,但分数(score)却可以重复

//作用场景

将Set中的元素增加一个权重参数score,元素按score有序排列

数据插入集合时,已经进行天然排序

1.排行榜

2.带权重的消息队列

zadd命令

添加元素到集合,元素在集合中存在则更新对应score

示例:

192.168.100.13:6379> zadd color 0 red
1
192.168.100.13:6379> zadd color 0 blue
1
192.168.100.13:6379> zadd color 1 green
1
192.168.100.13:6379> zadd color 1 yellow
1
192.168.100.13:6379> zrangebyscore color 0 10
blue
red
green
yellow
192.168.100.13:6379> zrangebyscore color 0 0
blue
red
192.168.100.13:6379> zrangebyscore color 1 1
green
yellow
192.168.100.13:6379> zadd color 0.5 aaa
1
192.168.100.13:6379> zrangebyscore color 0 10
blue
red
aaa
green
yellow

6.Redis数据库常用命令

key相关命令
	set:存放数据
	get:获取数据
	keys:获取符合规则的建值列表
	exists:判断键值是否存在
	del:删除当前数据库的指定key
	type:获取key对应的value值类型
	rename(覆盖)/renamenx(不覆盖):对已有的key进行重命名
	dbsize:查看当前数据库中key的数目

7.Redis配置文件

配置参数(/etc/redis/6379.conf)
	bind:监听的主机地址
	port:端口
	daemonize yes:启用守护进程
	pidfile:指定PID文件
	loglevel notice:日志级别
	logfile:指定日志文件

8.Redis持久化

持久化概述
	Redis是运行在内存中,内存中的数据断电丢失
	为了能够重用Redis数据,或者防止系统故障,需要将Redis中Redis中的数据写入到磁盘空间,即持久化
持久化分类
	RDB方式:创建快照的方式获取某一时刻Redis中所有数据的副本
	AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化

RDB持久化

Redis的默认持久化方式
默认文件名dump.rdb
触发条件
	在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
	执行save或者是bgsave(异步)命令
	执行flushall命令,清空数据库所有数据
	执行shutdown命令,保证服务器正常关闭且不丢失任何数据
优缺点
	适合大规模的数据恢复
	如果业务对数据完整性和一致性要求不高,RDB是很好的选择
	数据的完整性和一致性不高
	备份时占用内存
通过RDB文件恢复数据
	将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
配置文件选项
vim /etc/redis/6379.conf
save 900 1
save 300 10
save 60 10000
//900秒之内至少一次写操作,300秒之内至少发生10次写操作,60秒之内发生至少10000次写操作,只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB
dbfilename dump.rdb			//RDB文件名称
dir /var/lib/redis/6379		//RDB文件路径
rdbcompression yes			//是否进行压缩

AOF持久化

Redis默认不开启
弥补RDB的不足(数据的不一致性)
采用日志的形式来记录每个写操作,并追加到文件中
Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
根据AOF文件恢复数据
	将appendonly.aof文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可
配置文件选项
vi /etc/redis/6379.conf
appendonly yes		//开启AOF持久化
appendfilename "appendonly.aof"		//AOF文件名称
# appendfsync always		//always:同步持久化,每次发生数据变化会立刻写入磁盘
appendfsync everysec		//everysec:默认推荐,每秒异步记录一次(默认值)
# appendfsync no			//no:不同步,交给操作系统决定如何同步
aof-load-truncated yes		//忽略最后一条可能存在问题的指令

9.案例:NoSQL之Redis集群

1.案例概述

但节点Redis服务器带来的问题
	单点故障,服务不可用
	无法处理大量的并发数据请求
	数据丢失一大灾难
解决方法
	搭建Redis集群

Redis集群介绍
	Redis集群是一个提供在多个Redis间节点间共享数据的程序集
	Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
	Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令
	
Redis集群的优势
	自动分割数据到不同的节点上
	整个集群的部分节点失败或者不可达的情况下能够继续处理命令
Redis集群的实现方法
	用客户端分片
	代理分片
	服务器端分片
Redis-Cluster数据分片
Redis集群没有使用一致性hash,而是引入了哈希槽概念
Redis集群有16384个哈希槽
每个key通过CRC16校验后对16384取模来决定放置槽
集群的每个节点负责一部分哈希槽


以3个节点组成的集群为例
	节点A包含0到5500号哈希槽
	节点B包含5501到11000号哈希槽
	节点C包含11001到16384号哈希槽
支持添加或删除节点
	添加删除节点无需停止服务
	例如
	如果想新添加个节点D,需要移动节点A、B、C中的部分槽到D上
	如果想移除节点A,需要将A中的槽移到B和C节点上,再将A节点从集群中移除

Redis-Cluster的主从复制模型

集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会缺少5501-11000这个范围的槽而不可用
为每个节点添加一个从节点A1、B1、C1,整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选举B1为新的主节点继续服务
当B和B1都失败后,集群将不可用

2.案件拓扑图

详解NoSQL之Redis配置与Redis群集搭建(三主三从)

3.项目搭建

六台机全部装redis

安装环境
yum -y install gcc gcc-c++ make
编译安装
tar zxvf redis-5.0.10.tar.gz -C /opt/
cd /opt/redis-5.0.10/
make
make PREFIX=/usr/local/redis install
优化
ln -s /usr/local/redis/bin/* /usr/local/bin/
cd utils/
启动服务
./install_server.sh
netstat -anpt | grep redis

修改各个redis主机的6379.conf配置文件(要修改六台)

vi /etc/redis/6379.conf
bind 192.168.100.11			#删除原来的127.0.0.1 然后添加各个主机对应的IP地址
logfile /var/log/redis_6379.conf		#不需要修改
port 6379							#不需要修改
cluster-enabled yes					#前面的#号去掉
cluster-config-file nodes-6379.conf	#前面的#号去掉
cluster-node-timeout 15000			#前面的#号去掉
cluster-require-full-coverage no	#前面的#号去掉,yes改成no

测试六台机的redis是否能登上

redis-cli -h 192.168.100.11 -p 6379
redis-cli -h 192.168.100.12 -p 6379
redis-cli -h 192.168.100.13 -p 6379
redis-cli -h 192.168.100.14 -p 6379
redis-cli -h 192.168.100.15 -p 6379
redis-cli -h 192.168.100.16 -p 6379

在192.168.100.11服务器上使用脚本创建群集

yum -y install rubgems ruby

上传redis-3.2.0.gem这个包到/opt目录下
cd /opt
gem install redis-3.2.0.gem
cd /opt/redis-5.0.7/src/
redis-cli --cluster create --cluster-replicas 1 192.168.100.11:6379 192.168.100.12:6379 192.168.100.13:6379 192.168.100.14:6379 192.168.100.15:6379 192.168.100.16:6379

Can I set the above configuration?(type 'yes' to accept):yes
群集建立完成,测试就可以了,会形成三主三从
[aaa@qq.com src]# redis-cli -h 192.168.100.11 -p 6379 -c
//远程连接数据库
192.168.100.11:6379> set centos 7.4
OK
192.168.100.11:6379> quit
[aaa@qq.com src]# redis-cli -h 192.168.100.12 -p 6379 -c
192.168.100.12:6379> get centos
-> Redirected to slot [467] located at 192.168.100.11:6379
"7.4"

192.168.100.12:6379> cluster info		#查看集群状态
192.168.100.12:6379> cluster nodes		#查看节点
相关标签: 缓存加速