loose-(加在数据前面,正确就起来,错误就警告但是不影响起来)
工作中尽量不要跨库操作,不然有可能会失效
目录
在管理节点上安装两个包mha4mysql-manager和mha4mysql-node
半同步复制
范例: CentOS8 在MySQL8.0 实现半同步复制
rpl_semi_sync_master_enabled=ON (主)
rpl_semi_sync_slave_enabled=on (辅)加上他实现半同步
#查看插件文件
[root@centos8 ~]#rpm -ql mysql-server |grep semisync
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
#master服务器配置
[root@master ~]#vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=8
log-bin
rpl_semi_sync_master_enabled=ON #修改此行,需要先安装semisync_master.so插件后,再重启,否则无法启动
rpl_semi_sync_master_timeout=3000 #设置3s内无法同步,也将返回成功信息给客户端#slave服务器配置
[root@slave1 ~]#vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
- server-id=18
rpl_semi_sync_slave_enabled=ON #修改此行,需要先安装semisync_slave.so插件后,再重启,否则
无法启动
[root@slave2 ~]#vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]erver-id=28
rpl_semi_sync_slave_enabled=ON #修改此行,需要先安装semisync_slave.so插件后,再重启,否则无法启动
#主服务器配置:
- cat /etc/my.cnf
- [mysqld]
- server-id=8
- rpl_semi_sync_master_enabled=ON 需要先在mysql安装然后在写入文件里重启 或者没启动之前直接加在里面注释掉,安装完后去掉
- 然后用它启动下 > set rpl_semi_sync_master_enabled=1
或者在里面加上 plugin-load-add = "semisync_slave.so" 就不用手动下载了,会自动下载
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #永久安装插
件
mysql>UNINSTALL PLUGIN rpl_semi_sync_master ;
mysql>SHOW PLUGINS; #查看插件
mysql>SET GLOBAL rpl_semi_sync_master_enabled=1; #临时修改变量
mysql>SET GLOBAL rpl_semi_sync_master_timeout = 3000; #超时长1s,默认值为10s
#从服务器配置:
[mysqld]
server-id=12
plugin-load-add = "semisync_slave.so"
rpl_semi_sync_slave_enabled=on
- 加上 plugin-load-add = "semisync_slave.so" 就不用手动下载了,会自动下载或者没启动之前直接加在里面注释掉,安装完后去掉然后用它启动下 > set rpl_semi_sync_master_enabled=1
mysql> select @@rpl_semi_sync_slave_enabled; 查看是否起来
副服务器关机,或者副服务器都挂了,也没事,开启也会数据自动同步
副服务器倒入恢复主服务器
[root@root2 ~]# mysqldump -A --single-transaction -F > all.sql 导出数据
主 mysql> set sql_log_bin=off; 关闭日志
mysql> source /root/all.sql 倒入数据
mysql> set sql_log_bin=on; 启用日志
show master logs; 查看日志
注:mysql> reset master; 清除日志文件
start slave; 写入数据后 开启线程
stop slave; 停止服务
reset slave all; 删除
复制过滤器
让从节点仅复制指定的数据库,或指定数据库的指定表
复制过滤器两种实现方式:
(1) 服务器选项:主服务器仅向二进制日志中记录与特定数据库相关的事件
缺点:基于二进制还原将无法实现;不建议使用
优点: 只需要在主节点配置一次即可
(2) 从服务器SQL_THREAD在relay log中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地
缺点:会造成网络及磁盘IO浪费,在所有从节点都要配置
优点: 不影响二进制备份还原
(1)[mysqld]
binlog-ignore-db=db2 黑名单不复制,加入后需要重启
show master status; 查看黑名单里有谁,及现在用的二进制
vim /etc/my.cnf
binlog-do-db=db1 #数据库白名单列表,不支持同时指定多个值,如果想实现多个数据库需多行实现
binlog-do-db=db2
binlog-ignore-db=db3 #数据库黑名单列表
(2) [mysqld]
replicate_ignore_db="db1" 服务器加入黑名单, 许重启
replicate_do_db="db1,db2,db3" #指定复制库的白名单,变量可以指定逗号分隔的多个值,选项不支持多值,只能分别写多行实现
replicate_ignore_db= #指定复制库黑名单
replicate_do_table= #指定复制表的白名单
replicate_ignore_table= #指定复制表的黑名单
replicate_wild_do_table= foo%.bar% #支持通配符
replicate_wild_ignore_table=
GTID复制
哪怕你半路中断,生成新的日志,开启后也能同步,但是不能删除
也可以并行复制和cpu的合数有关,几何就最好几个
- GTID(Global Transaction ID 全局事务标识符) MySQL 5.6 版本开始支持,但不太成熟,建议使用
- MySQL5.7以上版本的GTID功能
- MySQL5.6版本出现没有默认开启,5.7中即使不开启也有匿名的GTID记录。
- 开启GTID功能可以支持多DUMP线程的并发复制,而且MySQL5.6实现了基于库级别多SQL线程并发。在MySQL5.7利用 GTID的 Logic clock 逻辑时钟。保证了同库级别下的事务顺序问题。即可以实现基于事务级别的并发回放。从而大大减少了同步的延迟
- 同时GTID具有幂等性特性,即多次执行结果是一样的
- 利用 GTID复制不像传统的复制方式(异步复制、半同步复制)需要找到binlog文件名和POS点,只需知道master的IP、端口、账号、密码即可。开启GTID后,执行change master to
- master_auto_postion=1即可,它会自动寻找到相应的位置开始同步
GTID 优点:
- 保证事务全局统一
- 截取日志更加方便。跨多文件,判断起点终点更加方便
- 判断主从工作状态更加方便
- 传输日志,可以并发传输。SQL回放可以更高并发
- 主从复制构建更加方便
GTID 架构
GTID = server_uuid:transaction_id,在一组复制中,全局唯一
server_uuid 来源于 /var/lib/mysql/auto.cnf
[root@root2 ~]#uuidgen随机生成uid
GTID服务器相关选项 vim /etc/my.cnf下,复制粘贴(主从都一样)
gtid_mode=ON #gtid模式
enforce_gtid_consistency=ON #保证GTID安全的参数
[mysqld]
server-id=8 ip号
log-bin 开启二进制日志
plugin-load-add="semisync_master.so" 自动下载(主)
rpl_semi_sync_master_enabled=ON 半同步
rpl_semi_sync_master_timeout=3000 三秒出结果gtid_mode=ON gtid模式
enforce_gtid_consistency=ON 保证GTID安全的参数slave-parallel-workers=4 并行复制
read-only 加上他之后配置服务器将无法写入
super-read_only 加上他哪怕root也无法添加
并行复制 (增加复制速度)
- mysql> select @@slave_parallel_workers;
- [mysqld]
- slave-parallel-workers=4
- systemctl restart mysqld
测试
- mysql> stop slave; 停掉复制线程
- reset slave all; 删除所有复制信息
- show slave status\G; 查看信息
- flush logs; 生成新的二进制文件
- mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql/ 写入原始数据源
- RESET MASTER; 清除二进制
- start slave; 双发启动
- mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql/ 重新写入原始
- start-postioi= (二进制数据往后的到出来)用于数据不同步
复制延迟
- 升级到MySQL5.7以上版本(5.7之前的版本,没有开GTID之前,主库可以并发事务,但是dump传输时是串行)利用GTID(MySQL5.6需要手动开启,MySQL5.7以上默认开启)支持并发传输binlog及并行多个SQL线程
- 减少大事务,将大事务拆分成小事务
- 减少锁
- sync_binlog=1 加快binlog更新时间,从而加快日志复制
- 需要额外的监控工具的辅助
- 多线程复制:对多个数据库复制
- 一从多主:Mariadb10 版后支持
MySQL 主从数据不一致
造成主从不一致的原因
- 主库binlog格式为Statement,同步到从库执行后可能造成主从不一致。
- 主库执行更改前有执行set sql_log_bin=0,会使主库不记录binlog,从库也无法变更这部分数据。
- 从节点未设置只读,误操作写入数据
- 主库或从库意外宕机,宕机可能会造成binlog或者relaylog文件出现损坏,导致主从不一致
- 主从实例版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数据库上面可能不支持该功能
- 主从sql_mode 不一致
- MySQL自身bug导致
主从不一致修复方法
- 将从库重新实现
- 虽然这也是一种解决方法,但是这个方案恢复时间比较慢,而且有时候从库也是承担一部分的查询操作的,不能贸然重建。
- 使用percona-toolkit工具辅助
- PT工具包中包含pt-table-checksum和pt-table-sync两个工具,主要用于检测主从是否一致以及修复数据不一致情况。这种方案优点是修复速度快,不需要停止主从辅助,缺点是需要知识积累,需要时间去学习,去测试,特别是在生产环境,还是要小心使用
- 关于使用方法,可以参考下面链接:https://www.cnblogs.com/feiren/p/7777218.html
- 手动重建不一致的表
- 在从库发现某几张表与主库数据不一致,而这几张表数据量也比较大,手工比对数据不现实,并且重做整个库也比较慢,这个时候可以只重做这几张表来修复主从不一致
- 这种方案缺点是在执行导入期间需要暂时停止从库复制,不过也是可以接受的
范例:A,B,C这三张表主从数据不一致
从库停止Slave复制
mysql>stop slave;
2、在主库上dump这三张表,并记录下同步的binlog和POS点
mysqldump -uroot -pmagedu -q --single-transaction --master-data=2 testdb A B
C >/backup/A_B_C.sql
3、查看A_B_C.sql文件,找出记录的binlog和POS点
head A_B_C.sql
例如:MASTERLOGFILE='mysql-bin.888888', MASTERLOGPOS=666666;#以下指令是为了保障其他表的数据不丢失,一直同步直到那个点结束,A,B,C表的数据在之前的备份已
经生成了一份快照,只需要导入进入,然后开启同步即可
4、把A_B_C.sql拷贝到Slave机器上,并做指向新位置
mysql>start slave until MASTERLOGFILE='mysql-bin.888888',
MASTERLOGPOS=666666;
5、在Slave机器上导入A_B_C.sql
mysql -uroot -pmagedu testdb
mysql>set sql_log_bin=0;
mysql>source /backup/A_B_C.sql
mysql>set sql_log_bin=1;
6、导入完毕后,从库开启同步即可。
mysql>start slave;
如何避免主从不一致
- 主库binlog采用ROW格式
- 主从实例数据库版本保持一致
- 主库做好账号权限把控,不可以执行set sql_log_bin=0
- 从库开启只读,不允许人为写入
- 定期进行主从一致性检验
数据库切分方式
垂直切分
- 系统被切分成了,用户,订单交易,支付几个模块。 一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计中,各个功能模块相互之间的交互点越统一越少,系统的耦合度就越低,系统各个模块的维护性以及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容易。但是往往系统之有些表难以做到完全独立,存在着跨库 join 的情况,对于这类表,就需要去做平衡, 是数据库让步业务,共用一个数据源,还是分成多个库,业务之间通过接口来做调用。在系统初期,数据量比较 少,或者资源有限的情况下,会选择共用数据源,但是当数据发展到了一定的规模,负载很大的情况,就需要必须去做分割。
- 一般来讲业务存在着复杂 join 的场景是难以切分的,往往业务独立的易于切分。如何切分,切分到何种程度是考验技术架构的一个难题。
垂直切分的优缺点:
优点:
- 拆分后业务清晰,拆分规则明确
- 系统之间整合或扩展容易
- 数据维护简单
缺点:
- 部分业务表无法 join,只能通过接口方式解决,提高了系统复杂度
- 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高
- 事务处理复杂
由于垂直切分是按照业务的分类将表分散到不同的库,所以有些业务表会过于庞大,存在单库读写与存储瓶颈,所以就需要水平拆分来做解决
水平切分
相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分 到一个数据库,而另外的某些行又切分到其他的数据库中,如图:
拆分数据就需要定义分片规则。关系型数据库是行列的二维模型,拆分的第一原则是找到拆分维度。比如: 从会员的角度来分析,商户订单交易类系统中查询会员某天某月某个订单,那么就要按照会员结合日期来拆分, 不同的数据按照会员 ID 做分组,这样所有的数据查询 join 都会在单库内解决;如果从商户的角度来讲,要查询某个商家某天所有的订单数,就需要按照商户 ID 做拆分;但是如果系统既想按会员拆分,又想按商家数据,则会有 一定的困难。如何找到合适的分片规则需要综合考虑衡量。
几种典型的分片规则包括:
- 按照用户 ID 求模,将数据分散到不同的数据库,具有相同数据用户的数据都被分散到一个库中
- 按照日期,将不同月甚至日的数据分散到不同的库中
- 按照某个特定的字段求摸,或者根据特定范围段分散到不同的库中
优点:
- 拆分规则抽象良好,join 操作基本都可以数据库完成
- 不存在单库大数据,高并发的性能瓶颈
- 应用端改造较少
- 提高了系统的稳定性跟负载能力
缺点:
- 拆分规则难以抽象
- 分片事务一致性难以解决
- 数据多次扩展难度跟维护量极大
- 跨库 join 性能较差
前面讲了垂直切分跟水平切分的不同跟优缺点,会发现每种切分方式都有缺点,但共同特点缺点有:
- 引入分布式事务的问题
- 跨节点 Join 的问题
- 跨节点合并排序分页问题
- 多数据源管理问题
Mycat
我们都知道mysql数据库实际上在数据查询上是有一个瓶颈的,当我们的数据太多的时候,已经互联网上有高并发的请求的时候,这个时候对我们mysql的压力是非常大的,当访问量一大,就可能会出现查不出数据,响应的时间太长等,这个时候我们可能需要有多个服务器对数据库进行读写分离,以及对数据库进行集群,这个时候我们的sql语句要进行分类,哪个sql语句要访问哪个数据库,这个时候只要交给mycat就可以了。
使用多个数据库的时候我们就会遇到一个读写数据不一致的问题,这个时候同样mycat可以进行主从复制,保证了数据的一致性。
1、读写分离
2、数据分片
3、多数据源整合
Mycat 安装
下载安装JDK
yum -y install java
#确认安装成功
java -version
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
下载安装mycat
wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-
1.6.7.4-release-20200105164103-linux.tar.gz
mkdir /apps
tar xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps
ls /apps/mycat/
bin catlet conf lib logs version.txt
mycat高可用需要vip
实验,有主从, 在家个机器放mycat,需要下java,把文件拉进去解析
java吃内存最低2G,mycat是代理不是数据库
mucat怎么判断他是否存货,简单来说就是每个十秒发 一个select user
启动和连接
#配置环境变量
vim /etc/profile.d/mycat.sh
PATH=/apps/mycat/bin:$PATH
source /etc/profile.d/mycat.sh
#启动
mycat start
#查看日志,确定成功
cat /app/mycat/logs/wrapper.log
...省略...
INFO | jvm 1 | 2019/11/01 21:41:02 | MyCAT Server startup successfully. see
logs in logs/mycat.log
#连接mycat:
mysql -uroot -p123456 -h 127.0.0.1 -P8066
[root@apps ~]#echo 'PATH=/apps/mycat/bin:$PATH' > /etc//profile.d/mycat.sh
[root@apps ~]#. /etc/profile.d/mycat.sh
[root@apps ~]#mycat start 起来 默认·端口8066
vim /apps/mycat/conf/server.xml 在这里把8066改成3306.密码也在这里面改(初始秘密123456,整行复制)
修改schema.xml实现读写分离策略
[root@centos8 ~]#vim /apps/mycat/conf/schema.xml 直接删除原本,粘贴这个
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="hellodb" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="host1" url="10.0.0.8:3306" user="wang" password="123456">
<readHost host="host2" url="10.0.0.18:3306" user="wang" password="123456" />
<readHost host="host3" url="10.0.0.28:3306" user="wang" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
- mysql> create user root@'10.0.0.%' wang by '123456'; 再主上创建账号切授权
- mysql> grant all on hellodb.* to wang'10.0.0.%';
- mysql> select user,host from mysql.user; 在从上查看是否成功
- [root@apps conf]#mycat restart 在mycat重启
- set global general_log=on; 开启 日志
通过通用日志确认实现读写分离
在mysql中查看通用日志
show variables like 'general_log'; #查看日志是否开启
set global general_log=on;; #开启日志功能 需要手动开启(徐开启)
show variables like 'general_log_file'; #查看日志文件保存位置
set global general_log_file='tmp/general.log'; #设置日志文件保存位置
MHA集群架构
虽然高可用但是不能保证数据完全不丢失
1. MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃
的master保存二进制日志事件(binlog events)
2. 识别含有最新更新的slave
3. 应用差异的中继日志(relay log)到其他的slave
4. 应用从master保存的二进制日志事件(binlog events)到所有slave节点
5. 提升一个slave为新的master
6. 使其他的slave连接新的master进行复制
7. 故障服务器自动被剔除集群(masterha_conf_host),将配置信息去掉
8. 旧的Master的 VIP 漂移到新的master上,用户应用就可以访问新的Master9. MHA是一次性的高可用性解决方案,Manager会自动退出
选举新的Master
如果设定权重(candidate_master=1),按照权重强制指定新主,但是默认情况下如果一个slave落后
master 二进制日志超过100M的relay logs,即使有权重,也会失效.如果设置check_repl_delay=0,
即使落后很多日志,也强制选择其为新主
如果从库数据之间有差异,最接近于Master的slave成为新主
如果所有从库数据都一致,按照配置文件顺序最前面的当新主
数据恢复
当主服务器的SSH还能连接,从库对比主库position 或者GTID号,将二进制日志保存至各个从节点并
且应用(执行save_binary_logs 实现)
当主服务器的SSH不能连接, 对比从库之间的relaylog的差异(执行apply_diff_relay_logs[实现])
注意:
为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL的半同步复制
在mycat上安装mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz和mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz两个包,需要在网上下倒过来用yum安装相关依赖包 在所有musql上安装
在管理节点上安装两个包mha4mysql-manager和mha4mysql-node
说明:
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm 只支持CentOS7上安装,不支持在CentOS8安
装,支持MySQL5.7和MySQL8.0 ,但和CentOS8版本上的Mariadb-10.3.17不兼容
mha4mysql-manager-0.56-0.el6.noarch.rpm 不支持CentOS 8,只支持CentOS7及以下版本
两个安装包
mha4mysql-manager
mha4mysql-node
#下载
https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.
范例: MHA的管理节点必须是CentOS7
[root@mha-manager ~]#yum -y install mha4mysql-manager-0.58-
0.el7.centos.noarch.rpm
[root@mha-manager ~]#yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
在所有节点实现相互之间 ssh key 验证 (脚本)
[root@mha-manager ~]#ssh-keygen
[root@mha-manager ~]#ssh-copy-id 127.0.0.1
[root@mha-manager ~]#rsync -av .ssh 10.0.0.8:/root/
[root@mha-manager ~]#rsync -av .ssh 10.0.0.18:/root/
[root@mha-manager ~]#rsync -av .ssh 10.0.0.28:/root/
PASS=centos1
#设置网段最后的地址,4-255之间,越小扫描越快
END=254
IP=`ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.
. /etc/os-release
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait
ssh-keygen -P "" -f /root/.ssh/id_rsa
if [ $ID = "centos" -o $ID = "rocky" ];then
rpm -q sshpass || yum -y install sshpass
else
dpkg -i sshpass &> /dev/null ||{ apt update; apt -y install sshpass; }
fi
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done
#把.ssh/known_hosts拷贝到所有主机,使它们第一次互相访问时不需要输入回车
for n in ${AliveIP[*]};do
scp /root/.ssh/known_hosts ${n}:.ssh/
done
在管理节点建立配置文件
注意: 此文件的行尾不要加空格等符号
[root@mha-manager ~]#mkdir /etc/mastermha/
[root@mha-manager ~]#vim /etc/mastermha/app1.cnf
[server default]
user=mhauser #用于远程连接MySQL所有节点的用户,需要有管理员的权限
password=123456
manager_workdir=/data/mastermha/app1/ #目录会自动生成,无需手动创建
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root #用于实现远程ssh基于KEY的连接,访问二进制日志
repl_user=repluser #主从复制的用户信息
repl_password=123456
ping_interval=1 #健康性检查的时间间隔,检查命令:SELECT 1 As Value
master_ip_failover_script=/usr/local/bin/master_ip_failover #切换VIP的perl脚本,不
支持跨网络,也可用Keepalived实现
report_script=/usr/local/bin/sendmail.sh #当执行报警脚本
check_repl_delay=0 #默认值为1,表示如果slave中从库落后主库relay log超过100M,主库不会选
择这个从库为新的master,因为这个从库进行恢复需要很长的时间.通过设置参数check_repl_delay=0,
mha触发主从切换时会忽略复制的延时,对于设置candidate_master=1的从库非常有用,这样确保这个从库
一定能成为最新的master
master_binlog_dir=/data/mysql/ #指定二进制日志存放的目录,mha4mysql-manager-0.58必须指
定,之前版本不需要指定
[server1]
hostname=10.0.0.8
port=3306
candidate_master=1
[server2]
hostname=10.0.0.18
port=3306
[server3]
hostname=10.0.0.28
port=3306
candidate_master=1 #设置为优先候选master,即使不是集群中事件最新的slave,也会优先当
master#最终文件内容
[root@mha-manager ~]#cat /etc/mastermha/app1.cnf
[server default]
user=mhauser
password=123456
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=123456
ping_interval=1
master_ip_failover_script=/usr/local/bin/master_ip_failover
report_script=/usr/local/bin/sendmail.sh
check_repl_delay=0
master_binlog_dir=/data/mysql/
[server1]
hostname=10.0.0.8
candidate_master=1
[server2]
hostname=10.0.0.18
candidate_master=1
[server3]
hostname=10.0.0.28
实现Master
[root@master ~]#dnf -y install mysql-server
[root@master ~]#mkdir /data/mysql/
[root@master ~]#chown mysql.mysql /data/mysql/
[root@master ~]#vim /etc/my.cnf
[mysqld]
server_id=1
log-bin=/data/mysql/mysql-bin 据
skip_name_resolve=1 拒绝反向解析
general_log #观察结果,非必须项,生产无需启用
[root@master ~]#systemctl enable --now mysqld
[root@master ~]#mysql
mysql>show master logs;
#如果是MySQL8.0执行下面操操作
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';
mysql> create user mhauser@'10.0.0.%' identified by '123456';
mysql> grant all on *.* to mhauser@'10.0.0.%';
#如果是MySQL8.0以前版本执行下面操操作
mysql>grant replication slave on *.* to repluser@'10.0.0.%' identified by
'123456';
mysql>grant all on *.* to mhauser@'10.0.0.%' identified by '123456';
#配置VIP
[root@master ~]#ifconfig eth0:1 10.0.0.100/24
[mysqld]
log-bin=/data/mysql/mysql-bin 拒绝反向解析(主节点)
skip_name_resolve=1
重启
sreate user mhauser@'10.0.0.%' identified by '123456'; 创建授权
mysql> grant replication slave on *.* to repluser@'10.0.0.%'