redis

本文介绍了一种LNMP架构与Redis缓存服务器的集成方案,包括安装配置过程、实现MySQL与Redis的数据同步以及通过Gearman框架进行分布式任务调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis需要lnmp架构
host5为redis
host6为数据库
host7为lnmp架构

host7操作lnmp架构

1:安装php-fpm,nginx基本配置

yum install nginx-1.8.0-1.el6.ngx.x86_64.rpm 
php-5.3.3-38.el6.x86_64.rpm
php-cli-5.3.3-38.el6.x86_64.rpm
php-common-5.3.3-38.el6.x86_64.rpm
php-devel-5.3.3-38.el6.x86_64.rpm
php-fpm-5.3.3-38.el6.x86_64.rpm
php-gd-5.3.3-38.el6.x86_64.rpm
php-mbstring-5.3.3-38.el6.x86_64.rpm
php-mysql-5.3.3-38.el6.x86_64.rpm
php-pdo-5.3.3-38.el6.x86_64.rpm

这里写图片描述
这里写图片描述

启动php-fpm

/etc/init.d/php-fpm start

这里写图片描述

ps aux   #查看进程

这里写图片描述

配置nginx文件

vim /etc/nginx/nginx.conf 

  2 user  apache;
  3 worker_processes  auto;

这里写图片描述

vim /etc/nginx/conf.d/default.conf
 30     location ~ \.php$ {
 31         root           html;
 32         fastcgi_pass   127.0.0.1:9000;
 33         fastcgi_index  index.php;
 34         fastcgi_param  SCRIPT_FILENAME   /usr/share/nginx/html$fastcgi_script_name;
 35         include        fastcgi_params;
 36     }

这里写图片描述
这里写图片描述

/etc/init.d/nginx start ##启动nginx

这里写图片描述

 vim /etc/php.ini  配置时区
   946 date.timezone =Asia/Shanghai
 /etc/init.d/php-fpm reload

date.timezone =Asia/Shanghai
这里写图片描述

写一个默认页

cd /usr/share/nginx/html
  vim index.php
  <?php
    phpinfo()
  ?>

这里写图片描述

/etc/init.d/nginx reload  ##重新加载nginx

浏览器查看

http://172.25.254.7
http://172.25.254.7/index.php

这里写图片描述
这里写图片描述

加载模块redis.so模块

yum install unzip gcc
unzip  phpredis-master.zip
cd phpredis-master
phpize
./configure
make && make install

编译安装完成后

cd /usr/lib64/php/modules/   
ls   有很多模块尤其是redis.so


切换到/etc/php.d/
cd /etc/php.d/
cp mysql.ini redis.ini
vim redis.ini
   extension=redis.so 
php -m | grep redis 

这里写图片描述

host7安装redis

下载 redis-4.0.8.tar.gz ,解包进入到解压后的目录中

tar zxf redis-4.0.8.tar.gz 
cd redis-4.0.8

make && make install
cd utils/
./install_server.sh

这里写图片描述
这里写图片描述
执行./install_server.sh是默认即可,一路回车,注意最后会告诉你安装成功
这里写图片描述
修改redis配置文件

 vim /etc/redis/6379.conf 
    70 bind 0.0.0.0
 /etc/init.d/redis_6379 restart  ##没有reload命令

这里写图片描述

测试一下
redis-cli
  ---info

这里写图片描述

内核参数overcommit_memory

它是 内存分配策略

可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

[root@host7 ~]# sysctl vm.overcommit_memory
vm.overcommit_memory = 0
[root@host7 ~]#  sysctl -w  vm.overcommit_memory=1
vm.overcommit_memory = 1

host8安装数据库

yum install  mysql-server.x86_64 0:5.1.71-1.el6
 /etc/init.d/mysqld start
mysql  ##直接进入数据库不要密码,redhat6.5自带的mysql 

为了下来的实验host8还要安装redis

再家目录中,以下操作务必注意工作环境
tar zxf  redis-4.0.8.tar.gz 
cd redis-4.0.8
yum install gcc
make && make install  ##如果报错了,看说明,我这里缺少jemalloc ,安装再次make && make install
cd utils/
 ./install_server.sh 

这里写图片描述
报错安装
jemalloc.x86_64 0:3.6.0-1.el6
jemalloc-devel.x86_64 0:3.6.0-1.el6
这里写图片描述
再次安装ok
这里写图片描述

同样简单的配置下文件
vim /etc/redis/6379.conf 
   70 bind 0.0.0.0
   89 protected-mode no

/etc/init.d/redis_6379 restart

host5安装redis同上

tar zxf  redis-4.0.8.tar.gz 
cd redis-4.0.8
yum install gcc
make && make install
cd utils/
./install_server.sh 
vim /etc/redis/6379.conf 
   ---70 bind 0.0.0.0
/etc/init.d/redis_6379 restart

这里写图片描述

接下来设置redis主从

1.

slave配置(host5)

vim /etc/redis/6379.conf
    70 bind 0.0.0.0
        89 protected-mode no
        283 slaveof 172.25.254.7 6379
/etc/init.d/redis_6379 restart

slave(host8)配置

vim /etc/redis/6379.conf
    70 bind 0.0.0.0
        89 protected-mode no
        283 slaveof 172.25.254.7 6379
/etc/init.d/redis_6379 restart

host7, 这里将其作为master

vim /etc/redis/6379.conf
    70 bind 172.25.254.7   ##自己的ip
        89 protected-mode no
/etc/init.d/redis_6379 restart

注意:登陆要使用ip

redis-cli  -h 172.25.254.7
info  ##查看状态

这里写图片描述
host7作为master时可以写的 这里写了一个sex = M
这里写图片描述
host5尝试写入数据:结果只能看到master写入的数据,自己不能写,slave只读
这里写图片描述
host8的情况和host5相同

这里写图片描述

哨兵监控

host7为主

配置host7
进入redis-4.0.8.tar.gz解压的目录中redis-4.0.8会看到这个文件:sentinel.conf,将其复制以分到/etc/redis/下

 cd redis-4.0.8
 cp sentinel.conf /etc/redis/

这里写图片描述
然后进去进行配置

 vim  /etc/redis/sentinel.conf 
    17 protected-mode no
    21 port 26379
    69 sentinel monitor mymaster 172.25.254.7 6379 2  ##masterip 端口 以及slave个数
    98 sentinel down-after-milliseconds mymaster 5000 ##原来的30秒时间太久(masterdown掉后,提升新的slave成为master的时间),这里设置5秒
    131 sentinel failover-timeout mymaster 10000  ##

完成后给其他两台slave拷贝一份到/etc/redis/下

scp sentinel.conf host5:/etc/redis/
scp sentinel.conf 172.25.254.8:/etc/redis/

这里写图片描述

完成后

redis-cli  -h 172.25.254.7
info

这里写图片描述
命令去查看

[root@host5 redis]# redis-server /etc/redis/sentinel.conf --sentinel

这里写图片描述
master 可读可写
这里写图片描述
slave只能读不能写
这里写图片描述
这里写图片描述

down掉master(host7)

这里写图片描述

redis-server /etc/redis/sentinel.conf --sentinel   ##查看

这里写图片描述
host5为新的master,host7已经为slave了

这里写图片描述

此时host5可读可写
这里写图片描述

host8只能读
这里写图片描述


redis缓存

清环境,注意nginx的配置,前边的实验已经配的差不多了,这里不再列出了

host5为redis缓存
host7为lamp架构服务器
host8为数据库

关闭host7和host8的redis

这里写图片描述
这里写图片描述

vim /etc/redis/6379.conf
slaveof 172.25.254.7 6379 ##注释掉 ,取消redis主机map
重启redis

这里写图片描述

将准备好的test.php测试页放到lqmp架构的nginx默认发布目录中
/usr/share/nginx/html下

这里写图片描述

对test.php测试页加以修改,指定redis服务器172.25.254.5,数据库服务器172.25.254.8

这里写图片描述

host8安装数据库,自带的就行,启动,高版本影响实验:
将准备好的test.sql数据库导进去
service mysqld start
mysql> grant all on test.* to redis@localhost identified by 'westos';
mysql> flush privileges;

这里写图片描述

即得开启host5的redis服务,host7的nginx和php-fpm服务,以及host8的数据库服务
客户端浏览器测试(注意解析):
http://172.25.254.7/test.php

这里写图片描述

到这里,我们已经实现了 redis 作为 mysql 的缓存服务器,但是如果更新了 mysql,redis中仍然会有对应的 KEY,数据就不会更新,此时就会出现 mysql 和 redis 数据不一致的情况。所以接下来就要通过 mysql 触发器将改变的数据同步到 redis 中。

host8查看倒进去的数据库信息

这里写图片描述

host5查看redis缓存

这里写图片描述

update test.test set name='redhat' where id='1';更新一条信息
这里写图片描述
host5redis缓存每变
这里写图片描述
客户端访问数据也没更新
这里写图片描述

配置 gearman 实现数据同步

Gearman 是一个支持分布式的任务分发框架:Gearman Job Server: Gearman 核心程序,需要编译安装并以守护进程形式运行在后台。Gearman Client:可以理解为任务的请求者。Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker 接收到 Gearman Client 传递的任务内容后,会按顺序处理。
大致流程:下面要编写的 mysql 触发器,就相当于 Gearman 的客户端。修改表,插入表就相当于直接下发任务。然后通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,然后在通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中,最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新。

简单来讲

一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。
Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。
Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Worker。
Worker:请求的处理者,可以是 C,PHP,Perl 等等。
因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成。甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。

部署:

host7(lamp架构)操作

#1.安装gearmand服务
gearmand-1.1.8-2.el6.x86_64.rpm
libevent-1.4.13-4.el6.x86_64.rpm
libevent-devel-1.4.13-4.el6.x86_64.rpm
libevent-doc-1.4.13-4.el6.noarch.rpm
libevent-headers-1.4.13-4.el6.noarch.rpm
libgearman-1.1.8-2.el6.x86_64.rpm
libgearman-devel-1.1.8-2.el6.x86_64.rpm
tokyocabinet-1.4.33-6.el6.x86_64.rpm
service gearmand start #启动服务
netstat -antlp |grep gearmand  ##查看端口,4730

这里写图片描述

2.安装 php 的 gearman 扩展

https://pecl.php.net

yum install -y db*-devel
tar zxf gearman-1.1.2.tgz
cd gearman-1.1.2
phpize
./configure --with-php-config=/usr/bin/php-config
make && make install

编译过程注意报错,这里没有报错,编译完成后,告诉你模块在/usr/lib64/php/modules/下
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

3.加载模块

方法一

vim /etc/php.ini
   924 extension=gearman.so

这里写图片描述
这里写图片描述
重新记载php-fpm,查看模块是否加载

php -m | grep gearman
gearman                       ###出现表示加载上了

这里写图片描述

方法二是到/etc/php.d/下编辑一份新文件命名为:gearman.ini写入extension=gearman.so 网称后/etc/init.d/php-fpm reload再去查看模块是否加载

3.数据库服务器host8安装lib_mysqludf_json,需要下载lib_mysqludf_json-master.zip 和数据库编译依赖包mysql-devel
3.1lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映射为 JSON 格式,是通过程序来转换的。

https://github.com/mysqludf/lib_mysqludf_json

yum install -y mysql-devel
unzip lib_mysqludf_json-master.zip
cd lib_mysqludf_json-master
 gcc $(mysql_config --cflags) -shared -fPIC -o \
lib_mysqludf_json.so  lib_mysqludf_json.c
##cp  lib_mysqludf_json.so  /usr/lib64/mysql/plugin  3.3操作 

安装mysql-devel
这里写图片描述
解压lib_mysqludf_json-master.zip ,进行json格式转换

这里写图片描述
这里写图片描述

3.2拷贝 lib_mysqludf_json.so 模块到/usr/lib64/mysql/plugin/
cd /root/lib_mysqludf_json-master
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/

这里写图片描述

3.3进入数据库查看 mysql 的模块目录:
mysql> show global variables like 'plugin_dir';
+---------------+-------------------------+
| Variable_name | Value                   |
+---------------+-------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin |
+---------------+-------------------------+
3.4注册查看 UDF 函数
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME
'lib_mysqludf_json.so';

mysql> select * from mysql.func;

这里写图片描述

4. host8数据库安装 gearman-mysql-udf

这个插件是用来管理调用 Gearman 的分布式的队列。
https://launchpad.net/gearman-mysql-udf

4.1解压进入目录编译安装

./configure编译前解决依赖问题

yum install
libevent-devel-1.4.13-4.el6.x86_64.rpm    
libevent-doc-1.4.13-4.el6.noarch.rpm 
libevent-headers-1.4.13-4.el6.noarch.rpm   
libgearman-1.1.8-2.el6.x86_64.rpm
libgearman-devel-1.1.8-2.el6.x86_64.rpm

然后进行编译

 tar zxf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6
./configure --with-mysql=/usr/bin/mysql_config  --libdir=/usr/lib64/mysql/plugin/
 make# make install

这里写图片描述
这里写图片描述
每报错ok
这里写图片描述

4.2注册查看 UDF 函数
mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME
'libgearman_mysql_udf.so';
mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME
'libgearman_mysql_udf.so';
mysql> select * from mysql.func;

这里写图片描述

#4.3指定 gearman 的服务信息
mysql> SELECT gman_servers_set('172.25.254.7:4730');  ##lamp结构机

这里写图片描述

5. 编写 mysql 触发器(根据实际情况编写)

host8的操作
vim test.sql   ##编辑触发器
mysql < test.sql   ##到入数据库
mysql> SHOW TRIGGERS FROM test; ###查看触发器

这里写图片描述
空行后的是触发器,把前边的注释起来,use test别注释,要用这个数据库
这里写图片描述
完成后重新导入数据库> mysql < test.sql
这里写图片描述
查看触发器>SHOW TRIGGERS FROM test;
这里写图片描述

6. 编写 gearman 的 worker 端(host7)

ps ax

把准备好的 worker.php复制到/usr/local/

 cp worker.php /usr/local/
 vim  /usr/local/worker.php

这里写图片描述

指定redis服务器ip
这里写图片描述
完成后,打入后台运行 ,疑似卡住,回车即可

nohup  nohup  php /usr/local/worker.php  &

这里写图片描述

ps ax查看下进程
这里写图片描述

终于搞定了,浏览器查看

http://172.25.254.7/test.php

这里写图片描述

进入数据库更改下

mysql> update test.test set name='redhat' where id='1';

这里写图片描述
host5的redis缓存也会更新
这里写图片描述

mysql> update test.test set name='redhat' where id='1';

这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值