IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    MySQL 数据库双主改造

    OurMySQL发表于 2015-01-13 23:09:29
    love 0

    对于使用中的已有了一些数据库的 MySQL, 如何改造成双主呢? 这里写一篇文章, 详细记录操作步骤. 听取各位的意见.

    这里假设有两台服务器: A 和 B. 要让他们互为主, 但实际使用时, 不同的服务器只服务不同的 db, 避免出现数据冲突.

    1. 修改 nginx 配置, 挂维护页

    这一步很重要. 你需要告诉你的用户, 你的网站在维护, 同时要确保不会再出现数据库写操作.

    另外, 还要停止 crontab 任务.

    2. 备份数据库

    Server A:

    mysqldump -uroot -p --all-databases > a_dbdump_all.sql
    gzip a_dbdump_all.sql
    

    Server B:

    mysqldump -uroot -p --all-databases > b_dbdump_all.sql
    gzip b_dbdump_all.sql
    

    把线上数据库备份到本地

    scp test@server_a:~/a_dbdump_all.sql.gz .
    scp test@server_b:~/b_dbdump_all.sql.gz .
    

    3. 新建数据库同步账号

    Server A:

    GRANT REPLICATION SLAVE ON *.* TO 'userx'@'server_b' IDENTIFIED BY 'xxxxx';
    

    Server B:

    GRANT REPLICATION SLAVE ON *.* TO 'userx'@'server_a' IDENTIFIED BY 'xxxxx';
    

    4. 导数据

    这一步是手工将两台服务器数据库(基准数据)同步.

    Server A:

    mysqldump -uroot -p --databases db1 > a_dbdump.sql
    scp a_dbdump.sql test@server_b:~
    

    Server B:

    mysqldump -uroot -p --databases db2 > b_dbdump.sql
    scp b_dbdump.sql test@server_a:~
    

    Server A:

    source b_dbdump.sql
    

    Server B:

    source a_dbdump.sql
    

    5. 修改 mysql 配置

    Server A:

    [mysqld]
    server-id=1
    log-bin=mysql-bin
    log-slave-updates
    binlog-ignore-db=mysql
    binlog-ignore-db=test
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    replicate-ignore-db=mysql
    replicate-ignore-db=test
    replicate-ignore-db=information_schema
    replicate-ignore-db=performance_schema
    master-connect-retry=10
    Server B:
    
    [mysqld]
    server-id=2
    log-bin=mysql-bin
    log-slave-updates
    binlog-ignore-db=mysql
    binlog-ignore-db=test
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    replicate-ignore-db=mysql
    replicate-ignore-db=test
    replicate-ignore-db=information_schema
    replicate-ignore-db=performance_schema
    master-connect-retry=10
    

    注意, 他们的 server-id 不相同.

    6. 重启 MySQL, 测试同步账号可用

    重启 MySQL.

    Server A:

    mysql -hserver_b -uuserx -pxxxxx
    

    Server B:

    mysql -hserver_a -uuserx -pxxxxx
    

    7. 启动 Slave 线程

    Server A:

    FLUSH TABLES;
    show master status;
    

    会显示这样的信息.

    *************************** 1. row ***************************
                File: mysql-bin.000001
            Position: 106
        Binlog_Do_DB: 
    Binlog_Ignore_DB: mysql,test,information_schema,performance_schema
    1 row in set (0.00 sec)
    

    记录 File 和 Position, 这时 binlog 的当前位置, 因为 Slave 要从这个位置开始同步数据.

    Server B:

    CHANGE MASTER TO MASTER_HOST='server_a';
    CHANGE MASTER TO MASTER_USER='userx';
    CHANGE MASTER TO MASTER_PASSWORD='xxxxx';
    CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
    start slave;
    show slave status\G
    

    同样的, 在 Server A 上也启动同步 Slave 进程.

    因为我们确保了没有数据库写操作, 所以不需要 FLUSH TABLES WITH READ LOCK;.

    8. 验证

    在不同的数据库上执行一些更新数据的操作, 看看数据是否同步过去了.

    9. 完成

    恢复 crontab 任务

    修改 nginx, 撤下维护网页, 恢复服务

    如果你有什么问题, 或者发现里这些步骤的不足, 欢迎评论!

    抱歉猜想失败,您看看下面的文章有用吗?

    • 2013 年 9 月 5 日 -- Unique索引优化实践
    • 2012 年 2 月 16 日 -- 开启mysql远程访问的知识点
    • 2009 年 11 月 18 日 -- Memory & MyISAM 引擎小注意!
    • 2012 年 2 月 6 日 -- Mysql数据库 mysql-bin 日志的管理与维护
    • 2013 年 11 月 19 日 -- 使用Autoconf检测MySQL相关的软件包
    • 2008 年 10 月 9 日 -- MySQL字符串比较函数学习(二) — 比较函数
    • 2010 年 9 月 30 日 -- Gearman Server 使用 MySQL UDFs 来管理和保持队列
    • 2008 年 12 月 30 日 -- 关于MySQL的init-file选项的用法实例
    • 2008 年 10 月 24 日 -- MySQL Replication(复制)基本原理
    • 2009 年 5 月 26 日 -- ft_precompiled_stopwords)">MySQL全文检索中不进行全文索引默认过滤词表(ft_stopword_file =>ft_precompiled_stopwords)


沪ICP备19023445号-2号
友情链接