设为首页 收藏本站
查看: 485|回复: 0

[经验分享] mysql 主从复制

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-10-15 09:11:20 | 显示全部楼层 |阅读模式

MySQL复制:

        扩展:
                scale on: 向上扩展,垂直扩展
                scale out:向外扩展,水平扩展

                1,4G:50 concurrent
                2*8=16, 32G , 300

        MySQL保存二进制日志:
                statement
                row
                mixed

                默认为异步工作模式

                SLAVE:
                        IO thread: 向主服务请求二进制日志中的事件
                        SQL thread:从中继日志读取事件并在本地执行

                MASTER:
                        binlog dump: 将IO thread请求的事件发送给对方;

                工作架构:
                        从服务器:有且只能有一个主服务器;
                        MariaDB-10:支持多主模型,多源复制(multi-source replication)
                        一主多从:

                读写分离:主从模型下,让前端分发器能识别读/写,并且按需调度至目标主机;
                        amoeba:
                        mysql-proxy:

                双主:master-master
                        1、必须设定双方的自动增长属性,以避免冲突
                                auto_increment_increment=#
                                        定义自动增长字段起始值
                                auto_increment_offset=2
                                        步长
                        2、数据不一致;
                                Age, Salary

                                A: update t1 set Salary=salary+1000 WHERE Age>=30;
                                B:  update t1 set Age=Age-3 WHERE Salary < 3000;

                        功能:均衡读请求;写请求双方一样;

                示例:主从复制的配置

                        版本
                           1、双方的MySQL要一致;
                        2、如果不一致:主的要低于从的;
        从哪儿开始复制:
                                1、都从0开始:
                                2、主服务器已经运行一段时间,并且存在不小的数据集:
                                把主服务器备份,然后在从服务恢复,从主服务器上备份时所处的位置开始复制;




配置过程:


        【准备】一台最小化安装CentOS6.7,编译安装好mysql,关机保存快照


        【链接克隆! 在clone的服务器上操作下面的内容】{
        【克隆后网卡问题】
1
2
3
4
5
6
7
8
9
10
11
12
13
1、[iyunv@localhost ~]# ifconfig -a   
[iyunv@localhost ~]# vim /etc/udev/rules.d/70-persistent-net.rules        
删除第一个MAC对应的不存在的记录,把下面的eth1改为eth0
[iyunv@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0   
删除MAC地址与UUID,修改IP地址,
[iyunv@localhost ~]# modprobe -r e1000
[iyunv@localhost ~]# modprobe e1000
[iyunv@localhost ~]# service network restart
重载网卡驱动,重启网络服务
[iyunv@localhost ~]# ifconfig
eth0      Link encap:Ethernet

拍摄快照,OK!





【配置主服务器:192.168.81.132】
                1、改server-id
                2、启用二进制日志
                3、创建有复制权限的帐号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[iyunv@localhost ~]# service iptables stop
[iyunv@localhost ~]# service mysqld stop
[iyunv@localhost ~]# vim /etc/my.cnf
datadir= /mydata/data
log-bin=/mydata/binlogs/master-bin
server-id       = 1
[iyunv@localhost ~]# mkdir -p /mydata/binlogs
[iyunv@localhost ~]# chown -R mysql.mysql /mydata/binlogs
[iyunv@localhost ~]# service mysqld restart
[iyunv@localhost ~]# mysql -p
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'192.168.%.%' IDENTIFIED BY 'replpass';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW GLOBAL VARIABLES LIKE '%RELAY%';

登录主服务器的mysql,查询master的状态
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      442 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化!







【配置 从服务器:192.168.81.133】
        1、改server-id
        2、启用中继日志
        3、连接主服务器
        4、启动复制线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[iyunv@localhost ~]# service iptables stop   
[iyunv@localhost ~]# vim /etc/my.cnf
# log-bin=mysql-bin
# binlog_format=mixed
server-id       = 11
relay_log       = /mydata/relaylogs/relay-bin
[iyunv@localhost ~]# vim /etc/my.cnf
[iyunv@localhost ~]# mkdir -pv /mydata/relaylogs/
mkdir: 已创建目录 "/mydata/relaylogs/"
[iyunv@localhost ~]# chown -R mysql:mysql /mydata/relaylogs/
[iyunv@localhost ~]# service mysqld restart
查看中继日志是否启用
[iyunv@localhost ~]# mysql -p
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                           |
+-----------------------+-----------------------------+
9 rows in set (0.00 sec)

此时没有任何数据
[iyunv@localhost ~]# ll /mydata/relaylogs/
总用量 0

mysql> help CHANGE MASTER TO
mysql>
mysql> CHANGE MASTER TO  MASTER_HOST='192.168.81.132',  MASTER_USER='repluser', MASTER_PASSWORD='replpass',MASTER_LOG_FILE = 'master-bin.000001',MASTER_LOG_POS = 442;
Query OK, 0 rows affected (0.02 sec)

启动从服务器
mysql> START SLAVE;

【得等一会儿就会自动连上主服务器】
mysql> SHOW SLAVE STATUS \G
       Slave_IO_State: Waiting for master to send event
          Master_Host: 192.168.81.132
          Master_User: repluser
          Master_Port: 3306
        Connect_Retry: 60
      Master_Log_File: master-bin.000001
  Read_Master_Log_Pos: 527
       Relay_Log_File: relay-bin.000002
        Relay_Log_Pos: 339
Relay_Master_Log_File: master-bin.000001
     Slave_IO_Running: Yes
    Slave_SQL_Running: Yes




【验证】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
主服务器创建一个数据库 mydb1
mysql> create database mydb1;
mysql> use mydb1;
mysql> create table t1 (id int);
mysql> insert into t1 values (1),(10);
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      989 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)



从服务器上可以看到数据库 mydb1
mysql> select * from mydb1.t1;
+------+
| id   |
+------+
|    1 |
|    1 |
|   10 |
+------+

mysql>  show slave status\G
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.81.132
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 989

【功能实现!】




重启mysqld会自动启动slave !
1
2
3
4
5
6
7
8
9
10
11
12
13
[iyunv@localhost ~]# service mysqld restart
[iyunv@localhost ~]# mysql -p
Enter password:
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show warnings;
+-------+------+--------------------------+
| Level | Code | Message                  |
+-------+------+--------------------------+
| Note  | 1254 | Slave is already running |
+-------+------+--------------------------+
1 row in set (0.02 sec)


































【在已经产生数据的mysql服务器,做mysql复制 演示】
过程:
1,模拟主服务器产生大量的数据
2,使用mysqldump 刷新日志,把所有的数据备份出来,查看新的日志文件和位置
3,关闭slave进程,在干净的从服务器导入这个备份的数据文件,开启slave进程
4,在主服务器上产生新的数据,在从服务器上验证!


主服务器操作!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
【删除主服务器的数据库】
mysql> drop database mydb1;
Query OK, 1 row affected (0.01 sec)
mysql> \q
Bye

【模拟主服务器已经产生大量的数据了,导入数据进来】
[iyunv@localhost ~]# mysql -p < /root/hellodb.sql
mysql> show master status;
+-------------------+----------+
| File              | Position |
+-------------------+----------+
| master-bin.000001 |     8833 |
+-------------------+----------+

mysql> create database mydb;
mysql> use hellodb;
mysql> create table t1 (id int);
mysql> \q
Bye
【OK,让从服务器从这个状态来复制】
dump出来,
[iyunv@localhost ~]# mysqldump -u root  -p  --all-databases --flush-logs --master-data=2 --lock-all-tables --events > all.sql


刷新日志文件,让从服务器从新的位置开始复制
[iyunv@localhost ~]# head -n 23 all.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='master-bin.000005', MASTER_LOG_POS=107;

[iyunv@localhost ~]# scp all.sql 192.168.81.133:/root/
root@192.168.81.133's password:
all.sql             100%  544KB 543.7KB/s   00:00   
[iyunv@localhost ~]#






从服务器操作!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
【在从服务器上恢复数据】

【删除从服务器的数据库,恢复到原始】
mysql> stop slave;
mysql> drop database mydb1;
Query OK, 1 row affected (0.02 sec)


[iyunv@localhost ~]# mysql -p < all.sql
Enter password:

连接到mysql,启动slave进程

mysql> stop slave;
mysql> CHANGE MASTER TO  MASTER_HOST='192.168.81.132',  MASTER_USER='repluser', MASTER_PASSWORD='replpass',MASTER_LOG_FILE = 'master-bin.000005',MASTER_LOG_POS = 107;
mysql> start slave;
mysql> show slave status\G                                                                                
       Slave_IO_State: Waiting for master to send event
          Master_Host: 192.168.81.132
          Master_User: repluser
          Master_Port: 3306
        Connect_Retry: 60
      Master_Log_File: master-bin.000005
  Read_Master_Log_Pos: 556787
       Relay_Log_File: relay-bin.000002
        Relay_Log_Pos: 556934
Relay_Master_Log_File: master-bin.000005
     Slave_IO_Running: Yes
    Slave_SQL_Running: Yes






【验证】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
主服务器创建一个数据库

mysql> create database haha;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| haha               |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.01 sec)

从服务器查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| haha               |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.03 sec)

mysql复制过程,演示结束。





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-126950-1-1.html 上篇帖子: MySQL-5.5 主从关于复制过滤的深入探究 下篇帖子: mysql 崩溃导致无法正常工作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表