数据访问流程:
client -> app -> redis -> mysql -> redis -> client
客户端用app访问,先在redis里读数据,因为快,redis没有才去mysql读,
读完保存在redis里,然后返回客户端,下次再读就快
【1】:【server1】
1: #没有killall命令,进行寻找安装yum whatprovides /usr/bin/killallyum install -y psmisc-22.20-11.el7.x86_64killall redis-server ##关掉redis进程
/etc/init.d/redis_6379 stop ps aux | grep redis ##查看进程是否完全关闭
关闭之前实验的所有应用,以防影响实验
在server1配置nginx和php访问页面2:先配置nginx(nginx只是提供了负载均衡,所以版本要求不高) 解压nginx包tar zxf nginx-1.17.4.tar.gzvim /root/nginx-1.17.4/auto/cc/gcc ##关闭debug
171 # debug
172 #CFLAGS="$CFLAGS -g"
编译nginx(编译过程中缺什么补什么)
./configure --prefix=/usr/local/nginx
yum install pcre-devel -y
yum install zlib-devel -y
编译成功!!!
make && make install
3:配置redis,php页面
自己装的openssl和php的openssl是不一样的
cd /root/redis/rhel7/ --> ls
yum install * -y
##首先在server1配置好nginx
cd /usr/local/nginx/conf/
vim nginx.conf
2: user nginx nginx;
45 index index.php index.html index.htm;
65 location ~ \.php$ {
66 root html;
67 fastcgi_pass 127.0.0.1:9000;
68 fastcgi_index index.php;
69 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
70 include fastcgi.conf;
71 }
useradd nginx ##添加用户
/usr/local/nginx/sbin/nginx #启动并测试nginx
systemctl start php-fpm ##启动php-fpm
netstat -antlp ##查看端口,80,9000
【2】:配置server2
【server2】 1: vim /etc/redis/6379.conf
70 bind 0.0.0.0
/etc/init.d/redis_6379 start
##在server2上配置redis为master,因为之前做了主从,关闭server1的redis
#如果有key,删除key,del name
[root@server2 ~]# redis-cli
127.0.0.1:6379> get name (nil)2:配置测试页面cd /root/redis/ --> ls
mv test.php /usr/local/nginx/html/
mv test.php index.php ##将test.php 改为index.php
【3】:配置server3
##再开启server3,关闭原来的mysql
[root@server3 ~]# rpm -qa | grep mysql ##旧版本的虚拟机什么也没有 [root@server3 ~]# rpm -e
rpm -qa | grep mysql
--nodeps 新版本的有东西,需删除
#清除原来数据目录里的内容 cd /var/lib/mysql rm -fr * (我的环境是新的,所以不需要做以上3步操作)1:安装mariadb,这里试验用这个就行 yum install -y mariadb-*
/var/lib/mysql/ -->ls 什么也没有,环境是干净的
systemctl start mariadb #启动mariadb
2:安全初始化
mysql_secure_installation ##这里密码可以设置为简单的,如redhat,其他回车即可
3:#登录数据库,授权用户
mysql -uroot -predhat
MariaDB [(none)]> create database test;
MariaDB [(none)]> grant all on test.* to redis@’%’ identifiedby ‘redhat’;
MariaDB [(none)]> flush privileges;
【4】【server1】修改nginx的发布文件test.php
vim /usr/local/nginx/html/test.php
3 $redis->connect(‘172.25.78.2’,6379) ##连接redis,即连接server2的6379端口10 $connect = mysql_connect(‘172.25.78.3’,‘redis’,‘redhat’); ##连接数据库
【5】【server3】为server3上的mysql的test库加入一些数据
1: cd /root/redis – > ls
vim test.sql ##只是看一下加入的数据
##注释掉的目前用不到,是创建查询的触发器的
2:将test.sql的内容导入到数据库中
mysql -predhat < test.sql
【6】测试 1:在浏览器测试:
172.25.78.1
##可以看到导入的数据,但是刷新一次后,可以看到后面就从redis读取数据 可以简单的理解为: 第一次访问到后台访问数据库,访问的东西放到redis里面 第二次访问到redis
2:在【server2】使用命令行也可以测试
[root@server2 ~]# redis-cli
127.0.0.1:6379> get 1 “test1”
127.0.0.1:6379> get 2 “test2”
【7】这个时候有个问题,如果此时mysql数据发生变更,redis会同步吗?
1:【server3】
MariaDB [test]> select * from test; ##查看之前插入的数据
MariaDB [test]> update test set name=‘westos’ where id=1; ##更新 MariaDB [test]> select * from test;
##更新后的id=1,对应的name为westos
#变更后发现,redis里没有变,浏览器也看不到变化,但是在redis里做的变化能看到 浏览器:172.25.78.1 刷新,并没有看到更新,这样显然不合理
2:配置gearmand
简介:
Gearmand 是一个用来把工作委派给其它机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来调用其它语言的函数的系统。
简单来讲,就是客户端程序把请求提交给 gearmand,gearmand 会把请求转发给合适的 worker 来处理这个请求,最后还通过 gearmand 返回结果。
运行流程:
Client --> Job --> Worker
1、Client 请求发起者,客户端程序可以是任何一种语言,C 、PHP 、Perl 、Python 等。
2、Job 请求调度者,负载协调把 Client 发出的请求转发给合适的 Worker。
3、Worker 请求处理者,处理 Job 分发来的请求,可以是任何一种语言
3:【server1】启动
systemctl start gearmand
4:【server3】解压lib_mysqludf_json-master.zipyum whatprovides */unzip
yum install unzip-60.-16.el7.x86_64 -y
##安装解压命令unzip lib_mysqludf_json-master.zip
yum install -y mariadb-devel.x86_64 #安装mariadb-devel
yum insatl gcc -y
##解决依赖,防止编译的时候出错
> cd /root/redis/lib_mysqludf_json-master
#编译模块(文档上有,注意路径)
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插件目录
5:【server3】查看MariaDB [(none)]> show global variables like ‘plugin_dir’;
#注册udf函数
MariaDB [(none)]> CREATE FUNCTION json_object RETURNS STRING SONAME ‘lib_mysqludf_json.so’;6:#安装插件管理gearman的分布式队列cd redis/ --> ls
tar zxf gearman-mysql-udf-0.6.tar.gzcd redis/rhel7 --> ls
yum install -y libevent-devel-2.0.21-4.el7.x86_64.rpm libgearman-*
7: 编译安装gearman插件
cd /root/redis/gearman-mysql-udf-0.6./configure --libdir=/usr/lib64/mysql/plugin/ --with-mysql make && make install
8:注册udf函数
mysql -uroot -predhat
MariaDB [(none)]> CREATE FUNCTION gman_do_background RETURNS STRING SONAME ‘libgearman_mysql_udf.so’;
MariaDB [(none)]> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME ‘libgearman_mysql_udf.so’;
MariaDB [(none)]> select * from mysql.func; ##查看函数
MariaDB [(none)]> SELECT gman_servers_set(‘172.25.78.1:4730’); ##指定gman服务信息
9:编写mysql触发器
vim /root/redis/test.sql (将其他的全部注释)
1 use test;
5 DELIMITER $$
6 CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
7 SET @RECV=gman_do_background('syncToRedis',json_object(NEW.id as `id`, NEW.name as `name`));
8 END$$
9 DELIMITER ;
重新将文件内容导入数据库
[root@server3 ~]# mysql -p < test.sql
##查看触发器
MariaDB [(none)]> SHOW TRIGGERS FROM test;
10:【server1】
编写gman的worker端cd redis/ --> ls
cp worker.php /usr/local/ vim worker.php
7 $redis->connect(‘172.25.78.2’, 6379);nohup php /usr/local/worker.php &> /dev/null & ##后台运行worker
11:进行测试是否可以同步【server3】修改数据库内容
MariaDB [(none)]> use test;
MariaDB [test]> update test set name=‘mysql’ where id=2;
MariaDB [test]> select * from test;
【server2】在redis上查看[root@server2 ~]# redis-cli
127.0.0.1:6379> get 2
浏览器:页面查看,数据同步