1、主从同步的做用
mysql
一、数据分布sql
二、负载均衡(load balancing)数据库
四、高可用性(high availability)和容错安全
2、主从同步原理ruby
一、二进制日志
服务器
想要作主从复制必须得有这个二进制日志,那二进制日志记录的是什么呢?二进制日志中保存的只是跟服务器修改相关的操做,也叫复制日志
网络
二进制日志为了不日志文件过大,要进行不停地滚动,其主要有两个功能:
负载均衡
(1)即时点恢复
ide
(2)复制
测试
由于二进制日志有即时点恢复功能,因此万一某天一个不当心失误把数据库删了,只要二进制日志文件保存无缺,就能够把咱们的数据恢复回来。可见二进制日志是很是重要的,所以二进制日志千万不要和你的数据库目录放到一块儿,而要另找一个位置保存
今天咱们要作的是利用他的第二个功能完成主从复制
二、中继日志
中继日志和复制相关,中继日志是从服务器从主服务器上读取主服务器上二进制日志中的事件,每读一个过来,并保存到本地。
三、主从同步原理
原理详解:
1)主服务器发生数据更改操做,数据写入到数据文件和二进制文件中,而后去唤醒从服务器的I/O线程(IO thread)
2)从服务器的IO thread来请求主服务器并把从主服务器的binlog dump线程返回结果写入到本地中继日志中
3)从服务器的SQL thread每读一条中继日志,而后写一条到本地数据文件中
4)此过程当中,从服务器只是同步主服务器的数据,因此他无需开启二进制日志,并且从服务器最好设为只读模式
5)主从复制并非一个备份的过程,它只是一个数据同步的过程,由于,若是你在主服务器上删除一个库,那你会发现从服务器上也没有了
6)从服务器并不能负载主服务器的写操做,它只能够负载主服务器的读操做;由于,无论你主服务器写多少,从服务器都会经过它的中继日志和主服务器的二进制日志同步到它本地的
主从同步配置过程总结
一、主服务器
1)修改server-id
2)启用二进制日志
3)建立有复制权限的帐号
二、从服务器
1)修改server-id
2)启用中继日志
3)链接主服务器
4)启程复制线程
3、主从同步的实现
一、修改主服务器的配置文件,我这里的数据目录在/mydata/data下,为了安全,我把二进制日志放到了/mydata/binlogs下,别忘了给这几个目录设置属主和属组为mysql用户,mysql组
datadir=/mydata/data 指定数据目录 # binary logging is required for replication log-bin=/mydata/binlog/master-bin 二进制日志目录 # binary logging format - mixed recommended binlog_format=mixed 二进制格式设为混合模型 # required unique id between 1 and 2^32 - 1 # defaults to 1 if master-host is not set # but will not function as a master if omitted server-id = 1 主服务id为1
启动服务器 service mysqld start
二、在主服务器上建立有复制权限的帐号
mysql> grant replication slave,replication client on *.* to'repluser'@'192.168.%.%' identified by 'replpass'; Query OK, 0 rows affected (0.01 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
三、在从服务器上修改主配置文件,方法同上一步
[root@xuxu ~]# mkdir /mydata/relaylogs 建立中继日志目录
[root@xuxu ~]# chown -R mysql.mysql /mydata/relaylogs
datadir=/mydata/data 指定数据目录 read-only = on 开启只读 server-id = 11 id改成11 relay-log = /mydata/relaylogs/relay-bin 开启中继日志
四、查看从服务器的中继日志是否启动成功
mysql> show global variables like '%relay%'; +-----------------------+-----------------------------+ | Variable_name | Value | +-----------------------+-----------------------------+ | max_relay_log_size | 0 | | relay_log | /mydata/relaylogs/relay-bin | | relay_log_index | | | relay_log_info_file | relay-log.info | | relay_log_purge | ON | | relay_log_recovery | OFF | | relay_log_space_limit | 0 | | sync_relay_log | 0 | | sync_relay_log_info | 0 | +-----------------------+-----------------------------+
五、在主服务器上查看其状态信息
mysql> show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-bin.000003 | 358 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
六、查看从服务器的状态信息,检查是否链接主服务器成功
mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.211.133 主服务器 Master_User: repluser 主机名 Master_Port: 3306 端口号 Connect_Retry: 60 Master_Log_File: Read_Master_Log_Pos: 4 Relay_Log_File: relay-bin.000001 还没开始写哩 Relay_Log_Pos: 4 Relay_Master_Log_File: Slave_IO_Running: No 线程还没启动 Slave_SQL_Running: No
七、开启线程
mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Connecting to master Master_Host: 192.168.211.133 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: Read_Master_Log_Pos: 4 Relay_Log_File: relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: Slave_IO_Running: Connecting 说明没有开启链接 Slave_SQL_Running: Yes
真对以上问题:网上文章大都只是指出了可能的三种错误:
1. 网络不通
2. 密码不对
3. pos不对
我测试网络是能够ping通的。密码也对,pos也对。
后来想了好久,忽然想起来了防火墙好像没有关闭!一检查果真。
因此第四种错误是:
4. 防火墙没有关闭。
相关命令以下:
关闭命令: service iptables stop
永久关闭防火墙:chkconfig iptables off
两个命令同时运行,运行完成后查看防火墙关闭状态
service iptables status
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.211.133 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000003 Read_Master_Log_Pos: 1218 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 254 Relay_Master_Log_File: master-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes
八、在主服务器上建立一个数据库
mysql> CREATE DATABASE xiaoxiao; Query OK, 1 row affected (0.01 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | | mydb | | mysql | | performance_schema | | test | | tests | | xiaoxiao | +--------------------+
主服务器建立一个xiaoxiao库。。
九、在从服务器上启动复制线程,测试hlbrc这个库是否同步成功
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | MY | | mydb | | mysql | | performance_schema | | test | | tests | | xiaoxiao | +--------------------+ 从服务器中出现xiaoxiao库,,,说明同步成功》》》》》》 |