MySQL主主+Keepalived实现高可用
在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主主方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动。因此,如果是双主或者多主,就会增加mysql入口,增加高可用。不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶,总之,主之间设置自增长ID相互不冲突就能完美解决自增长ID冲突问题
主主方案实现思路
1、 两台mysql都可读写,互为主备。默认只使用一台masterA负责数据的写入,另一台masterB备用处于备用状态;
2、 masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;
3、 两台主库之间做高可用,可以采用keepalived等方案,使用VIP对外提供服务;
4、所有提供服务的从服务器与masterB进行主从同步(双主多从);
5、建议采用高可用策略的时候,masterA或masterB均不因宕机恢复后而抢占VIP(非抢占模式);
这样做可以在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台主库上,尽可能减少主库宕机对业务造成的影响,减少了主从同步给生产主库带来的压力;
实验步骤:
master:192.168.200.111
slave:192.168.200.112
配置master1服务器:
1.修改配置文件
vim /etc/my.cnf
添加内容
[mysqld]
server-id=1
log-bin=mysql-binlog#打开二进制功能
log-slave-updates=true#将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启
max_binlog_size=1024M#binlog单文件最大值
auto_increment_offset = 1#自增长ID数
auto_increment_increment = 2#奇数ID
replicate-ignore-db = information_schema#忽略不同步主从的数据库
replicate-ignore-db = performance_schema
replicate-ignore-db = test
replicate-ignore-db = mysql
max_connections = 3000
max_connect_errors = 30
skip-character-set-client-handshake#忽略应用程序想要设置的其他字符集
init-connect='SET NAMES utf8'#连接时执行的SQL
character-set-server=utf8#服务端默认字符集
wait_timeout=1800#请求的最大连接时间
interactive_timeout=1800#和上一参数同时修改才会生效
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES#sql模式
relay-log=relay-log-bin#开启中继日志
relay-log-index=slave-relay-bin.index
2.重启数据库
systemctl restart mariadb
3.登录数据库进行授权
mysql -uroot -p'密码'
3.给master2授权
grant replication slave on *.* to 'repl'@'192.168.200.112' identified by '123456';
4.刷新授权表
flush privileges;
5.查看信息表
show master status;
类似上表
配置master2服务器:
1.修改配置文件
vim /etc/my.cnf
添加内容:
[mysqld]
server-id = 2
log-bin=mysql-binlog
log-slave-updates=true
max_binlog_size=1024M
auto_increment_offset = 2
auto_increment_increment = 2#偶数ID
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test
replicate-ignore-db = mysql
max_connections = 3000
max_connect_errors = 30
skip-character-set-client-handshake
init-connect='SET NAMES utf8'
character-set-server=utf8
wait_timeout=1800
interactive_timeout=1800
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
2.重启数据库
systemctl restart mariadb
3.登录数据库进行授权
mysql -uroot -p'密码'
4.给master1授权
grant replication slave on *.* to 'repl'@'192.168.200.111' identified by '123123';
5.刷新授权表
flush privileges;
6.查看信息表
show master status;
类似上表
实现主主复制:
配置master1数据库:
1.登录到数据库
mysql -uroot -p'密码'
2.停掉从服务
stop slave;
3.指向master2
change master to master_host='192.168.200.112',master_port=3306,master_user='repl',master_password='123123',master_log_file='mysql-binlog.000001',master_log_pos=889;
#对应master2的IP地址、设置密码、binlog进程数和position号
4.开启从服务
start slave;
5.查看从服务信息
show slave status\G
#确保两个线程处于开启状态
master2数据库与master1数据库步骤相同
唯一不同的是指向命令
change master to master_host='192.168.200.111',master_port=3306,master_user='repl',master_password='123123',master_log_file='mysql-binlog.000004',master_log_pos=486;
#对应master1的IP地址、设置密码、进程数和position号
查看从服务信息
show slave status\G
#确保两个线程处于开启状态
进行测试:
测试环境,可以保证没数据写入。步骤是:先masterA锁表-->masterA备份数据-->masterA解锁表 -->masterB导入数据-->masterB设置主从-->查看主从
1.在master1数据库中创建库
create database hhh;
2.在master2中查看数据库
show databases;
3.在master2中创建库jjj
create database jjj;
4.在master1中查看数据库
show databases;
实现主主复制
配置keepalived实现主主复制高可用
配置master1数据库:
1.安装keepalived软件
yum -y install keepalived
2.修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
修改内容:
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER-A#指定LVS负载标识
}
vrrp_script mysql {
script "/opt/mysql.sh"#准备触发脚本
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777728#本机网卡名
virtual_router_id 51
priority 100#优先级
nopreempt#采用不抢占模式
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
mysql#指定要触发的脚本
}
virtual_ipaddress {
192.168.200.254#指定VIP地址
}
}
3.编辑触发脚本
vim /opt/mysql.sh
编辑内容:
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl stop keepalived
fi
4.给与脚本执行权限
chmod +x /opt/mysql.sh
5.重启keepalived服务使其生效
systemctl start keepalived
6.查看IP信息
ip a
#VIP地址为254被篇master1所占用
7.查看日志信息
tail -f /var/log/messages
master2数据库操作与master1相同
唯一不同的地方是keepalived配置文件做调整
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER-B
}
vrrp_script mysql {
script "/opt/mysql.sh"
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777728
virtual_router_id 51
priority 99
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
mysql
}
virtual_ipaddress {
192.168.200.254
}
}
实现双主复制并给予keepalived实现高可用