一、redis的安装
先在下载安装包
解压后进入目录应为已经有Makefile了所以直接make编译
这里会报错,需要gcc编译器
安装好gcc,再次make编译,还是会报错;这个错误根据 Readme 可知需要执行 make MALLOC=libc
make完成后,提示去到 src 目录下
到src目录后执行按提示执行make test,会报错提示安装tcl工具
完成后 make install 完成安装
注意进入utils目录,执行install_server.sh,不然脚本会报错,提示找不到相应文件。脚本执行时,会有几个设置config等的问题,默认回车即可
至此redis已经安装完毕
二、redis的主从复制和高可用
1、redis的主从复制
1)编辑redis的配置文件,配置文件位置如下图
2)注释bind 127.0.0.1
在配置文件redis.conf中,默认的bind 接口是127.0.0.1,也就是本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接,这样可以避免将redis服务暴露于危险的网络环境中,防止一些不安全的人随随便便通过远程,但是我们做主从复制。
但是搭建主从复制,需要另一台redis端连接到本机,所以要将其注释。
2)关闭保护模式
3)另一台redis端在其配置文件做同样操作,并且需要指定master端ip和端口,如图
如上操作所示,已经完成redis的主从复制,测试:在master端server3:set name kk,在server3查看
完成主从复制
2、redis高可用
高可用原理:
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
配置环境:三台虚拟机安装 redis 服务
Server3: 172.25.77.3 (先做 master)
Server4:172.25.77.4
Server5:172.25.77.5
按主从复制先配置好一主两从
1)在安装包中将 sentinel 文件复制到/etc/redis/下
2)编辑 sentinel.conf 如下图
关闭保护模式
配置指示 Sentinel 去监视一个名为 mymaster 的主服务器,这个主服务器的IP 地址为 172.25.77.3,端口号为 6379 ,而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意(只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)
down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线
完成后将 sentinel 配置文件发送 server4 和 sevrer5
3)三台 redis 启动 Sentinel 服务
+slave 表示 :一个新的从服务器已经被 Sentinel 识别并关联。可以看到片此时 master 是 server3;server4 和 server5 是 slave。
4)测试:master 端 server3 info 查看 replication 信息:
查看后 shotdown
此时:server4 监听如下图
+switch-master :配置变更,主服务器的 IP 和地址已经改变。
+sdown :给定的实例 server3 现在处于主观下线状态。
根据信息我们可以看到此时 master 为 server5,我们在 server5 查看info 信息如下图,server5成为master,只有一个slave是server4
如上操作,实现了高可用即自动故障迁移
三、用redis做mysql缓存
Gearman+PHP+MySQL UDF的组合异步实现MySQL到Redis的数据复制。用redis作为Mysql数据库的缓存,在查找的时候,首先查找redis缓存,如果找到则返回结果;如果在redis中没有找到,那么查找Mysql数据库,找到的花则返回结果并且更新redis;如果没有找到则返回空。对于写入的情况,直接写入mysql数据库,mysql数据库通过触发器及UDF机制自动把变更的内容更新到redis中。采用MySQL作为数据存储引擎,Redis则作为Cache。
mysql读写数据都需要从磁盘读取 。磁盘的容量,带宽的大小就影响了网站的访问速度,读取的方式,也就是sql
语句,次数和效率也会影响读取效率。
redis和mc都是缓存,并且都是驻留在内存中运行的,这大大提升了高数据量web访问的访问速度。然而mc只是提供了简单的数据结构,比如 string存储;redis却提供了大量的数据结构,比如string、list、set、hashset、sorted set这些,这使得用户方便了好多,毕竟封装了一层实用的功能,同时实现了同样的效果,当然用redis而慢慢舍弃mc。
1、先做主从同步 server5为master server3为slave server4为应用层
2、server4做lnmp架构安装nginx和php,编辑www.conf配置文件,将user和group改成nginx
3、在vim /etc/php.ini改时区
4、在/etc/nginx/conf.d编辑default.conf文件
5、在/usr/share/nginx/html下编辑php发布目录,完成启动ngixn服务
完成后查看
6、为php增加redis扩展库,在/etc/php.d/目录下添加extension=redis.so
7、编写php检验脚本,redis->connect写redis的masterf端ip,mysql写mysql服务端的ip
8、在mysql服务端安装mysql-serevr,并进行授权
将编写好的库文件导入
查看
网页查看
刷新redis查看
9、此时,更新数据库,查看redis并没有改变
10、1)在server4安装如下安装包
通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用 WebService 的方式来处理此类集成问题,但不管采用何种风格的 WebService,如 RPC 风格,或者 REST 风格,其本身都有一定的复杂性。相比之下,Gearman 也能实现类似的作用,而且更简单易用。
2)开启服务,查看端口
3)为php增加gearman扩展库,在/etc/php.d/目录下添加extension=gearman.so
4)安装lib_mysqludf_json
使用lib_mysqludf_json的原因是因为Gearman只接受字符串作为入口参数,可以通过lib_mysqludf_json将MySQL中的数据编码为JSON字符串
可以看到重新编译生成了 lib_mysqludf_json.so 文件,将文件复制到MySQL的插件安装路径
5)可以查看mysql插件安装路径,并登入MySQL运行语句注册UDF函数:
6)安装gearman-mysql-udf
提示需要libgearman
编译安装
和上面类似:生成了 libgearman_mysql_udf.so 文件插入到MySQL的插件安装路径
注册udf函数,查看
指定Gearman服务器的信息:
7)通过MySQL触发器实现数据同步
同步哪些数据,同步的条件,还是需要根据实际情况决定,比如我希望将数据表data的数据在每次更新时同步,那么编写Trigger如下:完成后导入数据库
查看triggers信息
8)编写一个Gearman Worker:redis_worker.php
指定redis的master
最后需要将Worker在后台运行:
测试:在mysql更新数据,redis查看:
经测试通过这种方式将MySQL数据复制到Redis,单Worker基本可以瞬时完成。
四、redis-cluster集群
redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
配置环境:一台服务器 我这里ip为:172.25.77.5
1、redis cluster节点分配
假设现在我们是三个主节点分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:
节点A覆盖0-5460;
节点B覆盖5461-10922;
节点C覆盖10923-16383.
获取数据:
如果存入一个值,按照redis cluster哈希槽的算法: CRC16('key')384 = 6782。 那么就会把这个key 的存储分配到 B 上了。同样,当我连接(A,B,C)任何一个节点想获取'key'这个key时,也会这样的算法,然后内部跳转到B节点上获取数据
新增一个节点D,redis cluster的这种做法是从各个节点的前面各拿取一部分slot到D上,大致就会变成这样:
节点A覆盖1365-5460
节点B覆盖6827-10922
节点C覆盖12288-16383
节点D覆盖0-1364,5461-6826,10923-12287
同样删除一个节点也是类似,移动完成后就可以删除这个节点了。
2、redis-cluster的主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
上面那个例子里, 集群有ABC三个主节点, 如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。
所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。
B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。 当B重新开启后,它就会变成B1的从节点。 不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。
3、下面开始搭建
1)停掉redis服务,在/usr/local下建立6个目录
配置redis.conf如图
复制文件到每个目录下,只用修改端口号
然后启动节点
完成后查看如下图:
2)redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。
运行redis-trib.rb
提示没有ruby工具,yum安装,再次执行,提示需要rubygems
安装完后,还需要redis-gem翻译器
安装的时候提示ruby版本要>=2.2.2,刚才使用yum安装,导致版本没更上,问题不大,需要什么找什么安装什么
翻译器安装完成gem list查看
此时redis-trib.rb也可以使用
使用redis-trib.rb建立集群
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
上面显示创建成功,有3个主节点,3个从节点,每个节点都是成功连接状态
4)测试:-c表示连接 -p连接的节点
查看信息:
节点以及分配的哈希卡槽如下: