MySQL集群

一、Mysql 在服务器中的部署方法

1.1源码安装

下载依赖性

dnf install cmake gcc-c++ openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64

解压压缩包并安装

tar zxf mysql-boost-5.7.44.tar.gz

cd /root/mysql-5.7.44

cmake \
-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_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0/ #指定c++库依赖

编译安装

make && make install

1.2mysql初始化

创建用户

useradd -s /sbin/nologin -M mysql

创建数据目录

mkdir /data/mysql -p

修改所有者和组

chown mysql.mysql -R /data/mysql

生成启动脚本

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

生成配置文件

vim /etc/my.cnf

[mysqld]
datadir=/data/mysql              #指定数据目录
socket=/data/mysql/mysql.sock    #指定套接字
symbolic-links=0          #数据只能存放到数据目录中,禁止链接到数据目录

修改环境变量

vim ~/.bash_profile

刷新权限

source ~/.bash_profile

数据库初始化建立mysql基本数据

mysqld --initialize --user=mysql

初始密码

启动数据库

/etc/init.d/mysqld start

数据库开机启动

yum install chkconfig -y

chkconfig --list

chkconfig mysqld on

chkconfig --list

数据库安全初始化

mysql_secure_installation

Enter password for user root: #输入当前密码
输入之前的初始密码

The existing password for the user account root has expired. Please set a new password.
New password: #输入新密码
Re-enter new password: #重复密码

Press y|Y for Yes, any other key for No: no #是否启用密码插件

Change the password for root ? ((Press y|Y for Yes, any other key for No) : no   
#是否要重置密码

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

测试

二、mysql的组从复制

基本配置

配置mastesr

vim /etc/my.cnf

重启mysql

/etc/init.d/mysqld restart

进入数据库配置用户权限

mysql -predhat

配置salve

vim /etc/my.cnf

重启nginx

/etc/init.d/mysqld restart

进入mysql

mysql -predhat

这一行为master查询到的值

测试

mysql_1

mysql_2

SELECT * FROM AAAA.userlist;

在slave中查看到master同步过来的信息

当有数据时添加slave2

vim /etc/my.cnf

从master节点备份数据

mysqldump -uroot -predhat AAAA > AAAA.sql

生产环境中备份时需要锁表,保证备份前后的数据一致

mysql> FLUSH TABLES WITH READ LOCK;

备份后再解锁

mysql> UNLOCK TABLES;

mysqldump命令备份的数据文件,在还原时先DROP TABLE,需要合并数据时需要删除此语句

在生成的.sql文件中

DROP TABLE IF EXISTS `userlist`; #需要合并数据时需要删除此语句

将生成的.sql文件发送到node3中

node3

mysql -uroot -predhat -e "create database AAAA;" #创建AAAA

mysql -uroot -predhat AAAA < AAAA.sql #将AAAA.sql #导入到新建的AAAA库中

mysql -uroot -predhat -e "select * from AAAA.userlist;" #查询结果

配置slave功能

在master中查询日志pos

CHANGE MASTER TO MASTER_HOST='172.25.254.10',MASTER_USER='test',MASTER_PASSWORD='redhat', MASTER_LOG_R_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=1249;

start slave;

SHOW SLAVE STATUS\G;

三、Mysql高可用之组复制 (MGR)

MySQL Group Replication(简称 MGR )是 MySQL 官方于 2016 年 12 月推出的一个全新的高可用与高扩展的解决方案

组复制是 MySQL 5.7.17 版本出现的新特性,它提供了高可用、高扩展、高可靠的 MySQL 集群服务 MySQL 组复制分单主模式和多主模式,传统的mysql复制技术仅解决了数据同步的问题, MGR 对属于同一组的服务器自动进行协调。对于要提交的事务,组成员必须就全局事务序列中给定事务 的顺序达成一致

提交或回滚事务由每个服务器单独完成,但所有服务器都必须做出相同的决定

如果存在网络分区,导致成员无法达成事先定义的分割策略,则在解决此问题之前系统不会继续进行, 这是一种内置的自动裂脑保护机制

MGR由组通信系统( Group Communication System ,GCS ) 协议支持

该系统提供故障检测机制、组成员服务以及安全且有序的消息传递

组复制流程

首先我们将多个节点共同组成一个复制组,在执行读写(RW)事务的时候,需要通过一致性协议层(Consensus 层)的同意,也就是读写事务想要进行提交,必须要经过组里"大多数人"(对应 Node节点)的同意,大多数指的是同意的节点数量需要大于(N/2+1),这样才可以进行提交,而不是原发起方一个说了算。而针对只读(RO)事务则不需要经过组内同意,直接提交即可。

注意:节点数量不能超过9台

初始化

删除进程

rm -rf /data/mysql/*

配置mysql

vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=1 #配置server唯一标识号 disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" #禁用指定存储引擎
gtid_mode=ON #启用全局事件标识
enforce_gtid_consistency=ON #强制gtid一致
master_info_repository=TABLE #复制事件数据到表中而不记录在数据目录中
relay_log_info_repository=TABLE binlog_checksum=NONE #禁止对二进制日志校验
log_slave_updates=ON #打开数据库中继, #当slave中sql线程读取日志后也会写入到自己的binlog中
log_bin=binlog #重新指定log名称
binlog_format=ROW #使用行日志格式
plugin_load_add='group_replication.so' #加载组复制插件
transaction_write_set_extraction=XXHASH64 #把每个事件编码为加密散列
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #通知插件正 式加入 #或创建的组 名 #名称为 uuid格式
group_replication_start_on_boot=off #在server启动时不自动启动组复制
group_replication_local_address="172.25.254.10:33061" #指定插件接受其他成员的信息端 口 group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061" #本地地址允许访问成员列表
group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8" #主机白名单 #不随系统自启而启动,只在初始成员主机中手动开启, #需要在两种情况下做设定:1.初始化建组时 2.关闭并重新启动整个组时
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF #使用多主模式
group_replication_enforce_update_everywhere_checks=ON #组同步中有任何改变 检测更新
group_replication_allow_local_disjoint_gtids_join=1 #放弃自己信息以 master事件为主

初始化

mysqld --user=mysql --initialize

初始密码

重启mysql

systemctl restart mysqld

修改密码

alter user root@localhost identified by 'redhat';

配置mysql

主机

SET SQL_LOG_BIN=0;
CREATE USER test_user@'%' IDENTIFIED BY 'redhat';
GRANT REPLICATION SLAVE ON *.* TO test_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='test_user', MASTER_PASSWORD='redhat' FOR CHANNEL 'group_replication_recovery';
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;

server2

rm -fr /data/mysql/*

vim /etc/my.cnf

初始化

mysqld --user=mysql --initialize

重启mysql

systemctl restart mysqld

修改密码

alter user root@localhost identified by 'redhat';

配置mysql

SET SQL_LOG_BIN=0;
CREATE USER test2@'%' IDENTIFIED BY 'redhat';
GRANT REPLICATION SLAVE ON *.* TO test2@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='test_user', MASTER_PASSWORD='redhat' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;

server3

rm -fr /data/mysql/*
vim /etc/my.cnf


[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=3
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
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.10:33061,172.25.254.20: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
group_replication_enforce_update_everywhere_checks=ON
group_replication_allow_local_disjoint_gtids_join=1

初始化

mysqld --user=mysql --initialize

重启mysql

systemctl restart mysqld

修改密码

alter user root@localhost identified by 'redhat';

配置mysql

SET SQL_LOG_BIN=0;
CREATE USER test3@'%' IDENTIFIED BY 'redhat';
GRANT REPLICATION SLAVE ON *.* TO test3@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='test_user', MASTER_PASSWORD='redhat' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION;

验证

server1

server2

server1

三、mysql-router

MySQL Router 是一个对应用程序透明的InnoDB Cluster连接路由服务,提供负载均衡、应用连接故障转移和客户端路由。 利用路由器的连接路由特性,用户可以编写应用程序来连接到路由器,并令路由器使用相应的路由策略来处理连接,使其连接到正确的MySQL数据库服务器。

部署Mysql route

安装mysql-router

yum install mysql-router-community-8.4.0-1.el7.x86_64.rpm

配置mysql-router

vim /etc/mysqlrouter/mysqlrouter.conf

systemctl start mysqlrouter

建立测试用户

mysql> CREATE USER redhat@'%' IDENTIFIED BY 'redhat';

mysql> GRANT ALL ON *.* TO redhat@'%';

查看效果

四、MHA部署实施

搭建主两从架构

master

/etc/init.d/mysqld stop

rm -fr /data/mysql/*

vim /etc/my.cnf
[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

server-id=1

log-bin=mysql-bin

gtid_mode=ON

log_slave_updates=ON

enforce-gtid-consistency=ON

symbolic-links=0
初始化mysql

mysqld --user=mysql --initialize

启动mysql

/etc/init.d/mysqld start

修改密码

alter user root@localhost identified by 'redhat';

创建用户

CREATE USER 'test'@'%' IDENTIFIED BY 'redhat';

安装插件

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

启用插件

SET GLOBAL rpl_semi_sync_master_enabled = 1;

server2与server3

/etc/init.d/mysqld stop

rm -fr /data/mysql/*

vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server-id=2   #server2改为3
log-bin=mysql-bin
gtid_mode=ON
log_slave_updates=ON
enforce-gtid-consistency=ON
symbolic-links=0

初始化mysql

mysqld --user mysql --initialize

启动mysql

/etc/init.d/mysqld start

修改密码

alter user root@localhost identified by 'redhat';

绑定master

CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl', MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;

start slave;

安装插件

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

SET GLOBAL rpl_semi_sync_slave_enabled =1;

STOP SLAVE IO_THREAD;

START SLAVE IO_THREAD;

SHOW STATUS LIKE 'Rpl_semi_sync%';

相关推荐
QQVQQ...9 分钟前
Git常见操作
数据库·git
一 乐18 分钟前
点餐|基于java的电子点餐系统小程序(源码+数据库+文档)
java·开发语言·前端·数据库·小程序·论文
读心悦24 分钟前
vscode 链接数据库
数据库·ide·vscode
镭速33 分钟前
镭速如何高效使用SQLite数据库高速传输结构化数据文件传输
jvm·数据库·sqlite
酥暮沐1 小时前
MySQL基础作业五
数据库·mysql
喜欢猪猪1 小时前
系统架构师---介绍ER图
数据库
q567315232 小时前
Metacritic 网站中的游戏开发者和类型信息爬取
数据库·python·线性代数·游戏·sqlite
cong*2 小时前
数据库的实施过程分析
数据库·oracle
Navicat中国2 小时前
Navicat 17 新特性 | 聚焦 MongoDB
数据库·sql·mongodb·信息可视化·nosql数据库·navicat
不剪发的Tony老师2 小时前
MongoDB入门教程
数据库·mongodb