web架构
image.png
中心节点:name node
image.png
服务发现:service discovery
image.png
分布式 文件系统/存储系统/有无中心节点
varnish--http协议--nginx--存储协议--分布式系统(无http接口)
varnish--http协议--分布式系统(有http接口)
nosql流派众多
计数器数据/日志数据
redis(持久存储,性能不相上下的KV存储)
memcached(不能实现持久存储)
关键词搜索--搜索引擎(存储+构建索引)--elasticsearch
应用程序服务器
通过适配器连接存储系统实现供用户操作的美观界面--前端开发--ui设计/视觉设计
不同类型数据,存储不同系统
多个系统,在同一站点上,同时使用
节点down掉,文件不完整
节点冗余
数据块冗余--冗余1/2份
无中心节点--quorum机制 >total/2,即leader
BASE--当前系统,ACID--系统的特性,具体参考文档
http://www.nosql-database.org/
https://redis.io/
help @list
image.png
help @pubsub
image.png
redis
yum info redis
yum -y install redis
rpm -ql redis
systemctl start redis; ss -ntl tcp:6379端口
简单接口命令
没有启动认证,可直接连接
redis-cli -h
-a 指定密码,不用指定用户名,默认用户名仅一个
redis-cli = redis-cli -h localhost -p 6379
select 0 切换至数据库0(类似MySQL的use)
select 1 切换至数据库1,提示符变化--localhost:6379[1]
数据库默认0-15=16个数据库,不指定,默认就在0号数据库上
help 查看命令帮助
help @string 此处的字符包含数字
set name tom
get name
set major math
append major ,english
get major
setrange major 4 chinese 此处把4变为5--offset偏移量(english/chinese均7字符)
get major
strlen name 字符长度
incr count 第一次从0开始+1
incrby count 10 从原基础上+10
decr count 从原基础上-1
decrby count 5 从原基础上-5
get count
help @list 如上图1
rpush weekdays Tue Wed 右侧增加
lindex weekdays 0/1/2 显示索引中的元素信息
lpush weekdays Mon 左侧增加
lindex weekdays 0/1/2
lpop weekdays 左侧删除
rpop weekdays 右侧删除
lindex weekdays 0/1
linsert weekdays before Tue Mon Tue之前插入Mon
linsert weekdays after Tue Wed Tue之后插入Wed
lindex weekdays 0/1/2
help @hash
hset stu1 name tom
hmset stu1 age 17 gender mail major biology
hkeys stu1
hvals stu1
hget stu1 name
hgetall stu1
hdel stu1 major
hgetall stu1
hlen stu1 显示:the number of fields
hstrlen stu1 name
help @set
SDIFFSTORE
SINTERSTORE
sadd tom lucy lily wendy 增加tom(key)对应的members
sadd jerry lucy obama trump
sinter tom jerry 交集
sunion tom jerry 并集
sdiff tom jerry tom(key)有,jerry没有的 差集
sdiff jerry tom jerry有,tom没有的
smembers tom 查看tom的members
smembers jerry
sunionstore friends tom jerry 把tom和jerry的并集存储到friends中
smembers friends 查看friends的members
SDIFFSTORE 存储差集
SINTERSTORE 存储交集
help @sorted_set
索引和score是两回事
zadd math 90 FengBaobao 95 ZhangChulan 99 ZhugeQing 89 Xusi
zcard math 显示math(key)中的members的数量
zcount math 95 100 显示score在95-100之间的members的数量
zrange math 0 3 score由低到高排序(0/3--索引)
zrevrange math 0 3 score由高到低排序(0/3--索引)
zrangebyscore math 90 100 score由低到高排序(90/100--score)
zrank math FengBaobao
zscore math FengBaobao/ZhangChulan 显示各members的索引
help @pubsub
fanout 扇出 图
subscribe military finance entertainment education 订阅/监听这些频道
另一个窗口:
publish military 'US is going to cooperate with DPRK'
publish finance 'Japan is going to cooperate with China'
publish education 'The system of nine-year compulsory education is being implemented.'
publish entertainment 'Exited-Poppin is going to broadcast on Saturday.'
help @transactions 少用--运维
help @connection
ping 服务器的状态
ping hi
echo hello
quit
vim /etc/redis.conf 启动认证功能
/requirepass,在"# requirepass foobared"下面添加信息:
requirepass qianggedu
systemctl restart redis
redis-cli -h localhost -p 6379
get name 显示:NOAUTH Authentication required
auth qianggedu 进行认证,只有一个用户,密码是相同的,即requirepass
get name 可以访问
exit
vim /etc/redis.conf
把"# requirepass foobared"下面添加的信息,注释掉,避免后面实验不受影响
#requirepass qianggedu
systemctl restart redis
redis-cli
help @server 设置主从相关...
info 显示当前服务端的信息
info server
info clients
info memory
rss常驻内存集
maxmemory:0 redis使用的最大内存--无限制
maxmemory_policy:noeviction 定义内存空间的淘汰策略,此处即:不做任何淘汰
后面详细将,若是cache--基于lru/ttl/
info cpu
used_cpu_sys:0.39 内核空间执行时长
used_cpu_user:0.19 用户空间执行时长
client list 列出客户端
fd=5 文件标识符
centos7.4-2
grep -i "^###" /etc/redis.conf 查看配置段
vim /etc/redis.conf
bind 0.0.0.0 (不靠谱)
绑定监听的服务所在主机的地址
iptables层添加访问策略
认证--require password
systemctl restart redis
centos7.4-3
yum -y install redis
redis-cli -h 192.168.1.6
get name
centos7.4-2
redis-cli
config get requirepass 显示密码为空
config set requirepass qianggedu 设置密码
config get requirepass 显示没有权限:NOAUTH Authentication required
auth qianggedu 密码认证
config get requirepass 显示密码信息
config rewrite 内存中的设置覆盖到配置文件,使之永久有效
vim /etc/redis.conf
在文件后面出现以下信息,即内存覆盖到配置文件成功
# Generated by CONFIG REWRITE
requirepass "qianggedu"
config get appendonly
config set appendonly yes
config get appendonly
config rewrite
vim /etc/redis.conf
appendonly yes no变为yes,仅追加
ls /var/lib/redis/ 显示appendonly.aof和dump.rdb
更多配置参考文档
图1:两种存储方式
image.png
图2:sentinel和redis cluster:读和写的负载均衡
image.png
复制
centos7.4-2:192.168.1.6 主节点
centos7.4-3:192.168.1.7 从节点
centos7.4-4:192.168.1.12 从节点
vim /etc/hosts
192.168.1.6 centos7.4-2.fgq.com
192.168.1.7 centos7.4-3.fgq.com
192.168.1.12 centos7.4-4.fgq.com
centos7.4-2
前面的实验--有认证auth/开启了appendonly yes
centos7.4-3和centos7.4-4
yum -y install redis
vim /etc/redis.conf
修改信息:bind 0.0.0.0
systemctl restart redis;ss -ntl tcp端口6379
redis-cli
help SLAVEOF 看用法
SLAVEOF 192.168.1.6 6379 关联主节点/端口
CONFIG SET masterauth qianggedu 设置主节点的认证
CONFIG REWRITE 覆盖配置文件,永久有效
或者直接修改配置文件
vim /etc/redis.conf
/Replication
# slaveof <masterip> <masterport>
slaveof 192.168.1.6 6379
# masterauth <master-password>
masterauth "qianggedu"
systemctl restart redis;ss -ntl tcp端口6379
centos7.4-2
info replication 查看从节点信息
centos7.4-3和centos7.4-4
get name 数据同步过来了
SMEMBERS tom/jerry
centos7.4-3和centos7.4-4
CONFIG get slave-read-only 从节点是否只读
set discipline physics 显示:"can't write against a read only slave"从节点不能再写
centos7.4-3和centos7.4-4
配置为和主节点相同的认证功能
避免从节点被提升为主节点时,出现与原主节点不一致的情况
config set requirepass qianggedu
auth qianggedu
CONFIG REWRITE
启动sentinel(类似mha--管理节点) 如上图1和2
sentinel节点需要至少3个,此处避免节点过多,带不动,就把3个sentinel节点和主从节点放在一起了
centos7.4-2
rpm -ql redis
vim /etc/redis-sentinel.conf 基于集群状态自动被修改
port 26379 不变
bind 0.0.0.0 手动添加,否则会以守护进程方式启动
sentinel monitor mymaster 192.168.1.6 6379 2
sentinel auth-pass mymaster qianggedu
认证,密码和之前设定的相同,最好随机数加密,越难猜越好
sentinel down-after-milliseconds mymaster 5000
scp /etc/redis-sentinel.conf centos7.4-3.fgq.com:/etc/
scp /etc/redis-sentinel.conf centos7.4-4.fgq.com:/etc/
systemctl start redis-sentinel.service; ss -ntl 23679端口
centos7.4-3和centos7.4-4
systemctl start redis-sentinel.service; ss -ntl 23679端口
tail /var/log/redis/sentinel.log
centos7.4-2
redis-cli -h 192.168.1.7 -p 26379
sentinel masters 各集群的各主节点的各项属性信息--192.168.1.6
sentinel slaves mymaster 某主节点对应的各个从节点的各项属性信息
sentinel failover mymaster 手动切换主从节点
sentinel masters 192.168.1.7被提升为主节点
sentinel slaves mymaster
sentinel failover mymaster 第二次切换
sentinel masters 显示"s_down,master,failover_in_progress"
sentinel slaves mymaster 显示"slave,promoted"
需要等待3分钟,来投票,才会显示192.168.1.12被提升为主节点
centos7.4-4
此时为新的主节点,强行down掉
killall redis-server;ss -ntl 没有6379端口了,只有26379端口
centos7.4-2
sentinel masters
显示"s_down,master,disconnected,failover_in_progress"
显示"s-down-time"和"166961"--等到180000ms后,即可显示谁为主节点
sentinel masters 等到180000ms后,显示192.168.1.7被提升为主节点
sentinel slaves mymaster
显示192.168.1.6 slave
显示192.168.1.12 "s_down,slave,disconnected"
centos7.4-4
systemctl restart redis;ss -ntl 6379和26379端口都出现了
centos7.4-2
sentinel masters 显示192.168.1.12 slave
Twemproxy(Twitter)
image.png
Codis(豌豆荚)
image.png
Redis Cluster
image.png
Cerberus
image.png
一般情况下(小企业):只访问主节点(负责读写)--从节点只做冗余
测试--Codis/Redis Cluster
参考文档网站
修改内核参数vm.overcommit_memory = 1
vim /etc/sysctl.conf
vm.overcommit_memory = 1
sysctl -p
防止占用其他服务的内存空间/交换内存(不操作)
vim /etc/hosts
192.168.1.5 centos7.4.fgq.com
192.168.1.6 centos7.4-2.fgq.com
192.168.1.8 centos7.4-3.fgq.com
centos7.4和centos7.4-2和centos7.4-3
vim /etc/redis.conf
/bind
bind 192.168.1.5/6/8
/CLUSTER
cluster-enabled yes
cluster-config-file nodes-6379.conf 一个主机可运行多个实例,6379/6380/...便于区分
cluster-node-timeout 15000
cluster-slave-validity-factor 10
systemctl start redis;ss -ntl 6379端口
不操作:
cp /etc/redis.conf /etc/redis-6380.conf
vim /etc/redis-6380.conf
port改为6380
cluster-config-file nodes-6380.conf nodes-6379改为nodes-6380
redis-server -h 不用systemctl启动;用redis-server读取配置文件,使之生效
centos7.4
redis-cli -h 192.168.1.5
cluster info 显示cluster_state:fail,没有分槽
cluster meet 192.168.1.6 6379 添加主节点
cluster meet 192.168.1.8 6379
quit
for i in {0..5460};do redis-cli -h 192.168.1.5 cluster addslots $i;done
分槽:centos7.4的槽位为0-5460
centos7.4-2
for i in {5461..10921};do redis-cli -h 192.168.1.6 cluster addslots $i;done
centos7.4-3
for i in {10922..16383};do redis-cli -h 192.168.1.8 cluster addslots $i;done
centos7.4
redis-cli -h 192.168.1.5
cluster info 显示cluster_state:ok,已经分槽
cluster nodes 查看各节点id
命令行:for i in {0..100};do redis-cli -h 192.168.1.5 set key$i value$i;done
get key1
显示(error) MOVED 9189 192.168.1.6:6379 槽位在192.168.1.6节点上
get key2 显示value2
centos7.4-2
get key1
显示(nil)--空的 槽位在本机上,但是没有数据
因为在其他节点上设置的,不能连接至centos7.4-2
help CLUSTER REPLICATE
CLUSTER REPLICATE node-id
Reconfigure a node as a slave of the specified master node
网友评论