MySQL集群技术

环境准备:

RHEL7备份两台:mysql-node1、mysql-node2

vmset.sh eth0 172.25.254.10 mysql-node1.test.org

vmset.sh eth0 172.25.254.20 mysql-node2.test.org

部署MySQL:

bash 复制代码
[root@mysql-node1 ~]# cd /usr/local/
[root@mysql-node1 local]# ls
bin  etc  games  include  lib  lib64  libexec  mysql  sbin  share  src
[root@mysql-node1 local]# cd mysql/
[root@mysql-node1 mysql]# ls
bin   include  LICENSE  mysql-test  README-test  support-files
docs  lib      man      README      share
[root@mysql-node1 mysql]# useradd -s /sbin/nologin -M mysql
[root@mysql-node1 mysql]# mkdir /data/mysql -p
[root@mysql-node1 mysql]# chown mysql.mysql -R /data/mysql
[root@mysql-node1 mysql]# ls
bin   include  LICENSE  mysql-test  README-test  support-files
docs  lib      man      README      share
[root@mysql-node1 mysql]# cd support-files/
[root@mysql-node1 support-files]# ls
magic  mysqld_multi.server  mysql-log-rotate  mysql.server
[root@mysql-node1 support-files]# cp mysql.server /etc/init.d/mysqld




[root@mysql-node1 support-files]# vim /etc/my.cnf
[root@mysql-node1 support-files]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
[root@mysql-node1 support-files]# vim ~/.bash_profile 
[root@mysql-node1 support-files]# source ~/.bash_profile 
[root@mysql-node1 support-files]# cat ~/.bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/local/mysql/bin

export PATH




[root@mysql-node1 support-files]# ll -d /data/mysql/
drwxr-xr-x 2 mysql mysql 6 Aug 22 10:33 /data/mysql/
[root@mysql-node1 support-files]# mysqld --user=mysql --initialize
2024-08-22T02:41:15.544893Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2024-08-22T02:41:15.991240Z 0 [Warning] InnoDB: New log files created, LSN=45790
2024-08-22T02:41:16.084870Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2024-08-22T02:41:16.146948Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 00e4d9d9-6030-11ef-b946-000c291e0ede.
2024-08-22T02:41:16.148118Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2024-08-22T02:41:16.237978Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2024-08-22T02:41:16.237993Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2024-08-22T02:41:16.238472Z 0 [Warning] CA certificate ca.pem is self signed.
2024-08-22T02:41:16.286102Z 1 [Note] A temporary password is generated for root@localhost: pG?jmnO(f7yY
[root@mysql-node1 support-files]# vim passwd
[root@mysql-node1 support-files]# cat passwd 
pG?jmnO(f7yY




[root@mysql-node1 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysql-node1.silingchuan.org.err'.
 SUCCESS! 
[root@mysql-node1 ~]# yum install chkconfig -y
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager

This system is not registered with an entitlement server. You can use subscription-manager to register.

centos7                                                     | 2.8 kB  00:00:00     
Package chkconfig-1.7.6-1.el7.x86_64 already installed and latest version
Nothing to do
[root@mysql-node1 ~]# chkconfig mysqld on
[root@mysql-node1 ~]# chkconfig --list

Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.

mysqld         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
rhnsd          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
[root@mysql-node1 ~]# 


[root@mysql-node1 ~]# mysql_secure_installation
bash 复制代码
[root@mysql-node2 ~]# cd /usr/local/
[root@mysql-node2 local]# ls
bin  etc  games  include  lib  lib64  libexec  mysql  sbin  share  src
[root@mysql-node2 local]# useradd -s /sbin/nologin -M mysql
[root@mysql-node2 local]# mkdir -p /data/mysql
[root@mysql-node2 local]# chown mysql.mysql /data/mysql/
[root@mysql-node2 local]# 
[root@mysql-node2 local]# cd mysql/
[root@mysql-node2 mysql]# ls
bin   include  LICENSE  mysql-test  README-test  support-files
docs  lib      man      README      share
[root@mysql-node2 mysql]# cp support-files/mysql.server /etc/init.d/mysqld



[root@mysql-node2 mysql]# vim /etc/my.cnf
[root@mysql-node2 mysql]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
[root@mysql-node2 mysql]# vim ~/.bash_profile 
[root@mysql-node2 mysql]# source ~/.bash_profile 
[root@mysql-node2 mysql]# cat ~/.bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/local/mysql/bin

export PATH
[root@mysql-node2 mysql]# 
[root@mysql-node2 mysql]# mysqld --user mysql --initialize
[root@mysql-node2 mysql]# vim passwd
[root@mysql-node2 mysql]# cp passwd /root/
[root@mysql-node2 mysql]# cat passwd 
oCfRUOxeu9:H
[root@mysql-node2 mysql]# 
[root@mysql-node2 mysql]# /etc/init.d/mysqld start
[root@mysql-node2 mysql]# mysql_secure_installation

MySQL的主从复制:

10:主

20:从

bash 复制代码
[root@mysql-node1 ~]# vim /etc/my.cnf
[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin
[root@mysql-node1 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 
[root@mysql-node1 ~]# mysql -uroot -p -e "SELECT @@server_id"


mysql> CREATE USER repl@'%' IDENTIFIED BY 'redhat';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1190 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> show master status\G;


#如果写错了,可以使用以下命令删除:
#mysql> DROP USER repl@'%';


mysql> create database test;

mysql> create table test.userlist(
    -> username varchar(10) not null,
    -> password varchar(50) not null
    -> );
    
mysql> INSERT INTO test.userlist values ('lee1','123');

mysql> SELECT * FROM test.userlist;
bash 复制代码
[root@mysql-node2 ~]# vim /etc/my.cnf
[root@mysql-node2 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
[root@mysql-node2 ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS! 
Starting MySQL. SUCCESS! 
[root@mysql-node2 ~]# mysql -uroot -p -e "SELECT @@server_id"



mysql> change master to master_host='172.25.254.10',master_user='repl',master_password='redhat',master_log_file='mysql-bin.000001',master_log_pos=1190;
Query OK, 0 rows affected, 2 warnings (0.00 sec)


mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;


#如果配置错误,须先停止slave
#mysql> stop slave;


mysql> SHOW DATABASES;

mysql> SELECT * FROM test.userlist;

当有数据添加slave2:

备份新的虚拟机:mysql-node3

vmset.sh eth0 172.25.254.30 mysql-node3.silingchuan.org

在node1:

rsync -al /usr/local/mysql root@172.25.254.30:/usr/local

bash 复制代码
[root@mysql-node1 ~]# rsync -al /usr/local/mysql root@172.25.254.30:/usr/local
bash 复制代码
[root@mysql-node3 ~]# useradd -s /sbin/nologin -M mysql
[root@mysql-node3 ~]# mkdir -p /data/mysql
[root@mysql-node3 ~]# chown mysql.mysql /data/mysql/
[root@mysql-node3 ~]# vim /etc/my.cnf
[root@mysql-node3 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@mysql-node3 ~]# vim ~/.bash_profile 
[root@mysql-node3 ~]# source ~/.bash_profile 
[root@mysql-node3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
[root@mysql-node3 ~]# cat ~/.bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin:/usr/local/mysql/bin

export PATH
[root@mysql-node3 ~]# 
[root@mysql-node3 ~]# mysqld --user=mysql --initialize
[root@mysql-node3 ~]# vim passwd
[root@mysql-node3 ~]# ll -d /data/mysql/
drwxr-xr-x 5 mysql mysql 314 Aug 22 15:20 /data/mysql/
[root@mysql-node3 ~]# ls /data/mysql/
auto.cnf    client-cert.pem  ibdata1      mysql               public_key.pem   sys
ca-key.pem  client-key.pem   ib_logfile0  performance_schema  server-cert.pem
ca.pem      ib_buffer_pool   ib_logfile1  private_key.pem     server-key.pem
[root@mysql-node3 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/mysql/mysql-node3.silingchuan.org.err'.
 SUCCESS! 
[root@mysql-node3 ~]# mysql_secure_installation
bash 复制代码
[root@mysql-node1 ~]# mysqldump -uroot -predhat test > test.sql
[root@mysql-node1 ~]# scp test.sql root@172.25.254.30:/mnt/


#测试
[root@mysql-node1 ~]# mysql -uroot -p

mysql> INSERT INTO test.userlist values ('user2','123');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM test.userlist;
bash 复制代码
[root@mysql-node3 ~]# cd /mnt/
[root@mysql-node3 mnt]# ls
test.sql
[root@mysql-node3 mnt]# mysql -uroot -predhat -e "CREATE DATABASE test;"
[root@mysql-node3 mnt]# mysql -uroot -predhat test < test.sql


[root@mysql-node3 mnt]# mysql -uroot -p
mysql> change master to master_host='172.25.254.10',master_user='repl',master_password='redhat',master_log_file="mysql-bin.000001",master_log_pos=1839;

mysql> start slave;

mysql> show slave status\G;


#测试
mysql> SELECT * FROM test.userlist;

延迟复制:

延迟复制时用来控制sql线程的,和i/o线程无关

这个延迟复制不是i/o线程过段时间来复制,i/o是正常工作的

是日志已经保存在slave端了,那个sql要等多久进行回放

bash 复制代码
mysql> STOP SLAVE SQL_THREAD;

mysql> change master to master_delay=60;

mysql> start slave sql_thread;

mysql> show slave status\G;
bash 复制代码
mysql> delete from test.userlist where username='lee1';
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM test.userlist;

慢查询日志:

bash 复制代码
mysql> SHOW variables like "slow%";

mysql> SET GLOBAL slow_query_log=ON;

mysql> SHOW variables like "slow%";

mysql> SHOW VARIABLES like "long%";


#测试:
mysql> select sleep (10);

mysql的并行复制:

bash 复制代码
[root@mysql-node2 ~]# vim /etc/my.cnf
[root@mysql-node2 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
gtid_mode=ON
enforce-gtid-consistency=ON
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

[root@mysql-node2 mysql]# /etc/init.d/mysqld restart

#查询:
[root@mysql-node2 mysql]# mysql -uroot -predhat -e "SHOW PROCESSLIST;"

gtid模式:

bash 复制代码
[root@mysql-node1 ~]# vim /etc/my.cnf
[root@mysql-node1 ~]# /etc/init.d/mysqld restart

[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON
bash 复制代码
[root@mysql-node3 mnt]# vim /etc/my.cnf
[root@mysql-node3 mnt]# /etc/init.d/mysqld restart

[root@mysql-node3 mnt]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
gtid_mode=ON
enforce-gtid-consistency=ON
bash 复制代码
[root@mysql-node2 ~]# mysql -uroot -p

mysql> stop slave;

mysql> change master to
    -> master_host='172.25.254.10',
    -> master_user='repl',
    -> master_password='redhat',
    -> master_auto_position=1;

mysql> start slave;

mysql> show slave status\G;
bash 复制代码
[root@mysql-node3 ~]# mysql -uroot -p

mysql> stop slave;

mysql> change master to
    -> master_host='172.25.254.10',
    -> master_user='repl',
    -> master_password='redhat',
    -> master_auto_position=1;

mysql> start slave;

mysql> show slave status\G;

#因为30做了延迟,所以最开始可能为Slave_IO_Running:Connecting,等待一会重新查看就好了

启用半同步模式:

bash 复制代码
[root@mysql-node1 ~]# vim /etc/my.cnf
[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1
[root@mysql-node1 ~]# mysql -uroot -p

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

mysql> select * from information_schema.PLUGINS where PLUGIN_NAME LIKE '%semi%'\G; 

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
bash 复制代码
[root@mysql-node2 ~]# vim /etc/my.cnf
[root@mysql-node2 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1
[root@mysql-node2 ~]# mysql -uroot -predhat

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

mysql> STOP SLAVE IO_THREAD; 

mysql> START SLAVE IO_THREAD; 

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';



#如果设成master,可使用以下命令删除:
#mysql> set global rpl_semi_sync_master_enabled=off;

#mysql> uninstall plugin rpl_semi_sync_master;
bash 复制代码
[root@mysql-node3 ~]# vim /etc/my.cnf
[root@mysql-node3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1
[root@mysql-node3 ~]# mysql -uroot -p

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

mysql> STOP SLAVE IO_THREAD; 

mysql> START SLAVE IO_THREAD; 

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
bash 复制代码
20:
mysql> STOP SLAVE IO_THREAD;

mysql> START SLAVE IO_THREAD;

30:
mysql> STOP SLAVE IO_THREAD;

mysql> START SLAVE IO_THREAD;

#10秒后,slave发送master,master会转入异步模式。

半同步模式不支持slave挂掉后,写入数据到master,但默认十秒后写入是因为master进入了异步模式。

slave的io线程恢复后,能与master建立连

mysql-router

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

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

bash 复制代码
[root@mysql-node1 ~]# ll
total 58416
-rw-------.  1 root root      1704 Jul 30 23:56 anaconda-ks.cfg
-rw-r--r--.  1 root root      1780 Jul 30 23:57 initial-setup-ks.cfg
-rw-r--r--   1 root root     93208 Aug 21 21:36 libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm
drwxr-xr-x  36 7161 31415     4096 Aug 21 22:23 mysql-5.7.44
-rw-r--r--   1 root root  53298645 Aug 21 21:33 mysql-boost-5.7.44.tar.gz
-rw-r--r--   1 root root   6400028 Aug 24 11:44 mysql-router-community-8.4.0-1.el7.x86_64.rpm
-rw-r--r--   1 root root        13 Aug 22 10:45 passwd
-rw-r--r--   1 root root      1945 Aug 22 15:25 test.sql
[root@mysql-node1 ~]# rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm 

[root@mysql-node1 ~]# vim /etc/my.cnf
[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON

[root@mysql-node1 ~]# /etc/init.d/mysqld stop

[root@mysql-node1 ~]# vim /etc/mysqlrouter/mysqlrouter.conf
[root@mysql-node1 ~]# tail -5 /etc/mysqlrouter/mysqlrouter.conf
[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.254.20:3306,172.25.254.30:3306
routing_strategy = round-robin

[root@mysql-node1 ~]# systemctl start mysqlrouter.service
bash 复制代码
[root@mysql-node2 ~]# vim /etc/my.cnf
[root@mysql-node2 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
gtid_mode=ON
enforce-gtid-consistency=ON

[root@mysql-node2 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
[root@mysql-node2 ~]# mysql -uroot -p

#修改密码
mysql> alter user root@localhost identified by 'lee';

#添加远程登录用户
mysql> create user root@'%' identified by 'lee';

mysql> grant all ON *.* to root@'%';
bash 复制代码
[root@mysql-node3 ~]# vim /etc/my.cnf
[root@mysql-node3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
gtid_mode=ON
enforce-gtid-consistency=ON

[root@mysql-node3 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
[root@mysql-node3 ~]# mysql -uroot -p

mysql> alter user root@localhost identified by 'lee';

mysql> create user root@'%' identified by 'lee';

mysql> grant all on *.* to root@'%';
bash 复制代码
[root@mysql-node1 ~]# mysql -uroot -plee -h172.25.254.10 -P 7001
mysql> select @@server_id;

[root@mysql-node1 ~]# mysql -uroot -plee -h172.25.254.10 -P 7001
mysql> select @@server_id;

实现mysql组复制

bash 复制代码
[root@mysql-node1 ~]# /etc/init.d/mysqld stop
[root@mysql-node1 ~]# ps aux | grep mysql
avahi       860  0.0  0.1  62272  2076 ?        Ss   13:28   0:00 avahi-daemon: runn[mysql-node1.local]
mysqlro+   2637  0.0  0.5 520980 10456 ?        Ssl  13:35   0:00 /usr/bin/mysqlrout
root       4004  0.0  0.0 112812   968 pts/0    S+   14:47   0:00 grep --color=auto l
[root@mysql-node1 ~]# kill -9 860
[root@mysql-node1 ~]# ps aux | grep mysql
mysqlro+   2637  0.0  0.5 520980 10456 ?        Ssl  13:35   0:00 /usr/bin/mysqlrout
root       4007  0.0  0.0 112812   968 pts/0    S+   14:47   0:00 grep --color=auto l

[root@mysql-node1 ~]# rm -rf /data/mysql/*

[root@mysql-node1 ~]# vim /etc/my.cnf
#初始化
[root@mysql-node1 ~]# mysqld --user=mysql initialize
#启动mysql
[root@mysql-node1 ~]# /etc/init.d/mysqld start

[root@mysql-node1 ~]# mysql -uroot -p'PsLOtfCdw8-x'

mysql> alter user root@localhost identified by 'lee';
Query OK, 0 rows affected (0.00 sec)

mysql> SET SQL_LOG_BIN=0;
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> 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.11 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 | db334b54-61e5-11ef-8ebd-000c291e0ede | mysql-node1.silingchuan.org |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-----------------------------+-------------+--------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOS
+---------------------------+--------------------------------------+-----------
| group_replication_applier | 1b853fd1-61e7-11ef-876d-000c29e45e85 | mysql-node
| group_replication_applier | db334b54-61e5-11ef-8ebd-000c291e0ede | mysql-node
+---------------------------+--------------------------------------+-----------
2 rows in set (0.00 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOS
+---------------------------+--------------------------------------+-----------
| group_replication_applier | 1b853fd1-61e7-11ef-876d-000c29e45e85 | mysql-node
| group_replication_applier | 8f504d00-61e7-11ef-902b-000c298b8db6 | mysql-node
| group_replication_applier | db334b54-61e5-11ef-8ebd-000c291e0ede | mysql-node
+---------------------------+--------------------------------------+-----------
3 rows in set (0.00 sec)


mysql> quit


#地址解析
[root@mysql-node1 ~]# vim /etc/hosts
[root@mysql-node1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.10	mysql-node1.silingchuan.org
172.25.254.20	mysql-node2.silingchuan.org
172.25.254.30	mysql-node3.silingchuan.org


[root@mysql-node1 ~]# scp /etc/my.cnf root@172.25.254.20:/etc/my.cnf

[root@mysql-node1 ~]# scp /etc/my.cnf root@172.25.254.30:/etc/my.cnf
bash 复制代码
[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
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
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.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
bash 复制代码
[root@mysql-node2 ~]# /etc/init.d/mysqld stop

[root@mysql-node2 ~]# ps aux | grep mysql
avahi       794  0.0  0.1  62272  2072 ?        Ss   13:28   0:00 avahi-daemon:[mysql-node2.local]
root       3601  0.0  0.0 112812   964 pts/0    S+   14:47   0:00 grep --color=l
[root@mysql-node2 ~]# kill -9 794
[root@mysql-node2 ~]# ps aux | grep mysql
root       3604  0.0  0.0 112808   964 pts/0    S+   14:47   0:00 grep --color=l

[root@mysql-node2 ~]# rm -rf /data/mysql/*
[root@mysql-node2 ~]# vim /etc/hosts		#三台主机解析一致

[root@mysql-node2 ~]# ls /data/mysql/
[root@mysql-node2 ~]# vim /etc/my.cnf

[root@mysql-node2 ~]# mysqld --user=mysql --initialize

[root@mysql-node3 ~]# /etc/init.d/mysqld start

[root@mysql-node2 ~]# mysql -uroot -p'!lsogVo)m0KS'


mysql> alter user root@localhost identified by 'lee';
Query OK, 0 rows affected (0.00 sec)

mysql> SET SQL_LOG_BIN=0;
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.01 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (5.88 sec)
bash 复制代码
[root@mysql-node2 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
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
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.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
bash 复制代码
[root@mysql-node3 ~]# /etc/init.d/mysqld stop

[root@mysql-node3 ~]# ps aux | grep mysql
avahi       811  0.0  0.1  62272  2072 ?        Ss   13:28   0:00 avahi-daemon:[mysql-node3.local]
root       3657  0.0  0.0 112812   964 pts/1    S+   14:47   0:00 grep --color=l
[root@mysql-node3 ~]# kill -9 811
[root@mysql-node3 ~]# ps aux | grep mysql
root       3668  0.0  0.0 112808   964 pts/1    S+   14:47   0:00 grep --color=l

[root@mysql-node3 ~]# rm -rf /data/mysql/*
[root@mysql-node3 ~]# vim /etc/hosts
[root@mysql-node3 ~]# ls /data/mysql/
[root@mysql-node3 ~]# vim /etc/my.cnf
[root@mysql-node3 ~]# mysqld --user=mysql --initialize

[root@mysql-node3 ~]# /etc/init.d/mysqld start

[root@mysql-node3 ~]# mysql -uroot -p'&0Xnoj.1oTem'

mysql> alter user root@localhost identified by 'lee';
Query OK, 0 rows affected (0.00 sec)

mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER repl@'%' IDENTIFIED BY 'lee';
Query OK, 0 rows affected (0.01 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.01 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (3.32 sec)
bash 复制代码
[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
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
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

测试:

bash 复制代码
#10
mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.02 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)
bash 复制代码
mysql> #30
mysql> CREATE TABLE test.userlist(
    -> username VARCHAR(10) PRIMARY KEY NOT NULL,
    -> password VARCHAR(40) NOT NULL
    -> );
Query OK, 0 rows affected (0.00 sec)
bash 复制代码
mysql> #20
mysql> DESC test.userlist;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(10) | NO   | PRI | NULL    |       |
| password | varchar(40) | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> INSERT INTO test.userlist VALUES ('user1','111');
Query OK, 1 row affected (0.00 sec)
bash 复制代码
#10
mysql> SELECT * FROM test.userlist;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 111      |
+----------+----------+
1 row in set (0.00 sec)
bash 复制代码
mysql> quit
Bye

#20:
[root@mysql-node2 ~]# /etc/init.d/mysqld stop
Shutting down MySQL............ SUCCESS! 
#10:
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOS
+---------------------------+--------------------------------------+-----------
| group_replication_applier | 8f504d00-61e7-11ef-902b-000c298b8db6 | mysql-node
| group_replication_applier | db334b54-61e5-11ef-8ebd-000c291e0ede | mysql-node
+---------------------------+--------------------------------------+-----------
2 rows in set (0.00 sec)

#20:
[root@mysql-node2 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
#10:
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOS
+---------------------------+--------------------------------------+-----------
| group_replication_applier | 8f504d00-61e7-11ef-902b-000c298b8db6 | mysql-node
| group_replication_applier | db334b54-61e5-11ef-8ebd-000c291e0ede | mysql-node
+---------------------------+--------------------------------------+-----------
2 rows in set (0.00 sec)

#20:
[root@mysql-node2 ~]# mysql -uroot -plee

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (3.90 sec)
#10:
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-----------
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOS
+---------------------------+--------------------------------------+-----------
| group_replication_applier | 1b853fd1-61e7-11ef-876d-000c29e45e85 | mysql-node
| group_replication_applier | 8f504d00-61e7-11ef-902b-000c298b8db6 | mysql-node
| group_replication_applier | db334b54-61e5-11ef-8ebd-000c291e0ede | mysql-node
+---------------------------+--------------------------------------+-----------
3 rows in set (0.00 sec)

mysql高可用之MHA

为什么要用MHA?

Master的单点故障问题

什么是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支持一主多从架构,最少三台服务,即一主两从。
RHEL7-克隆一台新的主机:mysql-mha

vmset.sh eth0 172.25.254.50 mysql-mha.test.org

bash 复制代码
[root@mysql-mha ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  MHA-7.zip
[root@mysql-mha ~]# unzip MHA-7.zip
[root@mysql-mha ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  MHA-7  MHA-7.zip

[root@mysql-mha ~]# ssh-keygen 
[root@mysql-mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.10
[root@mysql-mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.20
[root@mysql-mha ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.254.30

[root@mysql-mha ~]# vim /etc/hosts
[root@mysql-mha ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.50	mysql-mha.silingchuan.org
172.25.254.10	mysql-node1.silingchuan.org
172.25.254.20	mysql-node2.silingchuan.org
172.25.254.30	mysql-node3.silingchuan.org

[root@mysql-mha ~]# cd MHA-7/
[root@mysql-mha MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
mha4mysql-manager-0.58.tar.gz
mha4mysql-node-0.58-0.el7.centos.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Net-Telnet-3.03-19.el7.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   
bash 复制代码
[root@mysql-node1 ~]# vim /etc/my.cnf
[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON

[root@mysql-node1 ~]# /etc/init.d/mysqld stop

[root@mysql-node1 ~]# rm -rf /data/mysql/*
[root@mysql-node1 ~]# mysqld --user=mysql --initialize

[root@mysql-node1 ~]# /etc/init.d/mysqld start

[root@mysql-node1 ~]# mysql -uroot -p',utP.ROc9GB)'

mysql> alter user root@localhost identified by 'lee';

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'lee';

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

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';

mysql> quit
bash 复制代码
[root@mysql-node2 ~]# vim /etc/my.cnf
[root@mysql-node2 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
log-bin=mysql-bin
gtid_mode=ON
enforce-gtid-consistency=ON

[root@mysql-node2 ~]# /etc/init.d/mysqld stop

[root@mysql-node2 ~]# rm -rf /data/mysql/*
[root@mysql-node2 ~]# mysqld --user=mysql --initialize

[root@mysql-node2 ~]# /etc/init.d/mysqld start

[root@mysql-node2 ~]# mysql -uroot -p'la8jnCS&yi:4'

mysql> alter user root@localhost identified by 'lee';

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

mysql> start slave;

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;

mysql> STOP SLAVE IO_THREAD;

mysql> START SLAVE IO_THREAD;

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

mysql> quit
bash 复制代码
[root@mysql-node3 ~]# vim /etc/my.cnf
[root@mysql-node3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
gtid_mode=ON
enforce-gtid-consistency=ON

[root@mysql-node3 ~]# /etc/init.d/mysqld stop

[root@mysql-node3 ~]# rm -rf /data/mysql/*
[root@mysql-node3 ~]# mysqld --user=mysql --initialize

[root@mysql-node3 ~]# /etc/init.d/mysqld start

[root@mysql-node3 ~]# mysql -uroot -p'QpppnnoB2k:a'

mysql> alter user root@localhost identified by 'lee';

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

mysql> start slave;

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;

mysql> STOP SLAVE IO_THREAD;

mysql> START SLAVE IO_THREAD;

mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';

mysql> quit
bash 复制代码
[root@mysql-node1 ~]# vim /etc/ssh/sshd_config 
[root@mysql-node1 ~]# systemctl restart sshd
[root@mysql-node1 ~]# 
[root@mysql-node1 ~]# yum install /mnt/mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
bash 复制代码
[root@mysql-node2 ~]# vim /etc/ssh/sshd_config 
[root@mysql-node2 ~]# systemctl restart sshd
[root@mysql-node2 ~]# yum install /mnt/mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
bash 复制代码
[root@mysql-node3 ~]# vim /etc/ssh/sshd_config 
[root@mysql-node3 ~]# systemctl restart sshd
[root@mysql-node3 ~]# yum install /mnt/mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
bash 复制代码
[root@mysql-mha MHA-7]# mkdir /etc/masterha
[root@mysql-mha MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
mha4mysql-manager-0.58.tar.gz
mha4mysql-node-0.58-0.el7.centos.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Net-Telnet-3.03-19.el7.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm

[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]# ls
app1.cnf  masterha_default.cnf

[root@mysql-mha conf]# cat masterha_default.cnf app1.cnf > /etc/masterha/app1.cnf

[root@mysql-mha conf]# cd
[root@mysql-mha ~]# vim /etc/masterha/app1.cnf
[root@mysql-mha ~]# cat /etc/masterha/app1.cnf 
[server default]
user=root
password=lee
ssh_user=root
master_binlog_dir= /data/mysql
remote_workdir=/tmp
secondary_check_script= masterha_secondary_check -s 172.25.254.10 -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.10
candidate_master=1
check_repl_delay=0

[server2]
hostname=172.25.254.20
candidate_master=1
check_repl_delay=0

[server3]
hostname=172.25.254.30
no_master=1
bash 复制代码
[root@mysql-node1 ~]# mysql -uroot -plee

mysql> CREATE USER root@'%' identified by 'lee';

mysql> grant ALL ON *.* to root@'%';
bash 复制代码
[root@mysql-node2 ~]# ip a a 172.25.254.11/24 dev eth0
bash 复制代码
[root@mysql-mha ~]# cd .ssh/
[root@mysql-mha .ssh]# ls
id_rsa  id_rsa.pub  known_hosts

[root@mysql-mha .ssh]# scp id_rsa root@172.25.254.10:/root/.ssh/

[root@mysql-mha .ssh]# scp id_rsa root@172.25.254.20:/root/.ssh/

[root@mysql-mha .ssh]# scp id_rsa root@172.25.254.30:/root/.ssh/


#检查:
[root@mysql-mha .ssh]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

[root@mysql-mha .ssh]# masterha_check_repl --conf=/etc/masterha/app1.cnf

master无故障手动切换

bash 复制代码
[root@mysql-mha ~]# cat /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 -s 172.25.254.10 -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.10
candidate_master=1
check_repl_delay=0

[server2]
hostname=172.25.254.20
candidate_master=1
check_repl_delay=0

[server3]
hostname=172.25.254.30
no_master=1

[root@mysql-mha ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

[root@mysql-mha ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
bash 复制代码
[root@mysql-node1 ~]# /etc/init.d/mysqld start

[root@mysql-node2 ~]# /etc/init.d/mysqld start

[root@mysql-node3 ~]# /etc/init.d/mysqld start
bash 复制代码
[root@mysql-mha ~]# masterha_master_switch \
> --conf=/etc/masterha/app1.cnf \
> --master_state=alive \
> --new_master_host=172.25.254.20 \
> --new_master_port=3306 \
> --orig_master_is_new_slave \
> --running_updates_limit=10000

master故障手动切换

bash 复制代码
[root@mysql-node1 ~]# /etc/init.d/mysqld stop
bash 复制代码
[root@mysql-mha ~]# masterha_master_switch \
> --master_state=dead \
> --conf=/etc/masterha/app1.cnf \
> --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

故障恢复

bash 复制代码
[root@mysql-node1 ~]# /etc/init.d/mysqld start
bash 复制代码
#20和30:
mysql> stop slave;

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

mysql> start slave;

mysql> show slave status\G;
bash 复制代码
[root@mysql-mha ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

自动切换

bash 复制代码
[root@mysql-mha ~]# cd /etc/masterha/
[root@mysql-mha masterha]# ls
app1.cnf  app1.failover.complete
[root@mysql-mha masterha]# rm -rf app1.failover.complete
[root@mysql-mha masterha]# ls
app1.cnf
bash 复制代码
[root@mysql-node1 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:67

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:68
[root@mysql-node1 ~]# iptables -F        #删除防火墙路由
[root@mysql-node1 ~]# 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         
bash 复制代码
[root@mysql-node2 ~]# ip a a 172.25.254.11/24 dev eth0
bash 复制代码
[root@mysql-mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf
bash 复制代码
[root@mysql-node1 ~]# /etc/init.d/mysqld stop

检测:

bash 复制代码
[root@mysql-mha masterha]# tail -f manager.log

故障恢复

bash 复制代码
[root@mysql-node1 ~]# /etc/init.d/mysqld start
bash 复制代码
#20和30:
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10',MASTER_USER='repl',MASTER_PASSWORD='lee',MASTER_AUTO_POSITION=1;

mysql> start slave;

mysql> show slave status\G;
bash 复制代码
[root@mysql-mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf
#检测一主两从

为MHA添加VIP功能

bash 复制代码
[root@mysql-mha ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  MHA-7  MHA-7.zip
[root@mysql-mha ~]# ls
anaconda-ks.cfg       master_ip_failover       MHA-7
initial-setup-ks.cfg  master_ip_online_change  MHA-7.zip
[root@mysql-mha ~]# 
[root@mysql-mha ~]# cp master_ip_* /usr/local/bin/
[root@mysql-mha ~]# chmod +x /usr/local/bin/master_ip_*
[root@mysql-mha ~]# 
[root@mysql-mha ~]# vim /usr/local/bin/master_ip_failover 
[root@mysql-mha ~]# vim /usr/local/bin/master_ip_online_change 
[root@mysql-mha ~]# 
[root@mysql-mha ~]# cd /etc/masterha/
[root@mysql-mha masterha]# ls
app1.cnf  app1.failover.complete  manager.log
[root@mysql-mha masterha]# rm -rf app1.failover.complete 
[root@mysql-mha masterha]# rm -rf manager.log 
[root@mysql-mha masterha]# ls
app1.cnf
[root@mysql-mha masterha]# vim app1.cnf 

#检测:
[root@mysql-mha masterha]# masterha_check_repl --conf=/etc/masterha/app1.cnf
bash 复制代码
[root@mysql-node1 ~]# ip a a 172.25.254.100/24 dev eth0
[root@mysql-node1 ~]# ip a

[root@mysql-node1 ~]# /etc/init.d/mysqld stop
[root@mysql-node1 ~]# ip a
bash 复制代码
[root@mysql-node1 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
[root@mysql-node1 ~]# mysql -uroot -plee

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.20',MASTER_USER='repl',MASTER_PASSWORD='lee',MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
bash 复制代码
[root@mysql-mha masterha]# masterha_master_switch \
> --conf=/etc/masterha/app1.cnf \
> --master_state=alive \
> --new_master_host=172.25.254.10 \
> --new_master_port=3306 \
> --orig_master_is_new_slave \
> --running_updates_limit=10000

检测:

相关推荐
C语言扫地僧9 分钟前
Docker 镜像制作(Dockerfile)
linux·服务器·docker·容器
Xinan_____17 分钟前
Linux——高流量 高并发(访问场景) 高可用(架构要求)
linux·运维·架构
2401_8725149717 分钟前
PPTP、L2TP、SSTP协议和HTTP、SOCKS5代理:全面解析与对比
网络
HPC_fac1305206781618 分钟前
RTX 4090 系列即将停产,RTX 5090 系列蓄势待发
服务器·人工智能·gpu算力
周伯通*26 分钟前
Windows上,使用远程桌面连接Ubuntu
linux·windows·ubuntu
苹果醋343 分钟前
react 路由 react-router/react-router-dom
运维·nginx
Spring-wind1 小时前
【linux】 date命令
linux
不烦下雨c1 小时前
【网络】传输层协议TCP
网络·网络协议·tcp/ip
Good_tea_h1 小时前
Android中的单例模式
android·单例模式
稳联技术1 小时前
汽车焊机数据通信:Profinet转Canopen网关的神奇连接
服务器·网络·汽车