首页 > 热门搜索 > MySQL高可用架构:mysql+keepalived实现

MySQL高可用架构:mysql+keepalived实现

2019/08/1623:04

MySQL高可用架构:mysql+keepalived实现

系统环境及架构

#主机名系统版本mysql版本ip地址

mysqlMastercentos7.4mysql5.7192.168.1.42

mysqlSlavecentos7.4mysql5.7192.168.1.43

#vip:192.168.1.41

在master和slave上分别进行数据库的安装

yuminstallepel*-y&&yumcleanall&&yummakecache

rpm-Uvhhttp://repo.mysql.com/mysql57-community-release-el7.rpm

yumcleanall&&yummakecache

yuminstallgccgcc-c++openssl-develmysqlmysql-servermysql-devel-y

创建数据库文件存放路径

mkdir/data/mysql-p

chown-Rmysql:mysql/data/mysql

配置mysql配置文件

#在mysqlMaster上配置mysql配置文件

vi/etc/my.cnf

[mysqld]

server-id=1#全局唯一,每台都不能一样

log-bin=mysql-bin#log-bin表示开启二进制日志记录,mysql-bin表示日志文件的命名格式,会生成mysql-bin.0001等等

relay-log=mysql-relay-bin#指定中继日志格式(拉取主mysql日志后,在从库上生成的日志)

replicate-wild-ignore-table=mysql.%#指定那些库或则表不进行同步,mysql是库名,.%表示下面所有的表,mysql.user表示不同不mysql库下的user表

replicate-wild-ignore-table=test.%

replicate-wild-ignore-table=information_schema.%

#replicate-wild-do-table=boke.%#表示同步那个库

#注意:不要在主库上使用binlog-do-db或 binlog-ignore-db选项

#也不要在从库上使用 replicate-do-db或 replicate-ignore-db选项,因为这有可能产生跨库更新失败的问题.推荐从库上使用 replicate_wild_do_table和 replicate_wild_ignore_table这两个选项来解决复制过滤问题

datadir=/data/mysql

socket=/data/mysql/mysql.sock

user=mysql

symbolic-links=0

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

character-set-server=utf8

[mysql]

socket=/data/mysql/mysql.sock

default-character-set=utf8

[client]

socket=/data/mysql/mysql.sock

default-character-set=utf8

user=root

password=NCYD-tianyu@0791

#若是不写上这个字段,在本机用命令进入mysql会报错,提示默认路径/var/lib/mysql/mysql.sock找不到

在mysqlSlave上配置mysql配置文件

vi/etc/my.cnf

[mysqld]

server-id=2

log-bin=mysql-bin

relay-log=mysql-relay-bin

replicate-wild-ignore-table=mysql.%

replicate-wild-ignore-table=test.%

replicate-wild-ignore-table=information_schema.%

datadir=/data/mysql

socket=/data/mysql/mysql.sock

user=mysql

symbolic-links=0

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

character-set-server=utf8

[mysql]

socket=/data/mysql/mysql.sock

default-character-set=utf8

[client]

socket=/data/mysql/mysql.sock

default-character-set=utf8

user=root

password=NCYD-tianyu@0791

#若是不写上这个字段,在本机用命令进入mysql会报错,提示默认路径/var/lib/mysql/mysql.sock找不到,先初始化数据库(需要进行初始化在/data/mysql目录里生成必要的信息)

#mysql5.7.7以后的初始化方法

mysqld--initialize--user=mysql--datadir=/data/mysql

#mysql5.7.7以前的初始化方法

mysql_install_db--user=mysql--datadir=/data/mysql

分别启动主从数据库

#在centos7里面,必须先关闭selinux,否在无法启动mysqld

systemctlstartmysqld

分别为主从mysql做安全加固

#查到上一步,首次启动mysql,系统自动生成的密码( cat/var/log/mysqld.log|greppass )

mysql_secure_installation#使用该命令更改随机root密码(修改为 NCYD-tianyu@0791 )

手动同步数据(假如现在的环境,主上已经有数据了,从是新的)

1:在主上数据库中创建用于复制的用户,并授权

mysql>GRANTREPLICATIONSLAVEON*.*to'tongbu'@'192.168.1.43'identifiedby'123456789';

2:在主mysql上先锁表(使其所有表变成只读状态)

mysql>flushtableswithreadlock;#不要退出终端,否在这个锁就失效了

3:再开启另一个命令行终端,使用myqldump等工具将数据导出(或则直接打包存储mysql数据的目录,并发送到从机上)

4:将导出数据复制到从机上,并创建新库并导入数据

互相置从,互相置主(以达到双主模式)

在mysqlMaster上将mysqlSlave设置为自己的主角色服务器

mysql>showmasterstatus;#查看mysqlSlave的状态(记录File名字,和Position)

changemasterto

master_host='192.168.1.43',

master_user='tongbu',

master_password='123456789',

master_log_file='mysql-bin.000002',

master_log_pos=1006;

mysql>startslave;#启动slave端的复制进程(某些版本是:slavestart;)

mysql>showslavestatus\G#查看slaves端的I/O进程,与SQL进程

在从上将mysqlMaster设置为自己的主角色服务器

mysql>showmasterstatus;#查看mysqlMaster的状态(记录File名字,和Position)

changemasterto

master_host='192.168.1.42',

master_user='tongbu',

master_password='123456789',

master_log_file='mysql-bin.000002',

master_log_pos=1006;

mysql>startslave;#启动slave端的复制进程

mysql>showslavestatus\G#查看slaves端的I/O进程,与SQL进程

验证是否同步

1:第一验证在myssqlMaster上创建库,mysqlSlave上是否存在

2:第二验证在mysqlSlave上创建库,mysqlMaster上是否存在

安装keepalived实现VIP切换,达到高可用

yuminstallkeepalived-y

#在mysqlMaster和mysqlSlave上都创建检查mysql的检查脚本,并赋予执行权限

touch/etc/keepalived/mysql_check.sh

chmod+x/etc/keepalived/mysql_check.sh

vi/etc/keepalived/mysql_check.sh

#!/bin/bash

#slave_is=($(mysql-uroot-pNCYD-tianyu@0791-e"showslavestatus\G"|grep"Slave_.*_Running"|awk'{print$2}')) 在新版本的myql中,直接将密码写在命令行,会进行安全提示,解决办法是将其写在mysql的配置文件里的[client]字段里,写法见上面mysql的配置文件

slave_is=($(mysql-e"showslavestatus\G"|grep"Slave_.*_Running"|awk'{print$2}'))

if["${slave_is[0]}"="Yes"-a"$slave_is[1]"="Yes"]

then

exit0

else

exit1

fi

#注意,keepalived检查脚本vrrp_script,只认两个返回值,0表示正常,非0表示不正常(这在写脚本是要注意),不正常就要做相关的切换

配置keepalived,以实现高可用

vi/etc/keepalived/keepalived.conf

global_defs{

notification_email{

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_fromAlexandre.Cassen@firewall.loc

smtp_server192.168.200.1

smtp_connect_timeout30

router_idLVS_DEVEL

vrrp_skip_check_adv_addr

#vrrp_strict#注意:当你发现无法ping通虚拟VIP时,建议将此行注释掉

vrrp_garp_interval0

vrrp_gna_interval0

}

vrrp_scriptmysql_check{

script"/etc/keepalived/mysql_check.sh"

#这个脚本,若是发现不执行,可以检查他的权限,777是不可以的,日志提示不安全,可以直接chmod+x/etc/keepalived/mysql_check.sh就行

#script"shutdown-rnow"#或者,直接用命令进行调试

interval2

weight2

}

vrrp_instanceVI_1{

stateMASTER#mysqlMaster上是MASTER;mysqlSlave上是BACKUP

interfaceens192

virtual_router_id52

priority100#mysqlMaster上是100;mysqlSlave上是90

advert_int1

nopreempt#配置VIP(注意:故障切换抢占模式,尽量关闭,默认是开启的,这个参数只需要在高优先级上设置即可)

authentication{

auth_typePASS

auth_pass1111

}

track_script{#调用上面定义检查mfsmaster的脚本

mysql_check

}

virtual_ipaddress{

192.168.1.41/24devens192

}

}

启动keepalived

systemctlstartkeepalived

标签: mysql 架构


声明:本文内容来源自网络,文字、图片等素材版权属于原作者,平台转载素材出于传递更多信息,文章内容仅供参考与学习,切勿作为商业目的使用。如果侵害了您的合法权益,请您及时与我们联系,我们会在第一时间进行处理!我们尊重版权,也致力于保护版权,站搜网感谢您的分享!

站长搜索

http://www.adminso.com

Copyright @ 2007~2024 All Rights Reserved.

Powered By 站长搜索

打开手机扫描上面的二维码打开手机版


使用手机软件扫描微信二维码

关注我们可获取更多热点资讯

站长搜索目录系统技术支持