一.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成功更新