Linux使用mysql+keepalived双主实现

作者 by admin / 2022-04-24 / 1 评论 / 120 个足迹

环境准备

准备两台centOS服务器

两台Cent os服务器:

主机名ip服务
mysql-1192.168.58.131mysql+keepalived
mysql-2192.168.58.131mysql+keepalived

一. 配置数据库mariadb

1. 安装数据库mariadb

以下为yum一键安装方式:

yum install -y mariadb-server

2. 修改配置文件

mysql-1 服务器

输入vim /etc/my.cnf 修改配置文件

vim /etc/my.cnf

在[mysqld]下插入两行

server-id=1
log-bin=master-bin
mysql-2 服务器
vim /etc/my.cnf

在[mysqld]下插入两行

server-id=2
log-bin=master-bin

插入后为:

3. 启动mariadb(mysql-1/mysql-2操作一样)

systemctl start mariadb

ps -ef|grep mariadb


启动成功

4. 将mysql-2设置为mysql-1的从服务器

1.在mysql-1 服务器终端上

输入:

mysql -uroot -p

输入后回车,让输入密码继续回车(yum一键安装mariadb默认密码为空!)
(http://anishell.cn/image/student/mysql-4.png)](http://anishell.cn/image/student/mysql-4.png)

2. 在mysql-1上创建授权用户

在mysql-1的数据库中输入

mysql> grant replication slave on *.* to 'tongbu'@'%' identified by '123456';
mysql> grant all on *.* to 'root'@'%' ; #授权本地用户访问
mysql> flush privileges;
3.查看mysql-1的当前binlog状态信息
mysql> show master status\G

*************************** 1. row ***************************
             File: master-bin.000003
         Position: 389
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

mysql> 

记下

        File: master-bin.000003
        Position: 389
4. 在mysql-2服务器上指向mysql-1为master,并开启slave功能
mysql> change master to master_host='192.168.58.131',master_user='tongbu',master_password='123456',master_log_file='master-bin.000003',master_log_pos=389;#启动slave功能


mysql> start slave;#确定配置成功

mysql> show slave status\G  #查看slave状态

****************************1.row ****************************

 Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.58.131
                  Master_User: tongbu
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 154
               Relay_Log_File: relay-bin.000009
                Relay_Log_Pos: 318
        Relay_Master_Log_File: master-bin.000003
             Slave_IO_Running: Yes               # 这个值必须为Yes
            Slave_SQL_Running: Yes             # 这个值也必须为Yes
4. 将mysql-1设置为mysql-2的从服务器
1.在mysql-2 服务器终端上

输入:

mysql -uroot -p

输入后回车,让输入密码继续回车(yum一键安装mariadb默认密码为空!)

2. 在mysql-2上创建授权用户

在mysql-2的数据库中输入

mysql> grant replication slave on *.* to 'tongbu'@'%' identified by '123456';
mysql> grant all on *.* to 'root'@'%' ; #授权本地用户访问
mysql> flush privileges;
3.查看mysql-2的当前binlog状态信息
mysql> show master status\G

*************************** 1. row ***************************
             File: master-bin.000003
         Position: 389
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

mysql> 

记下

        File: master-bin.000003
        Position: 389
4. 在mysql-1服务器上指向mysql-2为master,并开启slave功能
mysql> change master to master_host='192.168.58.130',master_user='tongbu',master_password='123456',master_log_file='master-bin.000003',master_log_pos=389;#启动slave功能


mysql> start slave;#确定配置成功

mysql> show slave status\G  #查看slave状态

****************************1.row ****************************

 Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.58.130
                  Master_User: tongbu
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 154
               Relay_Log_File: relay-bin.000009
                Relay_Log_Pos: 318
        Relay_Master_Log_File: master-bin.000003
             Slave_IO_Running: Yes               # 这个值必须为Yes
            Slave_SQL_Running: Yes             # 这个值也必须为Yes

5. 测试同步

远程连接mysql-1 和 mysql-2的数据库

在mysql-1新建数据库表ceshi

刷新mysql-2数据库,查询到ceshi,同步测试完成。

二. 配置keepalived高可用

1. 两台服务器mysql-1/mysql-2 都执行以下操作

yum -y install keepalived

2. 修改 mysql-1服务器的keepalived配置文件

vim /etc/keepalived/keepalived.conf

按o或i进入编辑模式

[root@mysql1 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
 
global_defs {
   router_id mysql-1      #此处的值必须唯一
}
 
vrrp_instance VI_1 {
    state BACKUP       #指定角色为backup,两台MySQL服务器的角色均为backup,设置backup将根据优先级决定主从
 
    interface ens33      #指定承载虚拟IP的网卡
    virtual_router_id 51         #指定组,同一个集群内的值必须一致。并且不可和局域网中的其他组冲突
    priority 100          #优先级范围为:0~100
    advert_int 1     #发vrrp包的时间间隔,即多久进行一次master选举(可认为是健康检查时间间隔)
    nopreempt         #不抢占,即允许一个priority比较低的节点作为master,     
    authentication {          #认证区域
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         #VIP区域,指定vip地址
        192.168.58.100
    }
}
 
virtual_server 192.168.58.100 3306 {    #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
    delay_loop 2         #设置运行情况检查时间,单位是秒
    lb_algo rr      #设置后端调度算法
    lb_kind DR    #设置lvs实现负载均衡的机制,有NAT、TUN、DR三个模式,DR模式效率最高
    persistence_timeout 60     #会话保持时间,单位是秒
    protocol TCP     #指定转发协议类型,有TCP和UDP两种
 
    real_server 192.168.58.131 3306 {          #配置服务节点,这里指定的也就是本机的真实IP
        weight -20     #设置权重
    notify_down /etc/keepalived/bin/mysql.sh    #检测到real_server的MySQL服务宕机后执行的脚本。
    TCP_CHECK {
        connect_port 3306    #健康检查端口
        connect_timeout 3       #连接超时时间
        retry 3    #重试次数
        delay_before_retry 3      #重连间隔时间
     }
   }
}

3. 指定mysql-1的脚本目录

mkdir /etc/keepalived/bin
cd /etc/keepalived/bin
vim bin/mysql.sh

mysql.sh脚本内容

#!/bin/bash
pkill keepalived #停止keepalived服务
chmod +x bin/mysql.sh    #赋予脚本执行权限
systemctl start keepalived        #启动keepalived服务

4. 修改主机mysql-2的keepalived配置文件

cd /etc/keepalived/

vim /etc/keepalived/keepalived.conf

按o或i进入编辑模式

[root@mysql1 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
 
global_defs {
   router_id mysql-1      #此处的值必须唯一
}
 
vrrp_instance VI_1 {
    state BACKUP       #指定角色为backup,两台MySQL服务器的角色均为backup,设置backup将根据优先级决定主从
 
    interface ens33      #指定承载虚拟IP的网卡
    virtual_router_id 51         #指定组,同一个集群内的值必须一致。并且不可和局域网中的其他组冲突
    priority 100          #优先级范围为:0~100
    advert_int 1     #发vrrp包的时间间隔,即多久进行一次master选举(可认为是健康检查时间间隔)
    nopreempt         #不抢占,即允许一个priority比较低的节点作为master,     
    authentication {          #认证区域
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         #VIP区域,指定vip地址
        192.168.58.100
    }
}
 
virtual_server 192.168.58.100 3306 {    #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
    delay_loop 2         #设置运行情况检查时间,单位是秒
    lb_algo rr      #设置后端调度算法
    lb_kind DR    #设置lvs实现负载均衡的机制,有NAT、TUN、DR三个模式,DR模式效率最高
    persistence_timeout 60     #会话保持时间,单位是秒
    protocol TCP     #指定转发协议类型,有TCP和UDP两种
 
    real_server 192.168.58.130 3306 {          #配置服务节点,这里指定的也就是本机的真实IP
        weight -20     #设置权重
    notify_down /etc/keepalived/bin/mysql.sh    #检测到real_server的MySQL服务宕机后执行的脚本。
    TCP_CHECK {
        connect_port 3306    #健康检查端口
        connect_timeout 3       #连接超时时间
        retry 3    #重试次数
        delay_before_retry 3      #重连间隔时间
     }
   }
}

5. 指定mysql-2的脚本目录

mkdir /etc/keepalived/bin
cd /etc/keepalived/bin
vim bin/mysql.sh

mysql.sh脚本内容

#!/bin/bash
pkill keepalived #停止keepalived服务
chmod +x bin/mysql.sh    #赋予脚本执行权限
systemctl start keepalived        #启动keepalived服务

三.测试高可用

现有192.168.58.131 192.168.58.130两台数据库服务器,互为主从

使用keepalived配置虚拟ip为 192.168.137.100

使用Navicat连接 192.168.58.100

测试在连接到的 192.168.58.100数据库中新建一个表 ceshi2


刷新mysql-1/mysql-2 查询到ceshi2 完成

总结:

mariadb主要配置

grant replication slave on *.* to 'tongbu'@'%' identified by '123456'; #创建授权用户

show master status;

update user set host ='%' where user ='root';
grant all on *.* to 'root'@'%' ;
change master to master_host='192.168.xx.xx', #mysql-*的ip
master_user='tongbu',
master_password='123456',
master_log_file='master-bin.000003', #必须和master上查看到的名字一样
master_log_pos=389; #同上,这个值也是在master上查看到的

建议

1.使用scp远程复制或ssh连接工具传输相关配置文件keepalived.conf
scp /etc/keepalived/keepalived.conf root@192.168.58.xx.xx:/etc/keepalived

2.如果 Slave_IO_Running: No

通过查询master端的binlog状态信息

mysql> show master status\G

使用

change master to Master_Log_File='master-bin.000003',Master_Log_Pos=0;

命令保持一致

不足之处:

1. 简化了 /etc/my.cnf文件的配置
2. 没有配置时间同步(用于生产环境必须配置)
3. 没有演示停用任意一台mysql服务器测试 停用-启动后自动实现主从复制
4.等等...

独特见解

 评论 1 条
    • 纯路人

      2022-04-24 23:34

       

      :鼓掌::鼓掌::鼓掌::鼓掌: