生产环境中一台mysql主机存在单点故障,所以我们要确保mysql的高可用性,即两台MySQL服务器如果其中有 一台MySQL服务器挂掉后,另外一台能立马接替其进行工作。 MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,PXC,MMM,Heartbeat+DRBD等,比较常用的是keepalived+双主,MHA和PXC。
一配置两台MySQL主主同步
该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改 变。MySQL将事务写入二进制日志。在事件写入二进制日志完成后,master通知存储引擎提交事务。 下一步就 是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程 在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日 志中读取事件,如果已经同步了master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日 志。 SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事 件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS 的缓存中,所以中继日志的开销很小。 主主同步就是两台机器互为主的关系,在任何一台机器上写入都会同 步。 若mysql主机开启了防火墙,需要关闭防火墙或创建规则。 1、修改MySQL配置文件 两台MySQL均要开启 binlog日志功能,开启方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin选项,两台MySQL的 server-ID不能一样,默认情况下两台MySQL的serverID都是1,需将其中一台修改为2即可。
1在第一台主服务上配置
语法:
log-bin = mysql-bin
binlog_format = mixed
server-id = 1
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
auto-increment-increment = 2
auto-increment-offset = 1
重启MySQL服务
语法:service mysqld restart
在第二台主服务上配置
log-bin = mysql-bin
binlog_format = mixed
server-id = 2
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
auto-increment-increment = 2
auto-increment-offset = 2
重启MySQL服务
语法:Service mysqld restart
注:主服务1和主服务2只有server-id不同和 auto-increment-offset不同。
mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offset和 auto_increment_increment。 auto-increment-increment表示自增长字段每次递增的量,其默认值是1。它的值应设为整个结构中服务器的总数。auto-increment-offset是用来设定数 据库中自动增长的起点(即初始值),因为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突,
注:可以在my.cnf文件中添加“binlog_do_db=数据库名”配置项(可以添加多个)来指定要同步的数据库
2将主服务1设为主服务2的主服务器在主服务1主机上创建授权账户,允许在主服务2主机上连接
语法:
Grant replication slave on . to 用户@‘ip’ identified by ‘密码’
Flush privileges(刷新策略)
查看主服务1的当前binlog状态信息
语法:show master status
在主服务2上将主服务1设为自己的主服务器并开启slave功能
启动从服务
语法:
change master to
master_host='ip',
master_user='用户'
master_password='密码'
master_log_fi le='binlog值',
master_log_pos=pos值;
start slave(开启从服务)
设置防火墙端口
语法:firewll-cmd --add-port=端口/tcp –permanent
不带permanent为临时端口
查看状态
语法:show slave status\G
其中slave_io_running与slave_sql_running必须为yes
3将主服务2设为主服务1的服务器在主服务2主机上创建授权账户,允许在主服务1连接
语法:
Grant replication slave on . to 用户@‘ip’ identified by ‘密码’
Flush privileges(刷新策略)
查看主服务2当前binlog状态信息
语法:show master status
在主服务1上将主服务2设为自己的主服务器并开启slave功能
change master to
master_host='ip',
master_user='用户',
master_password='密码',
master_log_file=‘binlog值',
master_log_pos=pos;
start slave(开启从服务)
设置防火墙端口
语法:firewll-cmd –add-port=ip/tcp –permanent
不带permanent为临时端口
查看状态
语法:show slave status\G
其中slave_io_running与slave_sql_running必须为yes
此时两台主服务器便以设置完成
二keepalived是集群管理中保证集群高可用的一个软件解决方案,其功 能类似于heartbeat,用来防止单点故障 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。 虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即 将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个 对外提供服务的vip,master会发组播(组播地址为224.0.0.18),当backup收不到vrrp包时就认为master宕掉 了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。 keepalived主要有三个模块,分别是core 、check和vrrp。core模块为keepalived的核心,负责主进程的启动、 维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现 VRRP协议的。
1keepalived的安装配置 1、在master1和master2上安装软件包keepalived 安装keepalived软件包与服务控制 在编译安装Keepalived之前,必须先安装内核开发包kernel-devel以及openssl-devel、popt-devel等支持库。
通过rpm或者yum工具进行安装编译安装keepalived
注意:如不知道keepalived需要哪些依赖包,可到下载后的源码解压目录下查看INSTALL 文件内容, 执行make install操作之后,会自动生成/etc/init.d/keepalived脚本文件,但还需要手动添加为系统服务,这样就可以使用 service、chkconfig工具来对keepalived服务程序进行管理了。
主服务2与主服务1安装一样若开启防火墙,需要关闭防火墙或创建规则
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --in-interface enp0s3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp0s3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
2修改Keepalived的配置文件 keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区 域,分别是global_defs、vrrp_instance和virtual_server。 global_defs:主要是配置故障发生时的通知对象以及 机器标识。 vrrp_instance:用来定义对外提供服务的VIP区域及其相关属性。 virtual_server:虚拟服务器定义 master1主机上的keepalived.conf文件的修改:
创建脚本来测试
在脚本中写入
主服务1上有关keepalived.conf文件的具体配置
global_defs {
router_id mysql1
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.179.100(指定地址IP地址)
}
}
virtual_server 192.168.179.100 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.179.128 443 {(此处指本机地址)
weight 1
notify_down /etc/keepalived/bin/mysql.sh
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
connect_port=3306
}
}
}
主服务2上有关keepalived.conf文件的具体配置
global_defs {
router_id mysql2
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 200
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.128.100
}
}
virtual_server 192.168.128.100 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.128.131 3306 {(此处指本机地址)
weight 1
TCP CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
connect_port 3306
}
}
}
注:如第二台虚拟机是克隆出去做此实验需要更改uuid值
Cd /usr/local/msyql/data(进入目录下)
Vim auto.cnf查看uuid号
更改uuid
数据库中输入select uuid()获取uuid号然后复制粘贴到auto.cnf下