实验在RHEL7中做,因为9中缺少了一个关键的高可用组件
环境:两台数据库,内存和CPU要多一点
主流是MYSQL(开源),Oracle收费较贵
RHEL7中直接用make编译是有问题的,所以需要要gcc工具
做好前置准备:重新整理软件仓库,加入aliyun的地址源
用原来的数据源,可能仓库不够,下载不了
开始安装gcc
解压gcc.zip
进入目录并检查内容是否齐全
安装
检查版本
安装cmake3
解压缩安装包
进入目录并查看
安装mysql
检查安装包是否完整
解压并查看
直接编译可能会污染当前目录,所以新建一个目录来存放编译后
开始编译
#源码编译参数详解 [root@mysql_node1 mysql-8.3.0]# mkdir build #建立编译目录 [root@mysql_node1 mysql-8.3.0]# cmake3 .. \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #指定安装路径 -DMYSQL_DATADIR=/data/mysql \ #指定数据目录 -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \ #指定套接字文件 -DWITH_INNOBASE_STORAGE_ENGINE=1 \ #指定启用INNODB存储引擎,默认用myisam -DWITH_EXTRA_CHARSETS=all \ #扩展字符集 -DDEFAULT_CHARSET=utf8mb4 \ #指定默认字符集 -DDEFAULT_COLLATION=utf8mb4_unicode_ci \ #指定默认校验字符集 -DWITH_SSL=system \ #指定MySQL 使用系统已安装的 SSL 库 -DWITH_BOOST=bundled \ #指定使用 MySQL 源码包中内置的Boost库 -DWITH_DEBUG=OFF #源码编译命令
[root@mysql_node1 build]# make -j2 #-j2 表示有几个核心就跑几个进程
之前为什么给比较大的运行内存和多核,就是在这里
如果运行内存小了,在编译过程中就会造成内存溢出,会导致失败
make -j4
运行之后等待完成就行
编译好了之后就别动了
重新下载,Mysql8.3并不能支持实验
前面都是一样的,下载需要的编译软件
gcc和cmake3
把mysql3.0的包移入,解压并make安装
mysql 3.0编译内容
cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_SSL=system -DWITH_BOOST=/root/mysql-8.0.40/boost/boost_1_77_0/ -DWITH_DEBUG=OFF
新的主机双核cpu,4G内存就够用
后面的步骤都一样,等待安装完毕就行
网页下载mysql3.0的安装包的方法
编译过程决定安装路径
make && make install
编译之后会自动生成目录的
岁让此时有了bin目录,但是启动时还是不生效的,因为没有加入环境变量
编译时要求了存放数据的目录和用户,但是实际上是没有创建的
并且此时MySQL目录是由读和看的权限,没有执行权限
并且要使用,还要有初始化数据
复制启动脚本,但是无法启动,因为还没有初始化数据
[mysqld]
server-id=10
datadir=/data/mysql
socket=/data/mysql/mysql.sock
default_authentication_plugin=mysql_native_password
修改数据目录
做初始化
初始化完成后会有一个初始密码,千万别忘记了
列出系统中那些系统是启动的
做数据库的开启启动
直接登录什么也做不了,要先做安全初始化
重新输入密码
一路回车
现在就可以正常使用了
要重新删除下载的话,要先停止服务,再次删除
(第一台从数据库)mysqlb上的操作
关闭rhel7的图形
重启之后就关闭图形,直接用终端了
可以直接从mysqla中直接复制到mysqlb上
拷贝完整目录
复制启动文件
初始化,默认认证
启动mysql
修改数据库初始密码
MYSQL主从复制
数据很重要,有备份才无患
查看官方文档来学习主从复制
默认二进制日志是没有打开的,要在配置文件里修改,现在打开后会修改前缀
在主数据库上
在从数据库上
记得重启服务
此时查看日志前缀,改完之后就会从默认前缀变成mysql-bin
先做主数据库
在数据库中查看用户
用root来做并不好
我们需要新增一个用户
新增用户后一定要授权,刚刚新增的用户是谁就给谁授权
查看授权信息
查看日志情况(后面从数据库认证要用到)
在生产环境中,要做主从复制,先要把数据从主中拉取出来给从,让他们现在数据相同
但是现在是实验,没有数据在其中
从数据库
要把mastaer制定到哪里,用户ip,用户名,用户密码,日志文件名,日志id(这些都要和主数据库一样)
如果写错了,可以刷掉之前写的
打开服务的命令
查看是否开启的命令
Slave_IO_Running用来传输日志信息
Slave_SQL_Running用来回放日志信息
测试主从同步:
在从数据库上监控:watch -n 1 'mysql -uroot -plee -e "select * from lee.userlist;" 2>/dev/null'
要是想删掉这个error
在主数据库上中
此时从数据库上error就没了
在主数据库上
主从生效了的话,在主数据库上输入这个数据的时候,从数据库中立刻也要有接受反馈
在从数据库上
一主双从模式
再新加一台主机,这台主机要追平之前的主从,该怎么做?
先安装一台主机,步骤和之前一样
安装好之后
此时之前的实验中,主从里已经有数据了
先导出之前的数据
在主数据库上:mysqldump -uroot -plee lee > lee.sql
在导入到新主机里
在实际环境中在备份导出前要先锁库和锁表
要在lee库里恢复,没有库要新建
然后导入数据
查看是否导入成功
当数据拉平了,再做主从
确认清楚认证,确认是否有变化
在MySQLC中做认证,连上主数据库
开启服务并查看
一主两从的情况,在实际生产环境中,最好从数据库都只能读,只有主数据库来写数据
写入的数据大于读时主数据库多
读的数据大于写的时候从数据库多
gtid模式
用二进制日志,有一些缺点
如果是做了高可用,有一台主机挂了,需要选择一个新的master,要选一个与之前的主机数据差距最小的主机,现在的二进制日志是无法找到的
用gtid模式来做,唯一标识,每个主机都有一个固定的id,要选举时,直接比较就行
在master端的写入时多用户读写,在slave端的复制时单线程日志回放,所以slave端一定会延迟与master端
这种延迟在slave端的延迟可能会不一致,当master挂掉后slave接管,一般会挑选一个和master延迟日志最接近的充当新的master
那么为接管master的主机继续充当slave角色并会指向到新的master上,作为其slave
这时候按照之前的配置我们需要知道新的master上的pos的id,但是我们无法确定新的master和slave之间差多少
当激活GITD之后
当master出现问题后,slave2和master的数据最接近,会被作为新的master
slave1指向新的master,但是他不会去检测新的master的pos id,只需要继续读取自己gtid_next即可
实验:
停止从数据库(两个从都要做)
启动gtid模式(主从都做)
启动gtid模式 gtid——mode=on
必须保持强一致性 enforce-gtid-consistency=on
重启所有mysql服务
在主数据库上查看是否开启
在从数据库上,做gtid认证
慢查询日志
此时慢日志还未打开,查看log的状态是OFF
那此时在数据库中查找这个log,是不会被查找到
打开慢查询模式
此时再查看
测试:
此时查看日志就可以看到信息了
mysql的并行复制
谁要做日志传输和日志回放
默认情况下slave中使用的是sql单线程回放
在master中时多用户读写,如果使用sql单线程回放那么会造成组从延迟严重
开启MySQL的多线程回放可以解决上述问题
查看slave中的线程信息
在从数据库中
编写多线程
重新查看后,此时sql线程转化为协调线程,16个worker负责处理sql协调线程发送过来的处理请求
半同步模式
1.半同步模式原理
mysql的主备库通过binlog日志保持一致,主库本地执行完事务,binlog日志落盘后即返回给用户;备库通过拉取主库binlog日志来同步主库的操作。默认情况下,主库与备库并没有严格的同步,因此存在一定的概率备库与主库的数据是不对等的。半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。实现原理也很简单,主库本地执行完毕后,等待备库的响应消息(包含最新备库接收到的binlog(file,pos)),接收到备库响应消息后,再返回给用户,这样一个事务才算真正完成。在主库实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。
只在gtid模式下可用
核心是slave的通知机制,数据发送过来,slave会发ack来确认
在从中
在配置文件中写
但是没有插件,开不了
在主中
不要重启,没有插件,开不了
安装模块
查看是否安装好
加载完成之后,才可以启动
启动
产看模式是否开启
查看同步的信息,暂时还没有
在从中
和主中配置不一样
不要重启,没有加载插件
安装
查看是否安装
启动
产看是否开启
测试:
在从中,关闭线程在打开,刷新
两边都要查看
在主中
测试:
在200从中关闭接受日志的线程
在主中
关闭一台,半同步还在继续
此时关闭两个了
其实还是会传输,但是会在10秒后转变成异步
此时你再查看会发现,有两笔是半同步传输的,一笔是异步传输的
半同步自动关闭,转成异步
恢复一台就可以使ack恢复了
检查是否开启
主挂了,要怎么知道
主挂了,从要怎么转变成主
mysql高可用之MHA
工作原理:
会定期检测
master出现故障时,可以自动切换最新数据的slave为master
前提:一主两从的模式
环境:四台虚拟机
新增一台MHA的虚拟机
安装所有rpm
并且所有数据库都要安装node检测的软件,所以直接复制过去
三台数据库都要做
这里面是模版
将模版移动到新目录中
复制到是主体和对于主机控制的内容
ping_interval=3:做3次都失败了,就宣告这台master已经失效了
在编辑文件中写,master的设定用户是root
要查看是否能远程登录root
三台数据库都要做
建立能够远程登录的用户
这里设立的超级用户
对新增用户做授权
我们这里设定是超级管理员,所有的功能都要能做
在原先的master中有一个用于数据同步的用户lee
但是在第一台有可能变为主的从数据库中,是没有这个用户的,但是这个数据库是有变为主的可能性的
第一台从数据库还缺少一个变为主的条件,
这四台主机之间要实现免密,因为在切换时,要能直接切换,不受阻碍
检测当前架构免密是否成功
检测主从同步情况
master未出现故障手动切换
这个实验先把半同步关闭,试验完成后再打开
问要不要做切换要
master要不要从100切换到200
保持功能 要
同步中断了
排错过程
还不行
重做
删除之前所有的认证
日志还原
所有都:
组复制MGR
前面开启一个协议层,写东西时会先进入协议层,协议层会去询问数据库能不能做,如果超过两个以上回复不能做,就不能做(少数服从多数)
单主
多主
任何一个主机写入时,所有的数据库都会同步
所有的数据库服务都关闭
在配置文件中
禁止这些模式的存储机制
禁止二进制日志的校验
使用行日志格式
把mysql的文件都删掉
域名解析:
做初始化
完成后不要启动数据库
继续编辑编辑文件
对于插件来说是不能做初始化的,所以不能启动
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="172.25.254.30:33061"
group_replication_group_seeds="172.25.254.100:33061,172.25.254.200:33061,172.25.254.30:33061"
group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF
最后再启动
不要安全初始化,直接进入
修改超级用户密码,不然无法操作了
关闭日志,后面的操作不需要记录到日志中
创建用户
授权
把自己加入组中
手动打开组复制模式
打开服务,再关闭模式
查看组情况
加入后两台数据库到组中
第一台从
数据之间有差异
开之前,把这台主机里面之前所有的日志文件都刷新
再次查看组
recoe没好
测试呢能不能连
ping不同
要做域名解析
等待一段时间
此时再查看
第二台
继续上一步
再去查看,此时有三个
测试:
在主上建立数据库
在从上查看
在从上建表
在第二台从上看
在主上看
现在关闭一台数据库
还是能正常输入数据
此时两台都挂了
此时写了也不能进入磁盘
重新登录
不能自动上线,要手动开启
MHA
在主数据库上
先要开启gtid模式
执行它之前,一定要关闭mysql
等从数据库完成gtid模式后
在master端配置启用半同步模式
#安装半同步插件
查看插件情况
打开半同步功能
查看半同步功能状态
MYSQL开启时自动安装模块
在编辑文档里写
建立用于做数据同步的用户
这里是手动开启的
在从中
编辑文档
[mysqld]
server-id=200
datadir=/data/mysql
socket=/data/mysql/mysql.sock
default_authentication_plugin=mysql_native_password
log-bin=binlog
gtid_mode=ON
skip-name-resolve
binlog_format=ROW
enforce-gtid-consistency=ON
首先要做gtid模式
开启slave端的gtid
在主数据库完成半同步模式后
mysql> STOP SLAVE IO_THREAD; #重启io线程,半同步才能生效
Query OK, 0 rows affected (0.00 sec)mysql> START SLAVE IO_THREAD; ##重启io线程,半同步才能生效
Query OK, 0 rows affected (0.00 sec)
安装
在主服务器上也做:
MHA上:
在其他3台数据库
设定root远程登录功能
检测配置:
测试:
master未出现故障手动切换
masterha_master_switch --conf=/etc/mha/mha.cfg --master_state=alive --new_master_host=172.25.254.200 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
在从数据中看
之前:
现在:
master故障手动切换