redis的主从复制
特点:
(1)读写分离:默认,主节点可读可写,从节点只读
(2)任务分离:主节点只负责写入数据,从节点读取数据,负责生成持久化文件
架构:星型模型和线性模型
星型模式中所有节点都从主节点通信,并请求主节点进行数据同步
线性模型是一个串联模型,主机点只负责和一个从节点通信,其他的从节点和最近的从节点通信并请求获取数据
星型模型
优点:同步数据快,数据一致性好
缺点:对主节点的负载压力比较大
线性模型
优点:对主节点压力比较小,只需同步一台从节点数据即可
缺点:数据一致性差,同步数据慢
配置:
我们使用一台物理主机上模拟三台redis的安装
我们拷贝redis.conf为redis6379和redis6380,先拷贝俩份,然后我们配置完6380在拷贝6381
cp redis.conf redis6379.conf
cp redis.conf redis6380.conf
redis6379:
把rdb和aof关掉
redis6380
修改端口为6380
开启rdb和aof,并把rdb和aof的日志文件名修改成6380
然后需要把它的主节点配置修改了
退出保存即可,6380已经修改完毕
然后把6380拷贝一份6381
修改端口为6381
修改配置文件dump6381.rdb和appendonly6381.aof
然后保存启动测试
测试的时候,主节点写入,但是从节点获取不到信息,这个是我配置的问题,slave配置主机名配错了,所以大家要认真一点就可以了
redis的分片
redis的分片功能是用来实现负载均衡的,它需要使用一个第三的代理twemproxy来实现。
twemproxy的安装:
我们把包twemproxy安装包nutcracker-0.3.0.tar.gz上传服务器上
解压安装包 tar -zxvf nutcracker-0.3.0.tar.gz -C /root/training/
执行编译和安装
./configure --prefix=/root/training/proxy
make
make install
配置配置文件
在sbin文件下创建conf目录,一定要在sbin下创建conf目录(不然检查配置文件是否配置正确的时候总是通不过,其中就有
这个原因),并把解压后的conf/nutcracker.yml拷贝到这个目录下
cp /root/tools/nutcracker-0.3.0/conf/nutcracker.yml /root/tools/nutcracker-0.3.0/conf
配置nutcracker.yml
alpha:
listen: 127.0.0.1:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 127.0.0.1:6380:1
- 127.0.0.1:6381:1
servers表示要代理的机器ip和权重
可以使用检测命令检测一下配置格式是否正确
启动nutcracker
./nutcracker -d -c conf/nutcracker.yml
使用redis的客户端连接twemproxy
./redis-cli -p 22121
redis主从复制的HA功能
redis主从复制是通过哨兵的功能实现的,哨兵可以实现主节点的监控并当主节点宕机后自动选举主节点,然后让其他节点重练选举后的主节点
配置
核心配置文件:cp ~/tools/redis-3.0.5/sentinel.conf conf/
别名 主节点的地址 配置几个哨兵没有收到心跳,就进行HA的切换
sentinel monitor mymaster 127.0.0.1 6379 1
如果简单的配置这个已经足够了
然后启动哨兵,启动哨兵和启动redis节点差不多
然后我们杀死主节点后再看日志
然后我们的客户端就可以连接哨兵进行写日志了
除了上边简单的配置我们再了解一下其他的节点
sentinel down-after-milliseconds mymaster 30000 #当主节点宕机后多长时间后进行切换
sentinel leader-epoch mymaster 1 #当主节点切换后,同时允许几台从节点去连接主机获取数据,这个一定不能太大
redis的cluster
redis的cluster至少需要六个节点,三主三从,一个主节点对应一个从节点
Redis的分布式存储解决方案,负载均衡、高可用、扩展cluster都支持,
(*)核心思想:Hash分区
(*)槽号:slot,就是计算后的Hash值 从0到16383共16384个槽
(*)安装 部署Redis Cluster:基于Ruby的脚本
安装Ruby环境:
yum -y install ruby
安装Ruby和Redis的接口
gem install redis-3.0.5.gem
gem这个安装只出现在redis的3和4的版本,5的版本已经不用了
修改配置文件
在 redis的目录下创建一个cluster 用来放6个配置文件
mkdir cluster
拷贝配置文件
cp /root/tools/redis-3.0.5/conf/redis.conf /root/training/redis/cluster/redis6379.conf
修改6379的配置文件:
daemonize yes
port 6379
cluster-enabled yes
cluster-config-file nodes/nodes-6379.conf #在每个节点上,都会维护一份集群的配置需要提前创建nodes目录
#而且如果这样配置的话启动的时候需要在nodes同级目录下启动不然找不到 #nodes目录redis启动不起来,所以最后这里写绝对路径
cluster-node-timeout 15000
dbfilename dump6379.rdb
appendonly yes
appendfilename "appendonly6379.aof"
然后拷贝redis6379 到redis6380
cp redis6379.conf redis6380.conf
cp redis6379.conf redis6381.conf
cp redis6379.conf redis6382.conf
cp redis6379.conf redis6383.conf
cp redis6379.conf redis6384.conf
然后就把里边的6379改成对应的配置就可以了
通过各个配置启动各个redis
[root@bigdata111 bin]# ./redis-server ../cluster/redis6380.conf
[root@bigdata111 bin]# ./redis-server ../cluster/redis6381.conf
[root@bigdata111 bin]# ./redis-server ../cluster/redis6382.conf
[root@bigdata111 bin]# ./redis-server ../cluster/redis6383.conf
[root@bigdata111 bin]# ./redis-server ../cluster/redis6384.conf
然后对这个几个节点进行分片
使用redis提供的ruby脚本进行初始化
cp ~/tools/redis-3.0.5/src/redis-trib.rb bin/
--replicas指定主节点的冗余节点的个数
bin/redis-trib.rb create --replicas 1 192.168.112.111:6379 192.168.112.111:6380 192.168.112.111:6381 192.168.112.111:6382 192.168.112.111:6383 192.168.112.111:6384
使用客户端登录:bin/redis-cli -c -p 6379
-c表示:登录集群
当我们使用6379端口登陆上集群,并添加一个值得时候通过hash计算直接放到了12539的槽上,也就是6381的端口上
Redis的内存设置:内存过期的策略
(*)监控内存
[root@bigdata111 redis]# bin/redis-cli info |grep mem
used_memory:816000 占用的内存
used_memory_human:796.88K 把上面的值换成K
used_memory_rss:7606272
used_memory_peak:816000 内存的峰值
used_memory_peak_human:796.88K
used_memory_lua:36864
mem_fragmentation_ratio:9.32
mem_allocator:jemalloc-3.6.0