rhel6.5-mysql的组复制(MGR)、redis结合php做mysql的缓存

一.mysql的组复制(MGR)

        组复制是一种可用于实现容错系统的技术。复制组是一个通过消息传递相互交互的 server 集群。通信层提供了原子消息和完全有序信息交互等保障机制。复制组由多个server成员构成,并且组中的每个 server 成员可以独立地执行事务。组复制采用无共享复制方案,每个成员都有自己的完整的数据副本。MySQL 组复制提供了高可用性,高弹性,可靠的MySQL服务。当组复制的成员发生故障,由处于正常活动的server进行裁决,mysql组复制基于Paxos分布式算法,能容忍故障server的数量的公式为:N=2*f+1,(其中f表示故障的server数量,N表示容忍f个故障server所需要的server成员的数量),也就是说,容忍一个主机故障,组内必须要3个server。

二.mysql组复制的搭建(多主模式:所有 server 成员都将被设置为读写模式)

本次实验使用server1:172.25.78.1 server3:172.25.78.3进行组复制的搭建

1.mysql的安装(安装包:mysql-5.7.19-1.el6.x86_64.rpm-bundle.tar

(1)组复制是mysql-5.7.17及以上版本提供的内置插件(建议去/usr/lib64/mysql/plugin/查看有没有group_replication.so这个插件)


(2)更改数据库密码(两个数据库都更改)

启动mysql后,开始初始化会生成初始密码

grep  password   /var/log/mysql.log    ##过滤初始密码

首次进入数据库强制更改密码

alter user root@localhost identified by 'Redhat=123';
flush privileges;

2.修改配置文件(两台主机配置除了loose-group_replication_local_address(组复制的本地地址,填写本机的IP)和server-id这两个参数不一致,别的都一致

vim /etc/my.cnf      ##mysql的配置文件

group_replication 变量使用的 loose- 前缀将指示 server 继续启动,否则数据库因为加了这些参数无法启动

transaction_write_set_extraction=XXHASH64    ##server 必须为每个事务收集写集合,并使用 XXHASH64 哈希算法将其编码为散列

loose-group_replication_group_name   ##告知插件,正在加入或创建的组要命名为“aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa”

loose-group_replication_group_name     ##插件在 server 启动时不自动启动组复制

loose-group_replication_local_address  ##告诉插件使用 IP 地址 127.0.0.1 或本地主机,端口 24901 用于接受来自组中其他成员的传入连接

loose-group_replication_group_seeds    ##组成员

loose-group_replication_bootstrap_group=off    ##插件关闭自动引导组,避免已经有了引导组引起冲突

loose-group_replication_single_primary_mode=off    ##关闭单主模式

loose-group_replication_enforce_update_everywhere_checks=on     ##更新到每一个server成员

loose-group_replication_ip_whitelist="172.25.78.0/24,127.0.0.1/8"    ##白名单,允许那些终端加入组


3.添加第一个成员

(1)配置 group_replication_recovery 通道的恢复凭据

set sql_log_bin=0;            ##关闭日志
reset matser;                     ##重置master
grant replication slave on *.* to rpl_user@'%' identified by 'Redhat=123';  ##授权复制用户
set sql_log_bin=1;             ##打开日志

change master tomaster_user='rpl_user',master_password='Redhat=123' for channel 'group_replication_recovery';

(2)安装组复制插件并且开启

install plugin group_replication soname 'group_replication.so';

set global group_replication_bootstrap_group=on;   ##添加首个节点需要开启,因为先要有一个引导组
start group_replication;                          

set global group_replication_bootstrap_group=off;  ##开启组复制后关闭

报错:看日志发现是并且白名单的设定错误,白名单要设置成本机的同一网段


修改报错后重新开启组复制的插件


4.添加第二个成员(以及第N个成员都和下面的操作一致)

select* from performance_schema.replication_group_members;   ##查看组成员的状态


5.测试

(1)在server1上面创建数据库和表,插入数据

(2)在另一个成员server3上成功同步

6.一些参数调优

show variables like '%query%'; ##mysql的缓存

query_cache_type      ##打开此参数,就可以开启数据库的内置缓存

show variables like '%logs%';  ##日志的过期时间

expire_logs_days        ##设置日志过期时间

show variables like 'binlog%';
sync_binlog=1|0      ##每一次事物的提交都写到磁盘|交给操作系统

7.mysqlbinlog (查看日志文件,有gtid以及position)   

binlog是二进制文件,普通文件查看器cat more vi等都无法打开,必须使用自带的 mysqlbinlog 命令查看,

可以指定pos的起始和结束的查看日志,也可以指定起始时间和结束时间来查看日志


二.redis结合php做mysql的缓存

redis_ip;172.25.78.3  nginx_ip:172.25.78.1   mysql_ip:172.25.78.4

1.搭建一个lnmp架构用来测试redis的缓存效果

client-->nginx-->php-fpm-->redis-->mysql

(1)在server1_ip:172.25.78.1 上面搭建lnmp架构

(2)vim /etc/nginx/conf.d/default.conf    ##nginx的配置文件

写一个测试页面测试,所以把index.php放在首位,作为默认发布文件

发布目录

打开fastcgi,因为要测试php发布文件

(3)安装php以及和mysql相关的安装包

(4)vim /etc/php.ini     ##配置php

(5)vim  /etc/php-fpm.d/www.conf

添加php-fpm的用户和用户组

2.php-redis模块的编译

(1)phpredis模块的编译(php默认不支持redis模块)

(2)把php-redis模块添加到php里

cd /etc/php.d   ##这个目录下是php的模块目录

重启php-fpm之后redis才能添加到php里面


3.安装数据库把测试数据导入数据库


给redis用户授权,因为redis没有的数据要请求mysql去读取

4.vim /usr/share/nginx/html/test.php

当有访问请求的时候连接到172.25.78.3的redis的6379端口,redis如果没有要访问的数据就去172.25.78.4以数据库已经授权的redis用户去读取数据;redis把数据反馈给用户,同时把数据存储在自己的内存里

5.测试(刷新之后,就会把mysql里的数据请求到redis,反馈到页面)

同时在172.25.78.3上面的redis也会把从数据库里请求到的数据存储,redis也有数据

注意:但是有一个严重问题,当数据库数据变化之后,redis并不知道,因为数据已经缓存到了redis,当有数据请求时,redis会直接把错误的数据反馈给用户请求,显然这是不合理的。


三.redis数据及时更新

当数据库的数据发生变化,有一个触发器能把这个变化告知redis,redis重新请求数据库数据,问题应该就可以解决

mysql->update-->trigger_json_object-->gman_do_background-->gearmand-->worker(php-gearman)-->php-redis-->redis

1.在lnmp架构所在主机开启gearmand(端口:4730)

2.安装php的扩展模块gearman(gearman-1.1.2.tgz)

phpize        ##创建gearman的编译环境     


把gearman模块添加到php的模块目录里

3.安装 gearman-mysql-udf(这个插件是用来管理调用 Gearman 的分布式的队列)

(1)解包、编译安装

tar zxf gearman-mysql-udf-0.6.tar.gz

报错:需要libgearman的支持


/usr/lib64/mysql/plugin/   ##mysql模块的目录


(2)注册UDF函数

(3)指定gearman的服务信息(通过这个函数来告知172.25.78.1上面的gearmand)

4.在数据库端安装 lib_mysqludf_json

        lib_mysqludf_json  UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映射为 JSON 格式,是通过程序来转换的。

(1)首先安装mysql-devel(mysql的开发包)

(2)安装lib_mysqludf_json

cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/    ##把模块复制到mysql的模块目录下


(3)注册UDF函数


5.编写mysql的触发器

(1)vim test.sql


(2)把触发器导入mysql


(3)在数据库中查看触发器

6.编写gearman的worker端

(1)把数据库的变化告知172.25.78.3的redis

(2)给worker.php加执行权限

(3)后台运行worker.php

nohup php worker.php &

7.测试,更新数据库

172.25.78.3上面的redis本来没有收到更新通知,把整个mysql更新后通知服务端gearmand的机制搭建好,redis成功更新



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值