一、 架构
二、 安装Mysql server
下面以在DB1(192.168.0.10)的配置为例,DB2的配置基本一样,只要修改my.cnf中的server_id =2
1. 安装mysql-server
db1# apt-get install mysql-server
注:
? 如果安装有问题,执行apt-getupdate更新源后再重试
? 安装过程中需要输入root密码,设置后记住(123456)
2. 验证 数据库 安装
db1# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Server version: 5.5.38-0ubuntu0.12.04.1 (Ubuntu)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
(db1)mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
(db1)mysql>
3. 创建测试数据库
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `test`;
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`name` varchar(16) DEFAULT NULL,
`age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
此步骤略
4. my.cnf配置修改
以下红色部分为修改的配置
The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables. html
# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
socket = /var/run/mysqld/mysqld.sock
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#
# * Fine Tuning
#
key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 192K
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover = BACKUP
#
# * Query Cache Configuration
#
query_cache_limit = 1M
query_cache_size = 16M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file = /var/log/mysql/mysql.log
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Here you can see queries with especially long duration
#log_slow_queries = /var/log/mysql/mysql-slow.log
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
#log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
max_binlog_size = 100M
auto_increment_offset = 1
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
#no-auto-rehash # faster start of mysql but no tab completition
[isamchk]
key_buffer = 16M
#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/
5. 创建三种角色的用户
角色
功能
权限
monitor user
MMM(Multi-Master replication manager of MYSQL)监控各主控的健康状况
REPLICATION CLIENT
agent user
MMM代理用来设置只读属性,复制主控等
SUPER, REPLICATION CLIENT, PROCESS
replicate user
用来复制
REPLICATION SLAVE
(db1)mysql> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'115.29.198.150' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
(db1)mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'42.96.%.%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
(db1)mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'42.96.%.%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
三、 同步DB1和 DB2 数据库首先假设DB1包含正确的数据(即使是空数据库),进行DB1和DB2直接的数据同步。
1. 以下在DB1所在服务器上执行数据导出
(db1)mysql> FLUSH TABLES WITH READ LOCK;
(db1)mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 616 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
(db1)mysql>
2. 另开一个命令窗口导出数据
(db1)# mysqldump -u root -p --all-databases > /tmp/database-backup.sql
3. 解锁第一个窗口
(db1)mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
(db1)mysql>
(db1)# scp database-backup.sql root@192.168.0.11:/tmp/
The authenticity of host '192.168.0.11 (192.168.0.11)' can't be established.
ECDSA key fingerprint is 55:84:03:9e:d9:74:cc:cd:03:59:23:3f:df:d9:77:a5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.11' (ECDSA) to the list of known hosts.
root@192.168.0.11's password:
(db1):/tmp#
(db2)# mysql -u root -p < /tmp/database-backup.sql
Enter password:
(db2)#
3) 应用权限
(db2)mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
4) 拷贝debian.cnf
将/etc/mysql/debian.cnf 从 DB1拷贝到DB2, 这个文件是用来启动和关闭mysql用的。
(db1)# scp debian.cnf root@192.168.0.11:/tmp/
在DB2上备份原来的debian.cnf,然后使用从DB1拷贝过来的debian.cnf
(db2)# mv /etc/mysql/debian.cnf /etc/mysql/debian.cnf.orign
(db2)# cp -f debian.cnf /etc/mysql/debian.cnf
上述步骤完成后准备工作都做好了,可以开始配置复制。
四、 复制配置1. 在DB2上执行:
(db2)mysql> CHANGE MASTER TO master_host='192.168.0.10', master_port=3306, master_user='replication', master_password='123456', master_log_file='mysql-bin.000002', master_log_pos=616;
Query OK, 0 rows affected (0.04 sec)
注:master_log_file='mysql-bin.000002', master_log_pos=616 信息来自于在DB1上执行
mysql> show master status;
2. 在DB2上启动SLAVE
(db2)mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
3. DB2上检查复制进程
(db2)mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_User: replication
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Error:
Until_Condition: None
Until_Log_File:
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Master_SSL_Verify_Server_Cert: No
Last_IO_Error:
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
1 row in set (0.00 sec)
1) DB2状态
(db2)mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 107 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)
mysql>
2) DB1复制的配置、启动和检查
(db1)mysql> CHANGE MASTER TO master_host = '192.168.0.11', master_port=3306, master_user='replication',
-> master_password='123456', master_log_file='mysql-bin.000002', master_log_pos=107;
Query OK, 0 rows affected (0.05 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_User: replication
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Error:
Until_Condition: None
Until_Log_File:
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Master_SSL_Verify_Server_Cert: No
Last_IO_Error:
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
1 row in set (0.00 sec)
mysql>
上述步骤完成MASTER-MASTER的复制配置,下面进行测试。
五、 复制验证1. 在DB1上插入一条数据
(db1)mysql> select * from user;
Empty set (0.00 sec)
(db1)mysql> insert into user(name,age) values('user1',20);
Query OK, 1 row affected (0.03 sec)
(db1)mysql>
2. 在DB2上检查
(db2)mysql> select * from user;
Empty set (0.00 sec)
(db2)mysql> select * from user;
+-------+------+
| name | age |
+-------+------+
| user1 | 20 |
+-------+------+
1 row in set (0.00 sec)
(db2)mysql>
表面在DB1插入的(user1,20)这条记录已经被复制到DB2中。
3. 在DB2上插入一条数据
(db2)mysql> insert into user(name,age) values('user2',30);
Query OK, 1 row affected (0.02 sec
4. 在DB1上进行检查
(db1)mysql> select * from user;
+-------+------+
| name | age |
+-------+------+
| user1 | 20 |
| user2 | 30 |
+-------+------+
2 rows in set (0.00 sec)
表面在DB2插入的(user2,30)这条记录已经被复制到DB1中。
上述测试表面,DB1<----->DB2的MM配置完全成功。
查看更多关于Master-MasterMySQL复制安装配置试验 - mysql数据库栏目的详细内容...