mysql高可用部署
实现原理mysql replication 实现主主复制,再加上keepalived实现共用虚拟IP。从而实现自动切换IP。
mysql主主配置
1.前提条件
版本一致
配置一致
2.修改服务器master
#vi /etc/my.cnf
[mysqld]
log-bin=/data/mysql/mysql-bin #启用二进制日志 注意:日志的目录需要先建立,并将所有者该为mysql
binlog-do-db=osyunweidb #需要记录二进制日志的数据库,如果有多个数据库,逗号分隔或重复设置此参数,每个数据库一行
binlog-ignore-db=mysql #不需要记录二进制日志的数据库,如果有多个数据库,逗号分隔或重复设置此参数,每个数据库一行
#注:不加binlog-do-db和binlog_ignore_db,那就表示全部数据库都记录二进制日志。
expire_logs_days=30 #超过30天的binlog删除
server-id=222 #服务器唯一ID,默认是1,一般取IP最后一段
log-slave-updates #配置从库上的更新操作是否写入二进制文件,如果这台从库,还要做其他从库的主库,那么就需要打这个参数,以便从库的从库能够进行日志同步
sync_binlog=1
relay_log = /home/relaylog/mysql-relay-bin #中继日志文件
replicate-do-db=osyunweidb #需要复制的数据库名,如果有多个数据库,逗号分隔或重复设置此参数,每个数据库一行
replicate-ignore-db=mysql #不需要复制的数据库,如果有多个数据库,逗号分隔或重复设置此参数,每个数据库一行
3.修改服务器slave
#vi /etc/my.cnf
[mysqld]
relay_log = /home/relaylog/mysql-relay-bin #复制日志文件
replicate-do-db=osyunweidb #需要复制的数据库名,如果有多个数据库,逗号分隔或重复设置此参数,每个数据库一行
replicate-ignore-db=mysql #不需要复制的数据库,如果有多个数据库,逗号分隔或重复设置此参数,每个数据库一行
expire_logs_days=30 #超过30天的binlog删除
server-id=226 #服务器唯一ID,默认是1,一般取IP最后一段
log-slave-updates #配置从库上的更新操作是否写入二进制文件,如果这台从库,还要做其他从库的主库,那么就需要打这个参数,以便从库的从库能够进行日志同步
sync_binlog=1
log-bin=/data/mysql/mysql-bin #启用二进制日志 注意:日志的目录需要先建立,并将所有者该为mysql
binlog-do-db=osyunweidb #需要记录二进制日志的数据库,如果有多个数据库,逗号分隔或重复设置此参数,每个数据库一行
binlog-ignore-db=mysql #不需要记录二进制日志的数据库,如果有多个数据库,逗号分隔或重复设置此参数,每个数据库一行
#注:不加binlog-do-db和binlog_ignore_db,那就表示全部数据库都记录二进制日志。
4.重启两台服务器的mysql
service mysqld restart
5.在两台服务器上建立复制账号并赋权限
#mysql -uroot -proot@123
服务器master:
mysql>GRANT REPLICATION SLAVE ON osyunweidb.* to 'mysync'@'slave' identified by 'q123456'; #一般不用root帐号
mysql>flush privileges;
服务器slave:
mysql>GRANT REPLICATION SLAVE ON osyunweidb.* to 'mysync'@'master' identified by 'q123456'; #一般不用root帐号
mysql>flush privileges;
6.同步业务数据库并查看master的状态
a)、master服务器的业务数据库导出mysqldump:
flush tables with read lock; #数据库只读锁定命令,防止导出数据库的时候有数据写入,这时不要退出mysql命令行,因为退出命令行后,全局表锁就失效,新开一个窗口继续执行以下命令
mysqldump -uroot -proot@123 业务库 >业务库.sql
show master status;
注意:这里记住File的值:mysql-bin.000011和Position的值:107,Binlog_Do_DB的值:业务库,后面会用到。
unlock tables; #解除锁定
b)、数据库导入到slave服务器:
mysql -uroot -proot@123 < 业务库.sql
c)、查看slave服务器的master状态:
flush tables with read lock;
show master status;
注意:这里记住File的值:mysql-bin.000022和Position的值:207,Binlog_Do_DB的值:业务库,后面会用到。
unlock tables;
7.配置slave服务器
mysql>stop slave;
mysql>change master to master_host='master',master_user='mysync',master_password='q123456',
master_log_file='mysql-bin.000011',master_log_pos=107; #注意不要断开,107数字前后无单引号。
mysql>start slave; #启动slave服务器复制功能
8.配置master服务器
mysql>stop slave;
mysql>change master to master_host='slave',master_user='mysync',master_password='q123456',
master_log_file='mysql-bin.000022',master_log_pos=207; #注意不要断开,207数字前后无单引号。
mysql>start slave; #启动master服务器复制功能
9.检查master和slave服务器复制功能状态
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.222 #主服务器地址
Master_User: mysync #授权帐户名,尽量避免使用root
Master_Port: 3306 #数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 #同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes #此状态必须YES
Slave_SQL_Running: Yes #此状态必须YES
......
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
10.主主同步状态验证
安装和配置keepalived
范围:两台mysql主机
1.安装keepalived
yum install keepalived
2.配置master的keepalive.conf
vi /etc/keepalived/keepalive.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@huangmingming.cn
741616710@qq.com
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance HA_1 {
state BACKUP #master和slave都配置为BACKUP
interface eth0 #指定HA检测的网络接口
virtual_router_id 80 #虚拟路由标识,主备相同
priority 100 #定义优先级,slave设置90
advert_int 1 #设定master和slave之间同步检查的时间间隔
nopreempt #不抢占模式。只在优先级高的机器上设置即可
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP,可以设置多个,每行一个
192.168.1.208/24 dev eth0 #MySQL对外服务的IP,即VIP
}
}
virtual_server 192.168.1.208 3306 {
delay_loop 2 #每隔2秒查询real server状态
lb_algo wrr #lvs 算法
lb_kinf DR #LVS模式(Direct Route)
persistence_timeout 50
protocol TCP
real_server 192.168.1.210 3306 { #监听本机的IP
weight 1
notify_down /usr/local/keepalived/bin/mysql.sh
TCP_CHECK {
connect_timeout 10 #10秒无响应超时
bingto 192.168.1.208
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
3.配置slave的keepalived.conf
vi /etc/keepalived/keepalive.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@huangmingming.cn
741616710@qq.com
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance HA_1 {
state BACKUP #master和slave都配置为BACKUP
interface eth0 #指定HA检测的网络接口
virtual_router_id 80 #虚拟路由标识,主备相同
priority 90 #定义优先级,slave设置90
advert_int 1 #设定master和slave之间同步检查的时间间隔
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP,可以设置多个,每行一个
192.168.1.208/24 dev eth0 #MySQL对外服务的IP,即VIP
}
}
virtual_server 192.168.1.208 3306 {
delay_loop 2
lb_algo wrr
lb_kinf DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.211 3306 { #监听本机的IP
weight 1
notify_down /usr/local/mysql/bin/mysql.sh
TCP_CHECK {
connect_timeout 10
bingto 192.168.1.208
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
mysql高可用验证
1.停掉VIP对应主机上的mysql
service mysqld stop
2.通过VIP连接mysql
mysql –hVIP –uroot –proot@123
mysql>show variables like ‘%hostname%’
查看是否为另一台主机名