Linux运维新手的修炼手扎之第27天

mysql服务

1 主从复制

集群:多主机集群【复制】
负载过大解决方案:横向扩展[增加服务器节点分散负载]、纵向扩展[提升单机硬件性能]
复制工作原理:
前提:基础数据一样,主节点上有同步数据用的账号
主角色【二进制日志、binlog dump】、从角色【中继日志、IO线程、sql线程】

mysql架构:

主节点只要负责正常运行,保证有二进制日志可以被复制,为复制这项功能开启一个专门的用户赋予复制权限可以让从节点用此用户登录主节点来实现复制。

①创建存放二进制文件的目录[mkdir -pv /data/mysql/logbin],并基于mysql的运行方式赋予目录mysql的属主属组[chown -R mysql:mysql /data/mysql]
②修改mysql-server.conf配置文件,给自己添加server-id:标识自己主机身份的id(为了从节点准确找到自己);并在配置文件里指定自己二进制文件路径log_bin=/data/mysql/logbin/mysql-bin(mysql-bin是binlog文件的前缀)
③创建用于复制的用户[create user repluser@'10.0.0.%' identified by '123456';],并赋予他可以复制的权限[grant replication slave on *.* to repluser@'10.0.0.%';]

从节点是实现主从集群复制的主动方,做好一系列环境准备后,运行命令开启主从复制。

①环境准备:包括创建存放二进制文件的目录,修改mysql-server.conf等
②需要在主节点运行命令:show master status;查看从节点需要复制的二进制日志数据的开始位置
③从节点配置对接主节点的配置参数,配置完执行show slave status查看从节点是否根据配置参数找到了主节点
④如果show slave status的返回结果正确且Slave_IO_Running 和 Slave_SQL_Running 是两个No,说明主从已经配置好了,只是没有开启,接下来可以开启主从复制了:start slave

2 中间件实践

定位:通过数据库中间件减少程序端的复杂逻辑,让应用层更专注于业务
方案:mycat
核心配置文件:server.xml-定义用户权限、系统参数
schema.xml-定义逻辑库、分片规则、数据节点
3 高可用方案
mgr官方的解决方案【基础环境很重要,必须开启GTID gtid_mode=ON】

复制代码
实践:零数据一主一从实践[熟练]
1 环境准备:
主master-rocky10.0.0.12-mysql8.0.41
从slave-rocky10.0.0.15-mysql8.0.41
#rocky环境关闭selinux、firewalld
vim /etc/selinux/config
SELINUX=disabled
systemctl disable --now firewalld.service
reboot

2 主节点配置
(1)准备mysql环境
yum install mysql-server -y
(2)目录环境准备
#创建目录 
mkdir -pv /data/mysql/logbin
#修改属主属组 
chown -R mysql:mysql /data/mysql
(3)主节点mysql配置
#修改mysql配置文件
[root@rocky9-12 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld] #指定服务端配置
server-id=177 #指定server-id
log_bin=/data/mysql/logbin/mysql-bin #指定二进制文件路径
default_authentication_plugin=mysql_native_password # 避免出现认证问题
#重启mysql服务
systemctl restart mysqld
#查看二进制日志
ll /data/mysql/logbin
(4)登录到mysql确认效果
[root@rocky9-12 ~]# mysql
mysql> show master logs;
(5)创建账号并授权
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';(replication slave 是一种特殊的权限,用于允许从库(Slave)连接到主库(Master)并同步数据)
mysql> flush privileges;

3 从节点配置
(1)准备mysql环境
yum install mysql-server -y
(2)目录环境准备
#创建目录 
mkdir -pv /data/mysql/logbin
#修改属主属组 
chown -R mysql:mysql /data/mysql
(3)从节点mysql配置
#修改mysql配置文件
[root@rocky9-15 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=183 #指定server-id
read-only #只读模式
log-bin=/data/mysql/logbin/mysql-bin #指定二进制文件路径
default_authentication_plugin=mysql_native_password # 避免出现认证问题
#重启mysql服务
systemctl restart mysqld
#查看二进制日志
ll /data/mysql/logbin
(4)登录到mysql确认效果
[root@rocky9-12 ~]# mysql
mysql> show slave status;
此时从节点为空Empty set,......

4 从角色配置数据同步角色
#master主机确认数据效果
mysql> show master status;
结果显示-要同步的数据在mysql-bin.000002,数据位置在879
#查看从节点状态
mysql> show slave status;
此时从节点为空Empty set,......
#从节点上配置账号级别的主从同步
mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.12',MASTER_USER='repluser',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=849;
#查看从节点状态
mysql> show slave status\G;
结果显示-Slave_IO_Running 和 Slave_SQL_Running 是两个No,说明主从已经配置好了,只是没有启动而已

5 启动同步操作
#从节点启动slave
mysql> start slave;
#从节点再次查看状态,同步需要一段时间,不是说会立刻同步过来
mysql> show slave status\G;
结果显示-Slave_IO_State: Waiting for source to send event # 等待数据发送过来
                  Master_Host: 10.0.0.12
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60 #当从节点与主节点的连接中断时,每隔60秒尝试重新连接主节点
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 849 #主节点二进制日志大小
               Relay_Log_File: rocky9-relay-bin.000002 #中继日志发生了变化
                Relay_Log_Pos: 326
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes #线程都启动了
            Slave_SQL_Running: Yes #线程都启动了
              ......
        Seconds_Behind_Master: 0 #主从节点数据时间差,0表示己经完全同步
#从节点验证数据同步效果
mysql> select User,host from mysql.user;

6 数据同步测试
#主节点上写入数据,创建数据库,创建数据表,添加数据
mysql> create database db1;
mysql> use db1;
mysql> CREATE TABLE `student` (
       `id` int unsigned NOT NULL AUTO_INCREMENT,
       `name` varchar(20) NOT NULL,
       `age` tinyint unsigned DEFAULT NULL,
       `gender` enum('M','F') DEFAULT 'M',
       PRIMARY KEY (`id`)
     ) ENGINE=InnoDB;
mysql> insert into student (name,age,gender)values('user1',10,'M'),('user2',20,'F'),('user3',30,'M'); 
#在从节点查看数据,都同步过来了
mysql> show databases;
mysql> use db1;
mysql> show tables;
mysql> select * from student;

实践:有数据一主一从实践[熟练]
1 环境准备:
主master-rocky10.0.0.12-mysql8.0.41
从slave-rocky10.0.0.15-mysql8.0.41
目前master节点是有数据的,我们可以将从节点环境清空,从而实现,两者环境的不一致效果
#从节点环境清空[root@rocky9-15 ~]
systemctl stop mysqld
rm -rf /var/lib/mysql/* #删除MySQL数据库文件
rm -rf /data/mysql/logbin/* #删除MySQL二进制日志
systemctl start mysqld
#主节点重置二进制日志,如果从当前使用位置开始同步,则原有数据无法同步
mysql> reset master;
mysql> show master status;
结果显示-mysql-bin.000001,数据位置157

2 全量数据同步
#用全量备份的方式导出所有己有数据,并刷新二进制日志
[root@rocky9-12 ~]# mysqldump -A -F --source-data=1 --single-transcaction > all.sql 
(-A mysqldump备份MySQL服务器上的所有数据库;-F 在执行备份之前,MySQL服务器刷新并重置它的日志文件;--source-data=1的作用是,在导出数据的时候记录二进制位置;--single-transaction:mysqldump创建一个单独的事务来导出数据,从而不需要锁定表)
#确认效果
[root@rocky9-12 ~]# ll all.sql
#主节点确认日志效果,日志被刷新
mysql> show master status;
结果显示-mysql-bin.000002,数据位置157
#查看备份文件
[root@rocky9-12 ~]# more all.sql
......
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=157;  # 非注释的第一行
#同步文件到从主机
[root@rocky9-12 ~]# scp all.sql 10.0.0.15: (同步到远程主机 10.0.0.15的当前用户的家目录,如果当前用户是root,则路径为 /root/all.sql)

3 同步账号授权
#主节点创建账号并授权
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';
#确认效果
mysql> select user,host from mysql.user;

4 从节点配置
#配置文件定制
[root@rocky9-15 ~]# vim /etc/my.cnf.d/mysql-sever.cnf
[mysqld]
server-id=183
read-only
log-bin=/data/mysql/logbin/mysql-bin
default_authentication_plugin=mysql_native-password #避免出现认证问题
#修改备份文件
[root@rocky9-15 ~]# vim all.sql
...
# CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=157; 
# 将此句补全为如下样式
CHANGE MASTER TO
MASTER_HOST='10.0.0.12',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=157;
#从节点加载语句
mysql> set sql_log_bin=0;(因为是导数据,所以需要关闭二进制日志,否则可能会导致当从节点作为其他实例的主节点时,这些SQL会再次传回主节点,导致数据重复执行,如同一条INSERT被执行两次,导致数据出现混乱)
#开始导入数据
mysql> source /root/all.sql
#检查主从状态
mysql> show slave status\G;
结果显示-Slave_IO_Running: No Slave_SQL_Running: No# 主从环境导入成功

5 启动同步操作
#从节点启动slave
mysql> start slave;
#从节点再次查看状态
mysql> show slave status\G;
结果显示-Slave_IO_State: Waiting for source to send event
                  Master_Host: 10.0.0.12
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 157
               Relay_Log_File: rocky9-relay-bin.000002
                Relay_Log_Pos: 326
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes # 主从环境恢复了
            Slave_SQL_Running: Yes
            ......
#从节点恢复二进制日志
mysql> set @@sql_log_bin=1;
#查询
mysql> use db1;
mysql> select * from student;

6 数据同步测试
#主节点新增数据
mysql> insert into student (name,age,gender)values('user4',40,'M');
#从节点确认效果
mysql> select * from student;