免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11874 | 回复: 10
打印 上一主题 下一主题

实践:使用MMM搭建Mysql集群 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-15 18:01 |只看该作者 |倒序浏览
MMM是 mysql-master-master的缩写,MMM在多台mysql server之间以主-主的形式复制数据,达到并发访问,提高性能的目的。
MMM项目来自Google:http://code.google.com/p/mysql-master-master/
我的安装过程参考了文档http://blog.kovyrin.net/2007/04/ ... -example-using-mmm/


以下是我搭建的过程。
我使用三台RHEL5U1 server,其中一台是Monitoring Server,另两台Mysql server用来读写数据。
192.168.20.5做为Monitoring Server,
192.168.20.9做为db1,
192.168.20.10做为db2。

三台服务器先安装mysql,我安装的是mysql 5.1.22的社区版本。
先安装3个perl的包:
Algorithm-Diff-1.1902.tar.gz
Proc-Daemon-0.03.tar.gz
DBD-mysql-4.006.tar.gz(依赖于mysql-devel包)

perl包的安装过程都是:
perl Makefile.PL
make
make test
make install

DBD-mysql包的安装(本地mysql server必须处于运行状态):
perl Makefile.PL --testuser=root --testpassword=abcdefg  (后面的参数是本地mysql server登录的用户名和密码)
make
make test
make install
安装DBD-mysql的时候提示找不到mysql_config,需要安装mysql-devel包。

安装mmm:
./install.pl


先配置Master-Master replication:
在db1的/etc/my.cnf增加:
server-id = 1
log-bin = mysql-bin

在db2的/etc/my.cnf增加:
server-id = 2
log-bin = mysql-bin

为了保证replication能正常启动,我在启动mysql服务以前以前把/var/lib/mysql目录下与二进制日志相关的文件全部删除,包括log-bin、 relaybin、mysql-bin.index、mysql_ndb-1-relay-bin.index、relay-log.info等文件,又删除test库里的表。

启动mysql以后在db1上的mysql里执行命令:

  1. grant replication slave on *.* to 'replication'@'%' identified by 'slave';
  2. change master to master_host='192.168.20.10', master_port=3306, master_user='replication', master_password='slave';
  3. slave start;
复制代码


在db2上的mysql里执行命令:

  1. grant replication slave on *.* to 'replication'@'%' identified by 'slave';
  2. change master to master_host='192.168.20.9', master_port=3306, master_user='replication', master_password='slave';
  3. slave start;
复制代码


show slave status\G;的结果:
db1:

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

  41. ERROR:
  42. No query specified
复制代码


db2上的结果:

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

  41. ERROR:
  42. No query specified
复制代码


MMM所有配置文件都放在/usr/local/mmm/etc目录下。

管理节点上的配置文件mmm_mon.conf,在这个配置文件里指定了reader和writer角色的虚拟IP:

  1. #
  2. # Master-Master Manager config (monitor)
  3. #

  4. # Debug mode
  5. debug no

  6. # Paths
  7. pid_path /usr/local/mmm/var/mmmd.pid
  8. status_path /usr/local/mmm/var/mmmd.status
  9. bin_path /usr/local/mmm/bin

  10. # Logging setup
  11. log mydebug
  12.     file /usr/local/mmm/var/mmm-debug.log
  13.     level debug

  14. log mytraps
  15.     file /usr/local/mmm/var/mmm-traps.log
  16.     level trap
  17.     email root@localhost


  18. # MMMD command socket tcp-port
  19. bind_port 9988
  20. agent_port 9989
  21. monitor_ip 127.0.0.1

  22. # Cluster interface
  23. cluster_interface eth0

  24. # Cluster hosts addresses and access params
  25. host db1
  26.     ip 192.168.20.9
  27.     port 3306
  28.     user rep_monitor
  29.     password RepMonitor
  30.     mode master
  31.     peer db2

  32. host db2
  33.     ip 192.168.20.10
  34.     port 3306
  35.     user rep_monitor
  36.     password RepMonitor
  37.     mode master
  38.     peer db1

  39. #
  40. # Define roles
  41. #

  42. active_master_role writer

  43. # Mysql Reader role
  44. role reader
  45.     mode balanced
  46.     servers db1, db2
  47.     ip 192.168.20.27, 192.168.20.28

  48. # Mysql Writer role
  49. role writer
  50.     mode exclusive
  51.     servers db1
  52.     ip 192.168.20.29

  53. #
  54. # Checks parameters
  55. #

  56. # Ping checker
  57. check ping
  58.     check_period 1
  59.     trap_period 5
  60.     timeout 2

  61. # Mysql checker
  62. # (restarts after 10000 checks to prevent memory leaks)
  63. check mysql
  64.     check_period 1
  65.     trap_period  2
  66.     timeout 2
  67.     restart_after 10000

  68. # Mysql replication backlog checker
  69. # (restarts after 10000 checks to prevent memory leaks)
  70. check rep_backlog
  71.     check_period 5
  72.     trap_period 10
  73.     max_backlog 60
  74.     timeout 2
  75.     restart_after 10000

  76. # Mysql replication threads checker
  77. # (restarts after 10000 checks to prevent memory leaks)
  78. check rep_threads
  79.     check_period 1
  80.     trap_period 5
  81.     timeout 2
  82.     restart_after 10000
复制代码



db1上的配置文件mmm_agent.conf:

  1. #
  2. # Master-Master Manager config (agent)
  3. #

  4. # Debug mode
  5. debug no

  6. # Paths
  7. pid_path /usr/local/mmm/var/mmmd_agent.pid
  8. bin_path /usr/local/mmm/bin

  9. # Logging setup
  10. log mydebug
  11.     file /usr/local/mmm/var/mmm-debug.log
  12.     level debug

  13. log mytraps
  14.     file /usr/local/mmm/var/mmm-traps.log
  15.     level trap

  16. # MMMD command socket tcp-port and ip
  17. bind_port 9989

  18. # Cluster interface
  19. cluster_interface eth1

  20. # Define current server id
  21. this db1
  22. mode slave

  23. # For masters
  24. peer db2

  25. # Cluster hosts addresses and access params
  26. host db1
  27.     ip 192.168.20.9
  28.     port 3306
  29.     user rep_agent
  30.     password RepAgent

  31. host db2
  32.     ip 192.168.20.10
  33.     port 3306
  34.     user rep_agent
  35.     password RepAgent
复制代码


db2上的配置文件mmm_agent.conf:

  1. #
  2. # Master-Master Manager config (agent)
  3. #

  4. # Debug mode
  5. debug no

  6. # Paths
  7. pid_path /usr/local/mmm/var/mmmd_agent.pid
  8. bin_path /usr/local/mmm/bin

  9. # Logging setup
  10. log mydebug
  11.     file /usr/local/mmm/var/mmm-debug.log
  12.     level debug

  13. log mytraps
  14.     file /usr/local/mmm/var/mmm-traps.log
  15.     level trap

  16. # MMMD command socket tcp-port and ip
  17. bind_port 9989

  18. # Cluster interface
  19. cluster_interface eth1

  20. # Define current server id
  21. this db2
  22. mode slave

  23. # For masters
  24. peer db1

  25. # Cluster hosts addresses and access params
  26. host db1
  27.     ip 192.168.20.9
  28.     port 3306
  29.     user rep_agent
  30.     password RepAgent

  31. host db2
  32.     ip 192.168.20.10
  33.     port 3306
  34.     user rep_agent
  35.     password RepAgent
复制代码


在db1和db2上建立新用户,用于管理节点访问db节点:
GRANT ALL PRIVILEGES on *.* to 'rep_monitor'@'192.168.20.5' identified by 'RepMonitor';

在db1和db2节点上启动agent:
mmmd_agent

在管理节点上启动管理进程:
mmmd_mon

  1. Reading config file: 'mmm_mon.conf'
  2. $VAR1 = {
  3.           'db2' => {
  4.                      'roles' => [],
  5.                      'version' => '0',
  6.                      'state' => 'AWAITING_RECOVERY'
  7.                    },
  8.           'db1' => {
  9.                      'roles' => [
  10.                                   'reader(192.168.20.27;)',
  11.                                   'reader(192.168.20.28;)',
  12.                                   'writer(192.168.20.29;)'
  13.                                 ],
  14.                      'version' => '0',
  15.                      'state' => 'ONLINE'
  16.                    }
  17.         };
  18. Role: 'reader(192.168.20.27;)'
  19. Adding role: 'reader' with ip '192.168.20.27'
  20. Role: 'reader(192.168.20.28;)'
  21. Adding role: 'reader' with ip '192.168.20.28'
  22. Role: 'writer(192.168.20.29;)'
  23. Adding role: 'writer' with ip '192.168.20.29'
复制代码


在管理节点上启动db节点
mmm_control set_online db1

  1. Config file: mmm_mon.conf
  2. Daemon is running!
  3. Command sent to monitoring host. Result: OK: State of 'db1' changed to ONLINE. Now you can wait some time and check its new roles!
复制代码


mmm_control set_online db2

  1. Config file: mmm_mon.conf
  2. Daemon is running!
  3. Command sent to monitoring host. Result: OK: State of 'db2' changed to ONLINE. Now you can wait some time and check its new roles!
复制代码


管理节点上相关进程的状态:

  1. root      8653  0.6 14.9 256856 39192 ?        Sl   15:51   0:01 perl /usr/local/sbin/mmmd_mon
  2. root      8656  0.1  3.1  99868  8160 ?        S    15:51   0:00  \_ perl /usr/local/mmm/bin/check/checker rep_backlog
  3. root      8658  0.1  3.1  99856  8144 ?        S    15:51   0:00  \_ perl /usr/local/mmm/bin/check/checker mysql
  4. root      8661  0.1  1.8  87004  4932 ?        S    15:51   0:00  \_ perl /usr/local/mmm/bin/check/checker ping
  5. root      8926  0.0  0.1   1612   508 ?        S    15:55   0:00  |   \_ /usr/local/mmm/bin/sys/fping -q -u -t 500 -C 1 192.168.20.10
  6. root      8662  0.1  3.1  99868  8168 ?        S    15:51   0:00  \_ perl /usr/local/mmm/bin/check/checker rep_threads
复制代码


db1上的相关进程:

  1. root      8769  0.3  3.0 100520  7988 ?        S    15:38   0:04 perl /usr/local/sbin/mmmd_agent
  2. root     11824 15.0  2.5  94764  6588 ?        S    15:56   0:00  \_ perl /usr/local/mmm/bin/agent/check_role writer(192.168.20.29;)
  3. root     11825 17.0  2.9 101824  7776 ?        S    15:56   0:00      \_ perl /usr/local/mmm/bin/mysql_allow_write
复制代码


db2上的相关进程:

  1. root      8731  0.0  3.0 100524  7980 ?        S    15:38   0:01 perl /usr/local/sbin/mmmd_agent
复制代码


在管理节点上查看节点状态:
mmm_control show

  1. Config file: mmm_mon.conf
  2. Daemon is running!
  3. Servers status:
  4.   db1(192.168.20.9): master/ONLINE. Roles: writer(192.168.20.29;)
  5.   db2(192.168.20.10): master/ONLINE. Roles: reader(192.168.20.27;), reader(192.168.20.28;)
复制代码


到这里集群搭好了,db1负责读数据,db2负责读和写数据,读写性能应该比单台mysql server高,对于类似read 90% + write 10%这样的应用来说,增加读节点以后,整体性能会有很大提高。
接下来用sysbench和super-smack测它的性能。

[ 本帖最后由 sailer_sh 于 2008-1-21 10:23 编辑 ]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:48:00
2 [报告]
发表于 2008-01-19 17:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2008-01-21 10:36 |只看该作者
原帖由 feihulove 于 2008-1-19 17:24 发表
请问192.168.20.29,192.168.20.27,192.168.20.28这些IP又是哪来的?不是只有2台数据库吗?另外,应用程序连接数据库的话,是只连接一个Monitoring Server,还是在程序里边分别连接db1,db2.


Sorry我漏掉了管理节点上的配置文件mmm_mon.conf,这个文件里定义了读、写角色的IP,这些IP是虚拟的。按照MMM作者的说法,应用连接数据库的时候,连接的是这些虚拟IP,但是必须手工指定分别去连接所有的读写IP(这一点感觉不太爽),他并没有做到像LVS那样去访问一个IP,后台自动分配任务,我在考虑自己实现这个功能,我这里有一个写节点和多个读节点,打算在读节点上部署LVS,使读角色对应用的透明化。
Monitoring只是实现HA功能,可以放在其他服务器上,它本身不提供读写数据的功能。

论坛徽章:
0
4 [报告]
发表于 2008-01-29 16:55 |只看该作者
可通过在db1,db2服务器绑定虚拟IP(192.168.20.29),实现往writer(192.168.20.29) 写数据,在一台挂了后,另一台接替写操作。
http://code.google.com/p/mysql-master-master/wiki/FAQ

You just need to configure the IP address, for each computer, specified at your Cluster Hosts Addresses section on your Configuration File. As soon as MMM Agent start and communicate with MMM Monitor, it will setup the additional IPs for the roles.

Using Configuration Example as reference, you will ONLY need to setup IPs 192.168.1.8 at master 1 and 192.168.1.9 at master2.

Using Configuration Example as reference you will write to IP 192.168.1.200 and read from 192.168.1.100, 192.168.1.101.

If master1 fails MMM Monitor will move IP address 192.168.1.200 to master2 automatically.

论坛徽章:
0
5 [报告]
发表于 2008-05-18 21:54 |只看该作者
楼上的兄弟们,为什么我按你的配置就不成功呢?
db1,db2可以起来,但是一旦把monitor起来之后,db1,db2就自动关闭了。
db1,db2上的提示信息是:
Can't locate object method "new" via package "Algorithmiff" at /usr/local/mmm/lib/agent_commands.pm line 131


我总共使用了6个ip,全是内网的ip,我用来测试的:
db1:172.16.0.101,172.16.0.111,172.16.0.110
db2:172.16.0.102,172.16.0.112
monitor:172.16.0.103





我的配置文件如下:


db1:


  1. #
  2. # Master-Master Manager config (agent)
  3. #

  4. # Debug mode
  5. debug yes

  6. # Paths
  7. pid_path /usr/local/mmm/var/mmmd_agent.pid
  8. bin_path /usr/local/mmm/bin

  9. # Logging setup
  10. log mydebug
  11.     file /usr/local/mmm/var/mmm-debug.log
  12.     level debug

  13. log mytraps
  14.     file /usr/local/mmm/var/mmm-traps.log
  15.     level trap

  16. # MMMD command socket tcp-port and ip
  17. bind_port 9989

  18. # Cluster interface
  19. cluster_interface eth0

  20. # Define current server id
  21. this db1
  22. mode slave

  23. # For masters
  24. peer db2

  25. # Cluster hosts addresses and access params
  26. host db1
  27.     ip 172.16.0.101
  28.     port 3306
  29.     user rep_agent
  30.     password RepAgent

  31. host db2
  32.     ip 172.16.0.102
  33.     port 3306
  34.     user rep_agent
  35.     password RepAgent
复制代码




db2:




  1. # Master-Master Manager config (agent)
  2. #

  3. # Debug mode
  4. debug yes

  5. # Paths
  6. pid_path /usr/local/mmm/var/mmmd_agent.pid
  7. bin_path /usr/local/mmm/bin

  8. # Logging setup
  9. log mydebug
  10.     file /usr/local/mmm/var/mmm-debug.log
  11.     level debug

  12. log mytraps
  13.     file /usr/local/mmm/var/mmm-traps.log
  14.     level trap

  15. # MMMD command socket tcp-port and ip
  16. bind_port 9989

  17. # Cluster interface
  18. cluster_interface eth0

  19. # Define current server id
  20. this db2
  21. mode slave

  22. # For masters
  23. peer db1

  24. # Cluster hosts addresses and access params
  25. host db1
  26.     ip 172.16.0.101
  27.     port 3306
  28.     user rep_agent
  29.     password RepAgent

  30. host db2
  31.     ip 172.16.0.102
  32.     port 3306
  33.     user rep_agent
  34.     password RepAgent
复制代码



monitor:



  1. # Debug mode
  2. debug no

  3. # Paths
  4. pid_path /usr/local/mmm/var/mmmd.pid
  5. status_path /usr/local/mmm/var/mmmd.status
  6. bin_path /usr/local/mmm/bin

  7. # Logging setup
  8. log mydebug
  9.     file /usr/local/mmm/var/mmm-debug.log
  10.     level debug

  11. log mytraps
  12.     file /usr/local/mmm/var/mmm-traps.log
  13.     level trap


  14. # MMMD command socket tcp-port
  15. bind_port 9988
  16. agent_port 9989
  17. monitor_ip 127.0.0.1

  18. # Cluster interface
  19. cluster_interface eth0

  20. # Cluster hosts addresses and access params
  21. host db1
  22.     ip 172.16.0.101
  23.     port 3306
  24.     user rep_monitor
  25.     password RepMonitor
  26.     mode master
  27.     peer db2

  28. host db2
  29.     ip 172.16.0.102
  30.     port 3306
  31.     user rep_monitor
  32.     password RepMonitor
  33.     mode master
  34.     peer db1

  35. #
  36. # Define roles
  37. #

  38. active_master_role writer

  39. # Mysql Reader role
  40. role reader
  41.     mode balanced
  42.     servers db1, db2
  43.     ip 172.16.0.111, 172.16.0.112

  44. # Mysql Writer role
  45. role writer
  46.     mode exclusive
  47.     servers db1
  48.     ip 172.16.0.110

  49. #
  50. # Checks parameters
  51. #

  52. # Ping checker
  53. check ping
  54.     check_period 1
  55.     trap_period 5
  56.     timeout 2

  57. # Mysql checker
  58. check mysql
  59.     check_period 1
  60.     trap_period  2
  61.     timeout 2
  62.     restart_after 10000
  63. # Mysql replication backlog checker
  64. check rep_backlog
  65.     check_period 5
  66.     trap_period 10
  67.     max_backlog 60
  68.     timeout 2
  69.     restart_after 10000

  70. # Mysql replication threads checker
  71. check rep_threads
  72.     check_period 1
  73.     trap_period 5
  74.     timeout 2
  75.     restart_after 10000
复制代码

[ 本帖最后由 wwdwwd 于 2008-5-18 21:58 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-05-21 15:18 |只看该作者
顶上来接着求助,各位朋友们请帮帮忙啊

论坛徽章:
0
7 [报告]
发表于 2008-11-17 17:24 |只看该作者
虚拟ip如果是手动指定的  又怎么在down一台db情况下  自动指向另一台呢  ?

论坛徽章:
0
8 [报告]
发表于 2008-11-17 18:28 |只看该作者
使用mysql的ndbd 集群 就可以了,

论坛徽章:
0
9 [报告]
发表于 2008-11-18 22:19 |只看该作者

回复 #1 sailer_sh 的帖子

这个是一个在code。Google。com上开源的项目,也是用来弥补mysql cluster不足的方案

论坛徽章:
0
10 [报告]
发表于 2008-11-19 19:48 |只看该作者
藏了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP