设为首页 加入收藏

TOP

MySQL主从复制原理及实现(一)
2017-02-28 08:15:54 】 浏览:444
Tags:MySQL 主从 复制 原理 实现

MySQL主从复制原理


MySQL主从复制主要基于MySQL的BIN log日志,bin log 日志中包含了几乎所有mysql增删改查的语句,所以bin log日志也是mysql用户备份和数据恢复的重要文件。


当一张数据库表的记录达到千万级别时,查询效率会非常低,极大的消耗服务的CPU资源,数据库的分库分表可解决这样的问题:具体分为垂直拆分和水平拆分。


垂直拆分:是将一张数据库表按字段再进行划分为若干个小表,减小大表的访问压力,实际开发中不会在一张表设计过多的字段,并且使用垂直拆分对于web应用改动会比较大。


水平拆分:是将数据表按记录水平切分成为不同的小表,每个小表大约存放几十万至百万的记录,通过HASH路由算法来存取查询记录,这样一来大大降低了单表扫描和访问的压力。如果数据量再大,会进一步进行分区,也就是说水平拆分的小表其实是在不同的分区里,但对于web应用访问时透明的没有影响。


MySQL主从复制实现


怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下:?


首先确保防火墙已经开放了mysql的3306端口?
方法:vim /etc/sysconfig/iptables?
在规则的最前面添加:?
1、主从服务器分别作以下操作:?
? 1.1、版本一致?
? 1.2、初始化表,并在后台启动mysql?
? 1.3、修改root的密码?
?
2、修改主服务器master:?
? #vi /etc/my.cnf?
? ? ? [mysqld]?
? ? ? log-bin=mysql-bin? //[必须]启用二进制日志?
? ? ? server-id=222? ? ? //[必须]服务器唯一ID,默认是1,一般取IP最后一段?
?
3、修改从服务器slave:?
? #vi /etc/my.cnf?
? ? ? [mysqld]?
? ? ? log-bin=mysql-bin? //[不是必须]启用二进制日志?
? ? ? server-id=226? ? ? //[必须]服务器唯一ID,默认是1,一般取IP最后一段?
?
4、重启两台服务器的mysql?
? /etc/init.d/mysql restart?
?
5、在主服务器上建立帐户并授权slave:?
? #/usr/local/mysql/bin/mysql -uroot -pmttang? ?
? mysql>GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456'; //一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。?
?
6、登录主服务器的mysql,查询master的状态?
? mysql>show master status;?
? +------------------+----------+--------------+------------------+?
? | File? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB |?
? +------------------+----------+--------------+------------------+?
? | mysql-bin.000004 |? ? ? 308 |? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? |?
? +------------------+----------+--------------+------------------+?
? 1 row in set (0.00 sec)?
? 注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化?
?
7、配置从服务器Slave:?
? mysql>change master to master_host='192.168.145.222',master_user='mysync',master_password='q123456',?
? ? ? ? master_log_file='mysql-bin.000004',master_log_pos=308;? //注意不要断开,308数字前后无单引号。?
?
? Mysql>start slave;? ? //启动从服务器复制功能?
?
8、检查从服务器复制功能状态:?
?
? mysql> show slave status\G?
?
? *************************** 1. row ***************************?
?
? ? ? ? ? ? ? Slave_IO_State: Waiting for master to send event?
? ? ? ? ? ? ? Master_Host: 192.168.2.222? //主服务器地址?
? ? ? ? ? ? ? Master_User: mysync? //授权帐户名,尽量避免使用root?
? ? ? ? ? ? ? Master_Port: 3306? ? //数据库端口,部分版本没有此行?
? ? ? ? ? ? ? Connect_Retry: 60?
? ? ? ? ? ? ? Master_Log_File: mysql-bin.000004?
? ? ? ? ? ? ? Read_Master_Log_Pos: 600? ? //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos?
? ? ? ? ? ? ? Relay_Log_File: ddte-relay-bin.000003?
? ? ? ? ? ? ? Relay_Log_Pos: 251?
? ? ? ? ? ? ? Relay_Master_Log_File: mysql-bin.000004?
? ? ? ? ? ? ? Slave_IO_Running: Yes? ? //此状态必须YES?
? ? ? ? ? ? ? Slave_SQL_Running: Yes? ? //此状态必须YES?
? ? ? ? ? ? ? ? ? ? ......?
?
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。?
?
以上操作过程,主从服务器配置完成。?
? ?
9、主从服务器测试:?
?
主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:?
?
? mysql> create database hi_db;?
? Query OK, 1 row affected (0.00 sec)?
?
? mysql> use hi_db;?
? Database changed?
?
? mysql>? create table hi_tb(id int(3),name char(10));?
? Query OK, 0 rows affected (0.00 sec)?
?
? mysql> insert into hi_tb values(001,'bobu');?
? Query OK, 1 row affected (0.00 sec)?
?
? mysql> show databases;?
? +--------------------+?
? | Database? ? ? ? ? |?
? +--------------------+?
? | information_schema |?
? | hi_db? ? ? ? ? ? ? |?
? | mysql? ? ? ? ? ? ? |?
? | test? ? ? ? ? ? ? |?
? +--------------------+?
? 4 rows in set (0.00 sec)?
?
从服务器Mysql查询:?
?
? mysql> show databases;?
?
? +--------------------+?
? | Database

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇启用SELinux后PHP远程连接MySQL异.. 下一篇MySQL主从复制常见错误及解决方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目