生产环境对数据库要求很高的,为了避免数据库的突发情况,给他做个保险--用keepalived做高可用
环境(此处ip,密码均是乱造的):
主:192.1.31.161 端口:3306 用户:vnum 密码:vnum@123
从:192.1.31.162 端口:3306
方案介绍两台mysql互为主从,但只有master写,slave只负责读。主从通过keepalive做成高可用,当master出问题,由slave接替master工作,即读写都在slave操作。当master恢复正常,master自动同步故障时间段数据,接替slave的写工作。
一:配置主主同步
、配置文件master my.cnf 主要参数log_slave_updateslog-bin = mysql-binserver-id = 1binlog-ignore-db=mysql#auto_increment_increment = 2#auto_increment_offset = 2slave my.cnf 主要参数log_slave_updateslog-bin = mysql-binserver-id = 2binlog-ignore-db=mysql#auto_increment_increment = 2#auto_increment_offset = 1注:log_slave_updates 同步数据时也写入日志,二进制记录id号,互为主从时时不会引起循环。建议开启方便实施日志恢复。 可选slave-skip-errors 跳过错误,可以通过=指定特定的错误,如:slave-skip-errors=1062 可选log-bin = mysql-bin 开启二进制日志,必须开启,主从同步主要是通过二进制日志。 必须sync_binlog=n 设置二进制日志在写入多少此后与硬盘同步,1 为最安全的也是效率最低的,根据实际情况设定 可选server-id 设置mysql的id号,主从不能相同。 必须binlog-ignore-db 设置不写入日志的库,建议设置不需要的库,节省流量。如需设置多个库可加多个此参数 可选binlog-do-db 设置写入二进制日志的库,如设置则只有设置的库才能写入二进制日志。如需设置多个库可加多个此参数。 可选replicate-ignore-db 设置slave不同步的库,如需设置多个库可加多个此参数。 可选replicate-do-db 设置slave同步的库,如需设置多个库可加多个此参数。 可选auto_increment_increment 自增增长值,如:id 设置为 auto_increment,则每次插入数据自增值为2,以1,3,5...或2,4,6...方式增长。 可选auto_increment_offset 自增初始化便宜值,如果前一个id 为2 则 下一个为3 然后在这个基础上按auto_increment_increment 设置的值进行自增。 可选master-host = 192.168.1.2 设置master 服务器地址,也可以启动时通过change master to 设置 。 可选master-user = repl 设置更新用的帐号,也可以启动时通过change master to 设置 。 可选master-password = 123 设置跟新用的密码,也可以启动时通过change master to 设置 。 可选master-port = 3306 设置master端口,也可以启动时通过change master to 设置 。 可选binlog-do-db、binlog-ignore-db、replicate_do_db、replicate_ignore_db 在使用时应注意,若加了以上参数,则在操作数据库是要避免跨库操作(例:update test.table1 set...)如设置 binlog-do-db=testuse mysql;update test.table1 set ......第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异如设置 binlog_ignore_db=mysqluse mysql;update test.table1 set ......第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异如设置 replicate_do_db=testuse mysql;update test.table1 set ......第二句将不会被执行,即从库不能同步,主从数据库出现差异如设置 replicate_ignore_db=mysqluse mysql;update test.table1 set ......第二句会被忽略执行,即从库不能同步,主从数据库出现差异原因是设置binlog-do-db、binlog-ignore-db、replicate_do_db或replicate_ignore_db后,MySQL执行sql前检查的是当前默认数据库,所以跨库更新语句被忽略。登录master数据库mysql> show master status\G;
同理,查看slave的
master:mysql>CHANGE MASTER TOMASTER_HOST=‘192.1.31.162‘, MASTER_USER=‘vnum‘, MASTER_PASSWORD=‘vnum@123‘, MASTER_PORT=3306, MASTER_LOG_FILE= ‘my_log.00006‘, MASTER_LOG_POS= 154, MASTER_CONNECT_RETRY=10; mysql>start slave;mysql>show slave status\G;salve:mysql>CHANGE MASTER TOMASTER_HOST=‘192.1.31.161‘, MASTER_USER=‘vnum‘, MASTER_PASSWORD=‘vnum@123‘, MASTER_PORT=3306, MASTER_LOG_FILE= ‘my_log.00018‘, MASTER_LOG_POS= 154, MASTER_CONNECT_RETRY=10; mysql>start slave;mysql>show slave status\G;均出现两个yes,就证明主主配置成功1.安装keepalived # yum -y install keepalived 一般配置文件是/etc/keepalived/keepalived.conf 日志在/etc/log/messages2.修改keepalived的配置 # cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { router_id mysql1}vrrp_instance VI_1 { state BACKUP #指定keepalived的角色。两台均配置成BACKUP,这样可以根据优先级决定主从 interface ens160 # 指定HA监控的网络名称 virtual_router_id 51 # 主从保持一致,VRRP的唯一标识 priority 100 #优先级,选举master,主的比从的高 advert_int 1 #发varrp包的时间间隔,即多久选举一次master nopreempt # 不抢占,即允许一个priority比较低的节点作为主,主要预防脑裂 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { #指定VIP的地址 192.1.31.3 }}virtual_server 192.1.31.3 3306 { #设置虚拟服务器,需要指定虚拟IP端口,ip和端口之间空格隔开 delay_loop 2 #设置运行检查时间,单位秒 lb_algo rr # 设置后端调度算法,这里设置为rr lb_kind DR # 设置LVS实现的算法 persistence_timeout 60 # 保持会话60S peotocol TCP # TCP协议 real_server 192.1.31.161 3306 { # 本机ip 端口 weight 3 # 配置服务点的权值,权值大小用数字标识,数字越大,权值越高,权值是为了区分不同的服务器 notify_down /root/keepalived_check_mysql.sh # 检查mysql是否是down TCP_CHECK { connect_timeout 3 # 连接超时时间 nb_get_retry 3 # 重连次数 delay_before_retry 1 # 重连时间间隔 connect_port 3306 # 健康检查端口 } }}同样的也需要修改mysql2的keepalived配置文件(下图中绿色部分为和mysql1不一样的地方)可以使用scp命令把mysql1主机上配置好的keepalived.conf文件拷贝到server2主机,只需要改 router_id mysql1 ------> router_id mysql2 priority 100 -----> priority 90 nopreempt -----> # nopreempt real_server 192.1.31.161 3306 -------> real_server 192.1.31.162 33063.写脚本 # cat /root/keepalived_check_mysql.sh #!/bin/sh# -------------------------------------------------------------------------------# FileName: check_mysql.sh# Revision: 1.0# Date: 2019/05/07# Author: salarh# Email: salarh@163.comMYSQL=/data/mysql/bin/mysqlMYSQL_HOST=localhostMYSQL_USER=rootMYSQL_PASSWORD=‘root@123‘CHECK_TIME=3#mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0MYSQL_OK=1check_mysql_helth (){ $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" &>/dev/null if [ $? -eq 0 ] ;then MYSQL_OK=1 else MYSQL_OK=0 fi return $MYSQL_OK}while [ $CHECK_TIME -ne 0 ]do check_mysql_helth if [ $MYSQL_OK -eq 1 ] ; then exit 0 fi if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 1 ];then systemctl stop keepalived.service exit 1 fi let CHECK_TIME-- sleep 1done别忘了授权# chmod +x /root/keepalived_check_mysql.sh3.开启主从上的keepalived # systemctl restart keepalived 在打开一个窗口查看日志(192.1.31.3这个虚拟ip应该在192.1.31.161上)4.观察,测试1)登录192.1.31.3(vip)的数据库,进行数据插入,再去162这台机器上看是否同步2)关闭161这台数据库,vip在162这台数据库上,进行数据插入,是正常的。但当161这台机器上的mysql和keepalived开启后,161 就相当于备库了,除非162mysql或主机down了,他才能重登大位最后一步就是做监控报警了