MYSQL

MySQL安装

[root@mysql ~]# tar zxf mysql-boost-5.7.44.tar.gz 
[root@mysql ~]# du -sh mysql-5.7.44/
475M	mysql-5.7.44/
[root@mysql ~]# cd mysql-5.7.44/
[root@mysql mysql-5.7.44]# yum install cmake -y
[root@mysql mysql-5.7.44]# yum install gcc gcc-c++ -y
[root@mysql mysql-5.7.44]# yum install openssl-devel pakage -y
[root@mysql mysql-5.7.44]# yum install ncurses-devel -y

#清除缓存,当你安装好依赖性后依旧报错
[root@mysql mysql-5.7.44]# rm -rf CMakeCache.txt

[root@mysql ~]# yum install libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm -y 

#编译
[root@mysql 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 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0/

#双核下载
[root@mysql mysql-5.7.44]# make -j2

#安装
[root@mysql mysql-5.7.44]# make install

部署MySQL

拷贝数据库到另一台主机

[root@mysql3 ~]# useradd -s /sbin/nologin -M mysql
[root@mysql3 ~]# mkdir -p /data/mysql
[root@mysql3 ~]# chown mysql.mysql -R /data/mysql/
[root@mysql3 ~]# cd /usr/local/
[root@mysql3 local]# cd mysql/support-files/
[root@mysql3 support-files]# cp mysql.server /etc/init.d/mysqld

有很多的链接,所以该怎么传?

[root@mysql2 local]# rsync -al -r mysql root@172.25.254.30:/usr/local/

被传 检查一下

[root@mysql3 ~]# cd /usr/local/
[root@mysql3 local]# du -sh mysql/
1.9G    mysql/
修改配置文件
[root@mysql3 local]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
[root@mysql3 local]# vim ~/.bash_profile 
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
[root@mysql3 local]# source ~/.bash_profile 

初始化有问题

#删除里面的内容
[root@mysql3 support-files]# cd /data/mysql/
[root@mysql3 mysql]# ll
[root@mysql3 mysql]# rm -rf *

开始初始化

[root@mysql3 mysql]# mysqld --user mysql --initialize
2024-08-22T08:10:28.783404Z 1 [Note] A temporary password is generated for root@localhost: =WPU9lJ>YDb5
​
#密码>文件
[root@mysql3 ~]# echo "=WPU9lJ>YDb5" > passwd
​

启动MySQL

方式一:
[root@mysql3 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysql3.example.org.err'.
 SUCCESS!
方式二:
[root@mysql3 support-files]# chkconfig mysqld on
[root@mysql3 support-files]# chkconfig --list

安全初始化

[root@mysql3 ~]# mysql_secure_installation 
实验遇到的问题

在MySQL中主从同步的时候产生的:原因是我删除了主库中从库没有的数据库,我也没想到还会导致集群宕机,解决方法就是让指针往下移动

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
​
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
Query OK, 0 rows affected (0.00 sec)
​
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

组从复制

配置master
设置server-id
[root@mysql2 local]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
log-bin=mysql-bin
#重启生效
[root@mysql3 ~]# /etc/init.d/mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 
查看server-id
[root@mysql3 ~]# mysql -uroot -plee -e "select @@server_id"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
|          30 |
​
二进制
[root@mysql3 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
log-bin=mysql-bin
[root@mysql3 ~]# /etc/init.d/mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 
检查是否生成二进制文件
[root@mysql2 mysql]# cd /data/mysql/
[root@mysql2 mysql]# ls
auto.cnf         ib_logfile1             mysql.sock.lock
ca-key.pem       ibtmp1                  performance_schema
ca.pem           mysql                   private_key.pem
client-cert.pem  mysql2.example.org.err  public_key.pem
client-key.pem   mysql2.example.org.pid  server-cert.pem
ib_buffer_pool   mysql-bin.000001        server-key.pem
ibdata1          mysql-bin.index         sys
ib_logfile0      mysql.sock

作用:记录动作

登录MySQL
建立同步使用的用户
mysql> CREATE USER repl@'%' IDENTIFIED BY 'lee';
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |      878 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

实验

建立库

mysql> create database example;
Query OK, 1 row affected (0.00 sec)

建立表

mysql> create table example.userlist( username varchar(10) not null,
    -> password varchar(50) not null
    -> );
Query OK, 0 rows affected (0.00 sec)

插入值

mysql> insert into example.userlist values ('lee','123');
Query OK, 1 row affected (0.01 sec)
slave端

同步日志

mysql> change master to master_host='172.25.254.20',master_user='repl',master_password='lee',master_log_file='mysql-bin.000004',master_log_pos=1145;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
​
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
​
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.254.20
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 1145
               Relay_Log_File: mysql3-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
​

10从查看

拉平数据

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

主端备份
[root@mysql2 ~]# mysqldump -uroot -p example > example.sql
[root@mysql2 ~]# cat example.sql 
拷贝
[root@mysql2 ~]# scp example.sql root@172.25.254.30:/mnt/
root@172.25.254.30's password: 
example.sql                          100% 1979     2.4MB/s   00:00 
slave端
[root@mysql3 ~]# cd /mnt/
[root@mysql3 mnt]# ls
example.sql
[root@mysql3 mnt]# mysql -uroot -plee -e "create database example;"
[root@mysql3 mnt]# mysql -uroot -plee example < example.sql
mysql> change master to master_host='172.25.254.20',master_user='repl',master_password='lee',master_log_file='mysql-bin.000004',master_log_pos=1145;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
​
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
在主端添加数据
mysql> insert example.userlist values ('user2','123');
Query OK, 1 row affected (0.00 sec)
slave端查看

写入>读取 主比较多 购物平台

写入< 读取 从比较多 微博

延迟复制

一般一台就够了,用来防止误删,在这个时间内进行恢复

slave
mysql> STOP SLAVE SQL_THREAD;
Query OK, 0 rows affected (0.00 sec)
​
mysql> change master to master_delay=60;
Query OK, 0 rows affected (0.00 sec)
​
mysql> start slave sql_thread;
Query OK, 0 rows affected (0.00 sec)
主端
mysql> delete from example.userlist where username='user1';
Query OK, 0 rows affected (0.00 sec)

延迟端数据备份

[root@mysql3 mnt]# mysql -uroot -plee example > 2.sql

慢查询日志

一条语句执行超过10s

原因:库表设计不合理,数据庞大

重启生效
[root@mysql2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
slow_query_log=on
log-bin=mysql-bin
[root@mysql2 ~]# /etc/init.d/mysqld restart
Shutting down MySQL............ SUCCESS! 
Starting MySQL. SUCCESS! 
立即生效
mysql> SET GLOBAL slow_query_log=ON;
Query OK, 0 rows affected (0.00 sec)
​
mysql> show variables like "slow%";
+---------------------+-----------------------------+
| Variable_name       | Value                       |
+---------------------+-----------------------------+
| slow_launch_time    | 2                           |
| slow_query_log      | ON                          |
| slow_query_log_file | /data/mysql/mysql2-slow.log |
+---------------------+-----------------------------+
3 rows in set (0.01 sec)

MySQL的并行复制

如果数据复制的比较慢,数据库的差异就比较大,所以某一些企业会要求强一致性!

默认情况下slave使用的是sql单线程回放,会导致主从延迟

就让slave启用多线程!

一台延迟,其他主机得保持高度一致

从端 10

[root@mysql ~]# vim /etc/my.cnf
[root@mysql ~]# 
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
gtid_mode=ON
enforce-gtid-consistency=ON
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_recovery=ON      #日志回放恢复功能开启    
[root@mysql ~]# /etc/init.d/mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS! 

组从原理

三个线程

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

一个主库线程,两个从库线程。

二进制日志转储线程(Binlog dump thread)是一个主库线程。当从库线程连接的时候, 主库可以

将二进制日志发送给从库,当主库读取事件(Event)的时候,会在 Binlog 上加锁,读取完成之

后,再将锁释放掉。

从库 I/O 线程会连接到主库,向主库发送请求更新 Binlog。这时从库的 I/O 线程就可以读取到主库

的二进制日志转储线程发送的 Binlog 更新部分,并且拷贝到本地的中继日志 (Relay log)。

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

步。

gtid模式

主20 从30

[root@mysql2 ~]# vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=ON
[root@mysql2 ~]# /etc/init.d/mysqld restart
Shutting down MySQL............ SUCCESS! 
Starting MySQL. SUCCESS!

主端查看

[root@mysql2 ~]# mysqlbinlog -vv /data/mysql/mysql-bin.000006
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
​

slave重新设定

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
​
mysql> change master to master_host='172.25.254.20',master_user='repl',master_password='lee',MASTER_AUTO_POSITION=1;
​
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)

半同步

半同步:等----到达后---才做----

主端
[root@mysql-node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server-id=1
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1 #开启半同步功能
symbolic-links=0
[root@mysql-node1 ~]# mysql -p lee
#安装半同步插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
​
mysql> select * from information_schema.PLUGINS where PLUGIN_NAME LIKE'%semi%'\G
*************************** 1. row ***************************
           PLUGIN_NAME: rpl_semi_sync_master
        PLUGIN_VERSION: 1.0
         PLUGIN_STATUS: ACTIVE
           PLUGIN_TYPE: REPLICATION
   PLUGIN_TYPE_VERSION: 4.0
        PLUGIN_LIBRARY: semisync_master.so
PLUGIN_LIBRARY_VERSION: 1.7
         PLUGIN_AUTHOR: He Zhenxing
    PLUGIN_DESCRIPTION: Semi-synchronous replication master
        PLUGIN_LICENSE: GPL
           LOAD_OPTION: ON
1 row in set (0.00 sec)
​
mysql> show variables like 'rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.02 sec)
​
# AFTER_SYNC  半同步
从端
[root@mysql-node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server-id=1
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1 #开启半同步功能
symbolic-links=0
[root@mysql-node1 ~]# mysql -p lee
#安装半同步插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
​
模拟故障
mysql> stop slave IO_THREAD;
Query OK, 0 rows affected (0.01 sec)
​
mysql> start slave IO_THREAD;
Query OK, 0 rows affected (0.00 sec)

半同步模式中,slave全部down后会不能写入数据,但是会自动开启异步模式,默认10s ,就可以写入数据。

当slave恢复后,会自动恢复半同步模式。

MySQL高可用

组复制MGR

配置文件
[root@mysql2 ~]# vim /etc/my.cnf
log_bin=binlog
gtid_mode=ON
enforce-gtid-consistency=ON
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
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.20: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
​
log_bin=binlog
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
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.20: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 
​
数据初始化
主端
[root@mysql-node10 ~]# /etc/init.d/mysqld stop
[root@mysql-node10 ~]# rm -rf /data/mysql/*
​
[root@mysql-node10 ~]# mysqld --user=mysql --initialize
​
[root@mysql-node10 ~]# /etc/init.d/mysqld start
​
[root@mysql-node10 ~]# mysql -uroot -p初始化后生成的密码 -e "alter user root@localhost identified by 'lee';"
关闭日志-创建-打开日志
#关闭日志记录功能,一下操作不记录
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)
​
mysql> CREATE USER repl@'%' IDENTIFIED BY 'lee';
Query OK, 0 rows affected (0.00 sec)
​
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
Query OK, 0 rows affected (0.00 sec)
​
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
​
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)
​
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='lee' FOR CHANNEL
'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
​
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)
​
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (2.17 sec)
​
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)
​
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+--------------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST        | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+--------------------+-------------+--------------+
| group_replication_applier | ed197966-61db-11ef-9c50-000c2938b8ba | mysql2.example.org |        3306 | ONLINE       |
+---------------------------+--------------------------------------+--------------------+-------------+--------------+
1 row in set (0.00 sec)
​
域名解析

三台主机都做

[root@mysql2 ~]# vim /etc/hosts
172.25.254.20   mysql2.example.org
172.25.254.10   mysql.example.org
172.25.254.30   mysql3.example.org
配置组数据库

复制配置文件到10 30

[root@mysql2 ~]# scp /etc/my.cnf root@172.25.254.10:/etc/my.cnf
[root@mysql2 ~]# scp /etc/my.cnf root@172.25.254.30:/etc/my.cnf

根据ip更改配置文件

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
slow_query_log=on
log_bin=binlog
gtid_mode=ON
enforce-gtid-consistency=ON
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
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.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
group_replication_allow_local_disjoint_gtids_join=1

删数据-初始化-改密码-关日志-用户-授权-刷新-打开日志-加组-start

mysql> alter user root@localhost identified by 'lee';
Query OK, 0 rows affected (0.00 sec)
​
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)
​
mysql> CREATE USER repl@'%' IDENTIFIED BY 'lee';
Query OK, 0 rows affected (0.00 sec)
​
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
Query OK, 0 rows affected (0.00 sec)
​
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
​
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)
​
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='lee' FOR CHANNEL 
    -> 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)
​
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (5.89 sec)
​
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+--------------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST        | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+--------------------+-------------+--------------+
| group_replication_applier | 400d45e2-61dd-11ef-bb2e-000c29420ba6 | mysql.example.org  |        3306 | ONLINE       |
| group_replication_applier | ed197966-61db-11ef-9c50-000c2938b8ba | mysql2.example.org |        3306 | ONLINE       |
+---------------------------+--------------------------------------+--------------------+-------------+--------------+
2 rows in set (0.00 sec)

30端也是同样的操作,就不重复赘述了

建立表

20端

mysql> create table example.userlist(
    -> username varchar(20) primary key not null,
    -> password varchar(40) not null
    -> );
Query OK, 0 rows affected (0.01 sec)
​
mysql> DESC example.userlist;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(20) | NO   | PRI | NULL    |       |
| password | varchar(40) | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.08 sec)
​
mysql> insert into example.userlist values('user1','123');
Query OK, 1 row affected (0.07 sec)
​
30开启组复制功能
#启动组复制(Group Replication)功能
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (3.22 sec)

MySQL路由

用于负载均衡

也可以用nginx代替,但是mysql路由更专业

打开MySQL,其他两台

安装mysql路由
[root@mysql2 ~]# rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm
编辑配置文件
[root@mysql2 ~]# vim /etc/mysqlrouter/mysqlrouter.conf
[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.254.10:3306,172.25.254.20:3306,172.25.254.30:3306
routing_strategy = round-robin
[root@mysql2 ~]# systemctl start mysqlrouter.service
[root@mysql2 ~]# netstat -antlupe | grep 7001
tcp        0      0 0.0.0.0:7001            0.0.0.0:*               LISTEN      988        54378      4412/mysqlroute
修改远程访问用户其他两台10 30
mysql> create user root@'%' identified by 'lee';
Query OK, 0 rows affected (0.00 sec)
​
mysql> grant all on *.* to root@'%';
Query OK, 0 rows affected (0.00 sec)
​
测试
[root@mysql2 ~]# mysql -uroot -plee -h 172.25.254.20 -P 7001
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          20 |
+-------------+
1 row in set (0.00 sec)
​
第二次登录
[root@mysql2 ~]# mysql -uroot -plee -h 172.25.254.20 -P 7001
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)

MHA

在用的不是很多了

解决的的是单点故障问题

版本:RHEL7

172.25.254.50

安装
[root@mha ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg     Music      Videos
Desktop          master_ip_failover       Pictures
Documents        master_ip_online_change  Public
Downloads        MHA-7.zip                Templates
[root@mha ~]# unzip MHA-7.zip 
免密认证
[root@mha MHA-7]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gthck7Fs1z5D5s3IjPuCcuPfgl6d93XlvNwvBlJ0TgM root@mha.exmaple.org
The key's randomart image is:
+---[RSA 2048]----+
|      .     E.   |
|     . + .  . +  |
|      B . +. + . |
|   + + o O +. .  |
|  . + . S O.o   .|
|       . o.+.  o.|
|       oo o...  =|
|    . =.oo . .+.+|
|     =oo.oo  ..++|
+----[SHA256]-----+
[root@mha MHA-7]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '172.25.254.10 (172.25.254.10)' can't be established.
ECDSA key fingerprint is SHA256:pC51ks+z966hoeJX/rHp+k7sYWGJczd9HAqbq5ezjbQ.
ECDSA key fingerprint is MD5:64:35:ae:bb:e4:fd:64:b7:46:f6:cd:9f:a8:52:3e:c6.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.25.254.10's password: 
​
Number of key(s) added: 1
​
Now try logging into the machine, with:   "ssh 'root@172.25.254.10'"
and check to make sure that only the key(s) you wanted were added.
​
域名解析
[root@mha MHA-7]# vim /etc/hosts
172.25.254.50   mha.exmaple.org
172.25.254.10   mysql1.exmaple.org
172.25.254.20   mysql2.example.org
172.25.254.30   mysql3.example.org
免密认证

50对10-20-30

[root@mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.10
[root@mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.20
[root@mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.30
还原配置文件

10-20-30

[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON

停数据库 清理数据 初始化 启动数据库 修改密码 同步用户 授权

master端
[root@mysql2 ~]# /etc/init.d/mysqld stop
[root@mysql2 ~]# rm -fr /data/mysql/*
[root@mysql2 ~]# 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
[root@mysql2 ~]# mysqld --user mysql --initialize
[root@mysql2 ~]# /etc/init.d/mysqld start
[root@mysql2 ~]# mysql_secure_installation
[root@mysql2 ~]## mysql -p
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'lee';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
Query OK, 0 rows affected (0.00 sec)
​
mysql> grant all on *.* to root@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to root@'%';
Query OK, 0 rows affected (0.00 sec)
​
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.02 sec)
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
Query OK, 0 rows affected (0.00 sec)
slave

20 30

停数据库 清理数据 初始化 启动数据库 修改密码 同步用户 授权

#在slave1和slave2中
[root@mysql-node10 & 30 ~]# /etc/init.d/mysqld stop
[root@mysql-node10 & 30 ~]# rm -fr /data/mysql/*
[root@mysql-node10 & 30 ~]# 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
[root@mysql-node20 & 30 ~]# mysqld --user mysql --initialize
[root@mysql-node20 & 300 ~]# /etc/init.d/mysqld start
[root@mysql-node20 & 30 ~]# mysql_secure_installation
[root@mysql-node20 & 30 ~]# mysql -p
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl',
MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
Query OK, 0 rows affected (0.00 sec)
mysql> STOP SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
mysql> START SLAVE IO_THREAD;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.01 sec)

50mha
解压包+拷贝节点
#在MHA中
[root@mysql-mha ~]# unzip MHA-7.zip
[root@mysql-mha MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm perl-Mail-Sender-0.8.23-
1.el7.noarch.rpm
mha4mysql-manager-0.58.tar.gz perl-Mail-Sendmail-0.79-
21.el7.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm perl-MIME-Lite-3.030-
1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm perl-MIME-Types-1.38-
2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm perl-Net-Telnet-3.03-
19.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm perl-Parallel-ForkManager-1.18-
2.el7.noarch.rpm
[root@mysql-mha MHA-7]# yum install *.rpm -y
[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm
root@172.25.254.10:/mnt
[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm
root@172.25.254.20:/mnt
[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm
root@172.25.254.30:/mnt

node 节点

[root@mysql1 ~]# yum install /mnt/mha4mysql-node-0.58-
0.el7.centos.noarch.rpm -y
[root@mysql2 ~]# yum install /mnt/mha4mysql-node-0.58-
0.el7.centos.noarch.rpm -y
[root@mysql3 ~]# yum install /mnt/mha4mysql-node-0.58-
0.el7.centos.noarch.rpm -y
MHA配置环境
#生成配置文件
[root@mysql-mha ~]# mkdir /etc/masterha
[root@mysql-mha MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz
[root@mysql-mha MHA-7]# cd mha4mysql-manager-0.58/samples/conf/
[root@mysql-mha conf]# cat masterha_default.cnf app1.cnf >
/etc/masterha/app1.cnf

配置文件

[root@mha ~]# vim /etc/masterha/app1.cnf 
[server default]
user=root
password=lee
ssh_user=root
repl_user=repl
repl_password=lee
master_binlog_dir= /data/mysql
remote_workdir=/tmp
secondary_check_script= masterha_secondary_check -s172.25.254.20  -s 172.25.254.11
ping_interval=3
# master_ip_failover_script= /script/masterha/master_ip_failover
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
# master_ip_online_change_script= /script/masterha/master_ip_online_change
[server default]
manager_workdir=/etc/masterha
manager_log=/etc/masterha/manager.log
​
[server1]
hostname=172.25.254.20
candidate_master=1
check_repl_delay=0
[server2]
hostname=172.25.254.30
candidate_master=1
check_repl_delay=0
[server3]
hostname=172.25.254.10
no_master=1

权限,允许远程连接,只用主机做就可以了

mysql> create user root@'%' identified by 'lee';
​
mysql> grant all on *.* to root@localhost;
Query OK, 0 rows affected (0.00 sec)
​
mysql> grant all on *.* to root@'%';
Query OK, 0 rows affected (0.01 sec)
​

20增加ip11

[root@mysql2 ~]# ip a a 172.25.254.11/24 dev eth0 
测试结果
[root@mha masterha]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
​

故障切换

mha

[root@mysql-mha ~]# masterha_master_switch --conf=/etc/masterha/app1.cnf 
--master_state=alive  --new_master_host=172.25.254.30 --new_master_port=3306  --orig_master_is_new_slave  --running_updates_limit=10000 
​

故障手动切换

master挂了

在MHA-master中做故障切换
[root@mysql-mha masterha]# masterha_master_switch --master_state=dead --
conf=/etc/masterha/app1.cnf --dead_master_host=172.25.254.20 --dead_master_port=3306 --new_master_host=172.25.254.30 --new_master_port=3306 --ignore_last_failover

再去20端口切换主机

锁文件:在一次切换之后把状态锁住,下一次转换时要删除锁文件

自动切换的时候要删掉

.complete

手动切换
关闭master服务
[root@mysql2 ~]# /etc/init.d/mysqld stop
Shutting down MySQL........... SUCCESS!
MHA
删除锁文件

锁文件:在一次切换之后把状态锁住,下一次转换时要删除锁文件

自动切换的时候要删掉.complete

[root@mha ~]# cd /etc/masterha
[root@mha masterha]# ls
app1.cnf  app1.failover.complete  mha4mysql-manager-0.58
[root@mha masterha]# rm -rf *.complete
[root@mha masterha]# ls
app1.cnf  mha4mysql-manager-0.58
执行命令
[root@mha ~]# masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=172.25.254.20 --dead_master_port=3306 --new_master_host=172.25.254.30 --new_master_port=3306 --ignore_last_failover
----- Failover Report -----
​
app1: MySQL Master failover 172.25.254.20(172.25.254.20:3306) to 172.25.254.30(172.25.254.30:3306) succeeded
​
Master 172.25.254.20(172.25.254.20:3306) is down!
​
Check MHA Manager logs at mha.exmaple.org for details.
​
Started manual(interactive) failover.
Selected 172.25.254.30(172.25.254.30:3306) as a new master.
172.25.254.30(172.25.254.30:3306): OK: Applying all logs succeeded.
172.25.254.10(172.25.254.10:3306): OK: Slave started, replicating from 172.25.254.30(172.25.254.30:3306)
172.25.254.30(172.25.254.30:3306): Resetting slave info succeeded.
Master failover to 172.25.254.30(172.25.254.30:3306) completed successfully.
​
测试结果
故障恢复
[root@mysql2 ~]# /etc/init.d/mysqld start 
Starting MySQL.. SUCCESS!
[root@mysql2 ~]# mysql -uroot -plee
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.30', MASTER_USER='repl',
MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.06 sec)
​
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
测试结果
自动切换
MHA
删除锁文件

锁文件:在一次切换之后把状态锁住,下一次转换时要删除锁文件

自动切换的时候要删掉.complete

[root@mha ~]# cd /etc/masterha
[root@mha masterha]# ls
app1.cnf  app1.failover.complete  mha4mysql-manager-0.58
[root@mha masterha]# rm -rf *.complete
[root@mha masterha]# ls
app1.cnf  mha4mysql-manager-0.58

执行命令

[root@mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf
master端

检查防火墙

[root@mysql3 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
​
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
​
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
​
#有的话停止服务
[root@mysql3 ~]# iptables -F

停止mysql服务

[root@mysql2 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS!
预备master 端
[server1]
hostname=172.25.254.20
candidate_master=1
check_repl_delay=0
​
[server2]
hostname=172.25.254.30
candidate_master=1
check_repl_delay=0
​
[server3]
hostname=172.25.254.10
no_master=1
测试结果
故障前
故障后

记得做故障恢复。

VIP
修改配置文件
#上传在群中发给大家的脚本
[root@mysql-mha ~]# ls
master_ip_failover master_ip_online_change MHA-7 MHA-7.zip
[root@mysql-mha ~]# cp master_ip_failover master_ip_online_change
/usr/local/bin/
[root@mysql-mha ~]# chmod +x /usr/local/bin/master_ip_*
#修改脚本在脚本中只需要修改下vip即可
[root@mysql-mha ~]# vim /usr/local/bin/master_ip_failover
my $vip = '172.25.254.100/24';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
[root@mysql-mha ~]# vim /usr/local/bin/master_ip_online_change
my $vip = '172.25.254.100/24';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
my $exit_code = 0;
[root@mysql-mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf & 启动监控程序
​
删除锁文件
[root@mha masterha]# ls
app1.cnf  app1.failover.complete  manager.log  mha4mysql-manager-0.58
[root@mha masterha]# rm -rf app1.failover.complete
[root@mha masterha]# rm -rf manager.log 
修改主配置文件
[root@mha masterha]# vim /etc/masterha/app1.cnf
master_ip_failover_script= /usr/local/bin/master_ip_failover
# shutdown_script= /script/masterha/power_manager
# report_script= /script/masterha/send_report
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
把vip添加到主端 20
[root@mysql2 ~]# ip a a 172.25.254.100/24 dev eth0
检测一主两从的架构+自动切换
[root@mha masterha]#masterha_check_repl --conf=/etc/masterha/app1.cnf
[root@mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf
vip会随着master的迁移一起迁移
故障恢复
[root@mysql2 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.30', MASTER_USER='repl',
    -> MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
​
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值