基于keepalived+gtid半同步主从复制的MySQL高可用集群+tpcc压力测试

一、工具介绍

        构建一个高可用的能实现读写分离的高效的MySQL集群,确保业务的稳定,能沟通方便的监控整个集群,同时利用ansible能批量的去部署和管理整个集群,提高管控效率。

1.Keepalived

        Keepalived是一个基于VRRP协议的软件实现,主要用于提供负载均衡和高可用性。它通过VRRP协议实现多台机器之间的故障转移服务,确保在主服务器(Master)故障时,备份服务器(Backup)能够自动接管主服务器的工作,从而实现系统的高可用性。同时,Keepalived也可以实现负载均衡,将请求均匀地分发到多个服务器上,提高系统的整体性能和可扩展性。

2.GTID半同步主从复制

        GTID(Global Transaction ID)半同步主从复制是MySQL数据库中的一种复制策略,旨在提高数据的安全性和一致性。在这种策略中,GTID用于唯一标识一个已提交的事务,它由UUID和TID组成,其中UUID代表MySQL实例的唯一标识,TID则代表该实例上已经提交的事务数量。

        在GTID半同步主从复制中,主库在执行完客户端提交的事务后,不是立即返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回。这种策略介于异步复制和全同步复制之间,既提高了数据的安全性,又避免了全同步复制可能带来的性能瓶颈。

       使用GTID进行复制时,主库在提交事务时会创建与该事务对应的GTID,从库在应用中继日志时会使用GTID来识别和跟踪每个事务。当启动新的从库或因故障转移到新的主库时,可以使用GTID来标识复制的位置,从而简化了这些任务。

        此外,GTID还使得主从自动定位和切换成为可能,不再需要像以前那样指定文件和位置。通过使用master_auto_position=1自动匹配GTID断点进行复制,slave端在接受master的binlog时,会校验GTID值。

        总的来说,GTID半同步主从复制结合了异步复制和全同步复制的优点,既保证了数据的安全性,又避免了不必要的性能损失。在搭建基于GTID的半同步主从复制MySQL集群时,需要开启GTID功能,并在主从配置文件中进行相应设置。同时,为了确保复制的正确性和稳定性,还需要注意监控从库的状态和性能,以及及时处理可能出现的故障和错误。

3.Ansible

        Ansible是一款运维自动化工具,它的主要功能是帮助运维人员实现IT工作的自动化,降低人为操作出现的失误,提高业务自动化率和运维工作效率。Ansible常用于软件部署自动化、配置自动化、管理自动化以及持续集成等场景。

4.MySQLRouter

        MySQL Router 是一个轻量级的中间件,它提供透明的路由到 MySQL Group Replication 或 MySQL InnoDB Cluster 的功能。它允许客户端应用程序连接到 MySQL Router,然后由 Router 负责将连接路由到集群中的合适服务器。这有助于简化客户端应用程序的配置,因为它们只需要知道 MySQL Router 的地址,而不需要知道集群中所有服务器的详细信息。

5.Tpcc

        TPCC压力测试是指使用TPCC(Transaction Processing Performance Council,交易处理性能委员会)推出的一套基准测试程序对数据库进行压力测试。TPCC测试模拟了一套电商环境,包括下单、支付、查订单、发货、查库存等各个环节,以获取数据并评估当前环境的吞吐量。

6.整个集群的架构

二、实验步骤

1.准备8台服务器

        准备4台MySQL服务器,1台Ansible中台控制服务器,2台MySQLrouter服务器,1台测试服务器,配置好IP地址,IP地址不要出错,否则后续实验会出现断开情况,并给每台服务器命名,方便后续操作

Master:192.168.91.160

Slave-1:192.168.91.159

Slave-2:192.168.91.156

Backup:192.168.91.155

Ansible:192.168.91.154

MySQLRouter-1:192.168.91.157

MySQLRouter-2:192.168.91.158

Test:192.168.91.161

2.永久关闭selinux和防火墙(所有服务器)

为了以后服务器互相访问的时候不会被拦截,修改一些配置文件不会被阻拦,每台服务器都需要

修改selinux

[root@test ~]# vim /etc/selinux/config 
[root@test ~]# getenforce
Disabled

关闭防火墙,并且关闭防火墙开机自启

[root@master ~]# systemctl disable firewalld 
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@master ~]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@master ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

4月 05 16:11:59 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall .....
4月 05 16:12:08 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall d...n.
4月 05 16:12:09 localhost.localdomain firewalld[730]: WARNING: AllowZoneDrifting is enabl....
4月 05 18:43:40 master systemd[1]: Stopping firewalld - dynamic firewall daemon...
4月 05 18:44:23 master systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.

3.安装MySQL服务和半同步相关插件(4台MySQL服务器)

这里我使用的是一键安装MySQL-5.7.37,提取码为:0812

[root@master ~]# rz                                            
[root@master ~]# ls
mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz  onekey_install_mysql_binary_v3.sh

MySQL新建了一个root用户,密码为:Sanchuang23#,密码和用户可以自定义,只要修改一键安装的脚本就可以了

#set password='Sanchuang123#';  修改root用户的密码为Sanchuang123#
mysql -uroot -p$tem_passwd --connect-expired-password   -e  "set password='Sanchuang123#';"

确定MySQL的Master:192.168.91.160,Slave:192.168.91.159,192.168.91.156,Backup(备份服务器):192.168.91.155

4.开启二进制日志(4台MySQL服务器)

修改配置文件,开启二进制日志,注意每个服务器(无论是主服务器,从服务器还是备份服务器)都需要有一个唯一的服务器ID,以确保复制过程中的正确性和一致性

[root@master ~]# vim /etc/my.cnf
[mysqld]
log_bin
server_id = 1
expire_logs_days = 15

5.安装半同步插件(4台MySQL)

登录MySQL,用户账号和密码就是安装MySQL的时候创建的

[root@master ~]# mysql -uroot -p"Sanchuang123#"

如果使用一键安装后未能找到mysql命令,则输入su重新登录

[root@slave-1 ~]# mysql -uroot -p"Sanchuang123#"
bash: mysql: 未找到命令
[root@slave-1 ~]# su
[root@slave-1 ~]# mysql -uroot -p"Sanchuang123#"
mysql: [Warning] Using a password on the command line interface can be insecure.

root@(none) 20:06  mysql>

在Master机器上安装主半同步插件

root@(none) 19:43  mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (2.05 sec)

在Slave机器和Backup机器上安装从半同步插件

root@(none) 19:44  mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (3.85 sec)

6.永久修改半同步配置(4台MySQL)

Master

[root@master ~]# vim /etc/my.cnf
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 默认1 second

Slave和Backup

[root@slave-1 ~]# vim /etc/my.cnf
[mysqld]
rpl_semi_sync_slave_enabled=1

整体查看/etc/my.cnf配置文件信息

Master

[root@master ~]# cat /etc/my.cnf
[mysqld_safe]

[client]
socket=/data/mysql/mysql.sock

[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
log_bin
server_id = 1
expire_logs_days = 15
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 

[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>

Slave和Backup(就只有服务编号不同,Slave-1是2,Slave-2是3,Backup是4)

[root@slave-1 ~]# cat /etc/my.cnf
[mysqld_safe]

[client]
socket=/data/mysql/mysql.sock

[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
log_bin
server_id = 2
expire_logs_days = 15
rpl_semi_sync_slave_enabled=1
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>

7.刷新mysql服务,查看配置是否生效(4台MySQL)

1.刷新MySQL服务(4台MySQL)

[root@master ~]# service mysqld restart
Shutting down MySQL..... SUCCESS! 
Starting    MySQL......... SUCCESS!

如果刷新服务出现问题

[root@master]# service mysqld restart
 ERROR! MySQL server process #1299 is not running!
Starting MySQL... ERROR! The server quit without updating PID file (/data/mysql/mysql_extra.pid).

原因:      

        1.可能是selinux和防火墙没有关闭

        2.半同步插件没有安装成功,就进行半同步配置

        3.检查配置文件是否输入错误

        4.查看系统日志或者查看MySQL的错误日志

[root@slave-2 log]# tail -10 /var/log/messages
Apr  5 20:20:40 localhost kernel: [<ffffffffb42350cb>] khugepaged+0x13b/0x490
Apr  5 20:20:40 localhost kernel: [<ffffffffb40c6d10>] ? wake_up_atomic_t+0x30/0x30
Apr  5 20:20:40 localhost kernel: [<ffffffffb4234f90>] ? khugepaged_scan_mm_slot+0xfd0/0xfd0
Apr  5 20:20:40 localhost kernel: [<ffffffffb40c5c21>] kthread+0xd1/0xe0
Apr  5 20:20:40 localhost kernel: [<ffffffffb40c5b50>] ? insert_kthread_work+0x40/0x40
Apr  5 20:20:40 localhost kernel: [<ffffffffb4793df7>] ret_from_fork_nospec_begin+0x21/0x21
Apr  5 20:20:40 localhost kernel: [<ffffffffb40c5b50>] ? insert_kthread_work+0x40/0x40
Apr  5 20:20:40 localhost kernel: Code: c3 0f 1f 80 00 00 00 00 48 83 ec 10 48 89 1c 24 4c 89 64 24 08 b9 3b 00 00 00 0f 1f 40 00 66 2e 0f 1f 84 00 00 00 00 00 48 ff c9 <48> 8b 06 48 8b 5e 08 48 8b 56 10 4c 8b 46 18 4c 8b 4e 20 4c 8b 
Apr  5 20:21:32 localhost systemd-logind: New session 7 of user root.
Apr  5 20:21:32 localhost systemd: Started Session 7 of user root.
[root@slave-2 mysql]# tail -10 /data/mysql/slave-2.err 
2024-04-05T12:27:43.043789Z 0 [Warning] No argument was provided to --log-bin, and --log-bin-index was not used; so replication may break when this MySQL server acts as a master and has his hostname changed!! Please use '--log-bin=slave-2-bin' to avoid this problem.
2024-04-05T12:27:50.459824Z 0 [Note] InnoDB: PUNCH HOLE support available
2024-04-05T12:27:50.466868Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2024-04-05T12:27:50.466875Z 0 [Note] InnoDB: Uses event mutexes
2024-04-05T12:27:50.466878Z 0 [Note] InnoDB: GCC builtin __sync_synchronize() is used for memory barrier
2024-04-05T12:27:50.466884Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2024-04-05T12:27:50.466888Z 0 [Note] InnoDB: Using Linux native AIO
2024-04-05T12:27:50.828814Z 0 [Note] InnoDB: Number of pools: 1
2024-04-05T12:27:51.457352Z 0 [Note] InnoDB: Using CPU crc32 instructions
2024-04-05T12:28:02.339958Z 0 [Note] InnoDB: Initializing buffer pool, total size = 512M, instances = 1, chunk size = 128M

2.查看二进制日志是否打开(4台MySQL)

root@(none) 20:31  mysql>show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (1.34 sec)

3.查看半同步是否打开(4台MySQL)

root@(none) 20:42  mysql>show variables like "%semi_%";
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 1000       |
| 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.09 sec)

8.统一数据

利用Ansible中台控制器服务器统一数据,为了保证4台MySQL服务器上的数据一致性。

1.在ansible机器上安装ansible连接四台MySQL

创建ansible与4台MySQL服务器之间的ssh免密通道

[root@ansible .ssh]# ssh-copy-id -i id_rsa.pub root@192.168.91.160

先安装epel-release,解决依赖关系

[root@ansible ~]# yum install epel-release -y
[root@ansible ~]# yum install ansible -y

修改ansible的配置文件,添加批量控制的服务器ip地址

[root@ansible ~]# vim /etc/ansible/hosts 
[all-mysql]
192.168.91.160
192.168.91.159
192.168.91.156
192.168.91.155

[slave-backup]
192.168.91.159
192.168.91.156
192.168.91.155

2.创建一个初始数据库origin(Master)

root@(none) 20:51  mysql>create database origin;
Query OK, 1 row affected (1.10 sec)

root@(none) 21:01  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| origin             |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

目的是模仿现实的真实情况,主服务器上有数据

3.导出Master上的所有数据库

[root@master ~]# mysqldump -uroot -p'Sanchuang123#' --all-databases > all_db.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@master ~]# ls
all_db.sql  mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz  onekey_install_mysql_binary_v3.sh

4.Master创建连接Ansiblessh的免密通道

[root@master ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
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:sXcNCRlFDemZmoG8+wPSCfeBuNT/1LFqdgvym6/yO1w root@master
The key's randomart image is:
+---[RSA 2048]----+
|          o=++   |
|          .....  |
|       +.o .oo   |
|      + *oo +o.  |
|     . =S=.=...o |
|      o =.=.. E  |
|       . o.+.o   |
|        . ooBo.  |
|         ..*BBo. |
+----[SHA256]-----+
[root@master .ssh]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.91.154

5.数据传输

1.通过免密传输把Master上的all_db.sql的传给Ansible

[root@master ~]# scp all_db.sql root@192.168.91.154:/root
all_db.sql                                                  100%  855KB   4.2MB/s   00:00 

2.Ansible服务器通过ansible批量复制给剩余的3台MySQL服务器

[root@ansible ~]# ansible slave-backup -m copy -a "src=/root/all_db.sql dest=/root"

6.导入数据

利用ansible控制数据的导入

[root@ansible ~]# ansible slave-backup -m shell -a "mysql -uroot -p"Sanchuang123#" < /root/all_db.sql"
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see
details
192.168.91.156 | CHANGED | rc=0 >>
mysql: [Warning] Using a password on the command line interface can be insecure.
192.168.91.155 | CHANGED | rc=0 >>
mysql: [Warning] Using a password on the command line interface can be insecure.
192.168.91.159 | CHANGED | rc=0 >>
mysql: [Warning] Using a password on the command line interface can be insecure.

7.检查数据是否统一

root@(none) 21:33  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| origin             |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.02 sec)

问题:导入数据的时候显示GTID问题

解决方法先不开启gtid功能,数据导入同步后,再开启gtid功能

9.打开GTID

1.修改配置文件(Master,Slave-1,Slave-2)

[root@master ~]# vim /etc/my.cnf
[mysqld]
gtid-mode=ON
enforce-gtid-consistency=ON

同时在Slave-1上打开log_slave_updates=ON(启用此选项时,从服务器可以作为一个中间服务器,允许其他从服务器从这个从服务器复制数据),为了实现与Backup服务器建立主从关系

[mysqld]
log_slave_updates=ON

2.刷新MySQL服务(Master,Slave-1,Slave-2)

[root@master ~]# service mysqld restart

如果出现一下错误

[root@slave-1 ~]# service mysqld restart
Shutting down MySQL............... SUCCESS! 
Starting MySQL.................ERROR! The server quit without updating PID file (/data/mysql/slave-1.pid).

进入配置文件,把半同步配置的命令先注释掉,在重启一遍,进入MySQL,重新安装从半同步插件(如果在开启半同步之前先配置GTID就可以避免这个问题,GTID的配置与半同步配置在MySQL中的关系是相辅相成的,但并没有严格的先后顺序要求。然而,为了确保系统的稳定性和数据的一致性,通常建议先进行GTID的配置,然后再进行半同步复制的配置。)

[root@slave-1 ~]# vim /etc/my.cnf
[root@slave-1 ~]# service mysqld restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL.. SUCCESS! 
[root@slave-1 ~]# mysql -uroot -p"Sanchuang123#"
root@(none) 21:58  mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Query OK, 0 rows affected (0.08 sec)

3.清除不纯洁的环境

在主服务器上

root@(none) 22:04  mysql>reset master;
Query OK, 0 rows affected (0.07 sec)

root@(none) 22:04  mysql>show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      154 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

在从服务器上

root@(none) 22:04  mysql>reset master;
Query OK, 0 rows affected (0.08 sec)

root@(none) 22:05  mysql>stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

root@(none) 22:05  mysql>reset slave all;
Query OK, 0 rows affected (0.09 sec)

当然之前没有做过gtid的,可以不用做这些操作,但是建议进行这些操作,以免之后实验出现状况

4.在Master上新建一个授权用户

目的是给Slave来复制二进制日志,实现半同步

root@(none) 22:04  mysql>grant replication slave on *.* to 'zhangwz'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (1.19 sec)

5.从服务器连接主服务器(Slave-1,Slave-2)

root@(none) 22:05  mysql>CHANGE MASTER TO MASTER_HOST='192.168.91.160' ,
    -> MASTER_USER='zhangwz',
    -> MASTER_PASSWORD='123456',
    -> MASTER_PORT=3306,
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.10 sec)

6.查看GTID是否连接(Slave-1,Slave-2)

root@(none) 22:14  mysql>start slave;
root@(none) 22:14  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.91.160
                  Master_User: zhangwz
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 440
               Relay_Log_File: slave-1-relay-bin.000002
                Relay_Log_Pos: 655
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 440
              Relay_Log_Space: 864
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: a6e80957-f33e-11ee-82b1-000c29ec852e
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: a6e80957-f33e-11ee-82b1-000c29ec852e:1
            Executed_Gtid_Set: a6e80957-f33e-11ee-82b1-000c29ec852e:1
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

ERROR: 
No query specified

7.测试GTID连接

在Master上创建test库,创建test表,插入一些数据

root@(none) 22:09  mysql>create database test;
Query OK, 1 row affected (0.10 sec)

root@(none) 22:57  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| origin             |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.19 sec)

root@(none) 22:57  mysql>use test;
Database changed
root@test 23:00  mysql>create table test(id int,name varchar(10));
Query OK, 0 rows affected (0.60 sec)

root@test 23:00  mysql>insert into test values(1,"汪海"),(2,"王亚林");
Query OK, 2 rows affected (4.69 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@test 23:01  mysql>select * from test;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | 汪海      |
|    2 | 王亚林    |
+------+-----------+
2 rows in set (0.00 sec)

查看Slave-1,Slave-2的数据

root@(none) 22:57  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| origin             |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.00 sec)

root@(none) 23:03  mysql>select * from test.test; 
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | 汪海      |
|    2 | 王亚林    |
+------+-----------+
2 rows in set (0.09 sec)

Master开启GTID后的导出数据

mysqldump -uroot -p"Sanchuang123#" --all-databases > all_db.sql --triggers --routines --events

10.Backup服务器

1.先配置打开GTID,并且刷新服务

记得先关闭半同步功能,刷新成功后,再下载一遍半同步插件,和之前步骤一样

[root@backup ~]# service mysqld restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL.. SUCCESS! 

2.在备份服务器上指定主服务器是Slave-1

因为Slave-1打开了记录二进制日志的功能,允许Backup服务器去拉取

root@(none) 23:21  mysql>CHANGE MASTER TO MASTER_HOST='192.168.91.159' ,
    -> MASTER_USER='zhangwz',
    -> MASTER_PASSWORD='123456',
    -> MASTER_PORT=3306,
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.09 sec)

3.设置延迟备份

防止Slave-1误操作之后,Backup也跟着做了误操作

root@(none) 23:21  mysql>CHANGE MASTER TO MASTER_DELAY = 10;
Query OK, 0 rows affected (0.08 sec)

这里设置的是十秒,是为了观察效果,可以根据实际情况自己调整

4.测试

root@(none) 23:24  mysql>start slave;
root@(none) 23:24  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.91.159
                  Master_User: zhangwz
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: slave-1-bin.000001
          Read_Master_Log_Pos: 1051
               Relay_Log_File: backup-relay-bin.000002
                Relay_Log_Pos: 1268
        Relay_Master_Log_File: slave-1-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1051
              Relay_Log_Space: 1476
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 2
                  Master_UUID: da511941-f33f-11ee-8b87-000c292ad689
             Master_Info_File: /data/mysql/master.info
                    SQL_Delay: 10
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: a6e80957-f33e-11ee-82b1-000c29ec852e:1-4
            Executed_Gtid_Set: a6e80957-f33e-11ee-82b1-000c29ec852e:1-4
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

ERROR: 
No query specified

5.制作计划任务备份Master里的数据

在Master和Backup上创建一个backup文件夹

[root@master ~]# mkdir -p /backup
[root@master ~]# cd /backup/
[root@backup ~]# mkdir -p /backup

编写一个备份脚本

[root@master backup]# vim all_db_backup.sh
#!/bin/bash
mkdir -p /backup
mysqldump -uroot -p'Sanchaung123#' --all-databases --triggers --routines --events >/backup/$(date +%Y%m%d%H%M%S)all_db.sql
scp /backup/$(date +%Y%m%d%H%M%S)all_db.sql 192.168.91.155:/backup

加入计划任务,每天的凌晨2:30

[root@master backup]# crontab -e
[root@master backup]# crontab -l
30 2 * * * bash /backup/all_db_backup.sh

这里是设置计划任务,如果需要更加高效率和高可用的备份,可以使用Rsync+Sersync实现文件的实时同步

11.MySQLRouter

MySQL Router很轻量级,只能通过不同的端口来实现简单的读/写分离,且读请求的调度算法只能使用默认的rr(round-robin)轮询算法。

1.安装MySQLRouter

2个MySQLRouter服务器都要上传

MySQLRouter-8.0.21

[root@mysqlrouter-1 ~]# ls
anaconda-ks.cfg  mysql-router-community-8.0.21-1.el7.x86_64.rpm
[root@mysqlrouter-1 ~]# rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm 
警告:mysql-router-community-8.0.21-1.el7.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:mysql-router-community-8.0.21-1.e################################# [100%]

2.修改配置文件

#read-only
[routing:slaves]
bind_address = 192.168.91.157:7001 #MySQLRoute的IP
destinations = 192.168.91.159:3306,192.168.91.156:3306 #Slave的IP
mode = read-only
connect_timeout = 1

#read and write
[routing:masters]
bind_address = 192.168.91.157:7002
destinations = 192.168.91.160:3306 #Master的IP
mode = read-write
connect_timeout = 1

3.刷新服务

[root@mysqlrouter-1 mysqlrouter]#  service mysqlrouter start

4.查看端口

[root@mysqlrouter-1 mysqlrouter]# yum install net-tools -y
[root@mysqlrouter-1 mysqlrouter]# netstat -anplut|grep mysql
tcp        0      0 192.168.91.157:7001     0.0.0.0:*               LISTEN      1311/mysqlrouter    
tcp        0      0 192.168.91.157:7002     0.0.0.0:*               LISTEN      1311/mysqlrouter   
#没有安装netstat用
[root@mysqlrouter-1 mysqlrouter]# ss -anplut|grep mysql
tcp    LISTEN     0      128    192.168.91.157:7001                  *:*                   users:(("mysqlrouter",pid=1311,fd=5))
tcp    LISTEN     0      128    192.168.91.157:7002                  *:*                   users:(("mysqlrouter",pid=1311,fd=4))

5.在Master上创建2个测试账号

一个是只读,一个是读写都可以

root@(none) 00:09  mysql>grant all on *.*  to 'scwrite'@'%' identified by 'Sanchuang123#';
Query OK, 0 rows affected, 1 warning (0.20 sec)

root@(none) 00:09  mysql>grant select on *.*  to 'scread'@'%' identified by 'Sanchuang123#';
Query OK, 0 rows affected, 1 warning (0.01 sec)

6.在测试机Test上测试读写分离

首先得在测试机上安装MySQL,其实这里可以直接用Master测试的,不过为了严谨性,不使用MySQL集群里面的机器

端口号写反不会影响操作,但是没有写权限的用户走7002端口也是只读

读写分离的关键点:其实是用户的权限,
让不同的用户连接不同的端口,最后仍然要到后端的mysql服务器里去验证是否有读写的权限

[root@test backup]# mysql -h 192.168.91.157 -P 7001 -uscread -p'Sanchuang123#'
scread@(none) 00:16  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| origin             |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.00 sec)

scread@(none) 00:16  mysql>create database i;
ERROR 1044 (42000): Access denied for user 'scread'@'%' to database 'i'
[root@test backup]# mysql -h 192.168.91.157 -P 7002 -uscwrite -p'Sanchuang123#'
mysql: [Warning] Using a password on the command line interface can be insecure.


scwrite@(none) 00:20  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| origin             |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.03 sec)

scwrite@(none) 00:20  mysql>create database tt;
Query OK, 1 row affected (0.11 sec)

查看其他从服务器

root@(none) 00:21  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| origin             |
| performance_schema |
| sys                |
| test               |
| tt                 |
+--------------------+
7 rows in set (0.01 sec)

12.Keepalived

1.安装keepalived(MySQLRouter-1,MySQLRouter-2)

[root@mysqlrouter-1 mysqlrouter]#  yum install keepalived -y

2.修改配置文件(MySQLRouter-1,MySQLRouter-2)

配置双vip,增强高可用和负载均衡,MySQLRouter-2与MySQLRouter-1配置内容一样,只要修改状态和优先级,确保虚拟ip可用

[root@mysqlrouter-1 mysqlrouter]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP #状态/MASTER
    interface ens33
    virtual_router_id 51 #虚拟路由id
    priority 100 #优先级/200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111 #认证密码
    }
    virtual_ipaddress {
        192.168.91.199
    }
}


vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 61
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.91.198
    }
}
[root@test ~]# ping 192.168.91.198
PING 192.168.91.198 (192.168.91.198) 56(84) bytes of data.
From 192.168.91.161 icmp_seq=1 Destination Host Unreachable
From 192.168.91.161 icmp_seq=2 Destination Host Unreachable
From 192.168.91.161 icmp_seq=3 Destination Host Unreachable
^C
--- 192.168.91.198 ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4012ms
pipe 3
[root@test ~]# ping 192.168.91.199
PING 192.168.91.199 (192.168.91.199) 56(84) bytes of data.
From 192.168.91.161 icmp_seq=1 Destination Host Unreachable
From 192.168.91.161 icmp_seq=2 Destination Host Unreachable
From 192.168.91.161 icmp_seq=3 Destination Host Unreachable
From 192.168.91.161 icmp_seq=4 Destination Host Unreachable
^C
--- 192.168.91.199 ping statistics ---
5 packets transmitted, 0 received, +4 errors, 100% packet loss, time 4009ms
pipe 4

3.刷新服务(MySQLRouter-1,MySQLRouter-2)

[root@mysqlrouter-1 mysqlrouter]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service

4.测试双vip

1.关掉MySQLRouter-2的keepalived

[root@mysqlrouter-2 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service
[root@mysqlrouter-2 keepalived]# ps -aux |egrep keep
root       1722  0.0  0.0 112824   976 pts/0    S+   00:46   0:00 grep -E --color=auto keep
[root@mysqlrouter-1 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:29:9d:e2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.157/24 brd 192.168.91.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.91.198/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.91.199/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe29:9de2/64 scope link 
       valid_lft forever preferred_lft forever
[root@mysqlrouter-2 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7c:37:be brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.158/24 brd 192.168.91.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7c:37be/64 scope link 
       valid_lft forever preferred_lft forever

2.关掉MySQLRouter-1的keepalived

[root@mysqlrouter-1 keepalived]# service keepalived stop
Redirecting to /bin/systemctl restart keepalived.service
[root@mysqlrouter-1 mysqlrouter]# ps -aux |egrep keep
root       1521  0.0  0.0 112824   976 pts/0    S+   00:45   0:00 grep -E --color=auto keep

[root@mysqlrouter-1 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:29:9d:e2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.157/24 brd 192.168.91.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe29:9de2/64 scope link 
       valid_lft forever preferred_lft forever
[root@mysqlrouter-2 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7c:37:be brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.158/24 brd 192.168.91.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.91.198/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.91.199/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7c:37be/64 scope link 
       valid_lft forever preferred_lft forever

3.查看MySQLRouter上是否都有vip

[root@mysqlrouter-2 keepalived]# service keepalived restart
Redirecting to /bin/systemctl restart keepalived.service
[root@mysqlrouter-2 keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7c:37:be brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.158/24 brd 192.168.91.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.91.199/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7c:37be/64 scope link 
       valid_lft forever preferred_lft forever
[root@mysqlrouter-1 mysqlrouter]# service keepalived restart
Redirecting to /bin/systemctl restart keepalived.service
[root@mysqlrouter-1 mysqlrouter]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:29:9d:e2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.157/24 brd 192.168.91.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.91.199/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe29:9de2/64 scope link 
       valid_lft forever preferred_lft forever

4.问题

出现双vip,也称脑裂现象

[root@mysqlrouter-1 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:29:9d:e2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.157/24 brd 192.168.91.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.91.198/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.91.199/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe29:9de2/64 scope link 
       valid_lft forever preferred_lft foreve
[root@mysqlrouter-2 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:7c:37:be brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.158/24 brd 192.168.91.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.91.198/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.91.199/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7c:37be/64 scope link 
       valid_lft forever preferred_lft forever

        1.vrid(虚拟路由id)不一样,认证密码不一样

        2.网络通信有问题:中间有防火墙阻止了网络之间的选举的过程,vrrp报文的通信

        3.配置文件出现错误,每个实例都有俩个vip

        4.相同虚拟路由段的优先级一致

脑裂没有危害,能正常访问,反而还有负载均衡的作用

脑裂恢复的时候,还是有影响的,会短暂的中断,影响业务的

 5.配置双vip后修改配置文件

目的是增强高可用

[root@mysqlrouter-1 ~]# vim /etc/mysqlrouter/mysqlrouter.conf 
#read-only
[routing:slaves]
bind_address = 0.0.0.0:7001 #可以直接vip登录服务器,不用指定MySQLRouter的地址
destinations = 192.168.91.159:3306,192.168.91.156:3306
mode = read-only
connect_timeout = 1

#read and write
[routing:masters]
bind_address = 0.0.0.0:7002
destinations = 192.168.91.160:3306
mode = read-write
connect_timeout = 1

[root@mysqlrouter-1 ~]# service mysqlrouter restart
Redirecting to /bin/systemctl restart mysqlrouter.service
[root@mysqlrouter-1 ~]# netstat -anplut |egrep mysql
tcp        0      0 0.0.0.0:7001            0.0.0.0:*               LISTEN      1425/mysqlrouter    
tcp        0      0 0.0.0.0:7002            0.0.0.0:*               LISTEN      1425/mysqlrouter    

 13.TPCC压力测试(Test测试机器)

1.下载源码包,解压安装

[root@test ~]# wget  http://imysql.com/wp-content/uploads/2014/09/tpcc-mysql-src.tgz
-bash: wget: 未找到命令
[root@test ~]# yum install wget -y
[root@test ~]# wget  http://imysql.com/wp-content/uploads/2014/09/tpcc-mysql-src.tgz
[root@test ~]# tar xf tpcc-mysql-src.tgz

2.生成两个二进制工具

tpcc_load(提供初始化数据的功能)和tpcc_start(进行压力测试)

[root@test ~]# cd tpcc-mysql/src
[root@test src]# ls
delivery.c  main.c    ordstat.c     rthist.c    sequence.h  spt_proc.h  trans_if.h
driver.c    Makefile  parse_port.h  rthist.h    slev.c      support.c
load.c      neword.c  payment.c     sequence.c  spt_proc.c  tpc.h
[root@test src]# make
[root@test src]# cd ..
[root@test tpcc-mysql]# ls
add_fkey_idx.sql  create_table.sql  load.sh  schema2  src        tpcc_start
count.sql         drop_cons.sql     README   scripts  tpcc_load

3.测试前准备

初始化数据库,在其他的服务器上连接到读写分离器上创建tpcc库,需要在测试的服务器上创建tpcc的库

[root@test tpcc-mysql]#  mysqladmin -uscwrite -p'Sanchuang123#' -h 192.168.91.198 -P 7002 create  tpcc
mysqladmin: [Warning] Using a password on the command line interface can be insecure.

4.导入表到tpcc库里

将tpcc的create_table.sql 和add_fkey_idx.sql 远程拷贝到Master服务器上

[root@test tpcc-mysql]# scp create_table.sql add_fkey_idx.sql root@192.168.91.160:/root

在master服务器上导入create_table.sql 和add_fkey_idx.sql 文件

[root@master ~]# mysql -uroot -p'Sanchuang123#' tpcc <create_table.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@master ~]# mysql -uroot -p'Sanchuang123#' tpcc <add_fkey_idx.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

5.测试(Test机器)

1.执行脚本tpcc_load 去加载数据

[root@test tpcc-mysql]#  ./tpcc_load 192.168.91.198:7002 tpcc scwrite Sanchuang123# 15
*************************************
*** ###easy### TPC-C Data Loader  ***
*************************************
<Parameters>
     [server]: 192.168.91.198
     [port]: 7002
     [DBname]: tpcc
       [user]: scwrite
       [pass]: Sanchuang123#
  [warehouse]: 15
TPCC Data Load Started...
Loading Item 
.................................................. 5000
...................................

真实测试中,数据库仓库一般不少于100个,如果配置了ssd,建议最少不低于1000个,为了实验的效率,这里选择的是15个仓库数量,加载数据的时间可能需要一段很长的时间,之后再执行下列语句

注意:server是要测试的服务器,db,user,password也是要测的服务器上mysql的信息
#./tpcc_load  --help
./tpcc_load [server] [db] [user] [password] [warehouse]
                  服务器名 数据库名 用户名 密码 仓库数量

2.测试

[root@test tpcc-mysql]#./tpcc_start -h 192.168.91.198 -p 7002 -d tpcc -u scwrite -p Sanchuang123# -w 15 -c 12 -r 300 -l 360 -f test0.log -t test1.log - >test0.out

#./tpcc_start --help
tpcc_start -h [server_host] -P [port] -d [database_name] -u [mysql_user] -p [mysql_password] -w [warehouses] -c [connections] -r [warmup_time] -l [running_time] -i [report_interval] -f [report_file] -t [trx] - > out1
 
各个参数用法如下:
-h server_host: 服务器名
-P port : 端口号,默认为3306
-d database_name: 数据库名
-u mysql_user : 用户名
-p mysql_password : 密码
-w warehouses: 仓库的数量
-c connections : 线程数,默认为1
-r warmup_time : 热身时间,单位:s,默认为10s , 热身是为了将数据加载到内存。(真实测试中建议热身时间不低于5分钟)
-l running_time: 测试时间,单位:s,默认为20s
-i report_interval: 指定生成报告间隔时长(真实测试中不低于30min)
-f report_file: 测试结果输出文件(一般命名为xxx.log)
-t trx:输出文件
- > out1: 将控制台输出存入文件out1中

三、总结

1.规划好整个集群的架构,配置要细心

2.防火墙和selinux的问题需要多注意

3.对MySQL的集群和高可要有深刻的了解

4.Keepalived的配置需要更加细心和IP地址的规划

5.对双vip的使用,添加2条负载均衡记录实现dns轮询,达到向2个vip负载均衡器上分流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值