Redis 的主从缓存,作 mysql 的缓存服务器

redis主从缓存

【server1】【server2】【server3】下载并编译安装包

[root@server1 ~]# /etc/init.d/mysqld stop
[root@server1 ~]# tar zxf redis-4.0.8.tar.gz 
[root@server1 ~]# cd redis-4.0.8
[root@server1 redis-4.0.8]# yum install -y gcc
[root@server1 redis-4.0.8]# make && make install
[root@server1 redis-4.0.8]# cd utils/
[root@server1 utils]# ./install_server.sh 

这里写图片描述

【server1】

[root@server1 utils]# vim /etc/redis/6379.conf 
  70 bind 0.0.0.0
[root@server1 utils]# /etc/init.d/redis_6379 stop
[root@server1 utils]# /etc/init.d/redis_6379 start
[root@server1 utils]# netstat -antlp

这里写图片描述

【server2】

[root@server2 utils]# vim /etc/redis/6379.conf
        70 bind 0.0.0.0
  加入  282 slaveof 172.25.40.1 6379
[root@server2 utils]# /etc/init.d/redis_6379 restart

测试:在主端更改名字在从端测试
【server1】

[root@server1 ~]# redis-cli 
127.0.0.1:6379> set name westos
OK

【server2】可以查看到在主端写入的信息
这里写图片描述

【server3】

[root@server3 utils]# vim /etc/redis/6379.conf
        70 bind 0.0.0.0
  加入  282 slaveof 172.25.40.1 6379
[root@server3 utils]# /etc/init.d/redis_6379 restart
[root@server3 utils]# cd
[root@server3 ~]# redis-cli
127.0.0.1:6379> get name
"westos"

这里写图片描述
可以看到在server3上也可以看到server1同步的信息。

[root@server1 ~]# cd redis-4.0.8
[root@server1 redis-4.0.8]# cp sentinel.conf /etc/redis/
[root@server1 redis-4.0.8]# cd /etc/redis/
[root@server1 redis]# vim sentinel.conf 
 15  bind 0.0.0.0
 16  protected-mode no
 68 sentinel monitor mymaster 172.25.40.1 6379 2
 97 sentinel down-after-milliseconds mymaster 10000
[root@server1 redis]# scp sentinel.conf server2:/etc/redis
[root@server1 redis]# scp sentinel.conf server3:/etc/redis
[root@server1 redis]# redis-server /etc/redis/sentinel.conf --sentinel  #监控

这里写图片描述
这里写图片描述
再次连接一个server1,将server1关闭

[root@server1 redis]# redis-cli
127.0.0.1:6379> shutdown
not connected> quit

监控server1

[root@server1 redis]# redis-server /etc/redis/sentinel.conf --sentinel  #监控

【server3】上查看master是否有跳转

[root@server3 ~]# redis-cli
127.0.0.1:6379> info

这里写图片描述


redis集群:

[root@server1 ~]# cd /usr/local/
[root@server1 local]# mkdir cluster
[root@server1 local]# cd cluster/
[root@server1 cluster]# mkdir 7001
[root@server1 cluster]# mkdir 7002
[root@server1 cluster]# mkdir 7003
[root@server1 cluster]# mkdir 7004
[root@server1 cluster]# mkdir 7005
[root@server1 cluster]# mkdir 7006
[root@server1 cluster]# cd 7001
[root@server1 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
    logfile /usr/local/cluster/7001/redis.log
[root@server1 7001]# cd ..
[root@server1 cluster]# ls
7001  7002  7003  7004  7005  7006
[root@server1 cluster]# cd
[root@server1 ~]# cd redis-4.0.8
[root@server1 redis-4.0.8]# cd src
[root@server1 src]# cp redis-trib.rb /usr/local/bin
[root@server1 ~]# yum install -y ruby-2.2.3-1.el6.x86_64.rpm
 libyaml-0.1.3-4.el6_6.x86_64.rpm
[root@server1 ~]# gem install --local redis-4.0.1.gem
[root@server1 ~]# redis-trib.rb --help

这里写图片描述

[root@server1 ~]# /etc/init.d/redis_6379 stop
[root@server1 ~]# chkconfig redis_6379 off
[root@server1 ~]# cd /usr/local/cluster/
[root@server1 cluster]# ls
[root@server1 cluster]# cd 7001/
[root@server1 7001]# redis.server redis.conf
[root@server1 7001]# ps ax

这里写图片描述

[root@server1 7001]# cat redis.log

这里写图片描述

[root@server1 7001]# echo 511 > /proc/sys/net/core/somaxconn
[root@server1 7001]# sysctl -w vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@server1 7001]# vim /etc/sysctl.conf 
     42 vm.overcommit_memory = 1
[root@server1 7001]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@server1 7001]# cp redis.conf ../7002
[root@server1 7001]# cp redis.conf ../7003
[root@server1 7001]# cp redis.conf ../7004
[root@server1 7001]# cp redis.conf ../7005
[root@server1 7001]# cp redis.conf ../7006
[root@server1 7001]# cd ..

更改7001-7006文件
7002:
这里写图片描述
[root@server1 7002]# redis-server redis.conf
7003:
这里写图片描述
[root@server1 7003]# redis-server redis.conf
7004:
这里写图片描述
[root@server1 7004]# redis-server redis.conf
7005:
这里写图片描述
[root@server1 7005]# redis-server redis.conf
7006:
这里写图片描述
[root@server1 7006]# redis-server redis.conf

[root@server1 ~]# ps ax

这里写图片描述

[root@server1 ~]# netstat -antlp

这里写图片描述

[root@server1 ~]# 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

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

[root@server1 ~]# redis-trib.rb check 127.0.0.1:7001   #一个master对应一个slave

这里写图片描述

测试:

[root@server1 ~]# redis-cli -c -p -h 7001

这里写图片描述

[root@server1 ~]# redis-cli -c -p 7003   #在7003上查看信息

这里写图片描述
查看master和slave信息:
7001,7002,7003为master。7004,7005,7006为slave。

[root@server1 ~]# redis-trib.rb check 127.0.0.1:7001

这里写图片描述

[root@server1 ~]# ps ax
 1541 ?        Ssl    0:02 redis-server *:7001 [cluster]
[root@server1 ~]# kill -9 1541    #关闭7001进程
[root@server1 ~]# redis-cli -c -p 7001     #7001已经被拒绝
Could not connect to Redis at 127.0.0.1:7001: Connection refused
Could not connect to Redis at 127.0.0.1:7001: Connection refused
not connected> quit
[root@server1 ~]# redis-cli -c -p 7003

这里写图片描述

[root@server1 ~]# redis-trib.rb check 127.0.0.1:7002

这里写图片描述

将7001开启:

[root@server1 ~]# cd /usr/local/cluster/
[root@server1 cluster]# cd 7001
[root@server1 7001]# redis-server redis.conf

关闭两个master:

[root@server1 ~]# ps ax
 1580 ?        Ssl    0:02 redis-server *:7003 [cluster]
 1585 ?        Ssl    0:02 redis-server *:7002 [cluster]
[root@server1 ~]# kill -9 1580
[root@server1 ~]# kill -9 1585
[root@server1 ~]# redis-trib.rb check 127.0.0.1:7006
##master已经转换到了7004和7006上

这里写图片描述


Redis 作 mysql 的缓存服务器

配置并启动服务

[root@server1 ~]# rm -fr *
[root@server1 redis]# yum install -y nginx-1.8.0-1.el6.ngx.x86_64.rpm php-*
[root@server1 redis]# vim /etc/php.ini 
 946 date.timezone =Asia/Shanghai
[root@server1 redis]# cd /etc/php.d
[root@server1 php.d]# id nginx
uid=498(nginx) gid=499(nginx) groups=499(nginx)
[root@server1 php.d]# cd /etc/php-fpm.d/
[root@server1 php-fpm.d]# vim www.conf
 39 user = nginx
 41 group = nginx
[root@server1 php-fpm.d]# /etc/init.d/php-fpm start
[root@server1 php-fpm.d]# cd /etc/nginx/
[root@server1 nginx]# cd conf.d/
[root@server1 conf.d]# vim default.conf 
 10         index  index.php index.html index.htm;
.......
 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    }
[root@server1 conf.d]# /etc/init.d/nginx start
[root@server1 conf.d]# netstat -antlp

这里写图片描述

[root@server1 conf.d]# cd /usr/share/nginx/html
[root@server1 html]# vim index.php
    <?php
    phpinfo()
    ?>

这里写图片描述

[root@server1 redis]# cp test.php /usr/share/nginx/html/index.php
cp: overwrite `/usr/share/nginx/html/index.php'? y
[root@server1 redis]# cd /usr/share/nginx/html/index.php
[root@server1 redis]# vim /usr/share/nginx/html/index.php
<?php
        $redis = new Redis();
        $redis->connect('172.25.40.2',6379) or die ("could net connect redis server");
  #      $query = "select * from test limit 9";
        $query = "select * from test";
        for ($key = 1; $key < 10; $key++)
        {
                if (!$redis->get($key))
                {
                        $connect = mysql_connect('172.25.40.3','redis','westos');
                        mysql_select_db(test);
                        $result = mysql_query($query);
                        //如果没有找到$key,就将该查询sql的结果缓存到redis
                        while ($row = mysql_fetch_assoc($result))
                        {
                                $redis->set($row['id'],$row['name']);
                        }
                        $myserver = 'mysql';
                        break;
                }
                else
                {
                        $myserver = "redis";
                        $data[$key] = $redis->get($key);
                }
        }

        echo $myserver;
        echo "<br>";
        for ($key = 1; $key < 10; $key++)
        {
                echo "number is <b><font color=#FF0000>$key</font></b>";

                echo "<br>";

                echo "name is <b><font color=#FF0000>$data[$key]</font></b>";

                echo "<br>";
        }
?>
[root@server1 redis]# yum install -y unzip
[root@server1 redis]# unzip phpredis-master.zip
[root@server1 redis]# cd phpredis-master
[root@server1 phpredis-master]# phpize

这里写图片描述

[root@server1 phpredis-master]# ./configure
[root@server1 phpredis-master]# make
[root@server1 phpredis-master]# make install
[root@server1 phpredis-master]# cd /usr/lib64/php/modules/
[root@server1 modules]# cd /etc/php.d/
[root@server1 php.d]# cp mysql.ini redis.ini
[root@server1 php.d]# vim redis.ini 
    extension=redis.so
[root@server1 php.d]# /etc/init.d/php-fpm reload
[root@server1 php.d]# php -m |grep redis
redis

【server3】

[root@server3 ~]# /etc/init.d/redis_6379 stop
[root@server3 ~]# cd /var/lib/mysql
[root@server3 mysql]# rm -fr *
[root@server3 ~]# rpm -qa|grep mysql

这里写图片描述

[root@server3 ~]# rpm -e --nodeps `rpm -qa|grep mysql`
[root@server3 ~]# yum install -y mysql-server
[root@server3 ~]# /etc/init.d/mysqld start
[root@server3 ~]# mysql -p
mysql> show databases;
mysql> grant all on test.* to redis@'%' identified by 'westos';
mysql> use test
mysql> select * from test;

测试:
这里写图片描述
刷新一次:变为redis
这里写图片描述
更改数据库信息后,在网页查看信息

mysql> use test
mysql> update test set name='westos' where id=1;

发现数据没有更改
这里写图片描述


Gearman 完成 redis 数据库的更新

1. 安装 gearman 软件包:

[root@server1 redis]# yum install -y gearmand-1.1.8-2.el6.x86_64.rpm libgearman-* libevent-*
[root@server1 redis]# /etc/init.d/gearmand start
[root@server1 redis]# scp gearman-mysql-udf-0.6.tar.gz server3:
[root@server1 redis]# scp lib_mysqludf_json-master.zip server3:

2. 安装 php 的 gearman 扩展

【server3】

[root@server3 ~]# ls
    gearman-mysql-udf-0.6.tar.gz  redis-4.0.8         test.sql
    lib_mysqludf_json-master.zip  redis-4.0.8.tar.gz
[root@server3 ~]# yum install -y unzip
[root@server3 ~]# unzip lib_mysqludf_json-master.zip 
[root@server3 ~]# cd lib_mysqludf_json-master
[root@server3 lib_mysqludf_json-master]# yum install -y gcc mysql-devel

3. 安装 lib_mysqludf_json

[root@server3 ~]# cd lib_mysqludf_json-master
[root@server3 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
[root@server3 lib_mysqludf_json-master]# ll lib_mysqludf_json.so
[root@server3 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/      #拷贝 lib_mysqludf_json.so 模块

查看 mysql 的模块目录:

mysql> show global variables like 'plugin_dir';    #查看模块目录
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';     #注册 UDF 函数
mysql> select * from mysql.func;  #查看函数

这里写图片描述

4. 安装 gearman-mysql-udf

这个插件是用来管理调用 Gearman 的分布式的队列

这里写图片描述

[root@server3 ~]# yum install -y libevent-* libgearman-*
[root@server3 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz 
[root@server3 ~]# cd gearman-mysql-udf-0.6
[root@server3 gearman-mysql-udf-0.6]# ./configure --libdir=/usr/lib64/mysql/plugin/
[root@server3 gearman-mysql-udf-0.6]# make && make install

注册 UDF 函数

[root@server3 plugin]# mysql -p
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.40.1:4730');   #指定 gearman 的服务信息

这里写图片描述

5. 编写 mysql 触发器

[root@server3 ~]# vim test.sql 
use test;
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 ;

这里写图片描述
【server1】

[root@server1 ~]# cd redis/
[root@server1 redis]# ll worker.php
[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]# ./configure && make && make install
[root@server1 ~]# 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
[root@server1 php.d]# php -m | grep gearman
gearman

6. 编写 gearman 的 worker 端

[root@server1 php.d]# cd /usr/local/
[root@server1 local]# vim worker.php 
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');

$redis = new Redis();
$redis->connect('72.25.40.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);
}
?>

后台运行 worker

[root@server1 local]# nohup php worker.php &

这里写图片描述

7. 更新 mysql 中的数据

【server3】

[root@server3 ~]# mysql -p
mysql> use test
mysql> update test set name='westos';

刷新测试页面数据同步
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值