一、redis的集群模式
1.主从复制
(1)概述
主从模式:这是redis高可用的基础,哨兵和集群都是建立在此基础之上。
主从模式和数据库的主从模式是一样的,主负责写入,然后把写入的数据同步到从服务器,但是从节点只能读不能写(read only)
(2)工作过程
- 当配置完整之后,从节点启动,会向主节点发送一个sync command,请求同步连接
- master都会开启一个后台的进程将主节点的数据保存到数据文件中
- 主节点把数据同步给从节点从节点先把数据保存到硬盘,再加载到内存
(3)缺点
不能做高可用的切换,主节点出现故障,没有替换的主节点,所有的写入操作都将失败。
(4)实验
redis1 192.168.206.40 主
redis2 192.168.206.50 从1
redis3 192.168.206.55 从2
时间同步:
ntpdate ntp.aliyun.com
主从配置几乎一致
vim /etc/redis/redis.conf
55行 监听地址注释掉
87行 改成no
224行 daemonize yes #开启守护进程
1094行 appendonly yes
两台从服务器在第388行下添加:
replicaof 192.168.206.40 6379
systemctl restart redis
tail -f /var/log/redis/redis-server.log
#看见两台从服务器的同步信息
2.哨兵模式
(1)概述
在主从模式的基础之上,哨兵模式引入了故障切换的模式。
哨兵也是一个分布式的集群结构,对主从当中的每台服务器进行监控,当出现故障时,通过投票的机制选择一个新的master。被选举出的新的master会将所有的从节点重新连接到自己,从节点会自动同步到主,自动变成只读模式。
(2)工作过程
- 主从之间,互相有一个心跳的检测
- 当主节点宕机,从节点都会收到主的宕机的信息
- 两个从节点,自动进行投票,选择一个新的主
- 从节点会自动加入新主的主从模式。
(3)实验
#在配置哨兵模式的第一次的时候,人为的定义好主
三台操作一致:
apt -y install redis-sentinel
vim /etc/redis/sentinel.conf
16行注释掉
18行取消注释
27行 改成yes
142行 sentinel monitor mymaster 192.168.206.40 6379 2
#人工定义主的服务器
2的含义:当主节点发生故障,必须要有两个从节点同意,才能进行主节点的故障切换
#下面两条必须要写在定义主的下面
sentinel down-after-milliseconds mymaster 30000
#判断服务器宕机的时间周期是30000毫秒=30秒
sentinel failover-timeout mymaster 18000
#故障节点的最大超时时间18000=18秒
tail -f /var/log/redis/redis-sentinel.log #查看日志
systemctl stop redis#关闭40的redis,主会自动切换到50或者55,在40恢复工作后也会作为从加入到主上去
3.集群
(1)概述
redis-cluster: 集群是由多个节点组成,redis的数据分布在节点当中,集群的当中每个节点又分主和从
集群-->高可用,和主从复制不一样
(2)hash槽位
0-16383个hash槽位
A 0-5460
B 5461-10922
C 10923-16383
(3)工作过程
(4)实验
6台同步一起操作:
时间同步
vim /etc/redis/redis.conf
55行监听地址都注释掉
protected-mode no
224行 daemonize yes
1227行 cluster-enabled yes #开启集群
1235行 cluster-config-file nodes-6379.conf #设置集群的配置文件
1094行 appendonly yes
1241 cluster-node-timeout 15000 #设置集群的超时时间
redis-cli -h 192.168.206.40 --cluster create 192.168.206.40:6379 192.168.206.50:6379 192.168.206.55:6379 192.168.206.60:6379 192.168.206.70:6379 192.168.206.80:6379 --cluster-replicas 1
--cluster-replicas 1: 表示每个主节点对应一个从节点
root@redis1:~# redis-cli -h 192.168.206.40 -p 6379
192 168 206 40:6379> set test10 10
(error) MOVED 9248 192.168.206.50:6379
#表示客户端尝试将这个数值保存到槽位号是9248的位置,实际槽位在50这个主机。
redis的集群模式,只是满足高可用,不能实现数据同步。对数据同步要求很高的场景,选择redis的主从和哨兵。
二、ELK:统一日志收集系统
1.组成
elasticsearch
- 分布式的全文索引引擎 非关系型数据库
- 存储所有的日志信息,主从(最少需要2台 )
logstash
- 动态的从各种指定的数据源获取数据,而且对书据进行过滤,分析
- 按照统一的格式发送到es
kibana
- 把es的数据进行展示,进行客户端可以理解的操作,汇总、分析和搜索数据的平台。
2.工作过程
- logstash收集日志数据
- 收集到的数据按照es的格式,发送到数据库
- 在图像界面展示-->kibana
- 客户端访问kibana
3.实验
nginx1 192.168.206.60 es1
nginx2 192.168.206.70 es2
nginx3 192.168.206.80 logstash kibana
安装es
dpkg -i elasticsearch-6.7.2.deb
free -h
echo 3 > /proc/sys/vm/drop_caches #内存太小,就清理一下
vim /etc/ elasticsearch/elasticsearch.yml
grep -v "^#" elasticsearch.yml #检查修改的地方
cluster.name: my-elk
node.name: node-1 #两边的node不能一致 第二台的编号为2
node.master: true #该节点是否为主节点 第二台为false
node.data: true #表示该节点是否为数据节点,主从都要
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0 #修改服务的监听地址
http.port: 9200 #es对外提供的默认端口
transport.tcp.port: 9300 #指定es集群内部的通信接口
discovery.zen.ping.unicast.hosts: ["192.168.206.60:9300", "192.168.206.70:9300"]
#集群节点通过单播的形式,通过9300端口实现内部通信
http.cors.enabled: true #开启跨域访问
http.cors.allow-origin: "*" #允许跨域访问的地址域名为所有
systemctl restart elasticsearch
tail -f /var/log/syslog
netstat -antp | grep 9200
用浏览器测试
安装logstash和kibana
dpkg -i logstash-6.7.2.deb
systemctl restart logstash.service
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ #创建软连接
dpkg -i kibana-6.7.2-amd64.deb
vim /etc/kibana/kibana.yml
grep -v "^#" kibana.yml
server.port: 5601 #监听端口
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.206.60:9200","http://192.168.206.70:9200"]
kibana.index: ".kibana" #索引
logging.dest: /var/log/kibana.log #日志位置
i18n.locale: "zh-CN" #支持中文
touch /var/log/kibana.log
logstash -f system.conf --path.data /op& #后台运行
vim /etc/logstash/conf.d/system.conf
input {
file {
path=>"/var/log/syslog"
#指定要收集的日志文件的路径
type=>"system"
#自定义索引的标志类型
start_position=>"beginning"
#表示从哪个位置开始收集日志,end
}
}
output {
elasticsearch {
hosts => ["192.168.206.60:9200","192.168.206.70:9200"]
#指定服务器ip地址和端口
index => "system-%{+YYYY.MM.dd}"
#索引名称
}
}