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%';

相关推荐
广州智造3 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥6 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸8 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1238 小时前
Redis解析
数据库·redis·缓存
数据库幼崽8 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd8 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou9 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh9 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵11 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多11 小时前
Linux——mysql主从复制与读写分离
数据库·mysql