Mysql集群技术

实验在RHEL7中做,因为9中缺少了一个关键的高可用组件

环境:两台数据库,内存和CPU要多一点

主流是MYSQL(开源),Oracle收费较贵

RHEL7中直接用make编译是有问题的,所以需要要gcc工具

做好前置准备:重新整理软件仓库,加入aliyun的地址源

用原来的数据源,可能仓库不够,下载不了

开始安装gcc

解压gcc.zip

进入目录并检查内容是否齐全

安装

检查版本

安装cmake3

解压缩安装包

进入目录并查看

安装mysql

检查安装包是否完整

解压并查看

直接编译可能会污染当前目录,所以新建一个目录来存放编译后

开始编译

bash 复制代码
#源码编译参数详解
[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安装

R 复制代码
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故障手动切换

相关推荐
掘根2 小时前
【MySQL集群架构与实践5】使用Docker实现水平分片
mysql·docker·架构
TTBIGDATA2 小时前
【支持Ubuntu22】Ambari3.0.0+Bigtop3.2.0——Step7—Mariadb初始化
数据库·ambari·hdp·mariadb·bigtop·ttbigdata·hidataplus
大得3692 小时前
django的数据库原生操作sql
数据库·sql·django
tuokuac2 小时前
SQL中的HAVING用法
数据库·sql
爬山算法2 小时前
MySQL(173)MySQL中的存储过程和函数有什么区别?
数据库·mysql
jnrjian2 小时前
利用trigger对大表在线同步 UDI
数据库·sql
lifallen3 小时前
深入解析RocksDB的MVCC和LSM Tree level
大数据·数据结构·数据库·c++·lsm-tree·lsm tree
追逐时光者3 小时前
一款免费、简单、高效的在线数据库设计工具
数据库
ldj20204 小时前
CentOS上部署Redis及其哨兵(Sentinel)模式
数据库·redis·缓存