Linux企业运维——MYSQL数据库

1.mysql数据库的安装部署

lftp 172.25.254.250
cd pub/docs/lamp
get mysql-boost-5.7.31.tar.gz   #下载压缩包
tar zxf mysql-boost-5.7.31.tar.gz  #解压
cd mysql-5.7.31/
yum install cmake  #安装cmake
mkdir build
cd build
cmake ../ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DSYSCONFDIR=/etc -DENABLED_LOCAL_INFILE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/mysql-5.7.31/boost/boost_1_59_0      #配置测试
缺少两个插件,下载安装
yum install bison.x86_64
yum install gcc-c++ -y
cmake ../ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DSYSCONFDIR=/etc -DENABLED_LOCAL_INFILE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/mysql-5.7.31/boost/boost_1_59_0    ##再次测试
make    #编译
make install    #安装 

安装完成!

cd    #切换环境到家目录
vim .bash_profile   #配置全局文件,添加mysql路径
\\\
PATH=$PATH:$HOME/bin:/usr/local/lnmp/php/bin:/usr/local/mysql/bin
\\\

source .bash_profile   #文件生效
mkdir -p /data/mysql  #建立mysql目录
useradd -M -d /data/mysql -s /sbin/nologin mysql  #建立mysql用户
chown mysql.mysql /data/mysql/   #设置目录的用户及用户组

vim /etc/my.cnf   #修改mysql文件的路径,具体见下图
\\\
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
[mysqld_safe]
log-error=/data/mysql/mariadb.log
pid-file=/var/run/mariadb.pid
\\\

cd data/mysql/
mysqld --initialize --user=mysql    #mysql初始化,初始化后最后会显示初始化后的密码,登陆时需要使用
cd /usr/local/mysql/support-files/
ls
cp mysql.server /etc/init.d/mysqld   #将mysql数据库服务拷贝到指定目录下
/etc/init.d/mysqld start   #指定路径启动服务
mysql_secure_installation   #更改密码登陆数据库
首次登陆需要时定一些参数,我这里设定如下:
\\\
Press y|Y for Yes, any other key for No: n
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
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
\\\

更改全剧配置文件修改路径界面:
在这里插入图片描述

初始化界面:

在这里插入图片描述

mysql数据库安装配置完毕!
可以使用mysql -p 登陆

2.网页版数据库mysql

下载 phpMyAdmin-5.0.2-all-languages.zip 压缩包

我这里直接本地文件拿到压缩包

unzip phpMyAdmin-5.0.2-all-languages.zip   #解压
mv phpMyAdmin-5.0.2-all-languages /usr/local/nginx/html/phpadmin   #移动到nginx的html目录下
systemctl start php-fpm.service   #开启php-fpm服务
systemctl enable php-fpm.service  #设置开机自启
vim /usr/local/lnmp/php/etc/php.ini   #编辑php文件,添加mysql文件的路径
systemctl reload  php-fpm  #修改完文件,重载

编辑php.ini文件界面如下:
在这里插入图片描述
在这里插入图片描述

此时确保nginx开启的情况下,浏览器访问172.25.7.1/phpadmin
在这里插入图片描述

建立一个westos库,linux表,插入一组数据
在这里插入图片描述

进入数据库查看westos.linux表数据
在这里插入图片描述

3.MySQL异步复制

在这里插入图片描述

异步复制:配置文件/etc/my.cnf最后写了同步方式,是使用二进制日志的方式进行复制,master做的任何操作都会记录在日志里,master不会等待slave复制完之后再开始下一步,一直都是自己做自己的,不会管slave的状态,自己做好了就写在自己的日志里,能否同步成功取决于slave自身,而slave能否同步成功取决于两个线程,I/O线程和sql线程,I/O线程不是yes,则获取不到master的日志,(master的dumper线程会和slave的I/O线程进行通信),slave把二进制日志拿过来之后,先把master所作的事情写在中继日志relay_log里,然后sql线程回放(replay),把relay_log日志里的事再做一次,所以异步复制slave的数据比master稍慢一些。master主机不会管slave两个线程的状态异常,如果状态异常,这就会导致数据不同步。
异步复制失败的原因可能是两台主机数据不同步,master数据比slave数据多太多。同步之前数据已经不一样,所以我们需要通过备份导入的方式同步之前使两者保持一致。

1.mysql主从复制

mysql主从复制原理

复制原理

mysql主从复制是一个异步复制的过程。从一个实例(master)复制到另一个实例(slave),整个过程要由master上的I/O进程和slave上的sql进程和I/O进程共同完成。
首先master必须打开binary log(bin-log),因为整个复制过程实际上就是slave端从master端获取相应的二进制日志,然后在本地完全顺序的执行日志中纪录的各种操作。

主从复制过程

Slave 端的 IO 进程连接上 Master,向 Master 请求指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
Master 接收到来自 Slave 的 IO 进程的请求后,负责复制的 IO 进程根据 Slave 的请求信息,读取相应日志内容,返回给 Slave 的IO进程,并将本次请求读取的 bin-log 文件名及位置一起返回给 Slave 端
Slave 端的 IO 进程接收到信息后,将接收到的日志内容依次添加到 Slave 端的 relay-log(中继日志) 文件的最末端,并将读取到的 Master 端的 bin-log 的文件名和位置记录到 master-info 文件中,以便在下一次读取的时候能够清楚的告诉 Master :”我需要从某个 bin-log 的哪个位置开始往后的日志内容,请发给我”;
Slave 端的 Sql 进程检测到 relay-log (中继日志)中新增加了内容后,会马上解析 relay-log 的内容成为在 Master 端真实执行时候的那些可执行的内容,并在本地执行。

server1中的mysql作为主数据库(master)
server2中的mysql作为从数据库(slave)

配置slave数据库

这里我们主要将设定slave数据库的配置文件以及在成功与master主从复制同步之前需要同步master数据库中的数据

在server1中将数据库scp给server2

scp -r /usr/local/mysql server2:/usr/local
scp /etc/my.cnf server2:/etc/

配置server2中的mysql环境变量文件

vim .bash_profile   #配置全剧文件,添加路径使mysql全局生效
source .bash_profile   #使文件生效
which mysql  #查看是否全局生效

在这里插入图片描述

新建用户,建立mysql目录,数据库初始化,更改密码登陆

useradd -M -d /data/mysql -s /sbin/nologin mysql   #建立用户
mkdir -p /data/mysql   #建立目录
cd /data/mysql/
mysqld --initialize --user=mysql   #初始化,注意初始化后的密码
cd /usr/local/mysql/support-files/
ls
cp mysql.server /etc/init.d/mysqld   #将mysql数据库服务拷贝到指定目录下
/etc/init.d/mysqld start   #指定路径启动服务
mysql_secure_installation   #更改密码登陆数据库

server2的数据库部署完毕

主从复制过程

在master中
master设置server-id

vim /etc/my.cnf
\\\
log-bin=mysql-bin
server-id=1
\\\

在这里插入图片描述

master创建复制用户,并授权

mysql -p  #进入数据库
create user 'redhat'@'%' identified by 'westos';  #创建用户repl
GRANT REPLICATION SLAVE ON *.* TO 'redhat'@'%';  #授权
show master status;  #查看状态

在这里插入图片描述

主从复制同步之前必须保持两个数据库已经存在的数据相同,所以需要将server1的备份文件导入在slave的库中

mysqldump -p westos > dump.sql   #备份server1数据库
scp dump.sql server2:     #传输给server2
在server2中必须提前建立和server1一样的数据库westos
mysql -p westos < dump.sql    #备份导入server2数据库中
此时两个数据库已经完全一样

在slave中
slave配置server-id

vim /etc/my.cnf
\\\
log-bin=mysql-bin
server-id=1
\\\

在这里插入图片描述

slave配置复制:

mysql -p  #进入数据库
mysql> CHANGE MASTER TO
    ->     MASTER_HOST='172.25.7.1',
    ->     MASTER_USER='redhat',
    ->     MASTER_PASSWORD='Westos',
    ->     MASTER_LOG_FILE='mysql-bin.000004',
    ->     MASTER_LOG_POS=1770;

主从复制完毕,在server2的mysql中输入
show slave status\G;

在这里插入图片描述

如果可以看到两个yes ,则同步成功!!!

这时我们在master数据库中插入一组数据

在这里插入图片描述
在slave数据库中查看

在这里插入图片描述

2.GTID复制

(1) GTID的概念

MySQL 5.6引入的GTID(Global Transaction ID)使得其复制功能的配置、监控及管理变得更加易于实现,且更加健壮。

GTID即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。

下面是一个GTID的具体形式:
4e659069-3cd8-11e5-9a49-001c4270714e:1-77

因为清楚了GTID的格式,所以通过UUID可以知道这个事务在哪个实例上提交的。通过GUID可以极方便的进行复制结构上的故障转移,新主设置

(2)不引入GTID的新主设置
当Server1(Master)崩溃时,根据从上show slave status获得Master_log_File/Read_Master_Log_Pos的值,Server2(Slave)已经跟上了主,Server3(Slave)没有跟上主。这时要是把Server2提升为主,Server3变成Server2的从,这时在Server3上执行change的时候需要做一些计算,相对来说是比较麻烦的。server3在作为从库去同步新主库server2上的数据,由于server2中binlog记录的事务id和以前的server1主库的事务id并不一样,那么server2要将之前同步server1的进度转换为server2上的同步进度。

(3)引入GTID后的主库切换过程
由于同一事务的GTID在所有节点上的值一致,那么根据Server3当前停止点的GTID就能定位到Server2上的GTID。我们都不需要知道GTID的具体值,直接使用CHANGE MASTER TO MASTER_HOST=‘xxx’, MASTER_AUTO_POSITION命令就可以直接完成failover的工作

GTID配置

这里我们配置一个server2作为server1的slave,server3作为server2的slave
基于一主一从

master1中:
vim /etc/my.cnf
\\\
[mysqld]
gtid_mode=ON
enforce-gtid-consistency=ON
\\\
/etc/init.d/mysqld restart 

在这里插入图片描述

server2既作为server1的从,也作为server3的主

在这里插入图片描述
在这里插入图片描述

server3作为server2的slave

在这里插入图片描述

在这里插入图片描述

这样的方式相比较从属组要简单的多,配置同步主从的时候不需要查看主数据库的日志文件以及编号

mysql延迟同步

延迟同步的目的是:防止主库的误操作造成从库也被误操作

Master_Log_File 主库mysql的binlog文件名
Read_Master_Log_Pos 读取主库mysql的binlog文件的位置
Exec_Master_Log_Pos 从库执行主库mysql的binlog文件的位置
Seconds_Behind_Master 从库延迟主库同步的时间单位秒
SQL_Delay 设置从库服务器相较于主库服务器的延迟同步时间

这里我们的server2作为server1的slave
在slave上执行

stop slave;
change master to master_delay = 30;    #修改延迟荣不时间为30秒
show slave status\G;    #查看状态
start slave;     #此时我们的延迟同步已经设置为30秒

在这里插入图片描述

我们在,master中插入信息,在slave端查看slave状态
可以看到,Seconds Behind Master显示21秒,此时I/O线程已经受到master的更改日志,但是此时需要延迟30秒执行,所以我们需要等到30秒之后,数据才能同步到slave中
在这里插入图片描述

此时延迟30秒过后,Seconds Behind Master显示0

在这里插入图片描述

查看插入的数据,发现已同步
在这里插入图片描述

mysql并行复制

并行复制背景
因为I/O thread和SQL thread是单线程工作的,而Master是可以多线程写入的,所以主从难免造成延迟

基于此,在5.6,5.7,8.0版本都在SQL线程上实现了多线程,来提升slave的并发度

并行复制的目的: 优化mysql

让Slave SQL线程尽可能以多线程工作,解决复制延迟的问题

并行复制的原理:

MySQL5.6开启并行复制功能后,SQL线程变成coordinator线程,由其判断是否可以并发执行,这意味着一个worker线程可以处理一个数据库的连续事务,而不用等待其它数据库完成

并行复制配置

MySQL5.6并行复制开启:(前提是配置好主从复制环境)
我们这里可以接着上面的实验做测试

方法1:
在mysql中输入命令设置并行复制的workers(临时的,重启mysql后就会成为默认值)

mysql> stop slave;

Query OK, 0 rows affected (0.03 sec)

mysql> set global slave_parallel_workers=16;

Query OK, 0 rows affected (0.05 sec)

mysql> start slave;

Query OK, 0 rows affected, 1 warning (0.07 sec)
SHOW VARIABLES LIKE 'slave_parallel_%';  #查看设置是否成功
show processlist   #看到16个SQL线程的状态

方法2:
在/etc/my.cnf文件中配置并行复制

vim /etc/my.cnf
\\\
relay_log_info_repository = TABLE  #把relay.info记录在slave_relay_log_info表里
master_info_repository = TABLE  #master.info记录在表里
relay_log_recovery = on   #默认是开启的(数据库启动后立即启动自动relay log恢复)
slave_parallel_workers=16  #设置并行最大线程为16
\\\
/etc/init.d/mysqld restart  #重启
mysql -p  #进入数据库
SHOW VARIABLES LIKE 'slave_parallel_%';  #查看设置是否成功
show processlist   #看到16个SQL线程的状态

查看到并行workers设置成功
在这里插入图片描述
查看发现这里我们只有一个线程在待命;
在这里插入图片描述

MySQL5.7应用事务顺序和realy log记录事务顺序不一样的问题:

MySQL 5.7后的MTS可以实现更小粒度的并行复制,但需要将slave_parallel_type设置为LOGICAL_CLOCK,但仅仅设置为LOGICAL_CLOCK也会存在问题,因为此时在slave上应用事务的顺序是无序的,和relay log中记录的事务顺序不一样,这样数据一致性是无法保证的,为了保证事务是按照relay log中记录的顺序来回放,就需要开启参数slave_preserve_commit_order=1

4.mysql数据库的半同步复制

在这里插入图片描述

异步复制的缺点在于主库只负责将数据库的增,改,查操作记录到 binary log中,而从库在通过日志对操作进行回放同步之后,主库对从库的同步内容不检测,不知道是否同步,这里引入半同步复制解决这一问题.
半同步复制在协议中添加了一个同步步骤。 这意味着主节点在提交时需要等待从节点确认它已经接收到事务。只有这样,主节点才能继续提交操作。
这种模式下主节点只需要接收到其中一台从节点的返回信息,就会commit;否则需要等待直到超时时间然后切换成异步模式再提交;这样做的目的可以使主从数据库的数据延迟缩小,可以提高数据安全性,确保了事务提交后,binlog至少传输到了一个从节点上,不能保证从节点将此事务更新到db中。性能上会有一定的降低,响应时间会变长。

master:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled =1;
show status like 'Rpl_semi%';

在这里插入图片描述

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;

在这里插入图片描述

半同步复制配置成功,此时在master数据库当中插入新的数据将会由主节点提交给从节点确认,一直等待直至超时
测试的时候可以关闭slave节点的mysql数据库,在master中插入数据,发现要等十秒钟才能提交,则配置成功!

5.组复制(全同步)

组复制是基于分布式一致性协议Paxos实现数据最终一致性的MySQL插件,通过这种插件可以实现弹性、高可用、容错复制拓扑结构。

MySQL组复制提供分布式状态机复制,在服务器之间具有强协调。当数据库服务器是属于同一组时,组复制机制可以自动协调它们。该组可以在具有自动选择新主库功能的单主模式下操作,这种情况下一个组只有主节点才可以做写操作。或者,对于更高级的用户,该组可以以多主模式部署,即多个节点都可以做写操作,即使它们是同时发过来的写请求。不过这种情况下,应用层会有部分额外的限制。

MySQL组复制是MySQL 5.7.17开始引入的新功能,为主从复制实现高可用功能。它支持单主模型和多主模型两种工作方式(默认是单主模型)。

在这里插入图片描述

单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。

在这里插入图片描述

多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。

在这里插入图片描述

多主模式配置

从server1到server3 设置为master1到master3

恢复环境,更改配置文件

master1:

删除/data/mysql下内容,重新初始化

/etc/init.d/mysqld stop
cd /data/mysql 

rm -fr *     #所有文件全部删除,之后会重新初始化
uuidgen    #随机生成UUID


vim /etc/my.cnf    #编辑配置文件
\\\
server-id=1
gtid_mode=ON
enforce-gtid-consistency=true
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE      #关闭binlog校验
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW       #组复制依赖基于行的复制格式
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
plugin_load_add='group_replication.so'
group_replication_start_on_boot=off
group_replication_local_address= "server1:33061"
group_replication_group_seeds= "server1:33061,server2:33061,server3:33061"
group_replication_bootstrap_group=off    ##插件是否自动引导,这个选项一般都要off掉,只需要由发起组复制的节点开启,并只启动一次,如果是on,下次再启动时,会生成一个同名的组,可能会发生冲突
group_replication_ip_whitelist="172.25.7.0/24,127.0.0.1/8"
group_replication_enforce_update_everywhere_checks=ON
group_replication_single_primary_mode=OFF
group_replication_allow_local_disjoint_gtids_join=ON
\\\

随机生成的uuid
在这里插入图片描述
/etc/my.cnf 的配置
在这里插入图片描述

重新初始化,启动mysql 修改设定

mysqld --initialize --user=mysql   #初始化
/etc/init.d/mysqld start   #启动数据库
mysql_secure_installation   #更改密码登陆
mysql -pwestos
alter user root@localhost identified by 'westos';    #更改用户root密码
SET SQL_LOG_BIN=0;    #关闭二进制日志,防止传到其他的server上
CREATE USER rpl@'%' IDENTIFIED BY 'westos';     #创建用户用于复制
GRANT REPLICATION SLAVE ON *.* TO rpl@'%';     #给所有库的所有表
FLUSH PRIVILEGES;          #刷新授权表
SET SQL_LOG_BIN=1;           #设定完毕,开启日志
CHANGE MASTER TO MASTER_USER='rpl', MASTER_PASSWORD='westos' 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;     #查看组状态

在这里插入图片描述

master2:

master2和master1前面配置相同,在修改mysql设定的时候不需要开启节点这个参数
vim /etc/my.cnf (此处address需要修改为server2)
在这里插入图片描述

mysqld --initialize --user=mysql   #初始化
/etc/init.d/mysqld start   #启动数据库
mysql_secure_installation   #更改密码登陆
mysql -pwestos
alter user root@localhost identified by 'westos';    #更改用户root密码
SET SQL_LOG_BIN=0;    #关闭二进制日志,防止传到其他的server上
CREATE USER rpl@'%' IDENTIFIED BY 'westos';     #创建用户用于复制
GRANT REPLICATION SLAVE ON *.* TO rpl@'%';     #给所有库的所有表
FLUSH PRIVILEGES;          #刷新授权表
SET SQL_LOG_BIN=1;           #设定完毕,开启日志
CHANGE MASTER TO MASTER_USER='rpl', MASTER_PASSWORD='westos' FOR CHANNEL 'group_replication_recovery';
set global group_replication_allow_local_disjoint_gtids_join=1;
START GROUP_REPLICATION;       #开启组复制
SELECT * FROM performance_schema.replication_group_members;     #查看组状态

master3:
master3和1、2一样配置/etc/my.cnf文件
删除/data/mysql下的内容之后重新初始化,启动mysql 修改设定
在这里插入图片描述

修改mysql参数

mysqld --initialize --user=mysql   #初始化
/etc/init.d/mysqld start   #启动数据库
mysql_secure_installation   #更改密码登陆
mysql -pwestos
alter user root@localhost identified by 'westos';    #更改用户root密码
SET SQL_LOG_BIN=0;    #关闭二进制日志,防止传到其他的server上
CREATE USER rpl@'%' IDENTIFIED BY 'westos';     #创建用户用于复制
GRANT REPLICATION SLAVE ON *.* TO rpl@'%';     #给所有库的所有表
FLUSH PRIVILEGES;          #刷新授权表
SET SQL_LOG_BIN=1;           #设定完毕,开启日志
CHANGE MASTER TO MASTER_USER='rpl', MASTER_PASSWORD='westos' FOR CHANNEL 'group_replication_recovery';
set global group_replication_allow_local_disjoint_gtids_join=1;
START GROUP_REPLICATION;       #开启组复制
SELECT * FROM performance_schema.replication_group_members;     #查看组状态

在这里插入图片描述

mysql数据库多主组搭建完毕,此时在master1中插入新数据
在这里插入图片描述
master2中查看,并插入新数据

INSERT INTO t1 VALUES (2, 'redhat');

在这里插入图片描述

最后在master3中查看,插入数据
在这里插入图片描述

6.mysql路由器

在这里插入图片描述

MYSQL Router原理:

MySQL Router是处于应用client和dbserver之间的轻量级代理程序,它能检测,分析和转发查询到后端数据库实例,并把结果返回给client。是mysql-proxy的一个替代品

Router实现读写分离,程序不是直接连接数据库IP,而是固定连接到mysql router。MySQL Router对前端应用是透明的。应用程序把MySQL Router当作是普通的mysql实例,把查询发给MySQL Router,而MySQL Router会把查询结果返回给前端的应用程序。

读写分离原理
MySQL Router接受前端应用程序请求后,根据不同的端口来区分读写,把连接读写端口的所有查询发往主库,把连接只读端口的select查询以轮询方式发往多个从库,从而实现读写分离的目的。读写返回的结果会交给MySQL Router,由MySQL Router返回给客户端的应用程序。

安装部署mysql route

下载地址:
提供不同平台,二进制包和rpm包,选择合适安装方式即可,但是下载二进制包需要手动创建日志目录,配置文件设置。启动还需要自己编写启动脚本, mysql route官方没有提供
我这里直接下载到rpm包mysql-router-community-8.0.21-1.el7.x86_64.rpm

新建虚拟机server4,在server4中下载路由插件

rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm

vim /etc/mysqlrouter/mysqlrouter.conf   #编写配置文件
\\\
[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.7.1:3306,172.25.7.2:3306,172.25.7.3:3306
routing_strategy = round-robin

[routing:rw]
bind_address = 0.0.0.0
bind_port = 7002
destinations = 172.25.7.1:3306,172.25.7.2:3306,172.25.7.3:3306
routing_strategy = first-available
\\\

 systemctl restart mysqlrouter.service  #重新启动路由器即可

在这里插入图片描述
路由功能已开启,我们在路由器列表中写入了server1、2、3三个数据库,可以配置为主从同步,也可以是组同步(一主多从); 我这里配置的是组同步

在这里插入图片描述

读写分离测试
在server1中授权一个用户
grant all on test.* to ‘zca’@’%’ identified by ‘westos’;

验证读负载均衡:从结果看到每次读都是访问不同的主机
mysql -h 172.25.7.4 -P 7001 -uzca -pwestos -e “select @@hostname”

在这里插入图片描述
验证写:可以看到每次写都是写到主节点 ,当主节点停掉或者挂掉就会有另一个节点的数据库接管写功能

mysql -h 172.25.7.4 -P 7002 -uzca -pwestos -e “select @@hostname”
在这里插入图片描述

7.MHA高可用

实验环境为一主两从,server1为master
server2、server3为slave

在这里插入图片描述

MHA高可用原理

MHA是自动的master故障转移和Slave提升的软件包.它是基于标准的MySQL复制(异步/半同步).该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。
1)MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Manager会定时探测集群中的node节点,当发现master
出现故障的时候,它可以自动将具有最新数据的slave提升为新的master,然后将所有其它的slave导向新的master上.整个故障转移过程对应用程序是透明的。
2)MHA Node运行在每台MySQL服务器上,它通过监控具备解析和清理logs功能的脚本来加快故障转移的。

在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,
MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5或者以后的版本的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave
已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至
少需要三台服务器

**MHA在线切换的大概过程:
1.检测复制设置和确定当前主服务器
2.确定新的主服务器
3.阻塞写入到当前主服务器
4.等待所有从服务器赶上复制
5.授予写入到新的主服务器
6.重新设置从服务器

为了保证数据完全一致性,在最快的时间内完成切换,MHA的在线切换必须满足以下条件才会切换成功,否则会切换失败。
1.所有slave的IO线程都在运行
2.所有slave的SQL线程都在运行
3.所有的show slave status的输出中Seconds_Behind_Master参数小于或者等于running_updates_limit秒,如果在切换过程中不指定running_updates_limit,那么默认情况下running_updates_limit为1秒。
4.在master端,通过show processlist输出,没有一个更新花费的时间大于running_updates_limit秒。
**

实验环境配置

删除server1、server2、server3中/data/mysql下的所有文件,

编辑/etc/my.conf 内容如下
删除关于之前组同步的策略,只需要开启gtid即可
master_info_repository=TABLE 将master中的操作存入表中(安全性更高)
在这里插入图片描述

mysqld --initialize-insecure --user=mysql 重新初始化(-insecure无密码)

server1中无密码进入mysql(server1作为master)
grant replication slave on *.* to repl@'%' identified by 'westos';   #授权用户
alter user root@'%' identified by 'westos';  #更改root用户密码
grant all on *.* to root@'%' identified by 'westos';  #授权

在这里插入图片描述

server2、3初始化完毕后,修改/etc/my.conf文件
启动mysql
#设定主从

change master to master_host='172.25.7.1',master_user='repl',master_password='westos',master_auto_position=1;             

在这里插入图片描述

此时一主两从设定完毕!
server2中slave 状态
在这里插入图片描述server3中slave 状态
在这里插入图片描述

下载MHA-7高可用程序

在server4上

/etc/init.d/mysqld stop
systemctl stop mysql.service 
lftp 172.25.254.250
cd /pub/docs/mysql/MHA-7
将这个目录下载到主机

在这里插入图片描述

配置MHA-7

cd MHA-7
yum install *.rpm 
mkdir /etc/masterha
cd /etc/masterha

vim app1.conf
\\\
[server default]
manager_workdir=/etc/masterha		#manager工作目录
manager_log=/etc/masterha/mha.log   #manager日志文件
master_binlog_dir=/data/mysql		#mysql主服务器的binlog目录
#master_ip_failover_script=/usr/bin/master_ip_failover		#failover自动切换脚本
#master_ip_online_change_script= /usr/local/bin/master_ip_online_change		#手动切换脚本
user=root			#mysql主从节点的管理员用户密码,确保可以从远程登陆
password=westos	
ping_interval=3		#发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自					动进行failover
remote_workdir=/tmp		#远端mysql在发生切换时binlog的保存位置
repl_user=repl			#主从复制用户密码
repl_password=westos	
#report_script=/usr/local/send_report		#发生切换后发送报警的脚本
secondary_check_script=/usr/bin/masterha_secondary_check -s 172.25.7.2 -s 172.25.7.3
#shutdown_script=""		#故障发生后关闭故障主机脚本,防止脑裂
ssh_user=root			#ssh用户名
[server1]
hostname=172.25.7.1
port=3306
#candidate_master=1
#check_repl_delay=0
 
[server2]
hostname=172.25.7.2
port=3306
candidate_master=1	#指定failover时此slave会接管master,即使数据不是最新的。
check_repl_delay=0	#默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
 
[server3]
hostname=172.25.7.3
port=3306
#no_master=1			#始终是slave
\\\

在这里插入图片描述

将mha4mysql-node-0.58-0.el7.centos.noarch.rpm包传输给server2、3

scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server2:
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server3:
分别安装
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y  #因为这个包有依赖性,所以不能使用rpm指令安装

建立密钥

在server1中建立密钥
ssh-keygen  #建立密钥
ssh-copy-id server1    #拷贝给自己
将整个ssh文件传输给server1,server2,server3、server4 所有主机可以无密码连接
scp -r .ssh/ server1:
scp -r .ssh/ server2:
scp -r .ssh/ server3:
scp -r .ssh/ server4:

检测实验环境是否配置成功
在server4中

masterha_check_ssh --conf=/etc/masterha/app1.conf    #检测ssh
masterha_check_repl --conf=/etc/masterha/app1.conf    #检测repl,查看一主两从状态是否正确
全部成功后可以输入指令进行手动切换或脚本自动切换

ssh
在这里插入图片描述
repl
在这里插入图片描述

手动切换master

masterha_master_switch --conf=/etc/masterha/app1.conf --master_state=alive --new_master_host=172.25.7.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000    #手动切换master,将还在运行的master替换为备用master

此时备用master-server2上线
在server3中可以查看slave的状态

在这里插入图片描述
这个时候server1中原来的master是成为server2的slave?
我们查看以下server1的slave状态
server1已经成为server2的slave

在这里插入图片描述

将master切换为server1

在server1中关闭数据库,测试master停止运行后的手动切换

masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.conf --dead_master_host=172.25.7.1 --dead_master_port=3306 --new_master_host=172.25.7.2 --new_master_port=3306 --ignore_last_failover    #此命令是将已经宕机的数据库给替换
这里第一次故障切换master,--ignore_last_failover参数可以不加

master切换为了备用master
在这里插入图片描述
在server3中查看slave状态

在这里插入图片描述

这时我们原来的master是关闭的,现在启动server1的数据库之后,他的状态是server2的slave吗?

在这里插入图片描述

需要手动输入使server1成为server2的slave;

 change master to master_host='172.25.7.2',master_user='repl',master_password='westos',master_auto_position=1;

在这里插入图片描述

自动切换master

将master切换为server1

masterha_manager --conf=/etc/masterha/app1.conf &    #开启自动切换master,并将此进程打入后台
ps ax    #进行监控

在这里插入图片描述

此时关闭master会自动切换为server2为master

在这里插入图片描述
切换master时,server4会受到提示,查看/etc/masterha目录下的内容会多两个文件,app1.failover.complete 和 mha.log(日志文件,自动切换后就会生成)

app1.failover.complete是锁定文件,文件中没有内容,当故障切换master时,默认八小时内最多切换一次,所以如果现在的master又宕掉MHA就会查看目录下是否有app1.failover.complete文件,有的话不进行切换,会报错! (想切换的时候需要删除这两个文件)
或者在手动切换时
masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.conf --dead_master_host=172.25.7.1 --dead_master_port=3306 --new_master_host=172.25.7.2 --new_master_port=3306 –ignore_last_failover
加上–ignore_last_failover参数,跳过查看这个文件的步骤

漂移IP——VIP设定

当master切换的时候用户访问不知道master切换到哪一台主机,我们可以使用路由器或者设定VIP用户

目前是一主两从
server2为master,server1、3是slave
在master主机中添加VIP用户

ip addr add 172.25.7.100/24 dev eth0

在server4当中下载脚本,通过脚本使得VIP用户跟着master一起转移

cd /etc/masterha/
lftp 172.25.254.250
cd /pub/docs/mysql
get master_ip_failover master_ip_online_change
exit
vim master_ip_failover   #在脚本中更改VIP用户IP(faliover脚本是当master宕机时用道德)
vim master_ip_online_change  #在脚本中更改VIP用户IP(online脚本是当你在线手动更改master时甬道的)
vim app1.conf  #将脚本两行的策略注释取消

master_ip_failover
在这里插入图片描述
app1.conf
在这里插入图片描述

配置文件和脚本编辑之后进行检测
masterha_check_repl --conf=/etc/masterha/app1.conf

在这里插入图片描述

测试成功,现在VIP用户在server2中(master)
在这里插入图片描述

开启自动替换master
masterha_manager --conf=/etc/masterha/app1.conf &

停止server2的数据库
/etc/init.d/mysqld stop
此时master将会自动切换为server1
查看ip发现VIP用户随着master转移到了serve1当中
ip addr
在这里插入图片描述

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值