redis-cluster集群和redis做mysql缓存

一、redis集群

/etc/init.d/redis_6379 stop ###把之前的redis关掉

cd /usr/local/
mkdir cluster   ##建立集群目录
cd cluster/
mkdir 7001      ##建立集群节点
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
mkdir 7006
cd  /root/redis-4.0.8src/
cp redis-trib.rb /usr/local/bin/  ###键和这个脚本复制到/etc/local/bin下
cd /usr/local/bin/  ##切到此目录
ls   ##查看是否完成复制
cdedis-trib.rb  执行命令,会报错**
**解决其需要的依赖性**
yum install libyaml-0.1.3-4.el6_6.x86_64.rpm ruby-2.2.3-1.el6.x86_64.rpm -y
gem install --local redis-4.0.1.gem 
gem list --local  ###做完上述步骤,列出本地gem,发现会有东西

这里写图片描述
编辑集群节点的配置文件

cd /usr/local/cluster/7001/
vim redis.conf 
port 7001
cluster-enabled yes   ###打开集群设置
cluster-config-file nodes.conf   
cluster-node-timeout 5000  ###延时时间
appendonly yes
daemonize yes
pidfile /usr/local/cluster/7001/redis.pid   ##pid文件存放目录
logfile /usr/local/cluster/7001/redis.log   ##日志存放目录
redis-server redis.conf  ###打开集群服务

cat redis.log ###查看日志,会有警告
cat /proc/sys/net/core/somaxconn ##查看这个文件数字,按照提示修改

echo 511 > /proc/sys/net/core/somaxconn
sysctl -w vm.overcommit_memory=1
vim /etc/sysctl.conf  ##编辑配置文件
写入:vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled   

redis-server redis.conf ###打开集群
cat redis.log ###再次查看日志,警告也没有了
将之前配置好的配置文件复制到其他节点

cp redis.conf ../7002/
cp redis.conf ../7003/
cp redis.conf ../7004/
cp redis.conf ../7005
cp redis.conf ../7006
cd ..
cd 7002/
vim redis.conf   ###将文件中的端口号改为7002和存放目录的更改
redis-server redis.conf    ###打开集群的redis
cd ..
cd 7003/
vim redis.conf  ###将文件中的端口号改为7003和存放目录的更改
redis-server redis.conf   ###打开集群的redis
cd ..
cd 7004/
vim redis.conf   ###将文件中的端口号改为7004和存放目录的更改
redis-server redis.conf    ###打开集群的redis
cd ..
cd 7005/
vim redis.conf   ###将文件中的端口号改为7005和存放目录的更改
redis-server redis.conf   ###打开集群的redis
cd ..
cd 7006/
vim redis.conf   ###将文件中的端口号改为7006和存放目录的更改
redis-server redis.conf    ###打开集群的redis

ps ax ##查看进程是否都打开了
netstat -antlp ##查看端口号是否开启
这里写图片描述
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 ###创建集群
这里写图片描述
这里写图片描述
redis-cli -c -p 7001
登录,set name xbw 写入内容,会提示写入内容传到2上
redis-cli -c -p 7002
输入info,发现2是master,他的slave是6
这里写图片描述
get name 可以查看到
redis-trib.rb check 127.0.0.1:7001 ##查看集群的状态
这里写图片描述
redis-cli -c -p 7006
get name 也能看到

ps ax
kill -9 4552  ###杀掉一个master
redis-cli -c -p 7006  ##登陆redis后,get还能看见之前存入的内容

这里写图片描述

ps ax
kill -9 4579   ##再杀掉slave
redis-cli -c -p 7001   ###登陆redis后,get就会显示cluster is down

这里写图片描述
关闭掉两个master后,集群的功能也会破坏
这里写图片描述

二、redis做mysql缓存

配置结构:
server1为lnmp架构
server2为redis
server3为mysql端
在server1中:

cd redis/
1.安装nginx和php
yum install -y 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

2.配置php

vim /etc/php.ini  ##更改它的时区
  946 date.timezone =Asia/Shanghai
id nginx   ###查看nginx用户是否建立
cd /etc/php-fpm.d/
vim www.conf  ##将39行和41行改为nginx
    39 user = nginx
    40 ; RPM: Keep a group allowed to write in log dir.
    41 group = nginx

这里写图片描述

/etc/init.d/php-fpm start
netstat -antlp

3.配置nginx
cd /etc/nginx/conf.d/
vim default.conf 编辑配置文件,要更改的行已列出

 8     location / {
  9         root   /usr/share/nginx/html;
 10         index  index.php index.html index.htm;
 11     }
 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_scrip    t_name;
 35         include        fastcgi_params;
 36     }

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

nginx -s reload   ###重新加载nginx
/etc/init.d/nginx start  ###打开nginx
cd /usr/share/nginx/html/
vim index.php   ###写一个php测试页面
<?php
phpinfo()
?>

在浏览器访问看能否看到php页面,172.25.3.1

cd /usr/share/nginx/html/
cd redis/ ###这里面有一个之前写好的test.php
cp test.php /usr/share/nginx/html/index.php ##将其复制到nginx的默认发布目录里
vim /usr/share/nginx/html/index.php
这里写图片描述

安装
cd ###切到root下
yum install unzip -y
unzip phpredis-master.zip
cd phpredis-master
phpize  ##创建新的预编译
./configure  ##编译
make 
make install  ###安装
修改php配置:
cd /etc/php.d/
cp mysql.ini redis.ini   ##复制一个redis.ini文件出来
vim redis.ini   ##编辑redis.ini
更改内容为:
     extension=redis.so
/etc/init.d/php-fpm reload
php -m | grep redis   ###查看php扩展
cd /root/redis/
scp test.sql server3:  ###将写好的test.sql发到server3中,再到3中导入数据库

这里写图片描述
test.sql内容为:

use test;
CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');

#DELIMITER $$
#CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
#    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
#  END$$
#DELIMITER ;

这里写图片描述
在server2中:
将reids配置文件里,之前的slaveof 172.25.3.1 6379 行注释掉
这里写图片描述
让server2的redis成为master,可以用redis-cli登陆,info查看是否变为master

在server3中:

yum install -y mysql-server  ##安装系统自带的mysql
/etc/init.d/mysqld start   ##打开数据库
[root@server3 ~]# mysql    ###登陆
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+

mysql> grant all on test.* to redis@'%' identified by 'westos';
###进行远程登录用户授权
[root@server3 ~]# vim test.sql   ##查看下内容
[root@server3 ~]# mysql < test.sql  ##导入数据库
[root@server3 ~]# mysql
mysql> use test;
mysql> select * from test;   ##发现导入成功

这里写图片描述
测试:在浏览器访问172.25.3.1可以看到数据
这里写图片描述
在server2中redis里查看,也会看见:
这里写图片描述

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

三、配置 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 数据库的更新。

在server1中:

[root@server1 ~]# cd redis/
[root@server1 redis]# 
yum install -y gearmand-1.1.8-2.el6.x86_64.rpm 
 libgearman-devel-1.1.8-2.el6.x86_64.rpm
 libgearman-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
[root@server1 local]# /etc/init.d/gearmand start
Starting gearmand:                                         [  OK  ]
[root@server1 redis]# scp gearman-mysql-udf-0.6.tar.gz server3:   
[root@server1 redis]# scp lib_mysqludf_json-master.zip server3:
[root@server1 redis]# scp libgearman-* server3:    
[root@server1 redis]# scp libevent-* server3:
[root@server1 redis]# cp worker.php /usr/local/
[root@server1 redis]# tar zxf gearman-1.1.2.tgz
[root@server1 redis]# cd gearman-1.1.2
[root@server1 gearman-1.1.2]# phpize 
[root@server1 gearman-1.1.2]# make && make install
[root@server1 gearman-1.1.2]# cd /etc/php.d/
[root@server1 php.d]# cp redis.ini gearman.ini
[root@server1 php.d]# vim gearman.ini
            写入:     extension=gearman.so

这里写图片描述

[root@server1 php.d]# /etc/init.d/php-fpm reload    
##重新加载php配置
[root@server1 php.d]# php -m | grep gearman       
##查看php扩展
gearman
[root@server1 php.d]# cd /usr/local/
[root@server1 local]# vim worker.php 

编写 gearman 的 worker 端:

<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');

$redis = new Redis();
$redis->connect('172.25.3.2', 6379);

while($worker->work());
function syncToRedis($job)
{
        global $redis;
        $workString = $job->workload();
        $work = json_decode($workString);
        if(!isset($work->id)){
                return false;
        }
        $redis->set($work->id, $work->name);
}
?>

这里写图片描述

[root@server1 local]# nohup php /usr/local/worker.php &  
 ###在后台运行worker.php
[root@server1 local]# netstat -antlp   ###查看端口是否打开

在server3中:

[root@server3 ~]# yum install -y unzip
[root@server3 ~]# unzip lib_mysqludf_json-master.zip
[root@server3 ~]# cd lib_mysqludf_json-master
ls  ##会看见一些的文件,最主要要有lib_mysqludf_json.so
yum install -y gcc mysql-devel 
要执下面这个命令,首先解决gcc,mysql-devel 这两个软件依赖性
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。
通常,数据库中的数据映
射为 JSON 格式,是通过程序来转换的。
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
拷贝 lib_mysqludf_json.so 模块
 cd /usr/lib64/mysql/plugin
[root@server3 plugin]# mysql  登陆数据库
mysql> show global variables like 'plugin_dir';
查看 mysql 的模块目录:
+---------------+-------------------------+
| Variable_name | Value                   |
+---------------+-------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin |
+---------------+-------------------------+
注册 UDF 函数:
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME
    -> 'lib_mysqludf_json.so';
4. 安装 gearman-mysql-udf
这个插件是用来管理调用 Gearman 的分布式的队列。
cd  /root
[root@server3 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz 
yum install -y libgearman-* libevent-*  
[root@server3 ~]# cd gearman-mysql-udf-0.6
 ./configure --libdir=/usr/lib64/mysql/plugin/ 
 ###进行源码编译
 make && make install   ###安装
[root@server3 ~]# mysql
注册 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;
####查看函数
mysql> SELECT gman_servers_set('172.25.3.1:4730');
###指定 gearman 的服务信息

这里写图片描述
[root@server3 ~]# mysql < test.sql
这里test.sql要做点改变,将2,3行注释,5,6,7,8,9注释去掉
这里写图片描述
[root@server3 ~]# mysql
mysql> SHOW TRIGGERS FROM test; ###查看触发器
这里写图片描述
进行数据库内容更新

mysql> use test
Database changed
mysql> update test set name='westos'; ###将名字更新为westos
mysql> update test set name='xbw';

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

猜你喜欢

转载自blog.csdn.net/xbw_linux123/article/details/81612535