# mysql的双主模式搭建(三）

> 来源：梦飞idc云平台 | 原文：https://www.mfisp.com/20947.html | 发布：2023-06-01 | 更新：2023-06-01 | 分类：建站教程

## 验证双主同步

 

执行步骤：在服务器1的mysql中新建数据库-创建表-插入一条数据-到服务器2的mysql查看是否有同样的记录

 

## keeplived实现高可用

 

## 俩台服务器都安装keeplived

 

## 服务器1配置keeplived.conf 和mysql的检测脚本

 

global_defs { # {前一定要有空格！！！  
 script_user root #执行脚本的用户  
 enable_script_security #开启执行检测脚本  
 router_id 192.168.1.100 #唯一标识，一般用自己的主机ip  
}  
vrrp_script check_mysql {# {前一定要有空格！！！ mysql检测定义  
 script "/etc/keepalived/check_mysql_pid.sh" # mysql检测脚本位置  
 interval 2 #每两秒检测一次mysql的运行状态  
}

 

vrrp_instance VI_1 {  
 state BACKUP #因为要使用非抢占式，所以俩台都设置为backup  
 interface ens192 #网卡名称  
 virtual_router_id 55 #使用同一虚拟ip的这里要保持一致  
 priority 150 #优先级，如果是非抢占式，就不会依据该值  
 mcast_src_ip 192.168.1.100 #自己主机ip  
 advert_int 1 #广播间隔  
 nopreempt #设置非抢占式  
 authentication { #认证  
 auth_type PASS  
 auth_pass xxxxxxx  
 }  
 virtual_ipaddress {  
 192.168.1.99 #虚拟的ip  
 }  
 track_script {  
 check_mysql #执行mysql存活检测脚本  
 }  
}

 

#！/bin/sh  
if [ `netstat -npl | grep 3306 | wc -l` -eq 0 ]  
then  
 echo "${data} mysql proccess not found">>/etc/keepalived/keepalived.log  
 service mysql start  
 if [ `netstat -npl | grep 3306 | wc -l` -eq 0 ]  
 then  
 echo "${data} mysql start failed">>/etc/keepalived/keepalived.log  
 systemctl stop keepalived  
 else  
 echo "${data} mysql start failed">>/etc/keepalived/keepalived.log  
 systemctl restart keepalived  
 fi  
fi

 

服务器2的keepalived.conf

 

global_defs { # {前一定要有空格！！！  
 script_user root #执行脚本的用户  
 enable_script_security #开启执行检测脚本  
 router_id 192.168.1.101 #唯一标识，一般用自己的主机ip  
}  
vrrp_script check_mysql {# {前一定要有空格！！！ mysql检测定义  
 script "/etc/keepalived/check_mysql_pid.sh" # mysql检测脚本位置  
 interval 2 #每两秒检测一次mysql的运行状态  
}

 

vrrp_instance VI_1 {  
 state BACKUP #因为要使用非抢占式，所以俩台都设置为backup  
 interface ens192 #网卡名称  
 virtual_router_id 55 #使用同一虚拟ip的这里要保持一致  
 priority 150 #优先级，如果是非抢占式，就不会依据该值  
 mcast_src_ip 192.168.1.101 #自己主机ip  
 advert_int 1 #广播间隔  
 nopreempt #设置非抢占式  
 authentication { #认证  
 auth_type PASS  
 auth_pass xxxxxxx  
 }  
 virtual_ipaddress {  
 192.168.1.99 #虚拟的ip  
 }  
 track_script {  
 check_mysql #执行mysql存活检测脚本  
 }  
}

 

验证高可用操作

 

systemctl stop mysqld 在服务器1上面操作

 

通过命令停掉服务器1上的mysql，再去用IP a查看vip是否已经飘到服务器2上，可以在服务器1上的/etc/keepalived/keepalived.log查看到keepalived无法发现mysql并且启动mysql成功的记录；

 

systemctl stop mysqld 在服务器2上面操作

 

同样可以看到，IP又飘回到服务器1上面，一切如预期那样  
遇到的问题  
mysql连接错误次数过多

 

在开启同步，利用同步账号进行互相连接时由于创建的账号和使用同步的账号不一致造成，俩台服务器间数据库的连接频繁报错，触发了mysql的保护机制，开启了拒绝连接。

 

通过修改正确的数据库用户和利用flush hosts刷新mysql的主机表来清除主机连接记录关闭拒绝连接  
Public Key Retrieval is not allowed

 

导致“Public Key Retrieval is not allowed”主要是由于当禁用SSL/TLS协议传输后，客户端会使用服务器的公钥进行传输，默认情况下客户端不会主动去找服务器拿公钥，此时就会出现上述错误。

 

经过查阅官方文档，出现Public Key Retrieval的场景可以概括为在禁用SSL/TLS协议传输且当前用户在服务器端没有登录缓存的情况下，客户端没有办法拿到服务器的公钥。具体的场景如下：

 

新建数据库用户，首次登录；  
 数据库的用户名、密码发生改变后登录；  
 服务器端调用FLUSH PRIVELEGES指令刷新服务器缓存。

 

针对上述错误，有如下的解决方案：

 

在条件允许的情况下，不要禁用SSL/TLS协议，即不要在CLI客户端使用–ssl-mode=disabled，或在JDBC连接串中加入useSSL=false；  
 如果必须禁用SSL/TLS协议，则可以尝试使用CLI客户端登录一次MySQL数据库制造登录缓存；  
 如果必须禁用SSL/TLS协议，则可以通过增加如下参数允许客户端获得服务器的公钥：

 

在JDBC连接串中加入allowPublicKeyRetrieval=true参数；  
 在CLI客户端连接时加入–get-server-public-key参数；  
 在CLI客户端连接时加入–server-public-key-path=file_name参数，指定存放在本地的公钥文件。

 

导出导入数据

 

#导出时，需要关闭标记GTID  
#导出某个库的所有表结构和数据(-d 这个参数可以不导出数据)  
mysqldump -h ip -u username -p --set-gtid-purged=OFF --column-statistics=0 databasename >/保存的文件路径/文件名.sql

  

#导入时，需要先创建数据库，进入数据库后执行命令

 

source /保存的文件路径/文件名.sql

---
本页由 梦飞idc云平台（https://www.mfisp.com）提供。站点导航见 https://www.mfisp.com/llms.txt
