redis实现主从复制和集群、利用Gearman进行Mysql到Redis的复制

一、redis主从复制
1、安装服务与配置
server1、2、3:

解压redis安装包
get redis-4.0.8.tar.gz
tar zxf redis-4.0.8.tar.gz
cd  redis-4.0.8
yum install gcc -y
开始编译
[root@server1 redis-4.0.8]# make 
[root@server1 redis-4.0.8]# make install
[root@server1 redis-4.0.8]# which redis-cli
/usr/local/bin/redis-cli
执行redis脚本
[root@server1 redis-4.0.8]# cd utils/
[root@server1 utils]# ./install_server.sh
Port           : 6379                        ##默认监听端口
Config file    : /etc/redis/6379.conf        ##默认配置文件
Log file       : /var/log/redis_6379.log     ##默认日志文件
Data dir       : /var/lib/redis/6379         ##默认数据目录
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
查看端口
[root@server1 utils]# netstat -antlp
tcp        0      0 127.0.0.1:6379              0.0.0.0:*                   LISTEN      8137/redis-server 1 
[root@server1 utils]# vim /etc/redis/6379.conf 
  70 bind 0.0.0.0
[root@server1 utils]# /etc/init.d/redis_6379 restart
[root@server1 utils]# netstat -antlp
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      8150/redis-server 0 

二、redis实现主从复制

检测:
server1:

[root@server1 utils]# cd
[root@server1 ~]# cd redis-4.0.8
[root@server1 redis-4.0.8]# redis-cli
127.0.0.1:6379> set name wxj
OK
127.0.0.1:6379> get name
"wxj"
127.0.0.1:6379> set user1 123
OK
127.0.0.1:6379> get user1
"123"
127.0.0.1:6379> del user1
(integer) 1
127.0.0.1:6379> get user1
(nil)
127.0.0.1:6379> get name
"wxj"
127.0.0.1:6379> set name haha
OK
127.0.0.1:6379> get name
"haha"

server2:

编辑配置文件
[root@server2 utils]# cd /etc/redis/
[root@server2 redis]# vim 6379.conf 
 283 slaveof 172.25.10.1 6379 
[root@server2 utils]# /etc/init.d/redis_6379 restart
查看是否同步
[root@server2 redis-4.0.8]# redis-cli
127.0.0.1:6379> get name
"haha"

三、redis集群1
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
 17 protected-mode no  ##注释打开
 69 sentinel monitor mymaster 172.25.61.1 6379 2    # 这个主服务器的 IP 地址为 172.25.61.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)
将配置文件发送至server2、3:
[root@server1 redis]# scp sentinel.conf server2:/etc/redis/
[root@server1 redis]# scp sentinel.conf server3:/etc/redis/

3台主机监控

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

打开另一个shell连接server1:

[root@server1 ~]# redis-cli
127.0.0.1:6379> info
# Replication      ##可以看到本机为master,2和3为slave
role:master
connected_slaves:2
slave0:ip=172.25.61.2,port=6379,state=online,offset=18147,lag=1
slave1:ip=172.25.61.3,port=6379,state=online,offset=18147,lag=1
127.0.0.1:6379> SHUTDOWN
30s之后在监控页面可以看到关闭信息
5986:X 11 Aug 21:26:15.268 # +sdown master mymaster 172.25.61.1 6379
5986:X 11 Aug 21:26:15.330 # +odown master mymaster 172.25.61.1 6379 #quorum 3/2
随即打开/etc/init.d/redis_6379 start     ##注:必须在等待30s后在监控界面查看到关闭信息才打开服务
关闭之后可以在3台主机的监控中看到:
切换为server2master
5986:X 11 Aug 21:26:16.788 * +slave slave 172.25.61.3:6379 172.25.61.3 6379 @ mymaster 172.25.61.2 6379
5986:X 11 Aug 21:26:16.788 * +slave slave 172.25.61.1:6379 172.25.61.1 6379 @ mymaster 172.25.61.2 6379
此时可在另一个shell中连接server2查看
# Replication
role:master
connected_slaves:2
slave0:ip=172.25.61.3,port=6379,state=online,offset=43035,lag=0
slave1:ip=172.25.61.1,port=6379,state=online,offset=43035,lag=0

四、reids集群2

创建集群
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             ##后面将配置文件分别发送至7002~6时需修改文件中的3个“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   # 节点的日志文件所在位置
将集群化工具的运行脚本放在系统第三方软件目录中
[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/
执行redis-trib.rb会出现依赖性的错误,解决依赖性:
[root@server1 src]# cd /usr/local/bin/
[root@server1 bin]# yum install -y ruby
[root@server1 ~]# yum install ruby-2.2.3-1.el6.x86_64.rpm  libyaml-0.1.3-4.el6_6.x86_64.rpm -y
gem编译
[root@server1 ~]# gem install --local redis-4.0.1.gem 
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 1 seconds
1 gem installed
查看集群化工具是否安装完成
[root@server1 ~]# gem list --local
*** LOCAL GEMS ***

bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
redis (4.0.1)
test-unit (3.0.8)
查看
[root@server1 ~]# redis-trib.rb 
将redis关闭
[root@server1 ~]# /etc/init.d/redis_6379 stop
将redis-server *:7001 打开
[root@server1 7001]# redis-server redis.conf
查看日志,发现有报错
[root@server1 7001]# cat redis.log 
解决方法:
[root@server1 7001]# cat /proc/sys/net/core/somaxconn
128
[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 
最后写
vm.overcommit_memory = 1
[root@server1 7001]# echo never > /sys/kernel/mm/transparent_hugepage/enabled 
将配置文件发送至70026
[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  ../700670026目录中修改3个数字,然后启动服务
[root@server1 7001]# cd ..
[root@server1 cluster]# cd 7002/
[root@server1 7002]# vim redis.conf 
[root@server1 7002]# redis-server redis.conf

查看进程

ps ax

这里写图片描述
查看端口

netstat -antlp

这里写图片描述
创建集群,查看6个进程的主从关系

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 cluster]# cd 7004/
[root@server1 7004]# redis-cli -c -p 7004
127.0.0.1:7001>info

五、实现数据库,php,nginx和redis的架构

实验环境:将上个实验的进程关闭
server1:

安装nginx和php
[root@server1 ~]# yum install nginx-1.8.0-1.el6.ngx.x86_64.rpm php-* -y
设置时区
[root@server1 ~]# vim /etc/php.ini 
 946 date.timezone = Asia/Shanghai
查看nginx id
[root@server1 php.d]# id nginx
uid=498(nginx) gid=499(nginx) groups=499(nginx)
修改php配置文件
[root@server1 php.d]# cd /etc/php-fpm.d/
[root@server1 php-fpm.d]# vim www.conf 
 39 user = nginx
 41 group = nginx
打开php服务
[root@server1 php-fpm.d]# /etc/init.d/php-fpm start
查看php端口
netstat -antlp
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      5148/php-fpm
编辑nginx配置文件
[root@server1 php-fpm.d]# cd /etc/nginx/conf.d/
[root@server1 conf.d]# vim default.conf 
 10         index  index.php index.html index.htm;
 34         fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
 打开nginx服务
[root@server1 conf.d]# /etc/init.d/nginx start
查看nginx端口
 netstat -antlp
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      5165/nginx 
设置nginx默认发布目录
[root@server1 conf.d]# cd /usr/share/nginx/html/
[root@server1 html]# vim index.php
<?
phpinfo()
?>

检测:

浏览器访问172.25.10.1

这里写图片描述

server1:

test.php脚本内容:
<?php
        $redis = new Redis();
        $redis->connect('172.25.10.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.10.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 ~]# cp test.php /usr/share/nginx/html/index.php 
查看php有mysql模块
[root@server1 ~]# php -m
mysql
mysqli
解压php-master包
[root@server1 ~]# yum install unzip
[root@server1 ~]# unzip phpredis-master.zip 
[root@server1 ~]# cd phpredis-master
创造预编译环境
[root@server1 phpredis-master]# phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
开始编译
[root@server1 phpredis-master]# ./configure
[root@server1 phpredis-master]# make
[root@server1 phpredis-master]# make install
php添加redis模块
[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
[root@server1 ~]# scp test.sql server3:
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 ;

server3:
实验环境:

关掉redis服务
/etc/init.d/redis_6379 stop
删除数据库
cd /var/lib/mysql
rm -fr *
rpm -e --nodeps `rpm -qa|grep mysql`
安装6.5系统自带的mysql
yum install -y mysql-server
/etc/init.d/mysqld start
[root@server3 ~]# mysql -p
mysql> show databases;
mysql> grant all on test.* to redis@'%' identified by 'westos';
导入数据库内容
[root@server3 ~]# mysql < test.sql
查看
[root@server3 ~]# mysql -p
mysql> use test
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
|  3 | test3 |
|  4 | test4 |
|  5 | test5 |
|  6 | test6 |
|  7 | test7 |
|  8 | test8 |
|  9 | test9 |
+----+-------+

检测:
在浏览器处输入提供nginx服务和php服务的主句ip,因为redis里边没有数据缓存,所以得去后端服务器拿数据,刷新页面,会看到第二次是去redis中拿数据,同时我们在提供redis的主机中利用redis-cli命令行也可以看到数据(说明数据是真的存在了redis缓存中)

浏览器访问172.25.10.1 刷新一次

这里写图片描述
提供redis服务的server2中查看:

[root@server2 utils]# redis-cli 
127.0.0.1:6379> get 1
"test1"
127.0.0.1:6379> get 2
"test2"

六、利用Gearman进行Mysql到Redis的同步复制
server1:

安装geaemand服务和依赖性
[root@server1 ~]# yum install -y gearmand-1.1.8-2.el6.x86_64.rpm libgearman-* libevent-*
打开服务
[root@server1 ~]# /etc/init.d/gearmand start
查看端口
[root@server1 ~]# netstat -antlp
    7563/gearmand       
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN  
[root@server1 ~]# scp gearman-mysql-udf-0.6.tar.gz server3:
[root@server1 ~]# scp lib_mysqludf_json-master.zip server3:
[root@server1 ~]# scp libgearman-* server3:
[root@server1 ~]# scp libevent-* server3:

server3:

安装把mysql关系型数据转换成json格式的UDF工具—lib_mysqludf_json-master
(mysql里的数据格式转成json格式,通常使用php的json扩展实现。如果使用udf,会有更快的速度。)
[root@server3 ~]# yum install unzip -y
[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
[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 
-rwxr-xr-x 1 root root 22223 Aug 12 14:29 lib_mysqludf_json.so
拷贝 lib_mysqludf_json.so 模块到数据库的插件目录中
[root@server3 lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
[root@server3 lib_mysqludf_json-master]# cd /usr/lib64/mysql/plugin
[root@server3 plugin]# ll
-rwxr-xr-x 1 root root   22223 Aug 12 14:32 lib_mysqludf_json.so
[root@server3 plugin]# mysql -p
查看 mysql 的模块目录
mysql> show global variables like 'plugin_dir';
+---------------+-------------------------+
| Variable_name | Value                   |
+---------------+-------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin |
+---------------+-------------------------+
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME
    -> 'lib_mysqludf_json.so';
安装 gearman-mysql-udf
这个插件是用来管理调用 Gearman 的分布式的队列。
[root@server3 plugin]# cd
[root@server3 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz
解决依赖性
[root@server3 ~]# yum install -y libgearman-* libevent-* 
开始编译
[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
[root@server3 gearman-mysql-udf-0.6]# make install
[root@server3 gearman-mysql-udf-0.6]# cd /usr/lib64/mysql/plugin/
[root@server3 plugin]# ll
-rwxr-xr-x 1 root root  114597 Aug 12 14:37 libgearman_mysql_udf.so.0.0.0
[root@server3 plugin]# mysql -p
注册 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;
+--------------------+-----+-------------------------+----------+
| name               | ret | dl                      | type     |
+--------------------+-----+-------------------------+----------+
| json_object        |   0 | lib_mysqludf_json.so    | function |
| gman_do_background |   0 | libgearman_mysql_udf.so | function |
| gman_servers_set   |   0 | libgearman_mysql_udf.so | function |
+--------------------+-----+-------------------------+----------+
指定 gearman 的服务信息
mysql> SELECT gman_servers_set('172.25.10.1:4730');
+--------------------------------------+
| gman_servers_set('172.25.10.1:4730') |
+--------------------------------------+
| 172.25.10.1:4730                     |
+--------------------------------------+
编写 mysql 触发器(根据实际情况编写)
什么是触发器: 触发器(trigger)是SQL server
提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是
由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insertdeleteupdate)时
就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等
[root@server3 ~]# vim 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 ;
将触发器程序再次导入数据库
[root@server3 ~]# mysql < test.sql
[root@server3 ~]# mysql
查看触发器
mysql> SHOW TRIGGERS FROM test;
--------+--------+---------+----------+----------------+-----------------+----------------------+--------------------+
| datatoredis | UPDATE | test  | BEGIN
    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`)); 
  END | AFTER  | NULL    |          | root@localhost | latin1               | latin1_swedish_ci    | latin1_swedish_ci  |
+-------------+--------+-------+---------------------------------------------------------------------

server1:

解压gearman包
[root@server1 ~]# cp worker.php /usr/local/
[root@server1 ~]# tar zxf gearman-1.1.2.tgz 
[root@server1 ~]# cd gearman-1.1.2
[root@server1 gearman-1.1.2]# phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
开始编译
[root@server1 gearman-1.1.2]# ./configure
[root@server1 gearman-1.1.2]# make
[root@server1 gearman-1.1.2]# make install
[root@server1 gearman-1.1.2]# cd /usr/lib64/php/modules/
[root@server1 modules]# ll gearman.so 
-rwxr-xr-x 1 root root 280170 Aug 12 14:46 gearman.so
在php中添加gearman模块
[root@server1 modules]# 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
编写 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('172.25.10.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 &
[1] 9919
[root@server1 local]# nohup: ignoring input and appending output to `nohup.out'
[root@server1 local]# ps ax
 9919 pts/0    S      0:00 php /usr/local/worker.php

server3:

mysql> use test
mysql> update test set name='redhat';

检测:

浏览器访问172.25.10.1

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值