LVS+KeepAlived+Dbproxy+Mysql高可用集群方案
参考文档https://www.php.cn/mysql-tutorials-116060.html
一、安装mysql5.6
1、添加MySQL源
rpm -ivh https://repo.mysql.com//mysql57-community-release-el7-9.noarch.rpm
vim /etc/yum.repos.d/mysql-community.repo
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/
enabled=1 #这里改成1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=0 #这里改成0,禁用
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
2、安装mysql 5.6
2.1安装
yum install mysql-server
2.2 初始化 #参考文档https://www.cnblogs.com/sunny18/p/8684861.html
mysql_secure_installation
二、配置MySQL主从复制
1. 修改master节点配置文件:
vim /etc/my.cnf
[mysqld]
server-id=1 #不得与其他节点相同
report-port=3306
port=3306
datadir=/data/mysql/
socket=/tmp/mysql.sock
binlog-format=ROW
log-bin=master-bin
log-bin-index=master-bin.index
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
expire-logs-days=7
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
auto_increment_increment=2 #该配置只需要在master1、master2上配置 用来确保自增键不冲突
auto_increment_offset=1 #该配置只需要在master1、master2上配置 用来确保自增键不冲突
#binlog-do-db=mydb #需要同步的数据库,多个数据库添加多行配置项即可,需要重启mysql实例
#mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offset和auto_increment_increment。auto_increment_offset表示自增长字段从那个数开始,他的取值范围是1 .. 65535。auto_increment_increment表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535
##在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2,而要把auto_increment_offset分别配置为1和2.这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。
2.修改slave节点配置文件
vim /etc/my.cnf
[mysqld]
binlog-format=ROW
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=11 #不得与其他节点相同
report-port=3306
port=3306
log-bin=mysql-bin.log
datadir=/mydata
socket=/tmp/mysql.sock
#auto_increment_increment=2 #该配置只需要在master1、master2上配置 用来确保自增键不冲突
#auto_increment_offset=1 #该配置只需要在master1、master2上配置 用来确保自增键不冲突
#binlog-do-db=mydb #需要同步的数据库,多个数据库添加多行配置项即可,需要重启mysql实例
注:四个节点的配置信息差不多一样,server-id要确保唯一性。
3、登录mysql创建复制用户
#为了便于管理,本例中将所有节点的复制用户都设置为一样的。
GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'passwd';
GRANT REPLICATION SLAVE ON *.* TO root@'%' IDENTIFIED BY '123456';
flush privileges;
4、为备节点提供初始数据集
注:
锁定主表,备份主节点上的数据,将其还原至从节点;
如果没有启用GTID,在备份时需要在master上使用show master status命令查看二进制日志文件名称及事件位置,以便后面启动slave节点时使用。
5、启动从节点的复制线程
5.1 master1 执行
CHANGE MASTER TO MASTER_HOST='master2.node.com',MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;
5.2 master2 执行
CHANGE MASTER TO MASTER_HOST='master1.node.com',MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;
5.3 slave1 执行
CHANGE MASTER TO MASTER_HOST='master1.node.com',MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;
5.4 slave2 执行
CHANGE MASTER TO MASTER_HOST='master2.node.com',MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;
6、在各节点上查看是否成功开启复制
show slave status\G;
#Slave_IO_Running: Yes\Slave_SQL_Running: Yes 表示主从复制线程成功执行。
三、配置高可用负载均衡keepalived+lvs
master1、mastre2搭建写高可用负载均衡,
VIP:192.168.1.120。
slave1、slave2搭建读高可用负载均衡,
VIP:192.168.1.200。
1、安装ipvsadm ``
注:linux内核2.4版本以上的基本都支持LVS,要使用lvs,只需要再安装一个lvs的管理工具:ipvsadm
yum -y install ipvsadm
ipvsadm -Ln
echo "1" > /proc/sys/net/ipv4/ip_forward
sysctl -p
2、配置lvs,四个节点上几乎都一样lvs脚本,只需要修改相应的VIP即可
vim /etc/rc.d/init.d/realserver.sh
#!/bin/bash
#description: Config realserver lo and apply noarp
SNS_VIP=192.168.146.220 #修改为对应的VIP即可
. /etc/rc.d/init.d/functions
case "$1" in
# 禁用本地的ARP请求、绑定本地回环地址
start)
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
/sbin/sysctl -p >/dev/null 2>&1
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up #在回环地址上绑定VIP,设定掩码,与Direct Server(自身)上的IP保持通信
/sbin/route add -host $VIP dev lo:0
echo "LVS-DR real server starts successfully.\n"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "LVS-DR real server stopped.\n"
;;
status)
isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
isRoOn=`/bin/netstat -rn | grep "$VIP"`
if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
echo "LVS-DR real server has run yet."
else
echo "LVS-DR real server is running."
fi
exit 3
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
3、添加脚本执行权限个节点都执行:
chmod u+x /etc/rc.d/init.d/realserver.sh
4、启动lvs
/etc/rc.d/init.d/realserver.sh start #启动lvs脚本设置参数,绑定VIP
5、4台服务器安装keepalived
注:Keepalived是一个专门为lvs提供高可用功能的机制,它可以实现当有两个主从lvs,而且主lvs损坏的时候,将其IP地址以及lvs转移至备份lvs上。
yum -y install keepalived
6、配置文件位置:/etc/keepalived/keepalived.conf
master1、master2上的keeplived为互备模式
slave1、slave2上的keeplived为互备模式
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_Master
}
vrrp_instance VI_1 {
state BACKUP #在备机上修改为BACKUP
interface eth1 #VIP要绑定到eth1上,是具体情况而定,填写具体的主机网卡名称
virtual_router_id 60
priority 100 #对应备机的值要小于这个值
nopreempt #不抢占资源,意思就是它活了之后也不会再把主抢回来,备机不需要设置改项
advert_int 1
authentication {
auth_type PASS #备机上要与之一致
auth_pass 1111 #备机上要与之一致
}
virtual_ipaddress {
192.168.1.120/32 dev eth1 label eth1:0 #VIP要绑定到eth1上,是具体情况而定,填写具体的主机网卡名称,修改为对应的VIP
}
}
virtual_server 192.168.1.120 3306 { #修改为对应的VIP
delay_loop 6
lb_algo wrr #lvs负载均衡算法
lb_kind DR #lvs的转发模式
#nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.1.121 3306 { #修改为master01对应的ip
weight 2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
real_server 192.168.1.114 3306 { #修改为master02对应的ip
weight 2
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
7、启动keepalibed,并查看VIP绑定情况
/etc/init.d/keepalived start
ip add #查看IP状态
ipvsadm -Ln # 查看LVS状态,若有没有该工具yum -y install ipvsadm即可
四、安装使用dbproxy
1.rpm -vhi Atlas-2.2.1.el6.x86_64.rpm # 将下载的rpm安装到服务器上
2.cd /usr/local/mysql-proxy/conf/ # 进入到代理目录
3.cp test.cnf dbproxy.cnf # 将自带的test配置文件拷贝成新的排位置文件
2.vim /usr/local/mysql-proxy/conf/dbproxy.cnf # 修改新的配置文件
[mysql-proxy]
#带#号的为非必需的配置项目
#管理接口的用户名
admin-username = admin
#管理接口的密码
admin-password = 123456
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
#修改地址为之前配置的虚拟地址
proxy-backend-addresses = 192.168.1.120:3308
#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
#修改地址为两个从库的地址
proxy-read-only-backend-addresses = 99.1.17.14:3308@1,99.1.17.13:3308@1
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
#为确保代理正常写入。最好新建统一新的账户去代理
pwds = root:/iZxz+0GRoA=
#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
daemon = true
#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
keepalive = true
#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 8
#日志级别,分为message、warning、critical、error、debug五个级别
log-level = debug
#日志存放的路径
log-path = /usr/local/mysql-proxy/log
#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
sql-log = ON
#慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。
sql-log-slow = 3000
#实例名称,用于同一台机器上多个Atlas实例间的区分
#instance = test
#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:3306
#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345
#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
#tables = person.mt.id.3
#默认字符集,设置该项后客户端不再需要执行SET NAMES语句
charset = utf8
#允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
#client-ips = 127.0.0.1, 192.168.1
#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
#lvs-ips = 192.168.1.1
五、监控mysql健康状态
对mysql的健康状态检查后执行的操作,在real_server区段添加:
notify_up $PATH/SCRIPT.sh #检测到服务开启后执行的脚本 可以是邮件报警,如某某IP,mysql挂掉。。。。
notify_down $PATH/SCRIPT.sh #检测到服务停止后执行的脚本.
在实际应用中,当master挂掉之后,backup会占有资源。
但当master恢复之后会抢占资源,自己继续做回主,将VIP绑定至master主机上。此时正在连接的业务有可能会中断。
所以在生产上需要设置为不抢占(nopreempt)资源,即它活了之后也不会将主抢回来,继续作为备机存在。但nopreempt只能在stat为BACKUP时设置,所以此时应该将主备机上的stat 都设置为BACKUP,将priority设置为一高一低,以优先级高低确定谁是主。对keeplived做简单的修改即可:
state BACKUP #都修改成BACKUP
virtual_router_id 60 #默认51 主从都修改为60
priority 100 #优先级(1-254之间),另一台改为90,备用节点必须比主节点优先级低。
nopreempt #不抢占资源,意思就是它活了之后也不会再把主抢回来,备机不需要设置改项
五、附录
1、架构图
WechatIMG117.png
2.遇见的问题
1.dbproxy日志报错信息如下:
2019-12-18 06:15:45: (critical) proxy-plugin.c.1450: I have no server backend, closing connection
2019-12-18 06:15:45: (critical) network-mysqld.c.1387: plugin_call(CON_STATE_READ_QUERY) failed
解决方式:
由于代理账号未能在全部数据库上统一造成的。
新建统一账号作为代理账号即可。
网友评论