MySQL高可用架构:mysql+keepalived实现
系统环境及架构
- #主机名 系统版本 mysql版本 ip地址
- mysqlMaster <a href="https://www.linuxprobe.com/" title="centos" target="_blank">centos</a>7.4 mysql5.7 192.168.1.42
- mysqlSlave centos7.4 mysql5.7 192.168.1.43
- #vip:192.168.1.41
在master和slave上分别进行数据库的安装
- yum install epel* -y && yum clean all && yum makecache
- rpm -Uvh http://repo.mysql.com/mysql57-community-release-el7.rpm
- yum clean all && yum makecache
- yum install gcc gcc-c++ openssl-devel mysql mysql-server mysql-devel -y
创建数据库文件存放路径
- mkdir /data/mysql -p
- chown -R mysql: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
- #若是不写上这个字段,在本机用<a href="https://www.linuxcool.com/" title="命令" target="_blank">命令</a>进入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里面,必须先关闭se<a href="https://www.linuxprobe.com/" title="linux" target="_blank">linux</a>,否在无法启动mysqld
- systemctl start mysqld
- 分别为主从mysql做安全加固
- #查到上一步,首次启动mysql,系统自动生成的密码( cat /var/log/mysqld.log |grep pass )
- mysql_secure_installation #使用该命令更改随机root密码(修改为 NCYD-tianyu@0791 )
- 手动同步数据(假如现在的环境,主上已经有数据了,从是新的)
- 1:在主上数据库中创建用于复制的用户,并授权
- mysql> GRANT REPLICATION SLAVE ON *.* to 'tongbu'@'192.168.1.43' identified by '123456789';
- 2:在主mysql上先锁表(使其所有表变成只读状态)
- mysql> flush tables with read lock; #不要退出终端,否在这个锁就失效了
- 3:再开启另一个命令行终端,使用myqldump等工具将数据导出(或则直接打包存储mysql数据的目录,并发送到从机上)
- 4:将导出数据复制到从机上,并创建新库并导入数据
- 互相置从,互相置主(以达到双主模式)
在mysqlMaster上将mysqlSlave设置为自己的主角色服务器
- mysql> show master status; #查看mysqlSlave的状态(记录File名字,和Position)
- change master to
- master_host = '192.168.1.43',
- master_user = 'tongbu',
- master_password = '123456789',
- master_log_file = 'mysql-bin.000002',
- master_log_pos = 1006;
- mysql> start slave; #启动slave端的复制进程(某些版本是:slave start; )
- mysql> show slave status\G #查看slaves端的I/O进程,与SQL进程
在从上将mysqlMaster设置为自己的主角色服务器
- mysql> show master status; #查看mysqlMaster的状态(记录File名字,和Position)
- change master to
- master_host = '192.168.1.42',
- master_user = 'tongbu',
- master_password = '123456789',
- master_log_file = 'mysql-bin.000002',
- master_log_pos = 1006;
- mysql> start slave; #启动slave端的复制进程
- mysql> show slave status\G #查看slaves端的I/O进程,与SQL进程
验证是否同步
1:第一验证在myssqlMaster上创建库,mysqlSlave上是否存在
2:第二验证在mysqlSlave上创建库,mysqlMaster上是否存在
安装keepalived实现VIP切换,达到高可用
- yum install keepalived -y
- #在mysqlMaster和mysqlSlave上都创建检查mysql的检查<a href="https://www.linuxcool.com/" title="脚本" target="_blank">脚本</a>,并赋予执行权限
- 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 "show slave status\G" | grep "Slave_.*_Running" | awk '{print $2}') ) 在新版本的myql中,直接将密码写在命令行,会进行安全提示,解决办法是将其写在mysql的配置文件里的 [client] 字段里,写法见上面mysql的配置文件
- slave_is=( $(mysql -e "show slave status\G" | grep "Slave_.*_Running" | awk '{print $2}') )
- if [ "${slave_is[0]}" = "Yes" -a "$slave_is[1]" = "Yes"]
- then
- exit 0
- else
- exit 1
- 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_from Alexandre.Cassen@firewall.loc
- smtp_server 192.168.200.1
- smtp_connect_timeout 30
- router_id LVS_DEVEL
- vrrp_skip_check_adv_addr
- #vrrp_strict #注意:当你发现无法ping通虚拟VIP时,建议将此行注释掉
- vrrp_garp_interval 0
- vrrp_gna_interval 0
- }
- vrrp_script mysql_check {
- script "/etc/keepalived/mysql_check.sh"
- #这个脚本,若是发现不执行,可以检查他的权限,777是不可以的,日志提示不安全,可以直接chmod +x /etc/keepalived/mysql_check.sh 就行
- #script "shutdown -r now" #或者,直接用命令进行调试
- interval 2
- weight 2
- }
- vrrp_instance VI_1 {
- state MASTER #mysqlMaster上是MASTER;mysqlSlave上是BACKUP
- interface ens192
- virtual_router_id 52
- priority 100 #mysqlMaster上是100;mysqlSlave上是90
- advert_int 1
- nopreempt #配置VIP(注意:故障切换抢占模式,尽量关闭,默认是开启的,这个参数只需要在高优先级上设置即可)
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- track_script { #调用上面定义检查mfsmaster的脚本
- mysql_check
- }
- virtual_ipaddress {
- 192.168.1.41/24 dev ens192
- }
- }
启动keepalived
- systemctl start keepalived
MySQL高可用架构:mysql+keepalived实现的更多相关文章
- MySQL高可用架构之Keepalived+主从架构部署
针对目前公司的数据库架构要做统计规划和调整,所以针对不同的业务环境要选择合适的架构就比较重要,同时作为运维人员又要考虑到维护的便捷性(不能做过多架构维护),最终停留在mha+vip/主从+vip/my ...
- mysql高可用架构之MHA,haproxy实现读写分离详解
MySQL高可用架构之MHA 一.运维人员需要掌握的MySQL技术: 1.基本SQL语句 2.基本的管理[库表数据的管理 权限的管理] 3.容灾 保证数据不丢失. 二.工作中MySQ ...
- (转)MySQL高可用架构之MHA
MySQL高可用架构之MHA 原文:http://www.cnblogs.com/gomysql/p/3675429.html 简介: MHA(Master High Availability)目前 ...
- MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解
MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Mycat介绍 1>.什么是Mycat Mycat背后是 ...
- 032:基于Consul和MGR的MySQL高可用架构
目录 一.Consul 1.Consul简介 2.准备环境 3.Consul 安装 4.Consul配置文件 5.Consul 服务检查脚本 6.Consul启动 二.MGR搭建 1.MGR配置 2. ...
- MySQL 高可用架构在业务层面的应用分析
MySQL 高可用架构在业务层面的应用分析 http://mp.weixin.qq.com/s?__biz=MzAxNjAzMTQyMA==&mid=208312443&idx=1&a ...
- 从mysql高可用架构看高可用架构设计
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间. 假设系统一直能够提供服务,我们说系统的可用性是100%.如果 ...
- MySQL高可用架构应该考虑什么? 你认为应该如何设计?
一.MySQL高可用架构应该考虑什么? 对业务的了解,需要考虑业务对数据库一致性要求的敏感程度,切换过程中是否有事务会丢失 对于基础设施的了解,需要了解基础设施的高可用的架构.例如 单网线,单电源等情 ...
- MySQL高可用架构之MySQL5.7组复制MGR
MySQL高可用架构之MySQL5.7组复制MGR########################################################################### ...
- MySQL高可用解决方案(MySQL HA Solution)
http://blog.sina.com.cn/s/blog_7e89c3f501012vtr.html 什么是高可用性?很多公司的服务都是24小时*365天不间断的.比如Call Center.这就 ...
随机推荐
- ng-bootstrap 组件集中 tabset 组件的实现分析
ng-bootstrap: tabset 本文介绍了 ng-bootstrap 项目中,tabset 的实现分析. 使用方式 <ngb-tabset> 作为容器元素,其中的每个页签以一个 ...
- mac环境下java项目无创建文件的权限
1.问题: 先抛问题,由于刚刚换用mac环境,之前windows上开发的代码调试完毕,还未上线.之后上线部署之前,tl直连测试本地环境(mac)环境,功能无法使用,显示java.io.IOExcept ...
- py+selenium+IE 批量执行脚本10几分钟,IE会卡住【无解,提供绕过方法】
问题:py+selenium+IE 批量执行单个脚本10几分钟,IE会卡住 一个脚本文件里有20几个用例,跑起来10多分钟,每次跑10分钟后(即第22条用例左右时)IE就会卡住,程序就会在那傻等,最后 ...
- stack用法,queue用法,
stack stack 模板类的定义在头文件中. stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要 的,在不指定容器类型时,默认的容器类型为deque. 定义st ...
- 洛谷P2001 硬币的面值 题解
题目链接:https://www.luogu.org/problemnew/show/P2001 这题的数据范围吓得我很慌. 分析: 这道题蒟蒻本来想用背包的,但是发现m太大,一写肯定炸,然后看到数据 ...
- java高并发系列 - 第16天:JUC中等待多线程完成的工具类CountDownLatch,必备技能
这是java高并发系列第16篇文章. 本篇内容 介绍CountDownLatch及使用场景 提供几个示例介绍CountDownLatch的使用 手写一个并行处理任务的工具类 假如有这样一个需求,当我们 ...
- Python连载24-函数list&read&seek
一. 函数list (1)定义:用打开的文件作为参数,把文件内的每一行内容作为一个元素 (2)格式:list(文件) (3)例子: with open(r"test01.txt", ...
- 一键布署WEB应用脚本
一.本机脚本(基于mac) #!/bin/sh if [ $# -lt 1 ]; then echo "deploy.sh <version number>" exi ...
- PHP中的$_GET变量
定义 在 PHP 中,预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值. $_GET 变量 预定义的 $_GET 变量用于收集来自 method=&q ...
- linux初学者-MariaDB图形管理篇
linux初学者-MariaDB图形管理篇 MariaDB不仅有文本管理方式,也有借助工具的图形管理方式.其图形管理的工具是"phpmyadmin".这个软件可以在"p ...