zoukankan      html  css  js  c++  java
  • 怎么设置 mysql 多主复制

    更新

    其实本文主要来自www.digitalocean.com ,但是我没有买他们家的 VPS 用来 demo 了.只是用vagrant 来模拟了.

    介绍

    说说关于通过两台 vps 来扩展 mysql. 之前我们说到了在2台 vps 直接通过nginx 来设置负载均衡, 你可以读读它

    所谓 Mysql 的复制就是实时的把单一的数据集复制到另外一台服务器上. 这个配置称之为主从复制. 这是一个典型的操作配置. 我们接下来会有一个更加好的方案来实现. 以为多主(主-主)复制能够允许数据拷贝到的其他的服务器,这个大家都有,但是主要的不同在于能够提高单一服务器的读写性能. 这个设置会添加数据冗余,但是提高我们读取数据的性能.

    假设我们下面的配置在2台 vps 上.我们称之为服务器 C 和服务器 D.

    • server c 3.3.3.3
    • server d 4.4.4.4

    第一步, 安装和配置 mysql 在 c 机器上

    首先,我们要安装mysql-server 和mysql-client 在服务器上,通过下面的命令来:

    sudo apt-get install mysql-server mysql-client

    mysql 默认只接受本地(127.0.0.1)的连接, 我们需要修改一些默认的配置来实现这个,我们需要修改/ etc/mysql/my.cnf 看到下面的内容:

    #server-id              = 1
    #log_bin                = /var/log/mysql/mysql-bin.log
    #binlog_do_db           = include_database_name
    bind-address            = 127.0.0.1
    

    第一行用来标示当前的服务器,在我们的这个mysql 复制的配置中,我们需要这个标示,我们把它注释取消.第二行说明当前的binlog目录. 第三行说明当前需要同步那个数据库. 当然你可以指定很多的数据库,但是这里我们就需要一个. 最后一行说明我们允许连接的客户端在哪里.我们不需要本地的连接.注释了.

    server-id               = 1
    log_bin                 = /var/log/mysql/mysql-bin.log
    binlog_do_db            = example
    # bind-address            = 127.0.0.1
    

    重启服务器:

    sudo service mysql restart

    接下来,我们需要通过mysql 命令行来修改一些设置,

    mysql -uroot -p

    成功登陆之后,

    mysql>

    我们需要创建一个用户,用来复制数据, 我们给他叫replicator, 密码自取.

    create user 'replicator'@'%' identified by 'password';

    然后给他权限来复制数据.

    grant replication slave on *.* to 'replicator'@'%';

    这个用户不能够复制所有的库,它只能复制在配置文件中指定的数据库.

    接下来,我们需要获取当前mysql server 的一些状态, 它会被用在之后的服务器 D 的设置上. 基本上就完成了本服务器的设置.

    show master status;

    它会输出下面的一些信息:

    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |      107 | example      |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    

    第二步,安装配置服务器 D

    刚开始的步骤是一样的,就是按照 mysql 服务器和客户端, 然后修改配置文件:

    /etc/mysql/my.cnf

    这个时候,它和 c 服务器有点区别, 我们会把它改为下面的内容:

    server-id              = 2
    log_bin                = /var/log/mysql/mysql-bin.log
    binlog_do_db           = example
    # bind-address            = 127.0.0.1
    

    之后重启服务器, 登录创建用户.

    sudo service mysql restart
    mysql -u root -p 
    create user 'replicator'@'%' identified by 'password';

    接下来,需要在 d 这里创建一个数据库example,那个你想要同步的数据库.

    create database example;

    接着给这个用户权限用来复制:

    grant replication slave on *.* to 'replicator'@'%';

    下面就是最关键的一步了. 通过我们在 c 服务器上获取的信息连通两台服务器.

    还是在 D 服务器 mysqlclient 上,键入下面的命令:

    slave stop;
    change master to master_host = '3.3.3.3', master_user = 'replicator', master_password = 'password',  MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107; 
    slave start;
    
    这里关于`MASTER_LOG_FILE`和`MASTER_LOG_POS`,他们就是来自 c 服务器上 status 输出的信息.
    
    现在 D 是挂到了 C 上,我们需要反过来把 C 也挂到 D 上,查看一下 D 的` master status`:
    

    show master status

    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000004 |      107 | example      |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    

    第三步,在 C 上完成复制

    其实很上面的设置一样的,就是:

    slave stop; 
    CHANGE MASTER TO MASTER_HOST = '4.4.4.4', MASTER_USER = 'replicator', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000004', MASTER_LOG_POS = 107; 
    slave start; 
    

    注意修改你对应的 mysql 输出的信息,还有你的密码

    上面的命令 mysql 会输出下面的类似信息:

    Query OK, 0 rows affected (0.01 sec)

    到这里,配置已经完成.

    测试

    我们这样,在 c 上创建一个表,然后在 d 上把它干掉,看看 c 上还有没有.

    create database example;
    create table example.dummy (id varchar(10)); #note here is ` not '

    然后在 d 上看看有没有这个表:

    show tables in example;

    你会看到:

    +-------------------+
    | Tables_in_example |
    +-------------------+
    | dummy             |
    +-------------------+
    1 row in set (0.00 sec)
    

    然后在 d 上:

    drop table dummy;

    c 上:

    show tables;

    你会看到:

    Empty set (0.00 sec)

    see more

    http://qiita.com/xiangzhuyuan/items/b366eb5463d7b56e1aaa

  • 相关阅读:
    基于AOP实现Ibatis的缓存配置过期策略
    Step by Step构建自己的ORM系列配置管理层
    云计算从基础到应用架构系列云计算的演进
    设计模式系列桥接模式
    云计算从基础到应用架构系列云计算的概念
    云计算从基础到应用架构系列虚拟化的技术(上)
    设计模式系列装饰模式
    typeof和GetType区别
    白话学习MVC(四)URL路由
    五、DirectX编程
  • 原文地址:https://www.cnblogs.com/hanxianlong/p/4574000.html
Copyright © 2011-2022 走看看