目录
1.Redis的安装
2.Redis的主从复制
3.Redis主从的自动切换
1.配置server3的redis
2.在server1中,配置sentinel
4.集群cluster
1.构建集群
2.节点的主从自动切换
3.添加节点和分配哈希槽
5.redis+mysql的缓存服务器
6.redis和mysql的数据一致
1.Gearman
2.在server3安装数据库的开发包
3.注册UDF函数
4.server3下载安装gearman
5.编辑mysql触发器,重新导入数据库
6.在server1中启动服务及worker任务
7.server3更新mysql数据
Redis是现在最受欢迎的数据库之一,Redis是一个使用ANSIC编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
Redis具备的特点是:
- C/S通讯模型
- 单进程单线程模型
- 丰富的数据类型
- 操作具有原子性
- 持久化
- 高并发读写
- 支持lua脚本
config get * #查看配置
select 1 #选择数据库
flushdb #清空当前数据库
flushall #清空所有数据库
move key 1 #移动key
del key #删除
rename oldkey newkey #改名
expire key 10 #设置过期时间
persist key #设置持久化
keys user* #查询
exists key #判断是否存在
server1的安装和配置
cd utils/
vim install_server.sh
文件中有操作系统的判断会导致安装失败,所以提前修改文件
注释掉本地连接,避免使用网络连接时报错++
protected-mode no
设定关闭保护模式
重启服务使配置生效
redis可以创建多个实例
server2的redis安装
安装依赖
cd utils/
./install_server.sh
systemctl daemon-reload
systemctl start redis.service
修改server2的redis.conf
vim redis.service
protected-mode no
daemonize yes
基于sentinel哨兵模式,哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
一主两从的情况下,当master与两个slave或因网络关系断掉的情况下,客户端并不知道master失联,会持续写入数据,但此时slave端已经不能复制数据。
如果需要解决此问题,则需要两个slave同时认定不能连接master,或者,超过设定时间不能连接,则此时master端会拒绝客户端继续写入,那么重新接入变成slave时就不会造成数据丢失
tar zxf redis-6.2.4.tar.gz
cd redis-6.2.4/
yum install -y gcc
yum install -y systemd-devel
make
make install
cd utils/
vim install_server.sh
///
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
///
./install_server.sh
sentinel monitor mymaster 172.25.134.1 6379 2 #master为server1,2表示需要两票通过
sentinel down-after-milliseconds mymaster 10000 #连接超时为10s
server1中查看master状态
redis-cli
> info
server1为master,server2,3为slave
投票切换,2票切换master,server2为master-
Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容
vim /var/lib/redis/6379.conf
开启AOF模式
/etc/init.d/redis_6379 restart
确定状态为master
查看数据是否正常写入
创建六个节点的目录
修改配置文件
cluster-enabled yes #开启集群
cluster-config-file nodes.conf #集群配置文件
cluster-node-timeout 5000 #节点超时
appendonly yes #开启AOF模式
daemonize yes #用守护线程的方式启动
启动服务
ps ax查看状态
复制7001的配置文件到700{2..6},启动服务
创建集群主从节点,–cluster-replicas 参数为数字,1表示每个主节点需要1个从节点。然后检查集群,查看集群信息。
用redis-cli来进行集群的交互,客户端连接任意一个节点,使用-c表示以集群的方式登录,-p指定端口。当连接master端时,读写正常,在连接slave时,执行写操作时,自动会切换到master端进行写入操作
除了手动建立集群,也可以通过自带的脚本构建集群
redis中自带脚本进行集群的创建,启动脚本就会根据脚步文件中设定创建和启动实例
cd utils/create-cluster/
./create-cluster start #创建和启动实例
./create-cluster stop #停止实例
当关闭master端7002时,查看状态会发现原本7002对应的slave端7006变成了master端,而7002因为关闭所以无法查询到状态
当重新启动原先的master端7002时,7002会变成master端7006的slave端
添加节点7007和7008并启动服务
将7007添加到集群中,未指定master端ID,没有多余的master端不能被自动分配,7007添加为master端,由于哈希槽的数量是固定的,而如果master端没有分配到哈希槽,那么master是无法正常工作的,所以要把哈希槽从一组节点移动到另一组节点
How many slots do you want to move (from 1 to 16384)? #你想要移动的插槽数量
What is the receiving node ID? #接收节点的master端的ID
Source node #1: all #从哪些节点获取这些资源,all指的是从每个组中都获取一些,也可以从一组中获得
Do you want to proceed with the proposed reshard plan (yes/no)? yes #确定是否要继续重新分片
分片操作完成,7007获得了从7001,7006,7003分出的1000个哈希槽
需要提前安装好php和nginx
安装进程管理工具psmisc,便于关闭redis进程
关闭redis
修改环境变量
安装mariadb数据库
删除server2中redis的多余配置,把server2变成master
下载测试网页并修改主从IP
写入测试数据
安装软件包php、gearmand、libevent-devel、libgearman相关软件包
在浏览器访问172.25.134.3/test.php
此数据只能同步复制,不能异步复制,只能在redis上改写和读取数据,mysql端更改不生效,即数据不一致,因为客户端读的时候去找redis缓存;客户端写的时候去找mysql
Gearman提供了一个通用的应用程序框架,用于将工作转移到更适合于工作的其他机器或流程。它允许你并行工作,负载平衡处理,并在语言间调用函数。它可用于从高可用性网站到传输数据库复制事件的各种应用程序
一个Gearman驱动的应用程序由三部分组成:一个客户端,一个工作者和一个作业服务器。客户端负责创建要运行的作业并将其发送到作业服务器。作业服务器将找到可以运行作业并转发作业的合适工作人员。工作人员执行客户端请求的工作,并通过作业服务器向客户端发送响应。Gearman提供您的应用程序调用的客户端和工作者API来与Gearman作业服务器,因此开发人员不需要处理网络或作业的映射。在内部,gearman客户端和工作者API使用TCP套接字与作业服务器进行通信
启动server1的gearmand
通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,拷贝lib_mysqludf_json.so 模块。进入数据库,查看mysql 的模块目录,注册 UDF 函数,查看函数
make install
指定gearman的服务信息
server1在配置server3时已经启动
运行worker.php并打入后台
ps ax #查看是否开启 worker.php
在浏览器可以查看,此时server1端已经同步了server3中mysql经由server2中redis上传的数据