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