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
写一个默认页
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 扩展
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';