一、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) : yDisallow root login remotely? (Press y|Y for Yes, any other key for No) : yRemove test database and access to it? (Press y|Y for Yes, any other key for No) : yReload 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%';