Mysql+keepalived双主
搭建环境说明:
master1:192.168.175.210 主 master2:192.168.175.211 备
keepalived的vip: 192.168.175.11(注意这是虚拟IP,无需存在这台主机,只要保证这个ip是没有人用的即可)
一、MySQL数据库安装(两台主机都要操作)
本次笔者是在Centos7上安装的是mysql的,如果有其他需求可以自行下载。
1、下载安装包,如果下载不了请自己到官网下载相匹配的rpm,我下载的不需要安装其他依赖,如果去官网下载可能要安装一些依赖包,依次安装即可。这种形式安装后是通过生成yum源的形式,然后通过yum形式安装。
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
2、安装mysql源
yum -y localinstall mysql57-community-release-el7-11.noarch.rpm
3、mysql安装
yum -y install mysql-community-server
在安装mysql时有较多的东西需要安装,稍等片刻即可。
4、启动mysql
启动前请关闭selinux,有两种方式关闭
方式一,临时关闭,下次开机启动后会重启
setenforce 0
方式二、永久关闭,通过设置配置文件的方式,将 SELINUX改为disabled的形式,如下:
vim /etc/selinux/config
开始启动mysql服务:
systemctl start mysqld
可以将其设置为开机启动:
[root@localhost ~]# systemctl enable mysqld
[root@localhost ~]# systemctl daemon-reload
登入mysql,注意第一次登入需要先找到mysql的root用户的密码,一般情况下root用户密码存放在/var/log/mysqld.log下,如果不在该目录下可以通过 find / -name mysqld.log查找该文件
我的是在该目录下,所以直接查看:
[root@localhost ~]# vi /var/log/mysqld.log
mysql -uroot -p
输入密码即可登入。
二、关于备份数据库问题。
mysql的双机高热,需要对那些需要备份的数据库的数据进行同步,所以需要我们先将主库的数据进行数据同步,如果是两个新建的数据库进行数据备份,无需做这一步 。不过笔者听别人说
可以不进行同步,可以指定到具体位置就可以实现自动同步,但是这种情况笔者认为,对应数据库的高可用这方面是行不通的。假设其中一台机器宕机,另一台机器进行服务的时候就会因为
数据的不同步而出现问题,所以笔者认为还是有必要进行数据同步的。
一般情况下数据库备份分为多种,有压缩文件的形式,有直接写sql文件的形式,若想了解这方面的情况,可以自行在网上搜索,笔者在这里就不进行整理。
第一步:锁定数据库,防止有新的数据进行写入,造成数据不完全同步。所以一般情况下,如果是在公司搭建,会在下班时间进行搭建。(192.168.175.210操作)
mysql>flush tables with read lock;
第二步:将需要同步的数据库进行sql文件输出。
mysqldump -uroot -p --databases test1 test2 test3>master.sql
这时会在当前目录下创建一个master.sql文件,当然也可以指定路径,不过如果仅仅是用一次,同步完毕删除即可。
第三步:生成的sql文件远程复制到备份机上,随意指定
scp master.sql master2_mysql:/tmp/
第四步:在备份机上进行数据同步(192.168.175.211)操作
mysql -uroot -p <back.sql
第五步:检查一下,看看在备份机上有没有数据,如果有数据同步完成。
三、数据库热备
数据库热备的定义在这里就不进行赘述,网上有很多这方面的原理解读。这里采用的是通过记录数据库操作,备份数据库读取这些操作,从而达到热备的效果。
第一步:分别在两个数据库中创建用于备份是时的用户并授权
在192.168.175.210上进行操作:
mysql>create user 'replicate'@'192.168.175.211' identified by 'qwe123'; # 192.168.175.211是备份机的ip
Query OK, 0 rows affected (0.09 sec)
mysql>grant replication slave on *.* to 'replicate'@'192.168.175.211';
Query OK, 0 rows affected (0.09 sec)
mysql>flush privileges;
Query OK, 0 rows affected (0.09 sec)
在192.168.175.211上进行操作:
mysql>create user 'replicate'@'192.168.175.210' identified by 'qwe123'; # 192.168.175.211是备份机的ip Query OK, 0 rows affected (0.09 sec) mysql>grant replication slave on *.* to 'replicate'@'192.168.175.210'; Query OK, 0 rows affected (0.09 sec) mysql>flush privileges; Query OK, 0 rows affected (0.09 sec)
分别在两台主机上用备份用户进行访问
# 在192.168.175.210 (操作) mysql -h192.168.175.211 -ureplicate -pqwe123 # 在192.168.175.211 (操作) mysql -h192.168.175.210 -ureplicate -pqwe123
如果都能够进入mysql 说明操作成功
第二步:配置数据库的配置文件
一般情况下,mysql的配置文件路径是在 /etc/my.cnf 如果你的没有可以用 find / -name my.cnf 的方式查找, 如果查不到,可以查看/usr/share/mysql目录下的.cnf文件,应该是mysql开头,对其负责一份到/etc/下,并改名为my.cnf即可。
注意:在修改my.cnf之前,先对其进行备份,不要直接修改
cp my.cnf my.cnf.bak
第三步:修改数据库配置(注意这了的配置是关于热备的主要配置,其他数据库配置需要自己添加)
在192.168.175.210上配置
vim /etc/my.cnf
[mysqld] server-id=1 # 唯一id innodb_flush_log_at_trx_commit=2 # 默认为1,防止数据丢失 log-bin=mysql-bin-1 #binlog日志文件名(可以任意命名) binlog-do-db=test # 记录日志的数据库(如果没有此项,表示同步所有的库) binlog-ignore-db=mysql # 不需要同步的数据库 binlog-ignore-db=information_schema binlog-ignore-db=performance_schema
binlog-ignore-db=sys log-slave-updates=ON relay_log=mysql-relay-bin slave_skip_errors=1062 # 跳过1062错误 auto_increment_increment=2 auto_increment_offset=1
# 注意
# bind_address = 127.0.0.1 若在配置文件中有这一项,需要将其注释,不然在同步数据时,的连接数据库情况会出错
在192.168.175.211上配置:
vim /etc/my.cnf
[mysqld] server-id=2 # 唯一id innodb_flush_log_at_trx_commit=2 # 默认为1,防止数据丢失 log-bin=mysql-bin-2 #binlog日志文件名(可以任意命名) binlog-do-db=test # 记录日志的数据库(如果没有此项,表示同步所有的库) binlog-ignore-db=mysql # 不需要同步的数据库 binlog-ignore-db=information_schema binlog-ignore-db=performance_schema
binlog-ignore-db=sys
log-slave-updates=ON
relay_log=mysql-relay-bin
slave_skip_errors=1062 # 跳过1062错误 auto_increment_increment=1 auto_increment_offset=1
# 注意
# bind_address = 127.0.0.1 若在配置文件中有这一项,需要将其注释,不然在同步数据时,的连接数据库情况会出错
第四步:重启数据库,主备都需要重启
systemctl restart mysqld 或 service mysqld restart
第五步:登入数据库查看状态
在192.168.175.210上登入数据库,执行操作
mysql> show master status\G; *************************** 1. row *************************** File: mysql-bin-1.00001 # 记住这个值,后面有用 Position: 154 # 记住这个值,后面有用 Binlog_Do_DB: test Binlog_Ignore_DB:mysql,information_schema,performance_schema,sys Executed_Gtid_Set: 1 row in set (0.00 sec) ERROR: No query specified
在192.168.175.211上登入数据库,执行操作
mysql> show master status\G; *************************** 1. row *************************** File: mysql-bin-2.00001 # 记住这个值,后面有用 Position: 154 # 记住这个值,后面有用 Binlog_Do_DB: test Binlog_Ignore_DB:mysql,information_schema,performance_schema,sys Executed_Gtid_Set: 1 row in set (0.00 sec) ERROR: No query specified
在192.168.175.210上登入数据库,执行操作
mysql>unlock tables; # 必须执行,否则就会报错
Query OK, 0 rows affected (0.09 sec)
mysql>stop slave; # 停止slave服务线程
mysql>change master to
mysql>master_host='192.168.175.211', # 备用ip
mysql>master_user='replicate', # 前面创建的user
mysql>master_password='qwe123', # 密码
mysql>master_log_file='mysql-bin-2.000001', # show master 上得出
mysql>master_log_pos=154;
mysql>start slave; # 重启线程
在192.168.175.211上登入数据库,执行操作
mysql>unlock tables; # 必须执行,否则就会报错 Query OK, 0 rows affected (0.09 sec) mysql>stop slave; # 停止slave服务线程 mysql>change master to mysql>master_host='192.168.175.210', # 备用ip mysql>master_user='replicate', # 前面创建的user mysql>master_password='qwe123', # 密码 mysql>master_log_file='mysql-bin-1.000001', # show master 上得出 mysql>master_log_pos=154; mysql>start slave; # 重启线程
第七步:show slave status\G查看状态
两台机器上都执行:
show slave status\G;
若如下都为两个yes则标识热备成功,有时可能出现一个是connecting状态,可以稍等片刻。如长时间不为yes,则检查防火墙,主要问题可能就是数据库连接问题。如有其它情况可以查看日志进行解决。
四、keepalived原理及安装
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
这里仅仅是对keepalived进行了一个简单的介绍,方便大家理解,若需要深入了解,可以参考官方文档。
五、keepalived的安装和配置
第一步:依赖安装
yum install -y openssl-devel yum install -y libnfnetlink-devel yum install -y libnl libnl-devel yum install -y ipvsadm
第二步:keepalived安装
cd /usr/local/src/ wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz tar -zvxf keepalived-1.3.5.tar.gz cd keepalived-1.3.5 ./configure --prefix=/usr/local/keepalived make && make install cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ mkdir /etc/keepalived/ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ echo "/etc/init.d/keepalived start" >> /etc/rc.local
复制配置文件:
[root@master1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@master1 ~]# vim /etc/keepalived/keepalived.conf
keepalived两台机器都得安装:
第三步:修改配置文件
在192.168.175.210上编辑
! Configuration: command not found global_defs { # 全局配置,关于邮箱的问题 notification_email { wallace.wang@tbs.cn } notification_email_from wallace.wang@tbs.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } vrrp_instance HA_2 { state MASTER # 设置主节点的标识 interface em1 # 设置实例绑定的网卡 virtual_router_id 51 # 唯一标识id主从必须一致 priority 101 # 优先级 这个和下面的权重结合使用 advert_int 1 nopreempt # 非抢占式,在主节点上不需要设置 authentication { # 主从必须一致 auth_type PASS # 认证方式 auth_pass 1111 # 认证密码 } virtual_ipaddress { 192.168.175.11 # 虚拟的ip } } virtual_server 192.168.175.11 3306 { delay_loop 2 lb_algo wrr # lvs调度算法 有rr|wrr|lc|wlc|lblc|sh|dh等 lb_kind DR # 负载均衡转发规则NAT|DR|RUN persistence_timeout 60 # 从新连接的时间 protocol TCP # 协议名称 real_server 192.168.175.210 3306 { # 真实的ip地址 weight 3 # 权重 notify_down /opt/script/chk_mysql.sh # 检测脚本 TCP_CHECK { connect_timeout 10 # 连接时长 nb_get_retry 3 # 重复次数 delay_before_retry 3 # connect_port 3306
在192.168.175.211上编辑
! Configuration: command not found global_defs { # 全局配置,关于邮箱的问题 notification_email { wallace.wang@tbs.cn } notification_email_from wallace.wang@tbs.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } vrrp_instance HA_2 { state BACKUP # 设置从节点的标识 interface em1 # 设置实例绑定的网卡 virtual_router_id 51 # 唯一标识id主从必须一致 priority 101 # 优先级 这个和下面的权重结合使用 advert_int 1 nopreempt # 非抢占式,在主节点上不需要设置 authentication { # 主从必须一致 auth_type PASS # 认证方式 auth_pass 1111 # 认证密码 } virtual_ipaddress { 192.168.175.11 # 虚拟的ip } } virtual_server 192.168.175.11 3306 { delay_loop 2 #lb_algo wrr # 这里在从节点上不需要设置否则会出现从节点无法连接上vip的情况 #lb_kind DR # 这里也无需设置 persistence_timeout 60 # 从新连接的时间 protocol TCP # 协议名称 real_server 192.168.175.211 3306 { # 真实的ip地址 weight 3 # 权重 notify_down /opt/script/chk_mysql.sh # 检测脚本 TCP_CHECK { connect_timeout 10 # 连接时长 nb_get_retry 3 # 重复次数 delay_before_retry 3 # connect_port 3306
第四步:编写chk_mysql.sh脚本
vim /opt/script/chk_mysql.sh
#!/bin/bash killall keepalived
第五步:启动keepalived
两台机器通过ip addr的形式查看一下:我的主节点在210上,所以这里会多一个虚拟ip
到这里为止所有的配置就已经完成,老铁们可以进行测试了。在测试之前先创建一个账号,这个账号对外有权限:
分别在两个数据库上进行创建:
grant all on *.* to test@'%' identified by "qwe123";
flush privileges;
然后通过这个进行测试:
mysql -h 192.168.175.11 -utest -pqwe123
注意在高可用这一点上,若通过虚拟IP 进行连接时,主节点宕机,在连接从节点时可能会需要几秒钟的时间,可以设置连接次数解决。其实keepalived和mysql热备无关,所以不用担心数据缺失的问题。
关于priority 和weight的权重选择问题可以看一下下面的连接文章。
https://blog.csdn.net/hzsunshine/article/details/62041036
最后希望大家帮忙点个赞和添加关注,小编会继续写一下通俗易懂的文章来和大家一起分享,最后送大家一句话:当你的能力撑不起你的野心时,就安静下来学习吧!!!!!!!!!!