[[高手答疑]] 配置MySQL主从复制与读写分离实现高性能数据库架构

[复制链接]
查看: 10|回复: 0
发表于 昨天 13:54 | 显示全部楼层 | 阅读模式
易博V9下载

MySQL 主从复制与读写分离配置指南

本文将详细介绍如何利用三台服务器(s1、s2、s3)构建一个MySQL的主从复制及读写分离系统。具体来说,s1作为Web服务器,安装了HTTPD、PHP、MySQL以及MySQL-Proxy;s2作为主数据库服务器(Master),只安装MySQL;s3作为从数据库服务器(Slave),也只安装MySQL。我们的目标是让s1上的网站能够将数据库的读写操作分别分摊到s2和s3上,其中s2负责所有的写操作以及部分读操作,而s3则专注于读操作。此外,当s2上的数据库发生数据更新时,这些更改会自动同步到s3的数据库中。

配置主从复制(涉及的服务器:s2,s3)

1. 在主数据库服务器(master)s2上进行配置

  1. # 编辑MySQL配置文件
  2. vim /etc/my.cnf
  3. # 整体内容如下:
  4. [client]
  5. default_character_set=utf8
  6. [mysqld]
  7. default_character_set=utf8
  8. datadir=/var/lib/mysql
  9. socket=/var/lib/mysql/mysql.sock
  10. user=mysql
  11. symbolic-links=0
  12. server-id=1 # 重要,需和副数据库的id区分开,主为1,副为2
  13. log-bin=mysql-bin # 定义二进制log文件,从数据库将通过读取二进制log文件来更新
  14. binlog-ignore-db=mysql # 定义忽略的数据库,即不需要同步的数据库
  15. binlog-do-db=testdb # 定义需要同步的数据库,如果没有此,将同步所有数据库(除了上面ignore的数据库)
  16. [mysqld_safe]
  17. log-error=/var/log/mysqld.log
  18. pid-file=/var/run/mysqld/mysqld.pid
复制代码

2. 在主数据库服务器(master)s2上的MySQL中创建一个供副数据库(slave)s3连接的账号

  1. # 在主数据库服务器上进入MySQL命令行
  2. mysql -u root -p
  3. (输入密码)
  4. # 成功进入MySQL命令行,新建一个用户
  5. mysql grant replication slave on *.* to '用户名'@'副数据库的IP地址' identified by '密码';
  6. # 查看创建用户是否成功
  7. mysql select user,host from mysql.user;
复制代码

3. 重启主数据库服务器上的MySQL服务

  1. service mysqld restart
复制代码

4. 记录主数据库服务器的Master状态,在配置从服务器时需要使用到

  1. # 同样进入MySQL命令行
  2. mysql show master status;
复制代码

记下File和Position。需要注意的是这两个值在MySQL重启后变化。所以在第一次配置从服务器时,需要注意了!

主数据库的配置完成,现在开始从数据库服务器。

5. 配置从数据库服务器上的my.cnf文件

  1. vim /etc/my.cnf
  2. # 整体内容如:
  3. [client]
  4. default_character_set=utf8
  5. [mysqld]
  6. default_character_set=utf8
  7. datadir=/var/lib/mysql
  8. socket=/var/lib/mysql/mysql.sock
  9. user=mysql
  10. symbolic-links=0
  11. server-id=2 # 重要,与主数据上id不一样
  12. [mysqld_safe]
  13. log-error=/var/log/mysqld.log
  14. pid-file=/var/run/mysqld/mysqld.pid
复制代码

6. 重启从数据库服务器的mysqld

  1. service mysqld restart
复制代码

7. 进入MySQL命令行,执行CHANGE MASTER TO命令

  1. # 进入MySQL
  2. mysql -u root -p
  3. (输入密码)
  4. # 进入MySQL后,先停止slave
  5. mysql slave stop;
  6. mysql change master to
  7. master_host='主数据库的ip地址或者hostname',
  8. master_user='主数据库中允许从数据库连接它的用户名',
  9. master_password='这里是密码',
  10. master_log_file='mysql-bin.000004',
  11. master_log_pos=261;
  12. # master_log_file,master_log_pos即上面使用SHOW MASTER STATUS看到的信息
  13. mysql slave start;
  14. # 查看slave状态
  15. mysql show slave status\G;
复制代码

在看到的slave状态中,关键信息为:

  1. Slave_IO_Running: Yes
  2. Slave_SQL_Running: Yes
复制代码

如果这两项都为Yes,说明主从之间复制OK了。

  1. mysql show slave status\G;
  2. *************************** 1. row ***************************
  3. Slave_IO_State: Waiting for master to send event
  4. Master_Host: s2
  5. Master_User: userss
  6. Master_Port: 3306
  7. Connect_Retry: 60
  8. Master_Log_File: mysql-bin.000004
  9. Read_Master_Log_Pos: 2308873
  10. Relay_Log_File: mysqld-relay-bin.000288
  11. Relay_Log_Pos: 251
  12. Relay_Master_Log_File: mysql-bin.000004
  13. Slave_IO_Running: Yes
  14. Slave_SQL_Running: Yes
  15. Replicate_Do_DB:
  16. Replicate_Ignore_DB:
  17. Replicate_Do_Table:
  18. Replicate_Ignore_Table:
  19. Replicate_Wild_Do_Table:
  20. Replicate_Wild_Ignore_Table:
  21. Last_Errno: 0
  22. Last_Error:
  23. Skip_Counter: 0
  24. Exec_Master_Log_Pos: 2308873
  25. Relay_Log_Space: 5650
  26. Until_Condition: None
  27. Until_Log_File:
  28. Until_Log_Pos: 0
  29. Master_SSL_Allowed: No
  30. Master_SSL_CA_File:
  31. Master_SSL_CA_Path:
  32. Master_SSL_Cert:
  33. Master_SSL_Cipher:
  34. Master_SSL_Key:
  35. Seconds_Behind_Master: 0
  36. Master_SSL_Verify_Server_Cert: No
  37. Last_IO_Errno: 0
  38. Last_IO_Error:
  39. Last_SQL_Errno: 0
  40. Last_SQL_Error:
  41. 1 row in set (0.00 sec)
复制代码

最后,可以测试下,在主数据库中创建一个数据库,创建一张表,插入点数据,然后在从数据库中看时候有数据!

配置读写分离(涉及的服务器s1,s2,s3)

1. 首先我们想要在Web服务器上安装MySQL-Proxy,并配置好它,

  1. # 进入MySQLProxy的目录
  2. cd /opt/mysql-proxy
  3. # 创建mysqlproxy.cnf文件
  4. vim mysqlproxy.cnf
  5. # 整体内容如下
  6. [mysql-proxy]
  7. user=mysql
  8. daemon=true
  9. keepalive=true
  10. log-level=message
  11. log-file=/opt/mysql-proxy/mysqlproxy.log
  12. pid-file=/opt/mysql-proxy/mysqlproxy.pid
  13. proxy-backend-addresses=主数据库服务器IP:端口(默认3306)
  14. proxy-read-only-backend-addresses=从数据库服务器IP:端口(默认3306)
  15. # 编辑环境变量文件
  16. vim /etc/profile
  17. # 在最后加入下列两行内容(路径自行修改)
  18. PATH=/opt/mysql-proxy/bin:/opt/mysql-proxy/share/doc/mysql-proxy:$PATH
  19. export PATH
  20. # 可以创建一个简单的脚本,以便于开机启动
  21. vim mysqlproxy
  22. # 内容如下:
  23. #!/bin/bash
  24. mysql-proxy --defaults-file=/opt/mysql-proxy/mysqlproxy.cnf
  25. # 创建好后,把mysqlproxy文件复制到/opt/mysql-proxy/bin目录下
  26. # 在开机启动项中,可以加入mysqlproxy
  27. vim etc/rc.d/rc.local
  28. mysqlproxy
  29. # 确认mysqlproxy文件是否具有可执行权限
  30. # 最后修改rw-splitting.lua文件
  31. vim /opt/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
  32. # 修改这两个值
  33. min_idle_connections = 1, //默认为4
  34. max_idle_connections = 1, //默认为8
复制代码

2. 在主数据库服务器上进入MySQL命令行,创建一个用户

  1. mysql -u root -p
  2. # 进入MySQL后
  3. mysql grant all on *.* to '用户名'@'Web服务器地址' identified by '密码';
复制代码

此时由于主数据库和从数据库是主从复制,从数据库上应该已经有了上面新建的用户了。

如果还没配置主从复制,在从服务器上执行下GRANT就好。

重要配置已经完成了,最后就要确定下防火墙(iptables)了。
Web服务器的MySQL-Proxy默认端口为4040,主从两个数据库3306端口。

测试读写分离

在Web服务器上通过MySQL连接4040端口:

  1. # 用户名为上面第二步中新建的用户,hostname为其对应的hostname(即Web服务器地址)
  2. mysql -u 用户名 -p -P 4040 -h hostname
复制代码

输入密码后,通过Web服务器就能连接到s2,所做的变更将直接在s2上生效,而s3将通过主从复制,实现同步!

注:Web服务器的MySQL的3306端口,不参与读写分离主从复制!Web服务器上的网站程序数据库只需要连接4040端口即可!

易博软件介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|Archiver|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表