Mysql高可用架构(主从同步)
做高可用的优势
1、成本低
2、解决单点故障
3、不容易遇到性能瓶颈
一 、Mysql主从同步架构搭建案例
优点如下:
·在业务繁忙阶段,在从服务器上可以执行查询工作(即我们常说的读写分离),降低主服务器压力;
·在从服务器上进行备份,避免备份期间影响主服务器服务;
·当主服务器出现问题时,可以迅速切换到从服务器,这样不影响线上环境。
·数据分布。由于MySQL复制并不需要很大的带宽,所以可以在不同的数据中心实现数据的拷贝。
主从复制同步的原理:
主从复制是MySQL数据库提供的一种高可用、高性能的解决方案,其实并不复杂,它不是完全的实时,其实是一种异步的实时过程,如果由于网络的原因延迟比较严重的时候,这
时候要考虑将其延迟时间作为Nagios报警的选项参数,其具体工作步骤如下。
1)主服务器把数据更新记录到二进制日志中;
2)从服务器把主服务器的二进制日志复制到自己的中继日志中,这个由从服务器的I/O线程负责;
3)从服务器执行中继日志,把其更新应用到自己的数据库上,这个由从服务器的SQL线程负责。
安装环境:
系统 CentOS release 6.9 (Final) x86_64
关闭iptables,selinux
MySQL数据库涉及的文件及对应目录:
·MySQL的安装位置:/usr/local/mysql
·MySQL的配置配置文件:/etc/my.cnf
·MySQL数据库位置:/data/mysql/
·主数据库:192.168.128.157
·从数据库:192.168.128.158
安装步骤详见:http://www.cnblogs.com/Dev0ps/p/7834037.html
两台都启动mysql服务后配置如下:
1)设置主库
1)修改主库my.cnf,主要是设置个不一样的id,以及要同步的数据库的名字。 vim /etc/my.cnf 在[mysqld]添加如下内容: log-bin = binlog //开启log-bin日志记录 binlog-do-db = mydata //mydata同步的数据库名字 server-id = 1 //从服务器改为非1 2)重启主库 service mysqld restart 3)登录主库 mysql -u root -p //默认没有密码 4)赋予从库权限账号,允许用户在主库上读取日志,命令如下: mysql> grant replication slave on *.* to 'admin'@'192.168.128.%'identified by 'redhat'; //允许192.168.128.0这个网络登录 mysql> flush privileges; //刷新 service mysqld restart //一定要重启才生效 从服务器测试连接: [root@localhost src]# mysql -u admin -p -h 192.168.128.157 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. #锁主库表 mysql> flush tables with read lock; #查看File和Postion日志点 mysql> show master status; +---------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------+----------+--------------+------------------+ | binlog.000003 | 106 | mydata | | +---------------+----------+--------------+------------------+ 创建数据库密码: mysqladmin -uroot password '123' 导出mydata库: mysqldump --master-data -uroot -p123 mydata > mydata.sql 数据不大通过ssh推送到从库: scp mydata.sql root@192.168.128.158:/root
2)从库设置
创建数据库密码: mysqladmin -uroot password '123' 创建mysqldata数据库: mysql> create database mydata; 导入mydata.sql数据: [root@localhost ~]# mysql -uroot -p123 mydata < /root/mydata.sql 修改/etc/my.cnf 注释从库日志记录如果还作为其他从服务要开启 #log-bin=mysql-bin 设置为2 只要不和主库一样就行 server-id = 2 重启服务: [root@localhost ~]# service mysqld restart 在从库上设置同步,这步也是最重要的。 设置连接MASTER MASTER_LOG_FILE为主库的File,MASTER_LOG_POS为主库的Position,命令如下所示: 注意此时一定要再次查看主库的File和Position已现在显示的为准不然同步失败。 mysql>slave stop; mysql> change master to master_host='192.168.128.157',master_user='admin',master_password='redhat',master_log_file='binlog.000003',master_log_pos=331; mysql>slave start; 查看从库的status状态: mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.128.157 Master_User: admin Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000003 Read_Master_Log_Pos: 331 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 248 Relay_Master_Log_File: binlog.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes #Slave_IO_Running:Yes(网络正常);Slave_SQL_Running:Yes(表结构正常),根据前面的MySQL主从同步的原理,这两个部分 必须都为YES(正常)才表示同步是成功的。
3)测试
主库解锁:
mysql>unlock tables;
主库上创建新表:
mysql> create table yy ( username varchar(20) not null);
从库上查看:
当主库出现问题无法启动时如果让从库作为新主库,步骤如下:
1)用stop slave IO_THREAD命令从从机上停掉IO_Thread进程,确保从机上没有再同步的SQL语句,即出现“Has read all relay log”语句字样。
2)在从数据库上执行stop slave停止从机服务,然后reset master将其设置成主数据库。
3)在其实的从机上将原有的主机IP地址更换为此机器(现在为Master主数据库)地址。
4)删除新的主数据库服务器的master.info和relay-log.info文件,防止它下次重启时还会按照从机启动。
建议:
MySQL主从Replication复制非常快,加上我们一般将其同时置于同一交换机下,所以网络方面的影响非常小,小数据量的改变几乎感觉不到延迟(但还是属于异步同步),通常在
Master端改动以后,Slave端也会立即改动,非常方便;不过,如果是用MySQL的Replication也有它的弊端,如果Master端有误操作,Slave也会误操作,这样会非常麻烦。所以,如果是作为备份机使用,就应该采取延时Replication的方法,通常是延迟一天。
相关文章
- Mysql授权允许远程访问解决Navicat for MySQL连接mysql提示客户端不支持服务器请求的身份验证协议;考虑升级MySQL客户端
- 磁盘爆满导致MySQL无法启动:Disk is full writing './mysql-bin.~rec~' (Errcode: 28). Waiting for someone to free space...
- 【MySql】开机自动启动mysql服务
- elasticsearch5.2.1使用logstash同步mysql
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- 简单的MySQL数据库主从同步配置
- Redis 学习笔记四 Mysql 与Redis的同步实践
- mysql中的百分比统计实例,round函数
- MYSQL错误解决:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
- 【原创】modb 功能设计之“支持部分MySQL客户端协议”-2
- MySQL主从数据库同步延迟问题解决
- fpm制做mysql-5.6.33 rpm包
- MySQL内核月报 2015.01-MySQL · 性能优化· 启用GTID场景的性能问题及优化
- 从管理员角度分析:MySQL表引擎中MyISAM和InnoDB的对比
- Mysql主主同步-配置数据同步
- MySql 里的IFNULL用法
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)--续
- Mysql 如果有多个可选条件怎么加索引_MySQL|mysql-索引
- MySQL主从同步(四)——M-M架构配置实战
- MySQL主从同步(三)——M-S-S架构配置实战
- win docker运行MySQL
- MySQL repeat复制函数示例
- Python MySQL - mysql-connector 驱动
- JavaWeb课程复习资料(一)——idea导入mysql-connector.jar包
- 解决Cause: java.sql.SQLException: sql injection violation, dbType mysql ... token IDENTIFIER deleted错误
- mysql数据库使用sql查询数据库大小及表大小
- file /usr/share/mysql/charsets/README from install of MySQL-server-5.1.73-1.glibc23.i386 conflicts with file from package mysql-libs-5.1.73-8.el6_8.i686
- mysql-connector-java与Mysql、Java的对应版本
- 解决MySQL的主从数据库没有同步的两种方法
- MySQL数据库的主从同步实现及应用
- PostgreSQL的学习心得和知识总结(六十五)|关于PostgreSQL数据库 实现MySQL数据库find_in_set()函数 的实现方案
- mysql sql语句大全(MySQL语句 整理一)
- mysql 索引学习
- MYSQL提权之反弹SHELL——数据库提权属于webshell到管理员的纵向提权,本质还是利用udf提权,无非是在mysql自定义函数中使用了反弹shell而已
- Mysql报错:Can't connect to local MySQL server through socket '/tmp/mysql.sock'
- Mysql 主从复制搭建
- MySQL报错Column count of mysql.user is wrong. Expected 43, found 42. Created with MySQL 50568, now run
- Centos7安装MySQL-5.7.17详细教程