当前位置:   article > 正文

Mysql - 配置Mysql主从复制-keepalived高可用-读写分离集群_keepalived mysql主从

keepalived mysql主从

目录

高可用:

为什么需要高可用呢?

高可用的主要作用:

keepalived是什么?它用在哪里?

什么是VRRP协议,它的作用是什么?

搭建一个基于keepalived的高可用Mysql主从复制读写分离集群

一、项目中的IP地址配置表:

二、项目拓扑图:

项目步骤:(主从复制、读写分离、单vip高可用、双vip高可用)

1、搭建Mysql的主从复制功能:

2、使用Mysqlrouter搭建MySQL的读写分离功能

3、安装配置keepalived服务

4、修改keepalived的配置文件(从36行以下的全部都不需要)(配置单vip的高可用服务)

5、模拟测试:如果master挂掉了,那么vip是否会转移到backup上去呢?

7、外部连接测试keepalived实现的高可用效果:

8、配置双vip实现keepalived配置(跟MySQL的主主复制十分相似)

9、 负载均衡器的使用

10、进行Mysql的压力测试:

脑裂现象

脑裂有没有危害?

什么时候keepalived会产生脑裂现象呢?

情况一:vrid不一样

情况二:防火墙拦截了vrrp报文通信

 情况三:修改认证密码,查看是否出现脑裂现象


高可用:

高可用性(High Availability,HA)是指系统或功能提供者在经过设计后,该系统或功能能够长时间的保持在正常状态运行的能力。在现代信息化的环境中,高可用性已经成为了一个必不可少的概念。

为什么需要高可用呢?

防止出现单点故障,主要是因为现代IT系统对于稳定性具有较高的要求,一旦系统出现故障(出现单点故障),将会影响到业务的正常运转,甚至会导致数据丢失等重大问题,从而造成严重的损失。所以,必须确保系统能够尽可能地持续稳定地运行,保证了业务的连续性与数据的可靠性。

高可用的主要作用:

高可用的主要作用包括:

  1. 提高系统的稳定性:高可用架构通过冗余、备份、灾备等措施,可以避免单点故障,提高系统的稳定性和可用性,保证服务的连续性。

  2. 提高业务的可靠性:高可用架构可以保证业务的可靠性,避免因为系统故障导致的数据丢失等问题,从而保证业务的正常运转。

  3. 改善用户体验:高可用架构可以提高系统的性能和响应速度,改善用户的体验,同时还可以提高系统的扩展性和可靠性。

  4. 降低维护成本:通过高可用架构降低应用程序的停机时间和维护成本,避免出现服务中断而导致的维护费用增加。

总之,高可用性是一种确保业务连续性的重要手段,它可以避免因为单点故障而带来的损失,并且可以保证业务的持续稳定运行。

keepalived是什么?它用在哪里?

keepalived的官方网站:Keepalived for Linux

keepalived是一种开源软件,它提供了一个简单而高效的方式来实现负载均衡和故障转移。keepalived能够监视可用服务器的状态,并确保将请求路由到可用服务器上,同时在服务器故障时能够及时切换到备用服务器,以保证服务的高可用性。

keepalived主要用于以下几个方面:

  1. 实现负载均衡:keepalived能够使用不同的算法,例如轮询(Round Robin)、加权轮询、最少连接数等,将客户端请求平均地分配到多个后端服务器上,以达到负载均衡的目的。

  2. 提高系统的可用性:keepalived可以对多台服务器进行监视,并自动切换到另一个可用的节点来避免单点故障。通过自动检测和切换,keepalived可以确保应用程序始终处于可用状态,从而提高系统的可用性。

  3. 构建高可用性架构:通过配合其他技术,例如虚拟IP地址(Virtual IP address)、虚拟路由器冗余协议(VRRP)等,keepalived可以帮助构建高可用性架构,从而保证服务的连续性和稳定性。

总之,keepalived是一款功能强大的开源软件,它可以帮助构建高可用性、可伸缩性和安全性的应用程序。它在各种Web应用程序、负载均衡设备、邮件服务器等系统中得到了广泛的应用。

什么是VRRP协议,它的作用是什么?

VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)是一种网络协议用于提高路由器系统的可用性和可靠性。它通过将多个路由器组合成一个虚拟路由器,只有一个路由器处于活动状态,其他路由器都是备份状态,从而达到提供冗余和故障转移的目的。

vip:virtual ip 虚拟IP地址,这个地址是对外提供服务的

参考文档:VRRP原理及配置 - 榕霖 - 博客园 (cnblogs.com)

具体来说,VRRP的作用包括:

  1. 提供冗余:通过将多个路由器组合成一个虚拟路由器,只有一个路由器处于活动状态,其他路由器都是备份状态,当活动路由器出现故障时,备用路由器可以自动接管其工作,确保网络服务不中断。

  2. 提高可用性:由于VRRP使用了路由器的冗余,所以即使在单个设备或链路出现故障时,也能够保持网络的连通性,从而提高了网络的可用性和可靠性。

  3. 支持负载均衡:当多个路由器同时处于活动状态时,VRRP可以自动将流量分布到各个路由器之间,实现负载均衡。

总之,VRRP协议是一种非常有效的网络协议,主要用于提供网络冗余和故障转移,提高网络的可用性和可靠性。它被广泛应用于企业内部网络、互联网服务提供商(ISP)等各种网络环境中。

vid:虚拟ip地址,这个地址是对外提供服务的

搭建一个基于keepalived的高可用Mysql主从复制读写分离集群

一、项目中的IP地址配置表:

中间件:安装mysqlrouter 和 keepalived

master:192.168.2.181

backup:192.168.2.182

vip:192.168.2.221

Linux客户机:192.168.2.43

Mysql服务器:安装Mysql数据库

master:192.168.2.150

slave-1:192.168.2.151

slave-2:192.168.2.152

二、项目拓扑图:

项目步骤:(主从复制、读写分离、单vip高可用、双vip高可用)

1、搭建Mysql的主从复制功能:

参考:Mysql - 主从复制介绍_Claylpf的博客-CSDN博客

 1、修改主机名

  1. [root@web-3 ~]# hostnamectl set-hostname mysql-3
  2. [root@web-3 ~]# su -
  3. 上一次登录:五 811 13:28:25 CST 2023192.168.2.7pts/0
  4. [root@mysql-3 ~]#

2、安装Mysql

参考:Mysql的介绍和软件环境的部署_mysql有软件吗_Claylpf的博客-CSDN博客

编辑一键成功安装mysql脚本 onekey_install_mysql_binary.sh

  1. [root@web ~]# cat onekey_install_mysql_binary.sh
  2. #!/bin/bash
  3. #步骤:
  4. #解决软件依赖关系
  5. yum install cmake ncurses-devel gcc gcc-c++ vim lsof bzip2 openssl-devel -y
  6. #解压二进制安装包
  7. tar xf mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz
  8. #移动mysql解压文件到/usr/local下,改名为mysql
  9. mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql
  10. #新建组和用户 mysql
  11. groupadd mysql
  12. #mysql这个用户的shell 是/bin/false 无法被调用 表示系统用户 属于mysql这个组
  13. useradd -r -g mysql -s /bin/false mysql
  14. #进入/usr/local/mysql
  15. cd /usr/local/mysql
  16. #关闭firewalld防火墙服务,并且设置开机不启动
  17. service firewalld stop
  18. systemctl disable firewalld
  19. #临时关闭selinux,永久关闭selinux
  20. setenforce 0
  21. sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
  22. #mysql初始化操作
  23. #创建/data/mysql文档用于存放数据使用
  24. mkdir /data/mysql -p
  25. #修改文件权限和组别,这样mysql用户可以对这个文件夹进行读写操作了
  26. chown mysql:mysql /data/mysql/
  27. chmod 750 /data/mysql/
  28. #进入/usr/local/mysql/bin目录下进行初始化操作
  29. cd /usr/local/mysql/bin
  30. #设置启动用户为mysql base目录为/usr/local/mysql/ data目录为/data/mysql &>passwd.txt目的是将生成的临时密码存入passwd.txt文件中
  31. ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql &>passwd.txt
  32. #让mysql支持ssl方式登录的设置
  33. ./mysql_ssl_rsa_setup --datadir=/data/mysql/
  34. #获得临时密码
  35. tem_passwd=$(cat passwd.txt| grep "temporary" | awk '{print $NF}')
  36. #$NF表示最后一个字段
  37. #修改环境变量,添加我们编译安装的mysql的可执行命令的路径
  38. #临时修改PATH变量的值
  39. export PATH=/usr/local/mysql/bin/:$PATH
  40. #永久修改
  41. echo "PATH=/usr/local/mysql/bin:$PATH" >>/root/.bashrc
  42. #刷新/root/.bashrc文档
  43. source ~/.bashrc
  44. #复制support-files里的mysql.server文件到/etc/init.d目录下叫mysqld
  45. cp ../support-files/mysql.server /etc/init.d/mysqld
  46. #修改/etc/init.d/mysqld内的第70行的内容(datadir目录的值)
  47. sed -i '70c datadir=/data/mysql' /etc/init.d/mysqld
  48. #生成/etc/my.cnf配置文件
  49. cat >/etc/my.cnf <<EOF
  50. [mysqld_safe]
  51. [client]
  52. socket=/data/mysql/mysql.sock
  53. [mysqld]
  54. socket=/data/mysql/mysql.sock
  55. port = 3306
  56. open_files_limit = 8192
  57. innodb_buffer_pool_size = 512M
  58. character-set-server=utf8
  59. [mysql]
  60. auto-rehash
  61. prompt=\\u@\\d \\R:\\m mysql>
  62. EOF
  63. #启动mysqld服务
  64. service mysqld start
  65. #将mysqld添加到linux系统里的服务管理名单里
  66. chkconfig --add mysqld
  67. #设置mysqld服务开机启动
  68. /sbin/chkconfig mysqld on
  69. #登录重新设置初始密码为123456
  70. #初次修改密码需要使用 --connect-expired-password 选项
  71. #-e 后面接的命令是表示我们需要在mysql里执行的命令
  72. #set password='123456'; 表示修改root用户的密码为:123456
  73. mysql -uroot -p$tem_passwd --connect-expired-password -e "set password='123456';"
  74. #建议修改密码是否修改成功
  75. mysql -uroot -p123456 -e 'show databases;' && echo "database is installed success"
  76. [root@web ~]#

3、在master服务器上开启二进制日志配置server_id=1,并且在从服务器上配置server_id=2

master上 

  1. [root@mysql-1 ~]# cat /etc/my.cnf
  2. [mysqld_safe]
  3. [client]
  4. socket=/data/mysql/mysql.sock
  5. [mysqld]
  6. socket=/data/mysql/mysql.sock
  7. log-error=/data/mysql/mysql_error.log #表示设置Mysql的error日志的路径
  8. slow_query_log = 1 #表示开启Mysql慢日志
  9. long_query_time = 0.001 #表示设置慢日志的阈值为0.001毫秒
  10. general_log #我们不需要添加路径了,因为Mysql会自动帮助我们添加通用日志的路径和日志文件,表示打开了通用日志
  11. log_bin #表示我们开启了二进制日志
  12. server_id = 1 #给我们的Mysql服务器进行编号
  13. expire_logs_days = 7 #表示二进制日志文件过 7天 自动清除
  14. port = 3306
  15. open_files_limit = 8192
  16. innodb_buffer_pool_size = 512M
  17. character-set-server=utf8
  18. [mysql]
  19. auto-rehash
  20. prompt=\u@\d \R:\m mysql>
  21. [root@mysql-1 ~]#

slave上:

  1. [root@mysql-2 ~]# cat /etc/my.cnf
  2. [mysqld_safe]
  3. [client]
  4. socket=/data/mysql/mysql.sock
  5. [mysqld]
  6. socket=/data/mysql/mysql.sock
  7. log-error=/data/mysql/mysql_error.log #表示设置Mysql的error日志的路径
  8. server_id = 2 #给我们的Mysql服务器进行编号
  9. port = 3306
  10. open_files_limit = 8192
  11. innodb_buffer_pool_size = 512M
  12. character-set-server=utf8
  13. [mysql]
  14. auto-rehash
  15. prompt=\u@\d \R:\m mysql>
  16. [root@mysql-2 ~]#

重启master和slave的Mysql数据库服务

[root@mysql-1 ~]# systemctl restart mysqld

4、在master上创建可以给slave服务器过来复制二进制日志文件的用户

  1. [root@mysql-1 ~]# mysql -u root -p
  2. Enter password:
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 4
  5. Server version: 5.7.41 MySQL Community Server (GPL)
  6. Copyright (c) 2000, 2023, Oracle and/or its affiliates.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. #创建sc_slave用户,允许任意网段访问
  12. root@(none) 15:40 mysql>create user 'sc_slave'@'%' identified by '123456';
  13. Query OK, 0 rows affected (0.01 sec)
  14. #赋予该用户允许复制二进制日志文件的权限
  15. root@(none) 15:40 mysql>grant replication slave on *.* to 'sc_slave'@'%';
  16. Query OK, 0 rows affected (0.00 sec)
  17. #重新加载用户权限表
  18. root@(none) 15:40 mysql>FLUSH PRIVILEGES;

5、在master上做一个全备,导出数据,导入到slave上,保持master和slave上的数据是一致的。

  1. #为master上的数据做全备,并导出
  2. [root@localhost /]# mkdir /backup
  3. [root@localhost /]# mysqldump -uroot -p'123456' --all-databases > /backup/all_db.sql
  4. mysqldump: [Warning] Using a password on the command line interface can be insecure.

6、再将导出的数据传出到slave服务器上去,并将该sql文件导入Mysql数据库中

  1. [root@mysql-1 ~]# scp /backup/all_db.sql root@192.168.2.151:/root
  2. The authenticity of host '192.168.2.151 (192.168.2.151)' can't be established.
  3. ECDSA key fingerprint is SHA256:5T9UOchKhhnoIu0w3essfdXjciGmtmWYTSS/XBnZasM.
  4. ECDSA key fingerprint is MD5:d4:bb:9a:9e:00:17:06:f7:6d:bd:e5:04:71:f5:b3:29.
  5. Are you sure you want to continue connecting (yes/no)? yes
  6. Warning: Permanently added '192.168.2.151' (ECDSA) to the list of known hosts.
  7. root@192.168.2.151's password:
  8. all_db.sql 100% 866KB 18.9MB/s 00:00
  9. [root@mysql-1 ~]# scp /backup/all_db.sql root@192.168.2.152:/root
  10. The authenticity of host '192.168.2.152 (192.168.2.152)' can't be established.
  11. ECDSA key fingerprint is SHA256:k1RjBZPXEHcDY+5UaqCp7ZdyW0e1daRrc1m+GVoZ5fc.
  12. ECDSA key fingerprint is MD5:e6:1f:62:65:8e:66:9c:b2:8e:a1:40:c3:57:ad:e5:ab.
  13. Are you sure you want to continue connecting (yes/no)? yes
  14. Warning: Permanently added '192.168.2.152' (ECDSA) to the list of known hosts.
  15. root@192.168.2.152's password:
  16. all_db.sql 100% 866KB 58.2MB/s 00:00
  17. [root@mysql-1 ~]#

将该sql文件导入Mysql数据库中

  1. [root@mysql-2 ~]# mysql -uroot -p'123456' < all_db.sql
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. [root@mysql-2 ~]#

检查我们的slave的Mysql数据是否与master的Mysql数据一致

7、在slave上配置master上拉取的二进制日志用户名和密码和日志文件名称和位置号和端口等信息

在master上查看二进制日志文件和位置号:

  1. [root@mysql-1 ~]# mysql -uroot -p123456
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 2
  5. Server version: 5.7.41-log MySQL Community Server (GPL)
  6. Copyright (c) 2000, 2023, Oracle and/or its affiliates.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. # 刷新二进制文件
  12. root@(none) 15:51 mysql>flush logs;
  13. Query OK, 0 rows affected (0.01 sec)
  14. # 查看位置号
  15. root@(none) 15:51 mysql>show master status;
  16. +--------------------+----------+--------------+------------------+-------------------+
  17. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  18. +--------------------+----------+--------------+------------------+-------------------+
  19. | mysql-1-bin.000002 | 154 | | | |
  20. +--------------------+----------+--------------+------------------+-------------------+
  21. 1 row in set (0.00 sec)
  22. root@(none) 15:51 mysql>

上图所示,我通过flush logs命令刷新了二进制日志,产生了一个新的二进制日志文件,位置号为:154。

在slave上配置关于master的配置并上拉取二进制日志的用户信息和日志文件的名称和位置号

  1. root@(none) 15:31 mysql>CHANGE MASTER TO MASTER_HOST='192.168.2.150',
  2. -> MASTER_USER='sc_slave',
  3. -> MASTER_PASSWORD='123456',
  4. -> MASTER_PORT=3306,
  5. -> MASTER_LOG_FILE='mysql-1-bin.000002',
  6. -> MASTER_LOG_POS=154;
  7. Query OK, 0 rows affected, 2 warnings (0.01 sec)

当我们的信息配置完成后,查看slave服务器状态

  1. root@(none) 15:21 mysql>show slave status\G;
  2. *************************** 1. row ***************************
  3. Slave_IO_State:
  4. Master_Host: 192.168.2.149
  5. Master_User: sc_slave
  6. Master_Port: 3306
  7. Connect_Retry: 60
  8. Master_Log_File: mysql-bin.000006
  9. Read_Master_Log_Pos: 154
  10. Relay_Log_File: mysql-2-relay-bin.000001
  11. Relay_Log_Pos: 4
  12. Relay_Master_Log_File: mysql-bin.000006
  13. Slave_IO_Running: No
  14. Slave_SQL_Running: No
  15. Replicate_Do_DB:
  16. Replicate_Ignore_DB:
  17. Replicate_Do_Table:
  18. Replicate_Ignore_Table:
  19. Replicate_Wild_Do_Table:
  20. Replicate_Wild_Ignore_Table:
  21. Last_Errno: 0
  22. Last_Error:
  23. Skip_Counter: 0
  24. Exec_Master_Log_Pos: 154
  25. Relay_Log_Space: 154
  26. Until_Condition: None
  27. Until_Log_File:
  28. Until_Log_Pos: 0
  29. Master_SSL_Allowed: No
  30. Master_SSL_CA_File:
  31. Master_SSL_CA_Path:
  32. Master_SSL_Cert:
  33. Master_SSL_Cipher:
  34. Master_SSL_Key:
  35. Seconds_Behind_Master: NULL
  36. Master_SSL_Verify_Server_Cert: No
  37. Last_IO_Errno: 0
  38. Last_IO_Error:
  39. Last_SQL_Errno: 0
  40. Last_SQL_Error:
  41. Replicate_Ignore_Server_Ids:
  42. Master_Server_Id: 0
  43. Master_UUID:
  44. Master_Info_File: /data/mysql/master.info
  45. SQL_Delay: 0
  46. SQL_Remaining_Delay: NULL
  47. Slave_SQL_Running_State:
  48. Master_Retry_Count: 86400
  49. Master_Bind:
  50. Last_IO_Error_Timestamp:
  51. Last_SQL_Error_Timestamp:
  52. Master_SSL_Crl:
  53. Master_SSL_Crlpath:
  54. Retrieved_Gtid_Set:
  55. Executed_Gtid_Set:
  56. Auto_Position: 0
  57. Replicate_Rewrite_DB:
  58. Channel_Name:
  59. Master_TLS_Version:

9、在master和slave上都关闭防火墙和selinux(可以防止我们的端口信息备防火墙拦截了)

  1. [root@mysql-2 ~]# service firewalld stop
  2. Redirecting to /bin/systemctl stop firewalld.service
  3. [root@mysql-2 ~]# systemctl disable firewalld
  4. [root@mysql-2 ~]#

10、启动slave服务器,查看IO线程和SQL线程是否正常启动

直接使用start slave命令

如果启动了,可以查看如下:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes 

如果出现了上述内容,说明Mysql的主从复制功能成功的搭建了

  1. root@(none) 15:32 mysql>start slave;
  2. Query OK, 0 rows affected (0.01 sec)
  3. root@(none) 15:32 mysql>show slave status\G;
  4. *************************** 1. row ***************************
  5. Slave_IO_State: Waiting for master to send event
  6. Master_Host: 192.168.2.150
  7. Master_User: sc_slave
  8. Master_Port: 3306
  9. Connect_Retry: 60
  10. Master_Log_File: mysql-1-bin.000002
  11. Read_Master_Log_Pos: 154
  12. Relay_Log_File: mysql-2-relay-bin.000002
  13. Relay_Log_Pos: 322
  14. Relay_Master_Log_File: mysql-1-bin.000002
  15. Slave_IO_Running: Yes
  16. Slave_SQL_Running: Yes
  17. Replicate_Do_DB:
  18. Replicate_Ignore_DB:
  19. Replicate_Do_Table:
  20. Replicate_Ignore_Table:
  21. Replicate_Wild_Do_Table:
  22. Replicate_Wild_Ignore_Table:
  23. Last_Errno: 0
  24. Last_Error:
  25. Skip_Counter: 0
  26. Exec_Master_Log_Pos: 154
  27. Relay_Log_Space: 531
  28. Until_Condition: None
  29. Until_Log_File:
  30. Until_Log_Pos: 0
  31. Master_SSL_Allowed: No
  32. Master_SSL_CA_File:
  33. Master_SSL_CA_Path:
  34. Master_SSL_Cert:
  35. Master_SSL_Cipher:
  36. Master_SSL_Key:
  37. Seconds_Behind_Master: 0
  38. Master_SSL_Verify_Server_Cert: No
  39. Last_IO_Errno: 0
  40. Last_IO_Error:
  41. Last_SQL_Errno: 0
  42. Last_SQL_Error:
  43. Replicate_Ignore_Server_Ids:
  44. Master_Server_Id: 1
  45. Master_UUID: 692c05f7-3819-11ee-b41f-000c292d4c72
  46. Master_Info_File: /data/mysql/master.info
  47. SQL_Delay: 0
  48. SQL_Remaining_Delay: NULL
  49. Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  50. Master_Retry_Count: 86400
  51. Master_Bind:
  52. Last_IO_Error_Timestamp:
  53. Last_SQL_Error_Timestamp:
  54. Master_SSL_Crl:
  55. Master_SSL_Crlpath:
  56. Retrieved_Gtid_Set:
  57. Executed_Gtid_Set:
  58. Auto_Position: 0
  59. Replicate_Rewrite_DB:
  60. Channel_Name:
  61. Master_TLS_Version:
  62. 1 row in set (0.00 sec)
  63. ERROR:
  64. No query specified
  65. root@(none) 15:32 mysql>

2、使用Mysqlrouter搭建MySQL的读写分离功能

参考:Mysql - 读写分离_mysql读写分离的工具_Claylpf的博客-CSDN博客 

mysqlrouter.conf 配置文件配置:(mysqlrouter必须绑定到vip上或者使用任意地址0.0.0.0

(切记不能添加注释,我添加是为了方便解释,否则会报错)

  1. [root@mysqlrouter-1 mysqlrouter]# cat mysqlrouter.conf
  2. # Copyright (c) 2015, 2023, Oracle and/or its affiliates.
  3. #
  4. # This program is free software; you can redistribute it and/or modify
  5. # it under the terms of the GNU General Public License, version 2.0,
  6. # as published by the Free Software Foundation.
  7. #
  8. # This program is also distributed with certain software (including
  9. # but not limited to OpenSSL) that is licensed under separate terms,
  10. # as designated in a particular file or component or in included license
  11. # documentation. The authors of MySQL hereby grant you an additional
  12. # permission to link the program and your derivative works with the
  13. # separately licensed software that they have included with MySQL.
  14. #
  15. # This program is distributed in the hope that it will be useful,
  16. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. # GNU General Public License, version 2.0, for more details.
  19. #
  20. # You should have received a copy of the GNU General Public License
  21. # along with this program; if not, write to the Free Software
  22. # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  23. #
  24. # MySQL Router configuration file
  25. #
  26. # Documentation is available at
  27. # http://dev.mysql.com/doc/mysql-router/en/
  28. [DEFAULT]
  29. logging_folder = /var/log/mysqlrouter
  30. runtime_folder = /run/mysqlrouter
  31. config_folder = /etc/mysqlrouter
  32. [logger]
  33. level = INFO
  34. # If no plugin is configured which starts a service, keepalive
  35. # will make sure MySQL Router will not immediately exit. It is
  36. # safe to remove once Router is configured.
  37. [keepalive]
  38. interval = 60
  39. [routing:read_write]
  40. bind_address = 192.168.2.221 #vip地址 虚拟IP地址,可以在keepalived配置之前确定 当然我们可以使用0.0.0.0(任意IP地址),那么不管是vip还是本机的ip地址所对应的7001端口都能访问到
  41. bind_port= 7001 #自己的端口号
  42. destinations = 192.168.2.150:3306 #设置目的机器IP地址,可以填master的IP,端口为mysqld运行的端口
  43. mode = read-write #设置目的机器IP地址,可以填master的IP,端口为mysqld运行的端口
  44. max_connections = 65535
  45. max_connect_errors = 100
  46. client_connect_timeout = 9
  47. [routing:read_only_1]
  48. bind_address = 192.168.2.221
  49. bind_port= 7002
  50. destinations = 192.168.2.151:3306 #设置目的机器IP地址,可以填master的IP,端口为mysqld运行的端口
  51. mode = read-only
  52. max_connections = 65535
  53. max_connect_errors = 100
  54. client_connect_timeout = 9
  55. [routing:read_only_2]
  56. bind_address = 192.168.2.221
  57. bind_port= 7003
  58. destinations = 192.168.2.152:3306 #设置目的机器IP地址,可以填master的IP,端口为mysqld运行的端口
  59. mode = read-only
  60. max_connections = 65535
  61. max_connect_errors = 100
  62. client_connect_timeout = 9
  63. [root@mysqlrouter-1 mysqlrouter]#

成功刷新mysqlrouter服务

  1. [root@mysqlrouter-1 mysqlrouter]# service mysqlrouter restart
  2. Redirecting to /bin/systemctl restart mysqlrouter.service
  3. [root@mysqlrouter-1 mysqlrouter]#

查看端口:

  1. [root@mysqlrouter-1 mysqlrouter]# netstat -anpult |grep mysqlrouter
  2. tcp 0 0 192.168.2.221:7001 0.0.0.0:* LISTEN 42847/mysqlrouter
  3. tcp 0 0 192.168.2.221:7002 0.0.0.0:* LISTEN 42847/mysqlrouter
  4. tcp 0 0 192.168.2.221:7003 0.0.0.0:* LISTEN 42847/mysqlrouter
  5. [root@mysqlrouter-1 mysqlrouter]#

3、安装配置keepalived服务

下载keepalived服务:

  1. [root@mysqlrouter-1 mysqlrouter]# yum install keepalived -y
  2. 已安装:
  3. keepalived.x86_64 0:1.3.5-19.el7
  4. 作为依赖被安装:
  5. lm_sensors-libs.x86_64 0:3.4.0-8.20160601gitf9185e5.el7 net-snmp-agent-libs.x86_64 1:5.7.2-49.el7_9.2 net-snmp-libs.x86_64 1:5.7.2-49.el7_9.2
  6. 完毕!

4、修改keepalived的配置文件(从36行以下的全部都不需要)(配置单vip的高可用服务)

master上的配置

  1. global_defs {
  2. notification_email {
  3. acassen@firewall.loc
  4. failover@firewall.loc
  5. sysadmin@firewall.loc
  6. }
  7. notification_email_from Alexandre.Cassen@firewall.loc
  8. smtp_server 192.168.200.1
  9. smtp_connect_timeout 30
  10. router_id LVS_DEVEL
  11. vrrp_skip_check_adv_addr
  12. # vrrp_strict # 这一行需要注释:原因是因为会在iptables里添加一条规则,会阻止网络通信,导致出现脑裂现象
  13. vrrp_garp_interval 0
  14. vrrp_gna_interval 0
  15. }
  16. vrrp_instance VI_1 { # 定义一个vrrp协议的实例 名字是VI_1 表示第一个vrrp实例
  17. state MASTER # 做master角色
  18. interface ens33 # 指定监听网络的接口,其实就是vip绑定到那个网络接口上
  19. virtual_router_id 81 # 虚拟路由器ID 81表示的是编号,另外一台机器上的配置也必须是81
  20. priority 160 # 优先级 数字越大就越容易成为master
  21. advert_int 1 # 宣告消息的时间间隔 为1s
  22. authentication {
  23. auth_type PASS # 密码认证 password
  24. auth_pass 1111 # 具体密码 可以不用修改
  25. }
  26. virtual_ipaddress { # vip 虚拟ip地址 可以配置多个
  27. 192.168.2.221 # 配置的vip
  28. #192.168.200.17
  29. #192.168.200.18
  30. }
  31. }

backup上的配置

  1. [root@mysqlrouter-2 keepalived]# cat keepalived.conf
  2. global_defs {
  3. notification_email {
  4. acassen@firewall.loc
  5. failover@firewall.loc
  6. sysadmin@firewall.loc
  7. }
  8. notification_email_from Alexandre.Cassen@firewall.loc
  9. smtp_server 192.168.200.1
  10. smtp_connect_timeout 30
  11. router_id LVS_DEVEL
  12. vrrp_skip_check_adv_addr
  13. # vrrp_strict # 这一行需要注释:原因是因为会在iptables里添加一条规则,会阻止网络通信,导致出现脑裂现象
  14. vrrp_garp_interval 0
  15. vrrp_gna_interval 0
  16. }
  17. vrrp_instance VI_1 { # 定义一个vrrp协议的实例 名字是VI_1 表示第一个vrrp实例
  18. state BACKUP # 做backup角色
  19. interface ens33 # 指定监听网络的接口,其实就是vip绑定到那个网络接口上
  20. virtual_router_id 81 # 虚拟路由器ID 81表示的是编号,另外一台机器上的配置也必须是81
  21. priority 100 # 优先级 数字越大就越容易成为master
  22. advert_int 1 # 宣告消息的时间间隔 为1s
  23. authentication {
  24. auth_type PASS # 密码认证 password
  25. auth_pass 1111 # 具体密码 可以不用修改
  26. }
  27. virtual_ipaddress { # vip 虚拟ip地址 可以配置多个
  28. 192.168.2.221 # 配置的vip 必须与master配置的vip是一样的
  29. #192.168.200.17
  30. #192.168.200.18
  31. }
  32. }
  33. [root@mysqlrouter-2 keepalived]#

重新启动keepalived服务

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

查看效果:

  1. [root@mysqlrouter-1 keepalived]# ip add
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. inet6 ::1/128 scope host
  7. valid_lft forever preferred_lft forever
  8. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  9. link/ether 00:0c:29:90:87:dc brd ff:ff:ff:ff:ff:ff
  10. inet 192.168.2.181/24 brd 192.168.2.255 scope global noprefixroute ens33
  11. valid_lft forever preferred_lft forever
  12. inet 192.168.2.221/32 scope global ens33
  13. valid_lft forever preferred_lft forever
  14. inet6 fe80::20c:29ff:fe90:87dc/64 scope link
  15. valid_lft forever preferred_lft forever
  16. [root@mysqlrouter-1 keepalived]#

5、模拟测试:如果master挂掉了,那么vip是否会转移到backup上去呢?

我们将master上的keepalived关闭,查看backup上的ip地址

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

backup上的IP地址

  1. [root@mysqlrouter-2 keepalived]# ip add
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. inet6 ::1/128 scope host
  7. valid_lft forever preferred_lft forever
  8. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  9. link/ether 00:0c:29:a9:7f:87 brd ff:ff:ff:ff:ff:ff
  10. inet 192.168.2.182/24 brd 192.168.2.255 scope global noprefixroute ens33
  11. valid_lft forever preferred_lft forever
  12. inet 192.168.2.221/32 scope global ens33
  13. valid_lft forever preferred_lft forever
  14. inet6 fe80::20c:29ff:fea9:7f87/64 scope link
  15. valid_lft forever preferred_lft forever
  16. [root@mysqlrouter-2 keepalived]#

成功观察到我们想要的效果,vip真的漂移到了backup上了

当我们重启master,vip又会从backup上漂移到master上去的

  1. [root@mysqlrouter-1 keepalived]# service keepalived start
  2. Redirecting to /bin/systemctl start keepalived.service
  3. [root@mysqlrouter-1 keepalived]# ip add
  4. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  5. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  6. inet 127.0.0.1/8 scope host lo
  7. valid_lft forever preferred_lft forever
  8. inet6 ::1/128 scope host
  9. valid_lft forever preferred_lft forever
  10. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  11. link/ether 00:0c:29:90:87:dc brd ff:ff:ff:ff:ff:ff
  12. inet 192.168.2.181/24 brd 192.168.2.255 scope global noprefixroute ens33
  13. valid_lft forever preferred_lft forever
  14. inet 192.168.2.221/32 scope global ens33
  15. valid_lft forever preferred_lft forever
  16. inet6 fe80::20c:29ff:fe90:87dc/64 scope link
  17. valid_lft forever preferred_lft forever
  18. [root@mysqlrouter-1 keepalived]#

7、外部连接测试keepalived实现的高可用效果:

当我通过Linux上访问192.168.2.221:7001端口的时候,他会访问到我们的master机器的3306端口上去(Mysql数据库的默认端口是3306)

  1. [root@mysql-2 ~]# mysql -h 192.168.2.221 -P 7001 -u claylpf -p
  2. Enter password:
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 21
  5. Server version: 5.7.41-log MySQL Community Server (GPL)
  6. Copyright (c) 2000, 2023, Oracle and/or its affiliates.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. claylpf@(none) 18:54 mysql>exit
  12. Bye
  13. [root@test ~]#
  14. [root@mysql-2 ~]# mysql -h 192.168.2.221 -P 7002 -u claylpf -p
  15. Enter password:
  16. Welcome to the MySQL monitor. Commands end with ; or \g.
  17. Your MySQL connection id is 20
  18. Server version: 5.7.41 MySQL Community Server (GPL)
  19. Copyright (c) 2000, 2023, Oracle and/or its affiliates.
  20. Oracle is a registered trademark of Oracle Corporation and/or its
  21. affiliates. Other names may be trademarks of their respective
  22. owners.
  23. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  24. claylpf@(none) 19:15 mysql>

8、配置双vip实现keepalived配置(跟MySQL的主主复制十分相似)

双 VIP 可以用于实现高可用性架构。在一个服务器出现故障时,流量可以被自动切换到另一个服务器,从而保持服务的连续性。这在负载均衡、高可用的网络应用中特别有用。

master配置文件:

  1. [root@mysqlrouter-1 keepalived]# cat keepalived.conf
  2. global_defs {
  3. notification_email {
  4. acassen@firewall.loc
  5. failover@firewall.loc
  6. sysadmin@firewall.loc
  7. }
  8. notification_email_from Alexandre.Cassen@firewall.loc
  9. smtp_server 192.168.200.1
  10. smtp_connect_timeout 30
  11. router_id LVS_DEVEL
  12. vrrp_skip_check_adv_addr
  13. # vrrp_strict
  14. vrrp_garp_interval 0
  15. vrrp_gna_interval 0
  16. }
  17. vrrp_instance VI_1 {
  18. state MASTER
  19. interface ens33
  20. virtual_router_id 81
  21. priority 160
  22. advert_int 1
  23. authentication {
  24. auth_type PASS
  25. auth_pass 1111
  26. }
  27. virtual_ipaddress {
  28. 192.168.2.221
  29. }
  30. }
  31. vrrp_instance VI_2 {
  32. state BACKUP
  33. interface ens33
  34. virtual_router_id 101
  35. priority 100
  36. advert_int 1
  37. authentication {
  38. auth_type PASS
  39. auth_pass 1111
  40. }
  41. virtual_ipaddress {
  42. 192.168.2.201
  43. }
  44. }
  45. [root@mysqlrouter-1 keepalived]#

backup配置文件:

  1. [root@mysqlrouter-2 keepalived]# cat keepalived.conf
  2. global_defs {
  3. notification_email {
  4. acassen@firewall.loc
  5. failover@firewall.loc
  6. sysadmin@firewall.loc
  7. }
  8. notification_email_from Alexandre.Cassen@firewall.loc
  9. smtp_server 192.168.200.1
  10. smtp_connect_timeout 30
  11. router_id LVS_DEVEL
  12. vrrp_skip_check_adv_addr
  13. # vrrp_strict # 这一行需要注释:原因是因为会在iptables里添加一条规则,会阻止网络通信,导致出现脑裂现象
  14. vrrp_garp_interval 0
  15. vrrp_gna_interval 0
  16. }
  17. vrrp_instance VI_1 { # 定义一个vrrp协议的实例 名字是VI_1 表示第一个vrrp实例
  18. state BACKUP # 做backup角色
  19. interface ens33 # 指定监听网络的接口,其实就是vip绑定到那个网络接口上
  20. virtual_router_id 81 # 虚拟路由器ID 81表示的是编号,另外一台机器上的配置也必须是51
  21. priority 100 # 优先级 数字越大就越容易成为master
  22. advert_int 1 # 宣告消息的时间间隔 为1s
  23. authentication {
  24. auth_type PASS # 密码认证 password
  25. auth_pass 1111 # 具体密码 可以不用修改
  26. }
  27. virtual_ipaddress { # vip 虚拟ip地址 可以配置多个
  28. 192.168.2.221 # 配置的vip 必须与master配置的vip是一样的
  29. }
  30. }
  31. vrrp_instance VI_2 { # 定义一个vrrp协议的实例 名字是VI_1 表示第一个vrrp实例
  32. state MASTER # 做backup角色
  33. interface ens33 # 指定监听网络的接口,其实就是vip绑定到那个网络接口上
  34. virtual_router_id 101 # 虚拟路由器ID 101表示的是编号,另外一台机器上的配置也必须是101
  35. priority 120 # 优先级 数字越大就越容易成为master
  36. advert_int 1 # 宣告消息的时间间隔 为1s
  37. authentication {
  38. auth_type PASS # 密码认证 password
  39. auth_pass 1111 # 具体密码 可以不用修改
  40. }
  41. virtual_ipaddress { # vip 虚拟ip地址 可以配置多个
  42. 192.168.2.201 # 配置的vip 必须与master配置的vip是一样的
  43. }
  44. }
  45. [root@mysqlrouter-2 keepalived]#

查看master和backup的IP地址

9、 负载均衡器的使用

配置负载均衡器来实现流量的合理分配:

我们可以通过DNS域名解析来配置负载均衡器或者是通过nginx来配置负载均衡器

10、进行Mysql的压力测试:

Mysql压力测试工具:Mysqlslap、Sysbench(数据库专用测试工具)

可以模拟每秒钟处理完的请求数,每秒处理事务处,一次请求所需的平均数,系统内处理的并发请求数。

脑裂现象

脑裂有没有危害?

"脑裂"(Brain Split)通常用于指代分布式计算系统中的一个问题,特别是在集群环境下,其中集群中的节点在某种情况下无法与其他节点进行通信,导致节点之间的数据不一致。脑裂问题可能会导致严重的系统故障和数据损坏。

脑裂问题的危害在于:

  1. 数据不一致性:脑裂可能导致节点之间的数据不一致。如果在脑裂发生时,某些节点认为其他节点不可用,从而导致不同节点之间的数据更新没有被正确传播,最终导致数据不一致。

  2. 故障和系统崩溃:脑裂可能导致系统中的节点以不同的状态运行,从而影响整个系统的稳定性。这可能导致故障和系统崩溃,因为无法在节点之间协调操作。

  3. 无法达成共识:分布式系统通常需要在节点之间达成共识以进行操作,例如领导选举、数据复制等。脑裂可能会破坏共识机制,导致系统无法正常运行。

什么时候keepalived会产生脑裂现象呢?

脑裂现象:

1、vrid不一样的时候会产生

2、中间存在防火墙,阻止了网络之间的keepalived的master和backup的选举过程,vrrp报文无法通信(网络通信出现错误)

3、认证密码不一样也会出现脑裂现象

情况一:vrid不一样

当我们的master的vrid是82,而backup上的vrid是81,那么会产生脑裂现象

master上和backup上都出现了vip,这说明出现了脑裂现象 

 

情况二:防火墙拦截了vrrp报文通信

添加iptables防火墙规则

除了22号端口(ssh协议)能够通信,其他端口都不能通信

查看 master上和backup上是否都出现了vip,发现都出现了,说明产生了脑裂现象

  

最后去除防火墙规则

 情况三:修改认证密码,查看是否出现脑裂现象

查看 master上和backup上是否都出现了vip,发现都出现了,说明产生了脑裂现象

  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/675509
推荐阅读
相关标签
  

闽ICP备14008679号