基于redis的数据库的复制

redis与数据库结合,作为数据库数据的缓存提供给前端

整体思想是:客户端通过nginx和php访问后端数据库时,先在redis这个数据库缓存中查找,看是否含有想要的数据,如果没有就去后端数据库查找, 将查找到数据返回给客户端一份,另外在redis中缓存一份….下次如果访问相同的数据就直接去redis,缩短时间同时也减轻数据库的查找压力
在server1,2里面下载redis
在sever1里面做
/etc/init.d/mysqld  stop
tar  zxf     redis-4.0.8.tar.gz   ###得到一个redis的包
ls
cd  redis-4.0.8
ls


yum  instal   -  gcc
make  &&  make  install
cd   utils/
./install_server.sh


redis-cli
info    #观察信息
netstat  -antlupe    ##产看端口号,6379并没有运行到我们想要的端口上,我们要去改配置文件


cd  /etc/redis/
ls
vim   6379.conf
bind   0.0.0.0    ##将bind设置为本机所有接口


/etc/init.d/redis_6379  restart


netstat  -antlupe   ##产看端口   ###此时应该设置好了
redis-cli
set  name  wubian
get name     ##会有所显示


在sever2里面做
/etc/init.d/mysqld  stop
tar  zxf     redis-4.0.8.tar.gz   ###得到一个redis的包
ls
cd  redis-4.0.8
ls


yum  instal   -  gcc
make  &&  make  install
cd   utils/


./install_server.sh  ###直接回车,这都是文件目录


redis-cli
info    #观察信息
netstat  -antlupe    ##产看端口号,6379并没有运行到我们想要的端口上,我们要去改配置文件
cd  /etc/redis/
ls
vim   6379.conf
bind   0.0.0.0    ##将bind设置为本机所有接口
slaveof  172.25.17.1  6379   ###设置他为172.25.17.1的从slave


/etc/init.d/redis_6379  restart
netstat  -antlupe   ##产看端口   ###此时应该设置好了


redis-cli
get  name    ##可以看见同步过来了


在sever3里面做
/etc/init.d/mysqld  stop
tar  zxf     redis-4.0.8.tar.gz   ###得到一个redis的包
ls
cd  redis-4.0.8
ls
yum  instal   -  gcc


make  &&  make  install
cd   utils/
./install_server.sh  ###直接回车,这都是文件目录的设定,采用默认即可


redis-cli
info    #观察信息
netstat  -antlupe    ##产看端口号,6379并没有运行到我们想要的端口上,我们要去改配置文件
cd  /etc/redis/
ls
vim   6379.conf
bind   0.0.0.0    ##将bind设置为本机所有接口
slaveof  172.25.17.1  6379   ###设置他为172.25.17.1的从slave


/etc/init.d/redis_6379  restart
netstat  -antlupe   ##产看端口   ###此时应该设置好了


redis-cli
info     ###产看信息,查看主master是不是server1
get  name    ###产看信息有没有同步或来


在主master里面做
redis-cli
set  user  westos
get user     


###在slave里面做
redis-cli
get   user     ##产看信息有没有同步或来    ###但是不能删除信息,因为他是slave

####实现数据库的高可用
####在主master里面做
cd  /root/redis-4.0.8
ls
cp sentinel.conf  /etc/redis/
ls
cd   /etc/redis
ls  ##有两个文件   6379.conf  sentinel.conf
vim    sentinel.conf
###改正bind   0.0.0.0
protected-mode   no
port  26379


sentinel   monitor   mymaster   172.25.17.1  6379 2  ##填主master的ip,6379是端口号,2是他的slave数
sentinel  down-after-milliseconds  mymater   10000
sentinel  parallel-syncs   mymaster  1


scp    sentinel.conf   server2:/etc/redis/
scp    sentinel.conf   server3:/etc/redis/


redis-server  /etc/redis/sentinel.conf   --sentinel     ###观看情况


###在server2和server3里面也做同样的事情
redis-server  /etc/redis/sentinel.conf   --sentinel     ###观看情况此时的路径在/etc/redis里面
####另外开一个shell,进行连接,主要连接master
redis-cli  -p   6379
info
shutdown    ###让主master里面挂掉,然后在前端看谁变成master了

####服务器server2变成了master


####然后重启原来master
vim  /etc/redis/6379.conf
bind   0.0.0.0    ##将bind设置为本机所有接口
slaveof  172.25.17.2  6379   ###设置他为172.25.17.2的从slave


/etc/init.d/redis_6379  start
redis-cli
info   ###查看主信息,设否和自己设置的一样
get   user
get  name   ##信息是否能同步过来

####数据库的负载均衡集群
##首先停掉redis服务
在server1里面做
/etc/init.d/redis_6379   stop
ps  ax   ###查看后端进程
cd    /usr/local/
ls
mkdir   cluster
cd   cluster
mkdir   700{1..6}
ls
cd   7001
vim    redis.conf
里面写
port   7001
cluster-enabled  yes
cluster-config-file  nodes.conf
cluster-node-timeout   5000
appendonly  yes
daemonize   yes   ##打入后台


redis-server  redis.conf


ps  ax   ###显示有没有在后台运行


redis-cli  -p   7001
info   ###测试能不能进去
ls   ###此时有三个文件   appendonly.aof   nodes.conf  redis.conf
cp   redis.conf   ../7002
cp   redis.conf   ../7003
cp   redis.conf   ../7004
cp   redis.conf   ../7005
cp   redis.conf   ../7006
cd    ../7002
vim  redis.conf
port   7002    ##将端口号改为对应的号
redis-server  redis.conf    ##必须在这个文件下重启,否则就没有进程在跑
cd    ../7003
vim  redis.conf
port   7003    ##将端口号改为对应的号
redis-server  redis.conf    ##必须在这个文件下重启,否则就没有进程在跑
cd    ../7004
vim  redis.conf
port   7004    ##将端口号改为对应的号
redis-server  redis.conf    ##必须在这个文件下重启,否则就没有进程在跑
cd    ../7005
vim  redis.conf
port   7005    ##将端口号改为对应的号
redis-server  redis.conf    ##必须在这个文件下重启,否则就没有进程在跑
cd    ../7006
vim  redis.conf
port   7006    ##将端口号改为对应的号
redis-server  redis.conf    ##必须在这个文件下重启,否则就没有进程在跑
cd
cd    redis-4.0.8
cd   src
ls
cp   redis-trib.rb  /usr/local/bin  #加入环境变量
cd
redis-trib.rb   --help    ###直到他要ruby语言
yum   install  -y    ruby   rubygems
###还要需要别的包 rubygems,redis-4.0.1.gem
yum  install -y  rubygems-1.3.7.5.el6.noarch.rpm
gem   list  
gem   install  --local  redis-4.0.1.gem  ##此时回报错,要求ruby的版本大于2.2.2
rpm   -q   ruby     ##产看本机ruby的版本
###需要到官网下载ruby包和他的依赖性libyaml-0.1.3-4.el6_6.x86_64.rpm
yum  install  ruby-2.2.3-1.el6.x86_64.rpm  libyaml-0.1.3-4.el6_6.x86_64.rpm   -y
gem   install  --local  redis-4.0.1.gem


gem  list   ##产看有哪些模块


redis-trib.rb   #产看用法


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     ###数字1的意思是一个master只有一个slave


###然后可以看出来谁是master,谁是谁的slave
redis-trib.rb  info   127.0.0.1:7001
redis-trib.rb  info   127.0.0.1:7002
redis-trib.rb  info   127.0.0.1:7003
redis-trib.rb  info   127.0.0.1:7004
redis-trib.rb  info   127.0.0.1:7005
redis-trib.rb  info   127.0.0.1:7006


redis-trib.rb  check  127.0.0.1:7001   #总体查看谁是master,谁是slave


redis-cli  -c   -p   7001   ##-c 代表集群  -p  代表端口,不加-c,写不进去东西
set  name  wxh   ##可以看见他写进那个服务里面了,这是内部的算法,内部自由分配
get  name


redis-cli  -c   -p   7006
get  name   ###和7001进去一样,都是写进同一个地方,也从同一个地方读取


###每一个集群都可以有增加和删除的功能,相当与每一个都是主
redis-cli  -c  -p  7004
del   name   ##删除名字
shutdown   ##让7002停掉服务,那么他对应的slave就会接管服务
redis-cli  -c  -p   7004
shutdown     ##7004也听掉了,那么整个服务就听掉了,因为hash槽不够了
####恢复停掉的服务
cd  /usr/local/cluster
cd  7002
redis-server   redis.conf


cd  ../7004
redis-server   redis.conf


redis-trib.rb  check  127.0.0.1:7001
##查看服务有没有起来,应该7004还是master,应该在7004没有挂掉之前,他就是master,所以再次起来的时候,他还是master


cat    appendonly.aof     ##查看做过的步骤

一.实现数据库,php,nginx和redis的架构

#####下载所有关于 redis的包
cd redis   ##切进去有包的位置
yum  install    -y   php*
cd   /etc/php.d/
vim    /etc/php.ini
##改时区  date.timezone = Asia/Shanghai


cd  /etc/php-fpm.d/
ls   ###www.conf  
vim  www.conf
###改user=nginx  group=nginx


/etc/init.d/php-fpm  start  ##服务起不来,可能没有nginx,yum  install  nginx


netstat  -antlupe  |  grep   :9000  ##监听9000端口


cd /etc/nginx
cd  conf.d
ls
vim   default.conf
###打开location  - \.php$ {
               root html;
               fastcgi_pass   127.0.0.1:9000;
               fastcgi_index  index.php;
               fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
               include   fastcgi_params;
     }
  location /{
    root  /usr/share/nginx/html;
    index  index.php   index.html  index.html;  #将php页面优先加载
    }


/etc/init.d/nginx  start
cd  /usr/share/nginx/html
ls
vim  index.html
<?php
phpinfo()
?>


php -m   ###发现redis没有加载进去
/etc/init.d/php-fpm    restart
###进入浏览器里面看
http://172.25.17.11  ##可以看加php页面


cd
cd  redis
cp  test.php    /usr/share/nginx/html/index.php将php测试页面的代码(该代码是查询数据库中数据)放在默认发布目录下
php -m  |  grep  redis   ##发现并没有这个模块,所以我们进行热加载
php  -m  |  grep  mysql   ##有mysql这个模块
cd  /usr/share/nginx/html
vim   index.php###改为master的ip
##另外开一台虚拟机
yum  install  -y   mysql-server
/etc/init.d/mysqld  start
###在server1里面做
cd  /usr/share/nginx/html
vim   index.php###改数据库的ip
###在上面开的一台虚拟机值中做
mysql
show  databases;
grant  select   on   test.*  to redis@'%'  identified  by  'westos'


###在server1里面做
cd  
cd redis
cat  test.sql
scp   test.sql   root@172.25.17.4:/root  ##将写好的数据考到有数据库的ip内
###在上面开的一台虚拟机值中做
mysql    <    test.sql  ##将数据倒入数据库内
mysql
use  test;
select  *  from    test;   ##验证数据有没有倒入数据库中


###在server1里面做源码编译php与redis的连接软件—phpredis-master.zip
yum  install  unzip
cd  redis
unzip   phpredis-master.zip


cd   phpredis-master
ls
phpize  ##热加载


./configure
make  &&   make  install
/etc/init.d/php-fpm  reload


cd   /usr/lib64/php/modules/
ls   ###有mysql.so 文件

.在php中动态加载redis模块
cd  /etc/php.d/
ls
cp   mysql.ini   redis.ini
vim  redis.ini
extension=redis.so


cat   redis.ini
/etc/init.d/php-fpm  reload
php  -m |  grep   redis  ##数据在浏览器才能显示,但是在数据更新时,他却不会变


cd
cd redis
yum install   -y   gearmand-1.1.8-2.el6.x86_64.rpm   libgearman-*   libevent-*
/etc/init.d/gearmand  start
netstat  -antlupe    |  grep  :4730
scp    gearman-mysql-udf-0.6.tar.gz   lib_mysqludf_json-master.zip  root@172.25.17.4:/root  ##传给有数据库的ip
###在上面开的一台虚拟机值中做
mysql
show  global   variables  like  'plugin_dir';###主要看插件的位置
yum  install  unzip
unzip  lib_mysqludf_json-master.zip


cd     lib_mysqludf_json-master
ls
yum install   -y   gcc   mysql-devel  
gcc  $(mysql_config  --cflags)  -shared  -fPIC  -o   lib_mysqludf_json.so   lib_mysqludf_json.c


cp   lib_mysqludf_json.so  /usr/lib64/mysql/plugin
mysql
create  function  json_object  returns  string soname  'lib_mysqludf_json.so';

# 注册 UDF 函数 json_object(作用是利用该函数可以将数据库中的数据构造为json格式)


select    *  from   mysql.func;  ##加载了一个函数

3.安装 gearman-mysql-udf,这个插件是用来管理调用 Gearman 的分布式的队列
tar  zxf  gearman-mysql-udf-0.6.tar.gz
ls
cd    gearman-mysql-udf-0.6
ls
./configure  --libdir=/usr/lib64/mysql/plugin/  --with-mysql##会报错,应该缺少依赖性


在server1里面做
cd
cd  redis
scp    libgearman-*  root@172.25.17.4:/root
scp     libevent-*  root@172.25.17.4:/root
###在server4里面做
yum  install   libgearman-*  libevent-*  -y
cd    gearman-mysql-udf-0.6
ls
./configure  --libdir=/usr/lib64/mysql/plugin/  --with-mysql
make  &&  make  install
cd   /usr/lib64/mysql/plugin
ls   ###有libgearman_mysql_udf.so.0.0.0  ##这个文件

登陆mysql,再次注册函数
mysql
create  function  gman_do_background  returns  string soname  'libgearman_mysql_udf.so';
create  function  gman_servers_set  returns  string soname  'libgearman_mysql_udf.so';
select   *  from  mysql.func;  ##有三个函数加载成功
select   gman_servers_set('172.25.17.1:4730');

# 指定 gearman 的服务信息


在server1里面做
netstat  -antlupe  |  grep  :4730   #端口有没有开
在sever4里面做

5.编辑触发器文件

什么是触发器: 触发器(trigger)是SQL server
提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发, 比如当对一个表进行操作(insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等

vim  test.sql


###注释写入的数据,取消注释的函数
mysql   <  test.sql
mysql  
show   triggers   from    test;查看触发器是否导入


在server1里面做在php中动态加入模块gearman
cd
cd redis
ll  worker.php

work是中间搬运数据的“进程”,由php语言编写

tar  zxf   gearman-1.1.2.tgz
cd   gearman-1.1.2
phpize
./configure
make  &&  make  install


cd   /usr/lib64/php/modules/
ls   ##有gearman.so  


cd   /etc/php.d/
ls
cp  redis.ini  gearman.ini
vim gearman.ini
extension=gearman.so


/etc/init.d/php-fpm  reload
php  -m  ## 看mysql   redis   gearman 模块有没有在内


cd  
cd  redis
vim  worker.php
####redis  写的是主master的ip
$redis->connect('172.25.17.2',6379);


mv    worker.php  /usr/local/
nohup  php   /usr/local/worker.php   &.启动worker进程并将其打入后台
在sever4里面做
mysql
use  test;
update  test  set   name='redhat'  where id=1;  ##更新数据,发现redis也更新了,页面也更新了
select  *  from  test;

##在浏览器可以看见他更新了
在主master里面get 1    发现他也更新了  ##这样变成功了


整体思路
client  ->  nginx  --> php-fpm  ->  redis(cache) ->  mysql
update  ->  mysql -->  trigger  -->udf(json,gearman)->gearmand:4730-->worker(php,java,python)->redis

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值