xiyou 发表于 2018-11-5 08:16:27

redis+mysql架构搭建

  redis+mysql框架搭建
  redis是一个key-value存储系统。和memcached类似,不过redis支持的value类型更多,主要有:string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)。redis和memcached一样,为了保证效率,都是把数据缓存在内存中。区别是redis会周期性的把更新的数据写入磁盘或者把修改的操作写入追加的记录文件,并且在此基础上实现master-slave主从同步。
  简单的比较redis和memcached的区别,主要就是以下几点: 1、redis不仅支持简单的键值类型的数据,同时提供string、set、zset、hash等数据结构的存储。 2、redis支持数据的备份,即 master-slave模式的数据备份。 3、redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  接下来介绍redis+mysql架构的搭建: 环境:红帽6.5、虚拟主机VM1 ip=172.25.10.8
  一:在虚拟主机上的安装redis:
yum install -y gcc gcc-c++ ;安装编译软件
cd redis/
tar -zxf redis-3.0.2.tar.gz ;解压软件包
cd redis-3.0.2 ;进入解压的目录
make ---> #make install ;直接编译并且安装
cd utils/ ;进入此util目录,执行下面的脚本。配置并启动程序
./install_server.sh

netstat -antlpe | grep redis ;可以查看redis使用的端口号为6379
redis-cli ;redis客户端的使用命令
  ste no1 1234 ;将键no1添加键值1234; get no1 ;获得no1的键值;
  二、介绍redis作mysql的缓存服务器。 1、安装lnmp环境,安装以下软件包:
yum install -y mysql-server ;安装mysql数据库
yum install -y nginx-1.8.0-1.el6.ngx.x86_64.rpm php-* ;安装nginx和php
vim /etc/php.ini ;编辑php的配置文件,修改时区

vim /etc/php-fpm.d/www.conf ;修改php-fpm 用户和组为nginx,默认为apache

/etc/init.d/php-fpm start ;启动php-fpm服务
netstat -antlpe ;查看php-fpm端口号9000;
/etc/init.d/nginx start ;启动nginx服务;
cd /usr/share/nginx/html/ ;进入默认发布目录,编写php 测试页面
vim index.php
  
vim /etc/nginx/conf.d/default.conf ;编写nginx的默认配置文件;打开php模块,


/etc/init.d/nginx restart ;重新启动nginx服务;
  创建php 测试页面;

vim index.php
  
/etc/init.d/mysqld start ;启动数据库,
  安装php的redis扩展; 材料:phpredis-master.zip
unzip phpredis-master.zip ;解压软件包
cd phpredis-master
phpize ;进行配置编译安装
./configure
make ----># make install
cd /usr/lib64/php/modules/ ;进入php的模块目录;
cp /etc/php.d/mysql.ini /etc/php.d/redis.ini ;拷贝mysql.ini为redis.ini;
vim /etc/php.d/redis.in ;修改模块内容,其实就是添加redis.so 模块;
  extension=redis.so
/etc/init.d/php-fpm>  在数据库中添加测试用test.sql.
mysql < test.sql
mysql

  select * from test; update test set name="westos" where>  在FIREFOX中输入master的ip进入页面,查看测试结果变化;进行验证数据从哪里读到,第一应该是从数据库中读到,刷新一次数据缓存在redis中,所以数据应该是从redis中读到;但是如果在数据库中更新了相关的数据,而redis中缓存的数据却无法及时更新,因为redis中任然有对应的KEY,数据就不会更新,这是一个缺陷,接下来就要通过mysql触发器将改变的数据同步到redis中。
         
  三、数据库与redis数据同步: 配置gearman实现数据同步:Gearman 是一个支持分布式的任务分发框架, Gearman Job Server:Gearman 核心程序,需要编译安装并以守护进程形式运行在后台。 Gearman Client:可以理解为任务的请求者。 Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式 运行,Gearman Worker 接收到Gearman Client 传递的任务内容后,会按顺序处理。 大致流程:下面要编写的mysql 触发器,就相当于Gearman 的客户端。修改表,插入表就相当于直接 下发任务。然后通过libmysqludfjson UDF库函数将关系数据映射为JSON 格式,然后 在通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中,最后通过 redis_worker.php,也就是Gearman 的worker 端来完成redis 数据库的更新。
yum install -y libgearman-devel-1.1.8-2.el6.x8664.rpm libgearman-1.1.8-2.el6.x8664.rpm libevent-* ;安装gearman软件包及依赖包;
yum install -y gearmand-1.1.8-2.el6.x86_64.rpm
/etc/init.d/gearmand start ;启动geaman服务;
tar -zxf gearman-1.1.2.tgz ;安装php的gearman扩展
cd gearman-1.1.2
phpize
./configure
make -----> # make install ;源码编译安装三部曲;
cd /usr/lib64/php/modules/ --> gearman.so ;在此进入php功能模块文件
cd /etc/php.d/
cp redis.ini gearman.ini ;如上添加redis功能模块一样,在这添加gearman功能模块,
vim gearman.ini
  extension=gearman.so
php -m | grep gearman ;查看gearman功能模块是否添加上
  安装libmysqludfjson: libmysqludfjson UDF库函数将关系数据映射为JSON格式。而通常将数据映射为JSON格式是通过程序来转换的。
yum install -y mysql-devel ;安装mysql-devle软件依赖项
cd /root/redis/
unzip libmysqludfjson-master.zip
cd libmysqludfjson-master
gcc $(mysqlconfig --cflags) -shared -fPIC -o libmysqludfjson.so libmysqludfjson.c ;将libmysqludfjson.c编译输出为libmysqludf_json.so
mysql ;查看mysql的模块目录;
  show global variables like 'plugin_dir';
cp libmysqludfjson.so /usr/lib64/mysql/ ;拷贝libmysqludfjson.so 模块
mysql ;注册UDF 函数
>CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';  >select * from mysql.func;             ;查看注册的函数;

  安装gearman-mysql-udf,这个插件是用来管理调用Gearman 的分布式的队列。
tar -zxf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6
./configure --libdir=/usr/lib64/mysql/plugin ;编译安装
make -----> #make install
> create function gman_do_background returns string soname 'libgearman_mysql_udf.so';   ;注册UDF函数;  > create function gman_servers_set returns string soname 'libgearman_mysql_udf.so';
  > select * from mysql.func;         ;查看函数

cd~/redis/
vim test.sql
mysql
> show triggers from test;  >select gman_servers_set('127.0.0.1:4730');      ;指定gearman的服务信息,
  编写mysql 触发器(根据实际情况编写)
vim test.sql
  use test; DELIMITER $$ CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN SET @RECV=gmandobackground('syncToRedis', json_object(NEW.id as id, NEW.name as name)); END$$ DELIMITER ;
mysql < test.sql
  mysql > SHOW TRIGGERS FROM test; ;查看触发器;

  编写gearman的worker端:
  vim worker.php
  
nohup php worker.php & ;后台运行worker
  更新mysql中的数据,mysql 更新数据库内容,redis就会立即更新缓存的数据。可以直接验证。
      


页: [1]
查看完整版本: redis+mysql架构搭建