当前位置: 首页 > news >正文

服务器的Mysql 集群技术

Mysql 集群技术

Mysql 在服务器中的部署方法

    在企业中90%的服务器操作系统均为Linux

    在企业中对于Mysql的安装通常用源码编译的方式来进行

Rhel7部署数据库 

  注意:用rhel 7 版本】

所有mysql ]# yum install -y git bison openssl-devel ncurses-devel -y

# unzip gcc-11.zip

# cd gcc-11/

# yum install *.rpm -y

# source /opt/rh/devtoolset-11/enable

# gcc --version

# cat /opt/rh/devtoolset-11/enable >> ~/.bash_profile

# gcc -v

# vim /etc/yum.repos.d/rhel7.repo

# tar zxf cmake3.tar.gz

# cd make3/

# rpm -ivh *.rpm --nodeps --force

# cmake3 --version

源码编译安装mysql

# cd /mnt/

# du -sh mysql-boost-8.0.40.tar.gz

# tar zxf mysql-boost-8.0.40.tar.gz

# cd mysql-8.0.40/

# mkdir -p build

# cd build/

#  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 -DWITH_SSL=system -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_DEBUG=OFF  -DWITH_BOOST=/mnt/mysql-8.0.40/boost/boost_1_77_0/

# make -j4

# make install

# du -sh /usr/local/mysql

部署mysql

mysqlA ]# cd /usr/local/mysql/support-files/

# cp -p mysql.server /etc/init.d/mysqld

# vim ~/.bash_profile

# source ~/.bash_profile

# mysql --version

# systemctl disable --now firewalld.service         【关火墙】

# useradd -M -s /sbin/nologin mysql

# mkdir -p /data/mysql/

# chown mysql.mysql /data/mysql/

# vim /etc/my.cnf       【MySQL 的主配置文件

    [mysqld]

    server-id=10               #设置服务器唯一标识

    datadir=/data/mysql             #指定数据目录

    socket=/data/mysql/mysql.sock    #指定套接字

    default_authentication_plugin=mysql_native_password    #设置默认认证插件

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

# mysqld --initialize --user=mysql      【初始化 MySQL 数据目录

# /etc/init.d/mysqld start      【启动 MySQL 服务

# chkconfig mysqld on      【 设置 MySQL 开机自启

# mysql_secure_installation     【数据库安全初始化】

# mysql -uroot -plee

mysql> SHOW DATABASES;

mysql编译复制

mysqlB ]# scp -r root@172.25.254.10:/usr/local/mysql/ /usr/local/        【复制内容】

# useradd -M -s /sbin/nologin mysql

# mkdir -p /data/mysql/

# chown mysql.mysql /data/mysql/

# /usr/local/mysql/bin/mysqld --initialize --user=mysql

# vim /etc/my.cnf       【MySQL 的主配置文件

# cd /usr/local/mysql/support-files/

# cp -p mysql.server /etc/init.d/mysqld

# /etc/init.d/mysqld start

# chkconfig mysqld on

# mysql_secure_installation     【数据库安全初始化,相同的配置】

mysql的组从复制

mysqlA ]# vim /etc/my.cnf

    log-bin=mysql-bin    #添加内容,启用binlog,生成日志文件

# /etc/init.d/mysqld restart

# mysql -plee

mysql> CREATE USER lee@'%' IDENTIFIED WITH caching_sha2_password BY 'lee';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'lee'@'%';       #对这个用户进行授权

mysql> show grants for lee@'%';

mysql> SHOW MASTER STATUS;              #查看信息

# cd /data/mysql/

# mysqlbinlog mysql-bin.000001 -vv      【查看日志文件】

配置salve1

mysqlB ]# vim /etc/my.cnf       【MySQL 的主配置文件

# /etc/init.d/mysqld start

# mysql -plee

mysql>CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='lee', MASTER_PASSWORD='lee', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=691;

mysql> SELECT @@server_uuid;

mysql>start slave;

#如果上述内容输入错误可以reset重新填入信息即可

mysql> RESET SLAVE ALL;

mysqlA ]# mysql -plee

mysql> CREATE DATABASE lee;

> CREATE TABLE lee.userlist ( username varchar(20) not null, password varchar(50) not null );

> INSERT INTO lee.userlist VALUE ('lee','123');

> SELECT * FROM lee.userlist;

mysqlB ]# mysql -plee

mysql> SELECT * FROM lee.userlist;

当有数据时添加slave2

# scp -r /usr/local/mysql root@172.25.254.30:/usr/local/mysql

# vim /etc/my.cnf       【MySQL 的主配置文件

# /etc/init.d/mysqld restart

mysqlb ]# mysqldump -uroot -plee lee > /mnt/lee.sql        【数据备份】

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

mysql> FLUSH TABLES WITH READ LOCK;

备份后再解锁

mysql> UNLOCK TABLES;

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

mysqlc ]# scp -r root@172.25.254.10:/mnt/lee.sql /mnt/

# mysql -uroot -plee -e "create database lee;"

# mysql -uroot -p lee < /mnt/lee.sql

# mysql -uroot -plee -e "select * from lee.userlist;"

mysql> SELECT * FROM lee.userlist;

配置slave2的slave功能

mysqla ]# mysql -uroot -plee -e "SHOW MASTER STATUS;"

mysqlc ]# mysql -uroot -plee

mysql> CHANGE REPLICATION SOURCE TO SOURCE_HOST='172.25.254.10', SOURCE_USER='lee', SOURCE_PASSWORD='lee',SOURCE_LOG_FILE='mysql-bin.000002',SOURCE_LOG_POS=872, SOURCE_SSL=0,GET_SOURCE_PUBLIC_KEY=1;

mysql> start slave;

mysql> SELECT * FROM lee.userlist;

mysql> SHOW SLAVE STATUS\G;

mysqla ]# mysql -uroot -plee -e "INSERT INTO lee.userlist VALUES('user3','123');"

mysqlc ]# mysql -uroot -plee -e 'select * from lee.userlist;'

慢查询日志

    慢查询,顾名思义,执行很慢的查询

    当执行SQL超过long_query_time参数设定的时间阈值(默认10s)时,就被认为是慢查询,这个SQL语句就是需要优化的

    慢查询被记录在慢查询日志里

    慢查询日志默认是不开启的

    如果需要优化SQL语句,开启这功能,它可以让你很容易地知道哪些语句是需要优化的。

> SHOW variables like "slow%";

开启慢查询日志

> SET GLOBAL slow_query_log=ON;

> SET long_query_time=4;

> SHOW VARIABLES like "long%";

> SHOW VARIABLES like "slow%";

测试慢查询

> select sleep (6);

# cat /data/mysql/mysqla-slow.log     【慢查询日志】

mysql的并行复制

查看slave中的线程信息

mysqlb ~]  > show processlist;

默认情况下slave中使用的是sql单线程回放

master中时多用户读写,如果使用sql单线程回放那么会造成组从延迟严重

开启MySQL的多线程回放可以解决上述问题

# vim /etc/my.cnf

slave-parallel-type=LOGICAL_CLOCK     #基于组提交,

slave-parallel-workers=6           #开启线程数量

relay_log_recovery=ON                #日志回放恢复功能开启

# /etc/init.d/mysqld restart

> show processlist;   ## 查看结果:

三个线程

    实际上主从同步的原理就是基于 binlog 进行数据同步的。在主从复制过程中,会基于3 个线程来操作,一个主库线程,两个从库线程。

        二进制日志转储线程(Binlog dump thread)是一个主库线程。当从库线程连接的时候, 主库可以将二进制日志发送给从库,当主库读取事件(Event)的时候,会在 Binlog 上加锁,读取完成之后,再将锁释放掉。

        从库 I/O 线程会连接到主库,向主库发送请求更新 Binlog。这时从库的 I/O 线程就可以读取到主库的二进制日志转储线程发送的 Binlog 更新部分,并且拷贝到本地的中继日志 (Relay log)。

        从库 SQL 线程会读取从库中的中继日志,并且执行日志中的事件,将从库中的数据与主库保持同步。

复制三步骤

步骤1Master将写操作记录到二进制日志(binlog)。

步骤2SlaveMasterbinary log events拷贝到它的中继日志(relay log);

    步骤3Slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的,而且重启后从接入点开始复制。

具体操作

    1.slaves端中设置了master端的ip,用户,日志,和日志的Position,通过这些信息取得master的认证及信息

    2.master端在设定好binlog启动后会开启binlog dump的线程

    3.master端的binlog dump把二进制的更新发送到slave端的

    4.slave端开启两个线程,一个是I/O线程,一个是sql线程,

        i/o线程用于接收master端的二进制日志,此线程会在本地打开relaylog中继日志,并且保存到本地磁盘

        sql线程读取本地relog中继日志进行回放

    5.什么时候我们需要多个slave

        当读取的而操作远远高与写操作时。我们采用一主多从架构

        数据库外层接入负载均衡层并搭配高可用机制

架构缺陷

    主从架构采用的是异步机制

    master更新完成后直接发送二进制日志到slave,但是slaves是否真正保存了数据master端不会检测master端直接保存二进制日志到磁盘

    当master端到slave端的网络出现问题时或者master端直接挂掉,二进制日志可能根本没有到达slave master出现问题slave端接管master,这个过程中数据就丢失了

    这样的问题出现就无法达到数据的强一致性,零数据丢失

半同步模式

1.用户线程写入完成后master中的dump会把日志推送到slave

2.slave中的io线程接收后保存到relaylog中继日志

3.保存完成后slavemaster端返回ack

4.在未接受到slaveackmaster端时不做提交的,一直处于等待当收到ack后提交到存储引擎

5.5.6版本中用到的after_commit模式时先提交在等待ack返回后输出ok

gtid模式

当为启用gtid时我们要考虑的问题

    在master端的写入时多用户读写,在slave端的复制时单线程日志回放,所以slave端一定会延迟与master

    这种延迟在slave端的延迟可能会不一致,当master挂掉后slave接管,一般会挑选一个和master延迟日志最接近的充当新的master

    那么为接管master的主机继续充当slave角色并会指向到新的master上,作为其slave

    这时候按照之前的配置我们需要知道新的master上的posid,但是我们无法确定新的masterslave之间差多少

mysqla ]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

server-id=10 

log-bin=mysql-bin

gtid_mode=ON

enforce-gtid-consistency=ON

# mysql -uroot -plee

> SHOW VARIABLES LIKE '%gtid%';

> CREATE DATABASE gtid_test;

> USE gtid_test;

> CREATE TABLE test_table(id INT);

> INSERT INTO test_table VALUES(1);

> SHOW MASTER STATUS;

> SELECT * FROM mysql.gtid_executed;

mysqlb ]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

socket=/data/mysql/mysql.sock

server-id=20 

log-bin=mysql-bin

gtid_mode=ON

enforce-gtid-consistency=ON

# mysql -uroot -plee

> stop slave;

> RESET SLAVE ALL;

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

> START SLAVE;

> SHOW SLAVE STATUS\G

启用半同步模式

在master端配置启用半同步模式

mysqla ]# vim /etc/my.cnf

    rpl_semi_sync_master_enabled=1     #开启主库半同步功能

# mysql -p lee

> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';   ##配置半同步

> show plugins;    ##查看半同步

> SET GLOBAL rpl_semi_sync_master_enabled = 1;   ##设定全局配置

> SHOW VARIABLES LIKE 'rpl_semi_sync%';   ##查看半同步状态

> SHOW STATUS LIKE 'Rpl_semi_sync%';      ##查看同步

在slave端开启半同步功能

mysql (b和c) ]# vim /etc/my.cnf

    rpl_semi_sync_selave_enabled=1      #开启从库半同步功能

# mysql -plee

> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

> SET GLOBAL rpl_semi_sync_slave_enabled =1;

> SHOW VARIABLES LIKE 'rpl_semi_sync%';

> STOP SLAVE IO_THREAD;       #重启io线程,半同步才能生效

> START SLAVE IO_THREAD;       ##重启io线程,半同步才能生效

> SHOW STATUS LIKE 'Rpl_semi_sync%';     ##查看半同步是否开启

> SHOW SLAVE STATUS\G       ##查看同步

测试在master端写入数据

mysqla ]# mysql -plee

> insert into lee.userlist values ('user4','123');   ##输入内容

> SHOW STATUS LIKE 'Rpl_semi_sync%';      ##查看状态

模拟故障

mysql (b和c) ]# mysql -plee

> STOP SLAVE IO_THREAD;

> insert into lee.userlist values ('user5','555');

> SHOW STATUS LIKE 'Rpl_semi%';

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)事务则不需要经过组内同意,直接 提交 即可

组复制单主和多主模式

single-primary mode(单写或单主模式)

    单写模式 group 内只有一台节点可写可读,其他节点只可以读。当主服务器失败时,会自动选择新的主服务器

multi-primary mode(多写或多主模式)

    组内的所有机器都是 primary 节点,同时可以进行读写操作,并且数据是最终一致的。

实现mysql组复制

    为了避免出错,在所有节点中从新生成数据库数据

编辑主配置文件

所有mysql ]# vim /etc/hosts

mysqla ]# rm -fr /data/mysql/

# vim /etc/my.cnf

[mysqld]

server-id=10

datadir=/data/mysql

socket=/data/mysql/mysql.sock

default_authentication_plugin=mysql_native_password

log-bin=mysql-bin

gtid_mode=ON

enforce-gtid-consistency=ON

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" #禁用指定存储引擎

binlog_checksum=NONE    #禁止对二进制日志校验

log_slave_updates=ON    #打开数据库中继,

binlog_format=ROW       #使用行日志格式

transaction_write_set_extraction=XXHASH64     #把每个事件编码为加密散列

# mysqld --user=mysql --initialize

# vim /etc/my.cnf

##添加内容

plugin_load_add='group_replication.so' #加载组复制插件

group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" #通知插件正式加入

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"    #主机白名单

group_replication_bootstrap_group=off        #不随系统自启而启动

group_replication_single_primary_mode=OFF    #使用多主模式

group_replication_enforce_update_everywhere_checks=ON   #组同步中有任何改变检测更新

# /etc/init.d/mysqld start

# mysql -uroot -p'初始化的密码'

> ALTER USER 'root'@'localhost' IDENTIFIED BY 'lee';     ##更改密码

> FLUSH PRIVILEGES;

> SET SQL_LOG_BIN=0;

> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';

> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

> GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%';

> GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';

> GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%';

> FLUSH PRIVILEGES;

> SET SQL_LOG_BIN=1;

> reset master;

> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='lee' FOR CHANNEL 'group_replication_recovery';    

> SET GLOBAL group_replication_bootstrap_group=ON;

> START GROUP_REPLICATION USER='rpl_user', PASSWORD='lee';

> SET GLOBAL group_replication_bootstrap_group=OFF;

> SELECT * FROM performance_schema.replication_group_members;

mysql (b和c) ]# rm -fr /data/mysql/

# vim /etc/my.cnf

    ##和mysqla相同配置,这个也一样 server-id=10

# mysqld --user=mysql --initialize

# vim /etc/my.cnf

    group_replication_local_address="172.25.254.20:33061"    #这个不同其余相同,

# /etc/init.d/mysqld start

# mysql -uroot -p'初始化的密码'

> ALTER USER 'root'@'localhost' IDENTIFIED BY 'lee';     ##更改密码

> FLUSH PRIVILEGES;

> SET SQL_LOG_BIN=0;

> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';

> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

> GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%';

> GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';

> GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%';

> FLUSH PRIVILEGES;

> SET SQL_LOG_BIN=1;

> reset master;

> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='lee' FOR CHANNEL 'group_replication_recovery';

> START GROUP_REPLICATION USER='rpl_user', PASSWORD='lee';

> SELECT * FROM performance_schema.replication_group_members;

mysqla ]# mysql -plee

> CREATE DATABASE lee;

> CREATE TABLE lee.userlist( username VARCHAR(10) PRIMARY KEY NOT NULL, password VARCHAR(50) NOT NULL );

> INSERT INTO lee.userlist VALUES ('user1','111');

> SELECT * FROM lee.userlist;

mysqla ]# mysql -plee

> INSERT INTO lee.userlist values ('user2','222');

> select * from lee.userlist;

mysql高可用之MHA

什么是 MHA

    MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。

    MHA 的出现就是解决MySQL 单点的问题。

    MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。

    MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

MHA 的组成

    MHA由两部分组成:MHAManager (管理节点) MHA Node (数据库节点),

    MHA Manager 可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave 节点上。

    MHA Manager 会定时探测集群中的 master 节点。

     master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master, 然后将所有其他的slave 重新指向新的 master

MHA 的特点

    自动故障切换过程中MHA从主机主服务器保存二进制日志最大程度保证数据不丢失

    使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性

    目前MHA支持一主多从架构,最少三台服务,即一主两从

故障切换备选主库的算法

1.一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于masterslave,成为备选主。

2.数据一致的情况下,按照配置文件顺序,选择备选主库。

3.设定有权重(candidate_master=1),按照权重强制指定备选主。

 1)默认情况下如果一个slave落后master 100Mrelay logs的话,即使有权重也会失效。

 2)如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。MHA

工作原理

    目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群必须最少有3台数据库服务器,

    一主二从,即一台充当Master,台充当备用Master,另一台充当从库。

    MHA Node 运行在每台 MySQL 服务器上

    MHAManager 会定时探测集群中的master 节点

    master 出现故障时,它可以自动将最新数据的slave 提升为新的master

    然后将所有其他的slave 重新指向新的masterVIP自动漂移到新的master

    整个故障转移过程对应用程序完全透明。

MHA部署实施

搭建主两从架构

所有数据库 ~]# /etc/init.d/mysqld status      【查看数据库开启】

> SHOW SLAVE STATUS\G;

mha ~]# unzip MHA-7.zip

MHA-7]# ls

# yum install *.rpm -y

# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.10:/mnt

# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.20:/mnt

# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm root@172.25.254.30:/mnt

在软件中包含的工具包介绍

Manager工具包主要包括以下几个工具:

    masterha_check_ssh #检查MHASSH配置状况

    masterha_check_repl #检查MySQL复制状况

    masterha_manger #启动MHA

    masterha_check_status #检测当前MHA运行状态

    masterha_master_monitor #检测master是否宕机

    masterha_master_switch #控制故障转移(自动或者手动)

    masterha_conf_host #添加或删除配置的server信息

Node工具包 (通常由masterHA主机直接调用,无需人为执行)

    save_binary_logs     #保存和复制master的二进制日志

    apply_diff_relay_logs  #识别差异的中继日志事件并将其差异的事件应用于其他的slave

    filter_mysqlbinlog     #去除不必要的ROLLBACK事件(MHA已不再使用这个工具)

purge_relay_logs      #清除中继日志(不会阻塞SQL线程)

环境配置

mha ~]# ssh-keygen       【创建密钥】

# ssh-copy-id root@172.25.254.( 10 ~ 30 )    【免密认证】

# scp /root/.ssh/id_rsa root@172.25.254.( 10 ~ 30 ):/root/.ssh/

# masterha_manager --help    【查看配置目录和配置文件】

# mkdir /etc/masterha

# tar zxf mha4mysql-manager-0.58.tar.gz

# cd mha4mysql-manager-0.58/samples/conf/

# cat masterha_default.cnf app1.cnf > /etc/masterha/app1.conf

# vim /etc/masterha/app1.conf

[server default]

user=root #mysql管理员用户,因为需要做自动化配置

password=lee #mysql密码

ssh_user=root  #ssh远程登陆用户

repl_user=repl #mysql主从复制中负责认证的用户

repl_password=lee  #mysql主从复制中负责认证的用户密码

master_binlog_dir=/data/mysql # mysqla 二进制日志目录

remote_workdir=/data/masterha/app1 # mha的远程目录

manager_workdir=/etc/masterha/app1 # mha的工作目录

manager_log=/var/log/masterha/manager.log   # mha日志

ping_interval=3 #每隔3秒检测一次

secondary_check_script=masterha_secondary_check -s 172.25.254.10 -s 172.25.254.11

[server1]

hostname=172.25.254.10

candidate_master=1      # 主库配置

check_repl_delay=0 ##默认情况下如果一个slave落后master 100M的relay logs的话MHA将不会选择该slave作为一个新的master,因为对这个slave的恢复需要花费很长时间

                        #通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时

                        #这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master

[server2]

hostname=172.25.254.20

candidate_master=1 # 可能作为主库master的主机

check_repl_delay=0

[server3]

hostname=172.25.254.30

no_master=1 #不作为master的主机

所有数据库 ~]# yum install /mnt/mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y

> SELECT User, Host FROM mysql.user WHERE User='lee';

> SHOW GRANTS FOR 'lee'@'%';

mha ~]# masterha_check_ssh --conf=/etc/masterha/app1.conf

# masterha_check_repl --conf=/etc/masterha/app1.conf

所有数据库 ~]> GRANT ALL ON *.* TO root@'%' identified by 'lee';     ##允许root远程登陆

mha ~]# mysql -uroot -plee -h172.25.254.10 -e "SHOW DATABASES"

MHA的故障切换

MHA的故障切换过程共包括以下的步骤:

    1.配置文件检查阶段,这个阶段会检查整个集群配置文件配置

    2.宕机的master处理,这个阶段包括虚拟ip摘除操作,主机关机操作

    3.复制dead master和最新slave相差的relay log,并保存到MHA Manger具体的目录下

    4.识别含有最新更新的slave

    5.应用从master保存的二进制日志事件(binlog events

    6.提升一个slave为新的master进行复制

    7.使其他的slave连接新的master进行复制

master未出现故障手动切换

# masterha_check_repl --conf=/etc/masterha/app1.conf      【这个和下面的都不能报错】

# masterha_check_ssh --conf=/etc/masterha/app1.conf 

mha ~]# masterha_master_switch --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=172.25.254.10 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

mysqla ~]> SHOW SLAVE STATUS\G;

master故障手动切换

mysqla ~]# /etc/init.d/mysqld stop

# masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.conf --dead_master_host=172.25.254.10 --dead_master_port=3306 --new_master_host=172.25.254.20 --new_master_port=3306 --ignore_last_failover

恢复故障mysql节点

# /etc/init.d/mysqld start

# mysql -plee

> CHANGE MASTER TO MASTER_HOST='172.25.254.20', MASTER_USER='lee', MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;

> start slave;

> SHOW SLAVE STATUS\G;

自动切换

# cd /etc/masterha/

# rm -fr app1.failover.complete 删掉切换锁文件】  

    监控程序通过指定配置文件监控master状态,当master出问题后自动切换并退出避免重复做故障切换

# masterha_manager --conf=/etc/masterha/app1.conf

mysqlb ~]# /etc/init.d/mysqld stop

mysqlc ~]> SHOW SLAVE STATUS\G;

恢复故障节点

# /etc/init.d/mysqld start

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

> start slave;

> SHOW SLAVE STATUS\G;

清除锁文件

# rm -rf app1.failover.complete manager.log

为MHA添加VIP功能

mha ~]# ls ma*

# cp master_ip_failover master_ip_online_change /usr/local/bin/

# chmod +x /usr/local/bin/master_ip_*

# vim /etc/masterha/app1.conf

# masterha_manager --conf=/etc/masterha/app1.conf

mysqla ~]# ip a a 172.25.254.200/24 dev eth0

模拟故障

mysqla ~]# /etc/init.d/mysqld stop

# cat manager.log

恢复故障主机

mysqla ~]# /etc/init.d/mysqld start

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

> start slave;

> SHOW SLAVE STATUS\G;

mha ~]# rm -rf app1.failover.complete manager.log

手动切换后查看vip变化

【手动切换要先删除锁文件 # rm -rf app1.failover.complete manager.log 

mha ~]# masterha_master_switch --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=172.25.254.10 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

mysqla ~]# mysql -plee

> SHOW SLAVE STATUS\G;

# ip a

mha ~]# ping 172.25.254.200

mysql-router(mysql路由)

MySQL Router

    是一个对应用程序透明的InnoDB Cluster连接路由服务,提供负载均衡、应用连接故障转移和客户端路由。

    利用路由器的连接路由特性,用户可以编写应用程序来连接到路由器,并令路由器使用相应的路由策略来处理连接,使其连接到正确的MySQL数据库服务器

Mysql route的部署方式

    我们需要在所有的数据库主机之外再开一台主机mysql-router(可以是MHA)

mha ~]# yum install mysql-router-community-8.4.0-1.el7.x86_64.rpm -y

# vim /etc/mysqlrouter/mysqlrouter.conf       【更改主配置文件】

# systemctl start mysqlrouter.service

# netstat -antlupe | grep mysql       【查看端口】

# mysql -ulee -plee -h 172.25.254.100 -P 7001    【访问负载调度的】

> select @@server_id;    【检测查看】

# mysql -ulee -plee -h 172.25.254.100 -P 7002    【访问访问指定的】

> select @@server_id;

http://www.dtcms.com/a/314161.html

相关文章:

  • IDA9.1使用技巧(安装、中文字符串显示、IDA MCP服务器详细部署和MCP API函数修改开发经验)
  • 主要 bug/问题 以及 修改建议:
  • 【Linux】System V - 基于建造者模式的信号量
  • Go语言流式输出技术实现-服务器推送事件(Server-Sent Events, SSE)
  • Git 与 GitHub 协作
  • BackgroundTasks 如何巧妙驾驭多任务并发?
  • 9. Linux 交换空间管理
  • [GESP202306 四级] 2023年6月GESP C++四级上机题超详细题解,附带讲解视频!
  • 事件(二)实战案例
  • Do-Calculus:因果推断的演算基础与跨领域应用
  • 17.6 超拟人大模型CharacterGLM技术解析:92.7%角色一致性+虚拟偶像互动提升300%,如何吊打GPT-4?
  • Maya 2024安装指南及安装包下载
  • UILabel设置字重
  • Coze Loop:开源智能体自动化流程编排平台原理与实践
  • Ethereum: 深度解析Web3世界的合规之门, ERC-1400证券型代币标准
  • Oracle ASH的手册
  • Linux定制篇-Tomcat的安装和配置
  • Druid学习笔记 03、Druid的AstNode类详解与其他产品测试体验
  • 【精品项目】进阶版贪吃蛇:现代Web技术打造的经典游戏重生
  • 从零认识OpenFlow
  • TCP为什么采用三次握手而不是二次握手
  • 使用 Marian 进行机器翻译详解及对应案例
  • 在安卓中使用 FFmpegKit 剪切视频并添加文字水印
  • Android进程基础:Zygote
  • (JAVA)自建应用调用企业微信API接口,设置企业可信IP
  • 开疆智能ModbusTCP转Profient网关连接ER机器人配置案例
  • DPDK中的TCP头部处理
  • 第五篇: 深入解析基于 SQLAlchemy 的聊天记录持久化模块:`message_model` 与数据库操作封装
  • 高速信号设计之 PCIe6.0 篇
  • Windows中Idea或者其他开发工具如何使用Google Sans Code - 码农开源等宽字体