当前位置:   article > 正文

Mysql集群之mysql双主双活+keepalived实现高可用_mysql+keepalived搭建教程_组双活

组双活

该教程再linux系统下

从部署单台mysql -->到部署两台双主mysql-->再到安装keepalived-->整体测试

从而实现mysql双主双活高可用的目标。

改文档由本人亲自部署搭建一步一步编写而来,实属不易,如对您有所帮助,请收藏点个赞,如有不合理地方,请留言,及时进行更正。

目录

一、介绍

二、准备工作

三、安装mysql

四、mysql数据库双主双从配置

五、双主双从测试

六、keepalived安装

七、mysql双主双活+keepalived高可用整体测试


一、介绍

        MySQL双主双活是指两台mysql服务器mysql-1、mysql-2都为master主节点服务器,同时又是对方的slave从节点,每个数据库都可作为主数据库使用,并将对数据库操作的数据同步至另外一台mysql服务中。

        当应用服务开发过程中使用了mysql-1连接信息,在打包发布后,数据库连接信息已经固定,当数据库mysql-1出现异常时,需要人工干预先将应用服务停止-->将应用服务的mysql连接信息改为mysql-2 -->在启动应用服务器,比较繁琐,当应用服务器较多时,一个一个关闭,修改,再重启,将耽误更多时间,应用服务器修复故障时间延长,严重时会造成灾难性的后果。

        故而引入了keepalived,keepalived通过VIP虚拟IP的漂移实现高可用,在相同集群内发送组播包,master主通过VRRP协议发送组播包,告诉从主的状态。

        当我们通过keepalived虚拟出一个ip服务 mysql-3,应用服务只需要将mysql配置信息更改为mysql-3的配置信息,mysql-3实际代理的实体服务器为mysql-1或mysql-2。

        例如:当mysql-3实际代理mysql-1时,mysql-1服务出现故障后,keepalived通过自身机制,自动将mysql-2作为实际代理主服务器,不需要人工干预去修改mysql配置信息,从而实现了高可用。

二、准备工作

    1.两台centos7 linux服务器

        mysql-1:192.168.222.128

        mysql-2:192.168.222.129

    2.mysql安装包

        版本:mysql-5.7.36-el7-x86_64.tar.gz

        下载地址:https://cdn.mysql.com/archives/mysql-5.7/mysql-test-5.7.36-el7-x86_64.tar.gz

    3.keepalived安装包

        版本:keepalived-2.2.7.tar.gz

        下载地址:https://www.keepalived.org/software/keepalived-2.2.7.tar.gz

三、安装mysql

    1.在128、129两台服务器根据《linux安装mysql服务-两种安装方式教程》安装好mysql应用。

    2.修改128服务器/etc/my.cnf配置文件,没有的话可自行创建,配置如下:

  1. [client]
  2. #客户端连接端口
  3. port=3306
  4. #客户端连接sock
  5. socket=/opt/mysql5.7/log/mysql.socka
  6. #客户端编码
  7. default-character-set=utf8
  8. [mysqld]
  9. #mysql服务端口
  10. port=3306
  11. #安装目录
  12. basedir=/opt/mysql5.7
  13. #数据存放目录
  14. datadir=/opt/mysql5.7/data
  15. #sock文件地址
  16. socket=/opt/mysql5.7/log/mysql.sock
  17. #错误日志存放地址
  18. log-error=/opt/mysql5.7/log/mysql.log
  19. #pid文件地址
  20. pid-file=/opt/mysql5.7/log/mysql.pid
  21. #下面内容为mysq主备时配置,单mysql部署护理下面配置
  22. #server-id 多台服务器时,此表示需要唯一
  23. server-id=1
  24. #主从同步bin-log日志文件名
  25. log-bin=mysql-bin
  26. #主从同步时,需要同步的数据库,多个数据库写多行binlog_do_db配置
  27. binlog_do_db=test_db
  28. #主从同步时,不需要同步的数据库,多个数据库写多行binlog_ignore_db配置
  29. #binlog_ignore_db=mysql
  30. #binlog_ignore_db=information_schema
  31. #binlog_ignore_db=sys
  32. #binlog_ignore_db=performance_schema
  33. #主从同步方式
  34. binlog_format=row
  35. #服务端编码
  36. character-set-server=utf8
  37. !includedir /etc/my.cnf.d

     3.修改129服务器/etc/my.cnf配置文件,只有server-id不同,为2配置如下

  1. [client]
  2. #客户端连接端口
  3. port=3306
  4. #客户端连接sock
  5. socket=/opt/mysql5.7/log/mysql.socka
  6. #客户端编码
  7. default-character-set=utf8
  8. [mysqld]
  9. #mysql服务端口
  10. port=3306
  11. #安装目录
  12. basedir=/opt/mysql5.7
  13. #数据存放目录
  14. datadir=/opt/mysql5.7/data
  15. #sock文件地址
  16. socket=/opt/mysql5.7/log/mysql.sock
  17. #错误日志存放地址
  18. log-error=/opt/mysql5.7/log/mysql.log
  19. #pid文件地址
  20. pid-file=/opt/mysql5.7/log/mysql.pid
  21. #下面内容为mysq主备时配置,单mysql部署护理下面配置
  22. #server-id 多台服务器时,此表示需要唯一
  23. server-id=2
  24. #主从同步bin-log日志文件名
  25. log-bin=mysql-bin
  26. #主从同步时,需要同步的数据库,多个数据库写多行binlog_do_db配置
  27. binlog_do_db=test_db
  28. #主从同步时,不需要同步的数据库,多个数据库写多行binlog_ignore_db配置
  29. #binlog_ignore_db=mysql
  30. #binlog_ignore_db=information_schema
  31. #binlog_ignore_db=sys
  32. #binlog_ignore_db=performance_schema
  33. #主从同步方式
  34. binlog_format=row
  35. #服务端编码
  36. character-set-server=utf8
  37. !includedir /etc/my.cnf.d

    5.重启mysql服务

  1. [root@128 mysql5.7]# systemctl stop mysqld
  2. [root@128 mysql5.7]# systemctl start mysqld

四、mysql数据库双主双从配置

    1.连接128服务器mysql,并创建主从同步账户slavebak,并查看master状态,记录下file、psition值,配置129mysql从库时使用

  1. [root@128 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. ......
  4. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  5. mysql> grant replication slave on *.* to slavebak@'%' identified by 'slavebak';
  6. mysql> flush privileges;
  7. mysql> show master status;
  8. +------------------+----------+--------------+------------------+-------------------+
  9. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  10. +------------------+----------+--------------+------------------+-------------------+
  11. | mysql-bin.000002 | 1287 | test_db | | |
  12. +------------------+----------+--------------+------------------+-------------------+
  13. 1 row in set (0.01 sec)
  14. mysql>

    2.连接129服务器,使用slavebak用户远程登录128mysql,测试连接是否正常。

  1. [root@129 ~]# /opt/mysql5.7/bin/mysql -h192.168.222.128 -uslavebak -pslavebak
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. ......
  4. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  5. mysql> exit;
  6. [root@129 ~]#

    3.在129服务器用root连接本服务器mysql,并配置128的主库信息

  1. [root@129 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. ......
  4. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  5. mysql> change master to
  6. -> master_host='192.168.222.128', #128服务器mysql ip
  7. -> master_port=3306, #128服务器mysql端口
  8. -> master_user='slavebak', #128服务器mysql从库同步用户
  9. -> master_password='slavebak', #128服务器mysql从库同步用户密码
  10. -> master_log_file='mysql-bin.000002', #前面记录的128服务mysql file值
  11. -> master_log_pos=1287; #前面记录的128服务mysql psition值
  12. Query OK, 0 rows affected, 2 warnings (0.02 sec)
  13. mysql> start slave; #启动从库配置

    4.查看129从库配置是否成功Slave_IO_Running、Slave_SQL_Running都为yes则成功

  1. mysql> show slave status;
  2. mysql> show slave status \G;
  3. *************************** 1. row ***************************
  4. ......
  5. Slave_IO_Running: Yes #此值为yes配置成功
  6. Slave_SQL_Running: Yes #此值为yes配置i成功
  7. ......
  8. 1 row in set (0.01 sec)

    5.在129服务器mysql创建主从同步账户slavebak,查看master状态,记录下file、psition值

  1. mysql> grant replication slave on *.* to slavebak@'%' identified by 'slavebak';
  2. mysql> flush privileges;
  3. mysql> show master status;
  4. +------------------+----------+--------------+------------------+-------------------+
  5. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  6. +------------------+----------+--------------+------------------+-------------------+
  7. | mysql-bin.000002 | 848 | test_db | | |
  8. +------------------+----------+--------------+------------------+-------------------+
  9. 1 row in set (0.01 sec)

    6.连接128服务器并使用root用户连接本服务器mysql,配置129的主库信息

  1. [root@128 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. ......
  4. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  5. mysql> change master to
  6. -> master_host='192.168.222.129', #129服务器mysql ip
  7. -> master_port=3306, #129服务器mysql端口
  8. -> master_user='slavebak', #129服务器mysql从库同步用户
  9. -> master_password='slavebak', #129服务器mysql从库同步用户密码
  10. -> master_log_file='mysql-bin.000002', #前面记录的129服务mysql file值
  11. -> master_log_pos=848; #前面记录的129服务mysql psition值
  12. Query OK, 0 rows affected, 2 warnings (0.02 sec)
  13. mysql> start slave; #启动从库配置

    7.查看128从库配置是否成功Slave_IO_Running、Slave_SQL_Running都为yes则成功

  1. mysql> show slave status;
  2. mysql> show slave status \G;
  3. *************************** 1. row ***************************
  4. ......
  5. Slave_IO_Running: Yes #此值为yes配置成功
  6. Slave_SQL_Running: Yes #此值为yes配置i成功
  7. ......
  8. 1 row in set (0.01 sec)

    至此,128服务器,129服务器双主双从配置完成

五、MySQL双主双从测试

    1.连接128服务器,使用root用户连接本机mysql,并创建test_db数据库,t_test表,并插入一条数据id=1,name='zhangsan'

  1. [root@128 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. ......
  4. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  5. mysql> create database test_db;
  6. Query OK, 1 row affected (0.00 sec)
  7. mysql> use test_db;
  8. mysql> create table t_test(id int primary key, name varchar(30));
  9. Query OK, 0 row affected (0.01 sec)
  10. mysql> insert into t_test values (1, 'zhangsan');
  11. Query OK, 1 row affected (0.01 sec)
  12. mysql> select * from t_test;
  13. +----+----------+
  14. | id | name |
  15. +----+----------+
  16. | 1 | zhangsan |
  17. +----+----------+
  18. 1 rows in set (0.00 sec)

2.连接129服务器,使用root用户连接mysql,查看test_db数据库、t_test表以及数据是否同步,并插入id=2,name=‘lisi’ 

  1. [root@129 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. ......
  4. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  5. mysql> show databases;
  6. +--------------------+
  7. | Database |
  8. +--------------------+
  9. | information_schema |
  10. | mysql |
  11. | performance_schema |
  12. | sys |
  13. | test_db | #test_db数据库已同步过来
  14. +--------------------+
  15. 5 rows in set (0.01 sec)
  16. mysql> use test_db;
  17. mysql> show tables;
  18. +-------------------+
  19. | Tables_in_test_db |
  20. +-------------------+
  21. | t_test | #t_test表已同步过来
  22. +-------------------+
  23. 1 row in set (0.01 sec)
  24. mysql> select * from t_test;
  25. +----+----------+
  26. | id | name |
  27. +----+----------+
  28. | 1 | zhangsan | #数据已同步过来
  29. +----+----------+
  30. 1 rows in set (0.00 sec)
  31. mysql> insert into t_test values (2, 'lisi');
  32. Query OK, 1 row affected (0.01 sec)

3.在128服务器查看id=2,name="lisi" 是否同步

  1. [root@128 ~]# /opt/mysql5.7/bin/mysql -uroot -proot
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. ......
  4. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  5. mysql> select * from t_test;
  6. +----+----------+
  7. | id | name |
  8. +----+----------+
  9. | 1 | zhangsan |
  10. | 2 | lisi | #lisi数据已同步
  11. +----+----------+
  12. 1 rows in set (0.00 sec)

    至此,数据库双主双从测试完成。

六、keepalived安装

    128、129两台服务器安装步骤相同,配置文件不同,下面有介绍。

    1.安装相关依赖包,并下载keepalived安装包,解压,配置,编译

  1. [root@128 ~]# cd /opt
  2. [root@128 opt]# yum -y install gcc openssl-devel popt-devel psmisc
  3. [root@128 opt]# wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
  4. [root@128 opt]# tar -zxvf keepalived-2.2.7.tar.gz
  5. [root@128 opt]# cd keepalived-2.2.7
  6. [root@128 keepalived-2.2.7]# ./configure --prefix=/opt/keepalived-2.2.7
  7. [root@128 keepalived-2.2.7]# make && make install

    2.将文件复制到对应目录下

  1. [root@128 keepalived-2.2.7]# mkdir /etc/keepalived
  2. [root@128 keepalived-2.2.7]# cp keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
  3. [root@128 keepalived-2.2.7]# cp keepalived/etc/init.d/keepalived /etc/init.d/
  4. [root@128 keepalived-2.2.7]# cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  5. [root@128 keepalived-2.2.7]# cp bin/keepalived /usr/sbin/

    3.新建/etc/keepalived/shutdown.sh文件,内容为:

  1. #!/bin/bash
  2. #该脚本是在mysql服务出现异常时,将keepalived应用停止,从而使虚拟vip主机自动连接到另一台mysql上
  3. killall keepalived

    4.使用ifconfig命令查看下网卡名称,本机网卡名称为ens33

 

 5.修改128服务器/etc/keepalived/keepalived.conf配置文件,内容如下:

  1. ! Configuration File for keepalived
  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_MASTER
  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为刚才查到的本机网卡名称
  20. interface ens33
  21. #同一网段中同一组virtual_router_id值相同。不同组virtual_router_id值唯一。
  22. #如server-1、server-2为一组,virtual_router_id=51
  23. #server-3、server-4为一组,则virtual_router_id不能为51
  24. virtual_router_id 51
  25. #字数越大,优先级越高,master必须大于backup
  26. priority 100
  27. advert_int 1
  28. authentication {
  29. auth_type PASS
  30. auth_pass 1111
  31. }
  32. virtual_ipaddress {
  33. #该ip为虚拟出来的vip地址
  34. 192.168.222.130
  35. }
  36. }
  37. #配置virtual_server ip为上面配置的虚拟vip地址 端口为mysql的端口
  38. virtual_server 192.168.222.130 3306 {
  39. delay_loop 6
  40. lb_algo rr
  41. lb_kind NAT
  42. persistence_timeout 50
  43. protocol TCP
  44. #real_server 该配置为实际物理机ip地址 以及实际物理机mysql端口
  45. real_server 192.168.222.128 3306 {
  46. #当该ip 端口连接异常时,执行该脚本
  47. notify_down /etc/keepalived/shutdown.sh
  48. TCP_CHECK {
  49. #实际物理机ip地址
  50. connect_ip 192.168.222.128
  51. #实际物理机port端口
  52. connect_port 3306
  53. connect_timeout 3
  54. nb_get_retry 3
  55. delay_before_retry 3
  56. }
  57. }
  58. }

6.修改129服务器/etc/keepalived/keepalived.conf配置文件,与128的配置不同地方为real_server、connect_ip 两个配置,需要配置对应的实际主机ip,详细内容如下:

  1. ! Configuration File for keepalived
  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_MASTER
  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 BACKUP
  19. #interface为刚才查到的本机网卡名称
  20. interface ens33
  21. #同一网段中同一组virtual_router_id值相同。不同组virtual_router_id值唯一。
  22. #如server-1、server-2为一组,virtual_router_id=51
  23. #server-3、server-4为一组,则virtual_router_id不能为51
  24. virtual_router_id 51
  25. #字数越大,优先级越高,master必须大于backup
  26. priority 90
  27. advert_int 1
  28. authentication {
  29. auth_type PASS
  30. auth_pass 1111
  31. }
  32. virtual_ipaddress {
  33. #该ip为虚拟出来的vip地址
  34. 192.168.222.130
  35. }
  36. }
  37. #配置virtual_server ip为上面配置的虚拟vip地址 端口为mysql的端口
  38. virtual_server 192.168.222.130 3306 {
  39. delay_loop 6
  40. lb_algo rr
  41. lb_kind NAT
  42. persistence_timeout 50
  43. protocol TCP
  44. #real_server 该配置为实际物理机ip地址 以及实际物理机mysql端口
  45. real_server 192.168.222.129 3306 {
  46. #当该ip 端口连接异常时,执行该脚本
  47. notify_down /etc/keepalived/shutdown.sh
  48. TCP_CHECK {
  49. #实际物理机ip地址
  50. connect_ip 192.168.222.129
  51. #实际物理机port端口
  52. connect_port 3306
  53. connect_timeout 3
  54. nb_get_retry 3
  55. delay_before_retry 3
  56. }
  57. }
  58. }

   详细配置参考《Keepalived 安装和配置详解》

    7.将128、129服务器keepalived加入开机自启,并启动服务

  1. [root@128 keepalived-2.2.7]# systemctl enable keepalived
  2. [root@128 keepalived-2.2.7]# systemctl start keepalived

    8.启动后keepalived状态为:active(running)则正常

    9.启动后相当于虚拟出一个vip 192.168.222.130,可使用远程连接工具,连接该服务器,连接进去后使用ifconfig查看该虚拟vip实际上使用的实体服务器是129服务器。

    10.将129服务器的keepalived应用停止,再次查看130服务ifconfig,可以看到,130服务器自动将实体机ip漂移到了128服务器上

 

    至此,keepalived部署完成。

七、mysql双主双活+keepalived高可用整体测试

    1.首先将128、129两台服务器mysql、keepalived应用全部启动,然后用mysql连接工具连接keepalived虚拟出来的192.168.222.130服务器

    2.再130数据库test_db库t_test表插入id=3,name='wangwu'

    3.此时可以查看128、129数据库,数据已同步

    4.查看130服务器ifconfig实际使用的物理机为128,所以128服务器mysql为主数据库。

     5.此时手动将128服务器mysql停止,keepalived检测到128服务3306端口连接失败,会执行/etc/keepalived/shutdown.sh脚本,将128服务器keepalived应用结束。 

    6.此时再连接130服务下,ifconfig查看,发现已经实际将物理机由128转移到129服务器上

    7.再使用mysql连接工具连接130的mysql,插入一条数据id=4,name='zhaoliu',测试是否将数据存入129服务器mysql中

    8.查看129服务器mysql数据,数据已同步,说明keepalived搭建高可用成功,当128服务器mysql出现问题后keepalived自动漂移IP到实体机129服务器上,从而使129服务器mysql作为主数据库。

    9.此时再启动128服务器mysql、keepalived应用

    10.查看128数据库t_test表数据,数据已同步成功。

 

    11.如果漂移失败,可能是virtual_router_id在同网段内重复导致。可执行命令查看是否有其他ip使用

  1. [root@128 keepalived-2.2.7]# tcpdump -i 网卡名 vrrp -n |grep virtual_router_id值
  2. #例如:
  3. [root@128 keepalived-2.2.7]# tcpdump -i eno16777736 vrrp -n |grep 51

至此,mysql双主双活+keepalived高可用部署并测试完成。

编写不易,请收藏点赞,有问题可随时联系我,及时改正。

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

闽ICP备14008679号